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. 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!! :guay1: :guay1:
    Ahora solo me falta sacar un rato y probarlo :loco1: :risa1:
    Este finde... :aplauso1:

    Imagen
    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 ... :sarcastico1: :sarcastico1: :sarcastico1:

    ¡Felices Fiestas!

    :fiesta: :fiesta: :fiesta: :beber1: :beber1: :beber1: :fiesta: :fiesta: :fiesta:
    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...

    :beber1:
    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. :gamer1:
    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%