Se recuerda a los Nuevos Usuarios Registrados que es obligatorio pasarse por el hilo de Presentaciones y que, para poder descargar archivos,
se han de escribir un mínimo de cuatro mensajes en el Foro. Muchas gracias por vuestra colaboración y un saludo.
New Registered Users are reminded that it is mandatory to visit the Introductions thread and that, in order to be able to download files,
a minimum of four messages must be written in the Forum. Thank you very much for your collaboration and best regards.
se han de escribir un mínimo de cuatro mensajes en el Foro. Muchas gracias por vuestra colaboración y un saludo.
La Administración
.New Registered Users are reminded that it is mandatory to visit the Introductions thread and that, in order to be able to download files,
a minimum of four messages must be written in the Forum. Thank you very much for your collaboration and best regards.
The Administration
.Lista de mejores mensajes
Clasificar mensajes
-
- Mensaje
- Agradecido
- Autor
- Valoración
-
-
28 Oct 2019 21:39 Re: Heimdall (español) 28 Oct 2019 21:39 Re: Heimdall (español)
Hace unos días que tengo el juego en casa.
Primero, el sistema anti copia.
Es de los de tipo coñazo, te hace buscar una palabra en el manual y si por lo que sea fallas, el juego se reinicia.
Con lo que te toca localizar una nueva palabra.
He intentado hacer una copia de respaldo con el X-Copy Pro, pero no lo hace bien, falla siempre en el primer sector.
También intenté usarlo con el WHDLoad pero la versión en castellano no está soportada.
Lo único que se me ocurre es mandar los discos originales a bone que tiene el cryoflux y el que saque la versión .ipf.
Esos ipfs mandarlos a quién se encargue de mantener el Heimdall en WHDLoad. Y lógicamente distribuirlos libremente desde aquí y otros sitios. También hacer una copia del manual, pero de eso me puedo encargar yo, que tengo un scaner casi sin estrenar.
Recordar que el juego como es el original está sin craquear. - 1 Agradecido
- pintza Autor
- Valoración Valoración: 7.69%
-
-
-
02 May 2023 23:03 Re: MegaDuino - MaxDuino basado en Mega2560 Pro Embed 02 May 2023 23:03 Re: MegaDuino - MaxDuino basado en Mega2560 Pro Embed
Los Gerbers no me interesan, me interesa el .ino y el esquema por si puedo implementar en mi diseño algo parecido.
¿Los puedes poner aquí? Es que, salvo causas de fuerza mayor, paso de registrarme en otra página ...
Por cierto, los mismos juegos CAS del mensaje de antes, he vuelto a probar y todos han cargado a 3.850 bds sin problemas.
perdona, no recordaba que había tenido que registrarme.
fichero datarec.ino
codigo:
//------------------------------------------------------------
// DIY DATA RECORDER
// for ATmega328 5V 16MHz(Arduino Pro)
// by takuya matsubara
// 3 modos
// ・Modo PLAY: Convierta el archivo binario (CAS/P6) en la tarjeta SD para emitir un pitido y enviar
// ・Modo REMOTE PLAY: Reproduce un pitido cuando REMOTE está ON
// ・Modo REC: convierte el sonido recibido en un archivo binario y lo guarda en la tarjeta SD
// Terminal de casete de PC-6001mkII(4)CMTOUT --> DATIN D2(PD2)
// Terminal de casete de PC-6001mkII(5)CMTIN <-- DATOUT D3(PD3)
// Terminal de casete de PC-6001mkII(6)REMOTE+ --> REMOTE D9(PB1)
// Terminal de casete de PC-6001mkII(7)REMOTE- --- GND
// Terminal de casete de PC-6001mkII(2)GND --- GND
// Terminal de casete de PC-6001mkII(8)GND --- GND
// El REMOTO no tiene polaridad, por lo que +/- inversa está bien
// SDCARD SDI <-- D11(PB3)
// SDCARD SDO --> D12(PB4)
// SDCARD CLK <-- D13(PB5)
// SDCARD CS <-- D4(PD4)
// AQM1602XA SCL <-- D19(PC5)
// AQM1602XA SDA <-- D18(PC4)
// SPEAKER <-- D14(PC0)
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#define DATIN 2 //pin number:data input "activada la función de grabación"
//#define DATIN 0 //pin number:desactivada la función de grabación
#define REMOTE 9 //pin number:remote "terminal"
//#define REMOTE 0 //pin number:remote "desactivar terminal"
#define SPEAKER 14 //pin number:speaker
//#define SPEAKER 0 //pin number:"desactivar altavoz"
#define DATOUT 3 //pin number:data output
#define BTN_UP 5 //pin number:up button
#define BTN_DOWN 6 //pin number:down button
#define BTN_PLAY 7 //pin number:play button
#define BTN_STOP 8 //pin number:stop button
#define CPUHZ 16000000
#define PRS1 8
#define PRS2 64
char seq = 0; //menu seq(Comience con la selección de modo)
char targetfile[14]; //nombre de archivo 8+.1+extensión 3+null1
unsigned int targetsize; //tamaño archivo
unsigned int pion; //contador de pitidos
unsigned int tape_counter; //contador de cinta
unsigned int pulse_work;
unsigned char pulse_waveform;
#define RINGBUFMAX 64
unsigned char ringbuff[RINGBUFMAX]; //buffer de anillo o "ring"
volatile char ring_a = 0; //RINGBUFFER contador A
volatile char ring_b = 0; //RINGBUFFER contador B
unsigned int idx = 0; //read file index
//------------------------------------------------------------
//Interrupción cambio pin DATIN subida/bajada
SIGNAL (PCINT2_vect)
{
char onebit;
int hz;
if(digitalRead(DATIN)==HIGH){ //rising
#if SPEAKER!=0
digitalWrite(SPEAKER, HIGH);
#endif
TCNT1 =0;
}else{
hz = ((CPUHZ/PRS1)/2)/TCNT1; //falling
#if SPEAKER!=0
digitalWrite(SPEAKER, LOW);
#endif
if(hz<600)return;
if(hz>1800){
pulse_waveform <<= 2;
pulse_waveform |= 0b10; //2400Hz(1)
}else{
pulse_waveform = 0b1100; //1200Hz(0)
}
if(pulse_waveform & 0b1000){//1bit recepcion
if(pulse_waveform == 0b1100) onebit=0; else onebit=1;
if(pulse_work == 0xFFFF){ //startbit espera
if(onebit==0)pulse_work = 0x7FFF; //startbit deteccion
}else{
//0b111dddddddd01111
pulse_work >>= 1;
if(onebit)pulse_work |= 0x8000;
if((pulse_work & (1<<4))==0){//12bit envio terminado
ringbuff_push((pulse_work >> 5) & 0xFF);
pulse_work = 0xFFFF;
}
}
pulse_waveform = 0;
}
}
}
//------------------------------------------------------------
// Interrupción del temporizador 4800 veces/seg.
SIGNAL (TIMER1_OVF_vect)
{
char state;
TCNT1 = 0x10000-((CPUHZ/PRS1)/4800);
if(tape_counter == 0xffff)return;
if(pulse_work == 0x0000){ //Transmisión de 1 byte (12 bits) completada
#if REMOTE!=0
if(seq==5){
if( digitalRead(REMOTE) == HIGH){
pion = 0; // contador de pitidos (o tiempo de pitido)
return; //REMOTE terminal OFF
}
}
#endif
if(((pion>=0)&&(pion<340))||((pion>=356)&&(pion<456))){
//Pite durante 3,4 segundos antes de enviar datos 3,4 segundos/(12bit/1200hz)=340
//Pitido durante 1 segundo después de enviar 16 bytes de datos 1/(12/1200)=100
pulse_work = 0b111111111111; //12bit
}else{
if(ringbuff_datacnt()==0){ //si el bufer circular (anillo) está vacio
return;
}
pulse_work = ringbuff_pop(); //los siguientes datos
pulse_work = (pulse_work | 0b11100000000)<< 1; //12bit
tape_counter++; //incrementa contador de cinta
}
if(pion < 0xffff)pion++;
}
if(pulse_waveform==0){ //1bit=1/1200sec progreso
if(pulse_work & 1){
pulse_waveform = 0b1010; // 2400Hz(1)
}else{
pulse_waveform = 0b1100; // 1200Hz(0)
}
pulse_work >>=1;
}
if((pulse_waveform & 1)==0) state=HIGH; else state=LOW;
digitalWrite(DATOUT, state);
#if SPEAKER!=0
digitalWrite(SPEAKER, state);
#endif
pulse_waveform >>= 1;
}
//------------------------------------------------------------
//RING BUFFER:PUSH numero de datos
int ringbuff_datacnt(void)
{
if(ring_a < ring_b){
return((ring_a + RINGBUFMAX) - ring_b);
}else{
return(ring_a - ring_b);
}
}
//------------------------------------------------------------
//RING BUFFER:PUSH "hacer"
void ringbuff_push(unsigned char pushdata)
{
ringbuff[ring_a] = pushdata;
ring_a = (ring_a+1) & (RINGBUFMAX-1);
}
//------------------------------------------------------------
//RING BUFFER:POPする
unsigned char ringbuff_pop(void)
{
unsigned char work;
if (ring_a==ring_b)return(0x00); //no data
work = ringbuff[ring_b];
ring_b = (ring_b+1) & (RINGBUFMAX-1);
return(work);
}
//------------------------------------------------------------
//AQM1602XA:init
void lcd_init(void)
{
#define LCDCNTR 12 //contrast(0-63)
Wire.begin();
delay(150);
lcd_cmdwrite(0x38); //function set(normal instruction)
lcd_cmdwrite(0x39); //function set(extension instruction)
lcd_cmdwrite(0x14); //internal osc freq.
lcd_cmdwrite(0x70+(LCDCNTR & 0xF)); //contrast set
lcd_cmdwrite(0x54+(LCDCNTR >> 4)); //power/icon/contrast control
lcd_cmdwrite(0x6C); //follower control
lcd_cmdwrite(0x38); //function set(normal instruction)
lcd_cmdwrite(0x01); //clear display
lcd_cmdwrite(0x08+4+2+1); //display on/off control(disp=on/cursor=on/blink=on)
}
//------------------------------------------------------------
//AQM1602XA
void lcd_write(unsigned char temp1,unsigned char temp2)
{
#define LCDADDR (0x7C >> 1) //slave address // canviar por el puerto del display I2C (segun fabricante es el puerto 0x3C)
Wire.beginTransmission(LCDADDR);
Wire.write(temp1);
Wire.write(temp2);
Wire.endTransmission();
}
//------------------------------------------------------------
//AQM1602XA:locate
void lcd_locate(char x,char y){
unsigned char cmd=0x80;
if((x>=16)||(y>=2))return;
cmd += x;
cmd += (0x40*y);
lcd_cmdwrite(cmd);
}
//------------------------------------------------------------
//AQM1602XA:write character
void lcd_cmdwrite(unsigned char command)
{
lcd_write(0x00,command);
delay(1);
}
//------------------------------------------------------------
//AQM1602XA
void lcd_datawrite(unsigned char data)
{
lcd_write(0x40,data);
delay(1);
}
//------------------------------------------------------------
//AQM1602XA
void lcd_cls(void)
{
char i;
lcd_locate(0,0);
for(i=0;i<16;i++){
lcd_datawrite(' ');
}
lcd_locate(0,1);
for(i=0;i<16;i++){
lcd_datawrite(' ');
}
}
//------------------------------------------------------------
//AQM1602XA
void lcd_putstr(char x,char y,char *p)
{
lcd_locate(x,y);
while(*p!=0){
lcd_datawrite(*p++);
}
}
//------------------------------------------------------------
//AQM1602XA:pantalla decimal de 5 digitos
void lcd_putnum(char x,char y,unsigned int num)
{
unsigned int keta=10000;
char temp;
lcd_locate(x,y);
while(keta>0){
temp = (num/keta)% 10;
lcd_datawrite('0'+temp);
keta /= 10;
}
}
//------------------------------------------------------------
PROGMEM const unsigned char message[12][16]={
"DATA RECORDER", //0
"SD CARD ERROR", //1
"FILE OPEN ERROR", //2
"WRITE ERROR", //3
"MENU", //4
"PLAY MODE", //5
"REC MODE", //6
"PLAY LIST", //7
"SELECT NUMBER", //8
"PLAYING...", //9
"RECORDING..", //10
"REMOTE PLAY" //11
};
void lcd_putmessage(int x,int y,int number)
{
PGM_P pSrc;
unsigned char ch;
pSrc = message[number];
lcd_locate(x,y);
while(1){
ch = pgm_read_byte(pSrc++);
if(ch==0)break;
lcd_datawrite(ch);
}
}
//------------------------------------------------------------
//"sin usar o sin uso" send 1byte
void pulsesend(int work){
char bitcnt;
char pulse;
int hz;
work <<= 1; //start bit(0)
work |= (0b111 << 9); // stop bit
digitalWrite(DATOUT, 1);
TCNT2 = 0;
for(bitcnt=0; bitcnt<12; bitcnt++){
if(work & (1<<bitcnt)){
hz = 2400; //2400Hz(1)
pulse = 4;
}else{
hz = 1200; //1200Hz(0)
pulse = 2;
}
while(pulse>0){
if(TCNT2 >= (((CPUHZ/PRS2)/2)/hz)){
TCNT2 = 0;
digitalWrite(DATOUT, digitalRead(DATOUT) ^ 1);
pulse--;
}
}
}
digitalWrite(DATOUT, 0);
}
//------------------------------------------------------------
// receive 1byte de "sin uso"
// +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
// pulsecnt| -1 |00 01|02 03|04 05|06 07|08 09|10 11|12 13|14 15|16 17|18 19|20 21|
// +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
// |start| bit0| bit1| bit2| bit3| bit4| bit5| bit6| bit7| stop| stop| stop|
int pulserecv2(void){
char pulsecnt=-1;
unsigned char work=0;
unsigned int hz;
static int edge=0;
int edgenow;
unsigned long timeout;
timeout=0;
hz = 0;
while(pulsecnt < 22){
edgenow = digitalRead(DATIN);
if(edge != edgenow){ //find pin change
edge = edgenow;
if(edge){
TCNT1 = 0; //pulse start
}else{
hz = ((CPUHZ/PRS1)/2)/TCNT1; //pulse end
}
}else{
timeout ++;
if(timeout == 0xfffff)return(-1);
}
if(hz==0)continue;
if(pulsecnt ==-1){ //find start bit(1200Hz)
if(hz > 1800){
pulsecnt = -1; //error
continue;
}
if(hz < 600){
pulsecnt = -1; //error
continue;
}
pulsecnt = 0;
}else if(pulsecnt < 16){ // b0-b7
if(hz > 1800){
work |= (1<<(pulsecnt>>1)); //2400Hz
pulsecnt += 1;
}else{
pulsecnt += 2; //1200Hz
}
}else{ //stop bit
pulsecnt += 1;
}
hz = 0;
}
return(work);
}
//------------------------------------------------------------
//sin usar receive
void recvtest(void) {
int cmd;
char pos=0;
while(1){
if (pos==0) Serial.write('\n');
cmd = pulserecv2(); //get command
if (cmd==-1){ //timeout
pos = 0;
}else{
Serial.print(cmd >> 4, HEX);
Serial.print(cmd & 0x0f, HEX);
Serial.write(' ');
pos = (pos+1)% 16;
}
}
}
//------------------------------------------------------------
// record image file
void recimagefile(void) {
File myFile;
unsigned char tempbyte;
char gomiflag=1; //Indicador de eliminación de polvo (1 = detección de polvo) supongo que se refiere a "ruido"
lcd_cls();
myFile = SD.open(targetfile, FILE_WRITE);
if (myFile==0) { //error
lcd_putmessage(0,0,3);
delay(1000);
return;
}
lcd_putmessage(0,0,10);
PCMSK2 |= (1<<PCINT18); //Interrupción de cambio de pin DATIN
PCICR |= (1<<PCIE2); // Interrupción de cambio de pin enable
pulse_work = 0xFFFF;
pulse_waveform = 0;
tape_counter = 0;
sei();
while(1){
if (digitalRead(BTN_STOP) == LOW)break; //cancelar con el botón STOP
if(ringbuff_datacnt() == 0){
lcd_putnum(0,1,tape_counter); //contador de cinta
continue;
}
tempbyte = (unsigned char)ringbuff_pop();
if(gomiflag){//deteccion de ruido (o polvo/basura)
if(tempbyte != 0xD3)continue; //si no comienza con D3 se considera basura
gomiflag = 0;
}
// Serial.print(tempbyte >> 4, HEX); //debug
// Serial.print(tempbyte & 0x0f, HEX); //debug
// Serial.write(' '); //debug
myFile.write(&tempbyte, 1); //write sd card
tape_counter++;
}
myFile.close();
// cli();
PCICR &= ~(1<<PCIE2); // interrupción de cambio de pin "disable"
targetsize = tape_counter;
lcd_putnum(0,1,tape_counter); //contador de cinta
delay(1000);
}
//------------------------------------------------------------
// SD CARD FILENAME
void getfilename(int index) {
File myFile;
str_copy(targetfile,"");
myFile = SD.open("/");
if(myFile==0){
lcd_putmessage(0,1,2);//ERROR
delay(1000);
return;
}
while(targetfile[0]==0) {
File entry = myFile.openNextFile();
if (! entry) {
// no more files
break;
}
// Serial.println(entry.name()); //debug
if (entry.isDirectory()) { //skip
} else {
if (index==0){
str_copy(targetfile,entry.name()); //copy file name
targetsize = entry.size();
}
index--;
}
entry.close();
}
myFile.close();
}
//------------------------------------------------------------
void str_num2str(char *p,unsigned int num)
{
unsigned int keta=10000;
char temp;
while(keta > 0){
temp = (num/keta)% 10;
*p++ = ('0'+temp);
keta /= 10;
}
}
//------------------------------------------------------------
// string:copy
//pSrc:origen de la copia
//pDst:destino de la copia
void str_copy(char *pDst,char *pSrc)
{
while(1){
*pDst = *pSrc;
if(*pDst == 0)break;
pDst++;
pSrc++;
}
}
//--------------------------------------------------------------
// string:Compare
char str_ncmp(char *p1,char *p2,char cnt)
{
while(*p1 == *p2)
{
cnt--;
if(cnt <= 0)return(0); //equal
p1++;
p2++;
}
return(1); //not equal
}
//------------------------------------------------------------
// string:upper case
unsigned char str_ucase(unsigned char chrcode)
{
if((chrcode >= 'a')&&(chrcode <= 'z'))
chrcode -= 0x20;
return(chrcode);
}
//------------------------------------------------------------
//play Tape image
void playimagefile(void)
{
File myFile;
char i;
lcd_cls();
myFile = SD.open(targetfile);
if (myFile == 0) {
lcd_putmessage(0,0,2);//ERROR
delay(1000);
return;
}
lcd_putmessage(0,0,9); //PLAYING
lcd_putnum(11,1,targetsize);
for(i=0;i<16;i++){
if (myFile.available()) {
ringbuff_push(myFile.read()); //lectura de tarjetas SD
}
}
pion = 0; // contador de pitidos
pulse_work = 0;
pulse_waveform = 0;
tape_counter = 0;
TCNT1 = 0x10000-((CPUHZ/PRS1)/4800);
TIMSK1 |= (1<<TOIE1); // Interrupción de desbordamiento del temporizador 1 "enable"
sei();
while(1){
if(ringbuff_datacnt() < RINGBUFMAX-3){
if(myFile.available()){
ringbuff_push(myFile.read());
}
}else{
lcd_putnum(0,1,tape_counter); //contador de cinta
}
if(ringbuff_datacnt()==0)break; //buffer anillo vacio
if(tape_counter >= targetsize)break; //end of tape
if(digitalRead(BTN_STOP) == LOW)break; //cancelar con el botón STOP
}
myFile.close();
lcd_putnum(0,1,tape_counter); //contador de cinta
tape_counter = 0xffff;
// cli();
TIMSK1 &= ~(1<<TOIE1); // Interrupción de desbordamiento del temporizador 1 desactivado (disable)
delay(1000);
}
//------------------------------------------------------------
void swoffwait(void)
{
while(1){
delay(10);
if (digitalRead(BTN_UP) == HIGH){
if (digitalRead(BTN_DOWN) == HIGH){
if (digitalRead(BTN_PLAY) == HIGH){
if (digitalRead(BTN_STOP) == HIGH){
break;
}
}
}
}
}
}
//------------------------------------------------------------
void setup() {
pinMode(BTN_UP, INPUT_PULLUP);
pinMode(BTN_DOWN, INPUT_PULLUP);
pinMode(BTN_PLAY, INPUT_PULLUP);
pinMode(BTN_STOP, INPUT_PULLUP);
#if DATIN!=0
pinMode(DATIN, INPUT); //Con función de grabación
#endif
pinMode(DATOUT, OUTPUT);
digitalWrite(DATOUT, LOW);
#if SPEAKER!=0
pinMode(SPEAKER, OUTPUT); //con altavoz
digitalWrite(SPEAKER, LOW);
#endif
#if REMOTE!=0
pinMode(REMOTE, INPUT_PULLUP); //con REMOTE
#endif
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
lcd_init();
if (!SD.begin(4)) {
lcd_putmessage(0,0,1); //ERROR
delay(1000);
return;
}
TCCR1A = 0;
TCCR1B = 2;
// 0 No clock source (Timer/Counter stopped).
// 1 clkI/O/1 (No prescaling)
// 2 clkI/O/8 (From prescaler)
// 3 clkI/O/64 (From prescaler)
// 4 clkI/O/256 (From prescaler)
// 5 clkI/O/1024 (From prescaler)
// TCNT1 = 0;
// TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt
// TIFR1 |= (1<<TOV1);
TCCR2A = 0;
TCCR2B = 4;
// 1 clk/(No prescaling)
// 2 clk/8 (From prescaler)
// 3 clk/32 (From prescaler)
// 4 clk/64 (From prescaler)
// 5 clk/128 (From prescaler)
// 6 clk/256 (From prescaler)
// 7 clk/1024 (From prescaler)
lcd_putmessage(0,0,0);
delay(1000);
}
//------------------------------------------------------------
void loop() {
switch(seq){
case 0: //mode select 1
case 1: //mode select 2
case 2: //mode select 3
#if DATIN==0
seq=4; //Si no hay función de grabación, se verá forzado al PLAY MODE
break;
#endif
lcd_cls();
lcd_putmessage(0,0,4);
if(seq==0) lcd_putmessage(0,1,5); //PLAY MODE
if(seq==1) lcd_putmessage(0,1,11); //remote PLAY MODE
if(seq==2) lcd_putmessage(0,1,6); //rec MODE
swoffwait();
while(1){
delay(100);
if(digitalRead(BTN_UP) == LOW){
seq++;
if(seq>2)seq=0;
break;
}
if(digitalRead(BTN_DOWN) == LOW){
if(seq==0)seq=2; else seq--;
break;
}
if(digitalRead(BTN_PLAY) == LOW){
if(seq==0)seq=4; //start play mode
if(seq==1)seq=5; //start remote play mode
if(seq==2)seq=6; //start rec mode
break;
}
}
break;
case 4: //play mode
getfilename(idx);
delay(200);
swoffwait();
if(targetfile[0]==0){//Error al obtener el nombre del archivo
idx=0;
break; //retry
}else{
lcd_cls();
lcd_putmessage(0,0,7); //PLAY LIST
lcd_putnum(10,0,idx); //index
lcd_putstr(0,1,targetfile);
}
while(1){
delay(100);
if (digitalRead(BTN_UP) == LOW){ //index+1
idx++;
break;
}
if (digitalRead(BTN_DOWN) == LOW){ //index-1
idx--;
break;
}
if (digitalRead(BTN_PLAY) == LOW){
playimagefile(); //play image file
break;
}
if( digitalRead(BTN_STOP) == LOW){
seq = 0; //back to mode select
break;
}
}
break;
case 5: //remote play mode
#if REMOTE==0
seq=4; //Fuerza PLAY MODE si no hay función REMOTE
break;
#endif
getfilename(idx);
delay(200);
swoffwait();
if(targetfile[0]==0){//error al obtener el nombre de archivo
idx=0;
break; //retry
}else{
lcd_cls();
lcd_putmessage(0,0,7); //PLAY LIST
lcd_putnum(10,0,idx); //index
lcd_putstr(0,1,targetfile);
}
while(1){
delay(100);
if (digitalRead(BTN_UP) == LOW){ //index+1
idx++;
break;
}
if (digitalRead(BTN_DOWN) == LOW){ //index-1
idx--;
break;
}
if (digitalRead(REMOTE) == LOW){ //REMOTE es ON
playimagefile(); //play image file
break;
}
if( digitalRead(BTN_STOP) == LOW){
seq = 1; //back to mode select
break;
}
}
break;
case 6: //rec mode
#if DATIN==0
seq=4; //Si no hay función de grabación, se verá forzado al PLAY MODE
break;
#endif
str_copy(targetfile,"SAV*****.CAS");
str_num2str(targetfile+3,idx);
lcd_cls();
lcd_putmessage(0,0,8); //SELECT NUMBER
lcd_putstr(0,1,targetfile);
delay(100);
swoffwait();
while(1){
if (digitalRead(BTN_UP) == LOW){
idx++;
break;
}
if (digitalRead(BTN_DOWN) == LOW){
idx--;
break;
}
if (digitalRead(BTN_PLAY) == LOW){
recimagefile(); //record image file
break;
}
if( digitalRead(BTN_STOP) == LOW){
idx = 0;
seq = 2; //back to mode select
break;
}
}
break;
}
}
//hasta aqui.
esquema
[P6mkII] Peeper Sound Player 3_PCBWay Community.png
la foto de la pantallita utilizada:
K-08896.JPG
saludos
AE-AQM1602-I2C_sch_castellano.pdf - 1 Agradecido
- msxmakers Autor
- Valoración Valoración: 7.69%
-
-
-
06 Nov 2019 22:57 Re: ¿Joystick para Amiga 500? 06 Nov 2019 22:57 Re: ¿Joystick para Amiga 500?
Bueno, como he comentado ya tengo control arcade original, pero la idea es utilizarlo sólo para sistemas arcade.
Lo que busco es uno para todo lo demás, es decir sistemas de 8 y 16 bits.
¿Qué tal una cosa así? ¿Su cruceta será mucho mejor que la de un mando de Xbox 360?
https://images-na.ssl-images-amazon.com/images/I/712cf0bQFvL._SL600_.jpg - 1 Agradecido
- badflame Autor
- Valoración Valoración: 7.69%
-
-
-
31 May 2023 21:11 Re: El Omega a plazos 31 May 2023 21:11 Re: El Omega a plazos
Por otra parte tengo dudas sobre el valor de R9 y C91 que afectan al PAL. Tengo puestos los valores que están marcados en placa 20KOhm y 27 pF.
no recuerdo de memoria que valores eran de PAL o NTSC pero probé ambos sin notar nada en absoluto:
Las resistencias recomendadas para PAL funcionaban con la BIOS NTSC y al revés tambien.
Además ni PAL ni NTSC interfieren si utilizas el conector RGB que es el que mejor se ve, así que resumiendo esos valores valen seguro y ahora que te funciona todo supongo que ya lo sabes.
saludos - 1 Agradecido
- msxmakers Autor
- Valoración Valoración: 7.69%
-
-
-
21 Nov 2019 08:34 Re: El hilo de mi A500 0_o 21 Nov 2019 08:34 Re: El hilo de mi A500 0_o
Yo trastearía con los cables... pero cuando ves las resistencias que usan... tienes que ser muy pro para tener resistencias de 510 ohms... o similares... 78... pero eso no lo usaba yo ni cuando estudiaba electrónica... Al final si para conseguir un rango aceptable de resistencia tengo que ponerlas en paralelo... para proteger el Scart voy a tener que usar una caja de zapatos :risa1: - 1 Agradecido
- droman Autor
- Valoración Valoración: 7.69%
-
-
- 1 Agradecido
- garciaandrade Autor
- Valoración Valoración: 7.69%
-
-
03 Dic 2019 19:20 Re: El hilo de mi A500 0_o 03 Dic 2019 19:20 Re: El hilo de mi A500 0_o
Me acaba de llegar el cablecito!!
Ahora solo me falta sacar un rato y probarlo
Este finde...
- 1 Agradecido
- Goody Autor
- Valoración Valoración: 7.69%
-
-
-
21 Jul 2023 21:33 Re: ZX Dandanator MTD 21 Jul 2023 21:33 Re: ZX Dandanator MTD
Hola moterov4 .
Pues estamos igual, yo ya estoy muy cerca de los 60, veo menos que un gato de escayola y tengo achaques para regalar :sarcastico1: y sin lupa o microscopio, no soy capaz de acometer muchos tipos de soldadura. Aún así de vez en cuando tengo que repetirlas porque no me quedan bien ... es algo normal, ya vamos para "viejunos" (al menos yo) ... pero aquí estamos "dando guerra" ... :abuelo: :abuelo:
Sobre las GAL, ahora mismo no sabría que indicarte ya que hace mucho tiempo que no puedo pedir componentes y "resisto" con los que tengo en casa. Pero seguro que pintza u otro compañero te puede recomendar algún vendedor.
Yo te recomiendo usar 15LP o, en su defecto, 25LP.
No sé si el error será la GAL, pero tiene toda la pinta ... casi 50º son muchos grados ... y, además, "en frío" te funciona, es cuando lleva un rato y se calienta cuando te empiezan a fallar las cosas ... - 1 Agradecido
- merlinkv Autor
- Valoración Valoración: 7.69%
-
-
-
16 Dic 2019 20:52 Re: Felices fiestas a tod@s, frikazos del Amiga 16 Dic 2019 20:52 Re: Felices fiestas a tod@s, frikazos del Amiga
No sé si nos ha llamado PATOS o quiere unos ZAPATOS ...
¡Felices Fiestas!
- 1 Agradecido
- merlinkv Autor
- Valoración Valoración: 7.69%
-
-
-
16 Ago 2023 16:38 Flimbo's Quest 16 Ago 2023 16:38 Flimbo's Quest
https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/Flimbo's Quest - 1990/Flimbo's Quest - 1990_01.jpg
El científico loco Fransz Dandruff ha creado una máquina que extrae la energía vital de su víctima para él, alargando así su vida indefinidamente. Dandruff secuestra a Pearly, reina de belleza de Dewdropland, para proporcionarle esta energía. Su novio Flimbo se propone salvarla.
El jugador controla a Flimbo a través de siete niveles distintos, recolectando pergaminos para el mago Dazz Bazian, para permitirle crear un hechizo que enviará a Flimbo al siguiente nivel. Los niveles son de itinerancia libre, y es necesaria cierta exploración para encontrar los pergaminos de los enemigos repartidos por la guarida, así como otros secretos como bancos y varios potenciadores: una super arma, que amplía el alcance y la potencia de los disparos de Flimbo. permitiendo disparar tiros lejanos a través de la pantalla, invulnerabilidad que dura 30 segundos (esto no protege contra el agua o los agujeros) y en el nivel 6, relojes de arena que agregan 2 minutos al límite de tiempo. Todos estos se pueden comprar en las tiendas de Dazz, junto con letras individuales o palabras completas del código. Los corazones también se pueden obtener en cinco colores para darle al jugador una vida extra, nuevamente estos se pueden tomar de los enemigos en el juego.
https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/Flimbo's Quest - 1990/Flimbo's Quest - 1990_02.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/Flimbo's Quest - 1990/Flimbo's Quest - 1990_03.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/Flimbo's Quest - 1990/Flimbo's Quest - 1990_04.jpg
https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/Flimbo's Quest - 1990/Flimbo's Quest - 1990_05.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/Flimbo's Quest - 1990/Flimbo's Quest - 1990_06.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/Flimbo's Quest - 1990/Flimbo's Quest - 1990_07.jpg
https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/Flimbo's Quest - 1990/Flimbo's Quest - 1990_08.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/Flimbo's Quest - 1990/Flimbo's Quest - 1990_09.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/Flimbo's Quest - 1990/Flimbo's Quest - 1990_10.jpg
Año de lanzamiento: 1990
Idiomas: Inglés
Chipset: OCS
Discos: 1
Instalación HDD: No
Protección (disk-analyse): Unsupported format
Flimbo's Quest - 1990.7z
Flimbo's Quest - Manual.7z - 1 Agradecido
- merlinkv Autor
- Valoración Valoración: 7.69%
-
-
-
08 Ene 2020 14:50 Re: Adaptador GIMX 08 Ene 2020 14:50 Re: Adaptador GIMX
Pue sno conocia el dispositivo...claro, si no tengo PS4 pues es normal... :sarcastico1:
Ni que decir tiene, que si alguien de esta familia quiere alguno... que me lo pida por privado y le cobro sólo el hardware a precio de chino y el envío.... faltaría plus.
Pues muchas gracias, compi!!!! Si algún dia me hiciese falta... :guino1: - 1 Agradecido
- Bone Autor
- Valoración Valoración: 7.69%
-
-
-
26 Ago 2023 20:00 Re: ZX Dandanator MTD 26 Ago 2023 20:00 Re: ZX Dandanator MTD
Voy a hacer una cosa ... voy a crear un ROMSet con Z80's creados en ZEsarUX emulando un +2 y a ver que tal ... - 1 Agradecido
- merlinkv Autor
- Valoración Valoración: 7.69%
-
-
-
23 Ene 2020 21:52 Re: Momentos que marcan de por vida 23 Ene 2020 21:52 Re: Momentos que marcan de por vida
Pues yo recuerdo con mucho cariño mis tres primeros ordenadores ... un ZX 48K ... por aquel entonces estudiaba y trabajaba de camarero y tuve que ahorrar tres meses para poder comprarlo. Luego subí el listón y pude comprar un QL ... pero el orgas... el subidón fue cuando pude comprarme mi primer A500 ... trabajaba por Africa por aquel entonces y gracias a ese pequeñín tuve la oportunidad de aprender y hacer un montón de cosas ...
Esos tres ordenadores me marcaron, bueno y un coleguilla que DEP que fue el que me inició en la programación. El tío era un auténtico genio, pero tenía un grave problema (le daba mucho a la bebida) y eso le acabó matando. En fin, nunca le olvidaré, era una buena persona. - 1 Agradecido
- merlinkv Autor
- Valoración Valoración: 7.69%
-
-
-
28 Feb 2020 11:12 Re: MegaDuino - MaxDuino basado en Mega2560 Pro Embed 28 Feb 2020 11:12 Re: MegaDuino - MaxDuino basado en Mega2560 Pro Embed
Estoy pasando una serie de juegos que para mí son emblemáticos ... unos 40 o 50 a 4500 bds.
Parece que no, pero aunque tardan comparados con los de disco, la verdad es que los tiempos de carga se reducen muchísimo y ... no dejas de saborear esa experiencia retro ... :sarcastico1: :gamer1:
Edito: Por cierto, no es mérito mío, ni mucho menos, es mérito de @rcmolina y su utilidad zx802tzx3 que puedes descargar desde aquí - 1 Agradecido
- merlinkv Autor
- Valoración Valoración: 7.69%
-
-
-
07 Dic 2023 01:34 Re: Buenas, me presento. Soy Hoz3 07 Dic 2023 01:34 Re: Buenas, me presento. Soy Hoz3
Hola Hoz3 y bienvenido al Foro.
Me alegra saber que eres de Madrid, yo también lo soy jeje
Para cualquier duda ya sabes que nos tienes por aquí.
Un saludo y nos leemos...
- 1 Agradecido
- Pingui Autor
- Valoración Valoración: 7.69%
-
-
-
21 Mar 2020 12:29 Omega MSX 21 Mar 2020 12:29 Omega MSX
Bajo este nombre tan oriental se esconde la recreación moderna de todo un MSX de segunda generación.
La idea es hacer dos placa, una con toda la electrónica y otra con un teclado mecánico. Creo que me he explicado mal, no es que la idea sea hacer, es que ya está hecho:
https://github.com/skiselev/omega/raw/master/Mainboard/images/Omega-Mainboard-1.1-Stacked.jpg
Como en muchos casos este proyecto está hecho bajo licencia GNU, tiene un Github con todo lo necesario para su fabricación.
La idea es hacer un MSX tradicional usando la electrónica de la época. Por lo que no lleva FPGAs y todo es thru-hole.
https://github.com/skiselev/omega/blob/master/Mainboard/images/Omega-Keyboard_and_Mainboard-1.1.jpg?raw=true
En la documentación se incluye no sólo los Gerber, también están todos los archivos de KiKad necesarios para modificar lo que quieras.
Como se puede ver en las fotos una placa irá encima de la otra, quedando todo muy compacto.
https://github.com/skiselev/omega/blob/master/Mainboard/images/Omega-Mainboard-1.1-Back.jpg?raw=true
También ha diseñado una carcasa de metacrilato para meter el ordenador.
https://github.com/skiselev/omega/blob/master/Enclosure/images/Omega_Acrylic_Enclosure.jpg?raw=true
La carcasa cumple su función pero me parece lo más flojo del proyecto, no es cómodo si quieres picar código. A parte de eso y a la espera de algo impreso en 3d está correcto.
El teclado no lleva membrana, es un teclado mecánico.
https://github.com/skiselev/omega/blob/master/Keyboard/images/Omega_Keyboard-PCB.jpg?raw=true
Lo bueno de estos teclados es que la calidad depende de los interruptores que se pongan y en todos los casos es mejor que una membrana de plástico.
https://github.com/skiselev/omega/blob/master/Keyboard/images/Omega_Keyboard-Building.jpg?raw=true
Una vez montado el teclado queda de PM, professional.
https://github.com/skiselev/omega/blob/master/Keyboard/images/Omega_Keyboard-Complete.jpg?raw=true
Por último el enlace de Github con toda la información necesaria. Omega MSX - 1 Agradecido
- pintza Autor
- Valoración Valoración: 7.69%
-
-
-
02 Abr 2020 16:53 Re: Heimdall (español) 02 Abr 2020 16:53 Re: Heimdall (español)
Perfecto entonces.
Ahora a disfrutarlo. - 1 Agradecido
- pintza Autor
- Valoración Valoración: 7.69%
-
-
- 1 Agradecido
- pintza Autor
- Valoración Valoración: 7.69%
-
- 1 Agradecido
- Zangolotino Autor
- Valoración Valoración: 7.69%
-
-
24 Abr 2020 09:07 Re: Cómo emular un Commodore 64 24 Abr 2020 09:07 Re: Cómo emular un Commodore 64
Está muy bien el resumen.
Sólo por poner un pero, yo no incluiría al C128 como variante del 128. Creo que era un ordenador nuevo, eso si que llegó un poco tarde al mercado y ya estaban por aquí los 16 bits.
El Z80 del C128 era a 4 MHZ pero por temas gráficos lo caparon a los 2 MHZ que comentas, pero sólo para CPM, más adelante salió una versión que solventaba esto, funcionando ya a más velocidad.
Este Z80 también gestionaba el encendido de la máquina a toda su velocidad, cosa que debía ser muy complicada. Este modelo podía arrancar como un C64, como C128 VIC II, Como 128 VDC y a parte también está el modo CPM y el GeOS, ya que para complicar un poco más la cosa este ordenador contaba con un zócalo libre donde se podía poner un chip con una nueva Rom. - 1 Agradecido
- pintza Autor
- Valoración Valoración: 7.69%
-