+++ 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 #include #include 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" >}}