- Notifications
You must be signed in to change notification settings - Fork3
C library (Z88DK) for VTI graphics board for S100 computers (IMSAI, Altair, Poly88,...). Made for CP/M projects.
License
sblendorio/vti-lib
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
C library (forZ88DK) for VTI graphics board for S100 computers (IMSAI, Altair, Poly88,...). Made for CP/M projects.
VTI is a S100 "graphics" board, made for "Poly88" system, but it works also with other S100 machines like Altair 8800, IMSAI 8080, ...
Here is the board description:http://www.s100computers.com/Hardware%20Folder/PolyMorphic/Video%20Board/Video%20Board.htm
It uses a memory-mapped I/O so writing a single byte to memory would make a character appear on screen. It has a 64x16 chars resolution, and it has a set of "2x3" block characters, so it can reach a 128x48 "pixels" resolution.
Starting address is $F800 by default, but it can be changed using dip-switches. In the IMSAI 8080 in this video it has been changed to $E800 and has some glitches due to a broken RAM chip, which has to be replaced.
Here is sort of "hello world":
#include "vti.h"void main(void) { vti_set_start(0xf800); // optional since 0xf800 is the default vti_clear_screen(); vti_setmode(VTI_MODE_SET); // "1" (or VTI_MODE_SET) means "draw" vti_line(0, 0, 120, 45); // segment with coords (0,0)-(120,45). vti_setmode(VTI_MODE_SET); // "1" (or VTI_MODE_SET) means "draw" vti_boxfill(2, 3, 25, 25); // box filled with edges (2,3) and (25, 25). vti_setmode(VTI_MODE_RESET); // "0" (or VTI_MODE_RESET) means "erase" vti_boxfill(3, 4, 25, 25); // as above, but "0" means "erase" vti_setmode(VTI_MODE_INVERT); // "2" (or VTI_MODE_INVERT) means "XOR" for each pixel vti_boxfill(1, 1, 10, 10); // box filled with edges (1,1)-(10,10). }
Main function of the library isvti_plot
in conjunction withvti_setmode
which have the following prototypes:
void vti_setmode(char mode);void vti_plot(int x, int y);
...wherex andy are cartesian coordinates with (0,0) as top-left origin and max values equal to (127,47).The parametermode represents the way the dot is drawn, and can have the following values:
- 0 = VTI_MODE_RESET. It erases the dot at specified coordinates, making itblack.
- 1 = VTI_MODE_SET. It draws the dot, making itwhite.
- 2 = VTI_MODE_INVERT. It draws the dot if it's currently off (=black), and erases it if it's currently on (=white)
- vti_set_start(<start address>)
- vti_setmode(<mode>)
- vti_print_at(<x>,<y>,"string")
- vti_clear_screen()
- vti_fill_screen(<char>)
- vti_save_screen(<buffer address>)
- vti_restore_screen(<buffer address>)
- vti_rawchar_at(<x>,<y>,<char>)
- vti_plot(<x>,<y>)
- vti_line(<x0>,<y0>,<x1>,<y1>)
- vti_ellipse_rect(<x0>,<y0>,<x1>,<y1>)
- vti_box(<x0>,<y0>,<x1>,<y1>)
- vti_boxfill(<x0>,<y0>,<x1>,<y1>)
- vti_scroll_up(<number-of-rows>)
- vti_scroll_down(<number-of-rows>)
- vti_put_shape(<x>,<y>, char*,<width>,<height>)
- <pixel> = vti_read_pixel(<x>,<y>)
- <ch> = vti_read_char(<x>,<y>)
There is abuild.bat file which does all the work withZ88DK, this is a sample line:
$ zcc +cpm -clib=8080 demo.c vti.c -o demo.com
By default, the start address is$F800. To use another address, pass it as argument in decimal notation:
$ demo 59392
This will make the demo use $E800 (59392) as start address for the graphics card.
There are the following demos (launch each of them eventually with the start address as parameter):
- ttt.com: tic-tac-toe, inspired byWar Games
- demo.com: a bunch of sample of most functions available in the library
- ball.com: abouncing ball across the screen
- pong.com: the famous game, using a keyboard connected to the VTI's special slot
- bezier.com: drawing of the G-clef, using bezier curves
- fonts.com: draw text with big letters
- lenna.com: drawing of the famous test imagehttps://en.wikipedia.org/wiki/Lenna
Thanks to:
- Alois Zingl for implementation of Bresenham's Algorithms (lines and curves drawing)
- Andrea Matteucci for hardware providing and fixing
- Antonino Porcino for a lot of code optimizazions and demoslenna,fonts
- Brian W. Howell for Tic-Tac-Toe's AI logic
- Andy Glenn for "reverse engineering" of some WarGames screenshots
- Paul Smith for list of WOPR nuclear war scenarios
- George Philips for ASCII-art drawing of USA and USSR resembling WarGames' scene