summaryrefslogtreecommitdiff
path: root/content/hardware/imc-2001-chargen40.md
diff options
context:
space:
mode:
Diffstat (limited to 'content/hardware/imc-2001-chargen40.md')
-rw-r--r--content/hardware/imc-2001-chargen40.md90
1 files changed, 90 insertions, 0 deletions
diff --git a/content/hardware/imc-2001-chargen40.md b/content/hardware/imc-2001-chargen40.md
new file mode 100644
index 0000000..84bf54a
--- /dev/null
+++ b/content/hardware/imc-2001-chargen40.md
@@ -0,0 +1,90 @@
++++
+title = "IMC-2001 40 character mode"
++++
+
+{{< figure src="/images/hardware/imc-2001/chargen.png" alt="character in the 40-char ROM" >}}
+
+*A4-A6* on the schematics is the character ROM in a chip labelled
+UMC UM2316-J127 8432, it is Intel 2716 EPROM compatible chip it seems.
+
+It can be read with the TL866 and returns the following 2K dump:
+
+[chargen.rom](/hardware/imc-2001/chargen.rom): Chargen 40-column ROM
+
+The official ROM
+[3410036.BIN](http://www.applelogic.org/APPLEASICs.html) on
+http://www.applelogic.org/APPLEASICs.html doesn't match
+at all. The arangement of the characters is different and there are
+lowercase characters in the clone ROM.
+
+I wrote a small program to show the contents of chargen.rom:
+
+```
+#!/usr/bin/tcc -run -Werror -DSDL_DISABLE_IMMINTRIN_H -I/usr/include/SDL2 -lSDL2
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <SDL.h>
+
+int main( int argc, char *argv[] )
+{
+ FILE *f = fopen( "./chargen.rom", "r" );
+ char *buf = malloc( 2 * 1024 );
+ fread( buf, 2 * 1024, 1, f );
+
+ SDL_Renderer *renderer;
+ SDL_Window *window;
+
+ SDL_Init( SDL_INIT_VIDEO );
+ SDL_CreateWindowAndRenderer( 300, 200, 0, &window, &renderer );
+ SDL_SetRenderDrawColor( renderer, 0, 0, 0, 0 );
+ SDL_RenderClear( renderer );
+ SDL_SetRenderDrawColor(renderer, 0xFF, 0xB0, 0, 255 );
+
+ int x = 0;
+ int y = 0;
+ for( int c = 0; c < 2 * 1024; c++ ) {
+ int v = buf[c] & 0x00ff;
+ for( int b = 0; b < 8; b++ ) {
+ if( v & 0x01 ) {
+ SDL_RenderDrawPoint( renderer, x, y );
+ }
+ v >>= 1;
+ x++;
+ }
+ x -= 8;
+ y += 1;
+ if( ( (c+1) % 128 ) == 0 ) {
+ x += 10;
+ y = 0;
+ }
+ }
+
+ SDL_RenderPresent( renderer );
+
+ int done = 0;
+ while( !done ) {
+ SDL_Event event;
+ SDL_PollEvent( &event );
+ switch( event.type ) {
+ case SDL_QUIT:
+ case SDL_KEYDOWN:
+ done = 1;
+ break;
+ }
+ }
+
+
+ SDL_DestroyRenderer( renderer );
+ SDL_DestroyWindow( window );
+ SDL_Quit( );
+
+ free( buf );
+ fclose( f );
+ return 0;
+}
+```
+
+And indeed I get:
+
+{{< figure src="/images/hardware/imc-2001/chargen.png" alt="character in the 40-char ROM" >}}