(p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); 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; XEiJ.pnlBM[da] = ((p = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //TF2_XHPT //================================================================================ //TF2_XHPG ($0001,$06xx,$1E2F) // 概要 // TF2 テキスト>512ドット256色2プレーン // XHPG 1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーと2番目のパレットを奇数化したパレットのカラーを混ぜる // 手順 // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // 1番目のパレットが0のとき // 2番目のパレットを偶数化したパレットのカラー(0は黒) // 1番目のパレットが1のとき // グラフィックパレット0のカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // 1番目のカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラーと2番目のパレットを奇数化したパレットのカラーを混ぜたカラー(0は黒) // 中間コード1 // (tpc(txp())!=0?tpc(txp()):(f1p()==0?fpc(tev(f2p())):f1p()==1?fpc(0):ls1(f1p())==0?fpc(f1p()):mix(fpc(tev(f1p())),fpc(tod(f2p()))))) // 中間コード2 // tpc(txp())!=0?tpc(txp()):f1p()==0?fpc(tev(f2p())):f1p()==1?fpc(0):ls1(f1p())==0?fpc(f1p()):mix(fpc(tev(f1p())),fpc(tod(f2p()))) // 中間コード3 // (v0=tpc(txp()))!=0?v0:(v2=f1p())==0?fpc(tev(f2p())):v2==1?fpc(0):ls1(v2)==0?fpc(v2):mix(fpc(tev(v2)),fpc(tod(f2p()))) // 中間コード4 // (p=tpc(txp()))!=0?p:(p=f1p())==0?fpc(tev(f2p())):p==1?fpc(0):ls1(p)==0?fpc(p):mix(fpc(tev(p)),fpc(tod(f2p()))) // 中間コード5 // (p=tpc(txp()))!=0?p:(p=f1p())==0?fpc(f2p()&-2):p==1?fpc(0):(p&1)==0?fpc(p):mix(fpc(p&-2),fpc(f2p()|1)) // 中間コード6 // (p=tpc(txp()))!=0?cto(p):(p=f1p())==0?fpo(f2p()&-2):p==1?fpo(0):(p&1)==0?fpo(p):cto(mix(fpc(p&-2),fpc(f2p()|1))) TF2_XHPG { @Override public void drawRaster (int src, int dst, boolean rh) { 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; 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; XEiJ.pnlBM[da] = ((p = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511]) | 1])]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511]) | 1])]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511]) | 1])]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511]) | 1])]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511]) | 1])]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511]) | 1])]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511]) | 1])]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511]) | 1])]); 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; XEiJ.pnlBM[da] = ((p = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511]) | 1])]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511]) | 1])]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511]) | 1])]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511]) | 1])]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511]) | 1])]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511]) | 1])]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511]) | 1])]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511]) | 1])]); gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //TF2_XHPG //================================================================================ //TF2_XHPGT ($0001,$06xx,$1F2F) // 概要 // TF2 テキスト>512ドット256色2プレーン // XHPGT 1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーと2番目のパレットを奇数化したパレットのカラーを混ぜてさらに奥のスプライト・テキストのカラーを混ぜる // 手順 // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // 1番目のパレットが0のとき // 2番目のパレットを偶数化したパレットのカラー(0は黒) // 1番目のパレットが1のとき // グラフィックパレット0のカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // 1番目のカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラーと2番目のパレットを奇数化したパレットのカラーを混ぜたカラーにさらにカラー0を混ぜたカラー(0は黒) // 中間コード1 // (tpc(txp())!=0?tpc(txp()):(f1p()==0?fpc(tev(f2p())):f1p()==1?fpc(0):ls1(f1p())==0?fpc(f1p()):mix(mix(fpc(tev(f1p())),fpc(tod(f2p()))),0))) // 中間コード2 // tpc(txp())!=0?tpc(txp()):f1p()==0?fpc(tev(f2p())):f1p()==1?fpc(0):ls1(f1p())==0?fpc(f1p()):mix(mix(fpc(tev(f1p())),fpc(tod(f2p()))),0) // 中間コード3 // (v0=tpc(txp()))!=0?v0:(v2=f1p())==0?fpc(tev(f2p())):v2==1?fpc(0):ls1(v2)==0?fpc(v2):mix(mix(fpc(tev(v2)),fpc(tod(f2p()))),0) // 中間コード4 // (p=tpc(txp()))!=0?p:(p=f1p())==0?fpc(tev(f2p())):p==1?fpc(0):ls1(p)==0?fpc(p):mix(mix(fpc(tev(p)),fpc(tod(f2p()))),0) // 中間コード5 // (p=tpc(txp()))!=0?p:(p=f1p())==0?fpc(f2p()&-2):p==1?fpc(0):(p&1)==0?fpc(p):mix(mix(fpc(p&-2),fpc(f2p()|1)),0) // 中間コード6 // (p=tpc(txp()))!=0?cto(p):(p=f1p())==0?fpo(f2p()&-2):p==1?fpo(0):(p&1)==0?fpo(p):cto(mix(mix(fpc(p&-2),fpc(f2p()|1)),0)) TF2_XHPGT { @Override public void drawRaster (int src, int dst, boolean rh) { 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; 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; XEiJ.pnlBM[da] = ((p = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511]) | 1]), 0)]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : 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]), 0)]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : 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]), 0)]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : 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]), 0)]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : 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]), 0)]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : 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]), 0)]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : 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]), 0)]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : 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]), 0)]); 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; XEiJ.pnlBM[da] = ((p = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511]) | 1]), 0)]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : 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]), 0)]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : 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]), 0)]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : 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]), 0)]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : 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]), 0)]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : 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]), 0)]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : 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]), 0)]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) == 0 ? VideoController.vcnPal32G8[(GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511]) & -2] : p == 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : 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]), 0)]); gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //TF2_XHPGT //================================================================================ //TG ($0003,$06xx,$002F) // 概要 // TG テキスト>512ドット65536色1プレーン // 拡張なし // 手順 // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // 1番目のカラー(0は黒) // 中間コード1 // (tpc(txp())!=0?tpc(txp()):gpc(g1p(),g1p())) // 中間コード2 // tpc(txp())!=0?tpc(txp()):gpc(g1p(),g1p()) // 中間コード3 // (v0=tpc(txp()))!=0?v0:gpc(v3=g1p(),v3) // 中間コード4 // (p=tpc(txp()))!=0?p:gpc(p=g1p(),p) // 中間コード5 // (p=tpc(txp()))!=0?p:gpc(p=g1p(),p) // 中間コード6 // (p=tpc(txp()))!=0?cto(p):gpo(p=g1p(),p) TG { @Override public void drawRaster (int src, int dst, boolean rh) { 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; 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; XEiJ.pnlBM[da] = ((p = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(p = (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[p & 255]]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(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])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(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])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(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])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(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])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(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])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(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])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(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])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); 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; XEiJ.pnlBM[da] = ((p = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(p = (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[p & 255]]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(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])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(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])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(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])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(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])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(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])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(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])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(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])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //TG //================================================================================ //XTG // 概要 // TG テキスト>512ドット65536色1プレーン // 拡張あり XTG { @Override public void drawRaster (int src, int dst, boolean rh) { switch (VideoController.vcnReg3Curr >>> 8 & 0b01011111) { // .A.XHPGT case 0b00010000: //TG_XWC case 0b00010001: //TG_XWC case 0b00010010: //TG_XWC case 0b00010011: //TG_XWC TG_XWC.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00010100: //TG_XWP case 0b00010101: //TG_XWP case 0b00010110: //TG_XWP case 0b00010111: //TG_XWP TG_XWP.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011000: //TG_XHC TG.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011001: //TG_XHCT TG_XHCT.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011101: //TG_XHPT TG_XHPT.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b01000000: //TG_A case 0b01000001: //TG_A case 0b01000010: //TG_A case 0b01000011: //TG_A case 0b01000100: //TG_A case 0b01000101: //TG_A case 0b01000110: //TG_A case 0b01000111: //TG_A case 0b01001000: //TG_A case 0b01001001: //TG_A case 0b01001010: //TG_A case 0b01001011: //TG_A case 0b01001100: //TG_A case 0b01001101: //TG_A case 0b01001110: //TG_A case 0b01001111: //TG_A case 0b01010000: //TG_A case 0b01010001: //TG_A case 0b01010010: //TG_A case 0b01010011: //TG_A case 0b01010100: //TG_A case 0b01010101: //TG_A case 0b01010110: //TG_A case 0b01010111: //TG_A case 0b01011000: //TG_A case 0b01011001: //TG_A case 0b01011010: //TG_A case 0b01011011: //TG_A case 0b01011100: //TG_A case 0b01011101: //TG_A case 0b01011110: //TG_A case 0b01011111: //TG_A G_A.drawRaster (src, dst, rh); break; default: TG.drawRaster (src, dst, rh); VideoController.vcnReportUnimplemented (XTG); } //switch } //drawRaster }, //XTG //================================================================================ //TG_XWC ($0003,$06xx,$102F) // 概要 // TG テキスト>512ドット65536色1プレーン // XWC 優先順位に関わらず0でない1番目のパレットを偶数化(65536色は奇数化)したパレットのカラーが奇数のとき0でない1番目のパレットのカラーだけ表示する // 手順 // 1番目のパレットを奇数化したパレットのカラーが奇数のとき // 1番目のカラー(0は黒) // さもなくば(1番目のパレットを奇数化したパレットのカラーが偶数のとき) // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // 1番目のカラー(0は黒) // 中間コード1 // (ls1(gpc(tod(g1p()),tod(g1p())))!=0?gpc(g1p(),g1p()):(tpc(txp())!=0?tpc(txp()):gpc(g1p(),g1p()))) // 中間コード2 // ls1(gpc(tod(g1p()),tod(g1p())))!=0?gpc(g1p(),g1p()):tpc(txp())!=0?tpc(txp()):gpc(g1p(),g1p()) // 中間コード3 // ls1(gpc(v2=tod(v3=g1p()),v2))!=0?gpc(v3,v3):(v5=tpc(txp()))!=0?v5:gpc(v3,v3) // 中間コード4 // ls1(gpc(p=tod(q=g1p()),p))!=0?gpc(q,q):(p=tpc(txp()))!=0?p:gpc(q,q) // 中間コード5 // (gpc(p=(q=g1p())|1,p)&1)!=0?gpc(q,q):(p=tpc(txp()))!=0?p:gpc(q,q) // 中間コード6 // (gpc(p=(q=g1p())|1,p)&1)!=0?gpo(q,q):(p=tpc(txp()))!=0?cto(p):gpo(q,q) TG_XWC { @Override public void drawRaster (int src, int dst, boolean rh) { 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; 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //TG_XWC //================================================================================ //TG_XWP ($0003,$06xx,$142F) // 概要 // TG テキスト>512ドット65536色1プレーン // XWP 優先順位に関わらず1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーだけ表示する // 手順 // 1番目のパレットが1以下のとき // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // グラフィックパレット0のカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // 1番目のカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラー(0は黒) // 中間コード1 // (g1p()<=1?(tpc(txp())!=0?tpc(txp()):gpc(0,0)):ls1(g1p())==0?(tpc(txp())!=0?tpc(txp()):gpc(g1p(),g1p())):gpc(tev(g1p()),tev(g1p()))) // 中間コード2 // g1p()<=1?tpc(txp())!=0?tpc(txp()):gpc(0,0):ls1(g1p())==0?tpc(txp())!=0?tpc(txp()):gpc(g1p(),g1p()):gpc(tev(g1p()),tev(g1p())) // 中間コード3 // (v0=g1p())<=1?(v1=tpc(txp()))!=0?v1:gpc(0,0):ls1(v0)==0?(v5=tpc(txp()))!=0?v5:gpc(v0,v0):gpc(v9=tev(v0),v9) // 中間コード4 // (p=g1p())<=1?(p=tpc(txp()))!=0?p:gpc(0,0):ls1(p)==0?(q=tpc(txp()))!=0?q:gpc(p,p):gpc(q=tev(p),q) // 中間コード5 // (p=g1p())<=1?(p=tpc(txp()))!=0?p:gpc(0,0):(p&1)==0?(q=tpc(txp()))!=0?q:gpc(p,p):gpc(q=p&-2,q) // 中間コード6 // (p=g1p())<=1?(p=tpc(txp()))!=0?cto(p):gpo(0,0):(p&1)==0?(q=tpc(txp()))!=0?cto(q):gpo(p,p):gpo(q=p&-2,q) TG_XWP { @Override public void drawRaster (int src, int dst, boolean rh) { 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; 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : 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.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : 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.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : 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.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : 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.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : 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.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : 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.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : 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.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : 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.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : 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.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : 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.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : 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.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : 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.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : 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.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : 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.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //TG_XWP //================================================================================ //TG_XHCT ($0003,$06xx,$192F) // 概要 // TG テキスト>512ドット65536色1プレーン // XHCT 0でない1番目のパレットを偶数化(65536色は奇数化)したパレットのカラーが奇数のとき0でない1番目のカラーと奥のスプライト・テキストのカラーを混ぜる // 手順 // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // 1番目のパレットを奇数化したパレットのカラーが奇数のとき // 1番目のカラーとカラー0を混ぜたカラー(0は黒) // さもなくば(1番目のパレットを奇数化したパレットのカラーが偶数のとき) // 1番目のカラー(0は黒) // 中間コード1 // (tpc(txp())!=0?tpc(txp()):(ls1(gpc(tod(g1p()),tod(g1p())))!=0?mix(gpc(g1p(),g1p()),0):gpc(g1p(),g1p()))) // 中間コード2 // tpc(txp())!=0?tpc(txp()):ls1(gpc(tod(g1p()),tod(g1p())))!=0?mix(gpc(g1p(),g1p()),0):gpc(g1p(),g1p()) // 中間コード3 // (v0=tpc(txp()))!=0?v0:ls1(gpc(v4=tod(v5=g1p()),v4))!=0?mix(gpc(v5,v5),0):gpc(v5,v5) // 中間コード4 // (p=tpc(txp()))!=0?p:ls1(gpc(p=tod(q=g1p()),p))!=0?mix(gpc(q,q),0):gpc(q,q) // 中間コード5 // (p=tpc(txp()))!=0?p:(gpc(p=(q=g1p())|1,p)&1)!=0?mix(gpc(q,q),0):gpc(q,q) // 中間コード6 // (p=tpc(txp()))!=0?cto(p):(gpc(p=(q=g1p())|1,p)&1)!=0?cto(mix(gpc(q,q),0)):gpo(q,q) TG_XHCT { @Override public void drawRaster (int src, int dst, boolean rh) { 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; 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : ((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]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : ((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]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //TG_XHCT //================================================================================ //TG_XHPT ($0003,$06xx,$1D2F) // 概要 // TG テキスト>512ドット65536色1プレーン // XHPT 1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーと奥のスプライト・テキストのカラーを混ぜる // 手順 // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // 1番目のパレットが1以下のとき // グラフィックパレット0のカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // 1番目のカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラーとカラー0を混ぜたカラー(0は黒) // 中間コード1 // (tpc(txp())!=0?tpc(txp()):(g1p()<=1?gpc(0,0):ls1(g1p())==0?gpc(g1p(),g1p()):mix(gpc(tev(g1p()),tev(g1p())),0))) // 中間コード2 // tpc(txp())!=0?tpc(txp()):g1p()<=1?gpc(0,0):ls1(g1p())==0?gpc(g1p(),g1p()):mix(gpc(tev(g1p()),tev(g1p())),0) // 中間コード3 // (v0=tpc(txp()))!=0?v0:(v2=g1p())<=1?gpc(0,0):ls1(v2)==0?gpc(v2,v2):mix(gpc(v8=tev(v2),v8),0) // 中間コード4 // (p=tpc(txp()))!=0?p:(p=g1p())<=1?gpc(0,0):ls1(p)==0?gpc(p,p):mix(gpc(q=tev(p),q),0) // 中間コード5 // (p=tpc(txp()))!=0?p:(p=g1p())<=1?gpc(0,0):(p&1)==0?gpc(p,p):mix(gpc(q=p&-2,q),0) // 中間コード6 // (p=tpc(txp()))!=0?cto(p):(p=g1p())<=1?gpo(0,0):(p&1)==0?gpo(p,p):cto(mix(gpc(q=p&-2,q),0)) TG_XHPT { @Override public void drawRaster (int src, int dst, boolean rh) { 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; 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (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 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (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 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (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 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (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 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (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 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (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 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (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 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : (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 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (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 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (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 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (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 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (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 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (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 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (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 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (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 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : (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 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //TG_XHPT //================================================================================ //TH ($0004,$06xx,$0030) // 概要 // TH テキスト>1024ドット16色1プレーン // 拡張なし // 手順 // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // 1番目のカラー(0は黒) // 中間コード1 // (tpc(txp())!=0?tpc(txp()):hpc(h1p())) // 中間コード2 // tpc(txp())!=0?tpc(txp()):hpc(h1p()) // 中間コード3 // (v0=tpc(txp()))!=0?v0:hpc(h1p()) // 中間コード4 // (p=tpc(txp()))!=0?p:hpc(h1p()) // 中間コード5 // (p=tpc(txp()))!=0?p:hpc(h1p()) // 中間コード6 // (p=tpc(txp()))!=0?cto(p):hpo(h1p()) TH { @Override public void drawRaster (int src, int dst, boolean rh) { 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; 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[GraphicScreen.graM4[ga]]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[GraphicScreen.graM4[ga + 1]]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[GraphicScreen.graM4[ga + 2]]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[GraphicScreen.graM4[ga + 3]]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[GraphicScreen.graM4[ga + 4]]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[GraphicScreen.graM4[ga + 5]]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[GraphicScreen.graM4[ga + 6]]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[GraphicScreen.graM4[ga + 7]]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[GraphicScreen.graM4[ga]]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[GraphicScreen.graM4[ga]]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[GraphicScreen.graM4[ga + 1]]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[GraphicScreen.graM4[ga + 2]]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[GraphicScreen.graM4[ga + 3]]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[GraphicScreen.graM4[ga + 4]]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[GraphicScreen.graM4[ga + 5]]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[GraphicScreen.graM4[ga + 6]]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[GraphicScreen.graM4[ga + 7]]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[GraphicScreen.graM4[ga]]); tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //TH //================================================================================ //XTH // 概要 // TH テキスト>1024ドット16色1プレーン // 拡張あり XTH { @Override public void drawRaster (int src, int dst, boolean rh) { switch (VideoController.vcnReg3Curr >>> 8 & 0b01011111) { // .A.XHPGT case 0b00010000: //TH_XWC case 0b00010001: //TH_XWC case 0b00010010: //TH_XWC case 0b00010011: //TH_XWC TH_XWC.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00010100: //TH_XWP case 0b00010101: //TH_XWP case 0b00010110: //TH_XWP case 0b00010111: //TH_XWP TH_XWP.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011000: //TH_XHC TH.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011001: //TH_XHCT TH_XHCT.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011101: //TH_XHPT TH_XHPT.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b01000000: //TH_A case 0b01000001: //TH_A case 0b01000010: //TH_A case 0b01000011: //TH_A case 0b01000100: //TH_A case 0b01000101: //TH_A case 0b01000110: //TH_A case 0b01000111: //TH_A case 0b01001000: //TH_A case 0b01001001: //TH_A case 0b01001010: //TH_A case 0b01001011: //TH_A case 0b01001100: //TH_A case 0b01001101: //TH_A case 0b01001110: //TH_A case 0b01001111: //TH_A case 0b01010000: //TH_A case 0b01010001: //TH_A case 0b01010010: //TH_A case 0b01010011: //TH_A case 0b01010100: //TH_A case 0b01010101: //TH_A case 0b01010110: //TH_A case 0b01010111: //TH_A case 0b01011000: //TH_A case 0b01011001: //TH_A case 0b01011010: //TH_A case 0b01011011: //TH_A case 0b01011100: //TH_A case 0b01011101: //TH_A case 0b01011110: //TH_A case 0b01011111: //TH_A H_A.drawRaster (src, dst, rh); break; default: TH.drawRaster (src, dst, rh); VideoController.vcnReportUnimplemented (XTH); } //switch } //drawRaster }, //XTH //================================================================================ //TH_XWC ($0004,$06xx,$1030) // 概要 // TH テキスト>1024ドット16色1プレーン // XWC 優先順位に関わらず0でない1番目のパレットを偶数化(65536色は奇数化)したパレットのカラーが奇数のとき0でない1番目のパレットのカラーだけ表示する // 手順 // 1番目のパレットを偶数化したパレットのカラーが奇数のとき // 1番目のカラー(0は黒) // さもなくば(1番目のパレットを偶数化したパレットのカラーが偶数のとき) // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // 1番目のカラー(0は黒) // 中間コード1 // (ls1(hpc(tev(h1p())))!=0?hpc(h1p()):(tpc(txp())!=0?tpc(txp()):hpc(h1p()))) // 中間コード2 // ls1(hpc(tev(h1p())))!=0?hpc(h1p()):tpc(txp())!=0?tpc(txp()):hpc(h1p()) // 中間コード3 // ls1(hpc(tev(v3=h1p())))!=0?hpc(v3):(v5=tpc(txp()))!=0?v5:hpc(v3) // 中間コード4 // ls1(hpc(tev(p=h1p())))!=0?hpc(p):(q=tpc(txp()))!=0?q:hpc(p) // 中間コード5 // (hpc((p=h1p())&-2)&1)!=0?hpc(p):(q=tpc(txp()))!=0?q:hpc(p) // 中間コード6 // (hpc((p=h1p())&-2)&1)!=0?hpo(p):(q=tpc(txp()))!=0?cto(q):hpo(p) TH_XWC { @Override public void drawRaster (int src, int dst, boolean rh) { 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; 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 1] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 1]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 2] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 2]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 3] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 3]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 4] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 4]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 5] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 5]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 6] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 6]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 7] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 7]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 1] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 1]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 2] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 2]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 3] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 3]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 4] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 4]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 5] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 5]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 6] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 6]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 7] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 7]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //TH_XWC //================================================================================ //TH_XWP ($0004,$06xx,$1430) // 概要 // TH テキスト>1024ドット16色1プレーン // XWP 優先順位に関わらず1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーだけ表示する // 手順 // 1番目のパレットが1以下のとき // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // グラフィックパレット0のカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // 1番目のカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラー(0は黒) // 中間コード1 // (h1p()<=1?(tpc(txp())!=0?tpc(txp()):hpc(0)):ls1(h1p())==0?(tpc(txp())!=0?tpc(txp()):hpc(h1p())):hpc(tev(h1p()))) // 中間コード2 // h1p()<=1?tpc(txp())!=0?tpc(txp()):hpc(0):ls1(h1p())==0?tpc(txp())!=0?tpc(txp()):hpc(h1p()):hpc(tev(h1p())) // 中間コード3 // (v0=h1p())<=1?(v1=tpc(txp()))!=0?v1:hpc(0):ls1(v0)==0?(v5=tpc(txp()))!=0?v5:hpc(v0):hpc(tev(v0)) // 中間コード4 // (p=h1p())<=1?(p=tpc(txp()))!=0?p:hpc(0):ls1(p)==0?(q=tpc(txp()))!=0?q:hpc(p):hpc(tev(p)) // 中間コード5 // (p=h1p())<=1?(p=tpc(txp()))!=0?p:hpc(0):(p&1)==0?(q=tpc(txp()))!=0?q:hpc(p):hpc(p&-2) // 中間コード6 // (p=h1p())<=1?(p=tpc(txp()))!=0?cto(p):hpo(0):(p&1)==0?(q=tpc(txp()))!=0?cto(q):hpo(p):hpo(p&-2) TH_XWP { @Override public void drawRaster (int src, int dst, boolean rh) { 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; 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 1] = ((p = GraphicScreen.graM4[ga + 1]) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 2] = ((p = GraphicScreen.graM4[ga + 2]) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 3] = ((p = GraphicScreen.graM4[ga + 3]) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 4] = ((p = GraphicScreen.graM4[ga + 4]) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 5] = ((p = GraphicScreen.graM4[ga + 5]) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 6] = ((p = GraphicScreen.graM4[ga + 6]) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 7] = ((p = GraphicScreen.graM4[ga + 7]) <= 1 ? (p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 1] = ((p = GraphicScreen.graM4[ga + 1]) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 2] = ((p = GraphicScreen.graM4[ga + 2]) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 3] = ((p = GraphicScreen.graM4[ga + 3]) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 4] = ((p = GraphicScreen.graM4[ga + 4]) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 5] = ((p = GraphicScreen.graM4[ga + 5]) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 6] = ((p = GraphicScreen.graM4[ga + 6]) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 7] = ((p = GraphicScreen.graM4[ga + 7]) <= 1 ? (p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //TH_XWP //================================================================================ //TH_XHCT ($0004,$06xx,$1930) // 概要 // TH テキスト>1024ドット16色1プレーン // XHCT 0でない1番目のパレットを偶数化(65536色は奇数化)したパレットのカラーが奇数のとき0でない1番目のカラーと奥のスプライト・テキストのカラーを混ぜる // 手順 // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // 1番目のパレットを偶数化したパレットのカラーが奇数のとき // 1番目のカラーとカラー0を混ぜたカラー(0は黒) // さもなくば(1番目のパレットを偶数化したパレットのカラーが偶数のとき) // 1番目のカラー(0は黒) // 中間コード1 // (tpc(txp())!=0?tpc(txp()):(ls1(hpc(tev(h1p())))!=0?mix(hpc(h1p()),0):hpc(h1p()))) // 中間コード2 // tpc(txp())!=0?tpc(txp()):ls1(hpc(tev(h1p())))!=0?mix(hpc(h1p()),0):hpc(h1p()) // 中間コード3 // (v0=tpc(txp()))!=0?v0:ls1(hpc(tev(v5=h1p())))!=0?mix(hpc(v5),0):hpc(v5) // 中間コード4 // (p=tpc(txp()))!=0?p:ls1(hpc(tev(p=h1p())))!=0?mix(hpc(p),0):hpc(p) // 中間コード5 // (p=tpc(txp()))!=0?p:(hpc((p=h1p())&-2)&1)!=0?mix(hpc(p),0):hpc(p) // 中間コード6 // (p=tpc(txp()))!=0?cto(p):(hpc((p=h1p())&-2)&1)!=0?cto(mix(hpc(p),0)):hpo(p) TH_XHCT { @Override public void drawRaster (int src, int dst, boolean rh) { 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; 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 1]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 2]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 3]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 4]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 5]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 6]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 7]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 1]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 2]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 3]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 4]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 5]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 6]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 7]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //TH_XHCT //================================================================================ //TH_XHPT ($0004,$06xx,$1D30) // 概要 // TH テキスト>1024ドット16色1プレーン // XHPT 1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーと奥のスプライト・テキストのカラーを混ぜる // 手順 // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // 1番目のパレットが1以下のとき // グラフィックパレット0のカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // 1番目のカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラーとカラー0を混ぜたカラー(0は黒) // 中間コード1 // (tpc(txp())!=0?tpc(txp()):(h1p()<=1?hpc(0):ls1(h1p())==0?hpc(h1p()):mix(hpc(tev(h1p())),0))) // 中間コード2 // tpc(txp())!=0?tpc(txp()):h1p()<=1?hpc(0):ls1(h1p())==0?hpc(h1p()):mix(hpc(tev(h1p())),0) // 中間コード3 // (v0=tpc(txp()))!=0?v0:(v2=h1p())<=1?hpc(0):ls1(v2)==0?hpc(v2):mix(hpc(tev(v2)),0) // 中間コード4 // (p=tpc(txp()))!=0?p:(p=h1p())<=1?hpc(0):ls1(p)==0?hpc(p):mix(hpc(tev(p)),0) // 中間コード5 // (p=tpc(txp()))!=0?p:(p=h1p())<=1?hpc(0):(p&1)==0?hpc(p):mix(hpc(p&-2),0) // 中間コード6 // (p=tpc(txp()))!=0?cto(p):(p=h1p())<=1?hpo(0):(p&1)==0?hpo(p):cto(mix(hpc(p&-2),0)) TH_XHPT { @Override public void drawRaster (int src, int dst, boolean rh) { 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; 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (p = GraphicScreen.graM4[ga]) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = GraphicScreen.graM4[ga + 1]) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = GraphicScreen.graM4[ga + 2]) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = GraphicScreen.graM4[ga + 3]) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = GraphicScreen.graM4[ga + 4]) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = GraphicScreen.graM4[ga + 5]) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = GraphicScreen.graM4[ga + 6]) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = GraphicScreen.graM4[ga + 7]) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (p = GraphicScreen.graM4[ga]) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (p = GraphicScreen.graM4[ga]) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = GraphicScreen.graM4[ga + 1]) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = GraphicScreen.graM4[ga + 2]) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = GraphicScreen.graM4[ga + 3]) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = GraphicScreen.graM4[ga + 4]) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = GraphicScreen.graM4[ga + 5]) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = GraphicScreen.graM4[ga + 6]) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = GraphicScreen.graM4[ga + 7]) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (p = GraphicScreen.graM4[ga]) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //TH_XHPT //================================================================================ //TI ($0005,$06xx,$0030) // 概要 // TI テキスト>1024ドット256色1プレーン // 拡張なし // 手順 // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // 1番目のカラー(0は黒) // 中間コード1 // (tpc(txp())!=0?tpc(txp()):ipc(i1p())) // 中間コード2 // tpc(txp())!=0?tpc(txp()):ipc(i1p()) // 中間コード3 // (v0=tpc(txp()))!=0?v0:ipc(i1p()) // 中間コード4 // (p=tpc(txp()))!=0?p:ipc(i1p()) // 中間コード5 // (p=tpc(txp()))!=0?p:ipc(i1p()) // 中間コード6 // (p=tpc(txp()))!=0?cto(p):ipo(i1p()) TI { @Override public void drawRaster (int src, int dst, boolean rh) { 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; 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[(GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[(GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[(GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[(GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[(GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[(GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[(GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[(GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[(GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[(GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[(GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[(GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[(GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[(GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[(GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[(GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[(GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[(GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])]); tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //TI //================================================================================ //XTI // 概要 // TI テキスト>1024ドット256色1プレーン // 拡張あり XTI { @Override public void drawRaster (int src, int dst, boolean rh) { switch (VideoController.vcnReg3Curr >>> 8 & 0b01011111) { // .A.XHPGT case 0b00010000: //TI_XWC case 0b00010001: //TI_XWC case 0b00010010: //TI_XWC case 0b00010011: //TI_XWC TI_XWC.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00010100: //TI_XWP case 0b00010101: //TI_XWP case 0b00010110: //TI_XWP case 0b00010111: //TI_XWP TI_XWP.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011000: //TI_XHC TI.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011001: //TI_XHCT TI_XHCT.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011101: //TI_XHPT TI_XHPT.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b01000000: //TI_A case 0b01000001: //TI_A case 0b01000010: //TI_A case 0b01000011: //TI_A case 0b01000100: //TI_A case 0b01000101: //TI_A case 0b01000110: //TI_A case 0b01000111: //TI_A case 0b01001000: //TI_A case 0b01001001: //TI_A case 0b01001010: //TI_A case 0b01001011: //TI_A case 0b01001100: //TI_A case 0b01001101: //TI_A case 0b01001110: //TI_A case 0b01001111: //TI_A case 0b01010000: //TI_A case 0b01010001: //TI_A case 0b01010010: //TI_A case 0b01010011: //TI_A case 0b01010100: //TI_A case 0b01010101: //TI_A case 0b01010110: //TI_A case 0b01010111: //TI_A case 0b01011000: //TI_A case 0b01011001: //TI_A case 0b01011010: //TI_A case 0b01011011: //TI_A case 0b01011100: //TI_A case 0b01011101: //TI_A case 0b01011110: //TI_A case 0b01011111: //TI_A I_A.drawRaster (src, dst, rh); break; default: TI.drawRaster (src, dst, rh); VideoController.vcnReportUnimplemented (XTI); } //switch } //drawRaster }, //XTI //================================================================================ //TI_XWC ($0005,$06xx,$1030) // 概要 // TI テキスト>1024ドット256色1プレーン // XWC 優先順位に関わらず0でない1番目のパレットを偶数化(65536色は奇数化)したパレットのカラーが奇数のとき0でない1番目のパレットのカラーだけ表示する // 手順 // 1番目のパレットを偶数化したパレットのカラーが奇数のとき // 1番目のカラー(0は黒) // さもなくば(1番目のパレットを偶数化したパレットのカラーが偶数のとき) // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // 1番目のカラー(0は黒) // 中間コード1 // (ls1(ipc(tev(i1p())))!=0?ipc(i1p()):(tpc(txp())!=0?tpc(txp()):ipc(i1p()))) // 中間コード2 // ls1(ipc(tev(i1p())))!=0?ipc(i1p()):tpc(txp())!=0?tpc(txp()):ipc(i1p()) // 中間コード3 // ls1(ipc(tev(v3=i1p())))!=0?ipc(v3):(v5=tpc(txp()))!=0?v5:ipc(v3) // 中間コード4 // ls1(ipc(tev(p=i1p())))!=0?ipc(p):(q=tpc(txp()))!=0?q:ipc(p) // 中間コード5 // (ipc((p=i1p())&-2)&1)!=0?ipc(p):(q=tpc(txp()))!=0?q:ipc(p) // 中間コード6 // (ipc((p=i1p())&-2)&1)!=0?ipo(p):(q=tpc(txp()))!=0?cto(q):ipo(p) TI_XWC { @Override public void drawRaster (int src, int dst, boolean rh) { 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; 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 1] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 2] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 3] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 4] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 5] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 6] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 7] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 1] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 2] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 3] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 4] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 5] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 6] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 7] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p]); tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //TI_XWC //================================================================================ //TI_XWP ($0005,$06xx,$1430) // 概要 // TI テキスト>1024ドット256色1プレーン // XWP 優先順位に関わらず1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーだけ表示する // 手順 // 1番目のパレットが1以下のとき // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // グラフィックパレット0のカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // 1番目のカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラー(0は黒) // 中間コード1 // (i1p()<=1?(tpc(txp())!=0?tpc(txp()):ipc(0)):ls1(i1p())==0?(tpc(txp())!=0?tpc(txp()):ipc(i1p())):ipc(tev(i1p()))) // 中間コード2 // i1p()<=1?tpc(txp())!=0?tpc(txp()):ipc(0):ls1(i1p())==0?tpc(txp())!=0?tpc(txp()):ipc(i1p()):ipc(tev(i1p())) // 中間コード3 // (v0=i1p())<=1?(v1=tpc(txp()))!=0?v1:ipc(0):ls1(v0)==0?(v5=tpc(txp()))!=0?v5:ipc(v0):ipc(tev(v0)) // 中間コード4 // (p=i1p())<=1?(p=tpc(txp()))!=0?p:ipc(0):ls1(p)==0?(q=tpc(txp()))!=0?q:ipc(p):ipc(tev(p)) // 中間コード5 // (p=i1p())<=1?(p=tpc(txp()))!=0?p:ipc(0):(p&1)==0?(q=tpc(txp()))!=0?q:ipc(p):ipc(p&-2) // 中間コード6 // (p=i1p())<=1?(p=tpc(txp()))!=0?cto(p):ipo(0):(p&1)==0?(q=tpc(txp()))!=0?cto(q):ipo(p):ipo(p&-2) TI_XWP { @Override public void drawRaster (int src, int dst, boolean rh) { 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; 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 1] = ((p = (GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 2] = ((p = (GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 3] = ((p = (GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) <= 1 ? (p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 1] = ((p = (GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 2] = ((p = (GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 3] = ((p = (GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) <= 1 ? (p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPal32G8[0] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPal32G8[p] : VideoController.vcnPal32G8[p & -2]); tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //TI_XWP //================================================================================ //TI_XHCT ($0005,$06xx,$1930) // 概要 // TI テキスト>1024ドット256色1プレーン // XHCT 0でない1番目のパレットを偶数化(65536色は奇数化)したパレットのカラーが奇数のとき0でない1番目のカラーと奥のスプライト・テキストのカラーを混ぜる // 手順 // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // 1番目のパレットを偶数化したパレットのカラーが奇数のとき // 1番目のカラーとカラー0を混ぜたカラー(0は黒) // さもなくば(1番目のパレットを偶数化したパレットのカラーが偶数のとき) // 1番目のカラー(0は黒) // 中間コード1 // (tpc(txp())!=0?tpc(txp()):(ls1(ipc(tev(i1p())))!=0?mix(ipc(i1p()),0):ipc(i1p()))) // 中間コード2 // tpc(txp())!=0?tpc(txp()):ls1(ipc(tev(i1p())))!=0?mix(ipc(i1p()),0):ipc(i1p()) // 中間コード3 // (v0=tpc(txp()))!=0?v0:ls1(ipc(tev(v5=i1p())))!=0?mix(ipc(v5),0):ipc(v5) // 中間コード4 // (p=tpc(txp()))!=0?p:ls1(ipc(tev(p=i1p())))!=0?mix(ipc(p),0):ipc(p) // 中間コード5 // (p=tpc(txp()))!=0?p:(ipc((p=i1p())&-2)&1)!=0?mix(ipc(p),0):ipc(p) // 中間コード6 // (p=tpc(txp()))!=0?cto(p):(ipc((p=i1p())&-2)&1)!=0?cto(mix(ipc(p),0)):ipo(p) TI_XHCT { @Override public void drawRaster (int src, int dst, boolean rh) { 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; 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], 0)] : VideoController.vcnPal32G8[p]); tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //TI_XHCT //================================================================================ //TI_XHPT ($0005,$06xx,$1D30) // 概要 // TI テキスト>1024ドット256色1プレーン // XHPT 1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーと奥のスプライト・テキストのカラーを混ぜる // 手順 // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // 1番目のパレットが1以下のとき // グラフィックパレット0のカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // 1番目のカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラーとカラー0を混ぜたカラー(0は黒) // 中間コード1 // (tpc(txp())!=0?tpc(txp()):(i1p()<=1?ipc(0):ls1(i1p())==0?ipc(i1p()):mix(ipc(tev(i1p())),0))) // 中間コード2 // tpc(txp())!=0?tpc(txp()):i1p()<=1?ipc(0):ls1(i1p())==0?ipc(i1p()):mix(ipc(tev(i1p())),0) // 中間コード3 // (v0=tpc(txp()))!=0?v0:(v2=i1p())<=1?ipc(0):ls1(v2)==0?ipc(v2):mix(ipc(tev(v2)),0) // 中間コード4 // (p=tpc(txp()))!=0?p:(p=i1p())<=1?ipc(0):ls1(p)==0?ipc(p):mix(ipc(tev(p)),0) // 中間コード5 // (p=tpc(txp()))!=0?p:(p=i1p())<=1?ipc(0):(p&1)==0?ipc(p):mix(ipc(p&-2),0) // 中間コード6 // (p=tpc(txp()))!=0?cto(p):(p=i1p())<=1?ipo(0):(p&1)==0?ipo(p):cto(mix(ipc(p&-2),0)) TI_XHPT { @Override public void drawRaster (int src, int dst, boolean rh) { 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; 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) <= 1 ? VideoController.vcnPal32G8[0] : (p & 1) == 0 ? VideoController.vcnPal32G8[p] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], 0)]); tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //TI_XHPT //================================================================================ //TJ ($0007,$06xx,$0030) // 概要 // TJ テキスト>1024ドット65536色1プレーン // 拡張なし // 手順 // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // 1番目のカラー(0は黒) // 中間コード1 // (tpc(txp())!=0?tpc(txp()):jpc(j1p(),j1p())) // 中間コード2 // tpc(txp())!=0?tpc(txp()):jpc(j1p(),j1p()) // 中間コード3 // (v0=tpc(txp()))!=0?v0:jpc(v3=j1p(),v3) // 中間コード4 // (p=tpc(txp()))!=0?p:jpc(p=j1p(),p) // 中間コード5 // (p=tpc(txp()))!=0?p:jpc(p=j1p(),p) // 中間コード6 // (p=tpc(txp()))!=0?cto(p):jpo(p=j1p(),p) TJ { @Override public void drawRaster (int src, int dst, boolean rh) { 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; 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(p = (GraphicScreen.graM4[ga + 3145728] << 12 | GraphicScreen.graM4[ga + 2097152] << 8 | GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(p = (GraphicScreen.graM4[ga + 3145729] << 12 | GraphicScreen.graM4[ga + 2097153] << 8 | GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(p = (GraphicScreen.graM4[ga + 3145730] << 12 | GraphicScreen.graM4[ga + 2097154] << 8 | GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(p = (GraphicScreen.graM4[ga + 3145731] << 12 | GraphicScreen.graM4[ga + 2097155] << 8 | GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(p = (GraphicScreen.graM4[ga + 3145732] << 12 | GraphicScreen.graM4[ga + 2097156] << 8 | GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(p = (GraphicScreen.graM4[ga + 3145733] << 12 | GraphicScreen.graM4[ga + 2097157] << 8 | GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(p = (GraphicScreen.graM4[ga + 3145734] << 12 | GraphicScreen.graM4[ga + 2097158] << 8 | GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(p = (GraphicScreen.graM4[ga + 3145735] << 12 | GraphicScreen.graM4[ga + 2097159] << 8 | GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(p = (GraphicScreen.graM4[ga + 3145728] << 12 | GraphicScreen.graM4[ga + 2097152] << 8 | GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(p = (GraphicScreen.graM4[ga + 3145728] << 12 | GraphicScreen.graM4[ga + 2097152] << 8 | GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(p = (GraphicScreen.graM4[ga + 3145729] << 12 | GraphicScreen.graM4[ga + 2097153] << 8 | GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(p = (GraphicScreen.graM4[ga + 3145730] << 12 | GraphicScreen.graM4[ga + 2097154] << 8 | GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(p = (GraphicScreen.graM4[ga + 3145731] << 12 | GraphicScreen.graM4[ga + 2097155] << 8 | GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(p = (GraphicScreen.graM4[ga + 3145732] << 12 | GraphicScreen.graM4[ga + 2097156] << 8 | GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(p = (GraphicScreen.graM4[ga + 3145733] << 12 | GraphicScreen.graM4[ga + 2097157] << 8 | GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(p = (GraphicScreen.graM4[ga + 3145734] << 12 | GraphicScreen.graM4[ga + 2097158] << 8 | GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(p = (GraphicScreen.graM4[ga + 3145735] << 12 | GraphicScreen.graM4[ga + 2097159] << 8 | GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(p = (GraphicScreen.graM4[ga + 3145728] << 12 | GraphicScreen.graM4[ga + 2097152] << 8 | GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) >> 8] | VideoController.vcnPal8G16L[p & 255]]); tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //TJ //================================================================================ //XTJ // 概要 // TJ テキスト>1024ドット65536色1プレーン // 拡張あり XTJ { @Override public void drawRaster (int src, int dst, boolean rh) { switch (VideoController.vcnReg3Curr >>> 8 & 0b01011111) { // .A.XHPGT case 0b00010000: //TJ_XWC case 0b00010001: //TJ_XWC case 0b00010010: //TJ_XWC case 0b00010011: //TJ_XWC TJ_XWC.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00010100: //TJ_XWP case 0b00010101: //TJ_XWP case 0b00010110: //TJ_XWP case 0b00010111: //TJ_XWP TJ_XWP.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011000: //TJ_XHC TJ.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011001: //TJ_XHCT TJ_XHCT.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011101: //TJ_XHPT TJ_XHPT.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b01000000: //TJ_A case 0b01000001: //TJ_A case 0b01000010: //TJ_A case 0b01000011: //TJ_A case 0b01000100: //TJ_A case 0b01000101: //TJ_A case 0b01000110: //TJ_A case 0b01000111: //TJ_A case 0b01001000: //TJ_A case 0b01001001: //TJ_A case 0b01001010: //TJ_A case 0b01001011: //TJ_A case 0b01001100: //TJ_A case 0b01001101: //TJ_A case 0b01001110: //TJ_A case 0b01001111: //TJ_A case 0b01010000: //TJ_A case 0b01010001: //TJ_A case 0b01010010: //TJ_A case 0b01010011: //TJ_A case 0b01010100: //TJ_A case 0b01010101: //TJ_A case 0b01010110: //TJ_A case 0b01010111: //TJ_A case 0b01011000: //TJ_A case 0b01011001: //TJ_A case 0b01011010: //TJ_A case 0b01011011: //TJ_A case 0b01011100: //TJ_A case 0b01011101: //TJ_A case 0b01011110: //TJ_A case 0b01011111: //TJ_A J_A.drawRaster (src, dst, rh); break; default: TJ.drawRaster (src, dst, rh); VideoController.vcnReportUnimplemented (XTJ); } //switch } //drawRaster }, //XTJ //================================================================================ //TJ_XWC ($0007,$06xx,$1030) // 概要 // TJ テキスト>1024ドット65536色1プレーン // XWC 優先順位に関わらず0でない1番目のパレットを偶数化(65536色は奇数化)したパレットのカラーが奇数のとき0でない1番目のパレットのカラーだけ表示する // 手順 // 1番目のパレットを奇数化したパレットのカラーが奇数のとき // 1番目のカラー(0は黒) // さもなくば(1番目のパレットを奇数化したパレットのカラーが偶数のとき) // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // 1番目のカラー(0は黒) // 中間コード1 // (ls1(jpc(tod(j1p()),tod(j1p())))!=0?jpc(j1p(),j1p()):(tpc(txp())!=0?tpc(txp()):jpc(j1p(),j1p()))) // 中間コード2 // ls1(jpc(tod(j1p()),tod(j1p())))!=0?jpc(j1p(),j1p()):tpc(txp())!=0?tpc(txp()):jpc(j1p(),j1p()) // 中間コード3 // ls1(jpc(v2=tod(v3=j1p()),v2))!=0?jpc(v3,v3):(v5=tpc(txp()))!=0?v5:jpc(v3,v3) // 中間コード4 // ls1(jpc(p=tod(q=j1p()),p))!=0?jpc(q,q):(p=tpc(txp()))!=0?p:jpc(q,q) // 中間コード5 // (jpc(p=(q=j1p())|1,p)&1)!=0?jpc(q,q):(p=tpc(txp()))!=0?p:jpc(q,q) // 中間コード6 // (jpc(p=(q=j1p())|1,p)&1)!=0?jpo(q,q):(p=tpc(txp()))!=0?cto(p):jpo(q,q) TJ_XWC { @Override public void drawRaster (int src, int dst, boolean rh) { 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; 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //TJ_XWC //================================================================================ //TJ_XWP ($0007,$06xx,$1430) // 概要 // TJ テキスト>1024ドット65536色1プレーン // XWP 優先順位に関わらず1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーだけ表示する // 手順 // 1番目のパレットが1以下のとき // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // グラフィックパレット0のカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // 1番目のカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラー(0は黒) // 中間コード1 // (j1p()<=1?(tpc(txp())!=0?tpc(txp()):jpc(0,0)):ls1(j1p())==0?(tpc(txp())!=0?tpc(txp()):jpc(j1p(),j1p())):jpc(tev(j1p()),tev(j1p()))) // 中間コード2 // j1p()<=1?tpc(txp())!=0?tpc(txp()):jpc(0,0):ls1(j1p())==0?tpc(txp())!=0?tpc(txp()):jpc(j1p(),j1p()):jpc(tev(j1p()),tev(j1p())) // 中間コード3 // (v0=j1p())<=1?(v1=tpc(txp()))!=0?v1:jpc(0,0):ls1(v0)==0?(v5=tpc(txp()))!=0?v5:jpc(v0,v0):jpc(v9=tev(v0),v9) // 中間コード4 // (p=j1p())<=1?(p=tpc(txp()))!=0?p:jpc(0,0):ls1(p)==0?(q=tpc(txp()))!=0?q:jpc(p,p):jpc(q=tev(p),q) // 中間コード5 // (p=j1p())<=1?(p=tpc(txp()))!=0?p:jpc(0,0):(p&1)==0?(q=tpc(txp()))!=0?q:jpc(p,p):jpc(q=p&-2,q) // 中間コード6 // (p=j1p())<=1?(p=tpc(txp()))!=0?cto(p):jpo(0,0):(p&1)==0?(q=tpc(txp()))!=0?cto(q):jpo(p,p):jpo(q=p&-2,q) TJ_XWP { @Override public void drawRaster (int src, int dst, boolean rh) { 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; 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : 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.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : 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.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 3] = ((p = (GraphicScreen.graM4[ga + 3145731] << 12 | GraphicScreen.graM4[ga + 2097155] << 8 | GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[ga + 3145732] << 12 | GraphicScreen.graM4[ga + 2097156] << 8 | GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[ga + 3145733] << 12 | GraphicScreen.graM4[ga + 2097157] << 8 | GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[ga + 3145734] << 12 | GraphicScreen.graM4[ga + 2097158] << 8 | GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[ga + 3145735] << 12 | GraphicScreen.graM4[ga + 2097159] << 8 | GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) <= 1 ? (p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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 + 3145728] << 12 | GraphicScreen.graM4[ga + 2097152] << 8 | GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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 + 3145728] << 12 | GraphicScreen.graM4[ga + 2097152] << 8 | GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : 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.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : 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.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 3] = ((p = (GraphicScreen.graM4[ga + 3145731] << 12 | GraphicScreen.graM4[ga + 2097155] << 8 | GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[ga + 3145732] << 12 | GraphicScreen.graM4[ga + 2097156] << 8 | GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[ga + 3145733] << 12 | GraphicScreen.graM4[ga + 2097157] << 8 | GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[ga + 3145734] << 12 | GraphicScreen.graM4[ga + 2097158] << 8 | GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[ga + 3145735] << 12 | GraphicScreen.graM4[ga + 2097159] << 8 | GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) <= 1 ? (p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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 + 3145728] << 12 | GraphicScreen.graM4[ga + 2097152] << 8 | GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) <= 1 ? (p = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? (q = VideoController.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[q] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //TJ_XWP //================================================================================ //TJ_XHCT ($0007,$06xx,$1930) // 概要 // TJ テキスト>1024ドット65536色1プレーン // XHCT 0でない1番目のパレットを偶数化(65536色は奇数化)したパレットのカラーが奇数のとき0でない1番目のカラーと奥のスプライト・テキストのカラーを混ぜる // 手順 // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // 1番目のパレットを奇数化したパレットのカラーが奇数のとき // 1番目のカラーとカラー0を混ぜたカラー(0は黒) // さもなくば(1番目のパレットを奇数化したパレットのカラーが偶数のとき) // 1番目のカラー(0は黒) // 中間コード1 // (tpc(txp())!=0?tpc(txp()):(ls1(jpc(tod(j1p()),tod(j1p())))!=0?mix(jpc(j1p(),j1p()),0):jpc(j1p(),j1p()))) // 中間コード2 // tpc(txp())!=0?tpc(txp()):ls1(jpc(tod(j1p()),tod(j1p())))!=0?mix(jpc(j1p(),j1p()),0):jpc(j1p(),j1p()) // 中間コード3 // (v0=tpc(txp()))!=0?v0:ls1(jpc(v4=tod(v5=j1p()),v4))!=0?mix(jpc(v5,v5),0):jpc(v5,v5) // 中間コード4 // (p=tpc(txp()))!=0?p:ls1(jpc(p=tod(q=j1p()),p))!=0?mix(jpc(q,q),0):jpc(q,q) // 中間コード5 // (p=tpc(txp()))!=0?p:(jpc(p=(q=j1p())|1,p)&1)!=0?mix(jpc(q,q),0):jpc(q,q) // 中間コード6 // (p=tpc(txp()))!=0?cto(p):(jpc(p=(q=j1p())|1,p)&1)!=0?cto(mix(jpc(q,q),0)):jpo(q,q) TJ_XHCT { @Override public void drawRaster (int src, int dst, boolean rh) { 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; 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : ((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.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : ((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.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : ((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.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : ((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.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : ((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.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]]); tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //TJ_XHCT //================================================================================ //TJ_XHPT ($0007,$06xx,$1D30) // 概要 // TJ テキスト>1024ドット65536色1プレーン // XHPT 1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーと奥のスプライト・テキストのカラーを混ぜる // 手順 // テキストカラーが0でないとき // テキストカラー // さもなくば(テキストカラーが0のとき) // 1番目のパレットが1以下のとき // グラフィックパレット0のカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // 1番目のカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラーとカラー0を混ぜたカラー(0は黒) // 中間コード1 // (tpc(txp())!=0?tpc(txp()):(j1p()<=1?jpc(0,0):ls1(j1p())==0?jpc(j1p(),j1p()):mix(jpc(tev(j1p()),tev(j1p())),0))) // 中間コード2 // tpc(txp())!=0?tpc(txp()):j1p()<=1?jpc(0,0):ls1(j1p())==0?jpc(j1p(),j1p()):mix(jpc(tev(j1p()),tev(j1p())),0) // 中間コード3 // (v0=tpc(txp()))!=0?v0:(v2=j1p())<=1?jpc(0,0):ls1(v2)==0?jpc(v2,v2):mix(jpc(v8=tev(v2),v8),0) // 中間コード4 // (p=tpc(txp()))!=0?p:(p=j1p())<=1?jpc(0,0):ls1(p)==0?jpc(p,p):mix(jpc(q=tev(p),q),0) // 中間コード5 // (p=tpc(txp()))!=0?p:(p=j1p())<=1?jpc(0,0):(p&1)==0?jpc(p,p):mix(jpc(q=p&-2,q),0) // 中間コード6 // (p=tpc(txp()))!=0?cto(p):(p=j1p())<=1?jpo(0,0):(p&1)==0?jpo(p,p):cto(mix(jpc(q=p&-2,q),0)) TJ_XHPT { @Override public void drawRaster (int src, int dst, boolean rh) { 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; 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 3145728] << 12 | GraphicScreen.graM4[ga + 2097152] << 8 | GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) <= 1 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 3145729] << 12 | GraphicScreen.graM4[ga + 2097153] << 8 | GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) <= 1 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 3145730] << 12 | GraphicScreen.graM4[ga + 2097154] << 8 | GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) <= 1 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 3145731] << 12 | GraphicScreen.graM4[ga + 2097155] << 8 | GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) <= 1 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 3145732] << 12 | GraphicScreen.graM4[ga + 2097156] << 8 | GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) <= 1 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 3145733] << 12 | GraphicScreen.graM4[ga + 2097157] << 8 | GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) <= 1 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 3145734] << 12 | GraphicScreen.graM4[ga + 2097158] << 8 | GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) <= 1 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 3145735] << 12 | GraphicScreen.graM4[ga + 2097159] << 8 | GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) <= 1 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 3145728] << 12 | GraphicScreen.graM4[ga + 2097152] << 8 | GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) <= 1 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 3145728] << 12 | GraphicScreen.graM4[ga + 2097152] << 8 | GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) <= 1 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16TS[tp >>> 24 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 3145729] << 12 | GraphicScreen.graM4[ga + 2097153] << 8 | GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) <= 1 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16TS[tp >>> 20 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 3145730] << 12 | GraphicScreen.graM4[ga + 2097154] << 8 | GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) <= 1 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16TS[tp >>> 16 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 3145731] << 12 | GraphicScreen.graM4[ga + 2097155] << 8 | GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) <= 1 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16TS[tp >>> 12 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 3145732] << 12 | GraphicScreen.graM4[ga + 2097156] << 8 | GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) <= 1 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16TS[tp >>> 8 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 3145733] << 12 | GraphicScreen.graM4[ga + 2097157] << 8 | GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) <= 1 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16TS[tp >>> 4 & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 3145734] << 12 | GraphicScreen.graM4[ga + 2097158] << 8 | GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) <= 1 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16TS[tp & 15]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 3145735] << 12 | GraphicScreen.graM4[ga + 2097159] << 8 | GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) <= 1 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); 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.vcnPal16TS[tp >>> 28]) != 0 ? VideoController.vcnPalTbl[p] : (p = (GraphicScreen.graM4[ga + 3145728] << 12 | GraphicScreen.graM4[ga + 2097152] << 8 | GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) <= 1 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255]] : (p & 1) == 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), 0)]); tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //TJ_XHPT //================================================================================ //E1ST ($0000,$18xx,$0061) // 概要 // E1ST 512ドット16色1プレーン>スプライト>テキスト // 拡張なし // 手順 // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // スプライトパレットの下位4bitが0でないまたはテキストパレットが0のとき // スプライトカラー(0は黒) // さもなくば(スプライトパレットの下位4bitが0かつテキストパレットが0でないとき) // テキストカラー(0は黒) // 中間コード1 // (epc(e1p())!=0?epc(e1p()):(ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()))) // 中間コード2 // epc(e1p())!=0?epc(e1p()):ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()) // 中間コード3 // (v0=epc(e1p()))!=0?v0:ls4(v3=spp())!=0||(v4=txp())==0?spc(v3):tpc(v4) // 中間コード4 // (p=epc(e1p()))!=0?p:ls4(p=spp())!=0||(q=txp())==0?spc(p):tpc(q) // 中間コード5 // (p=epc(e1p()))!=0?p:((p=spp())&15)!=0||(q=txp())==0?spc(p):tpc(q) // 中間コード6 // (p=epc(e1p()))!=0?cto(p):((p=spp())&15)!=0||(q=txp())==0?spo(p):tpo(q) E1ST { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int pn = VideoController.vcnReg2Curr & 3; //1番目のパレットのGVRAMページ番号 int gx1st = CRTC.crtR12GrXCurr[pn]; int gy1st = VideoController.vcnVisible1st + ((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; 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.vcnPal16G8[GraphicScreen.graM4[gy1st | gx1st & 511]]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[gy1st | gx1st + 1 & 511]]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[gy1st | gx1st + 2 & 511]]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[gy1st | gx1st + 3 & 511]]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[gy1st | gx1st + 4 & 511]]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[gy1st | gx1st + 5 & 511]]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[gy1st | gx1st + 6 & 511]]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[gy1st | gx1st + 7 & 511]]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); sx += 8; gx1st += 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.vcnPal16G8[GraphicScreen.graM4[gy1st | gx1st & 511]]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[gy1st | gx1st + 1 & 511]]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[gy1st | gx1st + 2 & 511]]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[gy1st | gx1st + 3 & 511]]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[gy1st | gx1st + 4 & 511]]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[gy1st | gx1st + 5 & 511]]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[gy1st | gx1st + 6 & 511]]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[gy1st | gx1st + 7 & 511]]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); sx += 8; gx1st += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //E1ST //================================================================================ //XE1ST // 概要 // E1ST 512ドット16色1プレーン>スプライト>テキスト // 拡張あり XE1ST { @Override public void drawRaster (int src, int dst, boolean rh) { switch (VideoController.vcnReg3Curr >>> 8 & 0b01011111) { // .A.XHPGT case 0b00010000: //E1ST_XWC case 0b00010001: //E1ST_XWC case 0b00010010: //E1ST_XWC case 0b00010011: //E1ST_XWC E1ST_XWC.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00010100: //E1ST_XWP case 0b00010101: //E1ST_XWP case 0b00010110: //E1ST_XWP case 0b00010111: //E1ST_XWP E1ST_XWP.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011000: //E1ST_XHC E1ST.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011001: //E1ST_XHCT E1ST_XHCT.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011010: //E1ST_XHCG E1ST_XHCG.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011011: //E1ST_XHCGT E1ST_XHCGT.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011101: //E1ST_XHPT E1ST_XHPT.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011110: //E1ST_XHPG E1ST_XHPG.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011111: //E1ST_XHPGT E1ST_XHPGT.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b01000000: //E1ST_A case 0b01000001: //E1ST_A case 0b01000010: //E1ST_A case 0b01000011: //E1ST_A case 0b01000100: //E1ST_A case 0b01000101: //E1ST_A case 0b01000110: //E1ST_A case 0b01000111: //E1ST_A case 0b01001000: //E1ST_A case 0b01001001: //E1ST_A case 0b01001010: //E1ST_A case 0b01001011: //E1ST_A case 0b01001100: //E1ST_A case 0b01001101: //E1ST_A case 0b01001110: //E1ST_A case 0b01001111: //E1ST_A case 0b01010000: //E1ST_A case 0b01010001: //E1ST_A case 0b01010010: //E1ST_A case 0b01010011: //E1ST_A case 0b01010100: //E1ST_A case 0b01010101: //E1ST_A case 0b01010110: //E1ST_A case 0b01010111: //E1ST_A case 0b01011000: //E1ST_A case 0b01011001: //E1ST_A case 0b01011010: //E1ST_A case 0b01011011: //E1ST_A case 0b01011100: //E1ST_A case 0b01011101: //E1ST_A case 0b01011110: //E1ST_A case 0b01011111: //E1ST_A E1_A.drawRaster (src, dst, rh); break; default: E1ST.drawRaster (src, dst, rh); VideoController.vcnReportUnimplemented (XE1ST); } //switch } //drawRaster }, //XE1ST //================================================================================ //E1ST_XWC ($0000,$18xx,$1061) // 概要 // E1ST 512ドット16色1プレーン>スプライト>テキスト // XWC 優先順位に関わらず0でない1番目のパレットを偶数化(65536色は奇数化)したパレットのカラーが奇数のとき0でない1番目のパレットのカラーだけ表示する // 手順 // 1番目のパレットを偶数化したパレットのカラーが奇数のとき // 1番目のカラー(0は黒) // さもなくば(1番目のパレットを偶数化したパレットのカラーが偶数のとき) // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // スプライトパレットの下位4bitが0でないまたはテキストパレットが0のとき // スプライトカラー(0は黒) // さもなくば(スプライトパレットの下位4bitが0かつテキストパレットが0でないとき) // テキストカラー(0は黒) // 中間コード1 // (ls1(epc(tev(e1p())))!=0?epc(e1p()):(epc(e1p())!=0?epc(e1p()):(ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp())))) // 中間コード2 // ls1(epc(tev(e1p())))!=0?epc(e1p()):epc(e1p())!=0?epc(e1p()):ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()) // 中間コード3 // ls1(epc(tev(v3=e1p())))!=0?epc(v3):(v5=epc(v3))!=0?v5:ls4(v7=spp())!=0||(v8=txp())==0?spc(v7):tpc(v8) // 中間コード4 // ls1(epc(tev(p=e1p())))!=0?epc(p):(q=epc(p))!=0?q:ls4(p=spp())!=0||(q=txp())==0?spc(p):tpc(q) // 中間コード5 // (epc((p=e1p())&-2)&1)!=0?epc(p):(q=epc(p))!=0?q:((p=spp())&15)!=0||(q=txp())==0?spc(p):tpc(q) // 中間コード6 // (epc((p=e1p())&-2)&1)!=0?epo(p):(q=epc(p))!=0?cto(q):((p=spp())&15)!=0||(q=txp())==0?spo(p):tpo(q) E1ST_XWC { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int pn = VideoController.vcnReg2Curr & 3; //1番目のパレットのGVRAMページ番号 int gx1st = CRTC.crtR12GrXCurr[pn]; int gy1st = VideoController.vcnVisible1st + ((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; 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.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st & 511]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 1] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 1 & 511]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 2] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 2 & 511]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 3] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 3 & 511]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 4] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 4 & 511]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 5] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 5 & 511]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 6] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 6 & 511]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 7] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 7 & 511]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); sx += 8; gx1st += 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.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st & 511]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 1] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 1 & 511]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 2] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 2 & 511]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 3] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 3 & 511]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 4] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 4 & 511]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 5] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 5 & 511]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 6] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 6 & 511]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 7] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 7 & 511]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); sx += 8; gx1st += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //E1ST_XWC //================================================================================ //E1ST_XWP ($0000,$18xx,$1461) // 概要 // E1ST 512ドット16色1プレーン>スプライト>テキスト // XWP 優先順位に関わらず1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーだけ表示する // 手順 // 1番目のパレットが1以下のとき // グラフィックパレット0のカラーが0でないとき // グラフィックパレット0のカラー // さもなくば(グラフィックパレット0のカラーが0のとき) // スプライトパレットの下位4bitが0でないまたはテキストパレットが0のとき // スプライトカラー(0は黒) // さもなくば(スプライトパレットの下位4bitが0かつテキストパレットが0でないとき) // テキストカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // スプライトパレットの下位4bitが0でないまたはテキストパレットが0のとき // スプライトカラー(0は黒) // さもなくば(スプライトパレットの下位4bitが0かつテキストパレットが0でないとき) // テキストカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラー(0は黒) // 中間コード1 // (e1p()<=1?(epc(0)!=0?epc(0):(ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()))):ls1(e1p())==0?(epc(e1p())!=0?epc(e1p()):(ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()))):epc(tev(e1p()))) // 中間コード2 // e1p()<=1?epc(0)!=0?epc(0):ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()):ls1(e1p())==0?epc(e1p())!=0?epc(e1p()):ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()):epc(tev(e1p())) // 中間コード3 // (v0=e1p())<=1?(v1=epc(0))!=0?v1:ls4(v3=spp())!=0||(v4=txp())==0?spc(v3):tpc(v4):ls1(v0)==0?(v8=epc(v0))!=0?v8:ls4(v10=spp())!=0||(v11=txp())==0?spc(v10):tpc(v11):epc(tev(v0)) // 中間コード4 // (p=e1p())<=1?(p=epc(0))!=0?p:ls4(p=spp())!=0||(q=txp())==0?spc(p):tpc(q):ls1(p)==0?(q=epc(p))!=0?q:ls4(p=spp())!=0||(q=txp())==0?spc(p):tpc(q):epc(tev(p)) // 中間コード5 // (p=e1p())<=1?(p=epc(0))!=0?p:((p=spp())&15)!=0||(q=txp())==0?spc(p):tpc(q):(p&1)==0?(q=epc(p))!=0?q:((p=spp())&15)!=0||(q=txp())==0?spc(p):tpc(q):epc(p&-2) // 中間コード6 // (p=e1p())<=1?(p=epc(0))!=0?cto(p):((p=spp())&15)!=0||(q=txp())==0?spo(p):tpo(q):(p&1)==0?(q=epc(p))!=0?cto(q):((p=spp())&15)!=0||(q=txp())==0?spo(p):tpo(q):epo(p&-2) E1ST_XWP { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int pn = VideoController.vcnReg2Curr & 3; //1番目のパレットのGVRAMページ番号 int gx1st = CRTC.crtR12GrXCurr[pn]; int gy1st = VideoController.vcnVisible1st + ((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; 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[gy1st | gx1st & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 1] = ((p = GraphicScreen.graM4[gy1st | gx1st + 1 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 2] = ((p = GraphicScreen.graM4[gy1st | gx1st + 2 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 3] = ((p = GraphicScreen.graM4[gy1st | gx1st + 3 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 4] = ((p = GraphicScreen.graM4[gy1st | gx1st + 4 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 5] = ((p = GraphicScreen.graM4[gy1st | gx1st + 5 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 6] = ((p = GraphicScreen.graM4[gy1st | gx1st + 6 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 7] = ((p = GraphicScreen.graM4[gy1st | gx1st + 7 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPal32G8[p & -2]); sx += 8; gx1st += 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[gy1st | gx1st & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 1] = ((p = GraphicScreen.graM4[gy1st | gx1st + 1 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 2] = ((p = GraphicScreen.graM4[gy1st | gx1st + 2 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 3] = ((p = GraphicScreen.graM4[gy1st | gx1st + 3 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 4] = ((p = GraphicScreen.graM4[gy1st | gx1st + 4 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 5] = ((p = GraphicScreen.graM4[gy1st | gx1st + 5 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 6] = ((p = GraphicScreen.graM4[gy1st | gx1st + 6 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 7] = ((p = GraphicScreen.graM4[gy1st | gx1st + 7 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPal32G8[p & -2]); sx += 8; gx1st += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //E1ST_XWP //================================================================================ //E1ST_XHCT ($0000,$18xx,$1961) // 概要 // E1ST 512ドット16色1プレーン>スプライト>テキスト // XHCT 0でない1番目のパレットを偶数化(65536色は奇数化)したパレットのカラーが奇数のとき0でない1番目のカラーと奥のスプライト・テキストのカラーを混ぜる // 手順 // 1番目のパレットを偶数化したパレットのカラーが奇数のとき // 1番目のカラーと // スプライトパレットの下位4bitが0でないまたはテキストパレットが0のとき // スプライトカラー(0は黒) // さもなくば(スプライトパレットの下位4bitが0かつテキストパレットが0でないとき) // テキストカラー(0は黒) // を混ぜたカラー(0は黒) // さもなくば(1番目のパレットを偶数化したパレットのカラーが偶数のとき) // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // スプライトパレットの下位4bitが0でないまたはテキストパレットが0のとき // スプライトカラー(0は黒) // さもなくば(スプライトパレットの下位4bitが0かつテキストパレットが0でないとき) // テキストカラー(0は黒) // 中間コード1 // (ls1(epc(tev(e1p())))!=0?mix(epc(e1p()),(ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()))):(epc(e1p())!=0?epc(e1p()):(ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp())))) // 中間コード2 // ls1(epc(tev(e1p())))!=0?mix(epc(e1p()),ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp())):epc(e1p())!=0?epc(e1p()):ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()) // 中間コード3 // ls1(epc(tev(v3=e1p())))!=0?mix(epc(v3),ls4(v7=spp())!=0||(v8=txp())==0?spc(v7):tpc(v8)):(v11=epc(v3))!=0?v11:ls4(v13=spp())!=0||(v14=txp())==0?spc(v13):tpc(v14) // 中間コード4 // ls1(epc(tev(p=e1p())))!=0?mix(epc(p),ls4(p=spp())!=0||(q=txp())==0?spc(p):tpc(q)):(q=epc(p))!=0?q:ls4(p=spp())!=0||(q=txp())==0?spc(p):tpc(q) // 中間コード5 // (epc((p=e1p())&-2)&1)!=0?mix(epc(p),((p=spp())&15)!=0||(q=txp())==0?spc(p):tpc(q)):(q=epc(p))!=0?q:((p=spp())&15)!=0||(q=txp())==0?spc(p):tpc(q) // 中間コード6 // (epc((p=e1p())&-2)&1)!=0?cto(mix(epc(p),((p=spp())&15)!=0||(q=txp())==0?spc(p):tpc(q))):(q=epc(p))!=0?cto(q):((p=spp())&15)!=0||(q=txp())==0?spo(p):tpo(q) E1ST_XHCT { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int pn = VideoController.vcnReg2Curr & 3; //1番目のパレットのGVRAMページ番号 int gx1st = CRTC.crtR12GrXCurr[pn]; int gy1st = VideoController.vcnVisible1st + ((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; 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.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st & 511]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 1] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 1 & 511]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 2] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 2 & 511]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 3] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 3 & 511]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 4] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 4 & 511]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 5] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 5 & 511]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 6] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 6 & 511]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 7] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 7 & 511]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); sx += 8; gx1st += 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.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st & 511]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 1] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 1 & 511]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 2] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 2 & 511]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 3] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 3 & 511]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 4] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 4 & 511]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 5] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 5 & 511]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 6] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 6 & 511]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 7] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[gy1st | gx1st + 7 & 511]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); sx += 8; gx1st += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //E1ST_XHCT //================================================================================ //E1ST_XHCG ($0000,$18xx,$1A61) // 概要 // E1ST 512ドット16色1プレーン>スプライト>テキスト // XHCG 0でない1番目のパレットを偶数化したパレットのカラーが奇数のときそれと2番目のパレットを奇数化したパレットのカラーを混ぜる // 手順 // 1番目のパレットを偶数化したパレットのカラーが奇数のとき // 1番目のパレットを偶数化したパレットのカラーと2番目(ONとみなす)のパレットを奇数化したパレットのカラーを混ぜたカラー(0は黒) // さもなくば(1番目のパレットを偶数化したパレットのカラーが偶数のとき) // 1番目のパレットが奇数のとき // 2番目(ONとみなす)のパレットを奇数化したパレットのカラーが0でないとき // 2番目(ONとみなす)のパレットを奇数化したパレットのカラー // さもなくば(2番目(ONとみなす)のパレットを奇数化したパレットのカラーが0のとき) // スプライトパレットの下位4bitが0でないまたはテキストパレットが0のとき // スプライトカラー(0は黒) // さもなくば(スプライトパレットの下位4bitが0かつテキストパレットが0でないとき) // テキストカラー(0は黒) // さもなくば(1番目のパレットが偶数のとき) // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // スプライトパレットの下位4bitが0でないまたはテキストパレットが0のとき // スプライトカラー(0は黒) // さもなくば(スプライトパレットの下位4bitが0かつテキストパレットが0でないとき) // テキストカラー(0は黒) // 中間コード1 // (ls1(epc(tev(e1p())))!=0?mix(epc(tev(e1p())),epc(tod(e2q()))):(ls1(e1p())!=0?(epc(tod(e2q()))!=0?epc(tod(e2q())):(ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()))):(epc(e1p())!=0?epc(e1p()):(ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()))))) // 中間コード2 // ls1(epc(tev(e1p())))!=0?mix(epc(tev(e1p())),epc(tod(e2q()))):ls1(e1p())!=0?epc(tod(e2q()))!=0?epc(tod(e2q())):ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()):epc(e1p())!=0?epc(e1p()):ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()) // 中間コード3 // ls1(v1=epc(tev(v3=e1p())))!=0?mix(v1,epc(tod(e2q()))):ls1(v3)!=0?(v9=epc(tod(e2q())))!=0?v9:ls4(v13=spp())!=0||(v14=txp())==0?spc(v13):tpc(v14):(v17=epc(v3))!=0?v17:ls4(v19=spp())!=0||(v20=txp())==0?spc(v19):tpc(v20) // 中間コード4 // ls1(p=epc(tev(q=e1p())))!=0?mix(p,epc(tod(e2q()))):ls1(q)!=0?(p=epc(tod(e2q())))!=0?p:ls4(p=spp())!=0||(q=txp())==0?spc(p):tpc(q):(p=epc(q))!=0?p:ls4(p=spp())!=0||(q=txp())==0?spc(p):tpc(q) // 中間コード5 // ((p=epc((q=e1p())&-2))&1)!=0?mix(p,epc(e2q()|1)):(q&1)!=0?(p=epc(e2q()|1))!=0?p:((p=spp())&15)!=0||(q=txp())==0?spc(p):tpc(q):(p=epc(q))!=0?p:((p=spp())&15)!=0||(q=txp())==0?spc(p):tpc(q) // 中間コード6 // ((p=epc((q=e1p())&-2))&1)!=0?cto(mix(p,epc(e2q()|1))):(q&1)!=0?(p=epc(e2q()|1))!=0?cto(p):((p=spp())&15)!=0||(q=txp())==0?spo(p):tpo(q):(p=epc(q))!=0?cto(p):((p=spp())&15)!=0||(q=txp())==0?spo(p):tpo(q) E1ST_XHCG { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int pn = VideoController.vcnReg2Curr & 3; //1番目のパレットのGVRAMページ番号 int gx1st = CRTC.crtR12GrXCurr[pn]; int gy1st = VideoController.vcnVisible1st + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 2 & 3; //2番目のパレットのGVRAMページ番号 int gx2nd = CRTC.crtR12GrXCurr[pn]; int gz2nd = VideoController.vcnHidden2nd + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); //ONとみなす 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; 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.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd & 511] | 1])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 1] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 1 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 1 & 511] | 1])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 1 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 2] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 2 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 2 & 511] | 1])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 2 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 3] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 3 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 3 & 511] | 1])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 3 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 4] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 4 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 4 & 511] | 1])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 4 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 5] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 5 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 5 & 511] | 1])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 5 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 6] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 6 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 6 & 511] | 1])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 6 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 7] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 7 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 7 & 511] | 1])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 7 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); sx += 8; gx1st += 8; gx2nd += 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.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd & 511] | 1])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 1] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 1 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 1 & 511] | 1])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 1 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 2] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 2 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 2 & 511] | 1])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 2 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 3] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 3 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 3 & 511] | 1])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 3 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 4] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 4 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 4 & 511] | 1])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 4 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 5] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 5 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 5 & 511] | 1])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 5 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 6] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 6 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 6 & 511] | 1])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 6 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 7] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 7 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 7 & 511] | 1])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 7 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); sx += 8; gx1st += 8; gx2nd += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //E1ST_XHCG //================================================================================ //E1ST_XHCGT ($0000,$18xx,$1B61) // 概要 // E1ST 512ドット16色1プレーン>スプライト>テキスト // XHCGT 0でない1番目のパレットを偶数化したパレットのカラーが奇数のときそれと2番目のパレットを奇数化したパレットのカラーを混ぜてさらに奥のスプライト・テキストのカラーを混ぜる // 手順 // 1番目のパレットを偶数化したパレットのカラーが奇数のとき // 1番目のパレットを偶数化したパレットのカラーと2番目(ONとみなす)のパレットを奇数化したパレットのカラーを混ぜたカラーにさらに // スプライトパレットの下位4bitが0でないまたはテキストパレットが0のとき // スプライトカラー(0は黒) // さもなくば(スプライトパレットの下位4bitが0かつテキストパレットが0でないとき) // テキストカラー(0は黒) // を混ぜたカラー(0は黒) // さもなくば(1番目のパレットを偶数化したパレットのカラーが偶数のとき) // 1番目のパレットが奇数のとき // 2番目(ONとみなす)のパレットを奇数化したパレットのカラーが0でないとき // 2番目(ONとみなす)のパレットを奇数化したパレットのカラー // さもなくば(2番目(ONとみなす)のパレットを奇数化したパレットのカラーが0のとき) // スプライトパレットの下位4bitが0でないまたはテキストパレットが0のとき // スプライトカラー(0は黒) // さもなくば(スプライトパレットの下位4bitが0かつテキストパレットが0でないとき) // テキストカラー(0は黒) // さもなくば(1番目のパレットが偶数のとき) // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // スプライトパレットの下位4bitが0でないまたはテキストパレットが0のとき // スプライトカラー(0は黒) // さもなくば(スプライトパレットの下位4bitが0かつテキストパレットが0でないとき) // テキストカラー(0は黒) // 中間コード1 // (ls1(epc(tev(e1p())))!=0?mix(mix(epc(tev(e1p())),epc(tod(e2q()))),(ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()))):(ls1(e1p())!=0?(epc(tod(e2q()))!=0?epc(tod(e2q())):(ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()))):(epc(e1p())!=0?epc(e1p()):(ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()))))) // 中間コード2 // ls1(epc(tev(e1p())))!=0?mix(mix(epc(tev(e1p())),epc(tod(e2q()))),ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp())):ls1(e1p())!=0?epc(tod(e2q()))!=0?epc(tod(e2q())):ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()):epc(e1p())!=0?epc(e1p()):ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()) // 中間コード3 // ls1(v1=epc(tev(v3=e1p())))!=0?mix(mix(v1,epc(tod(e2q()))),ls4(v10=spp())!=0||(v11=txp())==0?spc(v10):tpc(v11)):ls1(v3)!=0?(v15=epc(tod(e2q())))!=0?v15:ls4(v19=spp())!=0||(v20=txp())==0?spc(v19):tpc(v20):(v23=epc(v3))!=0?v23:ls4(v25=spp())!=0||(v26=txp())==0?spc(v25):tpc(v26) // 中間コード4 // ls1(p=epc(tev(q=e1p())))!=0?mix(mix(p,epc(tod(e2q()))),ls4(p=spp())!=0||(q=txp())==0?spc(p):tpc(q)):ls1(q)!=0?(p=epc(tod(e2q())))!=0?p:ls4(p=spp())!=0||(q=txp())==0?spc(p):tpc(q):(p=epc(q))!=0?p:ls4(p=spp())!=0||(q=txp())==0?spc(p):tpc(q) // 中間コード5 // ((p=epc((q=e1p())&-2))&1)!=0?mix(mix(p,epc(e2q()|1)),((p=spp())&15)!=0||(q=txp())==0?spc(p):tpc(q)):(q&1)!=0?(p=epc(e2q()|1))!=0?p:((p=spp())&15)!=0||(q=txp())==0?spc(p):tpc(q):(p=epc(q))!=0?p:((p=spp())&15)!=0||(q=txp())==0?spc(p):tpc(q) // 中間コード6 // ((p=epc((q=e1p())&-2))&1)!=0?cto(mix(mix(p,epc(e2q()|1)),((p=spp())&15)!=0||(q=txp())==0?spc(p):tpc(q))):(q&1)!=0?(p=epc(e2q()|1))!=0?cto(p):((p=spp())&15)!=0||(q=txp())==0?spo(p):tpo(q):(p=epc(q))!=0?cto(p):((p=spp())&15)!=0||(q=txp())==0?spo(p):tpo(q) E1ST_XHCGT { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int pn = VideoController.vcnReg2Curr & 3; //1番目のパレットのGVRAMページ番号 int gx1st = CRTC.crtR12GrXCurr[pn]; int gy1st = VideoController.vcnVisible1st + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 2 & 3; //2番目のパレットのGVRAMページ番号 int gx2nd = CRTC.crtR12GrXCurr[pn]; int gz2nd = VideoController.vcnHidden2nd + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); //ONとみなす 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; 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.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd & 511] | 1]), ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 1] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 1 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 1 & 511] | 1]), ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 1 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 2] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 2 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 2 & 511] | 1]), ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 2 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 3] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 3 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 3 & 511] | 1]), ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 3 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 4] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 4 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 4 & 511] | 1]), ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 4 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 5] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 5 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 5 & 511] | 1]), ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 5 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 6] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 6 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 6 & 511] | 1]), ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 6 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 7] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 7 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 7 & 511] | 1]), ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 7 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); sx += 8; gx1st += 8; gx2nd += 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.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd & 511] | 1]), ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 1] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 1 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 1 & 511] | 1]), ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 1 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 2] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 2 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 2 & 511] | 1]), ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 2 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 3] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 3 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 3 & 511] | 1]), ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 3 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 4] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 4 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 4 & 511] | 1]), ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 4 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 5] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 5 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 5 & 511] | 1]), ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 5 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 6] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 6 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 6 & 511] | 1]), ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 6 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); XEiJ.pnlBM[da + 7] = (((p = VideoController.vcnPal16G8[(q = GraphicScreen.graM4[gy1st | gx1st + 7 & 511]) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 7 & 511] | 1]), ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])] : (q & 1) != 0 ? (p = VideoController.vcnPal16G8[GraphicScreen.graM4[gz2nd | gx2nd + 7 & 511] | 1]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q]); sx += 8; gx1st += 8; gx2nd += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //E1ST_XHCGT //================================================================================ //E1ST_XHPT ($0000,$18xx,$1D61) // 概要 // E1ST 512ドット16色1プレーン>スプライト>テキスト // XHPT 1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーと奥のスプライト・テキストのカラーを混ぜる // 手順 // 1番目のパレットが1以下のとき // グラフィックパレット0のカラーが0でないとき // グラフィックパレット0のカラー // さもなくば(グラフィックパレット0のカラーが0のとき) // スプライトパレットの下位4bitが0でないまたはテキストパレットが0のとき // スプライトカラー(0は黒) // さもなくば(スプライトパレットの下位4bitが0かつテキストパレットが0でないとき) // テキストカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // スプライトパレットの下位4bitが0でないまたはテキストパレットが0のとき // スプライトカラー(0は黒) // さもなくば(スプライトパレットの下位4bitが0かつテキストパレットが0でないとき) // テキストカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラーと // スプライトパレットの下位4bitが0でないまたはテキストパレットが0のとき // スプライトカラー(0は黒) // さもなくば(スプライトパレットの下位4bitが0かつテキストパレットが0でないとき) // テキストカラー(0は黒) // を混ぜたカラー(0は黒) // 中間コード1 // (e1p()<=1?(epc(0)!=0?epc(0):(ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()))):ls1(e1p())==0?(epc(e1p())!=0?epc(e1p()):(ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()))):mix(epc(tev(e1p())),(ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp())))) // 中間コード2 // e1p()<=1?epc(0)!=0?epc(0):ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()):ls1(e1p())==0?epc(e1p())!=0?epc(e1p()):ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()):mix(epc(tev(e1p())),ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp())) // 中間コード3 // (v0=e1p())<=1?(v1=epc(0))!=0?v1:ls4(v3=spp())!=0||(v4=txp())==0?spc(v3):tpc(v4):ls1(v0)==0?(v8=epc(v0))!=0?v8:ls4(v10=spp())!=0||(v11=txp())==0?spc(v10):tpc(v11):mix(epc(tev(v0)),ls4(v18=spp())!=0||(v19=txp())==0?spc(v18):tpc(v19)) // 中間コード4 // (p=e1p())<=1?(p=epc(0))!=0?p:ls4(p=spp())!=0||(q=txp())==0?spc(p):tpc(q):ls1(p)==0?(q=epc(p))!=0?q:ls4(p=spp())!=0||(q=txp())==0?spc(p):tpc(q):mix(epc(tev(p)),ls4(p=spp())!=0||(q=txp())==0?spc(p):tpc(q)) // 中間コード5 // (p=e1p())<=1?(p=epc(0))!=0?p:((p=spp())&15)!=0||(q=txp())==0?spc(p):tpc(q):(p&1)==0?(q=epc(p))!=0?q:((p=spp())&15)!=0||(q=txp())==0?spc(p):tpc(q):mix(epc(p&-2),((p=spp())&15)!=0||(q=txp())==0?spc(p):tpc(q)) // 中間コード6 // (p=e1p())<=1?(p=epc(0))!=0?cto(p):((p=spp())&15)!=0||(q=txp())==0?spo(p):tpo(q):(p&1)==0?(q=epc(p))!=0?cto(q):((p=spp())&15)!=0||(q=txp())==0?spo(p):tpo(q):cto(mix(epc(p&-2),((p=spp())&15)!=0||(q=txp())==0?spc(p):tpc(q))) E1ST_XHPT { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int pn = VideoController.vcnReg2Curr & 3; //1番目のパレットのGVRAMページ番号 int gx1st = CRTC.crtR12GrXCurr[pn]; int gy1st = VideoController.vcnVisible1st + ((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; 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[gy1st | gx1st & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])]); XEiJ.pnlBM[da + 1] = ((p = GraphicScreen.graM4[gy1st | gx1st + 1 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])]); XEiJ.pnlBM[da + 2] = ((p = GraphicScreen.graM4[gy1st | gx1st + 2 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])]); XEiJ.pnlBM[da + 3] = ((p = GraphicScreen.graM4[gy1st | gx1st + 3 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])]); XEiJ.pnlBM[da + 4] = ((p = GraphicScreen.graM4[gy1st | gx1st + 4 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])]); XEiJ.pnlBM[da + 5] = ((p = GraphicScreen.graM4[gy1st | gx1st + 5 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])]); XEiJ.pnlBM[da + 6] = ((p = GraphicScreen.graM4[gy1st | gx1st + 6 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])]); XEiJ.pnlBM[da + 7] = ((p = GraphicScreen.graM4[gy1st | gx1st + 7 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])]); sx += 8; gx1st += 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[gy1st | gx1st & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], ((p = SpriteScreen.sprBuffer[sx]) & 15) != 0 || (q = tp >>> 28) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])]); XEiJ.pnlBM[da + 1] = ((p = GraphicScreen.graM4[gy1st | gx1st + 1 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], ((p = SpriteScreen.sprBuffer[sx + 1]) & 15) != 0 || (q = tp >>> 24 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])]); XEiJ.pnlBM[da + 2] = ((p = GraphicScreen.graM4[gy1st | gx1st + 2 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], ((p = SpriteScreen.sprBuffer[sx + 2]) & 15) != 0 || (q = tp >>> 20 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])]); XEiJ.pnlBM[da + 3] = ((p = GraphicScreen.graM4[gy1st | gx1st + 3 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], ((p = SpriteScreen.sprBuffer[sx + 3]) & 15) != 0 || (q = tp >>> 16 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])]); XEiJ.pnlBM[da + 4] = ((p = GraphicScreen.graM4[gy1st | gx1st + 4 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], ((p = SpriteScreen.sprBuffer[sx + 4]) & 15) != 0 || (q = tp >>> 12 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])]); XEiJ.pnlBM[da + 5] = ((p = GraphicScreen.graM4[gy1st | gx1st + 5 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], ((p = SpriteScreen.sprBuffer[sx + 5]) & 15) != 0 || (q = tp >>> 8 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])]); XEiJ.pnlBM[da + 6] = ((p = GraphicScreen.graM4[gy1st | gx1st + 6 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], ((p = SpriteScreen.sprBuffer[sx + 6]) & 15) != 0 || (q = tp >>> 4 & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])]); XEiJ.pnlBM[da + 7] = ((p = GraphicScreen.graM4[gy1st | gx1st + 7 & 511]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[q] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], ((p = SpriteScreen.sprBuffer[sx + 7]) & 15) != 0 || (q = tp & 15) == 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[q])]); sx += 8; gx1st += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //E1ST_XHPT //================================================================================ //E1ST_XHPG ($0000,$18xx,$1E61) // 概要 // E1ST 512ドット16色1プレーン>スプライト>テキスト // XHPG 1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーと2番目のパレットを奇数化したパレットのカラーを混ぜる // 手順 // 1番目のパレットが1以下のとき // グラフィックパレット0のカラーが0でないとき // グラフィックパレット0のカラー // さもなくば(グラフィックパレット0のカラーが0のとき) // スプライトパレットの下位4bitが0でないまたはテキストパレットが0のとき // スプライトカラー(0は黒) // さもなくば(スプライトパレットの下位4bitが0かつテキストパレットが0でないとき) // テキストカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // スプライトパレットの下位4bitが0でないまたはテキストパレットが0のとき // スプライトカラー(0は黒) // さもなくば(スプライトパレットの下位4bitが0かつテキストパレットが0でないとき) // テキストカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラーと2番目のパレットを奇数化したパレットのカラーを混ぜたカラーが0でないとき // 1番目のパレットを偶数化したパレットのカラーと2番目のパレットを奇数化したパレットのカラーを混ぜたカラー // さもなくば(1番目のパレットを偶数化したパレットのカラーと2番目のパレットを奇数化したパレットのカラーを混ぜたカラーが0のとき) // スプライトパレットの下位4bitが0でないまたはテキストパレットが0のとき // スプライトカラー(0は黒) // さもなくば(スプライトパレットの下位4bitが0かつテキストパレットが0でないとき) // テキストカラー(0は黒) // 中間コード1 // (e1p()<=1?(epc(0)!=0?epc(0):(ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()))):ls1(e1p())==0?(epc(e1p())!=0?epc(e1p()):(ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()))):(mix(epc(tev(e1p())),epc(tod(e2q())))!=0?mix(epc(tev(e1p())),epc(tod(e2q()))):(ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp())))) // 中間コード2 // e1p()<=1?epc(0)!=0?epc(0):ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()):ls1(e1p())==0?epc(e1p())!=0?epc(e1p()):ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()):mix(epc(tev(e1p())),epc(tod(e2q())))!=0?mix(epc(tev(e1p())),epc(tod(e2q()))):ls4(spp())!=0||txp()==0?spc(spp()):tpc(txp()) // 中間コード3 // (v0=e1p())<=1?(v1=epc(0))!=0?v1:ls4(v3=spp())!=0||(v4=txp())==0?spc(v3):tpc(v4):ls1(v0)==0?(v8=epc(v0))!=0?v8:ls4(v10=spp())!=0||(v11=txp())==0?spc(v10):tpc(v11):(v14=mix(epc(tev(v0)),epc(tod(e2q()))))!=0?v14:ls4(v21=spp())!=0||(v22=txp())==0?spc(v21):tpc(v22) // 中間コード4 // (p=e1p())<=1?(p=epc(0))!=0?p:ls4(p=spp())!=0||(q=txp())==0?spc(p):tpc(q):ls1(p)==0?(q=epc(p))!=0?q:ls4(p=spp())!=0||(q=txp())==0?spc(p):tpc(q):(q=mix(epc(tev(p)),epc(tod(e2q()))))!=0?q:ls4(p=spp())!=0||(q=txp())==0?spc(p):tpc(q) // 中間コード5 // (p=e1p())<=1?(p=epc(0))!=0?p:((p=spp())&15)!=0||(q=txp())==0?spc(p):tpc(q):(p&1)==0?(q=epc(p))!=0?q:((p=spp())&15)!=0||(q=txp())==0?spc(p):tpc(q):(q=mix(epc(p&-2),epc(e2q()|1)))!=0?q:((p=spp())&15)!=0||(q=txp())==0?spc(p):tpc(q) // 中間コード6 // (p=e1p())<=1?(p=epc(0))!=0?cto(p):((p=spp())&15)!=0||(q=txp())==0?spo(p):tpo(q):(p&1)==0?(q=epc(p))!=0?cto(q):((p=spp())&15)!=0||(q=txp())==0?spo(p):tpo(q):(q=mix(epc(p&-2),epc(e2q()|1)))!=0?cto(q):((p=spp())&15)!=0||(q=txp())==0?spo(p):tpo(q) E1ST_XHPG { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int pn = VideoController.vcnReg2Curr & 3; //1番目のパレットのGVRAMページ番号 int gx1st = CRTC.crtR12GrXCurr[pn]; int gy1st = VideoController.vcnVisible1st + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 2 & 3; //2番目のパレットのGVRAMページ番号 int gx2nd = CRTC.crtR12GrXCurr[pn]; int gz2nd = VideoController.vcnHidden2nd + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); //ONとみなす 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;