BBC Basic in Z80 emulation on the mbed, USB serial terminal output only. LOAD and SAVE work on the local file system but there is no error signalling.
Diff: module.h
- Revision:
- 0:806c2f2a7d47
diff -r 000000000000 -r 806c2f2a7d47 module.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/module.h Wed Jun 29 14:25:56 2011 +0000 @@ -0,0 +1,99 @@ +// ------------------------------------------------------------- +// BBC Basic hardware emulation part +// ------------------------------------------------------------- + +#include "bbc_0100.h" + +#include "mbed.h" +#define byte unsigned char +#define word unsigned short + +// some defaults +#define ESCFLG 0xff80 // escape flag +#define FAULT 0xff82 // fault address +#define DEFERR 0xff84 // default error handler +#define CMDPTR 0xff86 // command line tail +#define SCRATCHPAD 0xff88 // Basic scratchpad area +#define RESERVED 0xff9a +#define OSRDRM 0xffb9 // read byte in paged ROM +#define MAINVDU 0xffbc // main VDU character output entry point +#define OSEVEN 0xffbf // generate an event +#define GSINIT 0xffc2 // general string input initialise routine +#define GSREAD 0xffc5 // read character from string input +#define UKCMD 0xffc9 // unknown command +#define OSFSC 0xffcb // filing system control +#define OSFIND 0xffce // open or close a file +#define OSGBPB 0xffd1 // multiple byte access +#define OSBPUT 0xffd4 // put a byte to a file +#define OSBGET 0xffd7 // get a byte from a file +#define OSARGS 0xffda // read or set file arguments +#define OSFILE 0xffdd // load or save a file +#define OSRDCH 0xffe0 // input a character +#define OSASCI 0xffe3 // print a character with CR converted to LF, CR +#define OSNEWL 0xffe7 // print a LF, CR sequence +#define OSWRCH 0xffee // print a character +#define OSWORD 0xfff1 // do an OSWORD call +#define OSBYTE 0xfff4 // do an OSBYTE call +#define OSCLI 0xfff7 // interpret a command +#define BRKV 0xfffa // FAULT vector + +// default CP/M ram pages +#define RAMSIZE (word)0x4000 // 16K ram +#define RAMSTART 0x34ee +#define RAMEND RAMSTART+RAMSIZE +#define PAGE 0x3800 + +// the emulated ram space +volatile unsigned char ram[RAMSIZE]; + +// ramtop space with vectors +volatile unsigned char ramtop[0x80]; + + +// read from memory space +unsigned char rdmem(word addr) { + extern volatile unsigned short pc; + + // all rom space + if (addr<RAMSTART) { + return rom[addr]; + } + + // ramtop with vectors + if ((addr >=0xff80) && (addr <=0xffff)) { + return ramtop[addr-0xff80]; + } + + // relocate $3400 + if ((addr >= RAMSTART) && (addr < RAMEND)) { + return ram[addr-0x34ee]; + } + return 0xff; // non existant memory reads as 0xff +} + +// write to memory space +void wrmem (word addr, byte val) { + extern volatile unsigned short pc; + + // memtop vector space + if ((addr >=0xff80) && (addr <=0xffff)) { + ramtop[addr-0xff80]=val; + return; + } + // printf("MEMW %04x %02x\n\r",addr,val); + if ((addr >= RAMSTART) && (addr < RAMEND)) { + ram[addr-RAMSTART] = val; + } +} + +// write a byte to IO space +void out(unsigned char addr, unsigned char val) { + printf("IO out called %02d, %02d\n\r",addr,val); +} + +// read a byte from IO space +unsigned char in(unsigned char addr) { + printf("IO in called %02d\n\r",addr); + return 0xff; +} +