+ chr(n, p->nb, p->w, p->h, p->t, p->tnx, p->tny, p->c);
+}
+
+static void
+optinit(void)
+{
+ struct bgctxt *p;
+
+ p = bgctxts + 2;
+ p->hsh = (reg[BGMODE] & (1<<6)) != 0 ? 4 : 3;
+ p->wsh = mode >= 5 ? 4 : p->hsh;
+ p->w = 1<<p->wsh;
+ p->h = 1<<p->hsh;
+ p->tnx = hofs[2] & (p->w - 1);
+ p->tx = hofs[2] >> p->wsh;
+ bgctxts[0].otx = bgctxts[1].otx = 0xffff;
+ bgctxts[0].oty = bgctxts[0].ty;
+ bgctxts[0].otny = bgctxts[0].tny;
+ bgctxts[1].oty = bgctxts[1].ty;
+ bgctxts[1].otny = bgctxts[1].tny;
+}
+
+static void
+opt(void)
+{
+ struct bgctxt *p;
+ u16int hval, vval;
+ int sx, sy;
+
+ p = bgctxts + 2;
+ if(++p->tnx == p->w){
+ if(mode == 4){
+ hval = tile(2, p->tx, vofs[2] >> p->hsh);
+ if((hval & 0x8000) != 0){
+ vval = hval;
+ hval = 0;
+ }else
+ vval = 0;
+ }else{
+ hval = tile(2, p->tx, vofs[2] >> p->hsh);
+ vval = tile(2, p->tx, (vofs[2]+8) >> p->hsh);
+ }
+ sx = (rx & ~7) + (hval & 0x1ff8);
+ sy = ppuy + (vval & 0x1fff);
+ if((vval & 0x2000) != 0){
+ bgctxts[0].oty = sy >> bgctxts[0].hsh;
+ bgctxts[0].otny = sy & (bgctxts[0].h - 1);
+ }else{
+ bgctxts[0].oty = bgctxts[0].ty;
+ bgctxts[0].otny = bgctxts[0].tny;
+ }
+ if((vval & 0x4000) != 0){
+ bgctxts[1].oty = sy >> bgctxts[1].hsh;
+ bgctxts[1].otny = sy & (bgctxts[1].h - 1);
+ }else{
+ bgctxts[1].oty = bgctxts[1].ty;
+ bgctxts[1].otny = bgctxts[1].tny;
+ }
+ if((hval & 0x2000) != 0)
+ bgctxts[0].otx = sx >> bgctxts[0].wsh;
+ else
+ bgctxts[0].otx = 0xffff;
+ if((hval & 0x4000) != 0)
+ bgctxts[1].otx = sx >> bgctxts[1].wsh;
+ else
+ bgctxts[1].otx = 0xffff;
+ p->tnx = 0;
+ p->tx++;
+ }
+}
+
+static void
+bgopt(int n)
+{
+ struct bgctxt *p;
+ u8int v;
+
+ p = bgctxts + n;
+ v = bgpixel(p->c, p->nb, p->t & 0x4000);
+ if(p->msz != 1)
+ if(p->mx++ == 0)
+ p->mv = v;
+ else{
+ if(p->mx == p->msz)
+ p->mx = 0;
+ v = p->mv;
+ }
+ if(v != 0)
+ pixel(n, p->pal + v, p->pri[(p->t & 0x2000) != 0]);
+ if(++p->tnx == p->w){
+ p->tx++;
+ p->tnx = 0;
+ }
+ if((p->tnx & 7) == 0){
+ p->t = tile(n, p->otx == 0xffff ? p->tx : p->otx, p->oty);
+ p->pal = palette(n, p->t >> 10 & 7);
+ chr(n, p->nb, p->w, p->h, p->t, p->tnx, p->otny, p->c);
+ }