Skip to content

Instantly share code, notes, and snippets.

@houmei
Created May 27, 2022 10:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save houmei/c69b02b7ac12992709111d89f84ca937 to your computer and use it in GitHub Desktop.
Save houmei/c69b02b7ac12992709111d89f84ca937 to your computer and use it in GitHub Desktop.
PASOPIA PAC1 ROM Reader / use GG_Library
//
// PASOPIA PAC1 Reader for ArduinoMEGA2560
//
// use GG_library
// https://www.arduino.cc/reference/en/libraries/gg/
// https://github.com/mkogax/GG_for_Arduino
#include <GG_for_Arduino.h>
// databus input
int db[8]= {49,48,47,46,45,44,43,42};
// addressbus output
int ad[16]= {22,23,24,25,26,27,28,29,37,36,35,34,33,32,31,30};
// control output
int Coladd = 51; // not used must be "L"
int Cwr = 52; // not used must be "L"
int Selpac = 53;
int Cmreq = 50; // not used
int X2clk = 38;
// control input (request from PAC1)
int Inhint = 41;
int Disrom = 40;
int Meminh = 39;
const int PAC1_BREAK = 0x1b;
const long PAC1_addr_L = 0;
const long PAC1_addr_H = 0x7fff;
long PAC1_addr = PAC1_addr_L;
void setup() {
int t;
// initialize
for(int i=0;i<16;i++) pinMode(ad[i],OUTPUT);
for(int i=0;i<8;i++) pinMode(db[i],INPUT);
pinMode(Inhint,INPUT_PULLUP);
pinMode(Disrom,INPUT_PULLUP);
pinMode(Meminh,INPUT_PULLUP);
pinMode(Coladd,OUTPUT);
pinMode(Cwr,OUTPUT);
pinMode(Selpac,OUTPUT);
// pinMode(Cmreq,OUTPUT);
// pinMode(x2clk,OUTPUT);
digitalWrite(Coladd,LOW);
digitalWrite(Cwr,LOW);
digitalWrite(Selpac,HIGH);
gg_con_baud = 9600;
gg_start("\n*** PASOPIA ROMPAC1 READER ***\n"); // Start processing GG for Arduino
gg_con_CmdInit();
GG_CON_CMDADD(PAC1_help, "h", "", "PASOPIA-PAC1 help" );
GG_CON_CMDADD(PAC1_help, "?", "", "PASOPIA-PAC1 help" );
GG_CON_CMDADD(PAC1_pointer, "a", "[addr]", "PASOPIA-PAC1 set address pointer" );
GG_CON_CMDADD(PAC1_dump, "d", "[start-addr [end-addr [i]]]", "PASOPIA-PAC1 dump memory" );
delay(500);
gg_con_CmdHelpAll();
gg_printf("\n");
t=digitalRead(Inhint);
gg_printf("INHINT = %d\n",t);
t=digitalRead(Disrom);
gg_printf("DISROM = %d\n",t);
t=digitalRead(Meminh);
gg_printf("MEMINH = %d\n",t);
gg_printf("\n");
gg_printf("%s",gg_con_prompt);
}
void loop() {
gg_con_Check(); // console processing (returns immediately if nothing is done)
}
// PAC1 commands
void PAC1_help(int argc, char **argv) {
gg_con_CmdHelpAll();
}
void PAC1_pointer(int argc, char **argv) {
long x = 0;
if (argc>1) {
if (isDigit(argv[1][0])) {
x = gg_asc2int(argv[1]);
PAC1_addr = x;
}
}
gg_printf("%04X\n",PAC1_addr);
}
void PAC1_dump(int argc, char **argv) {
long st,ed,siz;
int hexflag=0;
st=PAC1_addr; siz=256; ed=PAC1_addr+siz-1;
if (argc>1) {
if (isDigit(argv[1][0])) st = gg_asc2int(argv[1]);
if (argv[1][0]=='-') st=PAC1_addr;
}
if (argc>2) {
if (isDigit(argv[2][0])) ed = gg_asc2int(argv[2]);
siz = ed - st +1;
}
if (siz<0) siz = 256;
if (argc>3 && (argv[3][0]=='i' || argv[3][0]=='I')) hexflag=1;
if (hexflag) PAC1_printELA(st);
while (siz>0) {
if (hexflag) {
st = PAC1_print_16b_iHEX(st);
} else {
st = PAC1_print_16b(st);
}
PAC1_addr = st;
siz -= 16;
if (gg_GetC()==PAC1_BREAK) return;
}
if (hexflag) gg_printf(":00000001FF\n");
if (hexflag) while(gg_GetC()<0);
}
// ----------------------------
long PAC1_printELA(long addr) {
gg_printf(":020000040000FA\n"); // ELA=0000
return 0;
}
long PAC1_print_16b_iHEX(long addr) {
int sum,d;
sum=(addr/256) & 0xff + (addr & 0xff);
gg_printf(":10%04X00",addr);
for (int i=0;i<16;i++) {
d=PAC1_read_byte(addr);
sum+=d;
gg_printf("%02X",d);
addr++;
if (addr>PAC1_addr_H) addr=PAC1_addr_L;
}
gg_printf("%02X\n",(0-sum)&0xff);
return addr;
}
long PAC1_print_16b(long addr) {
gg_printf("%04X :",addr);
for (int i=0;i<16;i++) {
gg_printf(" %02X",PAC1_read_byte(addr));
addr++;
if (addr>PAC1_addr_H) addr=PAC1_addr_L;
}
gg_printf("\n");
return addr;
}
int PAC1_read_byte(int addr) {
int d;
PAC1_setaddr(addr);
digitalWrite(Selpac,LOW);
d=PAC1_readdata();
digitalWrite(Selpac,HIGH);
return d;
}
void PAC1_setaddr(int addr) {
int t;
for(int i=0;i<16;i++) {
t=addr & 1; digitalWrite(ad[i],t);
addr = addr >> 1;
}
}
int PAC1_readdata(void) {
int s=0;
int t;
for(int i=0;i<8;i++) {
t = digitalRead(db[i]);
s = s + (t << i);
}
return s;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment