diff --git a/README.md b/README.md index 42c6b9a..56cc7c4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ #Apple ]\[ HGR Font Tutorial -Revision: 5, Jan 10, 2016. +Revision: 6, Jan 10, 2016. # Table of Contents @@ -124,27 +124,116 @@ There are couple of things we need to discuss first. The preceeding example show First, we should notice that video memory is non-linear. :-( You'll want to get familiar with the HGR address for the various Y scanlines: +"Understanding the Apple ||{, page 5-14 has this table: * https://archive.org/stream/understanding_the_apple_ii#page/n105/mode/2up +With all the decimal cruft removed: -|Y |Address| -|--:|------:| -| 0| $2000 | -| 1| $2400 | -| 2| $2800 | -| 3| $2C00 | -| 4| $3000 | -| 5| $3400 | -| 6| $3800 | -| 7| $3C00 | -| 8| $2080 | -| :| : | -| 64| $2028 | -|128| $2050 | -|191| $3FD0 | +`HGR Memory-mapped IO`: + +| Y |Address| Y |Address| Y |Address| Screen Hole | +|----:|:-----:|----:|-------|----:|:-----:|:------------:| +| 0 | $2000 | 64 | $2028 | 128 | $2050 | $2078..$207F | +| 1 | $2400 | 65 | $2428 | 129 | $2450 | $2478..$247F | +| 2 | $2800 | 66 | $2828 | 130 | $2850 | $2878..$287F | +| 3 | $2C00 | 67 | $2C28 | 131 | $2C50 | $2C78..$2C7F | +| 4 | $3000 | 68 | $3028 | 132 | $3050 | $3078..$307F | +| 5 | $3400 | 69 | $3428 | 133 | $3450 | $3478..$347F | +| 6 | $3800 | 70 | $3828 | 134 | $3850 | $3878..$387F | +| 7 | $3C00 | 71 | $3C28 | 135 | $3C50 | $3C78..$3C7F | +| 8 | $2080 | 72 | $20A8 | 136 | $20D0 | $20F8..$20FF | +| 9 | $2480 | 73 | $24A8 | 137 | $24D0 | $24F8..$24FF | +| 10 | $2880 | 74 | $28A8 | 138 | $28D0 | $28F8..$28FF | +| 11 | $2C80 | 75 | $2CA8 | 139 | $2CD0 | $2CF8..$2CFF | +| 12 | $3080 | 76 | $30A8 | 140 | $30D0 | $30F8..$30FF | +| 13 | $3480 | 77 | $34A8 | 141 | $34D0 | $34F8..$34FF | +| 14 | $3880 | 78 | $38A8 | 142 | $38D0 | $38F8..$38FF | +| 15 | $3C80 | 79 | $3CA8 | 143 | $3CD0 | $3CF8..$3CFF | +| 16 | $2100 | 80 | $2128 | 144 | $2150 | $2178..$217F | +| 17 | $2500 | 81 | $2528 | 145 | $2550 | $2578..$257F | +| 18 | $2900 | 82 | $2928 | 146 | $2950 | $2978..$297F | +| 19 | $2D00 | 83 | $2D28 | 147 | $2D50 | $2D78..$2D7F | +| 20 | $3100 | 84 | $3128 | 148 | $3150 | $3178..$317F | +| 21 | $3500 | 85 | $3528 | 149 | $3550 | $3578..$357F | +| 22 | $3900 | 86 | $3928 | 150 | $3950 | $3978..$397F | +| 23 | $3D00 | 87 | $3D28 | 151 | $3D50 | $3D78..$3D7F | +| 24 | $2180 | 88 | $21A8 | 152 | $21D0 | $21F8..$21FF | +| 25 | $2580 | 89 | $25A8 | 153 | $25D0 | $25F8..$25FF | +| 26 | $2980 | 90 | $29A8 | 154 | $29D0 | $29F8..$29FF | +| 27 | $2D80 | 91 | $2DA8 | 155 | $2DD0 | $2DF8..$2DFF | +| 28 | $3180 | 92 | $31A8 | 156 | $31D0 | $31F8..$31FF | +| 29 | $3580 | 93 | $35A8 | 157 | $35D0 | $35F8..$35FF | +| 30 | $3980 | 94 | $39A8 | 158 | $39D0 | $39F8..$39FF | +| 31 | $3D80 | 95 | $3DA8 | 159 | $3DD0 | $3DF8..$3DFF | +| 32 | $2200 | 96 | $2228 | 160 | $2250 | $2278..$227F | +| 33 | $2600 | 97 | $2628 | 161 | $2650 | $2678..$267F | +| 34 | $2A00 | 98 | $2A28 | 162 | $2A50 | $2A78..$2A7F | +| 35 | $2E00 | 99 | $2E28 | 163 | $2E50 | $2E78..$2E7F | +| 36 | $3200 | 100 | $3228 | 164 | $3250 | $3278..$327F | +| 37 | $3600 | 101 | $3628 | 165 | $3650 | $3678..$367F | +| 38 | $3A00 | 102 | $3A28 | 166 | $3A50 | $3A78..$3A7F | +| 39 | $3E00 | 103 | $3E28 | 167 | $3E50 | $3E78..$3E7F | +| 40 | $2280 | 104 | $22A8 | 168 | $22D0 | $22F8..$22FF | +| 41 | $2680 | 105 | $26A8 | 169 | $26D0 | $26F8..$26FF | +| 42 | $2A80 | 106 | $2AA8 | 170 | $2AD0 | $2AF8..$2AFF | +| 43 | $2E80 | 107 | $2EA8 | 171 | $2ED0 | $2EF8..$2EFF | +| 44 | $3280 | 108 | $32A8 | 172 | $32D0 | $32F8..$32FF | +| 45 | $3680 | 109 | $36A8 | 173 | $36D0 | $36F8..$36FF | +| 46 | $3A80 | 110 | $3AA8 | 174 | $3AD0 | $3AF8..$3AFF | +| 47 | $3E80 | 111 | $3EA8 | 175 | $3ED0 | $3EF8..$3EFF | +| 48 | $2300 | 112 | $2328 | 176 | $2350 | $2378..$237F | +| 49 | $2700 | 113 | $2728 | 177 | $2750 | $2778..$277F | +| 50 | $2B00 | 114 | $2B28 | 178 | $2B50 | $2B78..$2B7F | +| 51 | $2F00 | 115 | $2F28 | 179 | $2F50 | $2F78..$2F7F | +| 52 | $3300 | 116 | $3328 | 180 | $3350 | $3378..$337F | +| 53 | $3700 | 117 | $3728 | 181 | $3750 | $3778..$377F | +| 54 | $3B00 | 118 | $3B28 | 182 | $3B50 | $3B78..$3B7F | +| 55 | $3F00 | 119 | $3F28 | 183 | $3F50 | $3F78..$3F7F | +| 56 | $2380 | 120 | $23A8 | 184 | $23D0 | $23F8..$23FF | +| 57 | $2780 | 121 | $27A8 | 185 | $27D0 | $27F8..$27FF | +| 58 | $2B80 | 122 | $2BA8 | 186 | $2BD0 | $2BF8..$2BFF | +| 59 | $2F80 | 123 | $2FA8 | 187 | $2FD0 | $2FF8..$2FFF | +| 60 | $3380 | 124 | $33A8 | 188 | $33D0 | $33F8..$33FF | +| 61 | $3780 | 125 | $37A8 | 189 | $37D0 | $37F8..$37FF | +| 62 | $3B80 | 126 | $3BA8 | 190 | $3BD0 | $3BF8..$3BFF | +| 63 | $3F80 | 127 | $3FA8 | 191 | $3FD0 | $3FF8..$3FFF | Don't worry if the address pattern makes no sense right now -- we'll reveal that later. +Here's the [Javascript source code](list_hgr_table.html) to generate this table: + +```Javascript + +```Javascript + function int2pad( n, pad ) + { + return (Array( pad+1 ).join(' ') + n).slice(-pad); + } + + function word2hex$( w ) + { + return "$" + (" " + w.toString(16).toUpperCase()).slice(-4); + } + + var hgr = []; + for( var y = 0; y < 193; ++y ) // Intentional 1 scanline too many! + hgr[ y ] = 0x2000 + ((y/64)|0)*0x28 + ((y%8)|0)*0x400 + ((y/8)&7)*0x80; + + var text = "", s = " | "; + for( y = 0; y < 64; ++y ) + { + var a0 = hgr[ y + 0 ]; + var a1 = hgr[ y + 64 ]; + var a2 = hgr[ y + 128 ]; + text += "| " + + int2pad( y + 0, 3 ) + s + word2hex$( a0 ) + s + + int2pad( y + 64, 3 ) + s + word2hex$( a1 ) + s + + int2pad( y + 128, 3 ) + s + word2hex$( a2 ) + s + + word2hex$( a2 + 40 ) + ".." + + word2hex$( a2 + 47 ) + " |\n"; + } + console.log( text ); +``` ### No FONT data in ROM