diff options
| author | B. Watson <yalhcru@gmail.com> | 2019-03-13 02:50:42 -0400 | 
|---|---|---|
| committer | B. Watson <yalhcru@gmail.com> | 2019-03-13 02:50:42 -0400 | 
| commit | 2973d0c78e9b8eed3c5af239927c6bd36af64604 (patch) | |
| tree | a0fdfe7201303edd11c6d86015ef4f79796fcf0f /src/notes.64x34 | |
| download | fujichat-2973d0c78e9b8eed3c5af239927c6bd36af64604.tar.gz | |
initial commit
Diffstat (limited to 'src/notes.64x34')
| -rw-r--r-- | src/notes.64x34 | 176 | 
1 files changed, 176 insertions, 0 deletions
| diff --git a/src/notes.64x34 b/src/notes.64x34 new file mode 100644 index 0000000..e886760 --- /dev/null +++ b/src/notes.64x34 @@ -0,0 +1,176 @@ + +64x34 software text mode needs GR.8 style screen, at 320x204. This +requires 8160 bytes for screen memory, plus (I think) 214 bytes +for display list. The initial version will probably use the plain +GR.8+16 display, and only support 32 rows. + +Character cells are 5x6, with glyphs being mostly 4x5 with a blank row +at the bottom and blank column on the left. Probably for lowercase and +capital M/m/W/w, I'll hard-code a bit of logic to copy the right-most +bit into the normally-blank left-most column, so these characters will +be fully-formed, though they'll touch the char to the left. Doing it +this way allows packing one row of pixels from 2 different glyphs into +each byte of glyph-definition table, like COL80 does. + +Depending on the design of the final font, it might also be that I can +avoid storing the bottom row (a few characters might need it to be a +copy of the top row, or I might get away with hard-coding zero). If +I'm not storing the bottom row, each 2 glyphs will take up 5 bytes +of table space (for a 128-character font, that's 320 bytes; for an +ASCII-only 96-char font, only 240 bytes! That fits in one page, so +I can simplify the routine that reads it). If I do store the bottom +row, those numbers become 384 and 288 bytes, respectively. Later on +if there's support for UTF-8 or whatever, it still might be better +to use the 240-byte 96-char fonts, but allow for more than one of +them. + +The renderer needs to be able to handle inverse video. It would also be +nice to support underlining (just force the bottom row of each glyph to +all 1's), but then there needs to be a way for the calling application +to set underline mode. Also it might be hard to read... Theoretically +it'd be possible to do italics too (shift the bottom few rows of pixels +left), but I think it would come out too ugly to want to use. + +Writing a glyph to screen RAM involves a 2-byte buffer for each row of +pixels. Extract 4-bit glyph data from glyph table, synthesize the 5th +bit for MmWw, store in the 2-byte buffer (in top 5 bits), then calculate +how many pixels to shift it, based on the cursor position.  When actually +writing to RAM, have to load the old data from each of the 2 bytes, mask +off the appropriate bits, OR in the new bits, store back to RAM. This is +kind of an expensive operation, but we're only doing it for 6 scanlines +instead of 8 like COL80 uses, so maybe it'll be fast enough. + +If the right mask is $00, we don't have to touch the 2nd byte at all. The +left mask will never be $00. (algorithm below does touch the 2nd byte though) + +leftbyte = int(COLCRS*5/8), easy enough to calculate, but table lookup +will be faster. If we get tight on space, try it without the table. + +shift amounts will be stored in a table. Only 8 entries needed, lookup +on COLCRS%8. + +; first, calculate or lookup the start address of the current +; screen line, *SAVMSC + (*ROWCRS * 5), and store in rowptr +; next, calculate or lookup the start address of the corrent +; glyph, extract the relevant 4 bits (top or bottom nybble) and +; store in glyphdata bits 2-6 (all other bits 0). Store 0 in glyphdata+1. +; This is the body of the inner loop... rowptr needs to get 40 added to +; it every time through the loop. + lda COLCRS + tax + lda left_byte_table,x + clc + adc rowptr + sta zptr + adc rowptr+1 + sta zptr+1 + ; (zptr) now points to left byte + ldy #0 + lda (zptr),y + sta olddata + iny + lda (zptr),y + sta olddata+1 + ; olddata holds the old screen RAM contents + + lda #$07 + sta mask + lda #$FF + sta mask+1 + + txa + and #$07 ; a%=8 + tay + lda shift_amt_table,y + tay ; Y now holds the shift amount + beq no_shift + +shift_loop: + lsr glyphdata + ror glyphdata+1 + sec + ror mask + ror mask+1 + dey + bpl shift_loop + + iny ; Y = 0 +no_shift: + lda olddata + and mask + ora glyphdata + sta (zptr),y + iny + lda olddata+1 + and mask+1 + ora glyphdata+1 + sta (zptr),y + +To calculate screen bytes to alter... COLCRS ranges 0 to 63: + +COLCRS - leftbyte - shift amount - leftmask - rightmask +0        0          0              $F8        $00 +1        0          5              $07        $C0 +2        1          2              $3E        $00 +3        1          7              $01        $F0 +4        2          4              $0F        $80 +5        3          1              $7C        $00 +6        3          6              $03        $E0 +7        4          3              $1F        $00 +8    5 +9    5 +10    6 +11    6 +12    7 +13    8 +14    8 +15    9 +16    10 +17    10 +18    11 +19    11 +20    12 +21    13 +22    13 +23    14 +24    15 +25    15 +26    16 +27    16 +28    17 +29    18 +30    18 +31    19 +32    20 +33    20 +34    21 +35    21 +36    22 +37    23 +38    23 +39    24 +40    25 +41    25 +42    26 +43    26 +44    27 +45    28 +46    28 +47    29 +48    30 +49    30 +50    31 +51    31 +52    32 +53    33 +54    33 +55    34 +56    35 +57    35 +58    36 +59    36 +60    37 +61    38 +62    38 +63    39 + | 
