The NASCOM 2 site is: http://www.nascomhomepage.com/#TheNascomRepository
I have built the UNIX emulator on Ubuntu using GCC having installed enough add on packages.
Tommy Thorn has continued working on his NASCOM 2 emulator and now has a JavaScript Version. http://thorn.ws/jsnascom/jsnascom.html
( https://github.com/tommythorn/jsnascom )
He wrote the LINUX version I used below. It is being updated to load intel hex files from SDCC.
I used FIREFOX to download the emulator to my desktop, and it runs.
I added some code to the JavaScript. I added a PORT 0xA with 4 LEDs which you could set using the emulator.
( http://www.dougrice.plus.com/nascom2/JavaScript%20Nascom%202%20Emulator_files/ns_use_chrome.htm )
It needs some work to load SDCC output and the output from the assembler at http://wwwhomes.uni-bielefeld.de/achim/z80-asm.html
usage: sdcc -V -mz80 --code-loc0x1000 --no-std-crt0 test_a.c
The JavaScript NASCOM 2 simulator version works in Chrome / Firefox browser. ( 22/11/2014 )
http://thorn.ws/jsnascom/jsnascom.html load test_a.ihx
The reload button allows new code to be reloaded.
see: http://www.dougrice.plus.com/nascom2/ for files.
It is possible to patch the JavaScript to add ports and LED [NASCOM JAVASCRIPT]?
To try writing in assembler the SDCC compiler can be used. Write a C program and use the -V to get the commands. Use the .asm file as a starter.
==
http://www.dougrice.plus.com/nascom2/ has some files.
I modified xvirtualnascom.c to load other Hex file formats and the output from SDCC the small device compiler. Hello World on a Nascom emulator!
I found and used this one
http://wwwhomes.uni-bielefeld.de/achim/z80-asm.html
I patched xvirtualnascom.c to load the hex files.
/*
* ==================================================================
* Try and add ability to read .z80 files.
*/
/* reads header of a file and tests if it's Z80 ASM file, reads address */
/* return value: 0=OK, 1=this is not a z80 asm file */
int read_header(FILE *stream,unsigned short *address, int *len)
{
unsigned char tmp[9];
unsigned char c[2];
unsigned a,b;
int ret=0;
b=strlen(_Z80HEADER);
tmp[b]=0;
a=0;
if ((fread(tmp,1,b,stream))!=b) ret=1;
else if (strcmp(tmp,_Z80HEADER)) ret=1;
else if (fread(c,1,2,stream)!=2) ret=1;
else
{ *address=(c[1]<<8)|c[0]; a=b+2; }
fseek(stream,0,SEEK_END);
b=ftell(stream);
fseek(stream,a,SEEK_SET);
*len=b-a;
return ret;
}
unsigned dma_write(unsigned short offset, unsigned count, FILE *from)
{
/* return fread(memory+offset,1,count+offset<65536U?count:65536U-offset,from); */
return fread(ram+offset,1,count+offset<65536U?count:65536U-offset,from);
}
unsigned dma_read(unsigned short offset, unsigned count, FILE *to)
{
/* return fwrite(memory+offset,1,count+offset<65536U?count:65536U-offset,to); */
return fwrite(ram+offset,1,count+offset<65536U?count:65536U-offset,to);
}
int load_nascom_new(char *file) {
unsigned short start;
int x ; /* length */
printf("load_nascom_new(char *file)");
FILE *stream = fopen( file,"rb");
if (!stream) {
stream=0;
/* error_msg(file,"Can't read file"); */
printf("error load_nascom_new(char *file)");
return 0;
}
if (read_header(stream,&start,&x)) {
fclose(stream);
printf("error read hearer load_nascom_new(char *file)");
return 0; /* error */
} else {
dma_write(start,x,stream);
fclose(stream);
stream=0;
}
return 1 ;
}
void load_nascom(char *file)
{
FILE *f ;
if ( ! load_nascom_new( file) ) {
f = fopen(file, "r");
int a, b1, b2, b3, b4, b5, b6, b7, b8;
int count = 0;
int ch;
if (!f) {
perror(file);
exit(1);
}
if (vflag) printf("Loading %s", file);
for (;!feof(f);) {
if (fscanf(f, "%x %x %x %x %x %x %x %x %x",
&a, &b1, &b2, &b3, &b4, &b5, &b6, &b7, &b8)
== 9) {
RAM(a) = b1;
RAM(a+1) = b2;
RAM(a+2) = b3;
RAM(a+3) = b4;
RAM(a+4) = b5;
RAM(a+5) = b6;
RAM(a+6) = b7;
RAM(a+7) = b8;
count += 8;
}
do
ch = fgetc(f);
while (ch != -1 && ch != '\n');
if (ch == -1)
break;
}
fclose(f);
if (vflag) printf(". Successfully loaded %d bytes\n", count);
}
}
SDCC is the Small device compiler.
see: http://sdcc.sourceforge.net/
I used SDCC to build some C code to run on the Nascom.
I need to patch the putchar() function to use the NAS-SYS routines so that printf works.
/*
*
* usage: sdcc -mz80 --code-loc0x1000 --no-std-crt0 test.c
* gcc -Wall -c "%f"
*
*/
#include <stdio.h>
/* code seems to start here, when I run E1000 */
main(){
printf("Hello World!");
return 1 ;
}
void putchar( char x ){
/* call nascom software interupt */
__asm
;x = x +1; use first parameter
;ADD A , #10;
RST 0x30;
__endasm;
}
I needed to modify the xvirtualnascom.c to load .ihx files.
/*
* :0E 1000 00 210C10E5CD5F10F1210100C96865 DB
:0E 100E 00 6C6C6F20646F75670A00DDE5DD21 F4
:07 101C 00 0000DD39DDE1C9 30
:0E102300DDE5DD210000DD39DD7E04F533CD95
:0E103100181033DDE1C9DDE5DD210000DD39F9
:0E103F00DD6E06DD6607E5DD6E04DD6605E5A7
:0E104D00210000E5212310E5CDE611F1F1F1BF
*
*/
int load_nascom_ihx(char *file) {
unsigned short start;
int x ; /* length */
uint hex_read, hex_len, hex_addr, hex_cmd ;
uint hex_count, hex_data, hex_check ;
FILE *stream = fopen( file,"rb");
printf("load_nascom_ihx(char *file)");
if (!stream) {
stream=0;
/* error_msg(file,"Can't read file"); */
printf("error load_nascom_ihx(char *file)");
return 0;
}
while ( !feof( stream ) ) {
/*:0E 100E 00 6C6C6F20646F75670A00DDE5DD21 F4 */
hex_read = fscanf(stream,":%2x%4x%2x",&hex_len,&hex_addr,&hex_cmd);
if (hex_read ){
printf( "\n%x %2d, %2d, %x : ", hex_read, hex_len, hex_addr, hex_cmd );
for( hex_count= 0 ; hex_count < hex_len ; hex_count++ ){
hex_read = fscanf(stream, "%2x",&hex_data );
printf(" %02X", hex_data );
RAM( hex_addr ) = hex_data ;
hex_addr ++;
}
hex_read = fscanf(stream, "%2x\n",&hex_check);
}
}
fclose(stream);
stream=0;
printf(" exit from load_nascom_ihx()\n");
/* hex_read = getchar() ; */
return 1 ;
}
extern char *optarg;
extern int optind, opterr, optopt;
int getopt(int argc, char * const *argv, const char *optstring);
int main(int argc, char **argv)
{
int c;
progname = argv[0];
xsetup(1, argv);
#ifdef MMU
for (c=0; c<MEMSIZE/4; ++c) pagetable[c]=ram+(c<<12);
#endif
while ((c = getopt(argc, argv, "m:v")) != EOF)
switch (c) {
case 'm':
monitor = optarg;
break;
case 'v':
vflag = 1;
break;
case '?':
usage();
}
if (vflag)
puts("VirtualNascom, a Nascom 2 emulator version " VERSION "\n"
"Copyright 2000 Tommy Thorn. Based on\n"
"Yet Another Z80 Emulator version " YAZEVERSION
", Copyright 1995,1998 Frank D. Cringle.\n"
"NasEmu comes with ABSOLUTELY NO WARRANTY; for details\n"
"see the file \"COPYING\" in the distribution directory.\n");
/* load my file first ast it starts from 0 */
/* load_nascom("../z80-asm-2.4-pre3/programs/doug.z80"); /* */
/* load c program built using SDCC */
load_nascom_ihx( "../sdcc/test.ihx" ); /* */
load_nascom(monitor);
/* load_nascom("basic.nal"); */
/* load_nascom("doug.z80"); /* */
for ( ; optind < argc; optind++)
load_nascom(argv[optind]);
/* simz80(pc, 20, xhandleevent); */
/* draw the screen a lot more to slow down the key repeat */
simz80(pc, 1, xhandleevent);
/* we need to check for reset */
fprintf(stderr,"HALT\n\r");
fprintf(stderr,"PC SP IR IX IY AF BC DE HL AF' BC' DE' HL'\n\r");
fprintf(stderr,"%04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x\n\r",pc,sp,ir,ix,iy,af[af_sel],regs[regs_sel].bc,regs[regs_sel].de,regs[regs_sel].hl,af[1-af_sel],regs[1-regs_sel].bc,regs[1-regs_sel].de,regs[1-regs_sel].hl);
exit(0);
}
Here are a few notes about some dabbles with emulating the NASCOM 2 and using an assembler or SDCC compiler