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.

Dependencies:   mbed

Committer:
gertk
Date:
Wed Jun 29 14:25:56 2011 +0000
Revision:
0:806c2f2a7d47
preliminary version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gertk 0:806c2f2a7d47 1 // -------------------------------------------------------------
gertk 0:806c2f2a7d47 2 // BBC Basic hardware emulation part
gertk 0:806c2f2a7d47 3 // -------------------------------------------------------------
gertk 0:806c2f2a7d47 4
gertk 0:806c2f2a7d47 5 #include "bbc_0100.h"
gertk 0:806c2f2a7d47 6
gertk 0:806c2f2a7d47 7 #include "mbed.h"
gertk 0:806c2f2a7d47 8 #define byte unsigned char
gertk 0:806c2f2a7d47 9 #define word unsigned short
gertk 0:806c2f2a7d47 10
gertk 0:806c2f2a7d47 11 // some defaults
gertk 0:806c2f2a7d47 12 #define ESCFLG 0xff80 // escape flag
gertk 0:806c2f2a7d47 13 #define FAULT 0xff82 // fault address
gertk 0:806c2f2a7d47 14 #define DEFERR 0xff84 // default error handler
gertk 0:806c2f2a7d47 15 #define CMDPTR 0xff86 // command line tail
gertk 0:806c2f2a7d47 16 #define SCRATCHPAD 0xff88 // Basic scratchpad area
gertk 0:806c2f2a7d47 17 #define RESERVED 0xff9a
gertk 0:806c2f2a7d47 18 #define OSRDRM 0xffb9 // read byte in paged ROM
gertk 0:806c2f2a7d47 19 #define MAINVDU 0xffbc // main VDU character output entry point
gertk 0:806c2f2a7d47 20 #define OSEVEN 0xffbf // generate an event
gertk 0:806c2f2a7d47 21 #define GSINIT 0xffc2 // general string input initialise routine
gertk 0:806c2f2a7d47 22 #define GSREAD 0xffc5 // read character from string input
gertk 0:806c2f2a7d47 23 #define UKCMD 0xffc9 // unknown command
gertk 0:806c2f2a7d47 24 #define OSFSC 0xffcb // filing system control
gertk 0:806c2f2a7d47 25 #define OSFIND 0xffce // open or close a file
gertk 0:806c2f2a7d47 26 #define OSGBPB 0xffd1 // multiple byte access
gertk 0:806c2f2a7d47 27 #define OSBPUT 0xffd4 // put a byte to a file
gertk 0:806c2f2a7d47 28 #define OSBGET 0xffd7 // get a byte from a file
gertk 0:806c2f2a7d47 29 #define OSARGS 0xffda // read or set file arguments
gertk 0:806c2f2a7d47 30 #define OSFILE 0xffdd // load or save a file
gertk 0:806c2f2a7d47 31 #define OSRDCH 0xffe0 // input a character
gertk 0:806c2f2a7d47 32 #define OSASCI 0xffe3 // print a character with CR converted to LF, CR
gertk 0:806c2f2a7d47 33 #define OSNEWL 0xffe7 // print a LF, CR sequence
gertk 0:806c2f2a7d47 34 #define OSWRCH 0xffee // print a character
gertk 0:806c2f2a7d47 35 #define OSWORD 0xfff1 // do an OSWORD call
gertk 0:806c2f2a7d47 36 #define OSBYTE 0xfff4 // do an OSBYTE call
gertk 0:806c2f2a7d47 37 #define OSCLI 0xfff7 // interpret a command
gertk 0:806c2f2a7d47 38 #define BRKV 0xfffa // FAULT vector
gertk 0:806c2f2a7d47 39
gertk 0:806c2f2a7d47 40 // default CP/M ram pages
gertk 0:806c2f2a7d47 41 #define RAMSIZE (word)0x4000 // 16K ram
gertk 0:806c2f2a7d47 42 #define RAMSTART 0x34ee
gertk 0:806c2f2a7d47 43 #define RAMEND RAMSTART+RAMSIZE
gertk 0:806c2f2a7d47 44 #define PAGE 0x3800
gertk 0:806c2f2a7d47 45
gertk 0:806c2f2a7d47 46 // the emulated ram space
gertk 0:806c2f2a7d47 47 volatile unsigned char ram[RAMSIZE];
gertk 0:806c2f2a7d47 48
gertk 0:806c2f2a7d47 49 // ramtop space with vectors
gertk 0:806c2f2a7d47 50 volatile unsigned char ramtop[0x80];
gertk 0:806c2f2a7d47 51
gertk 0:806c2f2a7d47 52
gertk 0:806c2f2a7d47 53 // read from memory space
gertk 0:806c2f2a7d47 54 unsigned char rdmem(word addr) {
gertk 0:806c2f2a7d47 55 extern volatile unsigned short pc;
gertk 0:806c2f2a7d47 56
gertk 0:806c2f2a7d47 57 // all rom space
gertk 0:806c2f2a7d47 58 if (addr<RAMSTART) {
gertk 0:806c2f2a7d47 59 return rom[addr];
gertk 0:806c2f2a7d47 60 }
gertk 0:806c2f2a7d47 61
gertk 0:806c2f2a7d47 62 // ramtop with vectors
gertk 0:806c2f2a7d47 63 if ((addr >=0xff80) && (addr <=0xffff)) {
gertk 0:806c2f2a7d47 64 return ramtop[addr-0xff80];
gertk 0:806c2f2a7d47 65 }
gertk 0:806c2f2a7d47 66
gertk 0:806c2f2a7d47 67 // relocate $3400
gertk 0:806c2f2a7d47 68 if ((addr >= RAMSTART) && (addr < RAMEND)) {
gertk 0:806c2f2a7d47 69 return ram[addr-0x34ee];
gertk 0:806c2f2a7d47 70 }
gertk 0:806c2f2a7d47 71 return 0xff; // non existant memory reads as 0xff
gertk 0:806c2f2a7d47 72 }
gertk 0:806c2f2a7d47 73
gertk 0:806c2f2a7d47 74 // write to memory space
gertk 0:806c2f2a7d47 75 void wrmem (word addr, byte val) {
gertk 0:806c2f2a7d47 76 extern volatile unsigned short pc;
gertk 0:806c2f2a7d47 77
gertk 0:806c2f2a7d47 78 // memtop vector space
gertk 0:806c2f2a7d47 79 if ((addr >=0xff80) && (addr <=0xffff)) {
gertk 0:806c2f2a7d47 80 ramtop[addr-0xff80]=val;
gertk 0:806c2f2a7d47 81 return;
gertk 0:806c2f2a7d47 82 }
gertk 0:806c2f2a7d47 83 // printf("MEMW %04x %02x\n\r",addr,val);
gertk 0:806c2f2a7d47 84 if ((addr >= RAMSTART) && (addr < RAMEND)) {
gertk 0:806c2f2a7d47 85 ram[addr-RAMSTART] = val;
gertk 0:806c2f2a7d47 86 }
gertk 0:806c2f2a7d47 87 }
gertk 0:806c2f2a7d47 88
gertk 0:806c2f2a7d47 89 // write a byte to IO space
gertk 0:806c2f2a7d47 90 void out(unsigned char addr, unsigned char val) {
gertk 0:806c2f2a7d47 91 printf("IO out called %02d, %02d\n\r",addr,val);
gertk 0:806c2f2a7d47 92 }
gertk 0:806c2f2a7d47 93
gertk 0:806c2f2a7d47 94 // read a byte from IO space
gertk 0:806c2f2a7d47 95 unsigned char in(unsigned char addr) {
gertk 0:806c2f2a7d47 96 printf("IO in called %02d\n\r",addr);
gertk 0:806c2f2a7d47 97 return 0xff;
gertk 0:806c2f2a7d47 98 }
gertk 0:806c2f2a7d47 99