It was thus said that the Great Cini, Richard once stated:
Hi:
I'm not particularly good at C, so I'm trying to learn more as I add
tape image support to Claus Guiloi's Altair Emulator.
Anyway, I have a "C pointers" question regarding copying the tape
bits to the emulator memory. Here's some pseudo code...
//delcared in i8080.c MEMSIZE is virtual memory size in bytes
[ snipped --- NOTE: ``//'' is NOT a valid ANSI C comment delimeter, but
some C compilers will accept it]
I would be inclined to do the following:
#include <stdio.h>
#include <stddef.h>
#define MAXSIZE 65536L
#ifndef FALSE
# define FALSE 0
#endif
#ifndef TRUE
# define TRUE !FALSE
#endif
typedef size_t i8080addr;
int ReadTape (char *filename,void *dest,size_t maxsize);
i8080addr AskLoadAddress (void);
unsigned char Mem [MEMSIZE];
/* code ... */
loadaddr = AskLoadAddress();
if (loadaddr >= MAXSIZE) /* too large of an address */
return(FALSE);
rc = ReadTape(filename,Mem+loadaddr,MAXSIZE - loadaddr);
if (rc == FALSE)
return(rc);
/* rest of code */
Basically, read the file directly into the 8080 virtual memory space.
Saves moving it around afterwards.
But for your original question reguarding:
uchar Mem [MEMSIZE];
PSTR pstrBuffer ; //buffer for fread command
// copy binary image to the emulator memory
for (i = 0; i <= iLength; i++)
Mem[i+addr] = (uchar) *pstrBuffer+i;
This is the important code. The Altair's memory is represented by an array
of type uchar and pstrBuffer is the file buffer used int he fread command.
My question is whether I'm doing the assignment right?
The right hand side looks suspicious so I might make it read:
for (i = 0 ; i < iLength ; i++)
Mem[i + addr] = (uchar) (*(pstrBuffer + i));
Arrays are zero based, so an array that is 10 elements long uses indicies
from 0 to 9, so your original code would write one too
many bytes (and may
or may not crash the program, depending upon the system).
-spc (Have C compiler, will program)