1
0
mirror of https://github.com/cc65/cc65.git synced 2024-05-31 22:41:32 +00:00

small demo of system vectors interception

git-svn-id: svn://svn.cc65.org/cc65/trunk@2338 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
izydorst 2003-08-15 23:07:20 +00:00
parent 4afe11d314
commit 247b3953bd
2 changed files with 79 additions and 0 deletions

View File

@ -0,0 +1,8 @@
; this is resource file for yesno.c, a GEOS application example
HEADER APPLICATION "vectordemo" "VectorDemo" "V1.0" {
dostype USR
author "Maciej Witkowiak"
info "This is C prog compiled with cc65 and GEOSLib."
}

View File

@ -0,0 +1,71 @@
#include <geos.h>
#include <conio.h>
#include <stdlib.h>
unsigned char x,y;
void (*oldMouseVector)();
void (*oldKeyVector)();
void foo1 (void) {
// do something on mouse press/release
gotoxy(x,y);
++x;
cputc('A');
// call previous routine
oldMouseVector();
}
void foo2 (void) {
// do something on key press/release
gotoxy(x,y);
++y;
cputc('B');
// call previous routine
oldKeyVector();
}
void hook_into_system(void) {
// hook into system vectors - preserve old value
oldMouseVector = (void (*)())mouseVector;
mouseVector = (int)foo1;
oldKeyVector = (void (*)())keyVector;
keyVector = (int)foo2;
}
void remove_hooks(void) {
mouseVector = (int)oldMouseVector;
keyVector = (int)oldKeyVector;
}
int main(void) {
x = 0;
y = 0;
/*
To make cc65 do something for you before exiting you might register
a function to be called using atexit call. #include <stdlib.h> then and
write:
*/
atexit(&remove_hooks);
clrscr();
cputsxy(0,1, CBOLDON "Just" COUTLINEON "a " CITALICON "string." CPLAINTEXT );
hook_into_system();
/* This program will loop forever though */
MainLoop();
/*
If not using atexit() you have to remember about restoring system vectors
right before exiting your application. Otherwise the system will most
likely crash.
remove_hooks();
*/
return 0;
}