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.
module.h@0:806c2f2a7d47, 2011-06-29 (annotated)
- Committer:
- gertk
- Date:
- Wed Jun 29 14:25:56 2011 +0000
- Revision:
- 0:806c2f2a7d47
preliminary version
Who changed what in which revision?
User | Revision | Line number | New 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 |