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
  • 01 Jul 2022 17:21 Re: ¡Felicidades droman! 01 Jul 2022 17:21 Re: ¡Felicidades droman!
    Muchas felicidades!! Que pases un buen dia.
    1 Agradecido
    tun40 Autor
    Valoración Valoración: 7.69%  
  • 25 Nov 2018 00:03 Re: Como meter un A1200 en una torre. 25 Nov 2018 00:03 Re: Como meter un A1200 en una torre.
    A la placa de mi A1200 le he tenido que cambiar los zócalos de la ROM, los originales estaban cedidos. Pienso que haciendo esto puedo eliminar problemas en el futuro.

    https://www.winuaespanol.com/almacenphpbb/pintza/A1200T/20160612_224502_result.jpg

    Recuerdo que este es el segundo intento de hacer la Torre. En el intento anterior se vio todo frustrado por la aceleradora.
    Era una ACA 1232/33 y parece que se llevaba mal con la mediator.
    A esta placa le realicé varios mods que aconsejaban para dar estabilidad a la misma. Era quitar algunos condensadores y sustituir unas resistencias por unas ferritas.

    Lo primero que tengo que hacer es adaptar el panel trasero a su nueva ubicación, no será complicado pero si laborioso ya que sólo cuento con una Dremel para cortar la chapa.

    https://www.winuaespanol.com/almacenphpbb/pintza/A1200T/WP_20150503_15_44_37_Pro_039BE334B8.jpg

    Para el vídeo tengo una Indivision AGA cr, para el almacenamiento cuento con una Fast ATA y para el teclado usaré un Sum 1200.
    Para el resto de expansiones tengo la Mediator donde pondré estas tarjetas PCI:

    Gráfica Ati 9200 con 256 MB de Ram.
    https://www.winuaespanol.com/almacenphpbb/pintza/A1200T/20160613_091224_result.jpg

    Sound Blaster Live 5.1.
    https://www.winuaespanol.com/almacenphpbb/pintza/A1200T/20160613_091253_result.jpg

    Spider USB:
    https://www.winuaespanol.com/almacenphpbb/pintza/A1200T/20160613_091121_result.jpg

    Tarjeta de red y otra SCSI.
    https://www.winuaespanol.com/almacenphpbb/pintza/A1200T/20160613_091147_result.jpg

    Más o menos es todo lo que tengo, me falta lo más importante ...................... la aceleradora.
    1 Agradecido
    pintza Autor
    Valoración Valoración: 7.69%  
  • 04 Ago 2022 23:09 Re: Ghouls 'N Ghosts 04 Ago 2022 23:09 Re: Ghouls 'N Ghosts
    Qué pedazo de aporte. Es un juego que suelo usar en cualquier plataforma para probar.
    En amiga , creo que necesitaba 1mg, incluso de chip, no de fast. Pero bueno, quizás fuese la versión que "me llegó" a mi.
    Recuerdo jugar a él en los salones de recreativas.
    Tiene algo que engancha. No sé ¿quizás el tema zombi? ....
    1 Agradecido
    Santiago-H Autor
    Valoración Valoración: 7.69%  
  • 02 Oct 2022 14:59 Re: ZX Turbo Games 02 Oct 2022 14:59 Re: ZX Turbo Games

    Un segundo lote.

    353 juegos, 147 a 4500bds y 196 a 3500bds, es decir el 44,47% a 4.500bds ... :hurra1:



    20220929_ZXTurboGames.7z



    Espero que os guste.

    :hola1:

    NOTA: Descargad siempre el último lote ya que contiene los juegos de los anteriores y los que voy añadiendo.


    pa la cacharrería, gracias :gamer1:
    1 Agradecido
    Alki Autor
    Valoración Valoración: 7.69%  
  • 24 Ene 2019 14:35 Re: Problemas con Blizzard 1230 IV 24 Ene 2019 14:35 Re: Problemas con Blizzard 1230 IV
    merlinkv escribió: 24 Ene 2019 08:41 Un 030/50, FPU y 128MB de RAM .... pedazo de A1200 .... :hurra1:
    Vaya...estoy muy contento con mi Amiga 1200 ahora.....arranca perfectamente a la primera, todo va como se le espera....esta ¡genial! :hurra1:
    1 Agradecido
    Bone Autor
    Valoración Valoración: 7.69%  
  • 10 Nov 2022 21:53 Re: MegaDuino - MaxDuino basado en Mega2560 Pro Embed 10 Nov 2022 21:53 Re: MegaDuino - MaxDuino basado en Mega2560 Pro Embed
    Muchas gracias, en cuanto lo tenga todo soldado e impreso subo como ha quedado todo! :risaroll:
    1 Agradecido
    NacherasTM Autor
    Valoración Valoración: 7.69%  
  • 1 Agradecido
    Sup3rH4L Autor
    Valoración Valoración: 7.69%  
  • 28 May 2019 23:59 Re: Coffin en WinUAE 28 May 2019 23:59 Re: Coffin en WinUAE

    ...
    sobrado, pero se ve apetecible como opción gratuita.
    ¿Precisa del Workbench para ser instalado o es propietario?


    Es una version "alegal" del AmigaOS 3.1 con mogollon de software/parches/utilidades/demos/...
    Vamos que con el casi ya no tienes que descargar nada (execpto nuevas cosas que salgan).
    Tan solo lo vuelcas en una SD/USB de 32GB (o necesita 64GB no recuerdo) y yastá, te deberia arrancar sin "muchos" porblemas, ten en cuenta qu esta "preparada" para las Vampire, asi que el sistema (libs/comandos/parches) esta "especialmete" tuneado para ella.

    Soy de amigaaaaaaaaaaaaaaaaaaaaaaaaargh!!!!
    1 Agradecido
    javierdlr Autor
    Valoración Valoración: 7.69%  
  • 08 Jul 2019 18:59 AmigaOS 3.1.4.1 08 Jul 2019 18:59 AmigaOS 3.1.4.1
    Actualización a AmigaOS 3.1.4 lanzado


    http://www.hyperion-entertainment.com/images/stories/OS3.1.4/005.png

    Hyperion Entertainment CVBA nos anuncia de la disponibilidad inmediata de AmigaOS 3.1.4.1 como una actualización gratuita de AmigaOS 3.1.4 lanzada en septiembre de 2018.

    Desde entonces, se encontraron algunos errores y se revisó la funcionalidad. Por lo tanto, proporcionan actualizaciones que abordan esos problemas para mejorar la experiencia del usuario y también agregan más soluciones para mejorar la compatibilidad con algunos programas de comportamiento extraño.

    Esto es principalmente una actualización de corrección de errores para AmigaOS 3.1.4, sin embargo, algunas características pequeñas lograron incluirse:



    Catálogos de AmigaOS en danés (dansk) y suecos (svenska).
    Setpatch ahora tiene la capacidad de cargar tanto un dispositivo de audio como una actualización de Shell-Seg.
    El servicio de audio consiguió una compatibilidad mejorada con algunas prácticas de programación no estándar.
    HDToolBox ahora sugiere tamaños de bloque más adecuados para unidades grandes.
    CrossDOS ahora es más tolerante a las listas de montaje mal configuradas y a los juegos de caracteres extranjeros.
    Por supuesto, han logrado abordar muchas más correcciones de errores. El registro de cambios tiene más de 260K y cubre componentes como el CDFileSystem, el nuevo soporte de intution, dispositivo de audio, soporte de disco (Format, FastFileSystem y HDToolBox), Shell, varios comandos de AmigaDOS, DiskDoctor y muchos más componentes.

    AmigaOS 3.1.4.1 está disponible como descarga gratuita desde el área de descarga restringida para todos los clientes registrados de AmigaOS 3.1.4.

    Hyperion Entertainment CVBA nos desea enviar felicitaciones a todas esas personas involucradas por hacer que esta actualización se realice.

    ¡Gracias chicos!
    1 Agradecido
    Pingui Autor
    Valoración Valoración: 7.69%  
  • 29 Ene 2023 19:03 Re: TZX-TSX 29 Ene 2023 19:03 Re: TZX-TSX
    MSXVR ... algo que compré con mucha ilusión y que, al poco de tenerlo, me desencantó profundamente. A eso le sumas la postura de los "desarrolladores" y el resultado es ese ... en una estantería ...

    Todo lo contrario que con el Omega MSX2+ ... tardé tiempo en decidirme, pero ha sido una de mis grandes compras en los últimos tiempos. ¿Mejorable? Como todo, pero de por sí, es un pedazo de MSX que te pasas de vueltas.

    :gamer1:
    1 Agradecido
    merlinkv Autor
    Valoración Valoración: 7.69%  
  • 25 Jul 2019 15:07 Programación en C/C++ 25 Jul 2019 15:07 Programación en C/C++
    Bueno, parece que esto me va gustando :)

    Estoy instalando compiladores de C/C++ para empezar a trastear y por ahora, he instalado Lattice 5.02 y SAS/C 6.50

    El editor de Lattice (Golden ED v4) parece muy bueno y tiene reconocimiento de sintaxis. Pero creo que es bastante más sencillo de manejar el SAS/C.

    Al Lattice hay que crearle una caterva de ASSIGN en Startup-Sequence para que funcionen las cosas, que no es ni medio normal XD por llo menos para los que hace una semana sabemos que significa eso jajaja.

    ¿Alguien tiene experiencia en este tema? ¿Me recomienda algún procedimiento u otro compilador?

    Gracias chicos.
    1 Agradecido
    droman Autor
    Valoración Valoración: 7.69%  
  • 05 Sep 2019 13:46 Re: Proceso de fabricación de PCB 05 Sep 2019 13:46 Re: Proceso de fabricación de PCB
    Merlinkv Te lo agradezco :)

    He cambiado el circuito de prueba.... se me ha ocurrido hacer uno que pueda freir la red de mi casa... si no no tiene gracia.

    Un interruptor de Ethernet a través de Arduino.

    La idea es poder dejar sin acceso a internet a mis hijos, por ejemplo, para que no se conecten a internet sin mi permiso. El switch que tengo en casa no es de los baratitos, pero activar o desactivar un puerto es un latazo inconmensurable.

    Es muy simple (aquí viene donde arde todo) Dos conectores RJ45 donde cada cable (excesivo... lo sé) se habilita mediante un optoacoplador controlado por Arduino (el que uso para la domótica y que se maneja mediante WEB).

    Como véis. mi sistema cumple con el estándar Plug And Prey.

    Menos risas... que no tengo ni idea de electrónica a este nivel y es mi primer circuito hecho con KiCad.

    Editado: He corregido el texto y he puesto un jpg de la placa con los zócalos donde se aprecia la serigrafía un poco mejor.
    1 Agradecido
    droman Autor
    Valoración Valoración: 7.69%  
  • 24 Feb 2023 09:41 Re: Indiana Jones y la última Cruzada 24 Feb 2023 09:41 Re: Indiana Jones y la última Cruzada
    Pues perfecto. Pero si, esto de las protecciones es para volverse loco. Como el maldito amc. Siempre tropezamos con alguno que te da dolor de cabeza. :cabezazo2:
    Pero bueno. Asi al menos avanzamos mejor. Sino lo saca uno lo saca el otro. :agudo1:
    1 Agradecido
    DaRaSCo Autor
    Valoración Valoración: 7.69%  
  • 16 Sep 2019 13:21 Re: ¿Sorteo? 16 Sep 2019 13:21 Re: ¿Sorteo?
    ¡Felicidades droman!
    1 Agradecido
    merlinkv Autor
    Valoración Valoración: 7.69%  
  • 17 Ene 2023 21:52 Bombuzal 17 Ene 2023 21:52 Bombuzal
    https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/Bombuzal - 1988/Bombuzal - 1988_01.jpg


    Bombuzal tiene que hacer estallar bombas en pequeñas islas en este juego de rompecabezas. Para avanzar al siguiente nivel, todas las bombas deben detonar. Hay varios tamaños de bombas. Los más grandes tienen un radio de explosión tan grande que Bombuzal no puede dispararlos directamente; en cambio, primero tiene que explotar bombas más pequeñas y provocar una reacción en cadena. Entonces, como uno podría imaginar, los niveles posteriores se convierten en fuertes explosiones que deben planificarse cuidadosamente.

    Además, los niveles posteriores presentan todo tipo de peligros y trucos adicionales, como pisos de hielo, bombas móviles, baldosas que desaparecen y mucho más. Nadie dijo que ser un pirómano sea fácil.


    https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/Bombuzal - 1988/Bombuzal - 1988_02.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/Bombuzal - 1988/Bombuzal - 1988_03.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/Bombuzal - 1988/Bombuzal - 1988_04.jpg

    https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/Bombuzal - 1988/Bombuzal - 1988_05.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/Bombuzal - 1988/Bombuzal - 1988_06.jpg


    Año de lanzamiento: 1988
    Idiomas: Inglés
    Chipset: OCS-ECS
    Discos: 1
    Instalación HDD: No


    Bombuzal - 1988.7z Bombuzal - Manual.7z
    1 Agradecido
    merlinkv Autor
    Valoración Valoración: 7.69%  
  • 04 Mar 2023 15:25 North & South 04 Mar 2023 15:25 North & South
    https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_01.jpg


    Basado en el cómic belga, "Les Tuniques Bleues", este juego de estrategia te permite reproducir la Guerra Civil Estadounidense tanto desde el lado norte como desde el sur.

    En la parte de estrategia del juego, puedes mover tus tropas en un mapa de los EE. UU. Si dos ejércitos opuestos entran en el mismo estado, la batalla se desarrolla en una secuencia de acción. Se deben realizar secuencias de acción adicionales al capturar un fuerte o tren enemigo.

    El juego también ofrece un modo de dos jugadores.


    https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_02.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_03.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_04.jpg

    https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_05.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_06.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_07.jpg

    https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_08.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_09.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_10.jpg

    https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_11.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_12.jpg


    Año de lanzamiento: 1989
    Idiomas: Español , Inglés , Francés , Alemán e Italiano
    Chipset: OCS
    Discos: 1
    Instalación HDD: No


    North & South M5 - 1989.7z North & South - Docs.7z
    1 Agradecido
    merlinkv Autor
    Valoración Valoración: 7.69%  
  • 24 Oct 2019 01:17 De compras por la web 24 Oct 2019 01:17 De compras por la web
    El otro día compré un bonito lote al mismo vendedor al que compré el Commodore 128.

    Esta mañana llegó el paquete, todo perfectamente embalado, bueno, tengo que decir que este ordenador lo compré como averiado.
    Pero con esperanzas de que sea relativamente sencilla su reparación, ya que muestra vídeo y aparece en pantalla un mensaje de Out of memory error. Lo que apunta directamente a la Ram:

    Primero el unboxing.
    En una buena caja de cartón y debidamente protegido con papeles de periódico.

    IMG-024263682f4b77799f877e2bf786e7d7-V.jpg

    Lo primero que veo es que hay varias cajas de discos de los grandotes, :loco2: es una sorpresa ya que no sabía que los incluía en el lote.

    Los papeles de periódico no me dejan ver que más hay dentro de la caja, es hora de quitarlos.
    Y ya puedo sacar al pequeñín.

    IMG-12ecda8671732453169e52e4dd22177f-V.jpg

    Mi nueva adquisición una auténtica panera.
    Acompaña al lote el manual en ingles del ordenador, un complemento cojonudo.

    IMG-60478e19266921c8710cc070c0b1a667-V.jpg

    Pero vamos con los discos, que hay dentro de las cajas:

    IMG-dd770e65629973a902f9cd79d1209d30-V.jpg IMG-02baddb0e1a6b607a81495993a9e174b-V.jpg IMG-7e352a3599890843dcfbfc62df9bd3b8-V.jpg IMG-e5ee845498b8d807c08c03f92351ce6a-V.jpg

    Un total de 47 discos :loco4:
    Ahora si que si que tengo que comprar una disquetera.

    La panera viene dentro de una bolsa de plástico.

    IMG-4b43830d1675b21bd816f378c329972a-V.jpg

    Tiene muy buena pinta, además a este lote lo acompaña su fuente de alimentación, de las de cuña.

    IMG-0936f947e5b64ee5610d0fee2e12e90f-V.jpg

    Ahora toca ver su funcionamiento:

    IMG-137ede2829c7f1c737abec50549eff45-V.jpg

    Es lo que me comentó el vendedor, un mensaje de error y cuadraditos por la pantalla.
    Y con el cartucho de diagnóstico

    IMG-4bfcf243f613774768d3a667f96dd2ee-V.jpg

    Se para en la Ram, no queda duda, la Ram está frita.

    Continuará ................................................................................................
    1 Agradecido
    pintza Autor
    Valoración Valoración: 7.69%  
  • 28 Mar 2023 13:27 Re: Emulando un Amiga con WinUAE 28 Mar 2023 13:27 Re: Emulando un Amiga con WinUAE
    Me gusta ver las cosas bonitas... :burla1:
    1 Agradecido
    Pingui Autor
    Valoración Valoración: 7.69%  
  • 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%