The software needed:
<itemize>
<item><em/cc65/ Excellent package containing a C crosscompiler, a crossassembler and a linker, you
- can get it from: <url url="https://cc65.github.io/">.
+ can get it from: <url url="https://cc65.github.io/">.
<item><em/VICE/ This is a portable C64, C128 and few other Commodore computers emulator, you
- can obtain it from: <url url="http://vice-emu.sourceforge.net/">.
- The VICE package contains the <em/c1541/ program that is able
- to convert/unconvert GEOS files to disk images.
+ can obtain it from: <url url="http://vice-emu.sourceforge.net/">.
+ The VICE package contains the <em/c1541/ program that is able
+ to convert/unconvert GEOS files to disk images.
<item><em/The Star Commander/ This tool is only for DOS. You will need it for transferring
- object files from a PC to a 1541. There's also one important ability of this
- tool - it automatically un-converts .cvt files into GEOS native format on
- disk image files. Check out: <url url="http://sta.c64.org/sc.html">.
+ object files from a PC to a 1541. There's also one important ability of this
+ tool - it automatically un-converts .cvt files into GEOS native format on
+ disk image files. Check out: <url url="http://sta.c64.org/sc.html">.
<item><em/opencbm/ A package that allows for communication directly with a 1541 and
- other Commodore IEC bus drives. It can be a replacement for Star Commander if
- you only want to transfer files to a disk and unconvert using GEOS program for
- this purpose. Check out: <url url="https://spiro.trikaliotis.net/opencbm">.
+ other Commodore IEC bus drives. It can be a replacement for Star Commander if
+ you only want to transfer files to a disk and unconvert using GEOS program for
+ this purpose. Check out: <url url="https://spiro.trikaliotis.net/opencbm">.
</itemize>
<p>
VICE and cc65 are portable - they run on variety of platforms - DOS, Win32 and UNIX. GEOSLib only
<sect3>BitOtherClip
<p>
<tt/void BitOtherClip (void *proc1, void *proc2, char skipLeft, char skip Right, unsigned skipTop,
- struct iconpic *myPic)/
+ struct iconpic *myPic)/
<p>
Similar to the previous one with some extension. <tt/proc1/ is called before reading a byte (it
returns in .A the next value), and <tt/proc2/ is called every time the parser reads a byte which is
<itemize>
<item><tt/char number/ - total number of icons declared here
<item><tt/struct pixel mousepos/ - after finishing <tt/DoIcons/ the mouse pointer will be placed in
- this point allowing you to have a hint for the user what the default action is
+ this point allowing you to have a hint for the user what the default action is
<item><tt/struct icondef tab[&rsqb/ - this table of size equal to <tt/icontab.number/ contains
- descriptions for all icons
+ descriptions for all icons
</itemize>
<sect1>File and Disk
Which will be compiled to following string of bytes:
<tscreen><verb>
_example:
- .byte 3
- .word 3
- .byte 0
+ .byte 3
+ .word 3
+ .byte 0
</verb></tscreen>
As you see this way it is possible to define data of any type in any order. You must remember to
cast each member to proper type.
Here is how a single descriptor looks like:
<tscreen><verb>
void myMenu = {
- (char)top, (char)bottom, // this is the size of the menubox
- (unsigned)left, (unsigned)right, // counting all items in the current descriptor
- (char)number_of_items | type_of_menu, // number of following items ORed with
- // type of this menu, it can be either
- // HORIZONTAL or VERTICAL if you will have also bit 6 set then menu won't be closed
- // after moving mouse pointer outside the menubox. You can have at most 31 items.
+ (char)top, (char)bottom, // this is the size of the menubox
+ (unsigned)left, (unsigned)right, // counting all items in the current descriptor
+ (char)number_of_items | type_of_menu, // number of following items ORed with
+ // type of this menu, it can be either
+ // HORIZONTAL or VERTICAL if you will have also bit 6 set then menu won't be closed
+ // after moving mouse pointer outside the menubox. You can have at most 31 items.
</verb></tscreen>
This is followed by <tt/number_of_items/ of following item description.
<tscreen><verb>
- ...
- "menuitemname", (char)item_type, (unsigned)pointer,
- "nextitemname", (char)item_type, (unsigned)pointer,
- ...
- "lastitemname", (char)item_type, (unsigned)pointer };
- // Note that there isn't ending <tt/NULL/ or something like that.
+ ...
+ "menuitemname", (char)item_type, (unsigned)pointer,
+ "nextitemname", (char)item_type, (unsigned)pointer,
+ ...
+ "lastitemname", (char)item_type, (unsigned)pointer };
+ // Note that there isn't ending <tt/NULL/ or something like that.
</verb></tscreen>
<tt/pointer/ is a pointer to something, what it points for depends from <tt/item_type/. This one
can have following values:
your own. The first case results in
<tscreen><verb>
const dlgBoxStr example = {
- DB_DEFPOS (pattern_of_shadow),
- ... // commands
- DB_END };
+ DB_DEFPOS (pattern_of_shadow),
+ ... // commands
+ DB_END };
</verb></tscreen>
And the own size and position would be:
<tscreen><verb>
const dlgBoxStr example = {
- DB_SETPOS (pattern, top, bottom, left, right)
- ... // commands
- DB_END };
+ DB_SETPOS (pattern, top, bottom, left, right)
+ ... // commands
+ DB_END };
</verb></tscreen>
<sect3>Commands
default icons and the number of the selected icon will be returned from window processor. The icons are
<tt/OK, CANCEL, YES, NO, OPEN/, and <tt/DISK/. You can use predefined macros for using them, e.g.:
<tscreen><verb>
- ...
- DB_ICON(OK, DBI_X_0, DBI_Y_0),
- ...
+ ...
+ DB_ICON(OK, DBI_X_0, DBI_Y_0),
+ ...
</verb></tscreen>
Note that the position is counted from top left corner of window, not entire screen and that the 'x'
position is counted in cards (8-pixel) and not in pixels. This is also true for all following commands.
is variable. Consider following:
<tscreen><verb>
char text = "foo";
- ...
- r15=(unsigned)text; // in code just before call to DoDlgBox
- ...
- DB_VARSTR (TXT_LN_X, TXT_LN_1_Y, &r15),
- ...
+ ...
+ r15=(unsigned)text; // in code just before call to DoDlgBox
+ ...
+ DB_VARSTR (TXT_LN_X, TXT_LN_1_Y, &r15),
+ ...
</verb></tscreen>
will cause the word ''foo'' to appear in the window, but you may store the pointer to any text in
<tt/r15/ (in this case) before the call to DoDlgBox.
Here is an example for clearing the screen:
<tscreen><verb>
const graphicStr example = {
- MOVEPENTO(0,0),
- NEWPATTERN(0),
- RECTANGLETO(319,199)
- GSTR_END };
+ MOVEPENTO(0,0),
+ NEWPATTERN(0),
+ RECTANGLETO(319,199)
+ GSTR_END };
</verb></tscreen>
<sect2>InitRam table
void_func oldVector;
void NewVectorHandler(void) {
- // do something and at the end call the old vector routine
- oldVector();
+ // do something and at the end call the old vector routine
+ oldVector();
}
void hook_into_system(void) {
- oldVector = mouseVector;
- mouseVector = NewVectorHandler;
+ oldVector = mouseVector;
+ mouseVector = NewVectorHandler;
}
void remove_hook(void) {
- mouseVector = oldVector;
+ mouseVector = oldVector;
}
</verb></tscreen>
<p>
called every time the mouse button changes status. Other important vectors you should know about
are:
<itemize>
- <item><tt/appMain/ - this is called from within the <tt/MainLoop/ system loop
- <item><tt/keyVector/ - called whenever a keypress occurs
- <item><tt/intTopVector/ - called at the start of the IRQ routine
- <item><tt/intBotVector/ - called at the end of the IRQ routine
+ <item><tt/appMain/ - this is called from within the <tt/MainLoop/ system loop
+ <item><tt/keyVector/ - called whenever a keypress occurs
+ <item><tt/intTopVector/ - called at the start of the IRQ routine
+ <item><tt/intBotVector/ - called at the end of the IRQ routine
</itemize>
</article>