diff options
Diffstat (limited to 'content/hardware/imc-2001-chargen40.md')
-rw-r--r-- | content/hardware/imc-2001-chargen40.md | 90 |
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" >}} |