1 /* $NetBSD: ite_subr.c,v 1.13 2025/05/31 18:11:50 tsutsui Exp $ */ 2 3 /* 4 * Copyright (c) 1988 University of Utah. 5 * Copyright (c) 1990, 1993 6 * The Regents of the University of California. All rights reserved. 7 * 8 * This code is derived from software contributed to Berkeley by 9 * the Systems Programming Group of the University of Utah Computer 10 * Science Department. 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that the following conditions 14 * are met: 15 * 1. Redistributions of source code must retain the above copyright 16 * notice, this list of conditions and the following disclaimer. 17 * 2. Redistributions in binary form must reproduce the above copyright 18 * notice, this list of conditions and the following disclaimer in the 19 * documentation and/or other materials provided with the distribution. 20 * 3. Neither the name of the University nor the names of its contributors 21 * may be used to endorse or promote products derived from this software 22 * without specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * 36 * from: Utah $Hdr: ite_subr.c 1.2 92/01/20$ 37 * 38 * @(#)ite_subr.c 8.1 (Berkeley) 6/10/93 39 */ 40 41 #ifdef ITECONSOLE 42 43 #include <sys/param.h> 44 45 #include <hp300/stand/common/itereg.h> 46 47 #include <hp300/stand/common/samachdep.h> 48 #include <hp300/stand/common/itevar.h> 49 50 static void ite_writeglyph(struct ite_data *, uint8_t *, uint8_t *); 51 52 void 53 ite_fontinfo(struct ite_data *ip) 54 { 55 uint32_t fontaddr = getword(ip, getword(ip, FONTROM) + FONTADDR); 56 57 ip->ftheight = getbyte(ip, fontaddr + FONTHEIGHT); 58 ip->ftwidth = getbyte(ip, fontaddr + FONTWIDTH); 59 ip->rows = ip->dheight / ip->ftheight; 60 ip->cols = ip->dwidth / ip->ftwidth; 61 62 if (ip->fbwidth > ip->dwidth) { 63 /* 64 * Stuff goes to right of display. 65 */ 66 ip->fontx = ip->dwidth; 67 ip->fonty = 0; 68 ip->cpl = (ip->fbwidth - ip->dwidth) / ip->ftwidth; 69 ip->cblankx = ip->dwidth; 70 ip->cblanky = ip->fonty + ((128 / ip->cpl) +1) * ip->ftheight; 71 } else { 72 /* 73 * Stuff goes below the display. 74 */ 75 ip->fontx = 0; 76 ip->fonty = ip->dheight; 77 ip->cpl = ip->fbwidth / ip->ftwidth; 78 ip->cblankx = 0; 79 ip->cblanky = ip->fonty + ((128 / ip->cpl) + 1) * ip->ftheight; 80 } 81 } 82 83 void 84 ite_fontinit1bpp(struct ite_data *ip) 85 { 86 uint8_t *fbmem, *dp; 87 int c, l, b; 88 int stride, width; 89 90 dp = (uint8_t *)(getword(ip, getword(ip, FONTROM) + FONTADDR) + 91 (uint8_t *)ip->regbase) + FONTDATA; 92 stride = ip->fbwidth >> 3; 93 width = (ip->ftwidth + 7) / 8; 94 95 for (c = 0; c < 128; c++) { 96 fbmem = (uint8_t *)FBBASE + 97 (ip->fonty + (c / ip->cpl) * ip->ftheight) * stride; 98 fbmem += (ip->fontx >> 3) + (c % ip->cpl) * width; 99 for (l = 0; l < ip->ftheight; l++) { 100 for (b = 0; b < width; b++) { 101 *fbmem++ = *dp; 102 dp += 2; 103 } 104 fbmem -= width; 105 fbmem += stride; 106 } 107 } 108 } 109 110 void 111 ite_fontinit8bpp(struct ite_data *ip) 112 { 113 int bytewidth = (((ip->ftwidth - 1) / 8) + 1); 114 int glyphsize = bytewidth * ip->ftheight; 115 uint8_t fontbuf[500]; 116 uint8_t *dp, *fbmem; 117 int c, i, romp; 118 119 romp = getword(ip, getword(ip, FONTROM) + FONTADDR) + FONTDATA; 120 for (c = 0; c < 128; c++) { 121 fbmem = (uint8_t *)(FBBASE + 122 (ip->fonty + (c / ip->cpl) * ip->ftheight) * ip->fbwidth + 123 (ip->fontx + (c % ip->cpl) * ip->ftwidth)); 124 dp = fontbuf; 125 for (i = 0; i < glyphsize; i++) { 126 *dp++ = getbyte(ip, romp); 127 romp += 2; 128 } 129 ite_writeglyph(ip, fbmem, fontbuf); 130 } 131 } 132 133 static void 134 ite_writeglyph(struct ite_data *ip, uint8_t *fbmem, uint8_t *glyphp) 135 { 136 int bn; 137 int l, b; 138 139 for (l = 0; l < ip->ftheight; l++) { 140 bn = 7; 141 for (b = 0; b < ip->ftwidth; b++) { 142 if ((1 << bn) & *glyphp) 143 *fbmem++ = 1; 144 else 145 *fbmem++ = 0; 146 if (--bn < 0) { 147 bn = 7; 148 glyphp++; 149 } 150 } 151 if (bn < 7) 152 glyphp++; 153 fbmem -= ip->ftwidth; 154 fbmem += ip->fbwidth; 155 } 156 } 157 158 /* 159 * The cursor is just an inverted space. 160 */ 161 #define flip_cursor(ip) \ 162 (*ip->bmv)(ip, ip->cblanky, ip->cblankx, ip->cursory * ip->ftheight, \ 163 ip->cursorx * ip->ftwidth, ip->ftheight, ip->ftwidth, RR_XOR) 164 165 void 166 ite_dio_cursor(struct ite_data *ip, int flag) 167 { 168 169 switch (flag) { 170 case MOVE_CURSOR: 171 flip_cursor(ip); 172 /* FALLTHROUGH */ 173 case DRAW_CURSOR: 174 ip->cursorx = ip->curx; 175 ip->cursory = ip->cury; 176 /* FALLTHROUGH */ 177 case ERASE_CURSOR: 178 default: 179 flip_cursor(ip); 180 break; 181 } 182 } 183 184 void 185 ite_dio_putc1bpp(struct ite_data *ip, int c, int dy, int dx) 186 { 187 188 ite_dio_windowmove1bpp(ip, charY(ip, c), charX1bpp(ip, c), 189 dy * ip->ftheight, dx * ip->ftwidth, 190 ip->ftheight, ip->ftwidth, RR_COPY); 191 } 192 193 void 194 ite_dio_putc8bpp(struct ite_data *ip, int c, int dy, int dx) 195 { 196 197 (*ip->bmv)(ip, charY(ip, c), charX(ip, c), 198 dy * ip->ftheight, dx * ip->ftwidth, 199 ip->ftheight, ip->ftwidth, RR_COPY); 200 } 201 202 void 203 ite_dio_clear(struct ite_data *ip, int sy, int sx, int h, int w) 204 { 205 206 (*ip->bmv)(ip, sy * ip->ftheight, sx * ip->ftwidth, 207 sy * ip->ftheight, sx * ip->ftwidth, 208 h * ip->ftheight, w * ip->ftwidth, RR_CLEAR); 209 } 210 211 void 212 ite_dio_scroll(struct ite_data *ip) 213 { 214 215 (*ip->bmv)(ip, ip->ftheight, 0, 0, 0, (ip->rows - 1) * ip->ftheight, 216 ip->cols * ip->ftwidth, RR_COPY); 217 } 218 219 #include <hp300/stand/common/maskbits.h> 220 221 /* NOTE: 222 * the first element in starttab could be 0xffffffff. making it 0 223 * lets us deal with a full first word in the middle loop, rather 224 * than having to do the multiple reads and masks that we'd 225 * have to do if we thought it was partial. 226 */ 227 static const uint32_t starttab[32] = { 228 0x00000000, 229 0x7FFFFFFF, 230 0x3FFFFFFF, 231 0x1FFFFFFF, 232 0x0FFFFFFF, 233 0x07FFFFFF, 234 0x03FFFFFF, 235 0x01FFFFFF, 236 0x00FFFFFF, 237 0x007FFFFF, 238 0x003FFFFF, 239 0x001FFFFF, 240 0x000FFFFF, 241 0x0007FFFF, 242 0x0003FFFF, 243 0x0001FFFF, 244 0x0000FFFF, 245 0x00007FFF, 246 0x00003FFF, 247 0x00001FFF, 248 0x00000FFF, 249 0x000007FF, 250 0x000003FF, 251 0x000001FF, 252 0x000000FF, 253 0x0000007F, 254 0x0000003F, 255 0x0000001F, 256 0x0000000F, 257 0x00000007, 258 0x00000003, 259 0x00000001 260 }; 261 262 static const uint32_t endtab[32] = { 263 0x00000000, 264 0x80000000, 265 0xC0000000, 266 0xE0000000, 267 0xF0000000, 268 0xF8000000, 269 0xFC000000, 270 0xFE000000, 271 0xFF000000, 272 0xFF800000, 273 0xFFC00000, 274 0xFFE00000, 275 0xFFF00000, 276 0xFFF80000, 277 0xFFFC0000, 278 0xFFFE0000, 279 0xFFFF0000, 280 0xFFFF8000, 281 0xFFFFC000, 282 0xFFFFE000, 283 0xFFFFF000, 284 0xFFFFF800, 285 0xFFFFFC00, 286 0xFFFFFE00, 287 0xFFFFFF00, 288 0xFFFFFF80, 289 0xFFFFFFC0, 290 0xFFFFFFE0, 291 0xFFFFFFF0, 292 0xFFFFFFF8, 293 0xFFFFFFFC, 294 0xFFFFFFFE 295 }; 296 297 void 298 ite_dio_windowmove1bpp(struct ite_data *ip, int sy, int sx, int dy, int dx, 299 int h, int w, int func) 300 { 301 int width; /* add to get to same position in next line */ 302 303 uint32_t *psrcLine, *pdstLine; 304 /* pointers to line with current src and dst */ 305 uint32_t *psrc; /* pointer to current src longword */ 306 uint32_t *pdst; /* pointer to current dst longword */ 307 308 /* following used for looping through a line */ 309 uint32_t startmask, endmask; /* masks for writing ends of dst */ 310 int nlMiddle; /* whole longwords in dst */ 311 int nl; /* temp copy of nlMiddle */ 312 uint32_t tmpSrc; /* place to store full source word */ 313 int xoffSrc; /* offset (>= 0, < 32) from which to 314 fetch whole longwords fetched 315 in src */ 316 int nstart; /* number of ragged bits at start of dst */ 317 int nend; /* number of ragged bits at end of dst */ 318 int srcStartOver; /* pulling nstart bits from src 319 overflows into the next word? */ 320 321 if (h == 0 || w == 0) 322 return; 323 324 width = ip->fbwidth >> 5; 325 psrcLine = ((uint32_t *)ip->fbbase) + (sy * width); 326 pdstLine = ((uint32_t *)ip->fbbase) + (dy * width); 327 328 /* x direction doesn't matter for < 1 longword */ 329 if (w <= 32) { 330 int srcBit, dstBit; /* bit offset of src and dst */ 331 332 pdstLine += (dx >> 5); 333 psrcLine += (sx >> 5); 334 psrc = psrcLine; 335 pdst = pdstLine; 336 337 srcBit = sx & 0x1f; 338 dstBit = dx & 0x1f; 339 340 while (h-- > 0) { 341 getandputrop(psrc, srcBit, dstBit, w, pdst, func); 342 pdst += width; 343 psrc += width; 344 } 345 } else { 346 maskbits(dx, w, startmask, endmask, nlMiddle); 347 if (startmask != 0) 348 nstart = 32 - (dx & 0x1f); 349 else 350 nstart = 0; 351 if (endmask != 0) 352 nend = (dx + w) & 0x1f; 353 else 354 nend = 0; 355 356 xoffSrc = ((sx & 0x1f) + nstart) & 0x1f; 357 srcStartOver = ((sx & 0x1f) + nstart) > 31; 358 359 pdstLine += (dx >> 5); 360 psrcLine += (sx >> 5); 361 362 while (h-- > 0) { 363 psrc = psrcLine; 364 pdst = pdstLine; 365 366 if (startmask != 0) { 367 getandputrop(psrc, (sx & 0x1f), (dx & 0x1f), 368 nstart, pdst, func); 369 pdst++; 370 if (srcStartOver != 0) 371 psrc++; 372 } 373 374 /* special case for aligned operations */ 375 if (xoffSrc == 0) { 376 nl = nlMiddle; 377 while (nl-- > 0) { 378 DoRop(*pdst, func, *psrc++, *pdst); 379 pdst++; 380 } 381 } else { 382 nl = nlMiddle + 1; 383 while (--nl > 0) { 384 getunalignedword(psrc, xoffSrc, tmpSrc); 385 DoRop(*pdst, func, tmpSrc, *pdst); 386 pdst++; 387 psrc++; 388 } 389 } 390 391 if (endmask != 0) { 392 getandputrop0(psrc, xoffSrc, nend, pdst, func); 393 } 394 395 pdstLine += width; 396 psrcLine += width; 397 } 398 } 399 } 400 #endif 401