[cc65] Magic Desk Cartridge Demo problems

From: Joseph Rose <rose.joseph121yahoo.com>
Date: 2012-03-22 18:10:21
I''ve been working on a cartridge library for the C64 and have been creating a demo for the Magic Desk cartridge format.  Most of it seems to work, even the banking strategy.  However, I'm having a problem: certain library functions aren't functioning properly.  cputsxy() displays garbage.  As the text starts in the proper location, it seems to me that either cputchar() or cputs() is at fault.  The _randomize() and rand() functions produce results that are too regular for my purpose.  I copy the LOWCODE, CODE, DATA, RODATA and bank access code to RAM upon startup, so unavailability of these functions shouldn't be a problem.  Some code snippets follow:
--------------------------
void __fastcall__ bankrun (unsigned char codeid);
--------------------------_bankrun:
 ;cmp #-1
 ;bne *+5
 ;jmp _exit
 asl
 asl
 tax
 lda _codetable,x
 sta ptr1
 lda _codetable+1,x
 sta ptr1+1
 lda _codetable+2,x
 sta $DE00
 lda #$00
 sta sp
 lda #$D0
 sta sp+1
 ldx #$00
 txs
 jmp (ptr1)
--------------------------
magiccart.h
--------------------------
//Main routine table.  Define in your code as the locations of your main
//parts, where each entry determines a module in your program.
//Put in RODATA segment.
extern const struct codetable {
 void*  calladdr; //Address of routine in cartridge bank.
 unsigned char bank,   //Bank containing routine.
   x;  //Padding--no meaning.
} codetable [];
//Transfer control to a different module in your code.
void __fastcall__ bankrun (char p); //p is the ID of the module, as in the codetable
     //subscript.
--------------------------
main.c
--------------------------
#define numparts 2
#pragma codeseg  ("CODE2")
#pragma rodataseg ("RODATA2")
static const unsigned char partid[]={1,2};
void main()
{
 unsigned char c;
 bgcolor (1); bordercolor (4); //textcolor (5);
 //clrscr();
 puts ("\f\x93\x12\x89 Screen Demo of MagicDesk cartridge fmt.\x92"
  "   by \x9aJoseph Rose\x99, a.k.a. \x96\x12Harry Potter\x99\n"
  "----------------------------------------\x90"
  "Choose your demo:\n\n"
  "1.  Ink Blot\n"
  "2.  \x1C""C\x81o\x9El\x1Eo\x1Fr\x90 Ink Blot\n"
  );
 while (1) {
  c=cgetc()-'1';
  if (c<numparts) bankrun (partid[c]);
 }
}

#pragma rodataseg ("RODATA")
const struct codetable codetable [] =
{
 {&main,  1},
 {&blot,  2},
 {&colorblot, 2}
};
#pragma rodataseg ("RODATA2")

--------------------------
blot.c
--------------------------
#pragma codeseg  ("CODE3")
#pragma rodataseg ("RODATA3")
...
void blot ()
{
 static unsigned i;
 _randomize ();
 bordercolor (3); bgcolor(1); textcolor (0);
 clrscr ();
 for (i=0; i<20*40; ++i) {revers (rand()&1); cputc(' ');}
 revers(0);
 cputcxy (0,24,"Press any key to continue...");
 while (!kbhit());
 cgetc();
 bankrun (0);
}

--------------------------
I compiled the program with cl65, and the above is the problem.  When I did it the long way, (i.e. cc65/ca65/ld65) the screen flashed then displayed the C64's blue screen without the text.  If it helps, I didn't implement the IRQ stub.
--------------------------
Joseph Rose, a.k.a. Harry Potter
Working magic in the computer community

----------------------------------------------------------------------
To unsubscribe from the list send mail to majordomo@musoftware.de with
the string "unsubscribe cc65" in the body(!) of the mail.
Received on Thu Mar 22 18:10:32 2012

This archive was generated by hypermail 2.1.8 : 2012-03-22 18:10:36 CET