From 396393cbc34bb4c164bda2a7808aeebf7156b6a3 Mon Sep 17 00:00:00 2001 From: bodhi-baum Date: Tue, 25 Feb 2020 15:48:21 +0100 Subject: [PATCH 001/143] Lies_mich_DE.txt German translation of readme.txt --- Lies_mich_DE.txt | 449 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 449 insertions(+) create mode 100644 Lies_mich_DE.txt diff --git a/Lies_mich_DE.txt b/Lies_mich_DE.txt new file mode 100644 index 00000000..3a0d3959 --- /dev/null +++ b/Lies_mich_DE.txt @@ -0,0 +1,449 @@ +Oricutron 1.2 +------------- + +(c)2009-2014 Peter Gordon (pete@petergordon.org.uk) + +This is a work in progress. + + +Aktueller status +============== + + 6502: 100% fertig (außer einigen unbekannten Fehlern :) + VIA: 95% fertig. + AY: 99% fertig. + Video: 100% fertig + Tape: 99% fertig (.TAP, .ORT und .WAV werden unterstützt) + Disk: Sektoren Lesen/Schreiben funktioniert. Lesen/Schreiben der Tracks geht nicht. + + + +Credits +======= + + Programmierung + ----------- + + Peter Gordon + + + Zusätzliche Programmierung + -------------------------- + + Francois Revol + Alexandre Devert + Stefan Haubenthal + Ibisum + Kamel Biskri + Iss + Christian from defence-force forum + + + Amiga & Windows Portierungen + ---------------------------- + + Peter Gordon + + + BeOS/Haiku Portierung + --------------------- + + Francois Revol + + + macOS Portierung + ---------------- + + Francois Revol + Kamel Biskri + Patrice Torguet + + + MorphOS & AROS Portierungen + --------------------------- + + Stefan Haubenthal + + + Linux Portierung + ---------------- + + Francois Revol + Ibisum + Alexandre Devert + + + Pandora Portierung + ------------------ + + Ibisum + + + ACIA & Pravetz Disk-Unterstützung + --------------------------------- + + Iss + + + CH376 Unterstützung + ------------------- + + Offset (cpc) & Jede + + +Danksagung +========== + +Danke an DBug und Twilighte, dass sie mich ihre Demos und Spiele mit Oricutron zusammen verteilen lassen. + +Danke an DBug, Twilighte, Chema, kamelito, Yicker, JamesD, Algarbi, ibisum, +jede, thrust26 und alle anderen für Ihre Hilfe und Ihr Feedback! + + + +AVI export notes +================ + +Der AVI Export nutzt den MRLE Codec. Vielleicht unterstützt dein Spieler der Wahl diesen nicht, aber MPlayer spielt ihn, ffmpeg konvertiert es, sodass du es direkt nach Youtube laden kannst. + +Beachte, dass der MRLE Codec bei dem Amiga OS4 Port des MPlayer ein paar Probleme mit Endian hat, sodass der Ton irgendwie schrottig rüberkommt und falsche Farben hat bis das im MPLayer behoben ist. :-( + + +Kommandozeile +============= + +Sie können bestimmte Optionen auf der Befehlszeile angeben. Alle Optionen haben +sowohl kurze als auch lange Versionen. Zum Beispiel: + + -mblah + + oder + + --machine blah + +ist dasselbe. Beachte, dass die Kurzversion kein Leerzeichen, die Lange aber schon eins hat. + +Hier sind alle Optionen: + + + -m / --machine = Lege Systemtyp fest. Diese sind: + + "atmos" oder "a" für Oric atmos + "oric1" oder "1" für Oric-1 + "o16k" für Oric-1 16k + "telestrat" oder "t" für Telestrat + "pravetz", "pravetz8d" oder "p" für Pravetz 8D + + -d / --disk = Wähle ein Disk Image zur Nutzung in Laufwerk 0 + -t / --tape = Wähle ein Tape Image + -k / --drive = Wähle einen Disk Drive Controller. Diese sind: + + "microdisc" oder "m" für Microdisc + "jasmin" oder "j" für Jasmin + + -s / --symbols = Lade Symbole aus einer Datei + -f / --fullscreen = Starte Oricutron im Vollbild-Modus + -w / --window = Starte Oricutron in einem Fenster + -R / --rendermode = Rendermodus. Diese sind: + + "soft" Software rendering + "opengl" OpenGL + + -b / --debug = Start Oricutron im Debugger + -r / --breakpoint = Setze einen Breakpoint (Siehe Hinweis 2) + -h / --help = Aktiviere Kommandozeilen-Hilfe und Programm beenden + + --turbotape on|off = Aktiviere oder deaktiviere Turbotape + --lightpen on|off = Aktiviere oder deaktiviere Lichtgriffel + --vsynchack on|off = Aktiviere oder deaktiviere VSync hack + --scanlines on|off = Aktiviere oder deaktiviere Scanline Simulation + + --serial_address N = Setze die Adresse der seriellen Karte auf N (default ist $31C) + N liegt dezimal oder hexadezimal innerhalb des Bereiches $31c..$3fc + (i.e. 796, 0x31c, $31C repräsentiert den gleichen Wert) + + --serial = Set serial card back-end emulation: + 'none' - keine serielle Karte + 'loopback' - zum Testen - alle TX Daten werden an RX zurück gegeben + 'modem[:port]' - emuliert einen Com-Port mit angeschlossenem Modem, nur wenige AT Kommandos werden unterstützt und Daten werden an TCP umgeleitet. Default Port ist 23 (telnet) + + 'com:115200,8,N,1,' - nutzt reale oder virtuelle beim Host als emuliertes ACIA. + Baudrate, data bits, Parität und Stop bits können nach Bedarf verändert werden + Bsp.: Windows: 'com:115200,8,N,1,COM1' + Linux: 'com:19200,8,N,1,/dev/ttyS0' + 'com:115200,8,N,1,/dev/ttyUSB0' + +BEACHTE: Falls Sie nicht sicher sind, welchen Rechner oder welchen Laufwerkstyp ein Disk- oder Tapeimage benötigt, geben Sie den Dateinamen ohne weitere Optionen ein und Oricutron wird es selbst versuchen. + +Beachte 2: Listen mit vielen Breakpoints können von der Kommandozeile geladen werden. Nutze die standardmässigen Schalter -r oder --breakpoint, +aber anstelle einer Adresse gebe Präfixe für die Dateinamen mit ':' an. Die Datei ist eine Textdatei, die notwendige Breakpoint-Adressen enthält - eine pro Zeile, mit der selben Syntax wie am Monitor. Breakpoints können mit absoluten Adressen oder mit Symbolen (-s oder --symbols) geladen werden. + +Beispiele: + +oricutron tapes/tape_image.tap +oricutron disks/disk_image.dsk +oricutron --machine atmos --tape "tape files/foo.tap" --symbols "my files/symbols" +oricutron -m1 -tBUILD/foo.tap -sBUILD/symbols -b +oricutron --drive microdisc --disk demos/barbitoric.dsk --fullscreen +oricutron -ddemos/barbitoric.dsk -f +oricutron --turbotape off tapes/hobbit.tap +oricutron -s myproject.sym -r :myprojectbp.txt + + +Schlüssel +========= + + Im Emulator + ----------- + + F1 - Zeigt Menü + F2 - Gehe zum Debugger/Monitor + F3 - Reset (NMI) + F4 - Harter Reset + Shift+F4 - Jasmin Reset + F5 - Schalte FPS um + F6 - Toggle warp speed + F7 - Speichere alle veränderten Disks + Shift+F7 - Speichere alle veränderten Disks in neuen Disk Images + F8 - Toggle Vollbild + F9 - Speichere Kassettenausgabe + F10 - Start/Stop AVI Aufnahme + F11 - Kopiere Bildschirm in Zwischenablage (BeOS, Linux & Windows) + F12 - Einfügen (BeOS, Linux & Windows) + Help - Zeige Hilfe (Amiga, MorphOS and AROS) + AltGr - Zusätzlicher Modifizierer + + + In Menüs + -------- + + Cursors - Navigiere + Enter - Führe Befehl aus + Backspace - Gehe zurück + Escape - Verlasse Menüs + (oder benutz die Maus) + + + Im Debugger/Monitor + ------------------- + + F1 - Gehe zum Menü + F2 - Zurück zum Emulator + F3 - Wechsle zwischen Konsole/Debug Ausgabe/Speicherbeobachtung + F4 - Wechsle zwischen VIA/AY/Disk-Information + F9 - Setze Zyklus-Zählung neu + F10 - Step over code + F11 - Step over code ohne Rückverfolgung in Unterroutinen. + F12 - Überspringe Instruktion + + + In der Konsole: + --------------- + + Up/Down - Befehls-Historie + + + In memwatch: + ------------ + + Up/Down - Scrollen (+shift zum seitenweisen Scrollen) + Page Up/Page Down - Seite hoch/runter + Hex digits - Gebe Addresse ein + S - Toggle split mode + Tab - Bringe Fenster in split mode + + + +Monitor Instruktionen +===================== + +Im Monitor sind numerische Argumente standardmäßig dezimal, oder haben ein vorangestelltes $ für hex oder % für binär. Fast alles wird in hex ausgegeben. + +Fast immer, wenn eine Zahl oder Adresse eingegeben werden kann, kann auch ein CPU- oder VIA-Register genommen werden. (VIA-Register sind Vordefiniert mit V, Z.B. VDDRA). Überall wo eine Adresse angegeben werden kann, kann auch ein Syymbol verwendet werden. + +Befehle: + + ? - Hilfe + a - Assembliere + bc - Leere Breakpoint + bcm - Leere mem Breakpoint + bl - Liste Breakpoints auf + blm - List mem Breakpoints + bs [zc] - Setze Breakpoint + bsm [rwc] - Setze mem Breakpoint + bz - Zap Breakpoints + bzm - Zap mem Breakpoints + d - Disassembliere + df - Disassembliere zu Datei + m - Dump memory + mm - Modifiziere Memory + mw - Beobachte Memory an addr + nl - Lade Snapshot + ns - Speichere Snapshot + r - Setze zu + q, x or qm - Beende Monitor + qe - Beende Emulator + sa - Füge user symbol hinzu oder bewege es + sk - Eliminiere user symbol + sc - Symbole nicht case-sensitive + sC - Symbole case-sensitive + sl - Lade user symbols + sx - Exportiere user symbols + sz - Zap user symbols + wm - Schreibe mem auf Disk + + + +Breakpoints +=========== + +Es gibt zwei Arten von Breakpoints. "Normale" Breakpoints werden ausgelöst, wenn die CPU +im Begriff ist, eine Anweisung an der Breakpoint-Adresse auszuführen. "Speicher" Breakpoints. +auslösen, wenn auf die Breakpoint-Adresse zugegriffen oder diese geändert wird. + +Normale Haltepunkte können 'z'- und/oder 'c'-Modifikatoren verwenden. +bs $0c00 <-- Pause, wenn die CPU im Begriff ist, Code bei $0c00 auszuführen. +bs $0c00 z <-- Pause, wenn die CPU im Begriff ist, Code bei $0c00 auszuführen + und setzen Sie den Zykluszähler auf 0 +bs $0c00 zc <-- Setzen Sie den Zykluszähler auf 0 und fahren Sie fort +bs $0c00 c <-- Setzt die Ausführung fort (d.h. deaktivierter Haltepunkt) + +Der Hauptzweck dieser Modifikatoren ist es, das Zählen der Zyklen zu erleichtern. +Wenn Symbole geladen sind, können sie anstelle von absoluten Adressen verwendet werden. + +Es gibt drei Möglichkeiten, wie ein Speicherbreakpoint ausgelöst werden kann; wenn die CPU etwa +um die Adresse (r) zu lesen, und die CPU dabei ist, die Adresse (w) zu schreiben, oder sich der Wert an der Adresse aus irgendeinem Grund ändert (c). + +Sie geben an, auf welche Weise der Breakpoint beim Setzen des Speichers ausgelöst werden soll + +Haltepunkt: + +bsm $0c00 r <-- Pause, wenn die CPU im Begriff ist, von $0c00 zu lesen +bsm $0c00 rw <-- Pause, wenn die CPU im Begriff ist, auf $0c00 zuzugreifen +bsm $0c00 c <-- Pause nach dann Inhalt von $0c00 ändern +bsm $0c00 rwc <-- Pause kurz bevor die CPU auf $0c00 zugreift, oder kurz danach + Änderungen aus irgendeinem Grund. + + +Internationale Tastaturen unter Linux und macOS +=============================================== + +Es gibt viele Probleme mit einigen internationalen Tastaturen unter Linux +und MacOS. Der beste Weg, mit ihnen fertig zu werden, ist die Installation eines UK- oder US Tastaturdefinition und zum Umschalten darauf *vor* dem Start von oricutron. + +Unter MacOS können Sie das in den "Systemeinstellungen", "Tastatur", "Eingabe Quellen". Klicken Sie auf das + und suchen Sie nach der britischen oder US-amerikanischen Tastatur. + +Unter Ubuntu können Sie dies im Menü System tun, indem Sie Präferenzen wählen und dann wählen Sie Tastatur. Wählen Sie im Dialogfeld Tastatureinstellungen die Option Layouts, und klicken Sie auf Hinzufügen. + +Eine bessere Lösung finden Sie unter "Visuelle Tastatur" hier unten. + + + +Virtuelle Tastatur +================== + +Oricutron kann eine visuelle Tastatur anzeigen, die auch eine Funktion zur Neudefinition der Tastaturbelegung enthält. + +Sie ist über ein Untermenü namens "Tastatur-Optionen" zugänglich. + +In diesem Untermenü finden Sie: + +- einen Umschalter, der die visuelle Tastatur ein-/ausblendet (Sie können auf die Tasten der Tastatur klicken, um Tastendrücke/Freigaben einzugeben) ; +- einen Umschalter, der Sie in den Modus zur Definition der Tastenbelegung bringt (Sie können dann auf eine Taste der visuellen Tastatur klicken; drücken Sie eine echte Taste auf Ihrer Tastatur und die Belegung wird funktionieren) ; +- ein Umschalter, der es erlaubt, Mod-Tasten (Strg, Umschalt, Funktion) zu klemmen (d.h. Sie klicken zuerst auf eine Taste, um sie zu drücken, und klicken dann entweder erneut darauf, um sie zu lösen, oder Sie klicken auf eine andere Taste, und es wird ein modifizierter Tastendruck erzeugt - z.B. ein Strg-T statt T - und dann die Taste automatisch loslassen) ; +- eine Option zum Speichern einer Tastaturbelegung (.kma-Datei) ; +- eine Option, um eine Tastaturbelegung zu laden; +- eine Option, die die Tastaturbelegung auf die Standard-Tastaturbelegung zurücksetzt. + +Sie können auch das Folgende in Ihrer oricutron.cfg hinzufügen, um eine Tastatur automatisch zu laden +Mapping (hier Test.kma im Keymap-Verzeichnis, das im Verzeichnis von Oricutron gefunden wurde): + +; lädt automatisch eine Tastaturbelegungsdatei +autoload_keyboard_mapping = 'keymap/Test.kma + +Mit anderen Optionen können Sie die Tastatur anzeigen lassen und automatisch sticky Mod-Tasten aktivieren: +show_keyboard = ja +sticky_mod_keys = ja + + +Emulation der seriellen Karte (ACIA) +==================================== + +Oricutron kann ACIA an der Adresse #31C (Standardadresse für Telestrat) emulieren. +Die Emulation funktioniert für Oric, Atmos, Telestrat und Pravetz und kann zusammen mit einem beliebigen Plattentyp verwendet werden. + +Die emulierte ACIA kommuniziert mit der Außenwelt über Back-Ends. +Back-Ends können in der 'oricutron.cfg' oder über die Befehlszeile konfiguriert werden. +(siehe Standard 'oricutron.cfg' für die Verwendung). + +Back-Ends sind: +- keine - deaktiviert die ACIA-Unterstützung +- Loopback - jedes gesendete Byte wird in den Empfangspuffer zurückgeschickt (zu Testzwecken) +- com - Oricutron verwendet einen beliebigen realen oder virtuellen COM-Port im Host-Rechner und kommuniziert mit der an diesen seriellen Port angeschlossenen Hardware. +- Modem - vereint ACIA mit angeschlossenem Modem, das mit dem Internet verbunden ist, mit Server- und Client-Steckdosen + +Im 'Modem'-Modus sind folgende 'AT'-Befehle verfügbar: +AT - gibt 'OK' zurück +ATZ - das Modem initialisieren +AT&F - das Modem initialisieren +ATS0=0 - automatische Anrufbeantwortung ausschalten (trennende Steckdose schließen) +ATS0=1 - automatische Anrufbeantwortung aktivieren (Öffnen Sie den Socket und beginnen Sie das Abhören auf dem ausgewählten Port (Standard ist Telnet-Port 23)) +ATA - gleich wie 'ATS0=1'. +ATS0? - liefert 'AUTOANSWER OFF' oder 'AUTOANSWER ON' je nach aktuellem Status der einzelnen Sockets +ATH0 - aktuell angeschlossene Steckdosen trennen ++++ - wenn angeschlossen, schaltet in den Befehlsmodus +ATO - kehrt vom Befehlsmodus in den Online-Modus zurück +ATD ip:port - verbindet sich als Client mit ip:port. 'ip' kann ein beliebiger Hostname (z.B.:localhost) oder die echte IP (z.B.:127.0.0.1) im LAN oder im Internet sein. ATDP und ATDT sind aus Kompatibilitätsgründen eine Alternative. + +Emulation der CH376-Karte +========================= + +Oricutron läuft mit dem Chip ch376. Dieser Chip ist in der Lage, eine sdcard und einen usbkey (und USB-Anschluss) zu lesen. Dieser Chip verarbeitet FAT32. usbdrive/ Ordner ist der CH376 Emulationsordner. Das bedeutet, dass, wenn der ch376 usbkey lesen soll, liest er in diesem Ordner. Bitte beachten Sie, dass Lesen/Schreiben emuliert wird (siehe unten für den emulierten Befehl ch376). Bitte beachten Sie zudem, dass die Emulation nur im Telestrat-Modus funktioniert. Unter Atmos läuft dieser Chip zwar, aber die ROMs wurde noch nicht freigegeben (und auch die Karte mit den ROMs noch nicht). + +Orix (http://orix.oric.org) arbeitet hauptsächlich mit diesem Chip. Bitte verändern Sie die ch376-Emulation nicht: Kontaktieren Sie Jede (jede@oric.org), weil diese Emulation auch im ACE-Emulator (cpc-Emulation) verwendet wird. Offset und ich versuchen hier, dieselbe Emulation zu nutzen. Es ist einfacher, zusammen zu arbeiten als allein. + +CH376 Befehl emuliert : +- CH376_CMD_GET_IC_VER +- CH376_CMD_CHECK_EXIST +- CH376_CMD_SET_USB_MODE +- CH376_CMD_GET_STATUS +- CH376_CMD_RD_USB_DATA0 +- CH376_CMD_WR_REQ_DATA +- CH376_CMD_SET_FILE_NAME +- CH376_CMD_DISK_MOUNT +- CH376_CMD_FILE_OPEN +- CH376_CMD_FILE_ENUM_GO +- CH376_CMD_FILE_CREATE +- CH376_CMD_FILE_ERASE (unter Linux nicht emuliert) +- CH376_CMD_DATEI_CLOSE +- CH376_CMD_BYTE_LOCATE +- CH376_CMD_BYTE_READ +- CH376_CMD_BYTE_RD_GO +- CH376_CMD_BYTE_WRITE +- CH376_CMD_BYTE_WR_GO +- CH376_CMD_DISK_QUERY +- CH376_CMD_DIR_CREATE (unter Linux nicht emuliert) +- CH376_CMD_DISK_RD_GO + +Bekannter Fehler : +Unter Windows sendet die API-Datei keine "." und "..."-Einträge, wenn der Inhalt des Ordners gelesen wird. Das ist ein Problem, weil der ch376-Chip diese Einträge sendet, wenn der Chip den Inhalt eines Verzeichnisses lesen soll. + +Wenn jemand CH376_CMD_DIR_CREATE und CH376_CMD_FILE_ERASE emulieren möchte ist das einfach zu machen: man muss nur die WIN32-Funktion kopieren, das DeleteFile ersetzen und CreateDir mit rm() und mkdir(). Aber es wird nicht gemacht, weil wir nicht in der Lage sind, es zu testen. + +CH376-Emulation hinzugefügt für : +CH376_CMD_FILE_ERASE unterdrückt eine Datei +CH376_CMD_DIR_CREATE Ordner erstellen + +ROM-Patch-Dateien +================= + +Für die detaillierte Verwendung siehe die enthaltenen '.pch'-Dateien im Unterverzeichnis roms. + +Zusätzlich kann eine unbegrenzte Anzahl von binären Patches hinzugefügt werden: + +$XXXX:00112233445566778899AABBCCDDEEFF.... +$YYYYY:AA55AA55..... +$ZZZZ:FF00FF00..... + +wobei XXXX,YYYYY,ZZZZ - hexadezimale Adressen relativ zur ROM-Startadresse sind +(d.h. um Byte bei C000 auf 00 zu setzen, verwenden Sie: $0000:00) From a6e63d003f580721cd674b77ea375f1ae6759af1 Mon Sep 17 00:00:00 2001 From: jede Date: Wed, 22 Apr 2020 00:36:52 +0200 Subject: [PATCH 002/143] Now registers from twilighte board answers --- machine.c | 9 +++ .../oric_twilighte_board_plugin.c | 68 +++++++++++++++++++ .../oric_twilighte_board_plugin.h | 3 + plugins/twilighte_card/twilighte.cfg | 4 ++ 4 files changed, 84 insertions(+) create mode 100644 plugins/twilighte_card/oric_twilighte_board_plugin.c create mode 100644 plugins/twilighte_card/oric_twilighte_board_plugin.h create mode 100644 plugins/twilighte_card/twilighte.cfg diff --git a/machine.c b/machine.c index 7a66a7cb..c39485c3 100644 --- a/machine.c +++ b/machine.c @@ -46,6 +46,8 @@ #include "plugins/ch376/ch376.h" #include "plugins/ch376/oric_ch376_plugin.h" +#include "plugins/twilighte_card/oric_twilighte_board_plugin.h" + #include "machine.h" #include "avi.h" #include "filereq.h" @@ -396,6 +398,7 @@ void telestratwrite( struct m6502 *cpu, unsigned short addr, unsigned char data ch376_oric_write(oric->ch376, addr, data); break; } + default: via_write( &oric->via, addr, data ); @@ -638,6 +641,9 @@ unsigned char atmosread( struct m6502 *cpu, unsigned short addr ) if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) return ch376_oric_read(oric->ch376, addr); + if( (0x342 <= addr ) && ( addr < 0x344 ) ) + return twilighteboard_oric_read(oric->twilighte,addr); + return via_read( &oric->via, addr ); } @@ -1207,6 +1213,7 @@ SDL_bool emu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) if (oric->ch376 != NULL) ch376_oric_config(oric->ch376); } + oric->twilighte=twilighte_oric_init(); break; @@ -1835,6 +1842,8 @@ SDL_bool init_machine( struct machine *oric, int type, SDL_bool nukebreakpoints ch376_oric_config(oric->ch376); } + oric->twilighte = twilighte_oric_init(); + ay_init( &oric->ay, oric ); joy_setup( oric ); oric->cpu.rastercycles = oric->cyclesperraster; diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c new file mode 100644 index 00000000..7b690274 --- /dev/null +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -0,0 +1,68 @@ + +#define TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER 0x342 +#define TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER 0x343 + +#include +#include +#include +#include +#include +#include +#include + + +struct twilbankinfo +{ + unsigned char type; + unsigned char *ptr; +}; + +struct twilighte +{ + + unsigned char t_register; + unsigned char t_banking_register; + struct twilbankinfo rom_bank[32]; + struct twilbankinfo ram_bank[32]; +}; + +struct twilighte * twilighte_oric_init(void) +{ + //struct twilighte * temp; + //temp=malloc(sizeof(struct twilighte *)); + struct twilighte *twilighte = malloc(sizeof(struct twilighte)); + twilighte->t_banking_register=0; + twilighte->t_register=128+1; + return twilighte; +} + + +unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t addr) +{ + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) + { + return twilighte->t_register; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) + { + return twilighte->t_banking_register; + } + + return 0; +} + +unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t addr, unsigned char data) +{ + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) + { + twilighte->t_register=data; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) + { + twilighte->t_banking_register=data; + } + + return 0; +} diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.h b/plugins/twilighte_card/oric_twilighte_board_plugin.h new file mode 100644 index 00000000..751e6259 --- /dev/null +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.h @@ -0,0 +1,3 @@ + +struct twilighte * twilighte_oric_init(void); +unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t addr); \ No newline at end of file diff --git a/plugins/twilighte_card/twilighte.cfg b/plugins/twilighte_card/twilighte.cfg new file mode 100644 index 00000000..02ee24da --- /dev/null +++ b/plugins/twilighte_card/twilighte.cfg @@ -0,0 +1,4 @@ +twilbankrom7=kernel +twilbankrom6=basic11 +twilbankrom5=shell + From 9f1d351462433307ed1478289c8b9624b580b064 Mon Sep 17 00:00:00 2001 From: jede Date: Wed, 22 Apr 2020 00:40:39 +0200 Subject: [PATCH 003/143] Fix indent --- plugins/twilighte_card/oric_twilighte_board_plugin.c | 4 ++-- plugins/twilighte_card/oric_twilighte_board_plugin.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c index 7b690274..8bc5b5bd 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -1,6 +1,6 @@ -#define TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER 0x342 -#define TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER 0x343 +#define TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER 0x342 +#define TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER 0x343 #include #include diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.h b/plugins/twilighte_card/oric_twilighte_board_plugin.h index 751e6259..404eaa8e 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.h +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.h @@ -1,3 +1,3 @@ -struct twilighte * twilighte_oric_init(void); -unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t addr); \ No newline at end of file +struct twilighte * twilighte_oric_init(void); +unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t addr); \ No newline at end of file From 13fef5215049c2733d01b3fa8b24926aae5c689e Mon Sep 17 00:00:00 2001 From: jede Date: Mon, 27 Apr 2020 00:34:38 +0200 Subject: [PATCH 004/143] Add for twilighteboard emulation --- machine.h | 1 + 1 file changed, 1 insertion(+) diff --git a/machine.h b/machine.h index a71555f9..60d7b43a 100644 --- a/machine.h +++ b/machine.h @@ -102,6 +102,7 @@ struct machine struct via tele_via; struct acia tele_acia; struct ch376 *ch376; + struct twilighte *twilighte; SDL_bool ch376_activated; int tele_currbank; unsigned char tele_banktype; From 3fdc976eb5da437db62fe1b1da0c95ae632fcfb5 Mon Sep 17 00:00:00 2001 From: jede Date: Mon, 27 Apr 2020 00:35:09 +0200 Subject: [PATCH 005/143] Now we can read filenames for banks --- .../oric_twilighte_board_plugin.c | 52 ++++++++++++++++++- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c index 8bc5b5bd..dcd97344 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -2,6 +2,8 @@ #define TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER 0x342 #define TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER 0x343 + + #include #include #include @@ -11,6 +13,12 @@ #include +#include "../../system.h" + +extern SDL_bool read_config_string( char *buf, char *token, char *dest, Sint32 maxlen ); + + + struct twilbankinfo { unsigned char type; @@ -22,17 +30,57 @@ struct twilighte unsigned char t_register; unsigned char t_banking_register; - struct twilbankinfo rom_bank[32]; - struct twilbankinfo ram_bank[32]; + char twilrombankfiles[32][1024]; + char twilrombankdata[32][16834]; + //struct twilbankinfo rom_bank[32]; + //struct twilbankinfo ram_bank[32]; }; +char twilrombankfiles[100][1024]; + struct twilighte * twilighte_oric_init(void) { //struct twilighte * temp; //temp=malloc(sizeof(struct twilighte *)); + char twilrombankfiles[32][1024]; + FILE *f; + unsigned int i, j; + char tbtmp[32]; + char line[1024]; struct twilighte *twilighte = malloc(sizeof(struct twilighte)); twilighte->t_banking_register=0; twilighte->t_register=128+1; + + f = fopen( "plugins/twilighte_card/twilighte.cfg", "r" ); + if( !f ) { + error_printf( "plugins/twilighte_card/twilighte.cfg not found\n" ); + return NULL; + } + + for( j=1; j<31; j++ ) strcpy(twilighte->twilrombankfiles[j],"hello"); + while( !feof( f ) ) + { + fgets( line, 1024, f ); + //error_printf( line ); + for( j=1; j<31; j++ ) + { + sprintf( tbtmp, "twilbankrom%c", j+'0' ); + if( read_config_string( line, tbtmp, twilighte->twilrombankfiles[j], 1024 ) ) + { + //error_printf( line ); + error_printf("File: %d %s",j,twilighte->twilrombankfiles[j]); + + break; + } + + } + } + + fclose( f ); + +/* + +*/ return twilighte; } From 775ddd7da4e64e0fc4f0e07397089a468a67d4b6 Mon Sep 17 00:00:00 2001 From: jede Date: Mon, 27 Apr 2020 00:52:54 +0200 Subject: [PATCH 006/143] Now rom are loaded --- .../oric_twilighte_board_plugin.c | 74 ++++++++++++++++++- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c index dcd97344..2faa079b 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -16,8 +16,61 @@ #include "../../system.h" extern SDL_bool read_config_string( char *buf, char *token, char *dest, Sint32 maxlen ); - +///extern SDL_bool load_rom( struct machine *oric, char *fname, int size, unsigned char *where, struct symboltable *stab, int symflags ); +static SDL_bool load_rom_twilighte( char *fname, int size, unsigned char *where ) +{ + SDL_RWops *f; + char *tmpname; + + // MinGW doesn't have asprintf :-( + tmpname = malloc( strlen( fname ) + 10 ); + if( !tmpname ) return SDL_FALSE; + + sprintf( tmpname, "%s.rom", fname ); + f = SDL_RWFromFile( tmpname, "rb" ); + if( !f ) + { + error_printf( "Unable to open '%s'\n", tmpname ); + free( tmpname ); + return SDL_FALSE; + } + + if( size < 0 ) + { + int filesize; + SDL_RWseek( f, 0, SEEK_END ); + filesize = SDL_RWtell( f ); + SDL_RWseek( f, 0, SEEK_SET ); + + if( filesize > -size ) + { + error_printf( "ROM '%s' exceeds %d bytes.\n", fname, -size ); + SDL_RWclose( f ); + free( tmpname ); + return SDL_FALSE; + } + + where += (-size)-filesize; + size = filesize; + } + + if( SDL_RWread( f, where, size, 1 ) != 1 ) + { + error_printf( "Unable to read '%s'\n", tmpname ); + SDL_RWclose( f ); + free( tmpname ); + return SDL_FALSE; + } + + SDL_RWclose( f ); + + sprintf( tmpname, "%s.sym", fname ); + //mon_new_symbols( stab, oric, tmpname, symflags, SDL_FALSE, SDL_FALSE ); + free( tmpname ); + + return SDL_TRUE; +} struct twilbankinfo { @@ -32,7 +85,7 @@ struct twilighte unsigned char t_banking_register; char twilrombankfiles[32][1024]; char twilrombankdata[32][16834]; - //struct twilbankinfo rom_bank[32]; + struct twilbankinfo rom_bank[32]; //struct twilbankinfo ram_bank[32]; }; @@ -57,7 +110,7 @@ struct twilighte * twilighte_oric_init(void) return NULL; } - for( j=1; j<31; j++ ) strcpy(twilighte->twilrombankfiles[j],"hello"); + while( !feof( f ) ) { fgets( line, 1024, f ); @@ -78,6 +131,21 @@ struct twilighte * twilighte_oric_init(void) fclose( f ); + // Now load rom + for( i=1; i<31; i++ ) + { + +// oric->rom = oric->tele_bank[i].ptr = &oric->mem[0x0c000+(i*0x4000)]; + if( twilighte->twilrombankfiles[i][0] ) + { + //oric->tele_bank[i].type = TELEBANK_ROM; + if( !load_rom_twilighte( twilighte->twilrombankfiles[i], -16384, &twilighte->rom_bank[i].ptr ) ) return SDL_FALSE; + //load_patches( oric, telebankfiles[i] ); + //} else { + //oric->tele_bank[i].type = TELEBANK_RAM; + //} + } + } /* */ From 43691925c78ef184076df72b30e8845b8559dc0f Mon Sep 17 00:00:00 2001 From: jede Date: Mon, 27 Apr 2020 01:20:26 +0200 Subject: [PATCH 007/143] It starts but it crash with kernel.rom (bank 0 : ram is not emulated yet) --- Makefile | 22 +++--- machine.c | 13 +++- machine.h | 1 + main.c | 1 + oricutron.cfg | 1 + .../oric_twilighte_board_plugin.c | 76 ++++++++++++++----- plugins/twilighte_card/twilighte.cfg | 6 +- 7 files changed, 84 insertions(+), 36 deletions(-) diff --git a/Makefile b/Makefile index 47ed512f..00ac8dd6 100644 --- a/Makefile +++ b/Makefile @@ -42,7 +42,7 @@ VERSION_COPYRIGHTS = "$(APP_NAME) $(VERSION_FULL) $(COPYRIGHTS)" ####### DEFAULT SETTINGS HERE ####### SRC_DIR = . -VPATH = $(SRC_DIR) $(SRC_DIR)/plugins/ch376 +VPATH = $(SRC_DIR) $(SRC_DIR)/plugins/ch376 $(SRC_DIR)/plugins/twilighte_card ### extract git/svn revision GITREVISION = $(shell git rev-parse --short HEAD || svnversion -n $(SRC_DIR)) @@ -150,7 +150,7 @@ LFLAGS += `$(SDL_LIB)-config --libs` -s FILEREQ_OBJ = filereq_amiga.o MSGBOX_OBJ = msgbox_os2.o AMIGA_ICONS = pngicon -EXTRAOBJS = plugins/ch376/oric_ch376_plugin.o plugins/ch376/ch376.o +EXTRAOBJS = plugins/ch376/oric_ch376_plugin.o plugins/ch376/ch376.o oric_plugins/twilighte_card/twilighte_board_plugin.o endif # AROS @@ -240,7 +240,7 @@ TARGET_DEPS = /usr/$(CROSS_PREFIX)/sys-root/mingw/bin/SDL.dll FILEREQ_OBJ = filereq_win32.o MSGBOX_OBJ = msgbox_win32.o CUSTOMOBJS = gui_win.o winicon.o -EXTRAOBJS = oric_ch376_plugin.o ch376.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_ch376_plugin.o oric_twilighte_board_plugin.o endif # Windows 64bit GCC @@ -287,7 +287,7 @@ TARGET_DEPS = /usr/$(CROSS_PREFIX)/sys-root/mingw/bin/SDL.dll FILEREQ_OBJ = filereq_win32.o MSGBOX_OBJ = msgbox_win32.o CUSTOMOBJS = gui_win.o winicon.o -EXTRAOBJS = oric_ch376_plugin.o ch376.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o endif # BeOS / Haiku @@ -311,7 +311,7 @@ INSTALLDIR = /boot/apps/Oricutron FILEREQ_OBJ = MSGBOX_OBJ = CUSTOMOBJS = gui_beos.o msgbox_beos.o filereq_beos.o -EXTRAOBJS = plugins/ch376/oric_ch376_plugin.o plugins/ch376/ch376.o +EXTRAOBJS = plugins/ch376/oric_ch376_plugin.o plugins/twilighte_card/oric_twilighte_board_plugin.o BEOS_BERES := beres BEOS_RC := rc BEOS_XRES := xres @@ -338,7 +338,7 @@ TARGET = $(TARGET_NAME) FILEREQ_OBJ = MSGBOX_OBJ = CUSTOMOBJS = gui_osx.o filereq_osx.o msgbox_osx.o -EXTRAOBJS = plugins/ch376/oric_ch376_plugin.o plugins/ch376/ch376.o +EXTRAOBJS = plugins/ch376/oric_ch376_plugin.o plugins/ch376/ch376.o plugins/twilighte_card/oric_twilighte_board_plugin.o endif @@ -379,7 +379,7 @@ endif CFLAGS += -g $(shell PKG_CONFIG_PATH=/usr/$(BASELIBDIR)/pkgconfig pkg-config $(SDL_LIB) --cflags) -D__OPENGL_AVAILABLE__ -DAUDIO_BUFLEN=1024 -D__CBCOPY__ -D__CBPASTE__ LFLAGS += -lm -L/usr/$(BASELIBDIR) $(shell PKG_CONFIG_PATH=/usr/$(BASELIBDIR)/pkgconfig pkg-config $(SDL_LIB) --libs) -lGL -lX11 CUSTOMOBJS = gui_x11.o -EXTRAOBJS = oric_ch376_plugin.o ch376.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o TARGET = oricutron INSTALLDIR = /usr/local endif @@ -399,7 +399,7 @@ endif CFLAGS += -g $(SDL_CFLAGS) -D__OPENGL_AVAILABLE__ -DAUDIO_BUFLEN=1024 -D__CBCOPY__ -D__CBPASTE__ LFLAGS += -lm -L/usr/$(BASELIBDIR) $(SDL_LFLAGS) -lGL -lX11 CUSTOMOBJS = gui_x11.o -EXTRAOBJS = oric_ch376_plugin.o ch376.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o TARGET = $(TARGET_NAME) INSTALLDIR = /usr/local endif @@ -419,7 +419,7 @@ endif CFLAGS += -g $(SDL_CFLAGS) -D__OPENGL_AVAILABLE__ -DAUDIO_BUFLEN=1024 -D__CBCOPY__ -D__CBPASTE__ LFLAGS += -lm -L/usr/$(BASELIBDIR) $(SDL_LFLAGS) -lGL -lX11 CUSTOMOBJS = gui_x11.o -EXTRAOBJS = oric_ch376_plugin.o ch376.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o TARGET = $(TARGET_NAME) INSTALLDIR = /usr/local endif @@ -440,7 +440,7 @@ STRIP := $(CROSS_COMPILE)$(STRIP) CFLAGS += -g $(shell PKG_CONFIG_PATH=/usr/$(BASELIBDIR)/pkgconfig pkg-config $(SDL_LIB) --cflags) $(shell PKG_CONFIG_PATH=/usr/$(BASELIBDIR)/pkgconfig pkg-config gtk+-3.0 --cflags) -D__CBCOPY__ -D__CBPASTE__ LFLAGS += -lm -L/usr/$(BASELIBDIR) $(shell PKG_CONFIG_PATH=/usr/$(BASELIBDIR)/pkgconfig pkg-config $(SDL_LIB) --libs) $(shell PKG_CONFIG_PATH=/usr/$(BASELIBDIR)/pkgconfig pkg-config gtk+-3.0 --libs) -lX11 CUSTOMOBJS = gui_x11.o -EXTRAOBJS = oric_ch376_plugin.o ch376.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o FILEREQ_OBJ = filereq_gtk.o MSGBOX_OBJ = msgbox_gtk.o TARGET = oricutron @@ -504,7 +504,7 @@ AR = $(SDK_PREFIX)-ar RANLIB = $(SDK_PREFIX)-ranlib CFLAGS += `$(SDK_HOME)/env/bin/$(SDL_LIB)-config --cflags` LFLAGS += -Wl,--stack,256k -Wl,--msuper-memory -lm `$(SDK_HOME)/env/bin/$(SDL_LIB)-config --libs` -EXTRAOBJS = oric_ch376_plugin.o ch376.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o endif ####### SHOULDN'T HAVE TO CHANGE THIS STUFF ####### diff --git a/machine.c b/machine.c index c39485c3..02326742 100644 --- a/machine.c +++ b/machine.c @@ -321,6 +321,9 @@ void atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) else if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) ch376_oric_write(oric->ch376, addr, data); + + else if(oric->twilighteboard_activated && ((0x342 <= addr && addr < 0x344 ) || (0x320 <= addr && addr < 0x330 ))) + return twilighteboard_oric_write(oric->twilighte,addr); else via_write( &oric->via, addr, data ); @@ -641,15 +644,19 @@ unsigned char atmosread( struct m6502 *cpu, unsigned short addr ) if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) return ch376_oric_read(oric->ch376, addr); - if( (0x342 <= addr ) && ( addr < 0x344 ) ) + if( oric->twilighteboard_activated && ((0x342 <= addr && addr < 0x344 ) || (0x320 <= addr && addr < 0x330 ))) return twilighteboard_oric_read(oric->twilighte,addr); return via_read( &oric->via, addr ); } - if( ( !oric->romdis ) && ( addr >= 0xc000 ) ) - return oric->rom[addr-0xc000]; + if( ( !oric->romdis ) && ( addr >= 0xc000 ) ) { + if (oric->twilighteboard_activated) + return twilighteboard_oric_ROM_RAM(addr-0xc000); + else + return oric->rom[addr-0xc000]; + } return oric->mem[addr]; } diff --git a/machine.h b/machine.h index 60d7b43a..b00d17bc 100644 --- a/machine.h +++ b/machine.h @@ -104,6 +104,7 @@ struct machine struct ch376 *ch376; struct twilighte *twilighte; SDL_bool ch376_activated; + SDL_bool twilighteboard_activated; int tele_currbank; unsigned char tele_banktype; diff --git a/main.c b/main.c index 1f27ee50..044c5f19 100644 --- a/main.c +++ b/main.c @@ -519,6 +519,7 @@ static void load_config( struct start_opts *sto, struct machine *oric ) if( read_config_joykey( &sto->lctmp[i], "kbjoy2_fire3", &oric->kbjoy2[6] ) ) continue; if( read_config_bool( &sto->lctmp[i], "diskautosave", &oric->diskautosave ) ) continue; if( read_config_bool( &sto->lctmp[i], "ch376", &oric->ch376_activated) ) continue; + if( read_config_bool( &sto->lctmp[i], "twilighte_board",&oric->twilighteboard_activated) ) continue; if( read_config_bool( &sto->lctmp[i], "pravdiskautoboot", &oric->pravdiskautoboot ) ) continue; if( read_config_bool( &sto->lctmp[i], "show_keyboard", &oric->show_keyboard ) ) continue; if( read_config_bool( &sto->lctmp[i], "sticky_mod_keys", &oric->sticky_mod_keys ) )continue; diff --git a/oricutron.cfg b/oricutron.cfg index 6626c8bb..37c27666 100644 --- a/oricutron.cfg +++ b/oricutron.cfg @@ -196,3 +196,4 @@ kbjoy2_fire3 = 'LALT' ; ch376 chip emulation. This chip can read a usbkey. For more information : http://orix.oric.org ; only available in telestrat mode ch376 = no +twilighte_board=yes diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c index 2faa079b..7d2633af 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -1,4 +1,7 @@ +#define TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA 0x323 +#define TWILIGHTE_CARD_ORIC_EXTENSION_DDRA 0x321 + #define TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER 0x342 #define TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER 0x343 @@ -13,6 +16,30 @@ #include +struct twilbankinfo +{ + unsigned char type; + unsigned char *ptr; +}; + +struct twilighte +{ + + unsigned char t_register; + unsigned char t_banking_register; + char twilrombankfiles[32][1024]; + char twilrombankdata[32][16834]; + struct twilbankinfo rom_bank[32]; + unsigned char VDDRA; + unsigned char DDRA; + unsigned current_bank; + //struct twilbankinfo ram_bank[32]; +}; + +char twilrombankfiles[100][1024]; + + + #include "../../system.h" extern SDL_bool read_config_string( char *buf, char *token, char *dest, Sint32 maxlen ); @@ -72,25 +99,6 @@ static SDL_bool load_rom_twilighte( char *fname, int size, unsigned char *where return SDL_TRUE; } -struct twilbankinfo -{ - unsigned char type; - unsigned char *ptr; -}; - -struct twilighte -{ - - unsigned char t_register; - unsigned char t_banking_register; - char twilrombankfiles[32][1024]; - char twilrombankdata[32][16834]; - struct twilbankinfo rom_bank[32]; - //struct twilbankinfo ram_bank[32]; -}; - -char twilrombankfiles[100][1024]; - struct twilighte * twilighte_oric_init(void) { //struct twilighte * temp; @@ -149,9 +157,16 @@ struct twilighte * twilighte_oric_init(void) /* */ + twilighte->DDRA=7; + twilighte->VDDRA=7; + twilighte->current_bank=7; return twilighte; } +unsigned char twilighteboard_oric_ROM_RAM(struct twilighte *twilighte, uint16_t addr) { + return twilighte->twilrombankdata[twilighte->current_bank][addr]; +} + unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t addr) { @@ -160,6 +175,16 @@ unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t ad return twilighte->t_register; } + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA) + { + return twilighte->VDDRA; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) + { + return twilighte->DDRA; + } + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) { return twilighte->t_banking_register; @@ -170,6 +195,19 @@ unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t ad unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t addr, unsigned char data) { + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA) + { + twilighte->VDDRA=data; + + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) + { + twilighte->DDRA=data; + twilighte->current_bank=data&0b00000111; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) { twilighte->t_register=data; diff --git a/plugins/twilighte_card/twilighte.cfg b/plugins/twilighte_card/twilighte.cfg index 02ee24da..6a6b33f8 100644 --- a/plugins/twilighte_card/twilighte.cfg +++ b/plugins/twilighte_card/twilighte.cfg @@ -1,4 +1,4 @@ -twilbankrom7=kernel -twilbankrom6=basic11 -twilbankrom5=shell +twilbankrom7='roms/basic_noram' +twilbankrom6='roms/basic_noram' +twilbankrom5='roms/shell' From 44a51121f2d2b81c4463e1b3ff608cf6fd75b16c Mon Sep 17 00:00:00 2001 From: jede Date: Mon, 27 Apr 2020 01:43:26 +0200 Subject: [PATCH 008/143] RAM overlay managed, but it still crash --- .../oric_twilighte_board_plugin.c | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c index 7d2633af..5649c825 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -29,6 +29,10 @@ struct twilighte unsigned char t_banking_register; char twilrombankfiles[32][1024]; char twilrombankdata[32][16834]; + + + char twilrambankdata[32][16834]; + struct twilbankinfo rom_bank[32]; unsigned char VDDRA; unsigned char DDRA; @@ -163,8 +167,23 @@ struct twilighte * twilighte_oric_init(void) return twilighte; } -unsigned char twilighteboard_oric_ROM_RAM(struct twilighte *twilighte, uint16_t addr) { - return twilighte->twilrombankdata[twilighte->current_bank][addr]; +unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uint16_t addr) { + unsigned char data; + error_printf( "addr : %u c000 : %x value : %d\n",addr,0xc000+addr,data); + if (twilighte->current_bank==0) + data=twilighte->twilrambankdata[twilighte->current_bank][addr]; + else + data=twilighte->twilrombankdata[twilighte->current_bank][addr]; + + return data; +} + +unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uint16_t addr, unsigned char data) { + error_printf( "addr : %x %d\n",0xc000+addr,data); + if (twilighte->current_bank==0) + twilighte->twilrambankdata[twilighte->current_bank][addr]=data; + //else + //return twilighte->twilrombankdata[twilighte->current_bank][addr]; } From 534341547eee8d81eabc17b75fcf12a83a15b731 Mon Sep 17 00:00:00 2001 From: jede Date: Mon, 27 Apr 2020 13:14:25 +0200 Subject: [PATCH 009/143] update --- .../oric_twilighte_board_plugin.c | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c index 5649c825..9a662730 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -36,7 +36,7 @@ struct twilighte struct twilbankinfo rom_bank[32]; unsigned char VDDRA; unsigned char DDRA; - unsigned current_bank; + unsigned char current_bank; //struct twilbankinfo ram_bank[32]; }; @@ -169,21 +169,23 @@ struct twilighte * twilighte_oric_init(void) unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uint16_t addr) { unsigned char data; - error_printf( "addr : %u c000 : %x value : %d\n",addr,0xc000+addr,data); + error_printf( "%d",twilighte->current_bank); + return 0; if (twilighte->current_bank==0) - data=twilighte->twilrambankdata[twilighte->current_bank][addr]; + data=twilighte->twilrambankdata[twilighte->current_bank][addr]; else - data=twilighte->twilrombankdata[twilighte->current_bank][addr]; - + data=twilighte->twilrombankdata[twilighte->current_bank][addr]; + error_printf( "addr : %u c000 : %x value : %d\n",addr,0xc000+addr,data); return data; } unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uint16_t addr, unsigned char data) { - error_printf( "addr : %x %d\n",0xc000+addr,data); + if (twilighte->current_bank==0) - twilighte->twilrambankdata[twilighte->current_bank][addr]=data; - //else - //return twilighte->twilrombankdata[twilighte->current_bank][addr]; + twilighte->twilrambankdata[twilighte->current_bank][addr]=data; + + error_printf( "addr : %x %d\n",0xc000+addr,data); + return 0; } From de6083ff992a72b11ce3a2ee843721a188b9f8f5 Mon Sep 17 00:00:00 2001 From: jede Date: Mon, 27 Apr 2020 13:33:31 +0200 Subject: [PATCH 010/143] Trying to find bug (crash) --- .../oric_twilighte_board_plugin.c | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c index 9a662730..f2183f15 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -27,11 +27,11 @@ struct twilighte unsigned char t_register; unsigned char t_banking_register; - char twilrombankfiles[32][1024]; - char twilrombankdata[32][16834]; + unsigned char twilrombankfiles[32][1024]; + unsigned char twilrombankdata[32][16834]; - char twilrambankdata[32][16834]; + unsigned char twilrambankdata[32][16834]; struct twilbankinfo rom_bank[32]; unsigned char VDDRA; @@ -96,7 +96,7 @@ static SDL_bool load_rom_twilighte( char *fname, int size, unsigned char *where SDL_RWclose( f ); - sprintf( tmpname, "%s.sym", fname ); + //sprintf( tmpname, "%s.sym", fname ); //mon_new_symbols( stab, oric, tmpname, symflags, SDL_FALSE, SDL_FALSE ); free( tmpname ); @@ -122,7 +122,8 @@ struct twilighte * twilighte_oric_init(void) return NULL; } - + for( j=1; j<31; j++ ) twilighte->twilrombankfiles[j][0]=0; + while( !feof( f ) ) { fgets( line, 1024, f ); @@ -148,10 +149,15 @@ struct twilighte * twilighte_oric_init(void) { // oric->rom = oric->tele_bank[i].ptr = &oric->mem[0x0c000+(i*0x4000)]; - if( twilighte->twilrombankfiles[i][0] ) + if( twilighte->twilrombankfiles[i][0]!=0 ) { //oric->tele_bank[i].type = TELEBANK_ROM; - if( !load_rom_twilighte( twilighte->twilrombankfiles[i], -16384, &twilighte->rom_bank[i].ptr ) ) return SDL_FALSE; + if( !load_rom_twilighte( twilighte->twilrombankfiles[i], -16384, &twilighte->twilrombankdata[i] ) ) { + error_printf("Cannot load %s",twilighte->twilrombankfiles[i]); + return SDL_FALSE; + } + else + error_printf("Load %s",twilighte->twilrombankfiles[i]); //load_patches( oric, telebankfiles[i] ); //} else { //oric->tele_bank[i].type = TELEBANK_RAM; @@ -169,12 +175,12 @@ struct twilighte * twilighte_oric_init(void) unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uint16_t addr) { unsigned char data; - error_printf( "%d",twilighte->current_bank); - return 0; - if (twilighte->current_bank==0) - data=twilighte->twilrambankdata[twilighte->current_bank][addr]; - else - data=twilighte->twilrombankdata[twilighte->current_bank][addr]; +// error_printf( "%d",twilighte->current_bank); +// return 0; +// if (twilighte->current_bank==0) +// data=twilighte->twilrambankdata[twilighte->current_bank][addr]; +// else + data=twilighte->twilrombankdata[7][addr]; error_printf( "addr : %u c000 : %x value : %d\n",addr,0xc000+addr,data); return data; } @@ -225,7 +231,7 @@ unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t a if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) { twilighte->DDRA=data; - twilighte->current_bank=data&0b00000111; + //twilighte->current_bank=data&0b00000111; } From f9f0564c82f9fb7ef07ecad8c122dfdb0ebbf6ef Mon Sep 17 00:00:00 2001 From: jede Date: Mon, 27 Apr 2020 23:34:53 +0200 Subject: [PATCH 011/143] Trying to fix --- machine.c | 13 +++- .../oric_twilighte_board_plugin.c | 69 ++++++++++--------- 2 files changed, 46 insertions(+), 36 deletions(-) diff --git a/machine.c b/machine.c index 02326742..12d66e6e 100644 --- a/machine.c +++ b/machine.c @@ -313,7 +313,13 @@ void setromon( struct machine *oric ) void atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) { struct machine *oric = (struct machine *)cpu->userdata; - if( ( !oric->romdis ) && ( addr >= 0xc000 ) ) return; // Can't write to ROM! + + + if (oric->twilighteboard_activated && addr >= 0xc000 ) + twilighteboard_oric_ROM_RAM_write(oric->twilighte,addr-0xc000,data); + else + if( ( !oric->romdis ) && ( addr >= 0xc000 ) ) return; // Can't write to ROM! + if( ( addr & 0xff00 ) == 0x0300 ) { if( oric->aciabackend && ( oric->aciaoffset <= addr && addr < oric->aciaoffset+4 ) ) @@ -323,7 +329,7 @@ void atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) ch376_oric_write(oric->ch376, addr, data); else if(oric->twilighteboard_activated && ((0x342 <= addr && addr < 0x344 ) || (0x320 <= addr && addr < 0x330 ))) - return twilighteboard_oric_write(oric->twilighte,addr); + twilighteboard_oric_write(oric->twilighte,addr,data); else via_write( &oric->via, addr, data ); @@ -653,7 +659,8 @@ unsigned char atmosread( struct m6502 *cpu, unsigned short addr ) if( ( !oric->romdis ) && ( addr >= 0xc000 ) ) { if (oric->twilighteboard_activated) - return twilighteboard_oric_ROM_RAM(addr-0xc000); + + return twilighteboard_oric_ROM_RAM_read(oric->twilighte,addr-0xc000); else return oric->rom[addr-0xc000]; } diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c index f2183f15..8a2e3010 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -27,20 +27,21 @@ struct twilighte unsigned char t_register; unsigned char t_banking_register; - unsigned char twilrombankfiles[32][1024]; + char twilrombankfiles[32][1024]; + unsigned char twilrombankdata[32][16834]; - unsigned char twilrambankdata[32][16834]; + //unsigned char twilrambankdata[32][16834]; - struct twilbankinfo rom_bank[32]; + //struct twilbankinfo rom_bank[32]; unsigned char VDDRA; unsigned char DDRA; unsigned char current_bank; //struct twilbankinfo ram_bank[32]; }; -char twilrombankfiles[100][1024]; + @@ -49,14 +50,17 @@ char twilrombankfiles[100][1024]; extern SDL_bool read_config_string( char *buf, char *token, char *dest, Sint32 maxlen ); ///extern SDL_bool load_rom( struct machine *oric, char *fname, int size, unsigned char *where, struct symboltable *stab, int symflags ); -static SDL_bool load_rom_twilighte( char *fname, int size, unsigned char *where ) +static SDL_bool load_rom_twilighte( char *fname, int size, unsigned char where[] ) { SDL_RWops *f; char *tmpname; // MinGW doesn't have asprintf :-( tmpname = malloc( strlen( fname ) + 10 ); - if( !tmpname ) return SDL_FALSE; + if( !tmpname ) { + + return SDL_FALSE; + } sprintf( tmpname, "%s.rom", fname ); f = SDL_RWFromFile( tmpname, "rb" ); @@ -82,11 +86,11 @@ static SDL_bool load_rom_twilighte( char *fname, int size, unsigned char *where return SDL_FALSE; } - where += (-size)-filesize; + //where += (-size)-filesize; size = filesize; } - if( SDL_RWread( f, where, size, 1 ) != 1 ) + if( SDL_RWread( f, &where, size, 1 ) != 1 ) { error_printf( "Unable to read '%s'\n", tmpname ); SDL_RWclose( f ); @@ -95,11 +99,7 @@ static SDL_bool load_rom_twilighte( char *fname, int size, unsigned char *where } SDL_RWclose( f ); - - //sprintf( tmpname, "%s.sym", fname ); - //mon_new_symbols( stab, oric, tmpname, symflags, SDL_FALSE, SDL_FALSE ); free( tmpname ); - return SDL_TRUE; } @@ -108,6 +108,7 @@ struct twilighte * twilighte_oric_init(void) //struct twilighte * temp; //temp=malloc(sizeof(struct twilighte *)); char twilrombankfiles[32][1024]; + FILE *f; unsigned int i, j; char tbtmp[32]; @@ -131,6 +132,7 @@ struct twilighte * twilighte_oric_init(void) for( j=1; j<31; j++ ) { sprintf( tbtmp, "twilbankrom%c", j+'0' ); + if( read_config_string( line, tbtmp, twilighte->twilrombankfiles[j], 1024 ) ) { //error_printf( line ); @@ -145,31 +147,27 @@ struct twilighte * twilighte_oric_init(void) fclose( f ); // Now load rom - for( i=1; i<31; i++ ) + for( i=0; i<31; i++ ) { // oric->rom = oric->tele_bank[i].ptr = &oric->mem[0x0c000+(i*0x4000)]; - if( twilighte->twilrombankfiles[i][0]!=0 ) - { - //oric->tele_bank[i].type = TELEBANK_ROM; - if( !load_rom_twilighte( twilighte->twilrombankfiles[i], -16384, &twilighte->twilrombankdata[i] ) ) { + + if( twilighte->twilrombankfiles[i][0]!=0 ) + { + if( !load_rom_twilighte( twilighte->twilrombankfiles[i], -16384, twilighte->twilrombankdata[i] ) ) { error_printf("Cannot load %s",twilighte->twilrombankfiles[i]); - return SDL_FALSE; + return NULL; } - else - error_printf("Load %s",twilighte->twilrombankfiles[i]); - //load_patches( oric, telebankfiles[i] ); - //} else { - //oric->tele_bank[i].type = TELEBANK_RAM; - //} - } + + } + for (j=0;j<16384;j++) twilighte->twilrombankdata[i][j]=0x57; } /* */ - twilighte->DDRA=7; - twilighte->VDDRA=7; - twilighte->current_bank=7; + //twilighte->DDRA=7; + //twilighte->VDDRA=7; + //twilighte->current_bank=7; return twilighte; } @@ -178,17 +176,22 @@ unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uin // error_printf( "%d",twilighte->current_bank); // return 0; // if (twilighte->current_bank==0) -// data=twilighte->twilrambankdata[twilighte->current_bank][addr]; + //data=twilighte->twilrombankdata[0][0]; // else - data=twilighte->twilrombankdata[7][addr]; - error_printf( "addr : %u c000 : %x value : %d\n",addr,0xc000+addr,data); +//twilighte->twilrombankdata[0][0]=0; +data=twilighte->twilrombankdata[1][1]; +error_printf( "addr : %u c000 : %x value : %d\n",addr,0xc000+addr,data); +//data=(unsigned char)twilighte->twilrombankdata[1][0]; + + + return data; } unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uint16_t addr, unsigned char data) { - if (twilighte->current_bank==0) - twilighte->twilrambankdata[twilighte->current_bank][addr]=data; + //if (twilighte->current_bank==0) + //twilighte->twilrambankdata[twilighte->current_bank][addr]=data; error_printf( "addr : %x %d\n",0xc000+addr,data); return 0; From ade5583015c4b14ce44d7685fd5fb8f20350e649 Mon Sep 17 00:00:00 2001 From: jede Date: Mon, 27 Apr 2020 23:35:13 +0200 Subject: [PATCH 012/143] Trying to fix --- plugins/twilighte_card/oric_twilighte_board_plugin.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.h b/plugins/twilighte_card/oric_twilighte_board_plugin.h index 404eaa8e..14cf9ee8 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.h +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.h @@ -1,3 +1,6 @@ struct twilighte * twilighte_oric_init(void); -unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t addr); \ No newline at end of file +unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t addr); +unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uint16_t addr) ; +unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uint16_t addr, unsigned char data); +unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t addr, unsigned char data); \ No newline at end of file From b6c7eee248adbe9492c2e24c34db118469008179 Mon Sep 17 00:00:00 2001 From: jede Date: Tue, 28 Apr 2020 15:34:22 +0200 Subject: [PATCH 013/143] Now bank 7 starts --- gui.c | 22 ++++++++++++++ machine.c | 10 +++++-- .../oric_twilighte_board_plugin.c | 30 +++++++++---------- 3 files changed, 45 insertions(+), 17 deletions(-) diff --git a/gui.c b/gui.c index 347eaefc..68babd96 100644 --- a/gui.c +++ b/gui.c @@ -64,6 +64,7 @@ #include "plugins/ch376/ch376.h" #include "plugins/ch376/oric_ch376_plugin.h" +#include "plugins/twilighte_card/oric_twilighte_board_plugin.h" extern SDL_bool fullscreen; @@ -192,6 +193,7 @@ void insertdisk( struct machine *oric, struct osdmenuitem *mitem, int drive ); void resetoric( struct machine *oric, struct osdmenuitem *mitem, int dummy ); void toggletapeturbo( struct machine *oric, struct osdmenuitem *mitem, int dummy ); void togglech376(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void toggletwilighte(struct machine *oric, struct osdmenuitem *mitem, int dummy); void toggleautowind( struct machine *oric, struct osdmenuitem *mitem, int dummy ); void toggleautoinsrt( struct machine *oric, struct osdmenuitem *mitem, int dummy ); void togglesymbolsauto( struct machine *oric, struct osdmenuitem *mitem, int dummy ); @@ -279,6 +281,7 @@ struct osdmenuitem hwopitems[] = { { " Oric-1", "1", SDLK_1, { " Lightpen", NULL, 0, togglelightpen, 0, 0 }, { " Serial none ", NULL, 0, toggleaciabackend, 0, 0 }, { " CH376 (Telestrat) ", NULL, 0, togglech376, 0, 0 }, + { " Twilighte board ", NULL, 0, toggletwilighte, 0, 0 }, // { " Mouse", NULL, 0, NULL, 0, 0 }, { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, { "Back", "\x17", SDLK_BACKSPACE,gotomenu, 0, 0 }, @@ -1522,6 +1525,24 @@ void togglech376(struct machine *oric, struct osdmenuitem *mitem, int dummy) ch376_oric_config(oric->ch376); } +// Toggle twilighte on/off +void toggletwilighte(struct machine *oric, struct osdmenuitem *mitem, int dummy) +{ + + if (oric->twilighteboard_activated) + { + oric->twilighteboard_activated = SDL_FALSE; + mitem->name = " Twilighte board"; + return; + } + + oric->twilighteboard_activated = SDL_TRUE; + mitem->name = "\x0e""Twilighte board"; + oric->twilighte = twilighte_oric_init(); + if (oric->twilighte == NULL) oric->twilighteboard_activated = SDL_FALSE; // Impossible to create struct, we did not activate twilighteboard + +} + // Toggle symbols autoload void togglesymbolsauto( struct machine *oric, struct osdmenuitem *mitem, int dummy ) { @@ -2341,6 +2362,7 @@ void setmenutoggles( struct machine *oric ) find_item_by_function(keopitems, togglestickykeys)->name = " Sticky mod keys"; find_item_by_function(hwopitems, togglech376)->name = oric->ch376_activated ? "\x0e""CH376 (Telestrat)" : " CH376 (Telestrat) "; + find_item_by_function(hwopitems, toggletwilighte)->name = oric->twilighteboard_activated ? "\x0e""Twilighte board" : " Twilighte board"; } // Initialise the GUI diff --git a/machine.c b/machine.c index 12d66e6e..9f4de745 100644 --- a/machine.c +++ b/machine.c @@ -1227,7 +1227,9 @@ SDL_bool emu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) if (oric->ch376 != NULL) ch376_oric_config(oric->ch376); } - oric->twilighte=twilighte_oric_init(); + if (oric->twilighteboard_activated) + oric->twilighte=twilighte_oric_init(); + if (oric->twilighte==NULL) oric->twilighteboard_activated=SDL_FALSE; break; @@ -1845,6 +1847,10 @@ SDL_bool init_machine( struct machine *oric, int type, SDL_bool nukebreakpoints setromon( oric ); oric->tapename[0] = 0; tape_rewind( oric ); + if (oric->twilighteboard_activated) + oric->twilighte=twilighte_oric_init(); + if (oric->twilighte==NULL) oric->twilighteboard_activated=SDL_FALSE; + m6502_reset( &oric->cpu ); via_init( &oric->via, oric, VIA_MAIN ); via_init( &oric->tele_via, oric, VIA_TELESTRAT ); @@ -1856,7 +1862,7 @@ SDL_bool init_machine( struct machine *oric, int type, SDL_bool nukebreakpoints ch376_oric_config(oric->ch376); } - oric->twilighte = twilighte_oric_init(); + ay_init( &oric->ay, oric ); joy_setup( oric ); diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c index 8a2e3010..dd768144 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -32,7 +32,7 @@ struct twilighte unsigned char twilrombankdata[32][16834]; - //unsigned char twilrambankdata[32][16834]; + unsigned char twilrambankdata[32][16834]; //struct twilbankinfo rom_bank[32]; unsigned char VDDRA; @@ -86,11 +86,11 @@ static SDL_bool load_rom_twilighte( char *fname, int size, unsigned char where[ return SDL_FALSE; } - //where += (-size)-filesize; + where += (-size)-filesize; size = filesize; } - if( SDL_RWread( f, &where, size, 1 ) != 1 ) + if( SDL_RWread( f, where, size, 1 ) != 1 ) { error_printf( "Unable to read '%s'\n", tmpname ); SDL_RWclose( f ); @@ -160,14 +160,14 @@ struct twilighte * twilighte_oric_init(void) } } - for (j=0;j<16384;j++) twilighte->twilrombankdata[i][j]=0x57; + //for (j=0;j<16384;j++) twilighte->twilrombankdata[i][j]=0x57; } /* */ - //twilighte->DDRA=7; - //twilighte->VDDRA=7; - //twilighte->current_bank=7; + twilighte->DDRA=7; + twilighte->VDDRA=7; + twilighte->current_bank=7; return twilighte; } @@ -175,12 +175,12 @@ unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uin unsigned char data; // error_printf( "%d",twilighte->current_bank); // return 0; -// if (twilighte->current_bank==0) - //data=twilighte->twilrombankdata[0][0]; -// else + if (twilighte->current_bank==0) + data=twilighte->twilrombankdata[0][addr]; + else //twilighte->twilrombankdata[0][0]=0; -data=twilighte->twilrombankdata[1][1]; -error_printf( "addr : %u c000 : %x value : %d\n",addr,0xc000+addr,data); + data=twilighte->twilrombankdata[twilighte->current_bank][addr]; +//error_printf( "addr : %u c000 : %x value : %d\n",addr,0xc000+addr,data); //data=(unsigned char)twilighte->twilrombankdata[1][0]; @@ -190,10 +190,10 @@ error_printf( "addr : %u c000 : %x value : %d\n",addr,0xc000+addr,data); unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uint16_t addr, unsigned char data) { - //if (twilighte->current_bank==0) - //twilighte->twilrambankdata[twilighte->current_bank][addr]=data; + if (twilighte->current_bank==0) + twilighte->twilrambankdata[twilighte->current_bank][addr]=data; - error_printf( "addr : %x %d\n",0xc000+addr,data); + //error_printf( "addr : %x %d\n",0xc000+addr,data); return 0; } From 27603650324f6e612937ada8618a0398c7753c57 Mon Sep 17 00:00:00 2001 From: jede Date: Tue, 28 Apr 2020 23:46:45 +0200 Subject: [PATCH 014/143] Now shell starts (and bank switching but keyboard problem) --- .../oric_twilighte_board_plugin.c | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c index dd768144..e604cc01 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -30,8 +30,6 @@ struct twilighte char twilrombankfiles[32][1024]; unsigned char twilrombankdata[32][16834]; - - unsigned char twilrambankdata[32][16834]; //struct twilbankinfo rom_bank[32]; @@ -176,10 +174,18 @@ unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uin // error_printf( "%d",twilighte->current_bank); // return 0; if (twilighte->current_bank==0) - data=twilighte->twilrombankdata[0][addr]; + { + //error_printf( "Read ram overlay %x",0xc000+addr); + data=twilighte->twilrambankdata[0][addr]; + //error_printf( "Read ram overlay %x data : %d",0xc000+addr,data); + //getchar(); + } else //twilighte->twilrombankdata[0][0]=0; - data=twilighte->twilrombankdata[twilighte->current_bank][addr]; + { + data=twilighte->twilrombankdata[twilighte->current_bank][addr]; + //error_printf( "Read rom overlay addr %x\n",0xc000+addr); + } //error_printf( "addr : %u c000 : %x value : %d\n",addr,0xc000+addr,data); //data=(unsigned char)twilighte->twilrombankdata[1][0]; @@ -190,10 +196,15 @@ unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uin unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uint16_t addr, unsigned char data) { - if (twilighte->current_bank==0) + if (twilighte->current_bank==0) + { + //error_printf( "write ram overlay : %x %d\n",0xc000+addr,data); twilighte->twilrambankdata[twilighte->current_bank][addr]=data; + //getchar(); - //error_printf( "addr : %x %d\n",0xc000+addr,data); + } + + // return 0; } @@ -234,7 +245,9 @@ unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t a if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) { twilighte->DDRA=data; - //twilighte->current_bank=data&0b00000111; + + twilighte->current_bank=data&7; + //error_printf( "current_bank %d addr : %x %d",twilighte->current_bank,addr,data); } From 59167a17ff0187bfe7c387f172c9ab12e01733f5 Mon Sep 17 00:00:00 2001 From: jede Date: Wed, 29 Apr 2020 00:22:49 +0200 Subject: [PATCH 015/143] maj --- plugins/twilighte_card/oric_twilighte_board_plugin.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c index e604cc01..8828fbdc 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -158,11 +158,14 @@ struct twilighte * twilighte_oric_init(void) } } - //for (j=0;j<16384;j++) twilighte->twilrombankdata[i][j]=0x57; + } /* */ + // Flush sram (first bank) + for (j=0;j<16384;j++) twilighte->twilrambankdata[0][j]=0; + twilighte->DDRA=7; twilighte->VDDRA=7; twilighte->current_bank=7; From 58b1bf2c5585b2ff060812f7988eb6d8840e1fb0 Mon Sep 17 00:00:00 2001 From: jede Date: Wed, 29 Apr 2020 01:01:27 +0200 Subject: [PATCH 016/143] It works now, but there is a problem with keyboard buffers --- .../twilighte_card/oric_twilighte_board_plugin.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c index 8828fbdc..83fa98c9 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -113,7 +113,7 @@ struct twilighte * twilighte_oric_init(void) char line[1024]; struct twilighte *twilighte = malloc(sizeof(struct twilighte)); twilighte->t_banking_register=0; - twilighte->t_register=128+1; + twilighte->t_register=128+1; // Firmware f = fopen( "plugins/twilighte_card/twilighte.cfg", "r" ); if( !f ) { @@ -174,6 +174,7 @@ struct twilighte * twilighte_oric_init(void) unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uint16_t addr) { unsigned char data; + unsigned char bank; // error_printf( "%d",twilighte->current_bank); // return 0; if (twilighte->current_bank==0) @@ -186,7 +187,15 @@ unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uin else //twilighte->twilrombankdata[0][0]=0; { - data=twilighte->twilrombankdata[twilighte->current_bank][addr]; + if (twilighte->current_bank<5) + bank=twilighte->current_bank*twilighte->t_banking_register; + else + bank=twilighte->current_bank; + + //if (twilighte->t_register&32==32) // Is it a ram bank access ? + //data=twilighte->twilrambankdata[bank][addr]; + //else + data=twilighte->twilrombankdata[bank][addr]; //error_printf( "Read rom overlay addr %x\n",0xc000+addr); } //error_printf( "addr : %u c000 : %x value : %d\n",addr,0xc000+addr,data); From a19fa8ff6e3e4ded7a1b8a5a56aa1f3896c8a1bf Mon Sep 17 00:00:00 2001 From: iss Date: Fri, 15 May 2020 21:16:20 +0300 Subject: [PATCH 017/143] BD-500 support --- 8912.c | 2 +- ChangeLog.txt | 8 + Makefile | 10 +- Lies_mich_DE.txt => ReadMe-LiesMich_DE.txt | 9 +- ReadMe.txt | 11 +- disk.c | 152 +++++++++++++++++- disk.h | 20 ++- gui.c | 13 +- machine.c | 177 ++++++++++++++++++++- machine.h | 8 +- main.c | 81 +++++++++- monitor.c | 160 +++++++++++++------ monitor.h | 2 + oricutron.cfg | 15 ++ roms/bd500.sym | 8 + 15 files changed, 593 insertions(+), 83 deletions(-) rename Lies_mich_DE.txt => ReadMe-LiesMich_DE.txt (98%) create mode 100644 roms/bd500.sym diff --git a/8912.c b/8912.c index f23fad74..980bbe7e 100644 --- a/8912.c +++ b/8912.c @@ -414,7 +414,7 @@ void ay_callback( void *dummy, Sint8 *stream, int length ) if( (dcadjustmax-dcadjustave) > 32767 ) dcadjustave = -(32767-dcadjustmax); - if( dcadjustave ) + if( ay->oric->dcadjust && dcadjustave ) { for( i=0, j=0; i - Read BIN file to mem +* Changed monitor command 'df' to 'fd' for better consistency +* Changed monitor command 'wm' to 'fw' for better consistency +* Added new 'dcadjust' option in .cfg file - toggles on/off audio DC adjustment +* Added German translation of 'ReadMe.txt' - 'ReadMe-LiesMich_DE.txt' * Fixed issue #116 no ACIA in Telestrat mode * Added read-track and write-track support for FDC (assinie) * Center windows on return from fullscreen mode (rzumer) diff --git a/Makefile b/Makefile index 47ed512f..200069b5 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ -# +# # valid platforms in alphabetical order: -# +# # PLATFORM = aitouchbook # PLATFORM = aros # PLATFORM = beos @@ -32,8 +32,8 @@ VERSION_MAJ = 1 VERSION_MIN = 2 VERSION_REV = 0 VERSION_FULL = $(VERSION_MAJ).$(VERSION_MIN).$(VERSION_REV) -APP_INFO = -APP_NAME = Oricutron $(APP_INFO) +APP_INFO = +APP_NAME = $(strip Oricutron $(APP_INFO)) APP_YEAR = 2019 COPYRIGHTS = (c)$(APP_YEAR) Peter Gordon (pete@petergordon.org.uk) VERSION_COPYRIGHTS = "$(APP_NAME) $(VERSION_FULL) $(COPYRIGHTS)" @@ -706,6 +706,6 @@ package-mint package-mint-cf: .PHONY: mrproper -PLATFORMS := aitouchbook aros beos gphwiz haiku lin-32 lin-64 linux linux-nogl mint mint-cf morphos os4 osx pandora rpi win32 win32-gcc win64-gcc +PLATFORMS := aitouchbook aros beos gphwiz haiku lin-32 lin-64 linux linux-nogl mint mint-cf morphos os4 osx pandora rpi win32 win32-gcc win64-gcc mrproper: @for plat in $(PLATFORMS); do $(MAKE) -f $(SRC_DIR)/Makefile clean PLATFORM=$${plat}; done diff --git a/Lies_mich_DE.txt b/ReadMe-LiesMich_DE.txt similarity index 98% rename from Lies_mich_DE.txt rename to ReadMe-LiesMich_DE.txt index 3a0d3959..d72ec5c3 100644 --- a/Lies_mich_DE.txt +++ b/ReadMe-LiesMich_DE.txt @@ -140,6 +140,8 @@ Hier sind alle Optionen: "microdisc" oder "m" für Microdisc "jasmin" oder "j" für Jasmin + "bd500" oder "b" für ByteDrive BD-500 + "pravetz" oder "p" für Pravetz-8D FDC -s / --symbols = Lade Symbole aus einer Datei -f / --fullscreen = Starte Oricutron im Vollbild-Modus @@ -274,7 +276,9 @@ Befehle: bz - Zap Breakpoints bzm - Zap mem Breakpoints d - Disassembliere - df - Disassembliere zu Datei + fd - Disassembliere zu Datei + fw - Schreibe Speicher zu Datei + fr - Lese Datei zu Speicher m - Dump memory mm - Modifiziere Memory mw - Beobachte Memory an addr @@ -290,7 +294,6 @@ Befehle: sl - Lade user symbols sx - Exportiere user symbols sz - Zap user symbols - wm - Schreibe mem auf Disk @@ -423,7 +426,7 @@ CH376 Befehl emuliert : - CH376_CMD_BYTE_WR_GO - CH376_CMD_DISK_QUERY - CH376_CMD_DIR_CREATE (unter Linux nicht emuliert) -- CH376_CMD_DISK_RD_GO +- CH376_CMD_DISK_RD_GO Bekannter Fehler : Unter Windows sendet die API-Datei keine "." und "..."-Einträge, wenn der Inhalt des Ordners gelesen wird. Das ist ein Problem, weil der ch376-Chip diese Einträge sendet, wenn der Chip den Inhalt eines Verzeichnisses lesen soll. diff --git a/ReadMe.txt b/ReadMe.txt index a24e8ecd..ad58e134 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -146,6 +146,8 @@ Here are all the options: "microdisc" or "m" for Microdisc "jasmin" or "j" for Jasmin + "bd500" or "b" for ByteDrive BD-500 + "pravetz" or "p" for Pravetz-8D FDC -s / --symbols = Load symbols from a file -f / --fullscreen = Run oricutron fullscreen @@ -290,7 +292,9 @@ Commands: bz - Zap breakpoints bzm - Zap mem breakpoints d - Disassemble - df - Disassemble to file + fd - Disassemble to file + fw - Write mem to BIN file + fr - Read BIN file to mem m - Dump memory mm - Modify memory mw - Memory watch at addr @@ -306,7 +310,6 @@ Commands: sl - Load user symbols sx - Export user symbols sz - Zap user symbols - wm - Write mem to disk @@ -453,10 +456,10 @@ CH376 command emulated : - CH376_CMD_BYTE_WR_GO - CH376_CMD_DISK_QUERY - CH376_CMD_DIR_CREATE (not emulated under linux) -- CH376_CMD_DISK_RD_GO +- CH376_CMD_DISK_RD_GO Known bug : -Under windows, API's file does not send "." and ".." entries when we read the content on the folder. It's a problem because ch376 chip send these +Under windows, API's file does not send "." and ".." entries when we read the content on the folder. It's a problem because ch376 chip send these entries, when we ask to this chip to read the content of a directory. If someone wants to emulate CH376_CMD_DIR_CREATE and CH376_CMD_FILE_ERASE. It's easy to do : it justs need to copy WIN32 function and replace DeleteFile diff --git a/disk.c b/disk.c index 26f7a427..96194ed1 100644 --- a/disk.c +++ b/disk.c @@ -89,10 +89,11 @@ void disk_popup( struct machine *oric, int drive ) } // Free a disk image and clear the pointer to it -void diskimage_free( struct machine *oric, struct diskimage **dimg ) +static void diskimage_free( struct machine *oric, struct diskimage **dimg ) { char *dpath, *dfile; + if( !dimg ) return; if( !(*dimg) ) return; if( oric->type != MACH_TELESTRAT ) @@ -109,7 +110,9 @@ void diskimage_free( struct machine *oric, struct diskimage **dimg ) dfile = diskfile; break; } - } else { + } + else + { dpath = telediskpath; dfile = telediskfile; } @@ -129,13 +132,18 @@ void diskimage_free( struct machine *oric, struct diskimage **dimg ) } } - if( (*dimg)->rawimage ) free( (*dimg)->rawimage ); + if( (*dimg)->rawimage ) + { + free( (*dimg)->rawimage ); + (*dimg)->rawimage = NULL; + } + free( *dimg ); - (*dimg) = NULL; + *dimg = NULL; } // Read a raw integer from a disk image file -Uint32 diskimage_rawint( struct diskimage *dimg, Uint32 offset ) +static Uint32 diskimage_rawint( struct diskimage *dimg, Uint32 offset ) { if( !dimg ) return 0; if( ( !dimg->rawimage ) || ( dimg->rawimagelen < 4 ) ) return 0; @@ -147,13 +155,16 @@ Uint32 diskimage_rawint( struct diskimage *dimg, Uint32 offset ) // Allocate and initialise a disk image structure // If "rawimglen" isn't zero, it will also allocate // ram for a raw disk image -struct diskimage *diskimage_alloc( Uint32 rawimglen ) +static struct diskimage *diskimage_alloc( Uint32 rawimglen ) { struct diskimage *dimg; - Uint8 *buf=NULL; + Uint8 *buf = NULL; if( rawimglen ) { + // FIXME: this is temporary solution to allow + // low-level formatting up to 128 track per side + if( rawimglen < 128*2*6400+256 ) rawimglen = 128*2*6400+256; buf = malloc( rawimglen ); if( !buf ) return NULL; } @@ -183,6 +194,8 @@ struct diskimage *diskimage_alloc( Uint32 rawimglen ) void disk_eject( struct machine *oric, int drive ) { diskimage_free( oric, &oric->wddisk.disk[drive] ); + oric->wddisk.disk[drive] = NULL; + oric->pravetz.drv[drive].pimg = NULL; oric->pravetz.drv[drive].byte = 0; oric->pravetz.drv[drive].dirty = SDL_FALSE; @@ -1366,6 +1379,7 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, } } +// Microdisc interface handlers void microdisc_setdrq( void *md ) { struct microdisc *mdp = (struct microdisc *)md; @@ -1479,6 +1493,130 @@ void microdisc_write( struct microdisc *md, unsigned short addr, unsigned char d } } +// Byte Drive 500 interface handlers +void bd500_setdrq( void *bd ) +{ + struct bd500 *bdp = (struct bd500 *)bd; + bdp->drq = 0x80; +} + +void bd500_clrdrq( void *bd ) +{ + struct bd500 *bdp = (struct bd500 *)bd; + bdp->drq = 0; +} + +void bd500_setintrq( void *bd ) +{ + struct bd500 *bdp = (struct bd500 *)bd; + bdp->intrq = 0x40; +} + +void bd500_clrintrq( void *bd ) +{ + struct bd500 *bdp = (struct bd500 *)bd; + bdp->intrq = 0; +} + +void bd500_init( struct bd500 *bd, struct wd17xx *wd, struct machine *oric ) +{ + wd17xx_init( wd ); + wd->setintrq = bd500_setintrq; + wd->clrintrq = bd500_clrintrq; + wd->intrqarg = (void*)bd; + wd->setdrq = bd500_setdrq; + wd->clrdrq = bd500_clrdrq; + wd->drqarg = (void*)bd; + + bd->status = 0; + bd->intrq = 0; + bd->drq = 0; + bd->wd = wd; + bd->oric = oric; + bd->diskrom = SDL_TRUE; +} + +void bd500_free( struct bd500 *bd ) +{ + int i; + for( i=0; ioric, i ); +} + +unsigned char bd500_read( struct bd500 *bd, unsigned short addr ) +{ +// dbg_printf( "DISK: (%04X) Read from %04X", bd->oric->cpu.pc-1, addr ); + + if( ( addr >= 0x320 ) && ( addr < 0x324 ) ) + return wd17xx_read( bd->wd, addr&3 ); + + switch( addr ) + { + case 0x312: + return (bd->drq | bd->intrq); + break; + + case 0x313: + bd->oric->romdis = SDL_FALSE; + break; + + case 0x314: + bd->oric->romdis = SDL_TRUE; + break; + + case 0x310: + case 0x311: + case 0x315: + case 0x316: + bd->diskrom = SDL_FALSE; + break; + + case 0x317: + // 64k/56k mode depend on ROM chips + bd->diskrom = bd->oric->rom16? SDL_FALSE : SDL_TRUE; + break; + + default: + break; + } + + return 0xff; +} + +void bd500_write( struct bd500 *bd, unsigned short addr, unsigned char data ) +{ +// dbg_printf( "DISK: (%04X) Write %02X to %04X", bd->oric->cpu.pc-1, data, addr ); + + if( ( addr >= 0x320 ) && ( addr < 0x324 ) ) + { + wd17xx_write( bd->oric, bd->wd, addr&3, data ); + return; + } + + switch( addr ) + { + case 0x31a: + switch( data & 0xe0 ) + { + default: + case 0x20: + bd->wd->c_drive = 0; + break; + case 0x40: + bd->wd->c_drive = 1; + break; + case 0x80: + bd->wd->c_drive = 2; + break; + case 0xc0: + bd->wd->c_drive = 3; + break; + } + break; + } +} + +// Jasmin interface handlers void jasmin_setdrq( void *j ) { struct jasmin *jp = (struct jasmin *)j; diff --git a/disk.h b/disk.h index a3e7f4e5..87b8d2e9 100644 --- a/disk.h +++ b/disk.h @@ -169,6 +169,16 @@ struct microdisc SDL_bool diskrom; // TRUE if the diskrom is enabled }; +// Current state of the Byte Drive 500 hardware +struct bd500 +{ + Uint8 status; // Status register (write to 0x314) + Uint8 intrq; // intrq register (read from 0x314) + Uint8 drq; // drq register (read/write 0x318) + struct wd17xx *wd; // Pointer to the WD17xx structure + struct machine *oric; // Pointer to the Oric structure + SDL_bool diskrom; // TRUE if the diskrom is enabled +}; // Current state of the Jasmin hardware struct jasmin @@ -204,8 +214,10 @@ struct pravetz struct pravetz_drive drv[MAX_DRIVES]; }; +void disk_eject( struct machine *oric, int drive ); + // Functions to read/write diskimages -SDL_bool diskimage_load( struct machine *oric, char *fname, int drive ); +SDL_bool diskimage_load( struct machine *oric, char *fname, int drive ); SDL_bool diskimage_save( struct machine *oric, char *fname, int drive ); void diskimage_cachetrack( struct diskimage *dimg, int track, int side ); struct mfmsector *wd17xx_find_sector( struct wd17xx *wd, Uint8 secid ); @@ -219,6 +231,12 @@ void microdisc_free( struct microdisc *md ); unsigned char microdisc_read( struct microdisc *md, unsigned short addr ); void microdisc_write( struct microdisc *md, unsigned short addr, unsigned char data ); +// Byte Drive 500 interface +void bd500_init( struct bd500 *bd, struct wd17xx *wd, struct machine *oric ); +void bd500_free( struct bd500 *bd ); +unsigned char bd500_read( struct bd500 *bd, unsigned short addr ); +void bd500_write( struct bd500 *bd, unsigned short addr, unsigned char data ); + // Jasmin interface void jasmin_init( struct jasmin *j, struct wd17xx *wd, struct machine *oric ); void jasmin_free( struct jasmin *j ); diff --git a/gui.c b/gui.c index 347eaefc..7fe5a0f8 100644 --- a/gui.c +++ b/gui.c @@ -74,6 +74,7 @@ char pravdiskpath[4096], pravdiskfile[512]; extern char atmosromfile[]; extern char oric1romfile[]; extern char mdiscromfile[]; +extern char bd500romfile[]; extern char jasmnromfile[]; extern char pravetzromfile[2][1024]; extern char telebankfiles[8][1024]; @@ -268,6 +269,7 @@ struct osdmenuitem hwopitems[] = { { " Oric-1", "1", SDLK_1, { " No disk", "X", 'x', setdrivetype, DRV_NONE, 0 }, { " Microdisc", "M", 'm', setdrivetype, DRV_MICRODISC, 0 }, { " Jasmin", "J", 'j', setdrivetype, DRV_JASMIN, 0 }, + { " BD500", "B", 'b', setdrivetype, DRV_BD500, 0 }, // { " Cumana", "C", 'c', NULL, 0, 0 }, { " Pravetz 8D disk", "P", 'p', setdrivetype, DRV_PRAVETZ, 0 }, { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, @@ -2187,6 +2189,7 @@ void preinit_gui( struct machine *oric ) strcpy( atmosromfile, ROMPREFIX"basic11b" ); strcpy( oric1romfile, ROMPREFIX"basic10" ); strcpy( mdiscromfile, ROMPREFIX"microdis" ); + strcpy( bd500romfile, ROMPREFIX"bd500" ); strcpy( jasmnromfile, ROMPREFIX"jasmin" ); strcpy( pravetzromfile[0], ROMPREFIX"pravetzt" ); strcpy( pravetzromfile[1], ROMPREFIX"8dos2" ); @@ -2212,6 +2215,7 @@ void setmenutoggles( struct machine *oric ) { case DRV_JASMIN: case DRV_MICRODISC: + case DRV_BD500: find_item_by_key(mainitems, SDLK_0)->func = insertdisk; find_item_by_key(mainitems, SDLK_1)->func = insertdisk; find_item_by_key(mainitems, SDLK_2)->func = insertdisk; @@ -2325,10 +2329,11 @@ void setmenutoggles( struct machine *oric ) find_item_by_key(hwopitems, 'j')->func = jasminrom_valid ? setdrivetype : NULL; find_item_by_key(hwopitems, 'p')->func = pravetzrom_valid ? setdrivetype : NULL; - find_item_by_key(hwopitems, 'x')->name = oric->drivetype==DRV_NONE ? "\x0e""No disk" : " No disk"; - find_item_by_key(hwopitems, 'm')->name = oric->drivetype==DRV_MICRODISC ? "\x0e""Microdisc" : " Microdisc"; - find_item_by_key(hwopitems, 'j')->name = oric->drivetype==DRV_JASMIN ? "\x0e""Jasmin" : " Jasmin"; - find_item_by_key(hwopitems, 'p')->name = oric->drivetype==DRV_PRAVETZ ? "\x0e""Pravetz 8D disk": " Pravetz 8D disk"; + find_item_by_key(hwopitems, 'x')->name = oric->drivetype==DRV_NONE ? "\x0e""No disk" : " No disk"; + find_item_by_key(hwopitems, 'm')->name = oric->drivetype==DRV_MICRODISC ? "\x0e""Microdisc" : " Microdisc"; + find_item_by_key(hwopitems, 'b')->name = oric->drivetype==DRV_BD500 ? "\x0e""BD500" : " BD500"; + find_item_by_key(hwopitems, 'j')->name = oric->drivetype==DRV_JASMIN ? "\x0e""Jasmin" : " Jasmin"; + find_item_by_key(hwopitems, 'p')->name = oric->drivetype==DRV_PRAVETZ ? "\x0e""Pravetz 8D disk" : " Pravetz 8D disk"; if(oric->show_keyboard) find_item_by_function(keopitems, togglekeyboard)->name = "\x0e""Show keyboard"; diff --git a/machine.c b/machine.c index 7a66a7cb..f8ed00c3 100644 --- a/machine.c +++ b/machine.c @@ -65,6 +65,7 @@ extern int g_menu_scheme; // #InfoBadDesign - init g_menu_scheme should be done char atmosromfile[1024]; char oric1romfile[1024]; char mdiscromfile[1024]; +char bd500romfile[1024]; char jasmnromfile[1024]; char pravetzromfile[2][1024]; char telebankfiles[8][1024]; @@ -76,9 +77,9 @@ int vidcapcount = 0; char screencapname[128]; int screencapcount = 0; -unsigned char rom_microdisc[8912], rom_jasmin[2048], rom_pravetz[512]; -struct symboltable sym_microdisc, sym_jasmin, sym_pravetz; -SDL_bool microdiscrom_valid, jasminrom_valid, pravetzrom_valid; +unsigned char rom_microdisc[8912], rom_bd500[8912], rom_jasmin[2048], rom_pravetz[512]; +struct symboltable sym_microdisc, sym_bd500, sym_jasmin, sym_pravetz; +SDL_bool microdiscrom_valid, bd500rom_valid, jasminrom_valid, pravetzrom_valid; extern struct osdmenuitem mainitems[]; Uint8 oricpalette[] = { 0x00, 0x00, 0x00, @@ -506,6 +507,36 @@ void microdisc_atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char oric->mem[addr] = data; } +// Oric Atmos + bd500 +void bd500_atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) +{ + struct machine *oric = (struct machine *)cpu->userdata; + if( oric->romdis ) + { + if( ( oric->bd.diskrom ) && ( addr >= 0xc000 ) ) return; // Can't write to ROM! + } else { + if( addr >= 0xc000 ) return; + } + + if( ( addr & 0xff00 ) == 0x0300 ) + { + if( ( addr >= 0x310 ) && ( addr < 0x324 ) ) + bd500_write( &oric->bd, addr, data ); + + else if( oric->aciabackend && ( oric->aciaoffset <= addr && addr < oric->aciaoffset+4 ) ) + acia_write( &oric->tele_acia, addr, data ); + + else if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) + ch376_oric_write(oric->ch376, addr, data); + + else + via_write( &oric->via, addr, data ); + + return; + } + oric->mem[addr] = data; +} + // Oric-1 16k + microdisc void microdisc_o16kwrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) { @@ -536,6 +567,36 @@ void microdisc_o16kwrite( struct m6502 *cpu, unsigned short addr, unsigned char oric->mem[addr&0x3fff] = data; } +// Oric-1 16k + bd500 +void bd500_o16kwrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) +{ + struct machine *oric = (struct machine *)cpu->userdata; + if( oric->romdis ) + { + if( ( oric->bd.diskrom ) && ( addr >= 0xc000 ) ) return; // Can't write to ROM! + } else { + if( addr >= 0xc000 ) return; + } + + if( ( addr & 0xff00 ) == 0x0300 ) + { + if( ( addr >= 0x310 ) && ( addr < 0x324 ) ) + bd500_write( &oric->bd, addr, data ); + + else if( oric->aciabackend && ( oric->aciaoffset <= addr && addr < oric->aciaoffset+4 ) ) + acia_write( &oric->tele_acia, addr, data ); + + else if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) + ch376_oric_write(oric->ch376, addr, data); + + else + via_write( &oric->via, addr, data ); + + return; + } + oric->mem[addr&0x3fff] = data; +} + // Pravetz void pravetz_atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) { @@ -611,6 +672,11 @@ SDL_bool isram( struct machine *oric, unsigned short addr ) if( addr >= 0xe000 ) return SDL_FALSE; break; + case DRV_BD500: + if( !oric->bd.diskrom ) return SDL_TRUE; + if( addr >= 0xc000 ) return SDL_FALSE; + break; + case DRV_JASMIN: if( oric->jasmin.olay ) return SDL_TRUE; if( addr >= 0xf800 ) return SDL_FALSE; @@ -810,6 +876,37 @@ unsigned char microdisc_atmosread( struct m6502 *cpu, unsigned short addr ) return oric->mem[addr]; } +// Oric Atmos + bd500 +unsigned char bd500_atmosread( struct m6502 *cpu, unsigned short addr ) +{ + struct machine *oric = (struct machine *)cpu->userdata; + + if( oric->romdis ) + { + if( ( oric->bd.diskrom ) && ( addr >= 0xe000 ) ) + return rom_bd500[addr-0xe000]; + } else { + if( addr >= 0xc000 ) + return oric->rom[addr-0xc000]; + } + + if( ( addr & 0xff00 ) == 0x0300 ) + { + if( ( addr >= 0x310 ) && ( addr < 0x324 ) ) + return bd500_read( &oric->bd, addr ); + + if( oric->aciabackend && ( oric->aciaoffset <= addr && addr < oric->aciaoffset+4 ) ) + return acia_read( &oric->tele_acia, addr ); + + if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) + return ch376_oric_read(oric->ch376, addr); + + return via_read( &oric->via, addr ); + } + + return oric->mem[addr]; +} + // Oric-1 16k + microdisc unsigned char microdisc_o16kread( struct m6502 *cpu, unsigned short addr ) { @@ -841,6 +938,37 @@ unsigned char microdisc_o16kread( struct m6502 *cpu, unsigned short addr ) return oric->mem[addr&0x3fff]; } +// Oric-1 16k + bd500 +unsigned char bd500_o16kread( struct m6502 *cpu, unsigned short addr ) +{ + struct machine *oric = (struct machine *)cpu->userdata; + + if( oric->romdis ) + { + if( ( oric->bd.diskrom ) && ( addr >= 0xe000 ) ) + return rom_bd500[addr-0xe000]; + } else { + if( addr >= 0xc000 ) + return oric->rom[addr-0xc000]; + } + + if( ( addr & 0xff00 ) == 0x0300 ) + { + if( ( addr >= 0x310 ) && ( addr < 0x324 ) ) + return bd500_read( &oric->bd, addr ); + + if( oric->aciabackend && ( oric->aciaoffset <= addr && addr < oric->aciaoffset+4 ) ) + return acia_read( &oric->tele_acia, addr ); + + if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) + return ch376_oric_read(oric->ch376, addr); + + return via_read( &oric->via, addr ); + } + + return oric->mem[addr&0x3fff]; +} + // Pravetz unsigned char pravetz_atmosread( struct m6502 *cpu, unsigned short addr ) { @@ -889,7 +1017,6 @@ unsigned char lightpen_read( struct m6502 *cpu, unsigned short addr ) return oric->read_not_lightpen( cpu, addr ); } - static SDL_bool load_rom( struct machine *oric, char *fname, int size, unsigned char *where, struct symboltable *stab, int symflags ) { SDL_RWops *f; @@ -991,6 +1118,7 @@ void preinit_machine( struct machine *oric ) oric->tapecap = NULL; oric->tapenoise = SDL_FALSE; oric->rawtape = SDL_FALSE; + oric->rom16 = SDL_TRUE; oric->joy_iface = JOYIFACE_NONE; oric->joymode_a = JOYMODE_KB1; @@ -1033,6 +1161,7 @@ void preinit_machine( struct machine *oric ) oric->printenable = SDL_TRUE; oric->printfilter = SDL_TRUE; + oric->dcadjust = SDL_TRUE; oric->aciabackend = ACIA_TYPE_NONE; oric->aciaoffset = 0x31c; @@ -1050,6 +1179,7 @@ void preinit_machine( struct machine *oric ) void load_diskroms( struct machine *oric ) { microdiscrom_valid = load_rom( oric, mdiscromfile, 8192, rom_microdisc, &sym_microdisc, SYMF_ROMDIS1|SYMF_MICRODISC ); + bd500rom_valid = load_rom( oric, bd500romfile, 8192, rom_bd500, &sym_bd500, SYMF_ROMDIS1|SYMF_BD500 ); jasminrom_valid = load_rom( oric, jasmnromfile, 2048, rom_jasmin, &sym_jasmin, SYMF_ROMDIS1|SYMF_JASMIN ); pravetzrom_valid = load_rom( oric, pravetzromfile[1], 512, rom_pravetz, &sym_pravetz, SYMF_PRAVZ8D ); } @@ -1182,12 +1312,20 @@ SDL_bool emu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) case SDLK_F4: if( ( shifted ) && ( oric->drivetype == DRV_JASMIN ) ) - oric->cpu.write( &oric->cpu, 0x3fb, 1 ); // ROMDIS + { + // ROMDIS + oric->cpu.write( &oric->cpu, 0x3fb, 1 ); + } if( oric->drivetype == DRV_MICRODISC ) { oric->romdis = SDL_TRUE; microdisc_init( &oric->md, &oric->wddisk, oric ); } + else if( oric->drivetype == DRV_BD500 ) + { + oric->romdis = SDL_TRUE; + bd500_init( &oric->bd, &oric->wddisk, oric ); + } else if( oric->drivetype == DRV_PRAVETZ ) { oric->pravetz.olay = 0; @@ -1574,6 +1712,15 @@ static void setup_for_microdisc( struct machine *oric, void *readptr, void *writ oric->disksyms = &sym_microdisc; } +static void setup_for_bd500( struct machine *oric, void *readptr, void *writeptr ) +{ + oric->cpu.read = readptr; + oric->cpu.write = writeptr; + oric->romdis = SDL_TRUE; + bd500_init( &oric->bd, &oric->wddisk, oric ); + oric->disksyms = &sym_bd500; +} + static void setup_for_jasmin( struct machine *oric, void *readptr, void *writeptr ) { oric->cpu.read = readptr; @@ -1654,6 +1801,10 @@ SDL_bool init_machine( struct machine *oric, int type, SDL_bool nukebreakpoints setup_for_microdisc( oric, microdisc_o16kread, microdisc_o16kwrite); break; + case DRV_BD500: + setup_for_bd500( oric, bd500_o16kread, bd500_o16kwrite); + break; + case DRV_JASMIN: setup_for_jasmin( oric, jasmin_o16kread, jasmin_o16kwrite); break; @@ -1687,6 +1838,10 @@ SDL_bool init_machine( struct machine *oric, int type, SDL_bool nukebreakpoints setup_for_microdisc( oric, microdisc_atmosread, microdisc_atmoswrite); break; + case DRV_BD500: + setup_for_bd500( oric, bd500_atmosread, bd500_atmoswrite); + break; + case DRV_JASMIN: setup_for_jasmin( oric, jasmin_atmosread, jasmin_atmoswrite); break; @@ -1720,6 +1875,10 @@ SDL_bool init_machine( struct machine *oric, int type, SDL_bool nukebreakpoints setup_for_microdisc( oric, microdisc_atmosread, microdisc_atmoswrite); break; + case DRV_BD500: + setup_for_bd500( oric, bd500_atmosread, bd500_atmoswrite); + break; + case DRV_JASMIN: setup_for_jasmin( oric, jasmin_atmosread, jasmin_atmoswrite); break; @@ -1787,6 +1946,10 @@ SDL_bool init_machine( struct machine *oric, int type, SDL_bool nukebreakpoints setup_for_microdisc( oric, microdisc_atmosread, microdisc_atmoswrite); break; + case DRV_BD500: + setup_for_bd500( oric, bd500_atmosread, bd500_atmoswrite); + break; + case DRV_JASMIN: setup_for_jasmin( oric, jasmin_atmosread, jasmin_atmoswrite); break; @@ -1853,8 +2016,9 @@ SDL_bool init_machine( struct machine *oric, int type, SDL_bool nukebreakpoints void shut_machine( struct machine *oric ) { if( oric->drivetype == DRV_MICRODISC ) { microdisc_free( &oric->md ); oric->drivetype = DRV_NONE; } + if( oric->drivetype == DRV_BD500 ) { bd500_free( &oric->bd ); oric->drivetype = DRV_NONE; } if( oric->drivetype == DRV_JASMIN ) { jasmin_free( &oric->jasmin ); oric->drivetype = DRV_NONE; } - if( oric->drivetype == DRV_PRAVETZ ) { pravetz_free( &oric->pravetz ); oric->drivetype = DRV_NONE; } + if( oric->drivetype == DRV_PRAVETZ ) { pravetz_free( &oric->pravetz ); oric->drivetype = DRV_NONE; } if( oric->mem ) { free( oric->mem ); oric->mem = NULL; oric->rom = NULL; } if( oric->prf ) { fclose( oric->prf ); oric->prf = NULL; } if( oric->tsavf ) tape_stop_savepatch( oric ); @@ -1891,6 +2055,7 @@ void setdrivetype( struct machine *oric, struct osdmenuitem *mitem, int type ) switch( type ) { case DRV_MICRODISC: + case DRV_BD500: case DRV_JASMIN: case DRV_PRAVETZ: oric->drivetype = type; diff --git a/machine.h b/machine.h index a71555f9..44750137 100644 --- a/machine.h +++ b/machine.h @@ -27,7 +27,8 @@ enum DRV_NONE = 0, DRV_JASMIN, DRV_MICRODISC, - DRV_PRAVETZ + DRV_BD500, + DRV_PRAVETZ, }; enum @@ -70,6 +71,7 @@ enum IMG_ATMOS_MICRODISC, IMG_ATMOS_JASMIN, IMG_TELESTRAT_DISK, + IMG_BD500_DISK, IMG_PRAVETZ_DISK, IMG_GUESS_MICRODISC, IMG_SNAPSHOT, @@ -132,7 +134,7 @@ struct machine int vsync; SDL_bool vid_double; - SDL_bool romdis, romon; + SDL_bool romdis, romon, rom16; SDL_bool vsynchack; unsigned short vid_addr; @@ -147,6 +149,7 @@ struct machine int drivetype; struct wd17xx wddisk; struct microdisc md; + struct bd500 bd; struct jasmin jasmin; struct pravetz pravetz; char diskname[MAX_DRIVES][32]; @@ -239,6 +242,7 @@ struct machine SDL_bool printenable; SDL_bool printfilter; + SDL_bool dcadjust; SDL_bool lightpen; Uint8 lightpenx, lightpeny; diff --git a/main.c b/main.c index 1f27ee50..a2289aa4 100644 --- a/main.c +++ b/main.c @@ -81,6 +81,7 @@ extern char tapepath[], diskpath[], telediskpath[], pravdiskpath[]; extern char atmosromfile[]; extern char oric1romfile[]; extern char mdiscromfile[]; +extern char bd500romfile[]; extern char jasmnromfile[]; extern char pravetzromfile[2][1024]; extern char telebankfiles[8][1024]; @@ -131,6 +132,8 @@ struct start_opts Sint32 start_syms_count; char start_snapshot[1024]; char *start_breakpoint; + Sint32 start_disks_count; + char start_disks[4][1024]; }; static char *machtypes[] = { "oric1", @@ -143,6 +146,7 @@ static char *machtypes[] = { "oric1", static char *disktypes[] = { "none", "jasmin", "microdisc", + "bd500", "pravetz", NULL }; @@ -418,6 +422,7 @@ static void load_config( struct start_opts *sto, struct machine *oric ) if( read_config_bool( &sto->lctmp[i], "aratio", &oric->aratio ) ) continue; if( read_config_bool( &sto->lctmp[i], "hstretch", &oric->hstretch ) ) continue; if( read_config_bool( &sto->lctmp[i], "palghosting", &oric->palghost ) ) continue; + if( read_config_bool( &sto->lctmp[i], "rom16", &oric->rom16 ) ) continue; if( read_config_string( &sto->lctmp[i], "diskimage", sto->start_disk, 1024 ) ) continue; if( read_config_string( &sto->lctmp[i], "tapeimage", sto->start_tape, 1024 ) ) continue; if( read_config_string( &sto->lctmp[i], "symbols", sto->start_syms, 1024 ) ) continue; @@ -428,6 +433,7 @@ static void load_config( struct start_opts *sto, struct machine *oric ) if( read_config_string( &sto->lctmp[i], "atmosrom", atmosromfile, 1024 ) ) continue; if( read_config_string( &sto->lctmp[i], "oric1rom", oric1romfile, 1024 ) ) continue; if( read_config_string( &sto->lctmp[i], "mdiscrom", mdiscromfile, 1024 ) ) continue; + if( read_config_string( &sto->lctmp[i], "bd500rom", bd500romfile, 1024 ) ) continue; if( read_config_string( &sto->lctmp[i], "jasminrom", jasmnromfile, 1024 ) ) continue; if( read_config_string( &sto->lctmp[i], "pravetzrom", pravetzromfile[0], 1024 ) ) continue; if( read_config_string( &sto->lctmp[i], "pravetz8drom", pravetzromfile[1], 1024 ) ) continue; @@ -459,6 +465,7 @@ static void load_config( struct start_opts *sto, struct machine *oric ) if( read_config_bool( &sto->lctmp[i], "lightpen", &oric->lightpen ) ) continue; if( read_config_bool( &sto->lctmp[i], "printenable", &oric->printenable ) ) continue; if( read_config_bool( &sto->lctmp[i], "printfilter", &oric->printfilter ) ) continue; + if( read_config_bool( &sto->lctmp[i], "dcadjust", &oric->dcadjust ) ) continue; if( read_config_int( &sto->lctmp[i], "serial_address", &oric->aciaoffset, 0x310, 0x3fc ) ) continue; if( read_config_string( &sto->lctmp[i], "serial", oric->aciabackendname, ACIA_BACKEND_NAME_LEN ) ) { @@ -552,6 +559,7 @@ static void usage( int ret ) "\n" " \"microdisc\" or \"m\" for Microdisc\n" " \"jasmin\" or \"j\" for Jasmin\n" + " \"bd500\" or \"b\" for Byte Drive 500\n" " \"pravetz\" or \"p\" for Pravetz\n" " \"none\" or \"n\"\n" "\n" @@ -653,6 +661,11 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) sto->start_disktype_set = SDL_FALSE; sto->start_debug = SDL_FALSE; sto->start_rendermode = RENDERMODE_SW; + sto->start_disks_count = 0; + sto->start_disks[0][0] = 0; + sto->start_disks[1][0] = 0; + sto->start_disks[2][0] = 0; + sto->start_disks[3][0] = 0; sto->start_disk[0] = 0; sto->start_tape[0] = 0; sto->start_syms[0] = 0; @@ -891,6 +904,7 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) case IMG_ATMOS_MICRODISC: case IMG_ATMOS_JASMIN: case IMG_TELESTRAT_DISK: + case IMG_BD500_DISK: case IMG_PRAVETZ_DISK: case IMG_GUESS_MICRODISC: printf("'%s' seems to be a disk image.\n", opt_arg); @@ -941,6 +955,11 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) if (!sto->start_disktype_set) sto->start_disktype = DRV_MICRODISC; break; + case IMG_BD500_DISK: + if (!sto->start_machine_set) sto->start_machine = MACH_ATMOS; + if (!sto->start_disktype_set) sto->start_disktype = DRV_BD500; + break; + case IMG_PRAVETZ_DISK: if (!sto->start_machine_set) sto->start_machine = MACH_PRAVETZ; if (!sto->start_disktype_set) sto->start_disktype = DRV_PRAVETZ; @@ -960,8 +979,17 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) printf("'%s' seems to be a snapshot file.\n", opt_arg); strncpy( sto->start_snapshot, opt_arg, 1024); sto->start_snapshot[1023] = 0; + sto->start_disk[0] = 0; break; } + if( sto->start_disk[0] ) + { + if( sto->start_disks_count < 4 ) + { + strcpy( sto->start_disks[sto->start_disks_count], sto->start_disk ); + sto->start_disks_count++; + } + } } else { error_printf( "No disk image specified" ); free( sto ); @@ -979,6 +1007,13 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) sto->start_disktype_set = SDL_TRUE; break; } + if(( strcasecmp( opt_arg, "bd500" ) == 0 ) || + ( strcasecmp( opt_arg, "b" ) == 0 )) + { + sto->start_disktype = DRV_BD500; + sto->start_disktype_set = SDL_TRUE; + break; + } if(( strcasecmp( opt_arg, "jasmin" ) == 0 ) || ( strcasecmp( opt_arg, "j" ) == 0 )) { @@ -1098,6 +1133,13 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) sto->start_disk[1023] = 0; break; + case IMG_BD500_DISK: + if (!sto->start_machine_set) sto->start_machine = MACH_ATMOS; + if (!sto->start_disktype_set) sto->start_disktype = DRV_BD500; + strncpy( sto->start_disk, argv[i], 1024 ); + sto->start_disk[1023] = 0; + break; + case IMG_PRAVETZ_DISK: if (!sto->start_machine_set) sto->start_machine = MACH_PRAVETZ; if (!sto->start_disktype_set) sto->start_disktype = DRV_PRAVETZ; @@ -1120,6 +1162,14 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) free( sto ); usage( EXIT_FAILURE ); } + if( sto->start_disk[0] ) + { + if( sto->start_disks_count < 4 ) + { + strcpy( sto->start_disks[sto->start_disks_count], sto->start_disk ); + sto->start_disks_count++; + } + } } } @@ -1142,7 +1192,14 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) if( sto->start_disk[0] ) { - diskimage_load( oric, sto->start_disk, 0 ); + for( i=0; i<4; i++ ) + { + disk_eject( oric, i ); + } + for( i=0; istart_disks_count; i++ ) + { + diskimage_load( oric, sto->start_disks[i], i ); + } switch (oric->drivetype) { case DRV_PRAVETZ: @@ -1283,7 +1340,16 @@ void frameloop_overclock( struct machine *oric, SDL_bool *framedone, SDL_bool *n /* Move the emulation on */ via_clock( &oric->via, instcycles ); ay_ticktock( &oric->ay, instcycles ); - if((oric->drivetype == DRV_MICRODISC) || (oric->drivetype == DRV_JASMIN)) wd17xx_ticktock( &oric->wddisk, instcycles ); + + switch( oric->drivetype ) + { + case DRV_MICRODISC: + case DRV_BD500: + case DRV_JASMIN: + wd17xx_ticktock( &oric->wddisk, instcycles ); + break; + } + if( oric->type == MACH_TELESTRAT ) { via_clock( &oric->tele_via, instcycles ); @@ -1331,7 +1397,16 @@ void frameloop_normal( struct machine *oric, SDL_bool *framedone, SDL_bool *need tape_patches( oric ); via_clock( &oric->via, oric->cpu.icycles ); ay_ticktock( &oric->ay, oric->cpu.icycles ); - if((oric->drivetype == DRV_MICRODISC) || (oric->drivetype == DRV_JASMIN)) wd17xx_ticktock( &oric->wddisk, oric->cpu.icycles ); + + switch( oric->drivetype ) + { + case DRV_MICRODISC: + case DRV_BD500: + case DRV_JASMIN: + wd17xx_ticktock( &oric->wddisk, oric->cpu.icycles ); + break; + } + if( oric->type == MACH_TELESTRAT ) { via_clock( &oric->tele_via, oric->cpu.icycles ); diff --git a/monitor.c b/monitor.c index 3660bf33..0430b53c 100644 --- a/monitor.c +++ b/monitor.c @@ -2958,7 +2958,7 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) mon_set_modified( oric ); oric->cpu.write( &oric->cpu, v, w ); - updatepreview = SDL_TRUE; + updatepreview = SDL_TRUE; break; case 'w': @@ -3018,48 +3018,6 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) break; case 'd': - if( cmd[i+1] == 'f' ) - { - i+=2; - - if( !mon_getnum( oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) - { - mon_str( "Start address expected\n" ); - break; - } - - mon_addr = v; - if( !mon_getnum( oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) - { - mon_str( "End address expected\n" ); - break; - } - - while( isws( cmd[i] ) ) i++; - if( !cmd[i] ) - { - mon_str( "Filename expected" ); - break; - } - - f = fopen( &cmd[i], "w" ); - if( !f ) - { - mon_printf( "Unable to open '%s'", &cmd[i] ); - break; - } - - while( mon_addr <= v ) - { - SDL_bool looped; - fprintf( f, "%s\n", mon_disassemble( oric, &mon_addr, &looped, SDL_TRUE ) ); - if( looped ) break; - } - - fclose( f ); - break; - } - lastcmd = cmd[i]; i++; if( mon_getnum( oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) @@ -3158,12 +3116,53 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) setemumode( oric, NULL, EM_RUNNING ); break; - case 'w': + case 'f': lastcmd = 0; i++; switch( cmd[i] ) { - case 'm': + // fd - disassemble to file + case 'd': + i++; + if( !mon_getnum( oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) + { + mon_str( "Start address expected\n" ); + break; + } + + mon_addr = v; + if( !mon_getnum( oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) + { + mon_str( "End address expected\n" ); + break; + } + + while( isws( cmd[i] ) ) i++; + if( !cmd[i] ) + { + mon_str( "Filename expected" ); + break; + } + + f = fopen( &cmd[i], "w" ); + if( !f ) + { + mon_printf( "Unable to open '%s'", &cmd[i] ); + break; + } + + while( mon_addr <= v ) + { + SDL_bool looped; + fprintf( f, "%s\n", mon_disassemble( oric, &mon_addr, &looped, SDL_TRUE ) ); + if( looped ) break; + } + + fclose( f ); + break; + + // fw - write mem to bin file + case 'w': i++; if( !mon_getnum( oric, &v, cmd, &i, SDL_TRUE, SDL_TRUE, SDL_TRUE, SDL_TRUE ) ) { @@ -3207,6 +3206,49 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) free( tmem ); mon_printf( "Written %d bytes to '%s'", w, &cmd[i] ); break; + + // ToDo: fw - write mem to tap file + // case 't': + // break; + + // fr - read file to mem + case 'r': + i++; + if( !mon_getnum( oric, &v, cmd, &i, SDL_TRUE, SDL_TRUE, SDL_TRUE, SDL_TRUE ) ) + { + mon_str( "Address expected" ); + break; + } + + while( isws( cmd[i] ) ) i++; + if( !cmd[i] ) + { + mon_str( "Filename expected" ); + break; + } + + f = fopen( &cmd[i], "rb" ); + if( !f ) + { + mon_printf( "Unable to open '%s'", &cmd[i] ); + break; + } + + mon_set_modified( oric ); + for( j=0; !feof( f ); ) + { + w = fgetc(f); + if( -1 != w ) + { + oric->cpu.write( &oric->cpu, v & 0xffff, w & 0xff ); + v++; + j++; + } + } + fclose( f ); + mon_printf( "%d bytes read from '%s'", j, &cmd[i] ); + updatepreview = SDL_TRUE; + break; } break; @@ -3277,7 +3319,6 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) break; case 1: - mon_str( " df - Disassemble to file" ); mon_str( " m - Dump memory" ); mon_str( " mm - Modify memory" ); mon_str( " mw - Memory watch at addr" ); @@ -3293,7 +3334,32 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) mon_str( " sl - Load user symbols" ); mon_str( " sx - Export user symbols" ); mon_str( " sz - Zap user symbols" ); - mon_str( " wm - Write mem to disk" ); + mon_str( " " ); + mon_str( " " ); + mon_str( "---- MORE" ); + helpcount++; + break; + + case 2: + mon_str( " fd - Disassemble to file" ); + mon_str( " fw - Write mem to bin file" ); +// ToDo: mon_str( " ft - Write mem to tap file" ); + mon_str( " fr - Read bin file to mem" ); + mon_str( " " ); + mon_str( " " ); + mon_str( " " ); + mon_str( " " ); + mon_str( " " ); + mon_str( " " ); + mon_str( " " ); + mon_str( " " ); + mon_str( " " ); + mon_str( " " ); + mon_str( " " ); + mon_str( " " ); + mon_str( " " ); + mon_str( " " ); + mon_str( " " ); helpcount = 0; lastcmd = 0; break; diff --git a/monitor.h b/monitor.h index 78c96297..2b2bdca4 100644 --- a/monitor.h +++ b/monitor.h @@ -48,6 +48,8 @@ #define SYMF_TELEBANK7 (1< Date: Wed, 22 Jul 2020 23:10:31 +0300 Subject: [PATCH 018/143] Fixed crash with visual keyboard on/off --- ChangeLog.txt | 1 + disk.c | 8 ++++---- main.c | 3 ++- system_sdl.c | 10 +++++++--- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index b106fc9b..5e41dcc5 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -3,6 +3,7 @@ Oricutron ChangeLog pre-release changes (work in progress) -------------------------------------- +* Fixed crash with visual keyboard on/off * Added Byte Drive BD-500 support * Added possibility to load more images from command line * Fixed memory leaks and improvements in disk support diff --git a/disk.c b/disk.c index 96194ed1..cc758c0a 100644 --- a/disk.c +++ b/disk.c @@ -312,8 +312,8 @@ SDL_bool diskimage_save( struct machine *oric, char *fname, int drive ) // If we are not just overwriting the original file, remember the new filename if( fname != oric->wddisk.disk[drive]->filename ) { - strncpy( oric->wddisk.disk[drive]->filename, fname, 4096+512 ); - oric->wddisk.disk[drive]->filename[4096+511] = 0; + strncpy( oric->wddisk.disk[drive]->filename, fname, 4096+512-1 ); + oric->wddisk.disk[drive]->filename[4096+512-1] = 0; } // The image in memory is no longer different to the last saved version @@ -448,8 +448,8 @@ SDL_bool diskimage_load( struct machine *oric, char *fname, int drive ) oric->wddisk.disk[drive]->modified_time = 0; // Remember the filename of the image for this drive - strncpy( oric->wddisk.disk[drive]->filename, fname, 4096+512 ); - oric->wddisk.disk[drive]->filename[4096+511] = 0; + strncpy( oric->wddisk.disk[drive]->filename, fname, 4096+512-1 ); + oric->wddisk.disk[drive]->filename[4096+512-1] = 0; // Come up with a suitable short name for popups etc. if( strlen( fname ) > 31 ) diff --git a/main.c b/main.c index a2289aa4..4b89050b 100644 --- a/main.c +++ b/main.c @@ -802,7 +802,8 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) else { #ifdef BACKEND_COM - strncpy(oric->aciabackendname, opt_arg, ACIA_BACKEND_NAME_LEN); + strncpy(oric->aciabackendname, opt_arg, ACIA_BACKEND_NAME_LEN-1); + oric->aciabackendname[ACIA_BACKEND_NAME_LEN-1] = 0; oric->aciabackendcfg = oric->aciabackend = ACIA_TYPE_COM; #endif } diff --git a/system_sdl.c b/system_sdl.c index 43306ebd..efe66f8c 100644 --- a/system_sdl.c +++ b/system_sdl.c @@ -265,7 +265,7 @@ SDL_COMPAT_KEY SDL_COMPAT_TranslateUnicode(SDL_KEYSYM keysym) case '6': return '^'; case '7': - return '&'; + return '&'; case '8': return '*'; case '9': @@ -388,8 +388,6 @@ SDL_Surface* SDL_COMPAT_SetVideoMode(int width, int height, int bitsperpixel, Ui if (g_icon) { SDL_SetWindowIcon(g_window, g_icon); - // ...and the surface containing the icon pixel data is no longer required. - SDL_FreeSurface(g_icon); } if(flags & SDL_WINDOW_OPENGL) @@ -446,6 +444,12 @@ void SDL_COMPAT_Quit(void) void SDL_COMPAT_Quit(void) { FreeResources(); + if (g_icon) + { + // ...and the surface containing the icon pixel data is no longer required. + SDL_FreeSurface(g_icon); + g_icon = NULL; + } SDL_Quit(); } #endif From 44fb9bbb659e6a9baeea5011f8fedda8cf29b7dc Mon Sep 17 00:00:00 2001 From: jede Date: Tue, 29 Sep 2020 23:45:17 +0200 Subject: [PATCH 019/143] Fix tape bu --- machine.c | 23 +++++++++++++++++++---- main.c | 4 +++- oricutron.cfg | 2 +- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/machine.c b/machine.c index 9f4de745..404734e8 100644 --- a/machine.c +++ b/machine.c @@ -318,7 +318,7 @@ void atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) if (oric->twilighteboard_activated && addr >= 0xc000 ) twilighteboard_oric_ROM_RAM_write(oric->twilighte,addr-0xc000,data); else - if( ( !oric->romdis ) && ( addr >= 0xc000 ) ) return; // Can't write to ROM! + if( ( !oric->romdis ) && ( addr >= 0xc000 ) ) return; // Can't write to ROM! if( ( addr & 0xff00 ) == 0x0300 ) { @@ -1221,15 +1221,27 @@ SDL_bool emu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) via_init( &oric->tele_via, oric, VIA_TELESTRAT ); acia_init( &oric->tele_acia, oric ); + + if (oric->twilighteboard_activated) + { + oric->ch376_activated=SDL_TRUE; + oric->twilighte=twilighte_oric_init(); + } + if (oric->twilighte==NULL) + { + oric->twilighteboard_activated=SDL_FALSE; + } + else + oric->ch376_activated=SDL_TRUE; + if (oric->ch376_activated) { oric->ch376 = ch376_oric_init(); if (oric->ch376 != NULL) ch376_oric_config(oric->ch376); } - if (oric->twilighteboard_activated) - oric->twilighte=twilighte_oric_init(); - if (oric->twilighte==NULL) oric->twilighteboard_activated=SDL_FALSE; + + break; @@ -1848,7 +1860,10 @@ SDL_bool init_machine( struct machine *oric, int type, SDL_bool nukebreakpoints oric->tapename[0] = 0; tape_rewind( oric ); if (oric->twilighteboard_activated) + { oric->twilighte=twilighte_oric_init(); + oric->ch376_activated=SDL_TRUE; + } if (oric->twilighte==NULL) oric->twilighteboard_activated=SDL_FALSE; m6502_reset( &oric->cpu ); diff --git a/main.c b/main.c index 044c5f19..387163a9 100644 --- a/main.c +++ b/main.c @@ -1329,7 +1329,9 @@ void frameloop_normal( struct machine *oric, SDL_bool *framedone, SDL_bool *need break; } - tape_patches( oric ); + if (!oric->twilighteboard_activated) + tape_patches( oric ); + via_clock( &oric->via, oric->cpu.icycles ); ay_ticktock( &oric->ay, oric->cpu.icycles ); if((oric->drivetype == DRV_MICRODISC) || (oric->drivetype == DRV_JASMIN)) wd17xx_ticktock( &oric->wddisk, oric->cpu.icycles ); diff --git a/oricutron.cfg b/oricutron.cfg index 37c27666..c9043de6 100644 --- a/oricutron.cfg +++ b/oricutron.cfg @@ -189,7 +189,7 @@ kbjoy2_fire2 = 'N' kbjoy2_fire3 = 'LALT' ; Visual keyboard -;show_keyboard = yes +show_keyboard = yes ;sticky_mod_keys = yes ;autoload_keyboard_mapping = 'keymap/my_keymap.kma' From 9f379dce435a6ece250646406c7a2fb76d4a74be Mon Sep 17 00:00:00 2001 From: jede Date: Tue, 29 Sep 2020 23:54:12 +0200 Subject: [PATCH 020/143] Now we can access to ram and swapping works --- .../twilighte_card/oric_twilighte_board_plugin.c | 14 +++++++++----- plugins/twilighte_card/twilighte.cfg | 12 +++++++++++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c index 83fa98c9..908d5bd4 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -187,14 +187,18 @@ unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uin else //twilighte->twilrombankdata[0][0]=0; { - if (twilighte->current_bank<5) - bank=twilighte->current_bank*twilighte->t_banking_register; + if (twilighte->current_bank<5) + { + + + bank=twilighte->current_bank*(twilighte->t_banking_register+1); + } else bank=twilighte->current_bank; - //if (twilighte->t_register&32==32) // Is it a ram bank access ? - //data=twilighte->twilrambankdata[bank][addr]; - //else + if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? + data=twilighte->twilrambankdata[bank][addr]; + else data=twilighte->twilrombankdata[bank][addr]; //error_printf( "Read rom overlay addr %x\n",0xc000+addr); } diff --git a/plugins/twilighte_card/twilighte.cfg b/plugins/twilighte_card/twilighte.cfg index 6a6b33f8..10a7d0fb 100644 --- a/plugins/twilighte_card/twilighte.cfg +++ b/plugins/twilighte_card/twilighte.cfg @@ -1,4 +1,14 @@ -twilbankrom7='roms/basic_noram' +twilbankrom11='roms/basic_noram' +twilbankrom10='roms/basic_noram' +twilbankrom9='roms/basic_noram' +twilbankrom8='roms/basic_noram' +twilbankrom7='roms/kernel' twilbankrom6='roms/basic_noram' twilbankrom5='roms/shell' +twilbankrom4='roms/shell' +twilbankrom3='roms/shell' +twilbankrom2='roms/shell' +twilbankrom1='roms/shell' + +twilbankram1='roms/orixbank1' \ No newline at end of file From 505a525a4bb7b6866ba7af5faf3a10c51b726784 Mon Sep 17 00:00:00 2001 From: jede Date: Wed, 30 Sep 2020 22:56:17 +0200 Subject: [PATCH 021/143] Fix bug with order of rom and fix bug in order to write into ram --- .../oric_twilighte_board_plugin.c | 109 ++++++++++-------- 1 file changed, 63 insertions(+), 46 deletions(-) diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c index 908d5bd4..16fb184f 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -27,7 +27,9 @@ struct twilighte unsigned char t_register; unsigned char t_banking_register; - char twilrombankfiles[32][1024]; + unsigned char twilrombankfiles[32][1024]; + + unsigned char twilrambankfiles[32][1024]; unsigned char twilrombankdata[32][16834]; unsigned char twilrambankdata[32][16834]; @@ -116,50 +118,50 @@ struct twilighte * twilighte_oric_init(void) twilighte->t_register=128+1; // Firmware f = fopen( "plugins/twilighte_card/twilighte.cfg", "r" ); - if( !f ) { + if( !f ) + { error_printf( "plugins/twilighte_card/twilighte.cfg not found\n" ); return NULL; } - for( j=1; j<31; j++ ) twilighte->twilrombankfiles[j][0]=0; + for( j=1; j<31; j++ ) + { + twilighte->twilrombankfiles[j][0]=0; + twilighte->twilrambankfiles[j][0]=0; + } while( !feof( f ) ) - { - fgets( line, 1024, f ); - //error_printf( line ); - for( j=1; j<31; j++ ) - { - sprintf( tbtmp, "twilbankrom%c", j+'0' ); - - if( read_config_string( line, tbtmp, twilighte->twilrombankfiles[j], 1024 ) ) - { - //error_printf( line ); - error_printf("File: %d %s",j,twilighte->twilrombankfiles[j]); - + { + fgets( line, 1024, f ); + //error_printf( line ); + for( j=1; j<31; j++ ) + { + sprintf( tbtmp, "twilbankrom%d", j); + + if( read_config_string( line, tbtmp, twilighte->twilrombankfiles[j], 1024 ) ) + { + error_printf("File: A %d %s",j,twilighte->twilrombankfiles[j]); break; - } + } - } - } + } + } fclose( f ); // Now load rom for( i=0; i<31; i++ ) - { - -// oric->rom = oric->tele_bank[i].ptr = &oric->mem[0x0c000+(i*0x4000)]; - + { if( twilighte->twilrombankfiles[i][0]!=0 ) - { - if( !load_rom_twilighte( twilighte->twilrombankfiles[i], -16384, twilighte->twilrombankdata[i] ) ) { + { + if( !load_rom_twilighte( twilighte->twilrombankfiles[i], -16384, twilighte->twilrombankdata[i] ) ) + { error_printf("Cannot load %s",twilighte->twilrombankfiles[i]); - return NULL; - } + return NULL; + } - } - } + } /* */ @@ -175,23 +177,22 @@ struct twilighte * twilighte_oric_init(void) unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uint16_t addr) { unsigned char data; unsigned char bank; -// error_printf( "%d",twilighte->current_bank); -// return 0; + if (twilighte->current_bank==0) { - //error_printf( "Read ram overlay %x",0xc000+addr); - data=twilighte->twilrambankdata[0][addr]; - //error_printf( "Read ram overlay %x data : %d",0xc000+addr,data); - //getchar(); + data=twilighte->twilrambankdata[0][addr]; + } else -//twilighte->twilrombankdata[0][0]=0; { if (twilighte->current_bank<5) { + if (twilighte->t_banking_register!=0) + bank=twilighte->current_bank+8+((twilighte->t_banking_register-1)*4); + + else + bank=twilighte->current_bank; - - bank=twilighte->current_bank*(twilighte->t_banking_register+1); } else bank=twilighte->current_bank; @@ -200,25 +201,41 @@ unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uin data=twilighte->twilrambankdata[bank][addr]; else data=twilighte->twilrombankdata[bank][addr]; - //error_printf( "Read rom overlay addr %x\n",0xc000+addr); } -//error_printf( "addr : %u c000 : %x value : %d\n",addr,0xc000+addr,data); -//data=(unsigned char)twilighte->twilrombankdata[1][0]; + return data; } -unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uint16_t addr, unsigned char data) { +unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uint16_t addr, unsigned char data) +{ - if (twilighte->current_bank==0) - { - //error_printf( "write ram overlay : %x %d\n",0xc000+addr,data); + unsigned char bank; + if (twilighte->current_bank==0) + { twilighte->twilrambankdata[twilighte->current_bank][addr]=data; - //getchar(); - } + } + else + { + if (twilighte->current_bank<5) + { + + if (twilighte->t_banking_register!=0) + bank=twilighte->current_bank+8+((twilighte->t_banking_register-1)*4); + + else + bank=twilighte->current_bank; + } + else + bank=twilighte->current_bank; + + if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? + twilighte->twilrambankdata[bank][addr]=data; + // ROM is readonly + } // return 0; From 493cdff51bd88ffad1beda1bd7827c66a1ff69d6 Mon Sep 17 00:00:00 2001 From: jede Date: Wed, 30 Sep 2020 23:50:28 +0200 Subject: [PATCH 022/143] Fix bug : loading rom greater than 10 was not working --- .../oric_twilighte_board_plugin.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c index 16fb184f..e077cb82 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -133,15 +133,20 @@ struct twilighte * twilighte_oric_init(void) while( !feof( f ) ) { fgets( line, 1024, f ); - //error_printf( line ); for( j=1; j<31; j++ ) { - sprintf( tbtmp, "twilbankrom%d", j); - - if( read_config_string( line, tbtmp, twilighte->twilrombankfiles[j], 1024 ) ) + if (j>9) + sprintf( tbtmp, "twilbankrom%d", j); + else + sprintf( tbtmp, "twilbankrom0%d", j); + + if (twilighte->twilrombankfiles[j][0]==0) { - error_printf("File: A %d %s",j,twilighte->twilrombankfiles[j]); - break; + if( read_config_string( line, tbtmp, twilighte->twilrombankfiles[j], 1024 ) ) + { + + break; + } } } From d00bcd496ac27e7c512aea2c647d88568852a807 Mon Sep 17 00:00:00 2001 From: jede Date: Thu, 1 Oct 2020 00:42:33 +0200 Subject: [PATCH 023/143] Add port B for joysticks --- .../oric_twilighte_board_plugin.c | 308 +++++++++--------- 1 file changed, 158 insertions(+), 150 deletions(-) diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c index e077cb82..6c4225f3 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -2,6 +2,9 @@ #define TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA 0x323 #define TWILIGHTE_CARD_ORIC_EXTENSION_DDRA 0x321 +#define TWILIGHTE_CARD_ORIC_EXTENSION_VDDRB 0x322 +#define TWILIGHTE_CARD_ORIC_EXTENSION_DDRB 0x320 + #define TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER 0x342 #define TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER 0x343 @@ -27,18 +30,21 @@ struct twilighte unsigned char t_register; unsigned char t_banking_register; - unsigned char twilrombankfiles[32][1024]; + char twilrombankfiles[32][1024]; unsigned char twilrambankfiles[32][1024]; unsigned char twilrombankdata[32][16834]; unsigned char twilrambankdata[32][16834]; - //struct twilbankinfo rom_bank[32]; + unsigned char VDDRA; unsigned char DDRA; + + unsigned char VDDRB; + unsigned char DDRB; unsigned char current_bank; - //struct twilbankinfo ram_bank[32]; + }; @@ -105,199 +111,201 @@ static SDL_bool load_rom_twilighte( char *fname, int size, unsigned char where[ struct twilighte * twilighte_oric_init(void) { - //struct twilighte * temp; - //temp=malloc(sizeof(struct twilighte *)); - char twilrombankfiles[32][1024]; - - FILE *f; - unsigned int i, j; - char tbtmp[32]; - char line[1024]; - struct twilighte *twilighte = malloc(sizeof(struct twilighte)); - twilighte->t_banking_register=0; - twilighte->t_register=128+1; // Firmware - - f = fopen( "plugins/twilighte_card/twilighte.cfg", "r" ); - if( !f ) - { - error_printf( "plugins/twilighte_card/twilighte.cfg not found\n" ); - return NULL; - } - for( j=1; j<31; j++ ) - { - twilighte->twilrombankfiles[j][0]=0; - twilighte->twilrambankfiles[j][0]=0; - } + FILE *f; + unsigned int i, j; + char *result; + char tbtmp[32]; + char line[1024]; + struct twilighte *twilighte = malloc(sizeof(struct twilighte)); + twilighte->t_banking_register=0; + twilighte->t_register=128+1; // Firmware - while( !feof( f ) ) - { - fgets( line, 1024, f ); - for( j=1; j<31; j++ ) - { - if (j>9) - sprintf( tbtmp, "twilbankrom%d", j); - else - sprintf( tbtmp, "twilbankrom0%d", j); - - if (twilighte->twilrombankfiles[j][0]==0) - { - if( read_config_string( line, tbtmp, twilighte->twilrombankfiles[j], 1024 ) ) - { + f = fopen( "plugins/twilighte_card/twilighte.cfg", "r" ); + if( !f ) + { + error_printf( "plugins/twilighte_card/twilighte.cfg not found\n" ); + return NULL; + } + + for( j=1; j<31; j++ ) + { + twilighte->twilrombankfiles[j][0]=0; + twilighte->twilrambankfiles[j][0]=0; + } + + while( !feof( f ) ) + { + result=fgets( line, 1024, f ); + for( j=1; j<31; j++ ) + { + if (j>9) + sprintf( tbtmp, "twilbankrom%d", j); + else + sprintf( tbtmp, "twilbankrom0%d", j); - break; - } - } + if (twilighte->twilrombankfiles[j][0]==0) + { + if( read_config_string( line, tbtmp, twilighte->twilrombankfiles[j], 1024 ) ) + { + break; + } + } - } - } + } + } fclose( f ); // Now load rom - for( i=0; i<31; i++ ) - { - if( twilighte->twilrombankfiles[i][0]!=0 ) - { - if( !load_rom_twilighte( twilighte->twilrombankfiles[i], -16384, twilighte->twilrombankdata[i] ) ) - { - error_printf("Cannot load %s",twilighte->twilrombankfiles[i]); - return NULL; - } - + for( i=0; i<31; i++ ) + { + if( twilighte->twilrombankfiles[i][0]!=0 ) + { + if( !load_rom_twilighte( twilighte->twilrombankfiles[i], -16384, twilighte->twilrombankdata[i] ) ) + { + error_printf("Cannot load %s",twilighte->twilrombankfiles[i]); + return NULL; } - } + } + } /* */ // Flush sram (first bank) - for (j=0;j<16384;j++) twilighte->twilrambankdata[0][j]=0; + for (j=0;j<16384;j++) twilighte->twilrambankdata[0][j]=0; - twilighte->DDRA=7; - twilighte->VDDRA=7; - twilighte->current_bank=7; - return twilighte; + twilighte->DDRA=7; + twilighte->VDDRA=7; + twilighte->current_bank=7; + return twilighte; } unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uint16_t addr) { - unsigned char data; - unsigned char bank; - - if (twilighte->current_bank==0) - { - data=twilighte->twilrambankdata[0][addr]; - - } - else - { - if (twilighte->current_bank<5) - { - if (twilighte->t_banking_register!=0) - bank=twilighte->current_bank+8+((twilighte->t_banking_register-1)*4); - - else - bank=twilighte->current_bank; - - } - else - bank=twilighte->current_bank; - - if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? - data=twilighte->twilrambankdata[bank][addr]; - else - data=twilighte->twilrombankdata[bank][addr]; - } + unsigned char data; + unsigned char bank; + if (twilighte->current_bank==0) + { + data=twilighte->twilrambankdata[0][addr]; + } + else + { + if (twilighte->current_bank<5) + { + if (twilighte->t_banking_register!=0) + bank=twilighte->current_bank+8+((twilighte->t_banking_register-1)*4); + else + bank=twilighte->current_bank; + } + else + bank=twilighte->current_bank; - - + if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? + data=twilighte->twilrambankdata[bank][addr]; + else + data=twilighte->twilrombankdata[bank][addr]; + } return data; } unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uint16_t addr, unsigned char data) { - unsigned char bank; - if (twilighte->current_bank==0) + unsigned char bank; + if (twilighte->current_bank==0) + { + twilighte->twilrambankdata[twilighte->current_bank][addr]=data; + } + else + { + if (twilighte->current_bank<5) { - twilighte->twilrambankdata[twilighte->current_bank][addr]=data; - + if (twilighte->t_banking_register!=0) + bank=twilighte->current_bank+8+((twilighte->t_banking_register-1)*4); + else + bank=twilighte->current_bank; } else - { - if (twilighte->current_bank<5) - { - - if (twilighte->t_banking_register!=0) - bank=twilighte->current_bank+8+((twilighte->t_banking_register-1)*4); - - else - bank=twilighte->current_bank; - } - else - bank=twilighte->current_bank; + bank=twilighte->current_bank; - if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? - twilighte->twilrambankdata[bank][addr]=data; + if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? + twilighte->twilrambankdata[bank][addr]=data; // ROM is readonly - } - - // - return 0; + } + return 0; } unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t addr) { - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) - { - return twilighte->t_register; - } + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) + { + return twilighte->t_register; + } - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA) - { - return twilighte->VDDRA; - } + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA) + { + return twilighte->VDDRA; + } - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) - { - return twilighte->DDRA; - } + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) + { + return twilighte->DDRA; + } + + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRB) + { + return twilighte->VDDRB; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) + { + return twilighte->DDRB; + } - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) - { - return twilighte->t_banking_register; - } - return 0; + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) + { + return twilighte->t_banking_register; + } + + return 0; } unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t addr, unsigned char data) { - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA) - { - twilighte->VDDRA=data; - - } + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA) + { + twilighte->VDDRA=data; + } - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) - { - twilighte->DDRA=data; - - twilighte->current_bank=data&7; - //error_printf( "current_bank %d addr : %x %d",twilighte->current_bank,addr,data); - } + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) + { + twilighte->DDRA=data; + twilighte->current_bank=data&7; + } + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRB) + { + twilighte->VDDRB=data; + } - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) - { - twilighte->t_register=data; - } + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) + { + twilighte->DDRB=data; + } - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) - { - twilighte->t_banking_register=data; - } + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) + { + twilighte->t_register=data; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) + { + twilighte->t_banking_register=data; + } - return 0; + return 0; } From 572979f3eefd254f7e56304033a5b7d025429591 Mon Sep 17 00:00:00 2001 From: jede Date: Thu, 1 Oct 2020 00:44:15 +0200 Subject: [PATCH 024/143] Add text for twilighte board emulation --- ReadMe.txt | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/ReadMe.txt b/ReadMe.txt index a24e8ecd..b01cfda6 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -466,6 +466,30 @@ CH376 emulation added for : CH376_CMD_FILE_ERASE suppress a file CH376_CMD_DIR_CREATE create folder +Twilighte board emulation +=============== +The twilighte board is working on atmos (and Oric-1). It disables internal Oric ROM and add 64 banks (by bank switching). +It adds 32 banks of ROM (eeprom) and 32 banks of RAM (Static RAM saved with a battery). +EEprom can be programmed from Orix command line. +The board handles ch376 (sdcard/usbdrive/usb/hid controler). +And the board adds 2 joysticks ports. + + +The emulation, for instance, handles 32 ROM banks and 32 RAM banks. It emulates this bank switching. + +Board is not working with a microdisc. But jasmin does (mainly because jasmin does not replace rom at boot). + +Anyway, on Telestrat, orix can start floppy disk because FDC is present. + +Not emulated parts : +* joysticks +* eeprom programming sequence +* loading ROM into RAM bank (which could emulate RAM saved with battery) +* save on disk any modification into RAM bank (whic could emulate RAM saved with battery) +* ch376 is not fully supported in the emulation mode. There is a lot of others functionnalities which are missing on ch376 emulation + + + ROM patch files =============== From f74166d4d42433de898f1e225ee3405bbbd6669f Mon Sep 17 00:00:00 2001 From: jede Date: Thu, 1 Oct 2020 00:44:50 +0200 Subject: [PATCH 025/143] Add new conf --- plugins/twilighte_card/twilighte.cfg | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/plugins/twilighte_card/twilighte.cfg b/plugins/twilighte_card/twilighte.cfg index 10a7d0fb..a137ae10 100644 --- a/plugins/twilighte_card/twilighte.cfg +++ b/plugins/twilighte_card/twilighte.cfg @@ -1,14 +1,18 @@ +twilbankrom15='roms/empty' +twilbankrom14='roms/empty' +twilbankrom13='roms/empty' +twilbankrom12='roms/basic_noram' twilbankrom11='roms/basic_noram' twilbankrom10='roms/basic_noram' -twilbankrom9='roms/basic_noram' -twilbankrom8='roms/basic_noram' -twilbankrom7='roms/kernel' -twilbankrom6='roms/basic_noram' -twilbankrom5='roms/shell' -twilbankrom4='roms/shell' -twilbankrom3='roms/shell' -twilbankrom2='roms/shell' -twilbankrom1='roms/shell' +twilbankrom09='roms/monitor' +twilbankrom08='roms/empty' +twilbankrom07='roms/kernel' +twilbankrom06='roms/basic_noram' +twilbankrom05='roms/shell' +twilbankrom04='roms/forth' +twilbankrom03='roms/monitor' +twilbankrom02='roms/empty' +twilbankrom01='roms/shell' -twilbankram1='roms/orixbank1' \ No newline at end of file +twilbankram01='roms/orixbank1' \ No newline at end of file From 41bd999021070a7435b4446984ae2f90fdac59f6 Mon Sep 17 00:00:00 2001 From: jede Date: Thu, 1 Oct 2020 00:45:20 +0200 Subject: [PATCH 026/143] Modification for twilighte board activation --- gui.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/gui.c b/gui.c index 68babd96..34890c2b 100644 --- a/gui.c +++ b/gui.c @@ -1539,7 +1539,15 @@ void toggletwilighte(struct machine *oric, struct osdmenuitem *mitem, int dummy) oric->twilighteboard_activated = SDL_TRUE; mitem->name = "\x0e""Twilighte board"; oric->twilighte = twilighte_oric_init(); - if (oric->twilighte == NULL) oric->twilighteboard_activated = SDL_FALSE; // Impossible to create struct, we did not activate twilighteboard + if (oric->twilighte == NULL) + { + oric->twilighteboard_activated = SDL_FALSE; // Impossible to create struct, we did not activate twilighteboard + } + else + { + oric->ch376_activated = SDL_TRUE; + } + } From ddd9cb45637781e69a7bf7aa124bd3421680ed74 Mon Sep 17 00:00:00 2001 From: jede Date: Thu, 1 Oct 2020 00:46:51 +0200 Subject: [PATCH 027/143] Disable twilighte board (default) in oricutron.cfg --- oricutron.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oricutron.cfg b/oricutron.cfg index c9043de6..b3ff1ea7 100644 --- a/oricutron.cfg +++ b/oricutron.cfg @@ -196,4 +196,4 @@ show_keyboard = yes ; ch376 chip emulation. This chip can read a usbkey. For more information : http://orix.oric.org ; only available in telestrat mode ch376 = no -twilighte_board=yes +twilighte_board=no From 0cf5f90a2b2d1ed55f3602afe5b33ae7747f130a Mon Sep 17 00:00:00 2001 From: jede Date: Thu, 1 Oct 2020 01:05:00 +0200 Subject: [PATCH 028/143] Add roms --- roms/{orix10.rom => empty_orix.rom} | Bin 16384 -> 16384 bytes roms/kernel.rom | Bin 0 -> 16384 bytes roms/shell.rom | Bin 0 -> 16384 bytes 3 files changed, 0 insertions(+), 0 deletions(-) rename roms/{orix10.rom => empty_orix.rom} (85%) mode change 100644 => 100755 create mode 100755 roms/kernel.rom create mode 100755 roms/shell.rom diff --git a/roms/orix10.rom b/roms/empty_orix.rom old mode 100644 new mode 100755 similarity index 85% rename from roms/orix10.rom rename to roms/empty_orix.rom index 71ca140e0f8eea447e1acd452398b85be9f2c4e0..eaf2f7726fc971e44330c4045ab737296050656e GIT binary patch delta 31 ncmZo@U~Fh$WJ_?(Ehwqn{E>s*d=uwu4i3fx4DT5Z{9*zCv5E_X literal 16384 zcmeH|U2I%O6@bs~`flua?Q9Y^b`k=ULK^J)Z|&Gg4FcO$qMBZ)g&ULsZ$E z*|j5tO5c%YALh=SIdkUBcYZdXa<@O9Nx4~1W>8^}Ijb;NW>SGu4AMN4RWjQ`>hqG0 z0`%tq2Eb?6I}hvz=b!d|=L5UZdEaj0hv3vL?!3jarb2G6!YTFWs{Oq48T+`yZ}Upj z*#!S>zLZtA7~uFKR|BiJxpRcUW_5{n&%8t2!aVN4C=O}3;WFX3V0ZHq7Jhp85k@oJ z9-&HpS!R{me1PU$mYt%{%jB?qWT9$B+@ zoI3L7GG*JQ0xj(4rUfl@#cQQu<%pGbMF1$88(wqjmzum=l|FvYgg3Sor$H<&Tz`NQ z)|B&_F6gB_Q+lii&c_Tb0jw_5kK~BAY`YwfI=Mzky39HO z(jIi1wF(-)9#B@BoJI@nFamzHd7bs6o1|2tk>vg+sKU#72_od%|)U92_j z#;=E5EbhK_lsB>01>l-_%667Xu4JEZ6vS|n?lD-t`4svG{^{j;|A*{LwHsAqow8fz zIz}gz3|`TONGNEK3uEf}T{p(zSj~|OpW;aE;{WB2neM_o?_|T~=ioGDht0y?ZDfdC z)03%bJ)tFQm$E@Yh|ZGlm2!Z24DKaRHu*<6|H^n_3H+P>k5urpeVLP<$j3Y6sWQUG z66oTe6}W@EmHkMV7hKs!HR);s`bL=6?ci68dNCGD_`XM*io~HUgjqi%t0^f!L2RKUv#BjOfB`j0)Fvq4P6@q zoR(^3)IhOmvkWcj>jkRnQQaVVl3XI8>0lxWa14&Z6QVXAv)&xE7CMmzoVwGgY*h~M zzf(3|y;zUw28hCSyo+v2y;NLu)9SL$QZE-NKrQ}t82_%l@Mi`T6EFc5!Fp>z;s3bV zra{*Io(r?;VJ;LY0%`Ov2-Q2NTZr3IIFg2)3UU zff7Yql_q``D8?&?JUtF&v;w!EFp4y9At=ZqgYSh zh?8V0G)*q+csQOQVXUo?5l_qk1SlM(aE!8Fn7@awP`G<;-Z0n zdawDDvf(71U0-VkRv5)X}2Fv7diS3v>n1_4$m%fKh@RqrO`Rucga~D;g-oWZP zw0mLoZ(>nw(|j{YcjgbE)%+onem8%Zr2iz0!Rg4mFw01$*|YmE#o$%ZB37<$;JC>h z72LC!0Vh4`EBEQM!5OWFVW=90>+!@@J$8l6X$D}Mi$|kD49mj+!LxIyABx0-;YZ2! zX)Q+P;wchLXhe^Zpb?EHF%V&`n~Y<#N|N&vPm0)R$q-)CNoK0Tpoo$XCyijjfYFhO zu_s|O$Zp^>UU-*F1-{T z4`sib{$cWh^kuFzB%?B36Rm09tmTP_4NkMcJ&6j z`p%HRxuO2EWN@Ij59Ci0kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i z1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+F TNk9_#KOwMcx$eU11NXlH(Pezv diff --git a/roms/kernel.rom b/roms/kernel.rom new file mode 100755 index 0000000000000000000000000000000000000000..f19cd83fc92413b827029278f4b304bdc108670b GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/roms/shell.rom b/roms/shell.rom new file mode 100755 index 0000000000000000000000000000000000000000..431b7c7b04c43f41ab2e2ec6d9c5f8e987069bdd GIT binary patch literal 16384 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 Date: Thu, 1 Oct 2020 01:05:54 +0200 Subject: [PATCH 029/143] update text for twilighte board plugin --- ReadMe.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ReadMe.txt b/ReadMe.txt index b01cfda6..8096b7e3 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -474,7 +474,6 @@ EEprom can be programmed from Orix command line. The board handles ch376 (sdcard/usbdrive/usb/hid controler). And the board adds 2 joysticks ports. - The emulation, for instance, handles 32 ROM banks and 32 RAM banks. It emulates this bank switching. Board is not working with a microdisc. But jasmin does (mainly because jasmin does not replace rom at boot). @@ -488,7 +487,12 @@ Not emulated parts : * save on disk any modification into RAM bank (whic could emulate RAM saved with battery) * ch376 is not fully supported in the emulation mode. There is a lot of others functionnalities which are missing on ch376 emulation +To activate the plugin, you must activate twilighte_board option in oricutron.cfg + +Update twilighte.cfg plugin in plugins/twilighte_card/twilighte.cfg if you want to load others roms. +For basic11 rom which handles joysticks and .tap load from sdcard or usbdrive, you have to download basic.tgz here : http://repo.orix.oric.org/dists/official/tgz/6502/ +And you need to replace twilbankrom06 with the rom in basic11.tgz. ROM patch files From e5d9ecc8e92f2db4230f47216122bb3b48c22edc Mon Sep 17 00:00:00 2001 From: jede Date: Thu, 1 Oct 2020 01:06:20 +0200 Subject: [PATCH 030/143] Add all available ROM --- plugins/twilighte_card/twilighte.cfg | 44 ++++++++++++++++++---------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/plugins/twilighte_card/twilighte.cfg b/plugins/twilighte_card/twilighte.cfg index a137ae10..d4e4795d 100644 --- a/plugins/twilighte_card/twilighte.cfg +++ b/plugins/twilighte_card/twilighte.cfg @@ -1,18 +1,32 @@ -twilbankrom15='roms/empty' -twilbankrom14='roms/empty' -twilbankrom13='roms/empty' -twilbankrom12='roms/basic_noram' -twilbankrom11='roms/basic_noram' -twilbankrom10='roms/basic_noram' -twilbankrom09='roms/monitor' -twilbankrom08='roms/empty' +twilbankrom31='roms/empty_orix' +twilbankrom30='roms/empty_orix' +twilbankrom29='roms/empty_orix' +twilbankrom28='roms/empty_orix' +twilbankrom27='roms/empty_orix' +twilbankrom26='roms/empty_orix' +twilbankrom25='roms/empty_orix' +twilbankrom24='roms/empty_orix' +twilbankrom23='roms/empty_orix' +twilbankrom22='roms/empty_orix' +twilbankrom21='roms/empty_orix' +twilbankrom20='roms/empty_orix' +twilbankrom19='roms/empty_orix' +twilbankrom18='roms/empty_orix' +twilbankrom17='roms/empty_orix' +twilbankrom16='roms/empty_orix' +twilbankrom15='roms/empty_orix' +twilbankrom14='roms/empty_orix' +twilbankrom13='roms/empty_orix' +twilbankrom12='roms/empty_orix' +twilbankrom11='roms/empty_orix' +twilbankrom10='roms/empty_orix' +twilbankrom09='roms/empty_orix' +twilbankrom08='roms/empty_orix' twilbankrom07='roms/kernel' -twilbankrom06='roms/basic_noram' +twilbankrom06='roms/basicsd2' twilbankrom05='roms/shell' -twilbankrom04='roms/forth' -twilbankrom03='roms/monitor' -twilbankrom02='roms/empty' -twilbankrom01='roms/shell' +twilbankrom04='roms/empty_orix' +twilbankrom03='roms/empty_orix' +twilbankrom02='roms/empty_orix' +twilbankrom01='roms/empty_orix' - -twilbankram01='roms/orixbank1' \ No newline at end of file From 2e3ce6007007713c1c2aa119fd1fcab46ef6709a Mon Sep 17 00:00:00 2001 From: jede Date: Thu, 1 Oct 2020 01:06:36 +0200 Subject: [PATCH 031/143] Fix indent --- plugins/twilighte_card/oric_twilighte_board_plugin.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c index 6c4225f3..97110327 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -136,13 +136,13 @@ struct twilighte * twilighte_oric_init(void) while( !feof( f ) ) { - result=fgets( line, 1024, f ); - for( j=1; j<31; j++ ) + result=fgets( line, 1024, f ); + for( j=1; j<31; j++ ) { if (j>9) - sprintf( tbtmp, "twilbankrom%d", j); + sprintf( tbtmp, "twilbankrom%d", j); else - sprintf( tbtmp, "twilbankrom0%d", j); + sprintf( tbtmp, "twilbankrom0%d", j); if (twilighte->twilrombankfiles[j][0]==0) { @@ -284,7 +284,7 @@ unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t a if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) { twilighte->DDRA=data; - twilighte->current_bank=data&7; + twilighte->current_bank=data&7; } if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRB) From cd695818c6e5580039b237653f9082eb15c6a0e9 Mon Sep 17 00:00:00 2001 From: jede Date: Thu, 1 Oct 2020 01:07:06 +0200 Subject: [PATCH 032/143] Fix indent --- machine.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/machine.c b/machine.c index 404734e8..c799ea61 100644 --- a/machine.c +++ b/machine.c @@ -316,9 +316,9 @@ void atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) if (oric->twilighteboard_activated && addr >= 0xc000 ) - twilighteboard_oric_ROM_RAM_write(oric->twilighte,addr-0xc000,data); - else - if( ( !oric->romdis ) && ( addr >= 0xc000 ) ) return; // Can't write to ROM! + twilighteboard_oric_ROM_RAM_write(oric->twilighte,addr-0xc000,data); + else + if( ( !oric->romdis ) && ( addr >= 0xc000 ) ) return; // Can't write to ROM! if( ( addr & 0xff00 ) == 0x0300 ) { @@ -659,10 +659,9 @@ unsigned char atmosread( struct m6502 *cpu, unsigned short addr ) if( ( !oric->romdis ) && ( addr >= 0xc000 ) ) { if (oric->twilighteboard_activated) - return twilighteboard_oric_ROM_RAM_read(oric->twilighte,addr-0xc000); else - return oric->rom[addr-0xc000]; + return oric->rom[addr-0xc000]; } return oric->mem[addr]; } From bce68b95e346783b873b6f79a7a78695a2292cb0 Mon Sep 17 00:00:00 2001 From: jede Date: Thu, 1 Oct 2020 01:08:55 +0200 Subject: [PATCH 033/143] Fix indent --- plugins/twilighte_card/oric_twilighte_board_plugin.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.h b/plugins/twilighte_card/oric_twilighte_board_plugin.h index 14cf9ee8..239ba829 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.h +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.h @@ -2,5 +2,5 @@ struct twilighte * twilighte_oric_init(void); unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t addr); unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uint16_t addr) ; -unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uint16_t addr, unsigned char data); -unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t addr, unsigned char data); \ No newline at end of file +unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uint16_t addr, unsigned char data); +unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t addr, unsigned char data); \ No newline at end of file From 88320727eb85c2c63f7ae2600e14a0abe6836849 Mon Sep 17 00:00:00 2001 From: jede Date: Fri, 2 Oct 2020 23:04:20 +0200 Subject: [PATCH 034/143] Add joystick support --- joystick.c | 57 ++++++++++++++++++- .../oric_twilighte_board_plugin.c | 6 +- 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/joystick.c b/joystick.c index ec114630..2f2e8692 100644 --- a/joystick.c +++ b/joystick.c @@ -35,6 +35,8 @@ #include "machine.h" #include "joystick.h" +#include "plugins/twilighte_card/oric_twilighte_board_plugin.h" + struct keyjoydef { char *id; @@ -257,9 +259,58 @@ void joy_buildmask( struct machine *oric ) Uint8 mkmask_f = 0xff; Uint8 joysel = oric->via.read_port_a( &oric->via ); Uint8 telestrat_joysel = oric->tele_via.read_port_b( &oric->tele_via ); + Uint8 twilighteboard_joysel; + + SDL_bool gimme_port_a = SDL_FALSE; SDL_bool gimme_port_b = SDL_FALSE; + + + if (oric->twilighteboard_activated) + twilighteboard_joysel= twilighteboard_oric_read(oric->twilighte,0x320); + + if (oric->type == MACH_ATMOS && oric->twilighteboard_activated) + { + if ( twilighteboard_joysel & 0x80 ) + { + // Right Port + if( joystate_a[0] ) mkmask &= 0xef; + if( joystate_a[1] ) mkmask &= 0xf7; + if( joystate_a[2] ) mkmask &= 0xfd; + if( joystate_a[3] ) mkmask &= 0xfe; + if( joystate_a[4] ) mkmask &= 0xfb; + + if( joystate_a[5] ) mkmask_f &= 0x7f; // PA7 - fire 2 + if( joystate_a[6] ) mkmask_f &= 0xdf; // PA5 - fire 3 + + gimme_port_a = SDL_TRUE; + gimme_port_b = SDL_TRUE; + } + + if ( twilighteboard_joysel & 0x40 ) + { + // Left Port + if( joystate_b[0] ) mkmask &= 0xef; // 0x10 - up + if( joystate_b[1] ) mkmask &= 0xf7; // 0x08 - down + if( joystate_b[2] ) mkmask &= 0xfd; // 0x02 - left + if( joystate_b[3] ) mkmask &= 0xfe; // 0x01 - right + if( joystate_b[4] ) mkmask &= 0xfb; // 0x04 - fire + gimme_port_b = SDL_TRUE; + } + + if( gimme_port_a ) + { + twilighteboard_oric_write(oric->twilighte, 0x321,mkmask_f); + } + + if( gimme_port_b ) + { + twilighteboard_oric_write(oric->twilighte, 0x320,mkmask); + } + } + else + if (oric->type == MACH_TELESTRAT) { if ( telestrat_joysel & 0x80 ) @@ -376,8 +427,8 @@ SDL_bool joy_filter_event( SDL_Event *ev, struct machine *oric ) { SDL_bool swallow_event; - swallow_event = dojoyevent( ev, oric, (oric->type==MACH_TELESTRAT) ? oric->telejoymode_a : oric->joymode_a, joystate_a, oric->sdljoy_a ); - swallow_event |= dojoyevent( ev, oric, (oric->type==MACH_TELESTRAT) ? oric->telejoymode_b : oric->joymode_b, joystate_b, oric->sdljoy_b ); + swallow_event = dojoyevent( ev, oric, (oric->type==MACH_TELESTRAT || (oric->twilighteboard_activated && oric->type==MACH_ATMOS)) ? oric->telejoymode_a : oric->joymode_a, joystate_a, oric->sdljoy_a ); + swallow_event |= dojoyevent( ev, oric, (oric->type==MACH_TELESTRAT || (oric->twilighteboard_activated && oric->type==MACH_ATMOS)) ? oric->telejoymode_b : oric->joymode_b, joystate_b, oric->sdljoy_b ); if( swallow_event ) { @@ -443,7 +494,7 @@ static void dojoysetup( struct machine *oric, Sint16 mode_a, Sint16 mode_b ) void joy_setup( struct machine *oric ) { - if( oric->type == MACH_TELESTRAT ) + if( oric->type == MACH_TELESTRAT || ( oric->type == MACH_ATMOS && oric->twilighteboard_activated) ) dojoysetup( oric, oric->telejoymode_a, oric->telejoymode_b ); else dojoysetup( oric, oric->joymode_a, oric->joymode_b ); diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c index 97110327..7eb65217 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -260,7 +260,7 @@ unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t ad return twilighte->VDDRB; } - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) { return twilighte->DDRB; } @@ -292,9 +292,13 @@ unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t a twilighte->VDDRB=data; } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) { + twilighte->DDRB=data; + return 0; } if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) From dd5c6b67d529a9437852cdc1ad91e743c60aa276 Mon Sep 17 00:00:00 2001 From: jede Date: Sat, 10 Oct 2020 22:37:25 +0200 Subject: [PATCH 035/143] Fix bug with basic11 rom and joysticks --- joystick.c | 7 +++-- machine.c | 2 +- .../oric_twilighte_board_plugin.c | 29 +++++++++++-------- 3 files changed, 23 insertions(+), 15 deletions(-) mode change 100644 => 100755 joystick.c mode change 100644 => 100755 machine.c mode change 100644 => 100755 plugins/twilighte_card/oric_twilighte_board_plugin.c diff --git a/joystick.c b/joystick.c old mode 100644 new mode 100755 index 2f2e8692..fdb1d651 --- a/joystick.c +++ b/joystick.c @@ -301,12 +301,15 @@ void joy_buildmask( struct machine *oric ) if( gimme_port_a ) { - twilighteboard_oric_write(oric->twilighte, 0x321,mkmask_f); + // twilighteboard_oric_write(oric->twilighte, 0x321, 0xff,mkmask_f); } if( gimme_port_b ) { - twilighteboard_oric_write(oric->twilighte, 0x320,mkmask); + // port B + Uint8 value=twilighteboard_oric_read(oric->twilighte, 0x320); + error_printf( "Value '%x' wvalue: %x mask: %x ",value,value,value); + twilighteboard_oric_write(oric->twilighte, 0x320, 0xff, mkmask); } } else diff --git a/machine.c b/machine.c old mode 100644 new mode 100755 index c799ea61..f3d7bd73 --- a/machine.c +++ b/machine.c @@ -329,7 +329,7 @@ void atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) ch376_oric_write(oric->ch376, addr, data); else if(oric->twilighteboard_activated && ((0x342 <= addr && addr < 0x344 ) || (0x320 <= addr && addr < 0x330 ))) - twilighteboard_oric_write(oric->twilighte,addr,data); + twilighteboard_oric_write(oric->twilighte,addr,0x00,data); else via_write( &oric->via, addr, data ); diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c old mode 100644 new mode 100755 index 7eb65217..4f63a018 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -14,8 +14,6 @@ #include #include #include -#include -#include #include @@ -65,7 +63,7 @@ static SDL_bool load_rom_twilighte( char *fname, int size, unsigned char where[ tmpname = malloc( strlen( fname ) + 10 ); if( !tmpname ) { - return SDL_FALSE; + return SDL_FALSE; } sprintf( tmpname, "%s.rom", fname ); @@ -178,6 +176,7 @@ struct twilighte * twilighte_oric_init(void) twilighte->DDRA=7; twilighte->VDDRA=7; twilighte->current_bank=7; + twilighte->DDRB=0; return twilighte; } @@ -265,7 +264,6 @@ unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t ad return twilighte->DDRB; } - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) { return twilighte->t_banking_register; @@ -274,7 +272,7 @@ unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t ad return 0; } -unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t addr, unsigned char data) +unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t addr, unsigned char mask, unsigned char data) { if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA) { @@ -289,21 +287,28 @@ unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t a if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRB) { - twilighte->VDDRB=data; + twilighte->VDDRB=data; } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) { - - twilighte->DDRB=data; - return 0; + unsigned char lastpb6; + unsigned char lastpb7; + + lastpb6 = twilighte->DDRB&0x40; + + lastpb7 = twilighte->DDRB&0x80; + if ((lastpb6==0 || lastpb7==0) && (data&0x80 || data&0x40)) + twilighte->DDRB=data|1|2|4|8|16; + else + twilighte->DDRB=data; + + } if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) { - twilighte->t_register=data; + twilighte->t_register=data; } if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) From 9ed74be2f21054c2ee1cea6bd156541d0e27c1cc Mon Sep 17 00:00:00 2001 From: jede Date: Sun, 11 Oct 2020 02:05:31 +0200 Subject: [PATCH 036/143] remove debug --- joystick.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/joystick.c b/joystick.c index fdb1d651..fda65bb9 100755 --- a/joystick.c +++ b/joystick.c @@ -307,8 +307,6 @@ void joy_buildmask( struct machine *oric ) if( gimme_port_b ) { // port B - Uint8 value=twilighteboard_oric_read(oric->twilighte, 0x320); - error_printf( "Value '%x' wvalue: %x mask: %x ",value,value,value); twilighteboard_oric_write(oric->twilighte, 0x320, 0xff, mkmask); } } From 2140d54420be400bf240bb908e8a97b6a0587ea0 Mon Sep 17 00:00:00 2001 From: jede Date: Tue, 13 Oct 2020 23:19:47 +0200 Subject: [PATCH 037/143] Management button2 & 3 --- joystick.c | 2 +- machine.c | 0 .../oric_twilighte_board_plugin.c | 99 +++++++++---------- .../oric_twilighte_board_plugin.h | 6 +- 4 files changed, 54 insertions(+), 53 deletions(-) mode change 100755 => 100644 joystick.c mode change 100755 => 100644 machine.c mode change 100755 => 100644 plugins/twilighte_card/oric_twilighte_board_plugin.c diff --git a/joystick.c b/joystick.c old mode 100755 new mode 100644 index fda65bb9..881fe117 --- a/joystick.c +++ b/joystick.c @@ -301,7 +301,7 @@ void joy_buildmask( struct machine *oric ) if( gimme_port_a ) { - // twilighteboard_oric_write(oric->twilighte, 0x321, 0xff,mkmask_f); + //twilighteboard_oric_write(oric->twilighte, 0x321, 0xff,mkmask_f); } if( gimme_port_b ) diff --git a/machine.c b/machine.c old mode 100755 new mode 100644 diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c old mode 100755 new mode 100644 index 4f63a018..1ab22b0b --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -137,20 +137,19 @@ struct twilighte * twilighte_oric_init(void) result=fgets( line, 1024, f ); for( j=1; j<31; j++ ) { - if (j>9) - sprintf( tbtmp, "twilbankrom%d", j); - else - sprintf( tbtmp, "twilbankrom0%d", j); - - if (twilighte->twilrombankfiles[j][0]==0) - { - if( read_config_string( line, tbtmp, twilighte->twilrombankfiles[j], 1024 ) ) - { - break; - } - } - - } + if (j>9) + sprintf( tbtmp, "twilbankrom%d", j); + else + sprintf( tbtmp, "twilbankrom0%d", j); + + if (twilighte->twilrombankfiles[j][0]==0) + { + if( read_config_string( line, tbtmp, twilighte->twilrombankfiles[j], 1024 ) ) + { + break; + } + } + } } fclose( f ); @@ -160,11 +159,11 @@ struct twilighte * twilighte_oric_init(void) { if( twilighte->twilrombankfiles[i][0]!=0 ) { - if( !load_rom_twilighte( twilighte->twilrombankfiles[i], -16384, twilighte->twilrombankdata[i] ) ) - { - error_printf("Cannot load %s",twilighte->twilrombankfiles[i]); - return NULL; - } + if( !load_rom_twilighte( twilighte->twilrombankfiles[i], -16384, twilighte->twilrombankdata[i] ) ) + { + error_printf("Cannot load %s",twilighte->twilrombankfiles[i]); + return NULL; + } } } /* @@ -173,7 +172,7 @@ struct twilighte * twilighte_oric_init(void) // Flush sram (first bank) for (j=0;j<16384;j++) twilighte->twilrambankdata[0][j]=0; - twilighte->DDRA=7; + twilighte->DDRA=0xff; twilighte->VDDRA=7; twilighte->current_bank=7; twilighte->DDRB=0; @@ -186,24 +185,24 @@ unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uin if (twilighte->current_bank==0) { - data=twilighte->twilrambankdata[0][addr]; + data=twilighte->twilrambankdata[0][addr]; } else { - if (twilighte->current_bank<5) - { - if (twilighte->t_banking_register!=0) - bank=twilighte->current_bank+8+((twilighte->t_banking_register-1)*4); + if (twilighte->current_bank<5) + { + if (twilighte->t_banking_register!=0) + bank=twilighte->current_bank+8+((twilighte->t_banking_register-1)*4); else - bank=twilighte->current_bank; - } - else - bank=twilighte->current_bank; + bank=twilighte->current_bank; + } + else + bank=twilighte->current_bank; - if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? - data=twilighte->twilrambankdata[bank][addr]; + if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? + data=twilighte->twilrambankdata[bank][addr]; else - data=twilighte->twilrombankdata[bank][addr]; + data=twilighte->twilrombankdata[bank][addr]; } return data; } @@ -214,22 +213,22 @@ unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, ui unsigned char bank; if (twilighte->current_bank==0) { - twilighte->twilrambankdata[twilighte->current_bank][addr]=data; + twilighte->twilrambankdata[twilighte->current_bank][addr]=data; } else { if (twilighte->current_bank<5) - { + { if (twilighte->t_banking_register!=0) bank=twilighte->current_bank+8+((twilighte->t_banking_register-1)*4); else bank=twilighte->current_bank; - } - else - bank=twilighte->current_bank; + } + else + bank=twilighte->current_bank; - if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? - twilighte->twilrambankdata[bank][addr]=data; + if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? + twilighte->twilrambankdata[bank][addr]=data; // ROM is readonly } return 0; @@ -240,33 +239,32 @@ unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t ad { if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) { - return twilighte->t_register; + return twilighte->t_register; } if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA) { - return twilighte->VDDRA; + return twilighte->VDDRA; } if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) { - return twilighte->DDRA; + return twilighte->DDRA; } - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRB) { - return twilighte->VDDRB; + return twilighte->VDDRB; } if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) { - return twilighte->DDRB; + return twilighte->DDRB; } if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) { - return twilighte->t_banking_register; + return twilighte->t_banking_register; } return 0; @@ -276,12 +274,15 @@ unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t a { if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA) { - twilighte->VDDRA=data; + twilighte->VDDRA=data; } if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) { - twilighte->DDRA=data; + if (mask==0) + twilighte->DDRA=data|128|32; + else + twilighte->DDRA = twilighte->DDRA&data; twilighte->current_bank=data&7; } @@ -302,8 +303,6 @@ unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t a twilighte->DDRB=data|1|2|4|8|16; else twilighte->DDRB=data; - - } if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.h b/plugins/twilighte_card/oric_twilighte_board_plugin.h index 239ba829..90306dbd 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.h +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.h @@ -1,6 +1,8 @@ struct twilighte * twilighte_oric_init(void); -unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t addr); + unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uint16_t addr) ; unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uint16_t addr, unsigned char data); -unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t addr, unsigned char data); \ No newline at end of file + +unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t addr,unsigned char mask, unsigned char data); +unsigned char twilighteboard_oric_read(struct twilighte* twilighte, uint16_t addr); \ No newline at end of file From 466b9d8f8f6263727a828d0f67b56ff7f04ab6ec Mon Sep 17 00:00:00 2001 From: jede Date: Thu, 26 Nov 2020 22:58:06 +0100 Subject: [PATCH 038/143] Fix bug --- .../oric_twilighte_board_plugin.c | 87 ++++++++++++++----- .../oric_twilighte_board_plugin.h | 2 +- plugins/twilighte_card/twilighte.cfg | 44 ++++++++-- 3 files changed, 102 insertions(+), 31 deletions(-) diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c index 1ab22b0b..f9d3e32b 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -52,7 +52,6 @@ struct twilighte #include "../../system.h" extern SDL_bool read_config_string( char *buf, char *token, char *dest, Sint32 maxlen ); -///extern SDL_bool load_rom( struct machine *oric, char *fname, int size, unsigned char *where, struct symboltable *stab, int symflags ); static SDL_bool load_rom_twilighte( char *fname, int size, unsigned char where[] ) { @@ -126,7 +125,7 @@ struct twilighte * twilighte_oric_init(void) return NULL; } - for( j=1; j<31; j++ ) + for( j=1; j<32; j++ ) { twilighte->twilrombankfiles[j][0]=0; twilighte->twilrambankfiles[j][0]=0; @@ -135,7 +134,7 @@ struct twilighte * twilighte_oric_init(void) while( !feof( f ) ) { result=fgets( line, 1024, f ); - for( j=1; j<31; j++ ) + for( j=1; j<32; j++ ) { if (j>9) sprintf( tbtmp, "twilbankrom%d", j); @@ -155,7 +154,7 @@ struct twilighte * twilighte_oric_init(void) fclose( f ); // Now load rom - for( i=0; i<31; i++ ) + for( i=0; i<32; i++ ) { if( twilighte->twilrombankfiles[i][0]!=0 ) { @@ -166,13 +165,10 @@ struct twilighte * twilighte_oric_init(void) } } } -/* - -*/ - // Flush sram (first bank) + for (j=0;j<16384;j++) twilighte->twilrambankdata[0][j]=0; - twilighte->DDRA=0xff; + twilighte->DDRA=7+128+32; twilighte->VDDRA=7; twilighte->current_bank=7; twilighte->DDRB=0; @@ -192,7 +188,7 @@ unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uin if (twilighte->current_bank<5) { if (twilighte->t_banking_register!=0) - bank=twilighte->current_bank+8+((twilighte->t_banking_register-1)*4); + bank=twilighte->current_bank+8-1+((twilighte->t_banking_register-1)*4); else bank=twilighte->current_bank; } @@ -220,7 +216,7 @@ unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, ui if (twilighte->current_bank<5) { if (twilighte->t_banking_register!=0) - bank=twilighte->current_bank+8+((twilighte->t_banking_register-1)*4); + bank=twilighte->current_bank+8-1+((twilighte->t_banking_register-1)*4); else bank=twilighte->current_bank; } @@ -254,12 +250,16 @@ unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t ad if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRB) { - return twilighte->VDDRB; + return twilighte->VDDRB;; } if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) { - return twilighte->DDRB; + unsigned char data; + data=twilighte->VDDRB; + //twilighte->DDRB=twilighte->DDRB|1|2|4|8|16; + return data; + } if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) @@ -279,9 +279,13 @@ unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t a if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) { - if (mask==0) - twilighte->DDRA=data|128|32; - else + + if (mask==0) + { + + twilighte->DDRA=data&(128+32+7); + } + if (mask==0xff) twilighte->DDRA = twilighte->DDRA&data; twilighte->current_bank=data&7; } @@ -293,16 +297,55 @@ unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t a if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) { + + //twilighte->DDRB= (twilighte->DDRB&~mask)|(data&mask); + //return 0; + + //if (mask==0xFF) { + //twilighte->DDRB=twilighte->DDRB&data; + //error_printf( "DDRB '%x'", twilighte->DDRB ); + //} + + + if (mask==0x00) + { unsigned char lastpb6; unsigned char lastpb7; - lastpb6 = twilighte->DDRB&0x40; + data=data&0b11011111; + if (data==0) + { + twilighte->DDRB=0; + return 0; + } + + lastpb6=twilighte->DDRB&64; + lastpb7=twilighte->DDRB&128; + + + if (lastpb6 && data==64) return 0; + if (lastpb7 && data==128) return 0; + if (lastpb7 && lastpb6 && data==128+64) return 0; + + if (!lastpb6 && data==64) twilighte->DDRB=twilighte->DDRB+64; + if (!lastpb7 && data==128) twilighte->DDRB=twilighte->DDRB+128; + if (!lastpb7 && !lastpb6 && data==128+64) twilighte->DDRB=128+64; + + /* + twilighte->DDRB=data&(255); + + lastpb6=twilighte->DDRB&64; + lastpb7=twilighte->DDRB&128; + + if (lastpb6 || lastpb7) + */ + twilighte->DDRB=twilighte->DDRB|1|2|4|8|16; + + } + + + - lastpb7 = twilighte->DDRB&0x80; - if ((lastpb6==0 || lastpb7==0) && (data&0x80 || data&0x40)) - twilighte->DDRB=data|1|2|4|8|16; - else - twilighte->DDRB=data; } if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.h b/plugins/twilighte_card/oric_twilighte_board_plugin.h index 90306dbd..d70fc82a 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.h +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.h @@ -5,4 +5,4 @@ unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uint unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uint16_t addr, unsigned char data); unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t addr,unsigned char mask, unsigned char data); -unsigned char twilighteboard_oric_read(struct twilighte* twilighte, uint16_t addr); \ No newline at end of file +unsigned char twilighteboard_oric_read(struct twilighte* twilighte, uint16_t addr); diff --git a/plugins/twilighte_card/twilighte.cfg b/plugins/twilighte_card/twilighte.cfg index d4e4795d..e5c8f9b9 100644 --- a/plugins/twilighte_card/twilighte.cfg +++ b/plugins/twilighte_card/twilighte.cfg @@ -1,4 +1,4 @@ -twilbankrom31='roms/empty_orix' +twilbankrom31='roms/empty32' twilbankrom30='roms/empty_orix' twilbankrom29='roms/empty_orix' twilbankrom28='roms/empty_orix' @@ -18,15 +18,43 @@ twilbankrom15='roms/empty_orix' twilbankrom14='roms/empty_orix' twilbankrom13='roms/empty_orix' twilbankrom12='roms/empty_orix' -twilbankrom11='roms/empty_orix' -twilbankrom10='roms/empty_orix' -twilbankrom09='roms/empty_orix' -twilbankrom08='roms/empty_orix' +twilbankrom11='roms/empty_noname11' +twilbankrom10='roms/empty10' +twilbankrom09='roms/empty9' +twilbankrom08='roms/empty8' twilbankrom07='roms/kernel' -twilbankrom06='roms/basicsd2' +twilbankrom06='roms/basicus2' twilbankrom05='roms/shell' -twilbankrom04='roms/empty_orix' -twilbankrom03='roms/empty_orix' +twilbankrom04='roms/basicus1' +twilbankrom03='roms/basicus0' twilbankrom02='roms/empty_orix' twilbankrom01='roms/empty_orix' + + + +; How to emulate joysticks attached +; Options are 'none', 'kbjoy1', 'kbjoy2', 'sdljoyN', 'mouse' +twilightejoy_a = kbjoy1 +twilightejoy_b = none + +; Keys to emulate joystick, set 1 +; NOTE: "fire2" is only available on telestrat +; NOTE: "fire3" is only available on telestrat (right port) +kbjoy1_up = 'KP8' +kbjoy1_down = 'KP2' +kbjoy1_left = 'KP4' +kbjoy1_right = 'KP6' +kbjoy1_fire1 = 'KP_ENTER' +kbjoy1_fire2 = 'KP_PLUS' +kbjoy1_fire3 = 'KP_MINUS' + +; Keys to emulate joystick, set 2 +kbjoy2_up = 'W' +kbjoy2_down = 'S' +kbjoy2_left = 'A' +kbjoy2_right = 'D' +kbjoy2_fire1 = 'SPACE' +kbjoy2_fire2 = 'N' +kbjoy2_fire3 = 'LALT' + From d6e5c1ac1803aca8392294dbca1528726015f367 Mon Sep 17 00:00:00 2001 From: jede Date: Thu, 26 Nov 2020 23:23:20 +0100 Subject: [PATCH 039/143] Fix indent --- .../oric_twilighte_board_plugin.c | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c index f9d3e32b..ba419e7f 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -46,9 +46,6 @@ struct twilighte }; - - - #include "../../system.h" extern SDL_bool read_config_string( char *buf, char *token, char *dest, Sint32 maxlen ); @@ -60,8 +57,8 @@ static SDL_bool load_rom_twilighte( char *fname, int size, unsigned char where[ // MinGW doesn't have asprintf :-( tmpname = malloc( strlen( fname ) + 10 ); - if( !tmpname ) { - + if( !tmpname ) + { return SDL_FALSE; } @@ -148,7 +145,7 @@ struct twilighte * twilighte_oric_init(void) break; } } - } + } } fclose( f ); @@ -163,7 +160,7 @@ struct twilighte * twilighte_oric_init(void) error_printf("Cannot load %s",twilighte->twilrombankfiles[i]); return NULL; } - } + } } for (j=0;j<16384;j++) twilighte->twilrambankdata[0][j]=0; @@ -282,7 +279,6 @@ unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t a if (mask==0) { - twilighte->DDRA=data&(128+32+7); } if (mask==0xff) @@ -297,14 +293,6 @@ unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t a if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) { - - //twilighte->DDRB= (twilighte->DDRB&~mask)|(data&mask); - //return 0; - - //if (mask==0xFF) { - //twilighte->DDRB=twilighte->DDRB&data; - //error_printf( "DDRB '%x'", twilighte->DDRB ); - //} if (mask==0x00) From 88fd168e57fd4dbed7840bd3b25448a7243743ce Mon Sep 17 00:00:00 2001 From: jede Date: Sat, 5 Dec 2020 02:11:25 +0100 Subject: [PATCH 040/143] Now it loads ram bank from config file --- .../oric_twilighte_board_plugin.c | 32 +++++++++++++++--- plugins/twilighte_card/twilighte.cfg | 33 +++++++++++++++++++ 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c index ba419e7f..dd6b8e18 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -110,6 +110,7 @@ struct twilighte * twilighte_oric_init(void) unsigned int i, j; char *result; char tbtmp[32]; + char tbtmpram[32]; char line[1024]; struct twilighte *twilighte = malloc(sizeof(struct twilighte)); twilighte->t_banking_register=0; @@ -133,10 +134,16 @@ struct twilighte * twilighte_oric_init(void) result=fgets( line, 1024, f ); for( j=1; j<32; j++ ) { - if (j>9) - sprintf( tbtmp, "twilbankrom%d", j); + if (j > 9) + { + sprintf(tbtmp, "twilbankrom%d", j); + sprintf(tbtmpram, "twilbankram%d", j); + } else - sprintf( tbtmp, "twilbankrom0%d", j); + { + sprintf(tbtmp, "twilbankrom0%d", j); + sprintf(tbtmpram, "twilbankram0%d", j); + } if (twilighte->twilrombankfiles[j][0]==0) { @@ -145,7 +152,14 @@ struct twilighte * twilighte_oric_init(void) break; } } - } + if (twilighte->twilrambankfiles[j][0] == 0) + { + if (read_config_string(line, tbtmpram, twilighte->twilrambankfiles[j], 1024)) + { + break; + } + } + } } fclose( f ); @@ -160,7 +174,15 @@ struct twilighte * twilighte_oric_init(void) error_printf("Cannot load %s",twilighte->twilrombankfiles[i]); return NULL; } - } + } + if (twilighte->twilrambankfiles[i][0] != 0) + { + if (!load_rom_twilighte(twilighte->twilrambankfiles[i], -16384, twilighte->twilrambankdata[i])) + { + error_printf("Cannot load %s", twilighte->twilrambankfiles[i]); + return NULL; + } + } } for (j=0;j<16384;j++) twilighte->twilrambankdata[0][j]=0; diff --git a/plugins/twilighte_card/twilighte.cfg b/plugins/twilighte_card/twilighte.cfg index e5c8f9b9..94f1475b 100644 --- a/plugins/twilighte_card/twilighte.cfg +++ b/plugins/twilighte_card/twilighte.cfg @@ -30,6 +30,39 @@ twilbankrom03='roms/basicus0' twilbankrom02='roms/empty_orix' twilbankrom01='roms/empty_orix' +;twilbankram30='' +;twilbankram29='' +;twilbankram28='' +;twilbankram27='' +;twilbankram26='' +;twilbankram25='' +;twilbankram24='' +;twilbankram23='' +;twilbankram22='' +;twilbankram21='' +;twilbankram20='' +;twilbankram19='' +;twilbankram18='' +;twilbankram17='' +;twilbankram16='' +;twilbankram15='' +;twilbankram14='' +;twilbankram13='' +;twilbankram12='' +;twilbankram11='' +;twilbankram10='' +;twilbankram09='' +;twilbankram08='' +;twilbankram07='' +;twilbankram06='' +;twilbankram05='' +;twilbankram04='' +;twilbankram03='' +;twilbankram02='' +;twilbankram01='' + + + From 9059047f21cba14740b050f7161c2aff52948f89 Mon Sep 17 00:00:00 2001 From: Stefan Haubenthal Date: Tue, 15 Dec 2020 17:14:50 +0100 Subject: [PATCH 041/143] Fixed filename --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 18eba6ca..276d91ab 100644 --- a/Makefile +++ b/Makefile @@ -150,7 +150,7 @@ LFLAGS += `$(SDL_LIB)-config --libs` -s FILEREQ_OBJ = filereq_amiga.o MSGBOX_OBJ = msgbox_os2.o AMIGA_ICONS = pngicon -EXTRAOBJS = plugins/ch376/oric_ch376_plugin.o plugins/ch376/ch376.o oric_plugins/twilighte_card/twilighte_board_plugin.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o endif # AROS From 8b7bf7aa3f7ed81583cb95eaf1f4776ef6445712 Mon Sep 17 00:00:00 2001 From: iss Date: Mon, 21 Dec 2020 23:59:07 +0200 Subject: [PATCH 042/143] Fixed filename for macOS --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 276d91ab..f62f390f 100644 --- a/Makefile +++ b/Makefile @@ -338,7 +338,7 @@ TARGET = $(TARGET_NAME) FILEREQ_OBJ = MSGBOX_OBJ = CUSTOMOBJS = gui_osx.o filereq_osx.o msgbox_osx.o -EXTRAOBJS = plugins/ch376/oric_ch376_plugin.o plugins/ch376/ch376.o plugins/twilighte_card/oric_twilighte_board_plugin.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o endif From 932a1b409a8f19b12c4d4ba7263257445e6150bb Mon Sep 17 00:00:00 2001 From: iss Date: Tue, 22 Dec 2020 00:36:34 +0200 Subject: [PATCH 043/143] Fixed filename for gcc-win32 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f62f390f..31527f10 100644 --- a/Makefile +++ b/Makefile @@ -240,7 +240,7 @@ TARGET_DEPS = /usr/$(CROSS_PREFIX)/sys-root/mingw/bin/SDL.dll FILEREQ_OBJ = filereq_win32.o MSGBOX_OBJ = msgbox_win32.o CUSTOMOBJS = gui_win.o winicon.o -EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_ch376_plugin.o oric_twilighte_board_plugin.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o endif # Windows 64bit GCC From c18b11936c08abc337581430342dcb4874def471 Mon Sep 17 00:00:00 2001 From: jede Date: Sat, 26 Dec 2020 00:28:36 +0100 Subject: [PATCH 044/143] Fix path : rename twilighte_card to twilighte_board path --- Makefile | 8 ++++---- configure | 0 gui.c | 2 +- joystick.c | 6 +++--- machine.c | 2 +- .../oric_twilighte_board_plugin.c | 0 .../oric_twilighte_board_plugin.h | 0 plugins/{twilighte_card => twilighte_board}/twilighte.cfg | 0 8 files changed, 9 insertions(+), 9 deletions(-) mode change 100755 => 100644 configure rename plugins/{twilighte_card => twilighte_board}/oric_twilighte_board_plugin.c (100%) rename plugins/{twilighte_card => twilighte_board}/oric_twilighte_board_plugin.h (100%) rename plugins/{twilighte_card => twilighte_board}/twilighte.cfg (100%) diff --git a/Makefile b/Makefile index 00ac8dd6..a0c1b0d7 100644 --- a/Makefile +++ b/Makefile @@ -42,7 +42,7 @@ VERSION_COPYRIGHTS = "$(APP_NAME) $(VERSION_FULL) $(COPYRIGHTS)" ####### DEFAULT SETTINGS HERE ####### SRC_DIR = . -VPATH = $(SRC_DIR) $(SRC_DIR)/plugins/ch376 $(SRC_DIR)/plugins/twilighte_card +VPATH = $(SRC_DIR) $(SRC_DIR)/plugins/ch376 $(SRC_DIR)/plugins/twilighte_board ### extract git/svn revision GITREVISION = $(shell git rev-parse --short HEAD || svnversion -n $(SRC_DIR)) @@ -150,7 +150,7 @@ LFLAGS += `$(SDL_LIB)-config --libs` -s FILEREQ_OBJ = filereq_amiga.o MSGBOX_OBJ = msgbox_os2.o AMIGA_ICONS = pngicon -EXTRAOBJS = plugins/ch376/oric_ch376_plugin.o plugins/ch376/ch376.o oric_plugins/twilighte_card/twilighte_board_plugin.o +EXTRAOBJS = plugins/ch376/oric_ch376_plugin.o plugins/ch376/ch376.o oric_plugins/twilighte_board/twilighte_board_plugin.o endif # AROS @@ -311,7 +311,7 @@ INSTALLDIR = /boot/apps/Oricutron FILEREQ_OBJ = MSGBOX_OBJ = CUSTOMOBJS = gui_beos.o msgbox_beos.o filereq_beos.o -EXTRAOBJS = plugins/ch376/oric_ch376_plugin.o plugins/twilighte_card/oric_twilighte_board_plugin.o +EXTRAOBJS = plugins/ch376/oric_ch376_plugin.o plugins/twilighte_board/oric_twilighte_board_plugin.o BEOS_BERES := beres BEOS_RC := rc BEOS_XRES := xres @@ -338,7 +338,7 @@ TARGET = $(TARGET_NAME) FILEREQ_OBJ = MSGBOX_OBJ = CUSTOMOBJS = gui_osx.o filereq_osx.o msgbox_osx.o -EXTRAOBJS = plugins/ch376/oric_ch376_plugin.o plugins/ch376/ch376.o plugins/twilighte_card/oric_twilighte_board_plugin.o +EXTRAOBJS = plugins/ch376/oric_ch376_plugin.o plugins/ch376/ch376.o plugins/twilighte_board/oric_twilighte_board_plugin.o endif diff --git a/configure b/configure old mode 100755 new mode 100644 diff --git a/gui.c b/gui.c index 34890c2b..aad3e590 100644 --- a/gui.c +++ b/gui.c @@ -64,7 +64,7 @@ #include "plugins/ch376/ch376.h" #include "plugins/ch376/oric_ch376_plugin.h" -#include "plugins/twilighte_card/oric_twilighte_board_plugin.h" +#include "plugins/twilighte_board/oric_twilighte_board_plugin.h" extern SDL_bool fullscreen; diff --git a/joystick.c b/joystick.c index 881fe117..9032603b 100644 --- a/joystick.c +++ b/joystick.c @@ -35,7 +35,7 @@ #include "machine.h" #include "joystick.h" -#include "plugins/twilighte_card/oric_twilighte_board_plugin.h" +#include "plugins/twilighte_board/oric_twilighte_board_plugin.h" struct keyjoydef { @@ -301,13 +301,13 @@ void joy_buildmask( struct machine *oric ) if( gimme_port_a ) { - //twilighteboard_oric_write(oric->twilighte, 0x321, 0xff,mkmask_f); + //twilighteboard_oric_write(oric->twilighte, 0x321, 0xff, mkmask_f); } if( gimme_port_b ) { // port B - twilighteboard_oric_write(oric->twilighte, 0x320, 0xff, mkmask); + //twilighteboard_oric_write(oric->twilighte, 0x320, 0xff, mkmask); } } else diff --git a/machine.c b/machine.c index f3d7bd73..c4fbaf81 100644 --- a/machine.c +++ b/machine.c @@ -46,7 +46,7 @@ #include "plugins/ch376/ch376.h" #include "plugins/ch376/oric_ch376_plugin.h" -#include "plugins/twilighte_card/oric_twilighte_board_plugin.h" +#include "plugins/twilighte_board/oric_twilighte_board_plugin.h" #include "machine.h" #include "avi.h" diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c similarity index 100% rename from plugins/twilighte_card/oric_twilighte_board_plugin.c rename to plugins/twilighte_board/oric_twilighte_board_plugin.c diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.h b/plugins/twilighte_board/oric_twilighte_board_plugin.h similarity index 100% rename from plugins/twilighte_card/oric_twilighte_board_plugin.h rename to plugins/twilighte_board/oric_twilighte_board_plugin.h diff --git a/plugins/twilighte_card/twilighte.cfg b/plugins/twilighte_board/twilighte.cfg similarity index 100% rename from plugins/twilighte_card/twilighte.cfg rename to plugins/twilighte_board/twilighte.cfg From efe52ed10fe978546228701c09d546dd74471fcc Mon Sep 17 00:00:00 2001 From: iss Date: Sat, 2 Jan 2021 14:34:15 +0200 Subject: [PATCH 045/143] fix for Pravetz keyboard mapping --- roms/pravetzt.pch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/roms/pravetzt.pch b/roms/pravetzt.pch index 49766948..f6c4dfa9 100644 --- a/roms/pravetzt.pch +++ b/roms/pravetzt.pch @@ -77,8 +77,8 @@ tt_writeleader_end_pc = $e769 $3F78:37EAEDEB20F5F938EEF436392CE9E8EC $3F88:35F2E23B2EEFE730F6E6342D0BF0E52F $3F98:0000000000000000311BFA00087FE10D -$3FA8:F8F1325C0A5DF35E33E4E327095BF73D +$3FA8:F8F1325C0A5DF37C33E4E327095BF73D $3FB8:264A4D4B2055592A4E545E283C49484C $3FC8:2552423A3E4F47295646245F0B50453F $3FD8:0000000000000000211B5A00087F410D -$3FE8:5851407C0A7D537E23444322097B572B +$3FE8:585140600A7D537E23444322097B572B From 98706e3bc7fa5377e88d2ac73f84bb5dee208841 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= Date: Tue, 5 Jan 2021 03:25:51 +0100 Subject: [PATCH 046/143] Avoid using 0b notation for inline binary values This freaks out gcc 2.95 on Haiku. --- plugins/twilighte_card/oric_twilighte_board_plugin.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/twilighte_card/oric_twilighte_board_plugin.c b/plugins/twilighte_card/oric_twilighte_board_plugin.c index ba419e7f..21d604d3 100644 --- a/plugins/twilighte_card/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_card/oric_twilighte_board_plugin.c @@ -300,7 +300,7 @@ unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t a unsigned char lastpb6; unsigned char lastpb7; - data=data&0b11011111; + data=data&0xdf; if (data==0) { twilighte->DDRB=0; From 90c36d89cb001ebe8c070574be2a767856b3407c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= Date: Tue, 5 Jan 2021 03:29:22 +0100 Subject: [PATCH 047/143] Silence warning --- joystick.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/joystick.c b/joystick.c index 881fe117..d6e1935f 100644 --- a/joystick.c +++ b/joystick.c @@ -259,7 +259,7 @@ void joy_buildmask( struct machine *oric ) Uint8 mkmask_f = 0xff; Uint8 joysel = oric->via.read_port_a( &oric->via ); Uint8 telestrat_joysel = oric->tele_via.read_port_b( &oric->tele_via ); - Uint8 twilighteboard_joysel; + Uint8 twilighteboard_joysel = 0; SDL_bool gimme_port_a = SDL_FALSE; From c20fd4d0c9cd942b3add27609e65e1911afb04e6 Mon Sep 17 00:00:00 2001 From: iss Date: Tue, 9 Feb 2021 19:49:40 +0200 Subject: [PATCH 048/143] small fix in cfg --- oricutron.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oricutron.cfg b/oricutron.cfg index 66b3f0b0..76c3ab82 100644 --- a/oricutron.cfg +++ b/oricutron.cfg @@ -51,7 +51,7 @@ machine = atmos ; ---------------------------------- -; Type of disk controller (none, microdisc, jasmin, pravetz) +; Type of disk controller (none, microdisc, jasmin, bd500, pravetz) disktype = none ; Write back all changes to disk images (if turned off, you have to press From 9f1919dad6cafbd57e33a7b18265ef5b6cfdb9b6 Mon Sep 17 00:00:00 2001 From: iss Date: Wed, 10 Feb 2021 19:06:21 +0200 Subject: [PATCH 049/143] fix: BD500 support --- ChangeLog.txt | 1 + disk.c | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index 5e41dcc5..d2545da5 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -3,6 +3,7 @@ Oricutron ChangeLog pre-release changes (work in progress) -------------------------------------- +* Updated BD500 support * Fixed crash with visual keyboard on/off * Added Byte Drive BD-500 support * Added possibility to load more images from command line diff --git a/disk.c b/disk.c index cc758c0a..1db7350b 100644 --- a/disk.c +++ b/disk.c @@ -1596,10 +1596,25 @@ void bd500_write( struct bd500 *bd, unsigned short addr, unsigned char data ) switch( addr ) { case 0x31a: - switch( data & 0xe0 ) + + // NOTE: Ray030471: + // For V2.2 of the Byte Drive operating system, this should be + // "switch( data & 0xc0 )". Only bits 6 & 7 are used in address 0x31a for the disk + // drive number. Bit 5 of 0x31a is the carry which has been rolled in by "ROR A:ROR + // A:ROR A" (2 occasions) and is determined by the comparison of old drive number + // to new drive number. I have patched this in my Byte Drive V2.2 operating system + // by replacing "ROR A:ROR A:ROR A" by "LSR A:ROR A:ROR A" but it would be better + // to update Oricutron as I suggest in my first line here. I don't think that the + // actual hardware supports double-sided disk drives but it would be nice of + // Oricutron used bit 0 of 0x31a to select the disk side on the floppy disk + // controller. + + bd->wd->c_side = data&1; + + switch( data & 0xc0 ) { default: - case 0x20: + case 0x00: bd->wd->c_drive = 0; break; case 0x40: From dadb263fe336791391af8f94b7dcca0c3fff7d0c Mon Sep 17 00:00:00 2001 From: iss Date: Sat, 13 Feb 2021 04:13:27 +0200 Subject: [PATCH 050/143] fix: BD500 support+ --- disk.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/disk.c b/disk.c index 1db7350b..2ba6777d 100644 --- a/disk.c +++ b/disk.c @@ -1494,6 +1494,41 @@ void microdisc_write( struct microdisc *md, unsigned short addr, unsigned char d } // Byte Drive 500 interface handlers +// NOTE: Info by Ray McLaughlin +// +// 0x310 MOTOFF R switches the disk drive motor off. +// 0x311 MOTON R switches the disk drive motor on. +// NOTE: (probably)the motor is switched on +// by (electronic) default on first powering up +// the BD interface but it is safer to switch it +// on in the boot sector (page 4) code. +// +// 0x312 DSTATS R on read (BIT instruction) to obtain the +// FDC's DRQ in bit 7 and IRQ in bit 6. +// +// 0x313 MAPOFF R/W enables the ORIC ROM and disables the overlay RAM. +// +// 0x314 MAPON R/W disables the ORIC ROM and enables the overlay RAM. +// +// 0x315 PRECMP R (probably) forwrite compensation on the FDC. +// NOTE: maybe it's used in the DOS versions V2.2 & V3.1 +// of the BD software but not in Ray's latest version, +// perhaps it will be included. +// +// 0x316 SDEN R/W enables the the lower 8k of the ORIC's EPROM +// (used where the ORIC has 2x8k EPROMS) and therefore +// disables the overlay RAM in that memory area. +// This overrides MAPON (see above). +// +// 0x317 DDEN R/W disables the lower 8k of the ORIC's EPROM +// (used where the ORIC has 1x16k EPROM or ROM) +// and therefore enables the overlay RAM when MAPON +// has been accessed. +// +// 0x0380 R/W disables the BD interface ROM which covers addresses +// 0xE000 to 0xFFFF but before that is done, it takes +// precedence over the above for that memory space. + void bd500_setdrq( void *bd ) { struct bd500 *bdp = (struct bd500 *)bd; @@ -1566,16 +1601,30 @@ unsigned char bd500_read( struct bd500 *bd, unsigned short addr ) case 0x310: case 0x311: + // MOTOFF = 0 + // MOTON = 1 + // or MOTOR = addr & 1; + break; + case 0x315: + // PRECMP + break; + case 0x316: + // SDEN bd->diskrom = SDL_FALSE; break; case 0x317: + // DDEN // 64k/56k mode depend on ROM chips bd->diskrom = bd->oric->rom16? SDL_FALSE : SDL_TRUE; break; + case 0x0380: + bd->diskrom = SDL_FALSE; + break; + default: break; } @@ -1595,9 +1644,32 @@ void bd500_write( struct bd500 *bd, unsigned short addr, unsigned char data ) switch( addr ) { + case 0x313: + bd->oric->romdis = SDL_FALSE; + break; + + case 0x314: + bd->oric->romdis = SDL_TRUE; + break; + + case 0x316: + // SDEN + bd->diskrom = SDL_FALSE; + break; + + case 0x317: + // DDEN + // 64k/56k mode depend on ROM chips + bd->diskrom = bd->oric->rom16? SDL_FALSE : SDL_TRUE; + break; + + case 0x0380: + bd->diskrom = SDL_FALSE; + break; + case 0x31a: - // NOTE: Ray030471: + // NOTE: by Ray McLaughlin: // For V2.2 of the Byte Drive operating system, this should be // "switch( data & 0xc0 )". Only bits 6 & 7 are used in address 0x31a for the disk // drive number. Bit 5 of 0x31a is the carry which has been rolled in by "ROR A:ROR From 252172e38af8225d5f42a89bb8f33d1c0b1a3922 Mon Sep 17 00:00:00 2001 From: iss Date: Sat, 13 Feb 2021 11:25:24 +0200 Subject: [PATCH 051/143] new: option to disable menu color scheme --- ChangeLog.txt | 1 + gui.c | 10 +- machine.c | 9 +- machine.h | 2 + main.c | 3 +- oricutron.cfg | 5 +- oricutron.desktop | 2 +- roms/basic11b.sym | 3 + roms/pravetzt-1.0.pch | 74 ++++++++++++++ roms/pravetzt-1.0.sym | 217 ++++++++++++++++++++++++++++++++++++++++++ roms/pravetzt.sym | 3 + 11 files changed, 317 insertions(+), 12 deletions(-) create mode 100644 roms/pravetzt-1.0.pch create mode 100644 roms/pravetzt-1.0.sym diff --git a/ChangeLog.txt b/ChangeLog.txt index d2545da5..fe9559e2 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -3,6 +3,7 @@ Oricutron ChangeLog pre-release changes (work in progress) -------------------------------------- +* Added option to disable menu color scheme * Updated BD500 support * Fixed crash with visual keyboard on/off * Added Byte Drive BD-500 support diff --git a/gui.c b/gui.c index afdd0230..35b3a53a 100644 --- a/gui.c +++ b/gui.c @@ -283,7 +283,7 @@ struct osdmenuitem hwopitems[] = { { " Oric-1", "1", SDLK_1, { " Lightpen", NULL, 0, togglelightpen, 0, 0 }, { " Serial none ", NULL, 0, toggleaciabackend, 0, 0 }, { " CH376 (Telestrat) ", NULL, 0, togglech376, 0, 0 }, - { " Twilighte board ", NULL, 0, toggletwilighte, 0, 0 }, + { " Twilighte board ", NULL, 0, toggletwilighte, 0, 0 }, // { " Mouse", NULL, 0, NULL, 0, 0 }, { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, { "Back", "\x17", SDLK_BACKSPACE,gotomenu, 0, 0 }, @@ -1541,7 +1541,7 @@ void toggletwilighte(struct machine *oric, struct osdmenuitem *mitem, int dummy) oric->twilighteboard_activated = SDL_TRUE; mitem->name = "\x0e""Twilighte board"; oric->twilighte = twilighte_oric_init(); - if (oric->twilighte == NULL) + if (oric->twilighte == NULL) { oric->twilighteboard_activated = SDL_FALSE; // Impossible to create struct, we did not activate twilighteboard } @@ -1549,8 +1549,8 @@ void toggletwilighte(struct machine *oric, struct osdmenuitem *mitem, int dummy) { oric->ch376_activated = SDL_TRUE; } - - + + } // Toggle symbols autoload @@ -2374,6 +2374,8 @@ void setmenutoggles( struct machine *oric ) else find_item_by_function(keopitems, togglestickykeys)->name = " Sticky mod keys"; + g_menu_scheme = oric->disable_menuscheme? 5 : oric->type; + find_item_by_function(hwopitems, togglech376)->name = oric->ch376_activated ? "\x0e""CH376 (Telestrat)" : " CH376 (Telestrat) "; find_item_by_function(hwopitems, toggletwilighte)->name = oric->twilighteboard_activated ? "\x0e""Twilighte board" : " Twilighte board"; } diff --git a/machine.c b/machine.c index 4a7cb267..7df50378 100644 --- a/machine.c +++ b/machine.c @@ -62,7 +62,6 @@ extern char diskpath[], diskfile[], filetmp[]; extern char telediskpath[], telediskfile[]; extern char pravdiskpath[], pravdiskfile[]; extern SDL_bool refreshstatus, refreshavi; -extern int g_menu_scheme; // #InfoBadDesign - init g_menu_scheme should be done elsewhere - machine.c should not depend on gui - but this is the only place I know char atmosromfile[1024]; char oric1romfile[1024]; @@ -319,8 +318,8 @@ void atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) if (oric->twilighteboard_activated && addr >= 0xc000 ) twilighteboard_oric_ROM_RAM_write(oric->twilighte,addr-0xc000,data); else - if( ( !oric->romdis ) && ( addr >= 0xc000 ) ) return; // Can't write to ROM! - + if( ( !oric->romdis ) && ( addr >= 0xc000 ) ) return; // Can't write to ROM! + if( ( addr & 0xff00 ) == 0x0300 ) { if( oric->aciabackend && ( oric->aciaoffset <= addr && addr < oric->aciaoffset+4 ) ) @@ -1192,6 +1191,8 @@ void preinit_machine( struct machine *oric ) oric->define_mapping = SDL_FALSE; oric->sticky_mod_keys = SDL_FALSE; + oric->disable_menuscheme = SDL_FALSE; + oric->pravdiskautoboot = SDL_TRUE; } @@ -1810,8 +1811,6 @@ SDL_bool init_machine( struct machine *oric, int type, SDL_bool nukebreakpoints clear_patches( oric ); - g_menu_scheme = type; - switch( type ) { case MACH_ORIC1_16K: diff --git a/machine.h b/machine.h index 2f3c8e8e..8c129c0e 100644 --- a/machine.h +++ b/machine.h @@ -260,6 +260,8 @@ struct machine SDL_bool define_mapping; SDL_bool sticky_mod_keys; + SDL_bool disable_menuscheme; + int aciaoffset; int aciabackend; int aciabackendcfg; diff --git a/main.c b/main.c index c32fc0ae..ea854ad2 100644 --- a/main.c +++ b/main.c @@ -528,6 +528,7 @@ static void load_config( struct start_opts *sto, struct machine *oric ) if( read_config_bool( &sto->lctmp[i], "ch376", &oric->ch376_activated) ) continue; if( read_config_bool( &sto->lctmp[i], "twilighte_board",&oric->twilighteboard_activated) ) continue; if( read_config_bool( &sto->lctmp[i], "pravdiskautoboot", &oric->pravdiskautoboot ) ) continue; + if( read_config_bool( &sto->lctmp[i], "disable_menuscheme", &oric->disable_menuscheme ) ) continue; if( read_config_bool( &sto->lctmp[i], "show_keyboard", &oric->show_keyboard ) ) continue; if( read_config_bool( &sto->lctmp[i], "sticky_mod_keys", &oric->sticky_mod_keys ) )continue; if( read_config_string( &sto->lctmp[i], "autoload_keyboard_mapping", keymap_file, 4096 ) ) @@ -1397,7 +1398,7 @@ void frameloop_normal( struct machine *oric, SDL_bool *framedone, SDL_bool *need } if (!oric->twilighteboard_activated) - tape_patches( oric ); + tape_patches( oric ); via_clock( &oric->via, oric->cpu.icycles ); ay_ticktock( &oric->ay, oric->cpu.icycles ); diff --git a/oricutron.cfg b/oricutron.cfg index 76c3ab82..dca3ec2c 100644 --- a/oricutron.cfg +++ b/oricutron.cfg @@ -204,10 +204,13 @@ kbjoy2_fire2 = 'N' kbjoy2_fire3 = 'LALT' ; Visual keyboard -show_keyboard = yes +;show_keyboard = yes ;sticky_mod_keys = yes ;autoload_keyboard_mapping = 'keymap/my_keymap.kma' +; Disable menu color scheme +;disable_menuscheme = no + ; ch376 chip emulation. This chip can read a usbkey. For more information : http://orix.oric.org ; only available in telestrat mode ch376 = no diff --git a/oricutron.desktop b/oricutron.desktop index 9cd89b5b..da2c978d 100644 --- a/oricutron.desktop +++ b/oricutron.desktop @@ -10,4 +10,4 @@ Exec=oricutron %U MimeType=application/x-oric-rom;application/x-oric-tape;application/x-oric-disk Icon=oricutron Categories=Emulator;Utility; -Keywords=ORIC,Oric1,Atmos +Keywords=ORIC,Oric1,Atmos,Pravetz-8D diff --git a/roms/basic11b.sym b/roms/basic11b.sym index 6fdc9cf8..c830875b 100644 --- a/roms/basic11b.sym +++ b/roms/basic11b.sym @@ -10,6 +10,7 @@ c4d3 InsDelLine c4e0 DeleteLine c524 InsertLine c55f SetLineLinkPtrs +c444 FreeMemCheck c592 GetLine c5e8 ReadKey c5fa TokeniseLine @@ -167,6 +168,7 @@ ede0 SetupTimer ee1a StopTimer ee22 IRQ ee8c ResetTimer +ee1a StopTimer ee9d GetTimer eeab SetTimer eec9 Delay @@ -213,6 +215,7 @@ fb14 KeyClickH fb1c KeyClickHData fb2a KeyClickL fb32 KeyClickLData +fb14 KeyClickH fb40 SOUND fbd0 PLAY fc18 MUSIC diff --git a/roms/pravetzt-1.0.pch b/roms/pravetzt-1.0.pch new file mode 100644 index 00000000..e5505bf5 --- /dev/null +++ b/roms/pravetzt-1.0.pch @@ -0,0 +1,74 @@ +; +; ROM patches file +; +; This file describes how to patch a ROM for things like turbotape, +; and filename decoding. +; + +; ****** ROM INFORMATION ****** + +; This part isn't actual patches, just information about +; the hardware the ROM expects to be present. + +; ROM expects a special keyboard layout? +keymap = qwerty + +; ****** FILENAME DECODING ******* + +; When the PC is about to execute this address, we should be at a point +; in CLOAD/CSAVE/STORE/RECALL where the filename is valid in memory. +fd_cload_getname_pc = $e4af +fd_csave_getname_pc = $e7ef +;fd_store_getname_pc = +;fd_recall_getname_pc = + +; The address to read the CLOAD filename +fd_getname_addr = $0035 + + +; ****** TURBOTAPE ****** + +; Address of the "Cassette Sync" function in ROM +tt_getsync_pc = $e696 + +; Address of the RTS at the end of the cassette sync function (so we can +; skip the function) +tt_getsync_end_pc = $e6b9 + +; If turbotape is enabled, but no tape is inserted, the cassette sync +; function will be executed normally. Here we have an address inside the +; loop that waits for the cassette sync signal, so that we can break out +; of it if a tape is inserted. +tt_getsync_loop_pc = $e681 + +; Address of the "Read Byte" function in ROM +tt_readbyte_pc = $e630 + +; Address of the RTS at the end of the read byte function +tt_readbyte_end_pc = $e65b + +; Set carry at end of readbyte routine? +tt_readbyte_setcarry = no + +; In order to simulate the effects of the read byte routine, you can +; specify an address to write the byte read, and an address to write +; zero to. +tt_readbyte_storebyte_addr = $002f +;tt_readbyte_storezero_addr = + +; Address of the "put byte" function in ROM +tt_putbyte_pc = $e5c6 + +; Address of the RTS at the end of the put byte function +tt_putbyte_end_pc = $e5f2 + +; Address of the RTS at the end of CSAVE +tt_csave_end_pc = $e7fe + +; Address of the RTS at the end of STORE +;tt_store_end_pc = + +; Address of the function that writes the tape leader +; (so we can write a shorter one) +tt_writeleader_pc = $e6ba +tt_writeleader_end_pc = $e6c9 diff --git a/roms/pravetzt-1.0.sym b/roms/pravetzt-1.0.sym new file mode 100644 index 00000000..6dbf9368 --- /dev/null +++ b/roms/pravetzt-1.0.sym @@ -0,0 +1,217 @@ +c006 JumpTab +c0ea Keywords +c2ac ErrorMsgs +c3ca FindForVar +c3f8 VarAlloc +c448 FreeMemCheck +c47c PrintError +c4b5 BackToBASIC +c4e3 InsDelLine +c4e0 DeleteLine +c524 InsertLine +c56f SetLineLinkPtrs +c5a2 GetLine +c5f8 ReadKey +c60a TokeniseLine +c6a5 EDIT +c6de FindLine +c719 NEW +c738 CLEAR +c773 LIST +c824 LLIST +c832 LPRINT +c841 FOR +c8c1 DoNextLine +c8fe DoStatement +c91f RESTORE +c93f STOP +c941 END +c91e CONT +c98b RUN +c996 GOSUB +c9b3 GOTO +c9e0 RETURN +ca0a DATA +ca1c FindEndOfStatement +ca1f FindEOL +ca3e IF +ca61 REM +ca78 ON +ca98 Txt2Int +cad2 LET +cb61 PRINT +cb9f NewLine +cc59 SetCursor +cbed PrintString +cc0a CLS +cc8c TRON +cc8f TROFF +ccba GET +ccc9 INPUT +ccfd READ +ce0c NEXT +ce77 GetExpr +ce8b EvalExpr +cfac DoOper +cf74 GetItem +d03c NOT +d059 EvalBracket +cff0 GetVarVal +d087 Compare +d0f2 DIM +d0fc GetVarFromText +d361 DimArray +d3eb GetArrayElement +d47e FRE +d4a6 POS +d401 DEF +d593 STR +d5a3 SetupString +d4fa GetString +d595 GarbageCollect +d730 CopyString +d767 StrCat +d816 CHR +d82a LEFT +d856 RIGHT +d861 MID +d8a6 LEN +d8b5 ASC +d80a GetByteExpr +d867 FP2Int +d938 PEEK +d894 POKE +d89d WAIT +d8ac DOKE +d983 DEEK +d993 Byte2Hex +d9b5 HEX +d93d LORES +d965 RowCalc +da3f SCRN +d9c6 PLOT +da16 UNTIL +daab REPEAT +dada KEY +da6b TxtTest +db92 Normalise +dbb9 AddMantissas +dc79 LN +dd4d UnpackFPA +dda3 FPAMult10 +ddbf FPADiv10 +d0d0 LOG +de77 PI +def4 RoundFPA +df0b FALSE +df0f TRUE +df04 GetSign +df12 SGN +df31 ABS +df4c CompareFPA +df8c FPA2Int +dfa5 INT +dfcf GetNumber +e076 AddToFPA +e0c1 PrintInt +e22a SQR +e27c ExpData +e2a6 EXP +e313 SeriesEval +e34b RND +e387 COS +e38e SIN +e3d7 TAN +e407 TrigData +e43b ATN +e46f ATNData +e4a8 TapeSync +e4f2 VERIFY +e554 IncTapeCount +e57d PrintSearching +e585 PrintSaving +e58c PrintFName +e594 PrintFound +e5a4 PrintLoading +e5ab PrintVerifying +e5b6 PrintMsg +e5ea ClrStatus +e563 ClrTapeStatus +e5c6 PutTapeByte +e630 GetTapeByte +e696 SyncTape +e6ba WriteLeader +e6ca SetupTape +e725 GetTapeParams +e7aa CLOAD +e903 CLEAR +e7db CSAVE +e80d CALL +e987 STORE +e9d1 RECALL +e87d HiresTest +e905 CheckKbd +e965 HIMEM +e974 GRAB +e994 RELEASE +e9a9 TEXT +e9bb HIRES +ec45 POINT +eccc StartBASIC +edc4 CopyMem +ecc7 SetupTimer +ed01 StopTimer +ed09 IRQ +ed70 ResetTimer +ed81 GetTimer +ed8f SetTimer +e0ad Delay +eee8 WritePixel +eef8 DrawLine +ebdf CURSET +ebe2 CURMOV +ebe5 DRAW +ebeb PATTERN +ebee CHAR +ebf4 PAPER +ebf7 INK +ebfa FILL +ebe8 CIRCLE +f43c ReadKbd +f4ef Key2ASCII +f523 FindKey +f561 ReadKbdCol +f535 WriteToAY +f57b PrintChar +f5d3 ControlChr +f71a ClearLine +f73f Char2Scr +f7e4 PrintA +f7e0 AltChars +f82f PrintStatus +f88f Reset +f8af BASICStart +f8b5 BASICRestart +f920 HiresMode +f967 LoresMode +f960 ResetVIA +f9c9 SetupText +fa14 RamTest +fa85 PING +faa7 PingData +fa9b SHOOT +fabd ShootData +fab1 EXPLODE +facb ExplodeData +fac7 ZAP +fb06 ZapData +fafa KeyClickH +fb1c KeyClickHData +fb10 KeyClickL +fb32 KeyClickLData +fb26 SOUND +fbb6 PLAY +fbfe MUSIC +fc5e MusicData +fc78 CharSet +ff78 KeyCodeTab diff --git a/roms/pravetzt.sym b/roms/pravetzt.sym index 6fdc9cf8..c830875b 100644 --- a/roms/pravetzt.sym +++ b/roms/pravetzt.sym @@ -10,6 +10,7 @@ c4d3 InsDelLine c4e0 DeleteLine c524 InsertLine c55f SetLineLinkPtrs +c444 FreeMemCheck c592 GetLine c5e8 ReadKey c5fa TokeniseLine @@ -167,6 +168,7 @@ ede0 SetupTimer ee1a StopTimer ee22 IRQ ee8c ResetTimer +ee1a StopTimer ee9d GetTimer eeab SetTimer eec9 Delay @@ -213,6 +215,7 @@ fb14 KeyClickH fb1c KeyClickHData fb2a KeyClickL fb32 KeyClickLData +fb14 KeyClickH fb40 SOUND fbd0 PLAY fc18 MUSIC From 6636d49af8549627d25c5f4400c1552fd554f311 Mon Sep 17 00:00:00 2001 From: iss Date: Sat, 13 Feb 2021 14:00:24 +0200 Subject: [PATCH 052/143] new: BD500 DOS70 support --- ChangeLog.txt | 1 + disk.c | 30 ++++++++++++++++++++++++------ disk.h | 1 + machine.c | 9 +++++---- machine.h | 2 +- main.c | 3 ++- oricutron.cfg | 4 ++++ 7 files changed, 38 insertions(+), 12 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index fe9559e2..8eb2148d 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -3,6 +3,7 @@ Oricutron ChangeLog pre-release changes (work in progress) -------------------------------------- +* Updated BD500 for DOS70 * Added option to disable menu color scheme * Updated BD500 support * Fixed crash with visual keyboard on/off diff --git a/disk.c b/disk.c index 2ba6777d..4c84fb28 100644 --- a/disk.c +++ b/disk.c @@ -1503,8 +1503,9 @@ void microdisc_write( struct microdisc *md, unsigned short addr, unsigned char d // the BD interface but it is safer to switch it // on in the boot sector (page 4) code. // -// 0x312 DSTATS R on read (BIT instruction) to obtain the -// FDC's DRQ in bit 7 and IRQ in bit 6. +// 0x312 DSTATS R bit 7 - DRQ +// bit 6 - IRQ +// bit 0 - motor status (): b0=0 ON, b0=1 OFF (NOTE: DOS7 only). // // 0x313 MAPOFF R/W enables the ORIC ROM and disables the overlay RAM. // @@ -1525,6 +1526,11 @@ void microdisc_write( struct microdisc *md, unsigned short addr, unsigned char d // and therefore enables the overlay RAM when MAPON // has been accessed. // +// 0x31a DRVSEL R bit 7,6 - current drive +// bit 5 - current side +// W bit 7,6 - select drive +// bit 1 - select side +// // 0x0380 R/W disables the BD interface ROM which covers addresses // 0xE000 to 0xFFFF but before that is done, it takes // precedence over the above for that memory space. @@ -1569,6 +1575,7 @@ void bd500_init( struct bd500 *bd, struct wd17xx *wd, struct machine *oric ) bd->wd = wd; bd->oric = oric; bd->diskrom = SDL_TRUE; + bd->motor = SDL_FALSE; } void bd500_free( struct bd500 *bd ) @@ -1580,6 +1587,8 @@ void bd500_free( struct bd500 *bd ) unsigned char bd500_read( struct bd500 *bd, unsigned short addr ) { + unsigned char ret = 0xff; + // dbg_printf( "DISK: (%04X) Read from %04X", bd->oric->cpu.pc-1, addr ); if( ( addr >= 0x320 ) && ( addr < 0x324 ) ) @@ -1588,7 +1597,8 @@ unsigned char bd500_read( struct bd500 *bd, unsigned short addr ) switch( addr ) { case 0x312: - return (bd->drq | bd->intrq); + ret = bd->drq | bd->intrq; + if( bd->oric->dos70 ) ret |= bd->motor? 0:1; break; case 0x313: @@ -1600,10 +1610,12 @@ unsigned char bd500_read( struct bd500 *bd, unsigned short addr ) break; case 0x310: - case 0x311: // MOTOFF = 0 + bd->motor = SDL_FALSE; + break; + case 0x311: // MOTON = 1 - // or MOTOR = addr & 1; + bd->motor = SDL_TRUE; break; case 0x315: @@ -1621,6 +1633,12 @@ unsigned char bd500_read( struct bd500 *bd, unsigned short addr ) bd->diskrom = bd->oric->rom16? SDL_FALSE : SDL_TRUE; break; + case 0x31a: + // bits 7,6 current drive + // bit 5 current side + ret = ((bd->wd->c_drive&3)<<6) | ((bd->wd->c_side&1)<<5); + break; + case 0x0380: bd->diskrom = SDL_FALSE; break; @@ -1629,7 +1647,7 @@ unsigned char bd500_read( struct bd500 *bd, unsigned short addr ) break; } - return 0xff; + return ret; } void bd500_write( struct bd500 *bd, unsigned short addr, unsigned char data ) diff --git a/disk.h b/disk.h index 87b8d2e9..f0dd3650 100644 --- a/disk.h +++ b/disk.h @@ -178,6 +178,7 @@ struct bd500 struct wd17xx *wd; // Pointer to the WD17xx structure struct machine *oric; // Pointer to the Oric structure SDL_bool diskrom; // TRUE if the diskrom is enabled + SDL_bool motor; }; // Current state of the Jasmin hardware diff --git a/machine.c b/machine.c index 7df50378..16c0cfab 100644 --- a/machine.c +++ b/machine.c @@ -315,7 +315,7 @@ void atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) struct machine *oric = (struct machine *)cpu->userdata; - if (oric->twilighteboard_activated && addr >= 0xc000 ) + if (oric->twilighteboard_activated && addr >= 0xc000 ) twilighteboard_oric_ROM_RAM_write(oric->twilighte,addr-0xc000,data); else if( ( !oric->romdis ) && ( addr >= 0xc000 ) ) return; // Can't write to ROM! @@ -327,7 +327,7 @@ void atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) else if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) ch376_oric_write(oric->ch376, addr, data); - + else if(oric->twilighteboard_activated && ((0x342 <= addr && addr < 0x344 ) || (0x320 <= addr && addr < 0x330 ))) twilighteboard_oric_write(oric->twilighte,addr,0x00,data); @@ -407,7 +407,7 @@ void telestratwrite( struct m6502 *cpu, unsigned short addr, unsigned char data ch376_oric_write(oric->ch376, addr, data); break; } - + default: via_write( &oric->via, addr, data ); @@ -1137,6 +1137,7 @@ void preinit_machine( struct machine *oric ) oric->tapenoise = SDL_FALSE; oric->rawtape = SDL_FALSE; oric->rom16 = SDL_TRUE; + oric->dos70 = SDL_FALSE; oric->joy_iface = JOYIFACE_NONE; oric->joymode_a = JOYMODE_KB1; @@ -1378,7 +1379,7 @@ SDL_bool emu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) if (oric->ch376 != NULL) ch376_oric_config(oric->ch376); } - + break; diff --git a/machine.h b/machine.h index 8c129c0e..9780b4c1 100644 --- a/machine.h +++ b/machine.h @@ -136,7 +136,7 @@ struct machine int vsync; SDL_bool vid_double; - SDL_bool romdis, romon, rom16; + SDL_bool romdis, romon, rom16, dos70; SDL_bool vsynchack; unsigned short vid_addr; diff --git a/main.c b/main.c index ea854ad2..a00069b5 100644 --- a/main.c +++ b/main.c @@ -423,6 +423,7 @@ static void load_config( struct start_opts *sto, struct machine *oric ) if( read_config_bool( &sto->lctmp[i], "hstretch", &oric->hstretch ) ) continue; if( read_config_bool( &sto->lctmp[i], "palghosting", &oric->palghost ) ) continue; if( read_config_bool( &sto->lctmp[i], "rom16", &oric->rom16 ) ) continue; + if( read_config_bool( &sto->lctmp[i], "dos70", &oric->dos70 ) ) continue; if( read_config_string( &sto->lctmp[i], "diskimage", sto->start_disk, 1024 ) ) continue; if( read_config_string( &sto->lctmp[i], "tapeimage", sto->start_tape, 1024 ) ) continue; if( read_config_string( &sto->lctmp[i], "symbols", sto->start_syms, 1024 ) ) continue; @@ -1399,7 +1400,7 @@ void frameloop_normal( struct machine *oric, SDL_bool *framedone, SDL_bool *need if (!oric->twilighteboard_activated) tape_patches( oric ); - + via_clock( &oric->via, oric->cpu.icycles ); ay_ticktock( &oric->ay, oric->cpu.icycles ); diff --git a/oricutron.cfg b/oricutron.cfg index dca3ec2c..4fe3a574 100644 --- a/oricutron.cfg +++ b/oricutron.cfg @@ -101,6 +101,10 @@ debug = no ; rom16 = no - 56k mode ;rom16 = yes +; Support BD500/DOS70 +; dos70 = no (default) +;dos70 = no + ; ---------------------------------- ; Render mode (soft, opengl) From 2d5d32c9b12ec59f10f480d84ab209c2db0c9326 Mon Sep 17 00:00:00 2001 From: iss Date: Sun, 14 Feb 2021 13:15:56 +0200 Subject: [PATCH 053/143] adding android platform --- 6551.h | 2 ++ ChangeLog.txt | 1 + gui_android.c | 57 +++++++++++++++++++++++++++++++++++++++++++ keyboard.c | 10 ++++++++ keyboard.h | 4 +++ machine.c | 10 ++++++++ main.c | 7 ++++++ plugins/ch376/ch376.c | 5 ++++ render_sw.c | 4 +++ system.h | 8 ++++++ system_sdl.c | 9 +++++++ system_sdl.h | 9 +++++++ 12 files changed, 126 insertions(+) create mode 100644 gui_android.c diff --git a/6551.h b/6551.h index 67aacdf7..0051a79d 100644 --- a/6551.h +++ b/6551.h @@ -82,8 +82,10 @@ enum #endif #ifdef __LINUX__ +#ifndef __ANDROID__ #define BACKEND_COM #endif +#endif #ifdef WIN32 #define BACKEND_COM #endif diff --git a/ChangeLog.txt b/ChangeLog.txt index 8eb2148d..423df76d 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -3,6 +3,7 @@ Oricutron ChangeLog pre-release changes (work in progress) -------------------------------------- +* Added Android target platform * Updated BD500 for DOS70 * Added option to disable menu color scheme * Updated BD500 support diff --git a/gui_android.c b/gui_android.c new file mode 100644 index 00000000..5c5c67d2 --- /dev/null +++ b/gui_android.c @@ -0,0 +1,57 @@ +/* + ** Oricutron + ** Copyright (C) 2009-2014 Peter Gordon + ** + ** This program is free software; you can redistribute it and/or + ** modify it under the terms of the GNU General Public License + ** as published by the Free Software Foundation, version 2 + ** of the License. + ** + ** This program is distributed in the hope that it will be useful, + ** but WITHOUT ANY WARRANTY; without even the implied warranty of + ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ** GNU General Public License for more details. + ** + ** You should have received a copy of the GNU General Public License + ** along with this program; if not, write to the Free Software + ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + ** + */ + +/* + * android helper by iss + */ + + +#include "system.h" +#include "6502.h" +#include "via.h" +#include "8912.h" +#include "gui.h" +#include "disk.h" +#include "monitor.h" +#include "6551.h" +#include "machine.h" + +static SDL_bool initialized = SDL_FALSE; + +SDL_bool init_gui_native( struct machine *oric ) +{ + if(!initialized) + initialized = SDL_TRUE; + + /* FIXME: ... */ + return initialized; +} + +void shut_gui_native( struct machine *oric ) +{ + /* FIXME: ... */ + initialized = SDL_FALSE; +} + +void gui_open_url( const char *url ) +{ + /* FIXME: ... */ + return; +} diff --git a/keyboard.c b/keyboard.c index 5a2bb053..75b8cdba 100644 --- a/keyboard.c +++ b/keyboard.c @@ -587,3 +587,13 @@ SDL_bool load_keyboard_mapping( struct machine *oric, char *filename ) return ok; } + + +#ifdef __ANDROID__ +extern struct osdmenuitem keopitems[]; +void togglekeyboard( struct machine *oric, struct osdmenuitem *mitem, int dummy ); +void android_togglekeyboard(struct machine* oric) +{ + togglekeyboard( oric, &keopitems[0], 0 ); +} +#endif diff --git a/keyboard.h b/keyboard.h index e80d8d6b..b5aac594 100644 --- a/keyboard.h +++ b/keyboard.h @@ -53,4 +53,8 @@ SDL_bool save_keyboard_mapping( struct machine *oric, char *filename ); SDL_bool load_keyboard_mapping( struct machine *oric, char *filename ); +#ifdef __ANDROID__ +void android_togglekeyboard(struct machine* oric); +#endif + #endif diff --git a/machine.c b/machine.c index 16c0cfab..e7bd763e 100644 --- a/machine.c +++ b/machine.c @@ -1462,6 +1462,7 @@ SDL_bool emu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) break; case SDLK_F10: +#ifndef __ANDROID__ if( vidcap ) { ay_lockaudio( &oric->ay ); @@ -1483,6 +1484,9 @@ SDL_bool emu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) do_popup( oric, vidcapname ); } refreshavi = SDL_TRUE; +#else + android_togglekeyboard( oric ); +#endif break; #ifdef __CBCOPY__ case SDLK_F11: @@ -2113,6 +2117,9 @@ void setdrivetype( struct machine *oric, struct osdmenuitem *mitem, int type ) if( !init_machine( oric, oric->type, SDL_FALSE ) ) { shut( oric ); +#ifdef __ANDROID__ + error_printf("'init_machine' failed"); +#endif exit( EXIT_FAILURE ); } @@ -2142,6 +2149,9 @@ void swapmach( struct machine *oric, struct osdmenuitem *mitem, int which ) if( !init_machine( oric, which, which!=oric->type ) ) { shut( oric ); +#ifdef __ANDROID__ + error_printf("'init_machine' failed"); +#endif exit( EXIT_FAILURE ); } } diff --git a/main.c b/main.c index a00069b5..84a7ab13 100644 --- a/main.c +++ b/main.c @@ -605,10 +605,16 @@ static void usage( int ret ) " \"com:115200,8,N,1,/dev/ttyUSB0\"\n" #endif "\n"); + +#ifdef __ANDROID__ + error_printf("Bad command line."); +#endif + exit(ret); } // Print a formatted string into a textzone +#ifndef __ANDROID__ void error_printf( char *fmt, ... ) { static char str[256]; // Stupid MinGW32 not having vasprintf... @@ -626,6 +632,7 @@ void error_printf( char *fmt, ... ) } va_end( ap ); } +#endif static SDL_bool on_or_off( char *arg, char *option, SDL_bool *storage ) { diff --git a/plugins/ch376/ch376.c b/plugins/ch376/ch376.c index d735c562..c3bca998 100644 --- a/plugins/ch376/ch376.c +++ b/plugins/ch376/ch376.c @@ -51,7 +51,12 @@ extern struct Library *SysBase; #include #include #include +#ifdef __ANDROID__ +#include +#define statvfs statfs +#else #include +#endif #include #else diff --git a/render_sw.c b/render_sw.c index c1c2f855..765ec9be 100644 --- a/render_sw.c +++ b/render_sw.c @@ -452,6 +452,7 @@ void render_video_sw_32bpp( struct machine *oric, SDL_bool doublesize ) void render_sw_detectvideo( struct machine *oric ) { +#ifndef __ANDROID__ int BitsPerPixel = SDL_COMPAT_GetBitsPerPixel(); // Guess the suitable video mode, either 16bpp or 32bpp @@ -470,6 +471,9 @@ void render_sw_detectvideo( struct machine *oric ) default: break; } +#else + oric->sw_depth = 32; +#endif } void preinit_render_sw( struct machine *oric ) diff --git a/system.h b/system.h index 5d9c661c..f254d6e9 100644 --- a/system.h +++ b/system.h @@ -51,6 +51,14 @@ #define ROMPREFIX "roms\\" #define IMAGEPREFIX "images\\" +#elif defined(__ANDROID__) + +#define PATHSEP '/' +#define PATHSEPSTR "/" +#define FILEPREFIX "/data/data/com.emul.oricutron/files/" +#define ROMPREFIX FILEPREFIX"roms/" +#define IMAGEPREFIX FILEPREFIX"images/" + #else #define PATHSEP '/' diff --git a/system_sdl.c b/system_sdl.c index efe66f8c..f206b995 100644 --- a/system_sdl.c +++ b/system_sdl.c @@ -383,8 +383,13 @@ SDL_Surface* SDL_COMPAT_SetVideoMode(int width, int height, int bitsperpixel, Ui g_lasty = SDL_WINDOWPOS_CENTERED; } +#ifndef __ANDROID__ g_window = SDL_CreateWindow("oricutron", g_lastx, g_lasty, g_width, g_height, flags); +#else + g_window = SDL_CreateWindow("oricutron", SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED, + 0, 0, SDL_WINDOW_FULLSCREEN_DESKTOP); +#endif if (g_icon) { SDL_SetWindowIcon(g_window, g_icon); @@ -400,6 +405,10 @@ SDL_Surface* SDL_COMPAT_SetVideoMode(int width, int height, int bitsperpixel, Ui g_screen = SDL_CreateRGBSurface(0, g_width, g_height, g_bpp, RMASK, GMASK, BMASK, AMASK); g_renderer = SDL_CreateRenderer(g_window, -1, 0); +#ifdef __ANDROID__ + SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "best");//"linear"); + SDL_RenderSetLogicalSize(g_renderer, g_width, g_height); +#endif g_texture = SDL_CreateTexture(g_renderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STREAMING, diff --git a/system_sdl.h b/system_sdl.h index ff507d7c..85d7ce8f 100644 --- a/system_sdl.h +++ b/system_sdl.h @@ -152,6 +152,15 @@ void SDL_COMPAT_TakeScreenshot(char *fname); void SDL_COMPAT_GL_SwapBuffers(void); #endif + +#ifdef __ANDROID__ +#include +#define LOG_TAG "Oricutron" +#define debug_printf(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__) +#define error_printf(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) +#else +#define debug_printf(...) fprintf(stdout,__VA_ARGS__) void error_printf( char *fmt, ... ); +#endif #endif /* ORICUTRON_SYSTEM_SDL_H */ From 463334b5596683942510c9f35d2091897355bc85 Mon Sep 17 00:00:00 2001 From: iss Date: Sun, 14 Feb 2021 20:54:02 +0200 Subject: [PATCH 054/143] bd500 update --- disk.c | 44 ++++++++------------------------------------ 1 file changed, 8 insertions(+), 36 deletions(-) diff --git a/disk.c b/disk.c index 4c84fb28..9bd0876b 100644 --- a/disk.c +++ b/disk.c @@ -1526,10 +1526,8 @@ void microdisc_write( struct microdisc *md, unsigned short addr, unsigned char d // and therefore enables the overlay RAM when MAPON // has been accessed. // -// 0x31a DRVSEL R bit 7,6 - current drive -// bit 5 - current side -// W bit 7,6 - select drive -// bit 1 - select side +// 0x31a DRVSEL R/W bit 7,6 - get/set current drive +// bit 5 - get/set current side // // 0x0380 R/W disables the BD interface ROM which covers addresses // 0xE000 to 0xFFFF but before that is done, it takes @@ -1612,10 +1610,13 @@ unsigned char bd500_read( struct bd500 *bd, unsigned short addr ) case 0x310: // MOTOFF = 0 bd->motor = SDL_FALSE; + bd->wd->currentop = COP_NUFFINK; break; + case 0x311: // MOTON = 1 bd->motor = SDL_TRUE; + bd->wd->currentop = COP_READ_SECTOR; break; case 0x315: @@ -1686,37 +1687,8 @@ void bd500_write( struct bd500 *bd, unsigned short addr, unsigned char data ) break; case 0x31a: - - // NOTE: by Ray McLaughlin: - // For V2.2 of the Byte Drive operating system, this should be - // "switch( data & 0xc0 )". Only bits 6 & 7 are used in address 0x31a for the disk - // drive number. Bit 5 of 0x31a is the carry which has been rolled in by "ROR A:ROR - // A:ROR A" (2 occasions) and is determined by the comparison of old drive number - // to new drive number. I have patched this in my Byte Drive V2.2 operating system - // by replacing "ROR A:ROR A:ROR A" by "LSR A:ROR A:ROR A" but it would be better - // to update Oricutron as I suggest in my first line here. I don't think that the - // actual hardware supports double-sided disk drives but it would be nice of - // Oricutron used bit 0 of 0x31a to select the disk side on the floppy disk - // controller. - - bd->wd->c_side = data&1; - - switch( data & 0xc0 ) - { - default: - case 0x00: - bd->wd->c_drive = 0; - break; - case 0x40: - bd->wd->c_drive = 1; - break; - case 0x80: - bd->wd->c_drive = 2; - break; - case 0xc0: - bd->wd->c_drive = 3; - break; - } + bd->wd->c_side = (data>>5)&1; + bd->wd->c_drive = (data>>6)&3; break; } } @@ -1874,6 +1846,6 @@ unsigned char pravetz_read( struct pravetz *p, unsigned short addr ) void pravetz_write( struct pravetz *p, unsigned short addr, unsigned char data ) { disk_pravetz_write( p->oric, addr, data ); - p->oric->wddisk.currentop = p->drv[p->oric->wddisk.c_drive].motor_on ? COP_READ_SECTOR : COP_NUFFINK; + p->oric->wddisk.currentop = p->drv[p->oric->wddisk.c_drive].motor_on ? COP_WRITE_SECTOR : COP_NUFFINK; } From 1b3e0f6cf4190043258d50d400b461b089ef1263 Mon Sep 17 00:00:00 2001 From: jede Date: Sun, 14 Feb 2021 23:43:49 +0100 Subject: [PATCH 055/143] Add ds1501 emulation (RTC) --- Makefile | 22 +- machine.c | 4 +- oricutron.cfg | 4 +- plugins/ch376/oric_ch376_plugin.c | 1 + plugins/ds1501/ds1501.c | 214 ++++++++++++++++++ plugins/ds1501/ds1501.h | 39 ++++ .../oric_twilighte_board_plugin.c | 130 ++++++++++- .../oric_twilighte_board_plugin.h | 1 - plugins/twilighte_board/twilighte.cfg | 6 + roms/kernel.rom | Bin 16384 -> 16384 bytes roms/shell.rom | Bin 16384 -> 16384 bytes 11 files changed, 401 insertions(+), 20 deletions(-) create mode 100644 plugins/ds1501/ds1501.c create mode 100644 plugins/ds1501/ds1501.h diff --git a/Makefile b/Makefile index 62a21424..8ce18a9d 100644 --- a/Makefile +++ b/Makefile @@ -42,7 +42,7 @@ VERSION_COPYRIGHTS = "$(APP_NAME) $(VERSION_FULL) $(COPYRIGHTS)" ####### DEFAULT SETTINGS HERE ####### SRC_DIR = . -VPATH = $(SRC_DIR) $(SRC_DIR)/plugins/ch376 $(SRC_DIR)/plugins/twilighte_board +VPATH = $(SRC_DIR) $(SRC_DIR)/plugins/ch376 $(SRC_DIR)/plugins/twilighte_board $(SRC_DIR)/plugins/ds1501 ### extract git/svn revision GITREVISION = $(shell git rev-parse --short HEAD || svnversion -n $(SRC_DIR)) @@ -150,7 +150,7 @@ LFLAGS += `$(SDL_LIB)-config --libs` -s FILEREQ_OBJ = filereq_amiga.o MSGBOX_OBJ = msgbox_os2.o AMIGA_ICONS = pngicon -EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o ds1501.o endif # AROS @@ -240,7 +240,7 @@ TARGET_DEPS = /usr/$(CROSS_PREFIX)/sys-root/mingw/bin/SDL.dll FILEREQ_OBJ = filereq_win32.o MSGBOX_OBJ = msgbox_win32.o CUSTOMOBJS = gui_win.o winicon.o -EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o ds1501.o endif # Windows 64bit GCC @@ -287,7 +287,7 @@ TARGET_DEPS = /usr/$(CROSS_PREFIX)/sys-root/mingw/bin/SDL.dll FILEREQ_OBJ = filereq_win32.o MSGBOX_OBJ = msgbox_win32.o CUSTOMOBJS = gui_win.o winicon.o -EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o ds1501.o endif # BeOS / Haiku @@ -311,7 +311,7 @@ INSTALLDIR = /boot/apps/Oricutron FILEREQ_OBJ = MSGBOX_OBJ = CUSTOMOBJS = gui_beos.o msgbox_beos.o filereq_beos.o -EXTRAOBJS = plugins/ch376/oric_ch376_plugin.o plugins/twilighte_board/oric_twilighte_board_plugin.o +EXTRAOBJS = plugins/ch376/oric_ch376_plugin.o plugins/twilighte_board/oric_twilighte_board_plugin.o plugins/ds1501/ds1501.o BEOS_BERES := beres BEOS_RC := rc BEOS_XRES := xres @@ -338,7 +338,7 @@ TARGET = $(TARGET_NAME) FILEREQ_OBJ = MSGBOX_OBJ = CUSTOMOBJS = gui_osx.o filereq_osx.o msgbox_osx.o -EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o ds1501.o endif @@ -379,7 +379,7 @@ endif CFLAGS += -g $(shell PKG_CONFIG_PATH=/usr/$(BASELIBDIR)/pkgconfig pkg-config $(SDL_LIB) --cflags) -D__OPENGL_AVAILABLE__ -DAUDIO_BUFLEN=1024 -D__CBCOPY__ -D__CBPASTE__ LFLAGS += -lm -L/usr/$(BASELIBDIR) $(shell PKG_CONFIG_PATH=/usr/$(BASELIBDIR)/pkgconfig pkg-config $(SDL_LIB) --libs) -lGL -lX11 CUSTOMOBJS = gui_x11.o -EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o ds1501.o TARGET = oricutron INSTALLDIR = /usr/local endif @@ -399,7 +399,7 @@ endif CFLAGS += -g $(SDL_CFLAGS) -D__OPENGL_AVAILABLE__ -DAUDIO_BUFLEN=1024 -D__CBCOPY__ -D__CBPASTE__ LFLAGS += -lm -L/usr/$(BASELIBDIR) $(SDL_LFLAGS) -lGL -lX11 CUSTOMOBJS = gui_x11.o -EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o ds1501.o TARGET = $(TARGET_NAME) INSTALLDIR = /usr/local endif @@ -419,7 +419,7 @@ endif CFLAGS += -g $(SDL_CFLAGS) -D__OPENGL_AVAILABLE__ -DAUDIO_BUFLEN=1024 -D__CBCOPY__ -D__CBPASTE__ LFLAGS += -lm -L/usr/$(BASELIBDIR) $(SDL_LFLAGS) -lGL -lX11 CUSTOMOBJS = gui_x11.o -EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o ds1501.o TARGET = $(TARGET_NAME) INSTALLDIR = /usr/local endif @@ -440,7 +440,7 @@ STRIP := $(CROSS_COMPILE)$(STRIP) CFLAGS += -g $(shell PKG_CONFIG_PATH=/usr/$(BASELIBDIR)/pkgconfig pkg-config $(SDL_LIB) --cflags) $(shell PKG_CONFIG_PATH=/usr/$(BASELIBDIR)/pkgconfig pkg-config gtk+-3.0 --cflags) -D__CBCOPY__ -D__CBPASTE__ LFLAGS += -lm -L/usr/$(BASELIBDIR) $(shell PKG_CONFIG_PATH=/usr/$(BASELIBDIR)/pkgconfig pkg-config $(SDL_LIB) --libs) $(shell PKG_CONFIG_PATH=/usr/$(BASELIBDIR)/pkgconfig pkg-config gtk+-3.0 --libs) -lX11 CUSTOMOBJS = gui_x11.o -EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o ds1501.o FILEREQ_OBJ = filereq_gtk.o MSGBOX_OBJ = msgbox_gtk.o TARGET = oricutron @@ -504,7 +504,7 @@ AR = $(SDK_PREFIX)-ar RANLIB = $(SDK_PREFIX)-ranlib CFLAGS += `$(SDK_HOME)/env/bin/$(SDL_LIB)-config --cflags` LFLAGS += -Wl,--stack,256k -Wl,--msuper-memory -lm `$(SDK_HOME)/env/bin/$(SDL_LIB)-config --libs` -EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o ds1501.o endif ####### SHOULDN'T HAVE TO CHANGE THIS STUFF ####### diff --git a/machine.c b/machine.c index 4a7cb267..4a440e24 100644 --- a/machine.c +++ b/machine.c @@ -329,7 +329,7 @@ void atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) else if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) ch376_oric_write(oric->ch376, addr, data); - else if(oric->twilighteboard_activated && ((0x342 <= addr && addr < 0x344 ) || (0x320 <= addr && addr < 0x330 ))) + else if(oric->twilighteboard_activated && ((0x342 <= addr && addr < 0x344 ) || (0x320 <= addr && addr < 0x330 ) || (0x360 <= addr && addr < 0x37F ))) twilighteboard_oric_write(oric->twilighte,addr,0x00,data); else @@ -716,7 +716,7 @@ unsigned char atmosread( struct m6502 *cpu, unsigned short addr ) if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) return ch376_oric_read(oric->ch376, addr); - if( oric->twilighteboard_activated && ((0x342 <= addr && addr < 0x344 ) || (0x320 <= addr && addr < 0x330 ))) + if( oric->twilighteboard_activated && ((0x342 <= addr && addr < 0x344 ) || (0x320 <= addr && addr < 0x330 ) || (0x360 <= addr && addr < 0x37F ))) return twilighteboard_oric_read(oric->twilighte,addr); return via_read( &oric->via, addr ); diff --git a/oricutron.cfg b/oricutron.cfg index 66b3f0b0..207265c6 100644 --- a/oricutron.cfg +++ b/oricutron.cfg @@ -210,5 +210,5 @@ show_keyboard = yes ; ch376 chip emulation. This chip can read a usbkey. For more information : http://orix.oric.org ; only available in telestrat mode -ch376 = no -twilighte_board=no +ch376 = yes +twilighte_board=yes diff --git a/plugins/ch376/oric_ch376_plugin.c b/plugins/ch376/oric_ch376_plugin.c index 0ad31017..083633c4 100644 --- a/plugins/ch376/oric_ch376_plugin.c +++ b/plugins/ch376/oric_ch376_plugin.c @@ -15,6 +15,7 @@ #include "ch376.h" #include "stdio.h" + void dbg_printf(char *fmt, ...); #define CH376_ORIC_EXTENSION_DATA_PORT 0x340 diff --git a/plugins/ds1501/ds1501.c b/plugins/ds1501/ds1501.c new file mode 100644 index 00000000..414be371 --- /dev/null +++ b/plugins/ds1501/ds1501.c @@ -0,0 +1,214 @@ +#include +#include + +#include "ds1501.h" + +struct tm *ds1501_get_system_time(unsigned char delta_seconds) +{ + time_t now; + struct tm *now_tm; + + now = time(NULL); + now_tm = localtime(&now); + return now_tm; +} + +unsigned char ds1501_to_bcd(unsigned char binaryInput) +{ + unsigned char bcdResult = 0; + unsigned char digit = 0; + unsigned char i=1; + + while (binaryInput > 0) { + + digit = binaryInput %10; //pick digit + bcdResult = bcdResult+digit*i; + i=16*i; + binaryInput = binaryInput/ 10; + } + return bcdResult; +} + + +struct ds1501 *ds1501_create(unsigned char battery_state) +{ + struct ds1501 *ds1501 = malloc(sizeof(struct ds1501)); + ds1501->seconds_delta_from_system=0; + ds1501->minutes_delta_from_system=0; + ds1501->hours_delta_from_system=0; + ds1501->date_delta_from_system=0; + ds1501->day_delta_from_system=0; + ds1501->month_delta_from_system=0; + ds1501->year_delta_from_system=0; + ds1501->century_delta_from_system=0; + ds1501->ctrlA_register=0; + ds1501->ctrlB_register=0; + ds1501_set_battery_state(ds1501,battery_state); + return ds1501; +} + + +void ds1501_reset(struct ds1501 *ds1501) +{ + // Get system time and set ds1501 register + +} + +unsigned char ds1501_get_seconds(struct ds1501 *ds1501) +{ + struct tm *now_tm; + if (ds1501->seconds_delta_from_system==0) + { + now_tm=ds1501_get_system_time(ds1501->seconds_delta_from_system); + return ds1501_to_bcd(now_tm->tm_sec); + } + else + return ds1501->seconds_delta_from_system; + +} + +unsigned char ds1501_get_minutes(struct ds1501 *ds1501) +{ + struct tm *now_tm; + if (ds1501->minutes_delta_from_system==0) + { + now_tm=ds1501_get_system_time(ds1501->minutes_delta_from_system); + return ds1501_to_bcd(now_tm->tm_min); + } + else + return ds1501->minutes_delta_from_system; + +} + +unsigned char ds1501_get_hours(struct ds1501 *ds1501) +{ + struct tm *now_tm; + if (ds1501->hours_delta_from_system==0) + { + now_tm=ds1501_get_system_time(ds1501->hours_delta_from_system); + return ds1501_to_bcd(now_tm->tm_hour); + } + else + return ds1501->hours_delta_from_system; +} + +unsigned char ds1501_get_date(struct ds1501 *ds1501) +{ + struct tm *now_tm; + if (ds1501->date_delta_from_system==0) + { + now_tm=ds1501_get_system_time(ds1501->date_delta_from_system); + return ds1501_to_bcd(now_tm->tm_mday); + } + else + return ds1501->date_delta_from_system; +} + +unsigned char ds1501_get_day(struct ds1501 *ds1501) +{ + struct tm *now_tm; + if (ds1501->day_delta_from_system==0) + { + now_tm=ds1501_get_system_time(ds1501->day_delta_from_system); + return ds1501_to_bcd(now_tm->tm_wday+1); // Because ds1501 return month between 1 and 12, but time.h returns 0 to 11 + } + else + return ds1501->day_delta_from_system; +} + +unsigned char ds1501_get_month(struct ds1501 *ds1501) +{ + struct tm *now_tm; + if (ds1501->month_delta_from_system==0) + { + now_tm=ds1501_get_system_time(ds1501->month_delta_from_system); + return ds1501_to_bcd(now_tm->tm_mon+1); // Because ds1501 return month between 1 and 12, but time.h returns 0 to 11 + } + else + return ds1501->month_delta_from_system; +} + +unsigned char ds1501_get_year(struct ds1501 *ds1501) +{ + struct tm *now_tm; + unsigned char year; + if (ds1501->year_delta_from_system==0) + { + now_tm=ds1501_get_system_time(ds1501->year_delta_from_system); + year=now_tm->tm_year & 0xFF; + return ds1501_to_bcd(year); + } + else + return ds1501->year_delta_from_system; + +} + +unsigned char ds1501_get_century(struct ds1501 *ds1501) +{ + struct tm *now_tm; + unsigned char century; + if (ds1501->century_delta_from_system==0) + { + now_tm=ds1501_get_system_time(ds1501->century_delta_from_system); + century=now_tm->tm_year/100; + return ds1501_to_bcd(century); // Because ds1501 return month between 1 and 12, but time.h returns 0 to 11 + } + else + return ds1501->century_delta_from_system; + +} + +//write +void ds1501_write_seconds(struct ds1501 *ds1501,unsigned char seconds) +{ + ds1501->seconds_delta_from_system=seconds; +} + +void ds1501_write_minutes(struct ds1501 *ds1501,unsigned char minutes) +{ + ds1501->seconds_delta_from_system=minutes; +} + +void ds1501_write_hours(struct ds1501 *ds1501,unsigned char hours) +{ + ds1501->hours_delta_from_system=hours; +} + +void ds1501_write_date(struct ds1501 *ds1501,unsigned char date) +{ + ds1501->date_delta_from_system=date; +} + +void ds1501_write_day(struct ds1501 *ds1501,unsigned char day) +{ + ds1501->day_delta_from_system=day; +} + +void ds1501_write_month(struct ds1501 *ds1501,unsigned char month) +{ + ds1501->month_delta_from_system=month; +} + +void ds1501_write_year(struct ds1501 *ds1501,unsigned char year) +{ + ds1501->year_delta_from_system=year; +} + +void ds1501_write_century(struct ds1501 *ds1501,unsigned char century) +{ + ds1501->century_delta_from_system=century; +} + +void ds1501_set_battery_state(struct ds1501 *ds1501,unsigned char battery_state) +{ + if (battery_state==DS1501_BATTERY_FULL) + ds1501->ctrlA_register=ds1501->ctrlA_register|0x80; + else + ds1501->ctrlA_register=ds1501->ctrlA_register&0x7F; +} + + +void ds1501_destroy(struct ds1501 *ds1501) +{ + +} diff --git a/plugins/ds1501/ds1501.h b/plugins/ds1501/ds1501.h new file mode 100644 index 00000000..10bf531d --- /dev/null +++ b/plugins/ds1501/ds1501.h @@ -0,0 +1,39 @@ +struct ds1501 *ds1501_create(unsigned char battery_state); +unsigned char ds1501_get_seconds(struct ds1501 *ds1501); +unsigned char ds1501_get_minutes(struct ds1501 *ds1501); +unsigned char ds1501_get_hours(struct ds1501 *ds1501); +unsigned char ds1501_get_date(struct ds1501 *ds1501); +unsigned char ds1501_get_day(struct ds1501 *ds1501); +unsigned char ds1501_get_month(struct ds1501 *ds1501); +unsigned char ds1501_get_century(struct ds1501 *ds1501); +unsigned char ds1501_get_year(struct ds1501 *ds1501); +void ds1501_write_seconds(struct ds1501 *ds1501,unsigned char seconds); +void ds1501_write_minutes(struct ds1501 *ds1501,unsigned char minutes); +void ds1501_write_hours(struct ds1501 *ds1501,unsigned char hours); +void ds1501_write_date(struct ds1501 *ds1501,unsigned char date); +void ds1501_write_day(struct ds1501 *ds1501,unsigned char day); +void ds1501_write_month(struct ds1501 *ds1501,unsigned char month); +void ds1501_write_year(struct ds1501 *ds1501,unsigned char year); +void ds1501_write_century(struct ds1501 *ds1501,unsigned char century); +void ds1501_set_battery_state(struct ds1501 *ds1501,unsigned char battery_state); + + +#define DS1501_BATTERY_FULL 0 +#define DS1501_BATTERY_EMPTY 1 + + +struct ds1501 +{ + unsigned char ctrlA_register; + unsigned char ctrlB_register; + unsigned char seconds_delta_from_system; + unsigned char minutes_delta_from_system; + unsigned char hours_delta_from_system; + unsigned char day_delta_from_system; + unsigned char date_delta_from_system; + unsigned char month_delta_from_system; + unsigned char year_delta_from_system; + unsigned char century_delta_from_system; + +}; + diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index dd6b8e18..4b306f2d 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -16,6 +16,20 @@ #include #include +#include "../ds1501/ds1501.h" + +#define DS1501_SECONDS_REGISTER 0x360 +#define DS1501_MINUTES_REGISTER 0x361 +#define DS1501_HOUR_REGISTER 0x362 +#define DS1501_DAY_REGISTER 0x363 +#define DS1501_DATE_REGISTER 0x364 +#define DS1501_MONTH_REGISTER 0x365 +#define DS1501_YEAR_REGISTER 0x366 +#define DS1501_CENTURY_REGISTER 0x367 + +#define DS1501_CTRLA_REGISTER 0x36E +#define DS1501_CTRLB_REGISTER 0x36F + struct twilbankinfo { @@ -35,7 +49,10 @@ struct twilighte unsigned char twilrombankdata[32][16834]; unsigned char twilrambankdata[32][16834]; - + unsigned char firmware_version; + + struct ds1501 *rtc_ds1501; + unsigned char battery_state; unsigned char VDDRA; unsigned char DDRA; @@ -49,6 +66,9 @@ struct twilighte #include "../../system.h" extern SDL_bool read_config_string( char *buf, char *token, char *dest, Sint32 maxlen ); +extern SDL_bool read_config_int( char *buf, char *token, int *dest, int min, int max ); + + static SDL_bool load_rom_twilighte( char *fname, int size, unsigned char where[] ) { @@ -132,6 +152,13 @@ struct twilighte * twilighte_oric_init(void) while( !feof( f ) ) { result=fgets( line, 1024, f ); + + + if( read_config_int( line, "twilighte_firmware", &twilighte->firmware_version, 1, 3 ) ) + twilighte->t_register=twilighte->t_register|twilighte->firmware_version; + + if( read_config_bool( line, "twilighte_battery_is_full", &twilighte->battery_state ) ) continue; + for( j=1; j<32; j++ ) { if (j > 9) @@ -159,7 +186,7 @@ struct twilighte * twilighte_oric_init(void) break; } } - } + } } fclose( f ); @@ -191,6 +218,11 @@ struct twilighte * twilighte_oric_init(void) twilighte->VDDRA=7; twilighte->current_bank=7; twilighte->DDRB=0; + + if (twilighte->firmware_version==3) + twilighte->rtc_ds1501=ds1501_create(twilighte->battery_state); + + return twilighte; } @@ -276,15 +308,58 @@ unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t ad { unsigned char data; data=twilighte->VDDRB; - //twilighte->DDRB=twilighte->DDRB|1|2|4|8|16; return data; - } if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) { return twilighte->t_banking_register; } + + // Firmware 3 + if (twilighte->firmware_version>2) + { + if (addr==DS1501_SECONDS_REGISTER) + { + return ds1501_get_seconds(twilighte->rtc_ds1501); + } + + if (addr==DS1501_MINUTES_REGISTER) + { + return ds1501_get_minutes(twilighte->rtc_ds1501); + } + + if (addr==DS1501_HOUR_REGISTER) + { + return ds1501_get_hours(twilighte->rtc_ds1501); + } + + if (addr==DS1501_DAY_REGISTER) + { + return ds1501_get_day(twilighte->rtc_ds1501); + } + + if (addr==DS1501_DATE_REGISTER) + { + return ds1501_get_date(twilighte->rtc_ds1501); + } + + if (addr==DS1501_MONTH_REGISTER) + { + return ds1501_get_month(twilighte->rtc_ds1501); + } + + if (addr==DS1501_YEAR_REGISTER) + { + return ds1501_get_year(twilighte->rtc_ds1501); + } + + if (addr==DS1501_CENTURY_REGISTER) + { + return ds1501_get_century(twilighte->rtc_ds1501); + } + + } return 0; } @@ -368,5 +443,52 @@ unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t a twilighte->t_banking_register=data; } + + // Firmware 3 + if (twilighte->firmware_version>2) + { + if (addr==DS1501_SECONDS_REGISTER) + { + ds1501_write_seconds(twilighte->rtc_ds1501,data); + } + + if (addr==DS1501_MINUTES_REGISTER) + { + ds1501_write_minutes(twilighte->rtc_ds1501,data); + } + + if (addr==DS1501_HOUR_REGISTER) + { + ds1501_write_hours(twilighte->rtc_ds1501,data); + } + + if (addr==DS1501_DAY_REGISTER) + { + ds1501_write_day(twilighte->rtc_ds1501,data); + } + + if (addr==DS1501_DATE_REGISTER) + { + ds1501_write_date(twilighte->rtc_ds1501,data); + } + + if (addr==DS1501_MONTH_REGISTER) + { + ds1501_write_month(twilighte->rtc_ds1501,data); + } + + if (addr==DS1501_YEAR_REGISTER) + { + ds1501_write_year(twilighte->rtc_ds1501,data); + } + + if (addr==DS1501_CENTURY_REGISTER) + { + ds1501_write_century(twilighte->rtc_ds1501,data); + } + + } + + return 0; } diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.h b/plugins/twilighte_board/oric_twilighte_board_plugin.h index d70fc82a..69b12984 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.h +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.h @@ -1,4 +1,3 @@ - struct twilighte * twilighte_oric_init(void); unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uint16_t addr) ; diff --git a/plugins/twilighte_board/twilighte.cfg b/plugins/twilighte_board/twilighte.cfg index 94f1475b..b0d3c173 100644 --- a/plugins/twilighte_board/twilighte.cfg +++ b/plugins/twilighte_board/twilighte.cfg @@ -30,6 +30,12 @@ twilbankrom03='roms/basicus0' twilbankrom02='roms/empty_orix' twilbankrom01='roms/empty_orix' + +twilighte_firmware=1 +twilighte_battery_is_full=yes + + + ;twilbankram30='' ;twilbankram29='' ;twilbankram28='' diff --git a/roms/kernel.rom b/roms/kernel.rom index f19cd83fc92413b827029278f4b304bdc108670b..33fe302b6dadfc61033c62ab6ac19a1c7de1e52b 100755 GIT binary patch delta 6977 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 diff --git a/roms/shell.rom b/roms/shell.rom index 431b7c7b04c43f41ab2e2ec6d9c5f8e987069bdd..d690db6533eff76eadd1427a450d5cf1e35460c0 100755 GIT binary patch literal 16384 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 Date: Sun, 14 Feb 2021 23:44:56 +0100 Subject: [PATCH 056/143] Fix path --- plugins/twilighte_board/oric_twilighte_board_plugin.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index 4b306f2d..3279139f 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -136,10 +136,10 @@ struct twilighte * twilighte_oric_init(void) twilighte->t_banking_register=0; twilighte->t_register=128+1; // Firmware - f = fopen( "plugins/twilighte_card/twilighte.cfg", "r" ); + f = fopen( "plugins/twilighte_board/twilighte.cfg", "r" ); if( !f ) { - error_printf( "plugins/twilighte_card/twilighte.cfg not found\n" ); + error_printf( "plugins/twilighte_board/twilighte.cfg not found\n" ); return NULL; } From 257f8ba7d757f543b5d2ba085a76536743752b5d Mon Sep 17 00:00:00 2001 From: jede Date: Sun, 14 Feb 2021 23:45:49 +0100 Subject: [PATCH 057/143] Fix init value --- plugins/twilighte_board/oric_twilighte_board_plugin.c | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index 3279139f..afe1101a 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -134,6 +134,7 @@ struct twilighte * twilighte_oric_init(void) char line[1024]; struct twilighte *twilighte = malloc(sizeof(struct twilighte)); twilighte->t_banking_register=0; + twilighte->battery_state=0; twilighte->t_register=128+1; // Firmware f = fopen( "plugins/twilighte_board/twilighte.cfg", "r" ); From 98da8d521cba9332002bbc4a66f62d2ad15f52a0 Mon Sep 17 00:00:00 2001 From: jede Date: Mon, 15 Feb 2021 16:21:59 +0100 Subject: [PATCH 058/143] Now it emulates internal RAM from ds1501 --- plugins/ds1501/ds1501.c | 20 +++++++++++++++++- plugins/ds1501/ds1501.h | 6 +++++- .../oric_twilighte_board_plugin.c | 21 ++++++++++++++++++- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/plugins/ds1501/ds1501.c b/plugins/ds1501/ds1501.c index 414be371..8f39fc8a 100644 --- a/plugins/ds1501/ds1501.c +++ b/plugins/ds1501/ds1501.c @@ -32,6 +32,7 @@ unsigned char ds1501_to_bcd(unsigned char binaryInput) struct ds1501 *ds1501_create(unsigned char battery_state) { + int i; struct ds1501 *ds1501 = malloc(sizeof(struct ds1501)); ds1501->seconds_delta_from_system=0; ds1501->minutes_delta_from_system=0; @@ -44,9 +45,27 @@ struct ds1501 *ds1501_create(unsigned char battery_state) ds1501->ctrlA_register=0; ds1501->ctrlB_register=0; ds1501_set_battery_state(ds1501,battery_state); + // initialize RAM + for (i=0;i<256;i++) + ds1501->internal_ram[i]=0; return ds1501; } +void ds1501_set_internal_ram_adress_register(struct ds1501 *ds1501,unsigned char address) +{ + ds1501->internal_ram_adress_register=address; +} + +unsigned char ds1501_get_internal_ram(struct ds1501 *ds1501) +{ + return ds1501->internal_ram[ds1501->internal_ram_adress_register]; +} + +void ds1501_set_internal_ram(struct ds1501 *ds1501,unsigned char value) +{ + ds1501->internal_ram[ds1501->internal_ram_adress_register]=value; +} + void ds1501_reset(struct ds1501 *ds1501) { @@ -140,7 +159,6 @@ unsigned char ds1501_get_year(struct ds1501 *ds1501) } else return ds1501->year_delta_from_system; - } unsigned char ds1501_get_century(struct ds1501 *ds1501) diff --git a/plugins/ds1501/ds1501.h b/plugins/ds1501/ds1501.h index 10bf531d..6579e09e 100644 --- a/plugins/ds1501/ds1501.h +++ b/plugins/ds1501/ds1501.h @@ -16,7 +16,9 @@ void ds1501_write_month(struct ds1501 *ds1501,unsigned char month); void ds1501_write_year(struct ds1501 *ds1501,unsigned char year); void ds1501_write_century(struct ds1501 *ds1501,unsigned char century); void ds1501_set_battery_state(struct ds1501 *ds1501,unsigned char battery_state); - +void ds1501_set_internal_ram_adress_register(struct ds1501 *ds1501,unsigned char address); +unsigned char ds1501_get_internal_ram(struct ds1501 *ds1501); +void ds1501_set_internal_ram(struct ds1501 *ds1501,unsigned char value); #define DS1501_BATTERY_FULL 0 #define DS1501_BATTERY_EMPTY 1 @@ -34,6 +36,8 @@ struct ds1501 unsigned char month_delta_from_system; unsigned char year_delta_from_system; unsigned char century_delta_from_system; + unsigned char internal_ram_adress_register; + unsigned char internal_ram[256]; }; diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index afe1101a..bf2ef4bd 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -27,6 +27,9 @@ #define DS1501_YEAR_REGISTER 0x366 #define DS1501_CENTURY_REGISTER 0x367 +#define DS1501_ADDRESS_INTERNAL_RAM_REGISTER 0x370 +#define DS1501_DATA_INTERNAL_RAM_REGISTER 0x373 + #define DS1501_CTRLA_REGISTER 0x36E #define DS1501_CTRLB_REGISTER 0x36F @@ -136,6 +139,7 @@ struct twilighte * twilighte_oric_init(void) twilighte->t_banking_register=0; twilighte->battery_state=0; twilighte->t_register=128+1; // Firmware + result=malloc(sizeof(unsigned char)*256); f = fopen( "plugins/twilighte_board/twilighte.cfg", "r" ); if( !f ) @@ -342,7 +346,7 @@ unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t ad if (addr==DS1501_DATE_REGISTER) { - return ds1501_get_date(twilighte->rtc_ds1501); + return ds1501_get_date(twilighte->rtc_ds1501); } if (addr==DS1501_MONTH_REGISTER) @@ -360,6 +364,12 @@ unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t ad return ds1501_get_century(twilighte->rtc_ds1501); } + if (addr==DS1501_DATA_INTERNAL_RAM_REGISTER) + { + return ds1501_get_internal_ram(twilighte->rtc_ds1501); + } + + } return 0; @@ -488,6 +498,15 @@ unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t a ds1501_write_century(twilighte->rtc_ds1501,data); } + if (addr==DS1501_ADDRESS_INTERNAL_RAM_REGISTER) + { + ds1501_set_internal_ram_adress_register(twilighte->rtc_ds1501,data); + } + + if (addr==DS1501_DATA_INTERNAL_RAM_REGISTER) + { + ds1501_set_internal_ram(twilighte->rtc_ds1501,data); + } } From 31ad1c48276246803f59004ba6dc08dd76cec865 Mon Sep 17 00:00:00 2001 From: Peter Gordon Date: Mon, 15 Feb 2021 21:57:13 +0000 Subject: [PATCH 059/143] Update Pete's email address --- Makefile | 4 ++-- ReadMe-LiesMich_DE.txt | 2 +- ReadMe.txt | 2 +- XCode/Oricutron/Oricutron.xcodeproj/project.pbxproj | 4 ++-- msvc/VS2017/Oricutron.vcxproj | 4 ++-- msvc/VS2019/Oricutron.vcxproj | 8 ++++---- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index 62a21424..73cf7326 100644 --- a/Makefile +++ b/Makefile @@ -35,9 +35,9 @@ VERSION_FULL = $(VERSION_MAJ).$(VERSION_MIN).$(VERSION_REV) APP_INFO = APP_NAME = $(strip Oricutron $(APP_INFO)) APP_YEAR = 2019 -COPYRIGHTS = (c)$(APP_YEAR) Peter Gordon (pete@petergordon.org.uk) +COPYRIGHTS = (c)$(APP_YEAR) Peter Gordon (pete@gordon.plus) VERSION_COPYRIGHTS = "$(APP_NAME) $(VERSION_FULL) $(COPYRIGHTS)" -#COPYRIGHTS = "$(APP_NAME) $(VERSION_FULL) ©$(APP_YEAR) Peter Gordon (pete@petergordon.org.uk)" +#COPYRIGHTS = "$(APP_NAME) $(VERSION_FULL) ©$(APP_YEAR) Peter Gordon (pete@gordon.plus)" ####### DEFAULT SETTINGS HERE ####### diff --git a/ReadMe-LiesMich_DE.txt b/ReadMe-LiesMich_DE.txt index d72ec5c3..9c9fa271 100644 --- a/ReadMe-LiesMich_DE.txt +++ b/ReadMe-LiesMich_DE.txt @@ -1,7 +1,7 @@ Oricutron 1.2 ------------- -(c)2009-2014 Peter Gordon (pete@petergordon.org.uk) +(c)2009-2014 Peter Gordon (pete@gordon.plus) This is a work in progress. diff --git a/ReadMe.txt b/ReadMe.txt index bf057b2f..ac97c221 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -1,7 +1,7 @@ Oricutron 1.2 ------------- -(c)2009-2014 Peter Gordon (pete@petergordon.org.uk) +(c)2009-2014 Peter Gordon (pete@gordon.plus) This is a work in progress. diff --git a/XCode/Oricutron/Oricutron.xcodeproj/project.pbxproj b/XCode/Oricutron/Oricutron.xcodeproj/project.pbxproj index f1dc4e37..ff6edafa 100644 --- a/XCode/Oricutron/Oricutron.xcodeproj/project.pbxproj +++ b/XCode/Oricutron/Oricutron.xcodeproj/project.pbxproj @@ -521,7 +521,7 @@ "-D__SPECIFY_SDL_DIR__", "-DAPP_NAME_FULL='\"Oricutron 1.2\"'", "-DAPP_YEAR='\"2014\"'", - "-DVERSION_COPYRIGHTS='\"Oricutron 1.2.0 (c)2014 Peter Gordon (pete@petergordon.org.uk)\"'", + "-DVERSION_COPYRIGHTS='\"Oricutron 1.2.0 (c)2014 Peter Gordon (pete@gordon.plus)\"'", "-DBACKEND_COM", "-DBACKEND_MODEM", "-D__OPENGL_AVAILABLE__", @@ -554,7 +554,7 @@ "-DSDL_MAJOR_VERSION=1", "-DAPP_NAME_FULL='\"Oricutron 1.2\"'", "-DAPP_YEAR='\"2014\"'", - "-DVERSION_COPYRIGHTS='\"Oricutron 1.2.0 (c)2014 Peter Gordon (pete@petergordon.org.uk)\"'", + "-DVERSION_COPYRIGHTS='\"Oricutron 1.2.0 (c)2014 Peter Gordon (pete@gordon.plus)\"'", "-D__OPENGL_AVAILABLE__", "-DBACKEND_COM", "-DBACKEND_MODEM", diff --git a/msvc/VS2017/Oricutron.vcxproj b/msvc/VS2017/Oricutron.vcxproj index 1f8535f9..2ab0cb64 100644 --- a/msvc/VS2017/Oricutron.vcxproj +++ b/msvc/VS2017/Oricutron.vcxproj @@ -79,7 +79,7 @@ if "$(Configuration.Contains('Release'))"=="True" ( if "$(Platform)"=="x64" ( co Disabled true ..\vcpkg\installed\x64-windows\include\SDL2\ - SDL_MAIN_HANDLED=1;__OPENGL_AVAILABLE__;_MBCS;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;__CBCOPY__;__CBPASTE__;APP_NAME_FULL="Oricutron 1.2";APP_YEAR="2015";VERSION_COPYRIGHTS="Oricutron 1.2.0 (c)2015 Peter Gordon (pete@petergordon.org.uk)";%(PreprocessorDefinitions) + SDL_MAIN_HANDLED=1;__OPENGL_AVAILABLE__;_MBCS;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;__CBCOPY__;__CBPASTE__;APP_NAME_FULL="Oricutron 1.2";APP_YEAR="2015";VERSION_COPYRIGHTS="Oricutron 1.2.0 (c)2015 Peter Gordon (pete@gordon.plus)";%(PreprocessorDefinitions) /we4013 /we4115 %(AdditionalOptions) @@ -101,7 +101,7 @@ if "$(Configuration.Contains('Release'))"=="True" ( if "$(Platform)"=="x64" ( co true true ..\vcpkg\installed\x64-windows\include\SDL2\ - SDL_MAIN_HANDLED=1;__OPENGL_AVAILABLE__;_MBCS;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;__CBCOPY__;__CBPASTE__;APP_NAME_FULL="Oricutron 1.2";APP_YEAR="2015";VERSION_COPYRIGHTS="Oricutron 1.2.0 (c)2015 Peter Gordon (pete@petergordon.org.uk)";%(PreprocessorDefinitions) + SDL_MAIN_HANDLED=1;__OPENGL_AVAILABLE__;_MBCS;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;__CBCOPY__;__CBPASTE__;APP_NAME_FULL="Oricutron 1.2";APP_YEAR="2015";VERSION_COPYRIGHTS="Oricutron 1.2.0 (c)2015 Peter Gordon (pete@gordon.plus)";%(PreprocessorDefinitions) AnySuitable Speed true diff --git a/msvc/VS2019/Oricutron.vcxproj b/msvc/VS2019/Oricutron.vcxproj index b2e004ac..fdfef857 100644 --- a/msvc/VS2019/Oricutron.vcxproj +++ b/msvc/VS2019/Oricutron.vcxproj @@ -101,7 +101,7 @@ if "$(Configuration.Contains('Release'))"=="True" ( copy "..\vcpkg\installed\x64 Disabled true .;..\vcpkg\installed\x64-windows\include\SDL2\ - SDL_MAIN_HANDLED=1;__OPENGL_AVAILABLE__;_MBCS;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;__CBCOPY__;__CBPASTE__;APP_NAME_FULL="Oricutron 1.2";APP_YEAR="2015";VERSION_COPYRIGHTS="Oricutron 1.2.0 (c)2015 Peter Gordon (pete@petergordon.org.uk)";%(PreprocessorDefinitions) + SDL_MAIN_HANDLED=1;__OPENGL_AVAILABLE__;_MBCS;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;__CBCOPY__;__CBPASTE__;APP_NAME_FULL="Oricutron 1.2";APP_YEAR="2015";VERSION_COPYRIGHTS="Oricutron 1.2.0 (c)2015 Peter Gordon (pete@gordon.plus)";%(PreprocessorDefinitions) /we4013 /we4115 /wd4100 /wd4244 /wd4152 /wd4706 /wd4018 /wd4267 /wd4389 /wd4245 %(AdditionalOptions) @@ -121,7 +121,7 @@ if "$(Configuration.Contains('Release'))"=="True" ( copy "..\vcpkg\installed\x64 Disabled true .;..\vcpkg\installed\x64-windows\include\ - SDL_LIB=1;SDL_MAIN_HANDLED=1;__OPENGL_AVAILABLE__;_MBCS;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;__CBCOPY__;__CBPASTE__;APP_NAME_FULL="Oricutron 1.2";APP_YEAR="2015";VERSION_COPYRIGHTS="Oricutron 1.2.0 (c)2015 Peter Gordon (pete@petergordon.org.uk)";%(PreprocessorDefinitions) + SDL_LIB=1;SDL_MAIN_HANDLED=1;__OPENGL_AVAILABLE__;_MBCS;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;__CBCOPY__;__CBPASTE__;APP_NAME_FULL="Oricutron 1.2";APP_YEAR="2015";VERSION_COPYRIGHTS="Oricutron 1.2.0 (c)2015 Peter Gordon (pete@gordon.plus)";%(PreprocessorDefinitions) /we4013 /we4115 /wd4100 /wd4244 /wd4152 /wd4706 /wd4018 /wd4267 /wd4389 /wd4245 %(AdditionalOptions) @@ -143,7 +143,7 @@ if "$(Configuration.Contains('Release'))"=="True" ( copy "..\vcpkg\installed\x64 true true .;..\vcpkg\installed\x64-windows\include\SDL2\ - SDL_MAIN_HANDLED=1;__OPENGL_AVAILABLE__;_MBCS;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;__CBCOPY__;__CBPASTE__;APP_NAME_FULL="Oricutron 1.2";APP_YEAR="2015";VERSION_COPYRIGHTS="Oricutron 1.2.0 (c)2015 Peter Gordon (pete@petergordon.org.uk)";%(PreprocessorDefinitions) + SDL_MAIN_HANDLED=1;__OPENGL_AVAILABLE__;_MBCS;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;__CBCOPY__;__CBPASTE__;APP_NAME_FULL="Oricutron 1.2";APP_YEAR="2015";VERSION_COPYRIGHTS="Oricutron 1.2.0 (c)2015 Peter Gordon (pete@gordon.plus)";%(PreprocessorDefinitions) AnySuitable Speed true @@ -171,7 +171,7 @@ if "$(Configuration.Contains('Release'))"=="True" ( copy "..\vcpkg\installed\x64 true true .;..\vcpkg\installed\x64-windows\include\ - SDL_LIB=1;SDL_MAIN_HANDLED=1;__OPENGL_AVAILABLE__;_MBCS;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;__CBCOPY__;__CBPASTE__;APP_NAME_FULL="Oricutron 1.2";APP_YEAR="2015";VERSION_COPYRIGHTS="Oricutron 1.2.0 (c)2015 Peter Gordon (pete@petergordon.org.uk)";%(PreprocessorDefinitions) + SDL_LIB=1;SDL_MAIN_HANDLED=1;__OPENGL_AVAILABLE__;_MBCS;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;__CBCOPY__;__CBPASTE__;APP_NAME_FULL="Oricutron 1.2";APP_YEAR="2015";VERSION_COPYRIGHTS="Oricutron 1.2.0 (c)2015 Peter Gordon (pete@gordon.plus)";%(PreprocessorDefinitions) AnySuitable Speed true From 14e5e2a4ca818b875ce465858a4f01531658afef Mon Sep 17 00:00:00 2001 From: jedeoric Date: Tue, 16 Feb 2021 08:15:14 +0100 Subject: [PATCH 060/143] Ch376 datetime fix (#161) * Fix path for .cfg and fix bug in time struct for ch376 * Fix time struct * fix typo --- plugins/ch376/ch376.c | 68 +++++++++++++++---- .../oric_twilighte_board_plugin.c | 4 +- 2 files changed, 58 insertions(+), 14 deletions(-) diff --git a/plugins/ch376/ch376.c b/plugins/ch376/ch376.c index c3bca998..956987d3 100644 --- a/plugins/ch376/ch376.c +++ b/plugins/ch376/ch376.c @@ -18,6 +18,7 @@ 05.10.2017 - Assinie: Added support for CMD_DIR_CREATE and CMD_FILE_ERASE (Linux only) 21.08.2017 - Jede : Added support for CMD_DIR_CREATE and CMD_FILE_ERASE (WIN32 only) 22.07.2017 - OffseT : Added support for CMD_DIR_CREATE and CMD_FILE_ERASE (Added related Amiga system APIs only) + 01.02.2021 - Assinie: Fix time struct (Linux Only) */ /* /// "Portable includes" */ @@ -58,6 +59,7 @@ extern struct Library *SysBase; #include #endif #include +#include #else #error "FixMe!" @@ -1285,6 +1287,10 @@ static CH376_BOOL system_go_examine_directory(CH376_CONTEXT *context, CH376_LOCK { CH376_BOOL is_done = CH376_FALSE; struct stat file_stat; + struct tm *timeinfo; + CH376_U16 dos_cdate, dos_ctime; + CH376_U16 dos_adate; + CH376_U16 dos_mdate, dos_mtime; char *old_dir = NULL; if(dir_lock) @@ -1303,25 +1309,63 @@ static CH376_BOOL system_go_examine_directory(CH376_CONTEXT *context, CH376_LOCK if(S_ISDIR(file_stat.st_mode)) dir_info->DIR_Attr |= DIR_ATTR_DIRECTORY; - if((file_stat.st_mode & S_IRUSR) == 0) + if((file_stat.st_mode & S_IWUSR) == 0) { dir_info->DIR_Attr |= DIR_ATTR_READ_ONLY; + dbg_printf("--- READ ONLY ---"); + } - dbg_printf("system_go_examine_directory defined file attributes: %d\n", dir_info->DIR_Attr); + dbg_printf("system_go_examine_directory defined file attributes: %04o -> %02x\n", file_stat.st_mode, dir_info->DIR_Attr); + if (file_stat.st_ctim.tv_sec == 0) + { + dos_cdate = 0; + dos_ctime = 0; + } + else + { + timeinfo = localtime(&(file_stat.st_ctim.tv_sec)); + dos_cdate = DIR_MAKE_FILE_DATE((timeinfo->tm_year + 1900), (timeinfo->tm_mon + 1), timeinfo->tm_mday); + dos_ctime = DIR_MAKE_FILE_TIME(timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); + dbg_printf("system_go_examine_directory defined file cdate/time: %s", asctime(timeinfo)); + } + + if (file_stat.st_atim.tv_sec == 0) + { + dos_adate = 0; + } + else + { + timeinfo = localtime(&(file_stat.st_atim.tv_sec)); + dos_adate = DIR_MAKE_FILE_DATE((timeinfo->tm_year + 1900), (timeinfo->tm_mon + 1), timeinfo->tm_mday); + dbg_printf("system_go_examine_directory defined file adate/time: %s", asctime(timeinfo)); + } + + if (file_stat.st_mtim.tv_sec == 0) + { + dos_mdate = 0; + dos_mtime = 0; + } + else + { + timeinfo = localtime(&(file_stat.st_mtim.tv_sec)); + dos_mdate = DIR_MAKE_FILE_DATE((timeinfo->tm_year + 1900), (timeinfo->tm_mon + 1), timeinfo->tm_mday); + dos_mtime = DIR_MAKE_FILE_TIME(timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); + dbg_printf("system_go_examine_directory defined file mdate/time: %s", asctime(timeinfo)); + } dir_info->DIR_NTRes = 0; dir_info->DIR_CrtTimeTenth = 0; - dir_info->DIR_CrtTime[0] = 0; - dir_info->DIR_CrtTime[1] = 0; - dir_info->DIR_CrtDate[0] = 0; - dir_info->DIR_CrtDate[1] = 0; - dir_info->DIR_LstAccDate[0] = 0; - dir_info->DIR_LstAccDate[1] = 0; + dir_info->DIR_CrtTime[0] = (dos_ctime & 0x00ff); + dir_info->DIR_CrtTime[1] = (dos_ctime >> 8); + dir_info->DIR_CrtDate[0] = (dos_cdate & 0x00ff); + dir_info->DIR_CrtDate[1] = (dos_cdate >> 8); + dir_info->DIR_LstAccDate[0] = (dos_adate & 0x00ff); + dir_info->DIR_LstAccDate[1] = (dos_adate >> 8); dir_info->DIR_FstClusHI[0] = 0; dir_info->DIR_FstClusHI[1] = 0; - dir_info->DIR_WrtTime[0] = 0; - dir_info->DIR_WrtTime[1] = 0; - dir_info->DIR_WrtDate[0] = 0; - dir_info->DIR_WrtDate[1] = 0; + dir_info->DIR_WrtTime[0] = (dos_mtime & 0x00ff); + dir_info->DIR_WrtTime[1] = (dos_mtime >> 8); + dir_info->DIR_WrtDate[0] = (dos_mdate & 0x00ff); + dir_info->DIR_WrtDate[1] = (dos_mdate >> 8); dir_info->DIR_FstClusLO[0] = 0; dir_info->DIR_FstClusLO[1] = 0; dir_info->DIR_FileSize[0] = (file_stat.st_size & 0x000000ff) >> 0; diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index dd6b8e18..c3d16533 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -116,10 +116,10 @@ struct twilighte * twilighte_oric_init(void) twilighte->t_banking_register=0; twilighte->t_register=128+1; // Firmware - f = fopen( "plugins/twilighte_card/twilighte.cfg", "r" ); + f = fopen( "plugins/twilighte_board/twilighte.cfg", "r" ); if( !f ) { - error_printf( "plugins/twilighte_card/twilighte.cfg not found\n" ); + error_printf( "plugins/twilighte_board/twilighte.cfg not found\n" ); return NULL; } From cfa4e6cfef6686702bf71725ff6857bccee08192 Mon Sep 17 00:00:00 2001 From: iss Date: Tue, 16 Feb 2021 09:45:09 +0200 Subject: [PATCH 061/143] fix some warnings --- monitor.c | 2 +- .../oric_twilighte_board_plugin.c | 48 +++++++++---------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/monitor.c b/monitor.c index 0430b53c..fc525dcb 100644 --- a/monitor.c +++ b/monitor.c @@ -1081,7 +1081,7 @@ char *mon_disassemble( struct machine *oric, unsigned short *paddr, SDL_bool *lo if( strlen( tmpsname ) > SNAME_LEN ) { - sprintf( distmp, "%s\n", tmpsname ); + snprintf( distmp, 128, "%s\n", tmpsname ); disptr = &distmp[strlen(distmp)]; tmpsname = ""; } diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index b627448a..6527fc36 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -25,31 +25,31 @@ struct twilbankinfo struct twilighte { - + unsigned char t_register; unsigned char t_banking_register; char twilrombankfiles[32][1024]; - + unsigned char twilrambankfiles[32][1024]; - + unsigned char twilrombankdata[32][16834]; unsigned char twilrambankdata[32][16834]; - + unsigned char VDDRA; unsigned char DDRA; unsigned char VDDRB; - unsigned char DDRB; + unsigned char DDRB; unsigned char current_bank; - + }; #include "../../system.h" extern SDL_bool read_config_string( char *buf, char *token, char *dest, Sint32 maxlen ); - + static SDL_bool load_rom_twilighte( char *fname, int size, unsigned char where[] ) { SDL_RWops *f; @@ -108,7 +108,7 @@ struct twilighte * twilighte_oric_init(void) FILE *f; unsigned int i, j; - char *result; + // char *result; FIXME: unused char tbtmp[32]; char tbtmpram[32]; char line[1024]; @@ -144,17 +144,17 @@ struct twilighte * twilighte_oric_init(void) sprintf(tbtmp, "twilbankrom0%d", j); sprintf(tbtmpram, "twilbankram0%d", j); } - - if (twilighte->twilrombankfiles[j][0]==0) + + if (twilighte->twilrombankfiles[j][0]==0) { - if( read_config_string( line, tbtmp, twilighte->twilrombankfiles[j], 1024 ) ) + if( read_config_string( line, tbtmp, twilighte->twilrombankfiles[j], 1024 ) ) { break; } } if (twilighte->twilrambankfiles[j][0] == 0) { - if (read_config_string(line, tbtmpram, twilighte->twilrambankfiles[j], 1024)) + if (read_config_string(line, tbtmpram, (char*)twilighte->twilrambankfiles[j], 1024)) { break; } @@ -164,11 +164,11 @@ struct twilighte * twilighte_oric_init(void) fclose( f ); - // Now load rom + // Now load rom for( i=0; i<32; i++ ) { if( twilighte->twilrombankfiles[i][0]!=0 ) - { + { if( !load_rom_twilighte( twilighte->twilrombankfiles[i], -16384, twilighte->twilrombankdata[i] ) ) { error_printf("Cannot load %s",twilighte->twilrombankfiles[i]); @@ -177,7 +177,7 @@ struct twilighte * twilighte_oric_init(void) } if (twilighte->twilrambankfiles[i][0] != 0) { - if (!load_rom_twilighte(twilighte->twilrambankfiles[i], -16384, twilighte->twilrambankdata[i])) + if (!load_rom_twilighte((char*)twilighte->twilrambankfiles[i], -16384, twilighte->twilrambankdata[i])) { error_printf("Cannot load %s", twilighte->twilrambankfiles[i]); return NULL; @@ -185,8 +185,8 @@ struct twilighte * twilighte_oric_init(void) } } - for (j=0;j<16384;j++) twilighte->twilrambankdata[0][j]=0; - + for (j=0;j<16384;j++) twilighte->twilrambankdata[0][j]=0; + twilighte->DDRA=7+128+32; twilighte->VDDRA=7; twilighte->current_bank=7; @@ -198,13 +198,13 @@ unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uin unsigned char data; unsigned char bank; - if (twilighte->current_bank==0) + if (twilighte->current_bank==0) { data=twilighte->twilrambankdata[0][addr]; } else { - if (twilighte->current_bank<5) + if (twilighte->current_bank<5) { if (twilighte->t_banking_register!=0) bank=twilighte->current_bank+8-1+((twilighte->t_banking_register-1)*4); @@ -232,7 +232,7 @@ unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, ui } else { - if (twilighte->current_bank<5) + if (twilighte->current_bank<5) { if (twilighte->t_banking_register!=0) bank=twilighte->current_bank+8-1+((twilighte->t_banking_register-1)*4); @@ -299,8 +299,8 @@ unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t a if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) { - if (mask==0) - { + if (mask==0) + { twilighte->DDRA=data&(128+32+7); } if (mask==0xff) @@ -318,12 +318,12 @@ unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t a if (mask==0x00) - { + { unsigned char lastpb6; unsigned char lastpb7; data=data&0xdf; - if (data==0) + if (data==0) { twilighte->DDRB=0; return 0; From b3e29bd1fd9267ff8a4abaf9d591f7eac8ef6e12 Mon Sep 17 00:00:00 2001 From: iss Date: Tue, 16 Feb 2021 10:55:29 +0200 Subject: [PATCH 062/143] fix macos build --- monitor.c | 6 +++++- plugins/ch376/ch376.c | 17 +++++++++++++++-- .../oric_twilighte_board_plugin.c | 2 +- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/monitor.c b/monitor.c index fc525dcb..bf9b33b3 100644 --- a/monitor.c +++ b/monitor.c @@ -1081,7 +1081,11 @@ char *mon_disassemble( struct machine *oric, unsigned short *paddr, SDL_bool *lo if( strlen( tmpsname ) > SNAME_LEN ) { - snprintf( distmp, 128, "%s\n", tmpsname ); + int ln = strlen(tmpsname); + ln = (ln<127)? ln : 126; + memcpy( distmp, tmpsname, ln ); + distmp[ln] = '\n'; + distmp[ln+1] = 0; disptr = &distmp[strlen(distmp)]; tmpsname = ""; } diff --git a/plugins/ch376/ch376.c b/plugins/ch376/ch376.c index 956987d3..021349e6 100644 --- a/plugins/ch376/ch376.c +++ b/plugins/ch376/ch376.c @@ -1311,9 +1311,12 @@ static CH376_BOOL system_go_examine_directory(CH376_CONTEXT *context, CH376_LOCK dir_info->DIR_Attr |= DIR_ATTR_DIRECTORY; if((file_stat.st_mode & S_IWUSR) == 0) { dir_info->DIR_Attr |= DIR_ATTR_READ_ONLY; - dbg_printf("--- READ ONLY ---"); + dbg_printf("--- READ ONLY ---"); } +// FIXME: begin-of-implemented for Linux and Windows +#if defined(__linux__) || defined(WIN32) + dbg_printf("system_go_examine_directory defined file attributes: %04o -> %02x\n", file_stat.st_mode, dir_info->DIR_Attr); if (file_stat.st_ctim.tv_sec == 0) { @@ -1351,6 +1354,16 @@ static CH376_BOOL system_go_examine_directory(CH376_CONTEXT *context, CH376_LOCK dos_mtime = DIR_MAKE_FILE_TIME(timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); dbg_printf("system_go_examine_directory defined file mdate/time: %s", asctime(timeinfo)); } +#else + // silence compiler warnings + timeinfo = 0; + dos_ctime = 0; + dos_cdate = 0; + dos_mtime = 0; + dos_mdate = 0; + dos_adate = 0; +#endif +// FIXME: end-of-implemented for Linux and Windows dir_info->DIR_NTRes = 0; dir_info->DIR_CrtTimeTenth = 0; @@ -2396,7 +2409,7 @@ void ch376_write_data_port(struct ch376 *ch376, CH376_U8 data) ch376->nb_bytes_in_cmd_data = sizeof(ch376->cmd_data.CMD_FileSize); ch376->pos_rw_in_cmd_data = 0; - + dbg_printf("[WRITE][DATA][CH376_CMD_GET_FILE_SIZE] done, file size is %d, waiting for data read\n", file_size); // Lignes suivantes utiles? diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index 6527fc36..05c8da54 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -131,7 +131,7 @@ struct twilighte * twilighte_oric_init(void) while( !feof( f ) ) { - result=fgets( line, 1024, f ); + /* NOTE: 'result' is unused: result= */ fgets( line, 1024, f ); for( j=1; j<32; j++ ) { if (j > 9) From 44a1a6b2d49e233a195a7aa8ff81ee2b1091326b Mon Sep 17 00:00:00 2001 From: iss Date: Tue, 16 Feb 2021 22:32:42 +0200 Subject: [PATCH 063/143] fix Linux open-gl minimize/maximize window --- main.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/main.c b/main.c index 84a7ab13..5d8114c0 100644 --- a/main.c +++ b/main.c @@ -1567,15 +1567,10 @@ static void loop_handler( void* arg ) switch (event->type) { case SDL_COMPAT_ACTIVEEVENT: - { if (SDL_COMPAT_IsAppActive(event)) - { - oric->shut_render(oric); - oric->init_render(oric); ctx->needrender = SDL_TRUE; - } - } - break; + break; + case SDL_QUIT: done = SDL_TRUE; break; @@ -1602,10 +1597,8 @@ static void loop_handler( void* arg ) } while ( SDL_PollEvent( event ) ); } - { - ay_unlockaudio(&oric->ay); - shut(oric); - } + ay_unlockaudio(&oric->ay); + shut(oric); } int main( int argc, char *argv[] ) From 3ff3c591baf5927b23af3318fbee506939e3c8b8 Mon Sep 17 00:00:00 2001 From: snowflake <309430+0ric1@users.noreply.github.com> Date: Sat, 27 Feb 2021 13:08:10 +0100 Subject: [PATCH 064/143] Fix: add file plugins/twilighte_board/oric_twilighte_board_plugin.c to CMakeLists.txt --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9e0b6592..0d587cb2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -90,6 +90,7 @@ SET (SRCS main.c monitor.c plugins/ch376/oric_ch376_plugin.c + plugins/twilighte_board/oric_twilighte_board_plugin.c snapshot.c system_sdl.c tape.c From 52cccb46881f21717b673cfea4b9723ea8a81ea3 Mon Sep 17 00:00:00 2001 From: snowflake <309430+0ric1@users.noreply.github.com> Date: Sat, 27 Feb 2021 13:18:25 +0100 Subject: [PATCH 065/143] Update CMakeLists.txt Fix: add file plugins/twilighte_board/oric_twilighte_board_plugin.c to CMakeLists.txt --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9e0b6592..0d587cb2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -90,6 +90,7 @@ SET (SRCS main.c monitor.c plugins/ch376/oric_ch376_plugin.c + plugins/twilighte_board/oric_twilighte_board_plugin.c snapshot.c system_sdl.c tape.c From 4b02c2255c3e74740d9b8e3a16e1403466e94d3e Mon Sep 17 00:00:00 2001 From: snowflake <309430+0ric1@users.noreply.github.com> Date: Sat, 27 Feb 2021 13:41:12 +0100 Subject: [PATCH 066/143] Update CMakeLists.txt Fix: compiling on Raspbian Buster (10) did not work because of WIN32 include_directories --- CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0d587cb2..f50775db 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,10 +33,13 @@ endif (UNIX) include_directories( ${CMAKE_CURRENT_BINARY_DIR} +) + if (WIN32) +include_directories( "${PROJECT_SOURCE_DIR}/msvc" -endif (WIN32) ) +endif (WIN32) SET (SRCAMIGA filereq_amiga.c From d645eb8c9034878898bf9b38e3fc110db9d57c9d Mon Sep 17 00:00:00 2001 From: snowflake <309430+0ric1@users.noreply.github.com> Date: Sat, 27 Feb 2021 15:16:44 +0100 Subject: [PATCH 067/143] Update Oricutron.vcxproj Fix: add missing plugins\twilighte_board\oric_twilighte_board_plugin.c --- msvc/VS2019/Oricutron.vcxproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/msvc/VS2019/Oricutron.vcxproj b/msvc/VS2019/Oricutron.vcxproj index fdfef857..503f33d5 100644 --- a/msvc/VS2019/Oricutron.vcxproj +++ b/msvc/VS2019/Oricutron.vcxproj @@ -279,6 +279,7 @@ if "$(Configuration.Contains('Release'))"=="True" ( copy "..\vcpkg\installed\x64 + @@ -372,4 +373,4 @@ if "$(Configuration.Contains('Release'))"=="True" ( copy "..\vcpkg\installed\x64 - \ No newline at end of file + From a21388200e095a637a8b5be34fb02192f68a1408 Mon Sep 17 00:00:00 2001 From: snowflake <309430+0ric1@users.noreply.github.com> Date: Sat, 27 Feb 2021 15:28:59 +0100 Subject: [PATCH 068/143] Update Oricutron.vcxproj Beautify: added missing header file .\..\plugins\twilighte_board\oric_twilighte_board_plugin.h --- msvc/VS2019/Oricutron.vcxproj | 1 + 1 file changed, 1 insertion(+) diff --git a/msvc/VS2019/Oricutron.vcxproj b/msvc/VS2019/Oricutron.vcxproj index 503f33d5..15a72b43 100644 --- a/msvc/VS2019/Oricutron.vcxproj +++ b/msvc/VS2019/Oricutron.vcxproj @@ -317,6 +317,7 @@ if "$(Configuration.Contains('Release'))"=="True" ( copy "..\vcpkg\installed\x64 + From 4fef636db0878fbae372d78aac8482e1843ead2d Mon Sep 17 00:00:00 2001 From: snowflake <309430+0ric1@users.noreply.github.com> Date: Sat, 27 Feb 2021 15:48:09 +0100 Subject: [PATCH 069/143] Beautify: add new filter for plugins and add missing twilighte files. --- msvc/VS2019/Oricutron.vcxproj.filters | 600 +++++++++++++------------- 1 file changed, 306 insertions(+), 294 deletions(-) diff --git a/msvc/VS2019/Oricutron.vcxproj.filters b/msvc/VS2019/Oricutron.vcxproj.filters index 9d9e7621..0b5706f0 100644 --- a/msvc/VS2019/Oricutron.vcxproj.filters +++ b/msvc/VS2019/Oricutron.vcxproj.filters @@ -1,295 +1,307 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - {d8905722-c245-4995-9565-1254df225adf} - - - {2a1ecf99-deac-4e93-8be8-b458195be3e6} - - - {da16e29b-077d-4e5d-a0f0-a28dcb6a6f8e} - - - {4e5b9fcf-0045-4de6-b89b-1068fb7c09f8} - - - {cc64b1f4-268f-4438-977a-7a111a46d23c} - - - {cb7fe694-3d2f-454a-ad9d-00a823d54e1b} - - - {4396d62b-8f06-42de-a6cb-f18ad3efec67} - - - {7e934c0d-8e01-4561-8fb2-046726f16eab} - - - {277732bb-2f68-45d9-8df8-f5445a281fd4} - - - {e7b0354f-0047-49e9-b26e-148f1be37f38} - - - {e6e88892-b414-4cf9-9cef-c2f287ab8305} - - - {8438c688-6a7e-49a1-bd13-fa16128c58ec} - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files\filereq - - - Source Files\filereq - - - Source Files\filereq - - - Source Files\filereq - - - Source Files\filereq - - - Source Files\msgbox - - - Source Files\msgbox - - - Source Files\msgbox - - - Source Files\msgbox - - - Source Files\msgbox - - - Source Files\msgbox - - - Source Files\renderer - - - Source Files\renderer - - - Source Files\renderer - - - Source Files\renderer - - - Source Files\gui - - - Source Files\gui - - - Source Files\gui - - - Source Files\gui - - - Source Files\acia - - - Source Files\acia - - - Source Files\acia - - - Source Files\acia - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files\renderer - - - Header Files\renderer - - - Header Files\renderer - - - Header Files\renderer - - - Header Files\filereq - - - Header Files\gui - - - Header Files\msgbox - - - Header Files\msvc - - - Header Files\msvc - - - Header Files\acia - - - Header Files\msvc - - - - - Source Files\msvc - - - Source Files\msvc - - - - Source Files\filereq - - - Source Files\msgbox - - - Source Files\gui - - - - - Resource Files - - - - - Resource Files - - + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {d8905722-c245-4995-9565-1254df225adf} + + + {2a1ecf99-deac-4e93-8be8-b458195be3e6} + + + {da16e29b-077d-4e5d-a0f0-a28dcb6a6f8e} + + + {4e5b9fcf-0045-4de6-b89b-1068fb7c09f8} + + + {cc64b1f4-268f-4438-977a-7a111a46d23c} + + + {cb7fe694-3d2f-454a-ad9d-00a823d54e1b} + + + {4396d62b-8f06-42de-a6cb-f18ad3efec67} + + + {7e934c0d-8e01-4561-8fb2-046726f16eab} + + + {277732bb-2f68-45d9-8df8-f5445a281fd4} + + + {e7b0354f-0047-49e9-b26e-148f1be37f38} + + + {e6e88892-b414-4cf9-9cef-c2f287ab8305} + + + {8438c688-6a7e-49a1-bd13-fa16128c58ec} + + + {7a330041-d032-4884-903e-eb6f613ed87e} + + + {b01b5e24-c6cf-49fb-8e17-a4eae6400688} + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files\filereq + + + Source Files\filereq + + + Source Files\filereq + + + Source Files\filereq + + + Source Files\filereq + + + Source Files\msgbox + + + Source Files\msgbox + + + Source Files\msgbox + + + Source Files\msgbox + + + Source Files\msgbox + + + Source Files\msgbox + + + Source Files\renderer + + + Source Files\renderer + + + Source Files\renderer + + + Source Files\renderer + + + Source Files\gui + + + Source Files\gui + + + Source Files\gui + + + Source Files\gui + + + Source Files\acia + + + Source Files\acia + + + Source Files\acia + + + Source Files\acia + + + Source Files\plugins + + + Source Files\plugins + + + Source Files\plugins + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files\renderer + + + Header Files\renderer + + + Header Files\renderer + + + Header Files\renderer + + + Header Files\filereq + + + Header Files\gui + + + Header Files\msgbox + + + Header Files\msvc + + + Header Files\msvc + + + Header Files\acia + + + Header Files\msvc + + + Header Files\plugins + + + Header Files\plugins + + + Header Files\plugins + + + + + Source Files\msvc + + + Source Files\msvc + + + + Source Files\filereq + + + Source Files\msgbox + + + Source Files\gui + + + + + Resource Files + + + + + Resource Files + + \ No newline at end of file From bc84e9e72967caf1dc4bff9c6bc1efcc3d125a61 Mon Sep 17 00:00:00 2001 From: snowflake <309430+0ric1@users.noreply.github.com> Date: Sat, 27 Feb 2021 20:23:58 +0100 Subject: [PATCH 070/143] Update Pete's email address - synced with vcxpoj settings --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f50775db..387058fc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,7 +13,7 @@ if (WIN32) INTERFACE_INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/msvc/vcpkg/installed/x64-windows/include/SDL2" ) - add_definitions(-DSDL_MAIN_HANDLED=1 -D__OPENGL_AVAILABLE__ -D_MBCS -DWIN32 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS -D__CBCOPY__ -D__CBPASTE__ -DAPP_NAME_FULL="Oricutron 1.2" -DAPP_YEAR="2015" -DVERSION_COPYRIGHTS="Oricutron 1.2.0 2016 Peter Gordon") + add_definitions(-DSDL_MAIN_HANDLED=1 -D__OPENGL_AVAILABLE__ -D_MBCS -DWIN32 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS -D__CBCOPY__ -D__CBPASTE__ -DAPP_NAME_FULL="Oricutron 1.2" -DAPP_YEAR="2015" -DVERSION_COPYRIGHTS="Oricutron 1.2.0 (c)2015 Peter Gordon (pete@gordon.plus)") endif (WIN32) if (UNIX) @@ -28,7 +28,7 @@ if (UNIX) include_directories(${GTK3_INCLUDE_DIRS} ${SDL2_INCLUDE_DIRS}) link_directories(${GTK3_LIBRARY_DIRS}) - add_definitions(${GTK3_CFLAGS_OTHER} -D__SPECIFY_SDL_DIR__=1 -DAPP_NAME_FULL="Oricutron 1.2" -DAPP_YEAR="2015" -DVERSION_COPYRIGHTS="Oricutron 1.2.0 2016 Peter Gordon") + add_definitions(${GTK3_CFLAGS_OTHER} -D__SPECIFY_SDL_DIR__=1 -DAPP_NAME_FULL="Oricutron 1.2" -DAPP_YEAR="2015" -DVERSION_COPYRIGHTS="Oricutron 1.2.0 (c)2015 Peter Gordon (pete@gordon.plus)") endif (UNIX) include_directories( From a845c3ab3299ac94ba96097fcebcf1e71c885b67 Mon Sep 17 00:00:00 2001 From: snowflake <309430+0ric1@users.noreply.github.com> Date: Sat, 27 Feb 2021 21:08:00 +0100 Subject: [PATCH 071/143] Add: file version and copyright info to executable that is displayed in the Windows file properties dialog --- CMakeLists.txt | 8 +++++--- msvc/Oricutron.rc | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 msvc/Oricutron.rc diff --git a/CMakeLists.txt b/CMakeLists.txt index 387058fc..a2f801ba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,7 +13,7 @@ if (WIN32) INTERFACE_INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/msvc/vcpkg/installed/x64-windows/include/SDL2" ) - add_definitions(-DSDL_MAIN_HANDLED=1 -D__OPENGL_AVAILABLE__ -D_MBCS -DWIN32 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS -D__CBCOPY__ -D__CBPASTE__ -DAPP_NAME_FULL="Oricutron 1.2" -DAPP_YEAR="2015" -DVERSION_COPYRIGHTS="Oricutron 1.2.0 (c)2015 Peter Gordon (pete@gordon.plus)") + add_definitions(-DSDL_MAIN_HANDLED=1 -D__OPENGL_AVAILABLE__ -D_MBCS -DWIN32 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS -D__CBCOPY__ -D__CBPASTE__ -DAPP_NAME_FULL="Oricutron 1.2" -DAPP_YEAR="2015" -DVERSION_COPYRIGHTS="Oricutron 1.2.0 \(c\)2015 Peter Gordon \(pete@gordon.plus\)") endif (WIN32) if (UNIX) @@ -28,7 +28,7 @@ if (UNIX) include_directories(${GTK3_INCLUDE_DIRS} ${SDL2_INCLUDE_DIRS}) link_directories(${GTK3_LIBRARY_DIRS}) - add_definitions(${GTK3_CFLAGS_OTHER} -D__SPECIFY_SDL_DIR__=1 -DAPP_NAME_FULL="Oricutron 1.2" -DAPP_YEAR="2015" -DVERSION_COPYRIGHTS="Oricutron 1.2.0 (c)2015 Peter Gordon (pete@gordon.plus)") + add_definitions(${GTK3_CFLAGS_OTHER} -D__SPECIFY_SDL_DIR__=1 -DAPP_NAME_FULL="Oricutron 1.2" -DAPP_YEAR="2015" -DVERSION_COPYRIGHTS="Oricutron 1.2.0 \(c\)2015 Peter Gordon \(pete@gordon.plus\)") endif (UNIX) include_directories( @@ -101,8 +101,10 @@ SET (SRCS via.c ) +set(ORICUTRON_RC ${PROJECT_SOURCE_DIR}/msvc/Oricutron.rc) + if (WIN32) - add_executable(Oricutron ${SRCS} ${SRCSWIN}) + add_executable(Oricutron ${SRCS} ${SRCSWIN} ${ORICUTRON_RC}) target_link_libraries(Oricutron SDL2 ${OPENGL_LIBRARY}) endif (WIN32) diff --git a/msvc/Oricutron.rc b/msvc/Oricutron.rc new file mode 100644 index 00000000..47cdb422 --- /dev/null +++ b/msvc/Oricutron.rc @@ -0,0 +1,44 @@ +#include +# define ORICUTRON_VERSION_MAJOR 1 +# define ORICUTRON_VERSION_MINOR 2 +# define ORICUTRON_VERSION_PATCH 0 +# define ORICUTRON_VERSION_NUMBER "1.2.0\0" + +#ifdef GCC_WINDRES +VS_VERSION_INFO VERSIONINFO +#else +VS_VERSION_INFO VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE +#endif + FILEVERSION ORICUTRON_VERSION_MAJOR,ORICUTRON_VERSION_MINOR,ORICUTRON_VERSION_PATCH,0 + PRODUCTVERSION ORICUTRON_VERSION_MAJOR,ORICUTRON_VERSION_MINOR,ORICUTRON_VERSION_PATCH,0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS 1 +#else + FILEFLAGS 0 +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + BEGIN + VALUE "CompanyName", "pete-gordon/oricutron\0" + VALUE "FileDescription", "Oricutron.exe\0" + VALUE "FileVersion", ORICUTRON_VERSION_NUMBER + VALUE "InternalName", "Oricutron.exe\0" + VALUE "LegalCopyright", "Oricutron 1.2.0 (c)2015 Peter Gordon (pete@gordon.plus)\0" + VALUE "OriginalFilename", "Oricutron.exe\0" + VALUE "ProductName", "Oricutron\0" + VALUE "ProductVersion", ORICUTRON_VERSION_NUMBER + VALUE "Comments", "For more information visit https://github.com/pete-gordon/oricutron/\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END From 723544d26e5d2246b90dc0dc2bb0280af7cc6e69 Mon Sep 17 00:00:00 2001 From: snowflake <309430+0ric1@users.noreply.github.com> Date: Wed, 3 Mar 2021 09:32:24 +0100 Subject: [PATCH 072/143] Update CMakeLists to build Oricutron with SDL or SDL2, ... (#171) * Create cmake.yml Execute a cmake build on every push * Update cmake.yml Add installing SDL2 and GTK3 * Create cmake-win64.yml Add action for building Oricutron for Windows 64-bit * Create codeql-analysis.yml * Delete codeql-analysis.yml * Add to ignore list /Oricutron /Oricutron-sdl2.exe /Oricutron.exe /SDL.dll /SDL2.dll /disks/*.dsk /pravdisks/*.dsk /teledisks/*.dsk * Update .gitignore Add Oricutron-sdl2 * Update .gitignore Add orix.rom to ignore list * Update CMakeLists.txt and documentation to support SDL and SDL2 builds with cmake. Use -DUSE_SDL2:BOOL=ON to build Oricutron with SDL2, default is SDL. Update CMakeLists.txt copyright, version and app info. * Update github workflows add cmake flag -DUSE_SDL2:BOOL=ON to build Oricutron with SDL2 * Update github workflows add cmake flag -DUSE_SDL2:BOOL=ON to build Oricutron with SDL2 * Update github workflows names --- .github/workflows/cmake-win64.yml | 50 ++++++++++++++++++ .github/workflows/cmake.yml | 50 ++++++++++++++++++ .gitignore | 11 +++- CMakeLists.txt | 85 +++++++++++++++++++++++-------- ReadMeNinjaCMakeBuild.md | 35 +++++++++---- msvc/Oricutron.rc | 31 ++++++----- 6 files changed, 217 insertions(+), 45 deletions(-) create mode 100644 .github/workflows/cmake-win64.yml create mode 100644 .github/workflows/cmake.yml diff --git a/.github/workflows/cmake-win64.yml b/.github/workflows/cmake-win64.yml new file mode 100644 index 00000000..3d0f4a33 --- /dev/null +++ b/.github/workflows/cmake-win64.yml @@ -0,0 +1,50 @@ +name: Oricutron Release on windows-latest - cmake SDL2 GTK3 (x64) + +on: [push] + +env: + # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) + BUILD_TYPE: Release + +jobs: + build: + # The CMake configure and build commands are platform agnostic and should work equally + # well on Windows or Mac. You can convert this to a matrix build if you need + # cross-platform coverage. + # See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix + runs-on: windows-latest + + steps: + - uses: actions/checkout@v2 + + - name: Install SDL2 and GTK3 + run: pushd ${{github.workspace}}/msvc && git clone -q --depth 1 --single-branch https://github.com/Microsoft/vcpkg.git && .\vcpkg\bootstrap-vcpkg.bat && .\vcpkg\vcpkg.exe install sdl2:x64-windows && popd + + - name: Create Build Environment + # Some projects don't allow in-source building, so create a separate build directory + # We'll use this as our working directory for all subsequent commands + run: cmake -E make_directory ${{github.workspace}}/build + + - name: Configure CMake + # Use a bash shell so we can use the same syntax for environment variable + # access regardless of the host operating system + shell: bash + working-directory: ${{github.workspace}}/build + # Note the current convention is to use the -S and -B options here to specify source + # and build directories, but this is only available with CMake 3.13 and higher. + # The CMake binaries on the Github Actions machines are (as of this writing) 3.12 + run: cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_SDL2:BOOL=ON + + - name: Build + working-directory: ${{github.workspace}}/build + shell: bash + # Execute the build. You can specify a specific target with "--target " + run: cmake --build . --config $BUILD_TYPE + +# We have no tests at the moment +# - name: Test +# working-directory: ${{github.workspace}}/build +# shell: bash +# # Execute tests defined by the CMake configuration. +# # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail +# run: ctest -C $BUILD_TYPE diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml new file mode 100644 index 00000000..b607c838 --- /dev/null +++ b/.github/workflows/cmake.yml @@ -0,0 +1,50 @@ +name: Oricutron Release on ubuntu-latest - cmake SDL2 GTK3 + +on: [push] + +env: + # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) + BUILD_TYPE: Release + +jobs: + build: + # The CMake configure and build commands are platform agnostic and should work equally + # well on Windows or Mac. You can convert this to a matrix build if you need + # cross-platform coverage. + # See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Install SDL2 and GTK3 + run: sudo apt-get update -qq && sudo apt-get install libsdl2-dev -y --force-yes && sudo apt-get install libgtk-3-dev -y --force-yes + + - name: Create Build Environment + # Some projects don't allow in-source building, so create a separate build directory + # We'll use this as our working directory for all subsequent commands + run: cmake -E make_directory ${{github.workspace}}/build + + - name: Configure CMake + # Use a bash shell so we can use the same syntax for environment variable + # access regardless of the host operating system + shell: bash + working-directory: ${{github.workspace}}/build + # Note the current convention is to use the -S and -B options here to specify source + # and build directories, but this is only available with CMake 3.13 and higher. + # The CMake binaries on the Github Actions machines are (as of this writing) 3.12 + run: cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_SDL2:BOOL=ON + + - name: Build + working-directory: ${{github.workspace}}/build + shell: bash + # Execute the build. You can specify a specific target with "--target " + run: cmake --build . --config $BUILD_TYPE + +# We have no tests at the moment +# - name: Test +# working-directory: ${{github.workspace}}/build +# shell: bash +# # Execute tests defined by the CMake configuration. +# # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail +# run: ctest -C $BUILD_TYPE diff --git a/.gitignore b/.gitignore index 89855478..d491e1e0 100644 --- a/.gitignore +++ b/.gitignore @@ -12,9 +12,18 @@ x64/ /msvc/**/sdl /msvc/**/sdl2 /roms/*.rom -!/roms/orix*.rom +/roms/orix*.rom /oricutron.aps /msvc/**/Oricutron.psess /msvc/**/*.user /msvc/**/vcpkg build +/Oricutron +/Oricutron-sdl2.exe +/Oricutron.exe +/SDL.dll +/SDL2.dll +/disks/*.dsk +/pravdisks/*.dsk +/teledisks/*.dsk +/Oricutron-sdl2 diff --git a/CMakeLists.txt b/CMakeLists.txt index a2f801ba..16a04f74 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,17 +3,40 @@ set (CMAKE_C_STANDARD 99) project(Oricutron) +option(USE_SDL2 "Use SDL2 instead of SDL1" OFF) + +set(ORICUTRON_APPNAME Oricutron) +set(ORICUTRON_APPYEAR 2015) +SET(ORICUTRON_VERSION_MAJOR 1) +SET(ORICUTRON_VERSION_MINOR 2) +SET(ORICUTRON_VERSION_PATCH 0) +set(ORICUTRON_COMPANYNAME "pete-gordon/oricutron") +set(ORICUTRON_LINK "https://github.com/pete-gordon/oricutron/") +set(ORICUTRON_VERSION_NUMBER "${ORICUTRON_VERSION_MAJOR}.${ORICUTRON_VERSION_MINOR}") +set(ORICUTRON_VERSION_NUMBER_FULL "${ORICUTRON_VERSION_MAJOR}.${ORICUTRON_VERSION_MINOR}.${ORICUTRON_VERSION_PATCH}") +set(ORICUTRON_APPNAME_FULL "${ORICUTRON_APPNAME} ${ORICUTRON_VERSION_MAJOR}.${ORICUTRON_VERSION_MINOR}") +set(ORICUTRON_VERSION_COPYRIGHTS "${ORICUTRON_APPNAME} ${ORICUTRON_VERSION_MAJOR}.${ORICUTRON_VERSION_MINOR}.${ORICUTRON_VERSION_PATCH} (c)${ORICUTRON_APPYEAR} Peter Gordon (pete@gordon.plus)") + if (WIN32) set(OPENGL_LIBRARY "opengl32.lib") - add_library(SDL2 STATIC IMPORTED) - set_target_properties(SDL2 - PROPERTIES - IMPORTED_LOCATION "${PROJECT_SOURCE_DIR}/msvc/vcpkg/installed/x64-windows/lib/SDL2.lib" - INTERFACE_INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/msvc/vcpkg/installed/x64-windows/include/SDL2" - ) - - add_definitions(-DSDL_MAIN_HANDLED=1 -D__OPENGL_AVAILABLE__ -D_MBCS -DWIN32 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS -D__CBCOPY__ -D__CBPASTE__ -DAPP_NAME_FULL="Oricutron 1.2" -DAPP_YEAR="2015" -DVERSION_COPYRIGHTS="Oricutron 1.2.0 \(c\)2015 Peter Gordon \(pete@gordon.plus\)") + if (USE_SDL2) + add_library(SDL2 STATIC IMPORTED) + set_target_properties(SDL2 + PROPERTIES + IMPORTED_LOCATION "${PROJECT_SOURCE_DIR}/msvc/vcpkg/installed/x64-windows/lib/SDL2.lib" + INTERFACE_INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/msvc/vcpkg/installed/x64-windows/include/SDL2" + ) + add_definitions(-DSDL_MAJOR_VERSION=2 -DSDL_MAIN_HANDLED=1 -D__OPENGL_AVAILABLE__ -D_MBCS -DWIN32 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS -D__CBCOPY__ -D__CBPASTE__ -DAPP_NAME_FULL="${ORICUTRON_APPNAME_FULL}" -DAPP_YEAR="${ORICUTRON_APPYEAR}" -DVERSION_COPYRIGHTS="${ORICUTRON_VERSION_COPYRIGHTS}") + else() + add_library(SDL STATIC IMPORTED) + set_target_properties(SDL + PROPERTIES + IMPORTED_LOCATION "${PROJECT_SOURCE_DIR}/msvc/vcpkg/installed/x64-windows/lib/SDL.lib" + INTERFACE_INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/msvc/vcpkg/installed/x64-windows/include/SDL" + ) + add_definitions(-DSDL_MAJOR_VERSION=1 -DSDL_MAIN_HANDLED=1 -D__OPENGL_AVAILABLE__ -D_MBCS -DWIN32 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS -D__CBCOPY__ -D__CBPASTE__ -DAPP_NAME_FULL="${ORICUTRON_APPNAME_FULL}" -DAPP_YEAR="${ORICUTRON_APPYEAR}" -DVERSION_COPYRIGHTS="${ORICUTRON_VERSION_COPYRIGHTS}") + endif (USE_SDL2) endif (WIN32) if (UNIX) @@ -21,14 +44,23 @@ if (UNIX) find_package(PkgConfig REQUIRED) PKG_CHECK_MODULES(GTK3 REQUIRED gtk+-3.0) - find_package(SDL2 REQUIRED) - - # Setup CMake to use GTK+ and SDL2, tell the compiler where to look for headers - # and to the linker where to look for libraries - include_directories(${GTK3_INCLUDE_DIRS} ${SDL2_INCLUDE_DIRS}) - link_directories(${GTK3_LIBRARY_DIRS}) - - add_definitions(${GTK3_CFLAGS_OTHER} -D__SPECIFY_SDL_DIR__=1 -DAPP_NAME_FULL="Oricutron 1.2" -DAPP_YEAR="2015" -DVERSION_COPYRIGHTS="Oricutron 1.2.0 \(c\)2015 Peter Gordon \(pete@gordon.plus\)") + if (USE_SDL2) + find_package(SDL2 REQUIRED) + + # Setup CMake to use GTK+ and SDL2, tell the compiler where to look for headers + # and to the linker where to look for libraries + include_directories(${GTK3_INCLUDE_DIRS} ${SDL2_INCLUDE_DIRS}) + link_directories(${GTK3_LIBRARY_DIRS}) + add_definitions(${GTK3_CFLAGS_OTHER} -DSDL_MAJOR_VERSION=2 -D__SPECIFY_SDL_DIR__=1 -DAPP_NAME_FULL="${ORICUTRON_APPNAME_FULL}" -DAPP_YEAR="${ORICUTRON_APPYEAR}" -DVERSION_COPYRIGHTS="${ORICUTRON_VERSION_COPYRIGHTS}") + else() + find_package(SDL REQUIRED) + + # Setup CMake to use GTK+ and SDL, tell the compiler where to look for headers + # and to the linker where to look for libraries + include_directories(${GTK3_INCLUDE_DIRS} ${SDL_INCLUDE_DIRS}) + link_directories(${GTK3_LIBRARY_DIRS}) + add_definitions(${GTK3_CFLAGS_OTHER} -DSDL_MAJOR_VERSION=1 -D__SPECIFY_SDL_DIR__=1 -DAPP_NAME_FULL="${ORICUTRON_APPNAME_FULL}" -DAPP_YEAR="${ORICUTRON_APPYEAR}" -DVERSION_COPYRIGHTS="${ORICUTRON_VERSION_COPYRIGHTS}") + endif (USE_SDL2) endif (UNIX) include_directories( @@ -43,6 +75,7 @@ endif (WIN32) SET (SRCAMIGA filereq_amiga.c + msgbox_os4.c ) SET (SRCBEOS @@ -74,8 +107,6 @@ SET (SRCS 6551_loopback.c 6551_modem.c gui.c -# msgbox_os2.c -# msgbox_os4.c render_gl.c render_null.c render_sw.c @@ -104,11 +135,21 @@ SET (SRCS set(ORICUTRON_RC ${PROJECT_SOURCE_DIR}/msvc/Oricutron.rc) if (WIN32) - add_executable(Oricutron ${SRCS} ${SRCSWIN} ${ORICUTRON_RC}) - target_link_libraries(Oricutron SDL2 ${OPENGL_LIBRARY}) + if (USE_SDL2) + add_executable(Oricutron-sdl2 ${SRCS} ${SRCSWIN} ${ORICUTRON_RC}) + target_link_libraries(Oricutron-sdl2 SDL2 ${OPENGL_LIBRARY}) + else() + add_executable(Oricutron ${SRCS} ${SRCSWIN} ${ORICUTRON_RC}) + target_link_libraries(Oricutron SDL ${OPENGL_LIBRARY}) + endif (USE_SDL2) endif (WIN32) if (UNIX) - add_executable(Oricutron ${SRCS} ${SRCGTK}) - target_link_libraries(Oricutron ${GTK3_LIBRARIES} ${SDL2_LIBRARIES}) + if (USE_SDL2) + add_executable(Oricutron-sdl2 ${SRCS} ${SRCGTK}) + target_link_libraries(Oricutron-sdl2 ${GTK3_LIBRARIES} ${SDL2_LIBRARIES}) + else() + add_executable(Oricutron ${SRCS} ${SRCGTK}) + target_link_libraries(Oricutron ${GTK3_LIBRARIES} SDL GL X11) + endif (USE_SDL2) endif (UNIX) diff --git a/ReadMeNinjaCMakeBuild.md b/ReadMeNinjaCMakeBuild.md index f486934e..b9074083 100644 --- a/ReadMeNinjaCMakeBuild.md +++ b/ReadMeNinjaCMakeBuild.md @@ -16,21 +16,36 @@ SDL2, GTK-3 Open a Visual Studio Developer Command Prompt 2019 -`mkdir build\windows` -`cd build\windows` -`cmake -GNinja ../..` -`ninja` -`Oricutron.exe` +```shell +mkdir build\windows +cd build\windows +cmake -GNinja ..\.. [-DUSE_SDL2:BOOL=ON] +ninja +copy Oricutron.exe ..\.. +[copy Oricutron-sdl2.exe ..\..] +cd ..\.. +mklink SDL.dll msvc\vcpkg\installed\x64-windows\bin\SDL.dll +mklink SDL2.dll msvc\vcpkg\installed\x64-windows\bin\SDL2.dll +Oricutron.exe +[Oricutron-sdl2.exe] +``` ### Linux Open a terminal (on Windows you can use WSL + e.g. Ubuntu) -`mkdir build/linux` -`cd build/linux` -`cmake -GNinja ../..` -`ninja` -`./oricutron` +```shell +mkdir -p build/linux +cd build/linux +cmake -GNinja ../.. +[cmake -GNinja ../.. -DUSE_SDL2:BOOL=ON] +ninja +cp Oricutron ../.. +[cp Oricutron-sdl2 ../..] +cd ../.. +./Oricutron +[./Oricutron-sdl2] +``` ### Linux + Windows diff --git a/msvc/Oricutron.rc b/msvc/Oricutron.rc index 47cdb422..d754e665 100644 --- a/msvc/Oricutron.rc +++ b/msvc/Oricutron.rc @@ -3,6 +3,13 @@ # define ORICUTRON_VERSION_MINOR 2 # define ORICUTRON_VERSION_PATCH 0 # define ORICUTRON_VERSION_NUMBER "1.2.0\0" +# define ORICUTRON_COPYRIGHT "Oricutron 1.2.0 (c)2015 Peter Gordon (pete@gordon.plus)\0" +# define ORICUTRON_APPNAME "Oricutron\0" +# define ORICUTRON_EXE "Oricutron.exe\0" +# define ORICUTRON_COMPANYNAME "pete-gordon/oricutron\0" +# define ORICUTRON_LINK "https://github.com/pete-gordon/oricutron/\0" + +101 ICON "..\winicon.ico" #ifdef GCC_WINDRES VS_VERSION_INFO VERSIONINFO @@ -13,28 +20,28 @@ VS_VERSION_INFO VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE PRODUCTVERSION ORICUTRON_VERSION_MAJOR,ORICUTRON_VERSION_MINOR,ORICUTRON_VERSION_PATCH,0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK #ifdef _DEBUG - FILEFLAGS 1 + FILEFLAGS 0x1L #else - FILEFLAGS 0 + FILEFLAGS 0x0L #endif - FILEOS VOS__WINDOWS32 - FILETYPE VFT_DLL - FILESUBTYPE 0 // not used + FILEOS VOS_NT_WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" //language ID = U.S. English, char set = Windows, Multilingual BEGIN - VALUE "CompanyName", "pete-gordon/oricutron\0" - VALUE "FileDescription", "Oricutron.exe\0" + VALUE "CompanyName", ORICUTRON_COMPANYNAME + VALUE "FileDescription", ORICUTRON_EXE VALUE "FileVersion", ORICUTRON_VERSION_NUMBER - VALUE "InternalName", "Oricutron.exe\0" - VALUE "LegalCopyright", "Oricutron 1.2.0 (c)2015 Peter Gordon (pete@gordon.plus)\0" - VALUE "OriginalFilename", "Oricutron.exe\0" - VALUE "ProductName", "Oricutron\0" + VALUE "InternalName", ORICUTRON_EXE + VALUE "LegalCopyright", ORICUTRON_COPYRIGHT + VALUE "OriginalFilename", ORICUTRON_EXE + VALUE "ProductName", ORICUTRON_APPNAME VALUE "ProductVersion", ORICUTRON_VERSION_NUMBER - VALUE "Comments", "For more information visit https://github.com/pete-gordon/oricutron/\0" + VALUE "Comments", ORICUTRON_LINK END END BLOCK "VarFileInfo" From 98c7e6bb5f8068cc327cffe29db2635adce4b9d4 Mon Sep 17 00:00:00 2001 From: snowflake <309430+0ric1@users.noreply.github.com> Date: Thu, 4 Mar 2021 21:06:10 +0100 Subject: [PATCH 073/143] GitHub workflow sdl1 (#172) * Create cmake.yml Execute a cmake build on every push * Update cmake.yml Add installing SDL2 and GTK3 * Create cmake-win64.yml Add action for building Oricutron for Windows 64-bit * Create codeql-analysis.yml * Delete codeql-analysis.yml * Add to ignore list /Oricutron /Oricutron-sdl2.exe /Oricutron.exe /SDL.dll /SDL2.dll /disks/*.dsk /pravdisks/*.dsk /teledisks/*.dsk * Update .gitignore Add Oricutron-sdl2 * Update .gitignore Add orix.rom to ignore list * Update CMakeLists.txt and documentation to support SDL and SDL2 builds with cmake. Use -DUSE_SDL2:BOOL=ON to build Oricutron with SDL2, default is SDL. Update CMakeLists.txt copyright, version and app info. * Update github workflows add cmake flag -DUSE_SDL2:BOOL=ON to build Oricutron with SDL2 * Update github workflows add cmake flag -DUSE_SDL2:BOOL=ON to build Oricutron with SDL2 * Update github workflows names * Add: github workflow build with SDL1 on Windows / Ubuntu * Fix: add missing gtk3 for sdl1 workflow, remove deprecated --force flag --- .github/workflows/cmake-sdl1-win64.yml | 50 ++++++++++++++++++++++++++ .github/workflows/cmake-sdl1.yml | 50 ++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 .github/workflows/cmake-sdl1-win64.yml create mode 100644 .github/workflows/cmake-sdl1.yml diff --git a/.github/workflows/cmake-sdl1-win64.yml b/.github/workflows/cmake-sdl1-win64.yml new file mode 100644 index 00000000..b115a507 --- /dev/null +++ b/.github/workflows/cmake-sdl1-win64.yml @@ -0,0 +1,50 @@ +name: Oricutron Release on windows-latest - cmake SDL1 + +on: [push] + +env: + # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) + BUILD_TYPE: Release + +jobs: + build: + # The CMake configure and build commands are platform agnostic and should work equally + # well on Windows or Mac. You can convert this to a matrix build if you need + # cross-platform coverage. + # See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix + runs-on: windows-latest + + steps: + - uses: actions/checkout@v2 + + - name: Install SDL1 + run: pushd ${{github.workspace}}/msvc && git clone -q --depth 1 --single-branch https://github.com/Microsoft/vcpkg.git && .\vcpkg\bootstrap-vcpkg.bat && .\vcpkg\vcpkg.exe install sdl1:x64-windows && popd + + - name: Create Build Environment + # Some projects don't allow in-source building, so create a separate build directory + # We'll use this as our working directory for all subsequent commands + run: cmake -E make_directory ${{github.workspace}}/build + + - name: Configure CMake + # Use a bash shell so we can use the same syntax for environment variable + # access regardless of the host operating system + shell: bash + working-directory: ${{github.workspace}}/build + # Note the current convention is to use the -S and -B options here to specify source + # and build directories, but this is only available with CMake 3.13 and higher. + # The CMake binaries on the Github Actions machines are (as of this writing) 3.12 + run: cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE + + - name: Build + working-directory: ${{github.workspace}}/build + shell: bash + # Execute the build. You can specify a specific target with "--target " + run: cmake --build . --config $BUILD_TYPE + +# We have no tests at the moment +# - name: Test +# working-directory: ${{github.workspace}}/build +# shell: bash +# # Execute tests defined by the CMake configuration. +# # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail +# run: ctest -C $BUILD_TYPE diff --git a/.github/workflows/cmake-sdl1.yml b/.github/workflows/cmake-sdl1.yml new file mode 100644 index 00000000..059a414d --- /dev/null +++ b/.github/workflows/cmake-sdl1.yml @@ -0,0 +1,50 @@ +name: Oricutron Release on ubuntu-latest - cmake SDL1 GTK3 + +on: [push] + +env: + # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) + BUILD_TYPE: Release + +jobs: + build: + # The CMake configure and build commands are platform agnostic and should work equally + # well on Windows or Mac. You can convert this to a matrix build if you need + # cross-platform coverage. + # See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Install SDL1 GTK3 + run: sudo apt-get update -qq && sudo apt-get install libsdl1.2-dev -y && sudo apt-get install libgtk-3-dev -y + + - name: Create Build Environment + # Some projects don't allow in-source building, so create a separate build directory + # We'll use this as our working directory for all subsequent commands + run: cmake -E make_directory ${{github.workspace}}/build + + - name: Configure CMake + # Use a bash shell so we can use the same syntax for environment variable + # access regardless of the host operating system + shell: bash + working-directory: ${{github.workspace}}/build + # Note the current convention is to use the -S and -B options here to specify source + # and build directories, but this is only available with CMake 3.13 and higher. + # The CMake binaries on the Github Actions machines are (as of this writing) 3.12 + run: cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE + + - name: Build + working-directory: ${{github.workspace}}/build + shell: bash + # Execute the build. You can specify a specific target with "--target " + run: cmake --build . --config $BUILD_TYPE + +# We have no tests at the moment +# - name: Test +# working-directory: ${{github.workspace}}/build +# shell: bash +# # Execute tests defined by the CMake configuration. +# # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail +# run: ctest -C $BUILD_TYPE From 98e71c1cc07357a5ecc0a0f7f61630b34d865705 Mon Sep 17 00:00:00 2001 From: snowflake <309430+0ric1@users.noreply.github.com> Date: Sun, 7 Mar 2021 01:56:01 +0100 Subject: [PATCH 074/143] Fix memory leak sym bd500 (#173) * Create cmake.yml Execute a cmake build on every push * Update cmake.yml Add installing SDL2 and GTK3 * Create cmake-win64.yml Add action for building Oricutron for Windows 64-bit * Create codeql-analysis.yml * Delete codeql-analysis.yml * Add to ignore list /Oricutron /Oricutron-sdl2.exe /Oricutron.exe /SDL.dll /SDL2.dll /disks/*.dsk /pravdisks/*.dsk /teledisks/*.dsk * Update .gitignore Add Oricutron-sdl2 * Update .gitignore Add orix.rom to ignore list * Update CMakeLists.txt and documentation to support SDL and SDL2 builds with cmake. Use -DUSE_SDL2:BOOL=ON to build Oricutron with SDL2, default is SDL. Update CMakeLists.txt copyright, version and app info. * Update github workflows add cmake flag -DUSE_SDL2:BOOL=ON to build Oricutron with SDL2 * Update github workflows add cmake flag -DUSE_SDL2:BOOL=ON to build Oricutron with SDL2 * Update github workflows names * Add: github workflow build with SDL1 on Windows / Ubuntu * Fix: add missing gtk3 for sdl1 workflow, remove deprecated --force flag * Fix: memory leak sym_bd500 --- machine.c | 1 + 1 file changed, 1 insertion(+) diff --git a/machine.c b/machine.c index e7bd763e..036d2c18 100644 --- a/machine.c +++ b/machine.c @@ -2072,6 +2072,7 @@ void shut_machine( struct machine *oric ) if( oric->tapecap ) toggletapecap( oric, find_item_by_function(mainitems, toggletapecap), 0 ); if (oric->tapebuf) { free(oric->tapebuf); oric->tapebuf = NULL; } mon_freesyms( &sym_microdisc ); + mon_freesyms( &sym_bd500 ); mon_freesyms( &sym_jasmin ); mon_freesyms( &sym_pravetz ); mon_freesyms( &oric->romsyms ); From 1ef938856ebe8c68baa94a98fa5ffb4809aa3a82 Mon Sep 17 00:00:00 2001 From: iss Date: Sun, 7 Mar 2021 05:10:15 +0200 Subject: [PATCH 075/143] fix #174 --- gui.c | 16 ++++++++-------- main.c | 7 ++----- system_sdl.c | 48 +++++++++++++++++++++++------------------------- system_sdl.h | 2 +- 4 files changed, 34 insertions(+), 39 deletions(-) diff --git a/gui.c b/gui.c index 35b3a53a..6394706b 100644 --- a/gui.c +++ b/gui.c @@ -2148,7 +2148,7 @@ void swap_render_mode( struct machine *oric, struct osdmenuitem *mitem, int newr shut_gui( oric ); shut_joy( oric ); - SDL_COMPAT_Quit(); + SDL_COMPAT_Quit( SDL_FALSE ); need_sdl_quit = SDL_FALSE; // Go SDL! @@ -2160,23 +2160,19 @@ void swap_render_mode( struct machine *oric, struct osdmenuitem *mitem, int newr } need_sdl_quit = SDL_TRUE; -#ifndef __APPLE__ - SDL_COMPAT_WM_SetIcon( SDL_LoadBMP( IMAGEPREFIX"winicon.bmp" ), NULL ); -#endif - - if( !init_joy( oric ) ) + if( !init_gui( oric, newrendermode ) ) { oric->emu_mode = EM_PLEASEQUIT; return; } - if( !init_gui( oric, newrendermode ) ) + if( !ay_init( &oric->ay, oric ) ) { oric->emu_mode = EM_PLEASEQUIT; return; } - if( !ay_init( &oric->ay, oric ) ) + if( !init_joy( oric ) ) { oric->emu_mode = EM_PLEASEQUIT; return; @@ -2235,6 +2231,10 @@ void preinit_gui( struct machine *oric ) strcpy( snapfile, "" ); strcpy( mappingpath, FILEPREFIX"keymap" ); strcpy( mappingfile, "" ); + +#ifndef __APPLE__ + SDL_COMPAT_WM_SetIcon( SDL_LoadBMP( IMAGEPREFIX"winicon.bmp" ), NULL ); +#endif } // Ensure the sanity of toggle menuitems diff --git a/main.c b/main.c index 5d8114c0..8f3936e0 100644 --- a/main.c +++ b/main.c @@ -710,10 +710,6 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) } need_sdl_quit = SDL_TRUE; -#ifndef __APPLE__ - SDL_COMPAT_WM_SetIcon( SDL_LoadBMP( IMAGEPREFIX"winicon.bmp" ), NULL ); -#endif - render_sw_detectvideo( oric ); load_config( sto, oric ); @@ -1313,7 +1309,8 @@ void shut( struct machine *oric ) shut_msgbox( oric ); shut_gui( oric ); } - if( need_sdl_quit ) SDL_COMPAT_Quit(); + if( need_sdl_quit ) + SDL_COMPAT_Quit( SDL_TRUE ); } void frameloop_overclock( struct machine *oric, SDL_bool *framedone, SDL_bool *needrender ) diff --git a/system_sdl.c b/system_sdl.c index f206b995..4a85e760 100644 --- a/system_sdl.c +++ b/system_sdl.c @@ -67,7 +67,12 @@ #endif #if SDL_MAJOR_VERSION == 1 -/* NOP */ +static SDL_Surface* g_icon = NULL; + +static void FreeResources(void) +{ + // nope +} #else static SDL_bool g_fullscreen = SDL_FALSE; static SDL_GLContext g_glcontext = NULL; @@ -138,17 +143,7 @@ int SDL_COMPAT_GetWMInfo(SDL_SysWMinfo *info) } #endif - -#if SDL_MAJOR_VERSION == 1 -void SDL_COMPAT_WM_SetIcon(SDL_Surface *icon, Uint8 *mask) -{ - SDL_WM_SetIcon(icon, mask); -} -void SDL_COMPAT_WM_SetCaption(const char *title, const char *icon) -{ - SDL_WM_SetCaption(title, icon); -} -#else +// NOTE: same for both SDL versions void SDL_COMPAT_WM_SetIcon(SDL_Surface *icon, Uint8 *mask) { if(g_icon) @@ -157,10 +152,15 @@ void SDL_COMPAT_WM_SetIcon(SDL_Surface *icon, Uint8 *mask) g_icon = NULL; } if(icon) - { g_icon = icon; - } } + +#if SDL_MAJOR_VERSION == 1 +void SDL_COMPAT_WM_SetCaption(const char *title, const char *icon) +{ + SDL_WM_SetCaption(title, icon); +} +#else void SDL_COMPAT_WM_SetCaption(const char *title, const char *icon) { if(g_window) @@ -366,6 +366,12 @@ int SDL_COMPAT_WM_ToggleFullScreen(SDL_Surface *surface) #if SDL_MAJOR_VERSION == 1 SDL_Surface* SDL_COMPAT_SetVideoMode(int width, int height, int bitsperpixel, Uint32 flags) { + FreeResources(); + + // NOTE: SDL_WM_SetIcon function must be called before the first call to SDL_SetVideoMode. + if (g_icon) + SDL_WM_SetIcon(g_icon, NULL); + return SDL_SetVideoMode(width, height, bitsperpixel, flags); } #else @@ -391,9 +397,7 @@ SDL_Surface* SDL_COMPAT_SetVideoMode(int width, int height, int bitsperpixel, Ui 0, 0, SDL_WINDOW_FULLSCREEN_DESKTOP); #endif if (g_icon) - { SDL_SetWindowIcon(g_window, g_icon); - } if(flags & SDL_WINDOW_OPENGL) { @@ -444,16 +448,11 @@ void SDL_COMPAT_SetEventFilter(SDL_EventFilter filter) } #endif -#if SDL_MAJOR_VERSION == 1 -void SDL_COMPAT_Quit(void) -{ - SDL_Quit(); -} -#else -void SDL_COMPAT_Quit(void) +// NOTE: same for both SDL versions +void SDL_COMPAT_Quit(SDL_bool freeall) { FreeResources(); - if (g_icon) + if (g_icon && freeall) { // ...and the surface containing the icon pixel data is no longer required. SDL_FreeSurface(g_icon); @@ -461,7 +460,6 @@ void SDL_COMPAT_Quit(void) } SDL_Quit(); } -#endif #ifdef __OPENGL_AVAILABLE__ #if SDL_MAJOR_VERSION == 1 diff --git a/system_sdl.h b/system_sdl.h index 85d7ce8f..651eb950 100644 --- a/system_sdl.h +++ b/system_sdl.h @@ -145,7 +145,7 @@ int SDL_COMPAT_WM_ToggleFullScreen(SDL_Surface *surface); SDL_Surface* SDL_COMPAT_SetVideoMode(int width, int height, int bitsperpixel, Uint32 flags); int SDL_COMPAT_SetPalette(SDL_Surface *surface, int flags, SDL_Color *colors, int firstcolor, int ncolors); void SDL_COMPAT_SetEventFilter(SDL_EventFilter filter); -void SDL_COMPAT_Quit(void); +void SDL_COMPAT_Quit(SDL_bool freeall); void SDL_COMPAT_TakeScreenshot(char *fname); #ifdef __OPENGL_AVAILABLE__ From 3586cb54c8d05c9097596015b54291984ec7c5fb Mon Sep 17 00:00:00 2001 From: jede Date: Mon, 8 Mar 2021 17:32:57 +0100 Subject: [PATCH 076/143] Fix century and year bug (Assinie report) --- plugins/ds1501/ds1501.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/ds1501/ds1501.c b/plugins/ds1501/ds1501.c index 8f39fc8a..d22081ee 100644 --- a/plugins/ds1501/ds1501.c +++ b/plugins/ds1501/ds1501.c @@ -77,10 +77,10 @@ unsigned char ds1501_get_seconds(struct ds1501 *ds1501) { struct tm *now_tm; if (ds1501->seconds_delta_from_system==0) - { + { now_tm=ds1501_get_system_time(ds1501->seconds_delta_from_system); return ds1501_to_bcd(now_tm->tm_sec); - } + } else return ds1501->seconds_delta_from_system; @@ -129,7 +129,7 @@ unsigned char ds1501_get_day(struct ds1501 *ds1501) if (ds1501->day_delta_from_system==0) { now_tm=ds1501_get_system_time(ds1501->day_delta_from_system); - return ds1501_to_bcd(now_tm->tm_wday+1); // Because ds1501 return month between 1 and 12, but time.h returns 0 to 11 + return ds1501_to_bcd(now_tm->tm_wday+1); } else return ds1501->day_delta_from_system; @@ -154,7 +154,7 @@ unsigned char ds1501_get_year(struct ds1501 *ds1501) if (ds1501->year_delta_from_system==0) { now_tm=ds1501_get_system_time(ds1501->year_delta_from_system); - year=now_tm->tm_year & 0xFF; + year=now_tm->tm_year %100; return ds1501_to_bcd(year); } else @@ -168,8 +168,8 @@ unsigned char ds1501_get_century(struct ds1501 *ds1501) if (ds1501->century_delta_from_system==0) { now_tm=ds1501_get_system_time(ds1501->century_delta_from_system); - century=now_tm->tm_year/100; - return ds1501_to_bcd(century); // Because ds1501 return month between 1 and 12, but time.h returns 0 to 11 + century=now_tm->tm_year/100+19; + return ds1501_to_bcd(century); } else return ds1501->century_delta_from_system; From ed78e50aa58edeb7a3e907075c21183c46694932 Mon Sep 17 00:00:00 2001 From: Dan Chal Date: Wed, 10 Mar 2021 17:44:42 +0100 Subject: [PATCH 077/143] added example linux dependencies (#176) --- ReadMeNinjaCMakeBuild.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ReadMeNinjaCMakeBuild.md b/ReadMeNinjaCMakeBuild.md index b9074083..ac521261 100644 --- a/ReadMeNinjaCMakeBuild.md +++ b/ReadMeNinjaCMakeBuild.md @@ -10,6 +10,15 @@ SDL2, OpenGL SDL2, GTK-3 +e.g. UBUNTU 20.04 +``` cmake + ninja-build + libsdl1.2-dev + build-essential + libgtk-3-dev +``` + + ## Building ### Windows From 23e1eed4176026b4fe92e60ace8257677f6e4ade Mon Sep 17 00:00:00 2001 From: jedeoric Date: Wed, 10 Mar 2021 17:45:26 +0100 Subject: [PATCH 078/143] This PR contains a fix for a bug into bank emulation (Twilighte board) (#175) * Fix ram bank bug for twilighte board * Twilighte board emulation :fix bug for write * Fix bank bug emulation --- ReadMe.txt | 15 +- .../oric_twilighte_board_plugin.c | 764 +++++++++--------- 2 files changed, 405 insertions(+), 374 deletions(-) diff --git a/ReadMe.txt b/ReadMe.txt index ac97c221..9bcc98b8 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -471,6 +471,7 @@ CH376_CMD_DIR_CREATE create folder Twilighte board emulation =============== + The twilighte board is working on atmos (and Oric-1). It disables internal Oric ROM and add 64 banks (by bank switching). It adds 32 banks of ROM (eeprom) and 32 banks of RAM (Static RAM saved with a battery). EEprom can be programmed from Orix command line. @@ -479,7 +480,7 @@ And the board adds 2 joysticks ports. The emulation, for instance, handles 32 ROM banks and 32 RAM banks. It emulates this bank switching. -Board is not working with a microdisc. But jasmin does (mainly because jasmin does not replace rom at boot). +Board is working with a cumulus. Anyway, this part is not emulated and you need to switch to Telestrat mode to have this behavior. Anyway, on Telestrat, orix can start floppy disk because FDC is present. @@ -492,7 +493,17 @@ Not emulated parts : To activate the plugin, you must activate twilighte_board option in oricutron.cfg -Update twilighte.cfg plugin in plugins/twilighte_card/twilighte.cfg if you want to load others roms. +Update twilighte.cfg plugin in plugins/twilighte_card/twilighte.cfg if you want to load others roms. + +In order to start at least, minimal configuration, kernel.rom must be set in twilbankrom07 and shell.rom in twilbankrom05. + +Last roms can be found here : http://repo.orix.oric.org/dists/official/tgz/6502/ +* kernel.tgz contains kernel.rom +* shell.tgz contains shell.rom + +Under linux, sdcard folder and/or usbdrive folder must have uppercase filenames or else, no binaries can be started. You can mount a fat32 filesystem in sdcard or usbdrive. + +Filenames must be in uppercase, because usb chip manage by default FAT32 filesystem. For basic11 rom which handles joysticks and .tap load from sdcard or usbdrive, you have to download basic.tgz here : http://repo.orix.oric.org/dists/official/tgz/6502/ And you need to replace twilbankrom06 with the rom in basic11.tgz. diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index 05c8da54..d68dd5c1 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -1,372 +1,392 @@ - -#define TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA 0x323 -#define TWILIGHTE_CARD_ORIC_EXTENSION_DDRA 0x321 - -#define TWILIGHTE_CARD_ORIC_EXTENSION_VDDRB 0x322 -#define TWILIGHTE_CARD_ORIC_EXTENSION_DDRB 0x320 - -#define TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER 0x342 -#define TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER 0x343 - - - -#include -#include -#include -#include -#include - - -struct twilbankinfo -{ - unsigned char type; - unsigned char *ptr; -}; - -struct twilighte -{ - - unsigned char t_register; - unsigned char t_banking_register; - char twilrombankfiles[32][1024]; - - unsigned char twilrambankfiles[32][1024]; - - unsigned char twilrombankdata[32][16834]; - unsigned char twilrambankdata[32][16834]; - - - unsigned char VDDRA; - unsigned char DDRA; - - unsigned char VDDRB; - unsigned char DDRB; - unsigned char current_bank; - -}; - - -#include "../../system.h" - -extern SDL_bool read_config_string( char *buf, char *token, char *dest, Sint32 maxlen ); - -static SDL_bool load_rom_twilighte( char *fname, int size, unsigned char where[] ) -{ - SDL_RWops *f; - char *tmpname; - - // MinGW doesn't have asprintf :-( - tmpname = malloc( strlen( fname ) + 10 ); - if( !tmpname ) - { - return SDL_FALSE; - } - - sprintf( tmpname, "%s.rom", fname ); - f = SDL_RWFromFile( tmpname, "rb" ); - if( !f ) - { - error_printf( "Unable to open '%s'\n", tmpname ); - free( tmpname ); - return SDL_FALSE; - } - - if( size < 0 ) - { - int filesize; - SDL_RWseek( f, 0, SEEK_END ); - filesize = SDL_RWtell( f ); - SDL_RWseek( f, 0, SEEK_SET ); - - if( filesize > -size ) - { - error_printf( "ROM '%s' exceeds %d bytes.\n", fname, -size ); - SDL_RWclose( f ); - free( tmpname ); - return SDL_FALSE; - } - - where += (-size)-filesize; - size = filesize; - } - - if( SDL_RWread( f, where, size, 1 ) != 1 ) - { - error_printf( "Unable to read '%s'\n", tmpname ); - SDL_RWclose( f ); - free( tmpname ); - return SDL_FALSE; - } - - SDL_RWclose( f ); - free( tmpname ); - return SDL_TRUE; -} - -struct twilighte * twilighte_oric_init(void) -{ - - FILE *f; - unsigned int i, j; - // char *result; FIXME: unused - char tbtmp[32]; - char tbtmpram[32]; - char line[1024]; - struct twilighte *twilighte = malloc(sizeof(struct twilighte)); - twilighte->t_banking_register=0; - twilighte->t_register=128+1; // Firmware - - f = fopen( "plugins/twilighte_board/twilighte.cfg", "r" ); - if( !f ) - { - error_printf( "plugins/twilighte_board/twilighte.cfg not found\n" ); - return NULL; - } - - for( j=1; j<32; j++ ) - { - twilighte->twilrombankfiles[j][0]=0; - twilighte->twilrambankfiles[j][0]=0; - } - - while( !feof( f ) ) - { - /* NOTE: 'result' is unused: result= */ fgets( line, 1024, f ); - for( j=1; j<32; j++ ) - { - if (j > 9) - { - sprintf(tbtmp, "twilbankrom%d", j); - sprintf(tbtmpram, "twilbankram%d", j); - } - else - { - sprintf(tbtmp, "twilbankrom0%d", j); - sprintf(tbtmpram, "twilbankram0%d", j); - } - - if (twilighte->twilrombankfiles[j][0]==0) - { - if( read_config_string( line, tbtmp, twilighte->twilrombankfiles[j], 1024 ) ) - { - break; - } - } - if (twilighte->twilrambankfiles[j][0] == 0) - { - if (read_config_string(line, tbtmpram, (char*)twilighte->twilrambankfiles[j], 1024)) - { - break; - } - } - } - } - - fclose( f ); - - // Now load rom - for( i=0; i<32; i++ ) - { - if( twilighte->twilrombankfiles[i][0]!=0 ) - { - if( !load_rom_twilighte( twilighte->twilrombankfiles[i], -16384, twilighte->twilrombankdata[i] ) ) - { - error_printf("Cannot load %s",twilighte->twilrombankfiles[i]); - return NULL; - } - } - if (twilighte->twilrambankfiles[i][0] != 0) - { - if (!load_rom_twilighte((char*)twilighte->twilrambankfiles[i], -16384, twilighte->twilrambankdata[i])) - { - error_printf("Cannot load %s", twilighte->twilrambankfiles[i]); - return NULL; - } - } - } - - for (j=0;j<16384;j++) twilighte->twilrambankdata[0][j]=0; - - twilighte->DDRA=7+128+32; - twilighte->VDDRA=7; - twilighte->current_bank=7; - twilighte->DDRB=0; - return twilighte; -} - -unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uint16_t addr) { - unsigned char data; - unsigned char bank; - - if (twilighte->current_bank==0) - { - data=twilighte->twilrambankdata[0][addr]; - } - else - { - if (twilighte->current_bank<5) - { - if (twilighte->t_banking_register!=0) - bank=twilighte->current_bank+8-1+((twilighte->t_banking_register-1)*4); - else - bank=twilighte->current_bank; - } - else - bank=twilighte->current_bank; - - if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? - data=twilighte->twilrambankdata[bank][addr]; - else - data=twilighte->twilrombankdata[bank][addr]; - } - return data; -} - -unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uint16_t addr, unsigned char data) -{ - - unsigned char bank; - if (twilighte->current_bank==0) - { - twilighte->twilrambankdata[twilighte->current_bank][addr]=data; - } - else - { - if (twilighte->current_bank<5) - { - if (twilighte->t_banking_register!=0) - bank=twilighte->current_bank+8-1+((twilighte->t_banking_register-1)*4); - else - bank=twilighte->current_bank; - } - else - bank=twilighte->current_bank; - - if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? - twilighte->twilrambankdata[bank][addr]=data; - // ROM is readonly - } - return 0; -} - - -unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t addr) -{ - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) - { - return twilighte->t_register; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA) - { - return twilighte->VDDRA; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) - { - return twilighte->DDRA; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRB) - { - return twilighte->VDDRB;; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) - { - unsigned char data; - data=twilighte->VDDRB; - //twilighte->DDRB=twilighte->DDRB|1|2|4|8|16; - return data; - - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) - { - return twilighte->t_banking_register; - } - - return 0; -} - -unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t addr, unsigned char mask, unsigned char data) -{ - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA) - { - twilighte->VDDRA=data; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) - { - - if (mask==0) - { - twilighte->DDRA=data&(128+32+7); - } - if (mask==0xff) - twilighte->DDRA = twilighte->DDRA&data; - twilighte->current_bank=data&7; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRB) - { - twilighte->VDDRB=data; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) - { - - - if (mask==0x00) - { - unsigned char lastpb6; - unsigned char lastpb7; - - data=data&0xdf; - if (data==0) - { - twilighte->DDRB=0; - return 0; - } - - lastpb6=twilighte->DDRB&64; - lastpb7=twilighte->DDRB&128; - - - if (lastpb6 && data==64) return 0; - if (lastpb7 && data==128) return 0; - if (lastpb7 && lastpb6 && data==128+64) return 0; - - if (!lastpb6 && data==64) twilighte->DDRB=twilighte->DDRB+64; - if (!lastpb7 && data==128) twilighte->DDRB=twilighte->DDRB+128; - if (!lastpb7 && !lastpb6 && data==128+64) twilighte->DDRB=128+64; - - /* - twilighte->DDRB=data&(255); - - lastpb6=twilighte->DDRB&64; - lastpb7=twilighte->DDRB&128; - - if (lastpb6 || lastpb7) - */ - twilighte->DDRB=twilighte->DDRB|1|2|4|8|16; - - } - - - - - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) - { - twilighte->t_register=data; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) - { - twilighte->t_banking_register=data; - } - - return 0; -} +#define TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA 0x323 +#define TWILIGHTE_CARD_ORIC_EXTENSION_DDRA 0x321 + +#define TWILIGHTE_CARD_ORIC_EXTENSION_VDDRB 0x322 +#define TWILIGHTE_CARD_ORIC_EXTENSION_DDRB 0x320 + +#define TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER 0x342 +#define TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER 0x343 + +#include +#include +#include +#include +#include +#include "../../system.h" + +struct twilbankinfo +{ + unsigned char type; + unsigned char *ptr; +}; + +struct twilighte +{ + + unsigned char t_register; + unsigned char t_banking_register; + char twilrombankfiles[32][1024]; + + unsigned char twilrambankfiles[32][1024]; + + unsigned char twilrombankdata[32][16834]; + unsigned char twilrambankdata[32][16834]; + + unsigned char VDDRA; + unsigned char DDRA; + + unsigned char VDDRB; + unsigned char DDRB; + unsigned char current_bank; + +}; + +extern SDL_bool read_config_string( char *buf, char *token, char *dest, Sint32 maxlen ); + +static SDL_bool load_rom_twilighte( char *fname, int size, unsigned char where[] ) +{ + SDL_RWops *f; + char *tmpname; + + // MinGW doesn't have asprintf :-( + tmpname = malloc( strlen( fname ) + 10 ); + if( !tmpname ) + { + return SDL_FALSE; + } + + sprintf( tmpname, "%s.rom", fname ); + f = SDL_RWFromFile( tmpname, "rb" ); + if( !f ) + { + error_printf( "Unable to open '%s'\n", tmpname ); + free( tmpname ); + return SDL_FALSE; + } + + if( size < 0 ) + { + int filesize; + SDL_RWseek( f, 0, SEEK_END ); + filesize = SDL_RWtell( f ); + SDL_RWseek( f, 0, SEEK_SET ); + + if( filesize > -size ) + { + error_printf( "ROM '%s' exceeds %d bytes.\n", fname, -size ); + SDL_RWclose( f ); + free( tmpname ); + return SDL_FALSE; + } + + where += (-size)-filesize; + size = filesize; + } + + if( SDL_RWread( f, where, size, 1 ) != 1 ) + { + error_printf( "Unable to read '%s'\n", tmpname ); + SDL_RWclose( f ); + free( tmpname ); + return SDL_FALSE; + } + + SDL_RWclose( f ); + free( tmpname ); + return SDL_TRUE; +} + +int twilighte_oric_computebankid(struct twilighte *twilighte) +{ + + if (twilighte->t_register&32==32) // RAM access + { + if (twilighte->current_bank<5) + { + if (twilighte->t_banking_register!=0) + if ((twilighte->t_register&32)==32) // It is ram ? + return twilighte->current_bank+(twilighte->t_banking_register*4)-1; // Yes + else + { + switch(twilighte->t_banking_register) + { + case 0: + return twilighte->current_bank; + case 4: + return twilighte->current_bank+4; + case 5: + return twilighte->current_bank+20; + case 6: + return twilighte->current_bank+24; + case 7: + return twilighte->current_bank+28; + default: + return twilighte->current_bank+twilighte->t_banking_register*4+4; + } + + } + else + return twilighte->current_bank; + } + else + return twilighte->current_bank; + } + + return 0; +} + + +struct twilighte * twilighte_oric_init(void) +{ + FILE *f; + unsigned int i, j; + char tbtmp[32]; + char tbtmpram[32]; + char line[1024]; + struct twilighte *twilighte = malloc(sizeof(struct twilighte)); + twilighte->t_banking_register=0; + twilighte->t_register=128+1; // Firmware + + f = fopen( "plugins/twilighte_board/twilighte.cfg", "r" ); + if( !f ) + { + error_printf( "plugins/twilighte_board/twilighte.cfg not found\n" ); + return NULL; + } + + for( j=1; j<32; j++ ) + { + twilighte->twilrombankfiles[j][0]=0; + twilighte->twilrambankfiles[j][0]=0; + } + + while( !feof( f ) ) + { + /* NOTE: 'result' is unused: result= */ fgets( line, 1024, f ); + for( j=1; j<32; j++ ) + { + if (j > 9) + { + sprintf(tbtmp, "twilbankrom%d", j); + sprintf(tbtmpram, "twilbankram%d", j); + } + else + { + sprintf(tbtmp, "twilbankrom0%d", j); + sprintf(tbtmpram, "twilbankram0%d", j); + } + + if (twilighte->twilrombankfiles[j][0]==0) + { + if( read_config_string( line, tbtmp, twilighte->twilrombankfiles[j], 1024 ) ) + { + break; + } + } + if (twilighte->twilrambankfiles[j][0] == 0) + { + if (read_config_string(line, tbtmpram, (char*)twilighte->twilrambankfiles[j], 1024)) + { + break; + } + } + } + } + + fclose( f ); + + // Now load rom + for( i=0; i<32; i++ ) + { + if( twilighte->twilrombankfiles[i][0]!=0 ) + { + if( !load_rom_twilighte( twilighte->twilrombankfiles[i], -16384, twilighte->twilrombankdata[i] ) ) + { + error_printf("Cannot load %s",twilighte->twilrombankfiles[i]); + return NULL; + } + } + + if (twilighte->twilrambankfiles[i][0] != 0) + { + if (!load_rom_twilighte((char*)twilighte->twilrambankfiles[i], -16384, twilighte->twilrambankdata[i])) + { + error_printf("Cannot load %s", twilighte->twilrambankfiles[i]); + return NULL; + } + } + } + + for (j=0;j<16384;j++) twilighte->twilrambankdata[0][j]=0; + + twilighte->DDRA=7+128+32; + twilighte->VDDRA=7; + twilighte->current_bank=7; + twilighte->DDRB=0; + return twilighte; +} + +unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uint16_t addr) { + + unsigned char data; + unsigned char bank; + + if (twilighte->current_bank==0) + { + data=twilighte->twilrambankdata[0][addr]; + } + else + { + bank=twilighte_oric_computebankid(twilighte) ; + + if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? + data=twilighte->twilrambankdata[bank][addr]; + else + data=twilighte->twilrombankdata[bank][addr]; + } + return data; +} + +unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uint16_t addr, unsigned char data) +{ + + unsigned char bank; + if (twilighte->current_bank==0) + { + twilighte->twilrambankdata[twilighte->current_bank][addr]=data; + } + else + { + bank=twilighte_oric_computebankid(twilighte) ; + + if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? + twilighte->twilrambankdata[bank][addr]=data; + // ROM is readonly + } + return 0; +} + + +unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t addr) +{ + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) + { + return twilighte->t_register; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA) + { + return twilighte->VDDRA; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) + { + return twilighte->DDRA; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRB) + { + return twilighte->VDDRB;; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) + { + unsigned char data; + data=twilighte->VDDRB; + //twilighte->DDRB=twilighte->DDRB|1|2|4|8|16; + return data; + + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) + { + return twilighte->t_banking_register; + } + + return 0; +} + +unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t addr, unsigned char mask, unsigned char data) +{ + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA) + { + twilighte->VDDRA=data; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) + { + + if (mask==0) + { + twilighte->DDRA=data&(128+32+7); + } + + if (mask==0xff) + twilighte->DDRA = twilighte->DDRA&data; + + twilighte->current_bank=data&7; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRB) + { + twilighte->VDDRB=data; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) + { + + + if (mask==0x00) + { + unsigned char lastpb6; + unsigned char lastpb7; + + data=data&0xdf; + if (data==0) + { + twilighte->DDRB=0; + return 0; + } + + lastpb6=twilighte->DDRB&64; + lastpb7=twilighte->DDRB&128; + + + if (lastpb6 && data==64) return 0; + if (lastpb7 && data==128) return 0; + if (lastpb7 && lastpb6 && data==128+64) return 0; + + if (!lastpb6 && data==64) twilighte->DDRB=twilighte->DDRB+64; + if (!lastpb7 && data==128) twilighte->DDRB=twilighte->DDRB+128; + if (!lastpb7 && !lastpb6 && data==128+64) twilighte->DDRB=128+64; + + /* + twilighte->DDRB=data&(255); + + lastpb6=twilighte->DDRB&64; + lastpb7=twilighte->DDRB&128; + + if (lastpb6 || lastpb7) + */ + twilighte->DDRB=twilighte->DDRB|1|2|4|8|16; + + } + + + + + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) + { + twilighte->t_register=data; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) + { + twilighte->t_banking_register=data; + } + + return 0; +} + From 4f31787ca3a7c67c4cf119b15c1d4624b7c9e243 Mon Sep 17 00:00:00 2001 From: snowflake <309430+0ric1@users.noreply.github.com> Date: Thu, 11 Mar 2021 08:42:45 +0100 Subject: [PATCH 079/143] Update ReadMeNinjaCMakeBuild (#177) * Create cmake.yml Execute a cmake build on every push * Update cmake.yml Add installing SDL2 and GTK3 * Create cmake-win64.yml Add action for building Oricutron for Windows 64-bit * Create codeql-analysis.yml * Delete codeql-analysis.yml * Add to ignore list /Oricutron /Oricutron-sdl2.exe /Oricutron.exe /SDL.dll /SDL2.dll /disks/*.dsk /pravdisks/*.dsk /teledisks/*.dsk * Update .gitignore Add Oricutron-sdl2 * Update .gitignore Add orix.rom to ignore list * Update CMakeLists.txt and documentation to support SDL and SDL2 builds with cmake. Use -DUSE_SDL2:BOOL=ON to build Oricutron with SDL2, default is SDL. Update CMakeLists.txt copyright, version and app info. * Update github workflows add cmake flag -DUSE_SDL2:BOOL=ON to build Oricutron with SDL2 * Update github workflows add cmake flag -DUSE_SDL2:BOOL=ON to build Oricutron with SDL2 * Update github workflows names * Add: github workflow build with SDL1 on Windows / Ubuntu * Fix: add missing gtk3 for sdl1 workflow, remove deprecated --force flag * Fix: memory leak sym_bd500 * Update ReadMeNinjaCMakeBuild.md documentation * Add: openSUSE Leap-15-1 --- ReadMeNinjaCMakeBuild.md | 60 ++++++++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/ReadMeNinjaCMakeBuild.md b/ReadMeNinjaCMakeBuild.md index ac521261..4bfefc24 100644 --- a/ReadMeNinjaCMakeBuild.md +++ b/ReadMeNinjaCMakeBuild.md @@ -1,66 +1,84 @@ # Ninja + CMake Buildsystem for Oricutron +## Symbols used in this documentation + +[...] Optional steps + ## Dependencies ### Windows -SDL2, OpenGL +SDL1/2, OpenGL ### Linux -SDL2, GTK-3 +SDL1/2, GTK-3 + +## Preparation the Build System -e.g. UBUNTU 20.04 -``` cmake - ninja-build - libsdl1.2-dev - build-essential - libgtk-3-dev +### UBUNTU 18.04 / 20.04 + +```shell +sudo apt-get update +sudo apt install build-essential +sudo apt install cmake +sudo apt install ninja-build +sudo apt install libsdl1.2-dev +[sudo apt install libsdl2-dev] +sudo apt install libgtk-3-dev ``` +### openSUSE Leap-15-1 + +```shell +[sudo zypper refresh] +sudo zypper update +sudo zypper in cmake +sudo zypper in ninja +sudo zypper in libSDL-devel +[sudo zypper in libSDL2-devel] +sudo zypper in gtk3-devel +``` ## Building -### Windows +### Windows + Visual Studio 2019 + cmake + Ninja Open a Visual Studio Developer Command Prompt 2019 ```shell mkdir build\windows -cd build\windows +pushd build\windows cmake -GNinja ..\.. [-DUSE_SDL2:BOOL=ON] ninja copy Oricutron.exe ..\.. [copy Oricutron-sdl2.exe ..\..] -cd ..\.. +popd mklink SDL.dll msvc\vcpkg\installed\x64-windows\bin\SDL.dll -mklink SDL2.dll msvc\vcpkg\installed\x64-windows\bin\SDL2.dll +[mklink SDL2.dll msvc\vcpkg\installed\x64-windows\bin\SDL2.dll] Oricutron.exe [Oricutron-sdl2.exe] ``` -### Linux +### Linux + cmake + Ninja -Open a terminal (on Windows you can use WSL + e.g. Ubuntu) +Open a terminal (on Windows you can use e.g. WSL + Ubuntu) ```shell mkdir -p build/linux -cd build/linux +pushd build/linux cmake -GNinja ../.. [cmake -GNinja ../.. -DUSE_SDL2:BOOL=ON] ninja cp Oricutron ../.. [cp Oricutron-sdl2 ../..] -cd ../.. +popd ./Oricutron [./Oricutron-sdl2] ``` -### Linux + Windows - -Before starting Oricutron you must copy the roms and images directories and the configuration file +## Remarks Linux + Windows -to the `build/windows` and/or `build/linux` directory. +Before starting Oricutron you must copy your roms, disks and images to the appropriate folders and change the configuration file `oricutron.cfg` to your needs. On Windows with WSL you need VcXsrv X server for Windows to see the output. - From ffae427d49f2c50ffb20f526c6f25e6d4afd663a Mon Sep 17 00:00:00 2001 From: assnie Date: Tue, 4 May 2021 12:46:51 +0200 Subject: [PATCH 080/143] Fix SBC for decimal mode --- 6502.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/6502.c b/6502.c index 104b27bb..ecd608f0 100644 --- a/6502.c +++ b/6502.c @@ -162,14 +162,17 @@ void m6502_reset( struct m6502 *cpu ) // Macro to perform SBC logic #define DO_SBC if( cpu->f_d )\ {\ - r = (cpu->a&0xf) - (v&0xf) - (cpu->f_c^1);\ - if( r&0x10 ) r -= 6;\ - t = (cpu->a>>4) - (v>>4) - ((r&0x10)>>4);\ - if( t&0x10 ) t -= 6;\ - cpu->a = (r&0xf)|(t<<4);\ - cpu->f_c = (t>15) ? 0 : 1;\ - cpu->f_z = cpu->a==0;\ - cpu->f_n = cpu->a&0x80;\ + r = (cpu->a - v) - (cpu->f_c^1);\ + cpu->f_v = ((cpu->a^v)&(cpu->a^r)) & FF_N ? 1 : 0;\ + cpu->f_z = (r & 0xff) == 0;\ + cpu->f_n = (r & 0x80) != 0;\ + t = v& 0xf0;\ + r = (cpu->a & 0xf) - (v & 0xf) - (cpu->f_c^1);\ + if( r & 0x80 ) {r = (r-6) & 0x0f; t += 0x10;};\ + r = r + (cpu->a & 0xf0);\ + if (t > r) t += 0x60;\ + cpu->f_c = (cpu->a >= (v+(cpu->f_c^1))) ? 1 : 0;\ + cpu->a = r-t;\ } else {\ r = (cpu->a - v) - (cpu->f_c^1);\ cpu->f_v = ((cpu->a^v)&(cpu->a^r)) & FF_N ? 1 : 0;\ From 97f53b7bddecebe21ed78f9e529aa6b0d2118973 Mon Sep 17 00:00:00 2001 From: assnie Date: Tue, 4 May 2021 13:05:25 +0200 Subject: [PATCH 081/143] Fix ADC for decimal mode --- 6502.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/6502.c b/6502.c index ecd608f0..c51f849d 100644 --- a/6502.c +++ b/6502.c @@ -110,14 +110,16 @@ void m6502_reset( struct m6502 *cpu ) // Macro to perform ADC logic #define DO_ADC if( cpu->f_d )\ {\ + r = cpu->a + v + cpu->f_c;\ + cpu->f_z = (r & 0xff)==0;\ r = (cpu->a&0xf)+(v&0xf)+cpu->f_c;\ - if( r > 9 ) r += 6;\ - t = (cpu->a>>4)+(v>>4)+(r>15?1:0);\ - if( t > 9 ) t += 6;\ - cpu->a = (r&0xf)|(t<<4);\ - cpu->f_c = t>15 ? 1 : 0;\ - cpu->f_z = cpu->a==0;\ - cpu->f_n = cpu->a&0x80;\ + if( r > 9 ) r = ((r+6)& 0xf)+0x10;\ + t = (cpu->a & 0xf0)+(v & 0xf0)+r;\ + cpu->f_v = (~(cpu->a^v)&(cpu->a^t)) & FF_N ? 1 : 0;\ + cpu->f_n = (t&0x80) ? 1 : 0;\ + if (t >= 0xa0) t += 0x60;\ + cpu->a = t;\ + cpu->f_c = t>=0x100 ? 1 : 0;\ } else {\ r = cpu->a + v + cpu->f_c;\ cpu->f_v = (~(cpu->a^v)&(cpu->a^r)) & FF_N ? 1 : 0;\ From 930dd6640f0bd06bc52d9c129c758fc58ac4808f Mon Sep 17 00:00:00 2001 From: assinie Date: Mon, 17 May 2021 18:29:27 +0200 Subject: [PATCH 082/143] disk: improve ID mark search (#179) * disk: improve ID mark search * change eot test --- disk.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/disk.c b/disk.c index 9bd0876b..ebdae267 100644 --- a/disk.c +++ b/disk.c @@ -240,7 +240,8 @@ void diskimage_cachetrack( struct diskimage *dimg, int track, int side ) while( ptr < eot ) { // Search for ID mark - while( (ptr= eot ) break; From 1aebabefc708d14f92fc80d80c53899915ba59f1 Mon Sep 17 00:00:00 2001 From: iss Date: Mon, 17 May 2021 19:40:36 +0300 Subject: [PATCH 083/143] fix: optimized ID search and a warning --- disk.c | 2 +- .../oric_twilighte_board_plugin.c | 784 +++++++++--------- 2 files changed, 393 insertions(+), 393 deletions(-) diff --git a/disk.c b/disk.c index ebdae267..2c9a3d91 100644 --- a/disk.c +++ b/disk.c @@ -240,7 +240,7 @@ void diskimage_cachetrack( struct diskimage *dimg, int track, int side ) while( ptr < eot ) { // Search for ID mark - while( ((ptr+3) -#include -#include -#include -#include -#include "../../system.h" - -struct twilbankinfo -{ - unsigned char type; - unsigned char *ptr; -}; - -struct twilighte -{ - - unsigned char t_register; - unsigned char t_banking_register; - char twilrombankfiles[32][1024]; - - unsigned char twilrambankfiles[32][1024]; - - unsigned char twilrombankdata[32][16834]; - unsigned char twilrambankdata[32][16834]; - - unsigned char VDDRA; - unsigned char DDRA; - - unsigned char VDDRB; - unsigned char DDRB; - unsigned char current_bank; - -}; - -extern SDL_bool read_config_string( char *buf, char *token, char *dest, Sint32 maxlen ); - -static SDL_bool load_rom_twilighte( char *fname, int size, unsigned char where[] ) -{ - SDL_RWops *f; - char *tmpname; - - // MinGW doesn't have asprintf :-( - tmpname = malloc( strlen( fname ) + 10 ); - if( !tmpname ) - { - return SDL_FALSE; - } - - sprintf( tmpname, "%s.rom", fname ); - f = SDL_RWFromFile( tmpname, "rb" ); - if( !f ) - { - error_printf( "Unable to open '%s'\n", tmpname ); - free( tmpname ); - return SDL_FALSE; - } - - if( size < 0 ) - { - int filesize; - SDL_RWseek( f, 0, SEEK_END ); - filesize = SDL_RWtell( f ); - SDL_RWseek( f, 0, SEEK_SET ); - - if( filesize > -size ) - { - error_printf( "ROM '%s' exceeds %d bytes.\n", fname, -size ); - SDL_RWclose( f ); - free( tmpname ); - return SDL_FALSE; - } - - where += (-size)-filesize; - size = filesize; - } - - if( SDL_RWread( f, where, size, 1 ) != 1 ) - { - error_printf( "Unable to read '%s'\n", tmpname ); - SDL_RWclose( f ); - free( tmpname ); - return SDL_FALSE; - } - - SDL_RWclose( f ); - free( tmpname ); - return SDL_TRUE; -} - -int twilighte_oric_computebankid(struct twilighte *twilighte) -{ - - if (twilighte->t_register&32==32) // RAM access - { - if (twilighte->current_bank<5) - { - if (twilighte->t_banking_register!=0) - if ((twilighte->t_register&32)==32) // It is ram ? - return twilighte->current_bank+(twilighte->t_banking_register*4)-1; // Yes - else - { - switch(twilighte->t_banking_register) - { - case 0: - return twilighte->current_bank; - case 4: - return twilighte->current_bank+4; - case 5: - return twilighte->current_bank+20; - case 6: - return twilighte->current_bank+24; - case 7: - return twilighte->current_bank+28; - default: - return twilighte->current_bank+twilighte->t_banking_register*4+4; - } - - } - else - return twilighte->current_bank; - } - else - return twilighte->current_bank; - } - - return 0; -} - - -struct twilighte * twilighte_oric_init(void) -{ - FILE *f; - unsigned int i, j; - char tbtmp[32]; - char tbtmpram[32]; - char line[1024]; - struct twilighte *twilighte = malloc(sizeof(struct twilighte)); - twilighte->t_banking_register=0; - twilighte->t_register=128+1; // Firmware - - f = fopen( "plugins/twilighte_board/twilighte.cfg", "r" ); - if( !f ) - { - error_printf( "plugins/twilighte_board/twilighte.cfg not found\n" ); - return NULL; - } - - for( j=1; j<32; j++ ) - { - twilighte->twilrombankfiles[j][0]=0; - twilighte->twilrambankfiles[j][0]=0; - } - - while( !feof( f ) ) - { - /* NOTE: 'result' is unused: result= */ fgets( line, 1024, f ); - for( j=1; j<32; j++ ) - { - if (j > 9) - { - sprintf(tbtmp, "twilbankrom%d", j); - sprintf(tbtmpram, "twilbankram%d", j); - } - else - { - sprintf(tbtmp, "twilbankrom0%d", j); - sprintf(tbtmpram, "twilbankram0%d", j); - } - - if (twilighte->twilrombankfiles[j][0]==0) - { - if( read_config_string( line, tbtmp, twilighte->twilrombankfiles[j], 1024 ) ) - { - break; - } - } - if (twilighte->twilrambankfiles[j][0] == 0) - { - if (read_config_string(line, tbtmpram, (char*)twilighte->twilrambankfiles[j], 1024)) - { - break; - } - } - } - } - - fclose( f ); - - // Now load rom - for( i=0; i<32; i++ ) - { - if( twilighte->twilrombankfiles[i][0]!=0 ) - { - if( !load_rom_twilighte( twilighte->twilrombankfiles[i], -16384, twilighte->twilrombankdata[i] ) ) - { - error_printf("Cannot load %s",twilighte->twilrombankfiles[i]); - return NULL; - } - } - - if (twilighte->twilrambankfiles[i][0] != 0) - { - if (!load_rom_twilighte((char*)twilighte->twilrambankfiles[i], -16384, twilighte->twilrambankdata[i])) - { - error_printf("Cannot load %s", twilighte->twilrambankfiles[i]); - return NULL; - } - } - } - - for (j=0;j<16384;j++) twilighte->twilrambankdata[0][j]=0; - - twilighte->DDRA=7+128+32; - twilighte->VDDRA=7; - twilighte->current_bank=7; - twilighte->DDRB=0; - return twilighte; -} - -unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uint16_t addr) { - - unsigned char data; - unsigned char bank; - - if (twilighte->current_bank==0) - { - data=twilighte->twilrambankdata[0][addr]; - } - else - { - bank=twilighte_oric_computebankid(twilighte) ; - - if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? - data=twilighte->twilrambankdata[bank][addr]; - else - data=twilighte->twilrombankdata[bank][addr]; - } - return data; -} - -unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uint16_t addr, unsigned char data) -{ - - unsigned char bank; - if (twilighte->current_bank==0) - { - twilighte->twilrambankdata[twilighte->current_bank][addr]=data; - } - else - { - bank=twilighte_oric_computebankid(twilighte) ; - - if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? - twilighte->twilrambankdata[bank][addr]=data; - // ROM is readonly - } - return 0; -} - - -unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t addr) -{ - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) - { - return twilighte->t_register; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA) - { - return twilighte->VDDRA; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) - { - return twilighte->DDRA; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRB) - { - return twilighte->VDDRB;; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) - { - unsigned char data; - data=twilighte->VDDRB; - //twilighte->DDRB=twilighte->DDRB|1|2|4|8|16; - return data; - - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) - { - return twilighte->t_banking_register; - } - - return 0; -} - -unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t addr, unsigned char mask, unsigned char data) -{ - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA) - { - twilighte->VDDRA=data; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) - { - - if (mask==0) - { - twilighte->DDRA=data&(128+32+7); - } - - if (mask==0xff) - twilighte->DDRA = twilighte->DDRA&data; - - twilighte->current_bank=data&7; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRB) - { - twilighte->VDDRB=data; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) - { - - - if (mask==0x00) - { - unsigned char lastpb6; - unsigned char lastpb7; - - data=data&0xdf; - if (data==0) - { - twilighte->DDRB=0; - return 0; - } - - lastpb6=twilighte->DDRB&64; - lastpb7=twilighte->DDRB&128; - - - if (lastpb6 && data==64) return 0; - if (lastpb7 && data==128) return 0; - if (lastpb7 && lastpb6 && data==128+64) return 0; - - if (!lastpb6 && data==64) twilighte->DDRB=twilighte->DDRB+64; - if (!lastpb7 && data==128) twilighte->DDRB=twilighte->DDRB+128; - if (!lastpb7 && !lastpb6 && data==128+64) twilighte->DDRB=128+64; - - /* - twilighte->DDRB=data&(255); - - lastpb6=twilighte->DDRB&64; - lastpb7=twilighte->DDRB&128; - - if (lastpb6 || lastpb7) - */ - twilighte->DDRB=twilighte->DDRB|1|2|4|8|16; - - } - - - - - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) - { - twilighte->t_register=data; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) - { - twilighte->t_banking_register=data; - } - - return 0; -} - +#define TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA 0x323 +#define TWILIGHTE_CARD_ORIC_EXTENSION_DDRA 0x321 + +#define TWILIGHTE_CARD_ORIC_EXTENSION_VDDRB 0x322 +#define TWILIGHTE_CARD_ORIC_EXTENSION_DDRB 0x320 + +#define TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER 0x342 +#define TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER 0x343 + +#include +#include +#include +#include +#include +#include "../../system.h" + +struct twilbankinfo +{ + unsigned char type; + unsigned char *ptr; +}; + +struct twilighte +{ + + unsigned char t_register; + unsigned char t_banking_register; + char twilrombankfiles[32][1024]; + + unsigned char twilrambankfiles[32][1024]; + + unsigned char twilrombankdata[32][16834]; + unsigned char twilrambankdata[32][16834]; + + unsigned char VDDRA; + unsigned char DDRA; + + unsigned char VDDRB; + unsigned char DDRB; + unsigned char current_bank; + +}; + +extern SDL_bool read_config_string( char *buf, char *token, char *dest, Sint32 maxlen ); + +static SDL_bool load_rom_twilighte( char *fname, int size, unsigned char where[] ) +{ + SDL_RWops *f; + char *tmpname; + + // MinGW doesn't have asprintf :-( + tmpname = malloc( strlen( fname ) + 10 ); + if( !tmpname ) + { + return SDL_FALSE; + } + + sprintf( tmpname, "%s.rom", fname ); + f = SDL_RWFromFile( tmpname, "rb" ); + if( !f ) + { + error_printf( "Unable to open '%s'\n", tmpname ); + free( tmpname ); + return SDL_FALSE; + } + + if( size < 0 ) + { + int filesize; + SDL_RWseek( f, 0, SEEK_END ); + filesize = SDL_RWtell( f ); + SDL_RWseek( f, 0, SEEK_SET ); + + if( filesize > -size ) + { + error_printf( "ROM '%s' exceeds %d bytes.\n", fname, -size ); + SDL_RWclose( f ); + free( tmpname ); + return SDL_FALSE; + } + + where += (-size)-filesize; + size = filesize; + } + + if( SDL_RWread( f, where, size, 1 ) != 1 ) + { + error_printf( "Unable to read '%s'\n", tmpname ); + SDL_RWclose( f ); + free( tmpname ); + return SDL_FALSE; + } + + SDL_RWclose( f ); + free( tmpname ); + return SDL_TRUE; +} + +int twilighte_oric_computebankid(struct twilighte *twilighte) +{ + + if ((twilighte->t_register&32)==32) // RAM access + { + if (twilighte->current_bank<5) + { + if (twilighte->t_banking_register!=0) + if ((twilighte->t_register&32)==32) // It is ram ? + return twilighte->current_bank+(twilighte->t_banking_register*4)-1; // Yes + else + { + switch(twilighte->t_banking_register) + { + case 0: + return twilighte->current_bank; + case 4: + return twilighte->current_bank+4; + case 5: + return twilighte->current_bank+20; + case 6: + return twilighte->current_bank+24; + case 7: + return twilighte->current_bank+28; + default: + return twilighte->current_bank+twilighte->t_banking_register*4+4; + } + + } + else + return twilighte->current_bank; + } + else + return twilighte->current_bank; + } + + return 0; +} + + +struct twilighte * twilighte_oric_init(void) +{ + FILE *f; + unsigned int i, j; + char tbtmp[32]; + char tbtmpram[32]; + char line[1024]; + struct twilighte *twilighte = malloc(sizeof(struct twilighte)); + twilighte->t_banking_register=0; + twilighte->t_register=128+1; // Firmware + + f = fopen( "plugins/twilighte_board/twilighte.cfg", "r" ); + if( !f ) + { + error_printf( "plugins/twilighte_board/twilighte.cfg not found\n" ); + return NULL; + } + + for( j=1; j<32; j++ ) + { + twilighte->twilrombankfiles[j][0]=0; + twilighte->twilrambankfiles[j][0]=0; + } + + while( !feof( f ) ) + { + /* NOTE: 'result' is unused: result= */ fgets( line, 1024, f ); + for( j=1; j<32; j++ ) + { + if (j > 9) + { + sprintf(tbtmp, "twilbankrom%d", j); + sprintf(tbtmpram, "twilbankram%d", j); + } + else + { + sprintf(tbtmp, "twilbankrom0%d", j); + sprintf(tbtmpram, "twilbankram0%d", j); + } + + if (twilighte->twilrombankfiles[j][0]==0) + { + if( read_config_string( line, tbtmp, twilighte->twilrombankfiles[j], 1024 ) ) + { + break; + } + } + if (twilighte->twilrambankfiles[j][0] == 0) + { + if (read_config_string(line, tbtmpram, (char*)twilighte->twilrambankfiles[j], 1024)) + { + break; + } + } + } + } + + fclose( f ); + + // Now load rom + for( i=0; i<32; i++ ) + { + if( twilighte->twilrombankfiles[i][0]!=0 ) + { + if( !load_rom_twilighte( twilighte->twilrombankfiles[i], -16384, twilighte->twilrombankdata[i] ) ) + { + error_printf("Cannot load %s",twilighte->twilrombankfiles[i]); + return NULL; + } + } + + if (twilighte->twilrambankfiles[i][0] != 0) + { + if (!load_rom_twilighte((char*)twilighte->twilrambankfiles[i], -16384, twilighte->twilrambankdata[i])) + { + error_printf("Cannot load %s", twilighte->twilrambankfiles[i]); + return NULL; + } + } + } + + for (j=0;j<16384;j++) twilighte->twilrambankdata[0][j]=0; + + twilighte->DDRA=7+128+32; + twilighte->VDDRA=7; + twilighte->current_bank=7; + twilighte->DDRB=0; + return twilighte; +} + +unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uint16_t addr) { + + unsigned char data; + unsigned char bank; + + if (twilighte->current_bank==0) + { + data=twilighte->twilrambankdata[0][addr]; + } + else + { + bank=twilighte_oric_computebankid(twilighte) ; + + if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? + data=twilighte->twilrambankdata[bank][addr]; + else + data=twilighte->twilrombankdata[bank][addr]; + } + return data; +} + +unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uint16_t addr, unsigned char data) +{ + + unsigned char bank; + if (twilighte->current_bank==0) + { + twilighte->twilrambankdata[twilighte->current_bank][addr]=data; + } + else + { + bank=twilighte_oric_computebankid(twilighte) ; + + if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? + twilighte->twilrambankdata[bank][addr]=data; + // ROM is readonly + } + return 0; +} + + +unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t addr) +{ + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) + { + return twilighte->t_register; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA) + { + return twilighte->VDDRA; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) + { + return twilighte->DDRA; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRB) + { + return twilighte->VDDRB;; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) + { + unsigned char data; + data=twilighte->VDDRB; + //twilighte->DDRB=twilighte->DDRB|1|2|4|8|16; + return data; + + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) + { + return twilighte->t_banking_register; + } + + return 0; +} + +unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t addr, unsigned char mask, unsigned char data) +{ + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA) + { + twilighte->VDDRA=data; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) + { + + if (mask==0) + { + twilighte->DDRA=data&(128+32+7); + } + + if (mask==0xff) + twilighte->DDRA = twilighte->DDRA&data; + + twilighte->current_bank=data&7; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRB) + { + twilighte->VDDRB=data; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) + { + + + if (mask==0x00) + { + unsigned char lastpb6; + unsigned char lastpb7; + + data=data&0xdf; + if (data==0) + { + twilighte->DDRB=0; + return 0; + } + + lastpb6=twilighte->DDRB&64; + lastpb7=twilighte->DDRB&128; + + + if (lastpb6 && data==64) return 0; + if (lastpb7 && data==128) return 0; + if (lastpb7 && lastpb6 && data==128+64) return 0; + + if (!lastpb6 && data==64) twilighte->DDRB=twilighte->DDRB+64; + if (!lastpb7 && data==128) twilighte->DDRB=twilighte->DDRB+128; + if (!lastpb7 && !lastpb6 && data==128+64) twilighte->DDRB=128+64; + + /* + twilighte->DDRB=data&(255); + + lastpb6=twilighte->DDRB&64; + lastpb7=twilighte->DDRB&128; + + if (lastpb6 || lastpb7) + */ + twilighte->DDRB=twilighte->DDRB|1|2|4|8|16; + + } + + + + + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) + { + twilighte->t_register=data; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) + { + twilighte->t_banking_register=data; + } + + return 0; +} + From cb57f0f2dc5487bc7cf179ed1dd3e228ac5ce8f9 Mon Sep 17 00:00:00 2001 From: iss Date: Mon, 17 May 2021 20:46:45 +0300 Subject: [PATCH 084/143] reverting ID search to byte compare --- disk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/disk.c b/disk.c index 2c9a3d91..ebdae267 100644 --- a/disk.c +++ b/disk.c @@ -240,7 +240,7 @@ void diskimage_cachetrack( struct diskimage *dimg, int track, int side ) while( ptr < eot ) { // Search for ID mark - while( ((ptr+3) Date: Wed, 13 Oct 2021 00:25:53 +0200 Subject: [PATCH 085/143] Revert "Merge branch 'ds1501' into master" This reverts commit 8d358e565f28410a6fbe6fd6f2a73e81f55bf24a, reversing changes made to cb57f0f2dc5487bc7cf179ed1dd3e228ac5ce8f9. --- Makefile | 22 +- machine.c | 5 +- oricutron.cfg | 4 +- plugins/ch376/oric_ch376_plugin.c | 1 - plugins/ds1501/ds1501.c | 232 ------------------ plugins/ds1501/ds1501.h | 43 ---- .../oric_twilighte_board_plugin.c | 154 +----------- .../oric_twilighte_board_plugin.h | 1 + plugins/twilighte_board/twilighte.cfg | 6 - roms/kernel.rom | Bin 16384 -> 16384 bytes roms/shell.rom | Bin 16384 -> 16384 bytes 11 files changed, 18 insertions(+), 450 deletions(-) delete mode 100644 plugins/ds1501/ds1501.c delete mode 100644 plugins/ds1501/ds1501.h diff --git a/Makefile b/Makefile index 6d7f70d9..73cf7326 100644 --- a/Makefile +++ b/Makefile @@ -42,7 +42,7 @@ VERSION_COPYRIGHTS = "$(APP_NAME) $(VERSION_FULL) $(COPYRIGHTS)" ####### DEFAULT SETTINGS HERE ####### SRC_DIR = . -VPATH = $(SRC_DIR) $(SRC_DIR)/plugins/ch376 $(SRC_DIR)/plugins/twilighte_board $(SRC_DIR)/plugins/ds1501 +VPATH = $(SRC_DIR) $(SRC_DIR)/plugins/ch376 $(SRC_DIR)/plugins/twilighte_board ### extract git/svn revision GITREVISION = $(shell git rev-parse --short HEAD || svnversion -n $(SRC_DIR)) @@ -150,7 +150,7 @@ LFLAGS += `$(SDL_LIB)-config --libs` -s FILEREQ_OBJ = filereq_amiga.o MSGBOX_OBJ = msgbox_os2.o AMIGA_ICONS = pngicon -EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o ds1501.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o endif # AROS @@ -240,7 +240,7 @@ TARGET_DEPS = /usr/$(CROSS_PREFIX)/sys-root/mingw/bin/SDL.dll FILEREQ_OBJ = filereq_win32.o MSGBOX_OBJ = msgbox_win32.o CUSTOMOBJS = gui_win.o winicon.o -EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o ds1501.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o endif # Windows 64bit GCC @@ -287,7 +287,7 @@ TARGET_DEPS = /usr/$(CROSS_PREFIX)/sys-root/mingw/bin/SDL.dll FILEREQ_OBJ = filereq_win32.o MSGBOX_OBJ = msgbox_win32.o CUSTOMOBJS = gui_win.o winicon.o -EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o ds1501.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o endif # BeOS / Haiku @@ -311,7 +311,7 @@ INSTALLDIR = /boot/apps/Oricutron FILEREQ_OBJ = MSGBOX_OBJ = CUSTOMOBJS = gui_beos.o msgbox_beos.o filereq_beos.o -EXTRAOBJS = plugins/ch376/oric_ch376_plugin.o plugins/twilighte_board/oric_twilighte_board_plugin.o plugins/ds1501/ds1501.o +EXTRAOBJS = plugins/ch376/oric_ch376_plugin.o plugins/twilighte_board/oric_twilighte_board_plugin.o BEOS_BERES := beres BEOS_RC := rc BEOS_XRES := xres @@ -338,7 +338,7 @@ TARGET = $(TARGET_NAME) FILEREQ_OBJ = MSGBOX_OBJ = CUSTOMOBJS = gui_osx.o filereq_osx.o msgbox_osx.o -EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o ds1501.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o endif @@ -379,7 +379,7 @@ endif CFLAGS += -g $(shell PKG_CONFIG_PATH=/usr/$(BASELIBDIR)/pkgconfig pkg-config $(SDL_LIB) --cflags) -D__OPENGL_AVAILABLE__ -DAUDIO_BUFLEN=1024 -D__CBCOPY__ -D__CBPASTE__ LFLAGS += -lm -L/usr/$(BASELIBDIR) $(shell PKG_CONFIG_PATH=/usr/$(BASELIBDIR)/pkgconfig pkg-config $(SDL_LIB) --libs) -lGL -lX11 CUSTOMOBJS = gui_x11.o -EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o ds1501.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o TARGET = oricutron INSTALLDIR = /usr/local endif @@ -399,7 +399,7 @@ endif CFLAGS += -g $(SDL_CFLAGS) -D__OPENGL_AVAILABLE__ -DAUDIO_BUFLEN=1024 -D__CBCOPY__ -D__CBPASTE__ LFLAGS += -lm -L/usr/$(BASELIBDIR) $(SDL_LFLAGS) -lGL -lX11 CUSTOMOBJS = gui_x11.o -EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o ds1501.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o TARGET = $(TARGET_NAME) INSTALLDIR = /usr/local endif @@ -419,7 +419,7 @@ endif CFLAGS += -g $(SDL_CFLAGS) -D__OPENGL_AVAILABLE__ -DAUDIO_BUFLEN=1024 -D__CBCOPY__ -D__CBPASTE__ LFLAGS += -lm -L/usr/$(BASELIBDIR) $(SDL_LFLAGS) -lGL -lX11 CUSTOMOBJS = gui_x11.o -EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o ds1501.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o TARGET = $(TARGET_NAME) INSTALLDIR = /usr/local endif @@ -440,7 +440,7 @@ STRIP := $(CROSS_COMPILE)$(STRIP) CFLAGS += -g $(shell PKG_CONFIG_PATH=/usr/$(BASELIBDIR)/pkgconfig pkg-config $(SDL_LIB) --cflags) $(shell PKG_CONFIG_PATH=/usr/$(BASELIBDIR)/pkgconfig pkg-config gtk+-3.0 --cflags) -D__CBCOPY__ -D__CBPASTE__ LFLAGS += -lm -L/usr/$(BASELIBDIR) $(shell PKG_CONFIG_PATH=/usr/$(BASELIBDIR)/pkgconfig pkg-config $(SDL_LIB) --libs) $(shell PKG_CONFIG_PATH=/usr/$(BASELIBDIR)/pkgconfig pkg-config gtk+-3.0 --libs) -lX11 CUSTOMOBJS = gui_x11.o -EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o ds1501.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o FILEREQ_OBJ = filereq_gtk.o MSGBOX_OBJ = msgbox_gtk.o TARGET = oricutron @@ -504,7 +504,7 @@ AR = $(SDK_PREFIX)-ar RANLIB = $(SDK_PREFIX)-ranlib CFLAGS += `$(SDK_HOME)/env/bin/$(SDL_LIB)-config --cflags` LFLAGS += -Wl,--stack,256k -Wl,--msuper-memory -lm `$(SDK_HOME)/env/bin/$(SDL_LIB)-config --libs` -EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o ds1501.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o endif ####### SHOULDN'T HAVE TO CHANGE THIS STUFF ####### diff --git a/machine.c b/machine.c index 7471cf4a..036d2c18 100644 --- a/machine.c +++ b/machine.c @@ -328,8 +328,7 @@ void atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) else if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) ch376_oric_write(oric->ch376, addr, data); - else if(oric->twilighteboard_activated && ((0x342 <= addr && addr < 0x344 ) || (0x320 <= addr && addr < 0x330 ) || (0x360 <= addr && addr < 0x37F ))) - + else if(oric->twilighteboard_activated && ((0x342 <= addr && addr < 0x344 ) || (0x320 <= addr && addr < 0x330 ))) twilighteboard_oric_write(oric->twilighte,addr,0x00,data); else @@ -716,7 +715,7 @@ unsigned char atmosread( struct m6502 *cpu, unsigned short addr ) if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) return ch376_oric_read(oric->ch376, addr); - if( oric->twilighteboard_activated && ((0x342 <= addr && addr < 0x344 ) || (0x320 <= addr && addr < 0x330 ) || (0x360 <= addr && addr < 0x37F ))) + if( oric->twilighteboard_activated && ((0x342 <= addr && addr < 0x344 ) || (0x320 <= addr && addr < 0x330 ))) return twilighteboard_oric_read(oric->twilighte,addr); return via_read( &oric->via, addr ); diff --git a/oricutron.cfg b/oricutron.cfg index 97973b66..4fe3a574 100644 --- a/oricutron.cfg +++ b/oricutron.cfg @@ -217,5 +217,5 @@ kbjoy2_fire3 = 'LALT' ; ch376 chip emulation. This chip can read a usbkey. For more information : http://orix.oric.org ; only available in telestrat mode -ch376 = yes -twilighte_board=yes +ch376 = no +twilighte_board=no diff --git a/plugins/ch376/oric_ch376_plugin.c b/plugins/ch376/oric_ch376_plugin.c index 083633c4..0ad31017 100644 --- a/plugins/ch376/oric_ch376_plugin.c +++ b/plugins/ch376/oric_ch376_plugin.c @@ -15,7 +15,6 @@ #include "ch376.h" #include "stdio.h" - void dbg_printf(char *fmt, ...); #define CH376_ORIC_EXTENSION_DATA_PORT 0x340 diff --git a/plugins/ds1501/ds1501.c b/plugins/ds1501/ds1501.c deleted file mode 100644 index d22081ee..00000000 --- a/plugins/ds1501/ds1501.c +++ /dev/null @@ -1,232 +0,0 @@ -#include -#include - -#include "ds1501.h" - -struct tm *ds1501_get_system_time(unsigned char delta_seconds) -{ - time_t now; - struct tm *now_tm; - - now = time(NULL); - now_tm = localtime(&now); - return now_tm; -} - -unsigned char ds1501_to_bcd(unsigned char binaryInput) -{ - unsigned char bcdResult = 0; - unsigned char digit = 0; - unsigned char i=1; - - while (binaryInput > 0) { - - digit = binaryInput %10; //pick digit - bcdResult = bcdResult+digit*i; - i=16*i; - binaryInput = binaryInput/ 10; - } - return bcdResult; -} - - -struct ds1501 *ds1501_create(unsigned char battery_state) -{ - int i; - struct ds1501 *ds1501 = malloc(sizeof(struct ds1501)); - ds1501->seconds_delta_from_system=0; - ds1501->minutes_delta_from_system=0; - ds1501->hours_delta_from_system=0; - ds1501->date_delta_from_system=0; - ds1501->day_delta_from_system=0; - ds1501->month_delta_from_system=0; - ds1501->year_delta_from_system=0; - ds1501->century_delta_from_system=0; - ds1501->ctrlA_register=0; - ds1501->ctrlB_register=0; - ds1501_set_battery_state(ds1501,battery_state); - // initialize RAM - for (i=0;i<256;i++) - ds1501->internal_ram[i]=0; - return ds1501; -} - -void ds1501_set_internal_ram_adress_register(struct ds1501 *ds1501,unsigned char address) -{ - ds1501->internal_ram_adress_register=address; -} - -unsigned char ds1501_get_internal_ram(struct ds1501 *ds1501) -{ - return ds1501->internal_ram[ds1501->internal_ram_adress_register]; -} - -void ds1501_set_internal_ram(struct ds1501 *ds1501,unsigned char value) -{ - ds1501->internal_ram[ds1501->internal_ram_adress_register]=value; -} - - -void ds1501_reset(struct ds1501 *ds1501) -{ - // Get system time and set ds1501 register - -} - -unsigned char ds1501_get_seconds(struct ds1501 *ds1501) -{ - struct tm *now_tm; - if (ds1501->seconds_delta_from_system==0) - { - now_tm=ds1501_get_system_time(ds1501->seconds_delta_from_system); - return ds1501_to_bcd(now_tm->tm_sec); - } - else - return ds1501->seconds_delta_from_system; - -} - -unsigned char ds1501_get_minutes(struct ds1501 *ds1501) -{ - struct tm *now_tm; - if (ds1501->minutes_delta_from_system==0) - { - now_tm=ds1501_get_system_time(ds1501->minutes_delta_from_system); - return ds1501_to_bcd(now_tm->tm_min); - } - else - return ds1501->minutes_delta_from_system; - -} - -unsigned char ds1501_get_hours(struct ds1501 *ds1501) -{ - struct tm *now_tm; - if (ds1501->hours_delta_from_system==0) - { - now_tm=ds1501_get_system_time(ds1501->hours_delta_from_system); - return ds1501_to_bcd(now_tm->tm_hour); - } - else - return ds1501->hours_delta_from_system; -} - -unsigned char ds1501_get_date(struct ds1501 *ds1501) -{ - struct tm *now_tm; - if (ds1501->date_delta_from_system==0) - { - now_tm=ds1501_get_system_time(ds1501->date_delta_from_system); - return ds1501_to_bcd(now_tm->tm_mday); - } - else - return ds1501->date_delta_from_system; -} - -unsigned char ds1501_get_day(struct ds1501 *ds1501) -{ - struct tm *now_tm; - if (ds1501->day_delta_from_system==0) - { - now_tm=ds1501_get_system_time(ds1501->day_delta_from_system); - return ds1501_to_bcd(now_tm->tm_wday+1); - } - else - return ds1501->day_delta_from_system; -} - -unsigned char ds1501_get_month(struct ds1501 *ds1501) -{ - struct tm *now_tm; - if (ds1501->month_delta_from_system==0) - { - now_tm=ds1501_get_system_time(ds1501->month_delta_from_system); - return ds1501_to_bcd(now_tm->tm_mon+1); // Because ds1501 return month between 1 and 12, but time.h returns 0 to 11 - } - else - return ds1501->month_delta_from_system; -} - -unsigned char ds1501_get_year(struct ds1501 *ds1501) -{ - struct tm *now_tm; - unsigned char year; - if (ds1501->year_delta_from_system==0) - { - now_tm=ds1501_get_system_time(ds1501->year_delta_from_system); - year=now_tm->tm_year %100; - return ds1501_to_bcd(year); - } - else - return ds1501->year_delta_from_system; -} - -unsigned char ds1501_get_century(struct ds1501 *ds1501) -{ - struct tm *now_tm; - unsigned char century; - if (ds1501->century_delta_from_system==0) - { - now_tm=ds1501_get_system_time(ds1501->century_delta_from_system); - century=now_tm->tm_year/100+19; - return ds1501_to_bcd(century); - } - else - return ds1501->century_delta_from_system; - -} - -//write -void ds1501_write_seconds(struct ds1501 *ds1501,unsigned char seconds) -{ - ds1501->seconds_delta_from_system=seconds; -} - -void ds1501_write_minutes(struct ds1501 *ds1501,unsigned char minutes) -{ - ds1501->seconds_delta_from_system=minutes; -} - -void ds1501_write_hours(struct ds1501 *ds1501,unsigned char hours) -{ - ds1501->hours_delta_from_system=hours; -} - -void ds1501_write_date(struct ds1501 *ds1501,unsigned char date) -{ - ds1501->date_delta_from_system=date; -} - -void ds1501_write_day(struct ds1501 *ds1501,unsigned char day) -{ - ds1501->day_delta_from_system=day; -} - -void ds1501_write_month(struct ds1501 *ds1501,unsigned char month) -{ - ds1501->month_delta_from_system=month; -} - -void ds1501_write_year(struct ds1501 *ds1501,unsigned char year) -{ - ds1501->year_delta_from_system=year; -} - -void ds1501_write_century(struct ds1501 *ds1501,unsigned char century) -{ - ds1501->century_delta_from_system=century; -} - -void ds1501_set_battery_state(struct ds1501 *ds1501,unsigned char battery_state) -{ - if (battery_state==DS1501_BATTERY_FULL) - ds1501->ctrlA_register=ds1501->ctrlA_register|0x80; - else - ds1501->ctrlA_register=ds1501->ctrlA_register&0x7F; -} - - -void ds1501_destroy(struct ds1501 *ds1501) -{ - -} diff --git a/plugins/ds1501/ds1501.h b/plugins/ds1501/ds1501.h deleted file mode 100644 index 6579e09e..00000000 --- a/plugins/ds1501/ds1501.h +++ /dev/null @@ -1,43 +0,0 @@ -struct ds1501 *ds1501_create(unsigned char battery_state); -unsigned char ds1501_get_seconds(struct ds1501 *ds1501); -unsigned char ds1501_get_minutes(struct ds1501 *ds1501); -unsigned char ds1501_get_hours(struct ds1501 *ds1501); -unsigned char ds1501_get_date(struct ds1501 *ds1501); -unsigned char ds1501_get_day(struct ds1501 *ds1501); -unsigned char ds1501_get_month(struct ds1501 *ds1501); -unsigned char ds1501_get_century(struct ds1501 *ds1501); -unsigned char ds1501_get_year(struct ds1501 *ds1501); -void ds1501_write_seconds(struct ds1501 *ds1501,unsigned char seconds); -void ds1501_write_minutes(struct ds1501 *ds1501,unsigned char minutes); -void ds1501_write_hours(struct ds1501 *ds1501,unsigned char hours); -void ds1501_write_date(struct ds1501 *ds1501,unsigned char date); -void ds1501_write_day(struct ds1501 *ds1501,unsigned char day); -void ds1501_write_month(struct ds1501 *ds1501,unsigned char month); -void ds1501_write_year(struct ds1501 *ds1501,unsigned char year); -void ds1501_write_century(struct ds1501 *ds1501,unsigned char century); -void ds1501_set_battery_state(struct ds1501 *ds1501,unsigned char battery_state); -void ds1501_set_internal_ram_adress_register(struct ds1501 *ds1501,unsigned char address); -unsigned char ds1501_get_internal_ram(struct ds1501 *ds1501); -void ds1501_set_internal_ram(struct ds1501 *ds1501,unsigned char value); - -#define DS1501_BATTERY_FULL 0 -#define DS1501_BATTERY_EMPTY 1 - - -struct ds1501 -{ - unsigned char ctrlA_register; - unsigned char ctrlB_register; - unsigned char seconds_delta_from_system; - unsigned char minutes_delta_from_system; - unsigned char hours_delta_from_system; - unsigned char day_delta_from_system; - unsigned char date_delta_from_system; - unsigned char month_delta_from_system; - unsigned char year_delta_from_system; - unsigned char century_delta_from_system; - unsigned char internal_ram_adress_register; - unsigned char internal_ram[256]; - -}; - diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index 41fcf706..a2c85d04 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -12,26 +12,7 @@ #include #include #include - #include "../../system.h" -#include "../ds1501/ds1501.h" - -#define DS1501_SECONDS_REGISTER 0x360 -#define DS1501_MINUTES_REGISTER 0x361 -#define DS1501_HOUR_REGISTER 0x362 -#define DS1501_DAY_REGISTER 0x363 -#define DS1501_DATE_REGISTER 0x364 -#define DS1501_MONTH_REGISTER 0x365 -#define DS1501_YEAR_REGISTER 0x366 -#define DS1501_CENTURY_REGISTER 0x367 - -#define DS1501_ADDRESS_INTERNAL_RAM_REGISTER 0x370 -#define DS1501_DATA_INTERNAL_RAM_REGISTER 0x373 - -#define DS1501_CTRLA_REGISTER 0x36E -#define DS1501_CTRLB_REGISTER 0x36F - - struct twilbankinfo { @@ -51,11 +32,6 @@ struct twilighte unsigned char twilrombankdata[32][16834]; unsigned char twilrambankdata[32][16834]; - unsigned char firmware_version; - - struct ds1501 *rtc_ds1501; - unsigned char battery_state; - unsigned char VDDRA; unsigned char DDRA; @@ -67,10 +43,6 @@ struct twilighte extern SDL_bool read_config_string( char *buf, char *token, char *dest, Sint32 maxlen ); -extern SDL_bool read_config_int( char *buf, char *token, int *dest, int min, int max ); - - - static SDL_bool load_rom_twilighte( char *fname, int size, unsigned char where[] ) { SDL_RWops *f; @@ -173,9 +145,7 @@ struct twilighte * twilighte_oric_init(void) char line[1024]; struct twilighte *twilighte = malloc(sizeof(struct twilighte)); twilighte->t_banking_register=0; - twilighte->battery_state=0; twilighte->t_register=128+1; // Firmware - result=malloc(sizeof(unsigned char)*256); f = fopen( "plugins/twilighte_board/twilighte.cfg", "r" ); if( !f ) @@ -192,17 +162,7 @@ struct twilighte * twilighte_oric_init(void) while( !feof( f ) ) { - /* NOTE: 'result' is unused: result= */ fgets( line, 1024, f ); - - result=fgets( line, 1024, f ); - - - if( read_config_int( line, "twilighte_firmware", &twilighte->firmware_version, 1, 3 ) ) - twilighte->t_register=twilighte->t_register|twilighte->firmware_version; - - if( read_config_bool( line, "twilighte_battery_is_full", &twilighte->battery_state ) ) continue; - for( j=1; j<32; j++ ) { if (j > 9) @@ -263,11 +223,6 @@ struct twilighte * twilighte_oric_init(void) twilighte->VDDRA=7; twilighte->current_bank=7; twilighte->DDRB=0; - - if (twilighte->firmware_version==3) - twilighte->rtc_ds1501=ds1501_create(twilighte->battery_state); - - return twilighte; } @@ -338,64 +293,15 @@ unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t ad { unsigned char data; data=twilighte->VDDRB; + //twilighte->DDRB=twilighte->DDRB|1|2|4|8|16; return data; + } if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) { return twilighte->t_banking_register; } - - // Firmware 3 - if (twilighte->firmware_version>2) - { - if (addr==DS1501_SECONDS_REGISTER) - { - return ds1501_get_seconds(twilighte->rtc_ds1501); - } - - if (addr==DS1501_MINUTES_REGISTER) - { - return ds1501_get_minutes(twilighte->rtc_ds1501); - } - - if (addr==DS1501_HOUR_REGISTER) - { - return ds1501_get_hours(twilighte->rtc_ds1501); - } - - if (addr==DS1501_DAY_REGISTER) - { - return ds1501_get_day(twilighte->rtc_ds1501); - } - - if (addr==DS1501_DATE_REGISTER) - { - return ds1501_get_date(twilighte->rtc_ds1501); - } - - if (addr==DS1501_MONTH_REGISTER) - { - return ds1501_get_month(twilighte->rtc_ds1501); - } - - if (addr==DS1501_YEAR_REGISTER) - { - return ds1501_get_year(twilighte->rtc_ds1501); - } - - if (addr==DS1501_CENTURY_REGISTER) - { - return ds1501_get_century(twilighte->rtc_ds1501); - } - - if (addr==DS1501_DATA_INTERNAL_RAM_REGISTER) - { - return ds1501_get_internal_ram(twilighte->rtc_ds1501); - } - - - } return 0; } @@ -481,62 +387,6 @@ unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t a twilighte->t_banking_register=data; } - - // Firmware 3 - if (twilighte->firmware_version>2) - { - if (addr==DS1501_SECONDS_REGISTER) - { - ds1501_write_seconds(twilighte->rtc_ds1501,data); - } - - if (addr==DS1501_MINUTES_REGISTER) - { - ds1501_write_minutes(twilighte->rtc_ds1501,data); - } - - if (addr==DS1501_HOUR_REGISTER) - { - ds1501_write_hours(twilighte->rtc_ds1501,data); - } - - if (addr==DS1501_DAY_REGISTER) - { - ds1501_write_day(twilighte->rtc_ds1501,data); - } - - if (addr==DS1501_DATE_REGISTER) - { - ds1501_write_date(twilighte->rtc_ds1501,data); - } - - if (addr==DS1501_MONTH_REGISTER) - { - ds1501_write_month(twilighte->rtc_ds1501,data); - } - - if (addr==DS1501_YEAR_REGISTER) - { - ds1501_write_year(twilighte->rtc_ds1501,data); - } - - if (addr==DS1501_CENTURY_REGISTER) - { - ds1501_write_century(twilighte->rtc_ds1501,data); - } - - if (addr==DS1501_ADDRESS_INTERNAL_RAM_REGISTER) - { - ds1501_set_internal_ram_adress_register(twilighte->rtc_ds1501,data); - } - - if (addr==DS1501_DATA_INTERNAL_RAM_REGISTER) - { - ds1501_set_internal_ram(twilighte->rtc_ds1501,data); - } - } - - return 0; } diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.h b/plugins/twilighte_board/oric_twilighte_board_plugin.h index 69b12984..d70fc82a 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.h +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.h @@ -1,3 +1,4 @@ + struct twilighte * twilighte_oric_init(void); unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uint16_t addr) ; diff --git a/plugins/twilighte_board/twilighte.cfg b/plugins/twilighte_board/twilighte.cfg index b0d3c173..94f1475b 100644 --- a/plugins/twilighte_board/twilighte.cfg +++ b/plugins/twilighte_board/twilighte.cfg @@ -30,12 +30,6 @@ twilbankrom03='roms/basicus0' twilbankrom02='roms/empty_orix' twilbankrom01='roms/empty_orix' - -twilighte_firmware=1 -twilighte_battery_is_full=yes - - - ;twilbankram30='' ;twilbankram29='' ;twilbankram28='' diff --git a/roms/kernel.rom b/roms/kernel.rom index 33fe302b6dadfc61033c62ab6ac19a1c7de1e52b..f19cd83fc92413b827029278f4b304bdc108670b 100755 GIT binary patch delta 6890 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 delta 6977 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 Date: Fri, 22 Oct 2021 08:51:28 +0200 Subject: [PATCH 086/143] Fix indent --- .../oric_twilighte_board_plugin.c | 602 +++++++++--------- 1 file changed, 300 insertions(+), 302 deletions(-) diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index a2c85d04..0ec9596e 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -1,392 +1,390 @@ -#define TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA 0x323 -#define TWILIGHTE_CARD_ORIC_EXTENSION_DDRA 0x321 -#define TWILIGHTE_CARD_ORIC_EXTENSION_VDDRB 0x322 -#define TWILIGHTE_CARD_ORIC_EXTENSION_DDRB 0x320 +#define TWILIGHTE_CARD_ORIC_EXTENSION_DDRA 0x323 +#define TWILIGHTE_CARD_ORIC_EXTENSION_IORAh 0x321 + +#define TWILIGHTE_CARD_ORIC_EXTENSION_DDRB 0x322 +#define TWILIGHTE_CARD_ORIC_EXTENSION_IORB 0x320 #define TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER 0x342 #define TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER 0x343 +/* + * Port B + * 7 6 5 4 3 2 1 0 + * U D F L R + * +-> select left port + * +---> select right port + * + * Port A + * 7 6 5 4 3 2 1 0 + * +---+---> Bank # + * +--> Fire 3 + * +------> Fire 2 + * + * DDRx: bit 0 => bit en entre + * bit 1 => bit en sortie +*/ + #include #include #include #include #include -#include "../../system.h" + +#include "../../system_sdl.h" +SDL_bool read_config_int(char* buf, char* token, int* dest, int min, int max); +SDL_bool read_config_bool(char* buf, char* token, SDL_bool* dest); + + + struct twilbankinfo { - unsigned char type; - unsigned char *ptr; + unsigned char type; + unsigned char* ptr; }; struct twilighte { - unsigned char t_register; - unsigned char t_banking_register; - char twilrombankfiles[32][1024]; + unsigned char t_register; + unsigned char t_banking_register; + char twilrombankfiles[32][1024]; - unsigned char twilrambankfiles[32][1024]; + char twilrambankfiles[32][1024]; - unsigned char twilrombankdata[32][16834]; - unsigned char twilrambankdata[32][16834]; + unsigned char twilrombankdata[32][16834]; + unsigned char twilrambankdata[32][16834]; - unsigned char VDDRA; - unsigned char DDRA; + int firmware_version; - unsigned char VDDRB; - unsigned char DDRB; - unsigned char current_bank; + + unsigned char DDRA; + unsigned char IORAh; + + unsigned char DDRB; + unsigned char IORB; + unsigned char current_bank; }; -extern SDL_bool read_config_string( char *buf, char *token, char *dest, Sint32 maxlen ); -static SDL_bool load_rom_twilighte( char *fname, int size, unsigned char where[] ) + + + +#include "../../system.h" + +extern SDL_bool read_config_string(char* buf, char* token, char* dest, Sint32 maxlen); +///extern SDL_bool load_rom( struct machine *oric, char *fname, int size, unsigned char *where, struct symboltable *stab, int symflags ); + +static SDL_bool load_rom_twilighte(char* fname, int size, unsigned char where[]) { - SDL_RWops *f; - char *tmpname; - - // MinGW doesn't have asprintf :-( - tmpname = malloc( strlen( fname ) + 10 ); - if( !tmpname ) - { - return SDL_FALSE; - } - - sprintf( tmpname, "%s.rom", fname ); - f = SDL_RWFromFile( tmpname, "rb" ); - if( !f ) - { - error_printf( "Unable to open '%s'\n", tmpname ); - free( tmpname ); - return SDL_FALSE; - } - - if( size < 0 ) - { - int filesize; - SDL_RWseek( f, 0, SEEK_END ); - filesize = SDL_RWtell( f ); - SDL_RWseek( f, 0, SEEK_SET ); - - if( filesize > -size ) + SDL_RWops* f; + char* tmpname; + + // MinGW doesn't have asprintf :-( + tmpname = malloc(strlen(fname) + 10); + if (!tmpname) { + + return SDL_FALSE; + } + + sprintf(tmpname, "%s.rom", fname); + f = SDL_RWFromFile(tmpname, "rb"); + if (!f) { - error_printf( "ROM '%s' exceeds %d bytes.\n", fname, -size ); - SDL_RWclose( f ); - free( tmpname ); - return SDL_FALSE; + error_printf("Unable to open '%s'\n", tmpname); + free(tmpname); + return SDL_FALSE; } - where += (-size)-filesize; - size = filesize; - } - - if( SDL_RWread( f, where, size, 1 ) != 1 ) - { - error_printf( "Unable to read '%s'\n", tmpname ); - SDL_RWclose( f ); - free( tmpname ); - return SDL_FALSE; - } - - SDL_RWclose( f ); - free( tmpname ); - return SDL_TRUE; + if (size < 0) + { + int filesize; + SDL_RWseek(f, 0, SEEK_END); + filesize = SDL_RWtell(f); + SDL_RWseek(f, 0, SEEK_SET); + + if (filesize > -size) + { + error_printf("ROM '%s' exceeds %d bytes.\n", fname, -size); + SDL_RWclose(f); + free(tmpname); + return SDL_FALSE; + } + + where += (-size) - filesize; + size = filesize; + } + + if (SDL_RWread(f, where, size, 1) != 1) + { + error_printf("Unable to read '%s'\n", tmpname); + SDL_RWclose(f); + free(tmpname); + return SDL_FALSE; + } + + SDL_RWclose(f); + free(tmpname); + return SDL_TRUE; } -int twilighte_oric_computebankid(struct twilighte *twilighte) +struct twilighte* twilighte_oric_init(void) { - if ((twilighte->t_register&32)==32) // RAM access - { - if (twilighte->current_bank<5) + FILE* f; + unsigned int i, j; + char* result; + char tbtmp[32]; + char tbtmpram[32]; + char line[1024]; + struct twilighte* twilighte = malloc(sizeof(struct twilighte)); + twilighte->t_banking_register = 0; + + twilighte->t_register = 128 + 1; // Firmware + + f = fopen("plugins/twilighte_board/twilighte.cfg", "r"); + if (!f) { - if (twilighte->t_banking_register!=0) - if ((twilighte->t_register&32)==32) // It is ram ? - return twilighte->current_bank+(twilighte->t_banking_register*4)-1; // Yes - else - { - switch(twilighte->t_banking_register) - { - case 0: - return twilighte->current_bank; - case 4: - return twilighte->current_bank+4; - case 5: - return twilighte->current_bank+20; - case 6: - return twilighte->current_bank+24; - case 7: - return twilighte->current_bank+28; - default: - return twilighte->current_bank+twilighte->t_banking_register*4+4; - } + error_printf("plugins/twilighte_board/twilighte.cfg not found\n"); + return NULL; + } - } - else - return twilighte->current_bank; + for (j = 1; j < 32; j++) + { + twilighte->twilrombankfiles[j][0] = 0; + twilighte->twilrambankfiles[j][0] = 0; } - else - return twilighte->current_bank; - } - return 0; -} + while (!feof(f)) + { + result = fgets(line, 1024, f); -struct twilighte * twilighte_oric_init(void) -{ - FILE *f; - unsigned int i, j; - char tbtmp[32]; - char tbtmpram[32]; - char line[1024]; - struct twilighte *twilighte = malloc(sizeof(struct twilighte)); - twilighte->t_banking_register=0; - twilighte->t_register=128+1; // Firmware - - f = fopen( "plugins/twilighte_board/twilighte.cfg", "r" ); - if( !f ) - { - error_printf( "plugins/twilighte_board/twilighte.cfg not found\n" ); - return NULL; - } - - for( j=1; j<32; j++ ) - { - twilighte->twilrombankfiles[j][0]=0; - twilighte->twilrambankfiles[j][0]=0; - } - - while( !feof( f ) ) - { - /* NOTE: 'result' is unused: result= */ fgets( line, 1024, f ); - for( j=1; j<32; j++ ) - { - if (j > 9) - { - sprintf(tbtmp, "twilbankrom%d", j); - sprintf(tbtmpram, "twilbankram%d", j); - } - else - { - sprintf(tbtmp, "twilbankrom0%d", j); - sprintf(tbtmpram, "twilbankram0%d", j); - } - - if (twilighte->twilrombankfiles[j][0]==0) - { - if( read_config_string( line, tbtmp, twilighte->twilrombankfiles[j], 1024 ) ) + if (read_config_int(line, "twilighte_firmware", &twilighte->firmware_version, 1, 3)) { - break; + twilighte->t_register = twilighte->t_register | twilighte->firmware_version; + continue; } - } - if (twilighte->twilrambankfiles[j][0] == 0) - { - if (read_config_string(line, tbtmpram, (char*)twilighte->twilrambankfiles[j], 1024)) - { - break; - } - } - } - } - - fclose( f ); - - // Now load rom - for( i=0; i<32; i++ ) - { - if( twilighte->twilrombankfiles[i][0]!=0 ) - { - if( !load_rom_twilighte( twilighte->twilrombankfiles[i], -16384, twilighte->twilrombankdata[i] ) ) - { - error_printf("Cannot load %s",twilighte->twilrombankfiles[i]); - return NULL; - } - } - if (twilighte->twilrambankfiles[i][0] != 0) - { - if (!load_rom_twilighte((char*)twilighte->twilrambankfiles[i], -16384, twilighte->twilrambankdata[i])) + for (j = 1; j < 32; j++) { - error_printf("Cannot load %s", twilighte->twilrambankfiles[i]); - return NULL; + sprintf(tbtmp, "twilbankrom%02d", j); + sprintf(tbtmpram, "twilbankram%02d", j); + /* + if (j>9) + { + sprintf( tbtmp, "twilbankrom%d", j); + sprintf(tbtmpram, "twilbankram%d", j); + } + else + { + sprintf( tbtmp, "twilbankrom0%d", j); + sprintf(tbtmpram, "twilbankram0%d", j); + } + */ + if (twilighte->twilrombankfiles[j][0] == 0) + { + if (read_config_string(line, tbtmp, twilighte->twilrombankfiles[j], 1024)) + { + break; + } + } + + if (twilighte->twilrambankfiles[j][0] == 0) + { + if (read_config_string(line, tbtmpram, twilighte->twilrambankfiles[j], 1024)) + { + break; + } + } + } } - } - for (j=0;j<16384;j++) twilighte->twilrambankdata[0][j]=0; + fclose(f); - twilighte->DDRA=7+128+32; - twilighte->VDDRA=7; - twilighte->current_bank=7; - twilighte->DDRB=0; - return twilighte; -} + // Now load rom + for (i = 0; i < 32; i++) + { + if (twilighte->twilrombankfiles[i][0] != 0) + { + error_printf("Load bank (ROM) #%d: %s", i, twilighte->twilrombankfiles[i]); + if (!load_rom_twilighte(twilighte->twilrombankfiles[i], -16384, twilighte->twilrombankdata[i])) + { + error_printf("Cannot load %s", twilighte->twilrombankfiles[i]); + return NULL; + } + } -unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uint16_t addr) { + if (twilighte->twilrambankfiles[i][0] != 0) + { + error_printf("Load bank (RAM) #%d: %s", i, twilighte->twilrambankfiles[i]); + if (!load_rom_twilighte(twilighte->twilrambankfiles[i], -16384, twilighte->twilrambankdata[i])) + { + error_printf("Cannot load %s", twilighte->twilrambankfiles[i]); + return NULL; + } + } - unsigned char data; - unsigned char bank; + } + /* - if (twilighte->current_bank==0) - { - data=twilighte->twilrambankdata[0][addr]; - } - else - { - bank=twilighte_oric_computebankid(twilighte) ; + */ + // Flush sram (first bank) + for (j = 0; j < 16384; j++) twilighte->twilrambankdata[0][j] = 0; - if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? - data=twilighte->twilrambankdata[bank][addr]; - else - data=twilighte->twilrombankdata[bank][addr]; - } - return data; -} + twilighte->IORAh = 0x07; + twilighte->DDRA = 0b10100111; + twilighte->current_bank = 7; + twilighte->IORB = 0; + twilighte->DDRB = 0b11000000; -unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uint16_t addr, unsigned char data) -{ + - unsigned char bank; - if (twilighte->current_bank==0) - { - twilighte->twilrambankdata[twilighte->current_bank][addr]=data; - } - else - { - bank=twilighte_oric_computebankid(twilighte) ; - - if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? - twilighte->twilrambankdata[bank][addr]=data; - // ROM is readonly - } - return 0; + return twilighte; } - -unsigned char twilighteboard_oric_read(struct twilighte *twilighte, uint16_t addr) -{ - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) - { - return twilighte->t_register; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA) - { - return twilighte->VDDRA; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) - { - return twilighte->DDRA; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRB) - { - return twilighte->VDDRB;; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) - { +unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte* twilighte, uint16_t addr) { unsigned char data; - data=twilighte->VDDRB; - //twilighte->DDRB=twilighte->DDRB|1|2|4|8|16; - return data; - - } + unsigned char bank; - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) - { - return twilighte->t_banking_register; - } + if (twilighte->current_bank == 0) + { + data = twilighte->twilrambankdata[0][addr]; + } + else + { + if (twilighte->current_bank < 5) + { + if (twilighte->t_banking_register != 0) + bank = twilighte->current_bank + 8 + ((twilighte->t_banking_register - 1) * 4); + else + bank = twilighte->current_bank; + } + else + bank = twilighte->current_bank; - return 0; + if ((twilighte->t_register & 32) == 32 && twilighte->current_bank < 5) // Is it a ram bank access ? + data = twilighte->twilrambankdata[bank][addr]; + else + data = twilighte->twilrombankdata[bank][addr]; + } + return data; } -unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t addr, unsigned char mask, unsigned char data) +unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte* twilighte, uint16_t addr, unsigned char data) { - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRA) - { - twilighte->VDDRA=data; - } - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) - { - - if (mask==0) + unsigned char bank; + if (twilighte->current_bank == 0) { - twilighte->DDRA=data&(128+32+7); + twilighte->twilrambankdata[twilighte->current_bank][addr] = data; } + else + { + if (twilighte->current_bank < 5) + { + if (twilighte->t_banking_register != 0) + bank = twilighte->current_bank + 8 + ((twilighte->t_banking_register - 1) * 4); + else + bank = twilighte->current_bank; + } + else + bank = twilighte->current_bank; + + if ((twilighte->t_register & 32) == 32 && twilighte->current_bank < 5) // Is it a ram bank access ? + twilighte->twilrambankdata[bank][addr] = data; + // ROM is readonly + } + return 0; +} - if (mask==0xff) - twilighte->DDRA = twilighte->DDRA&data; - twilighte->current_bank=data&7; - } +unsigned char twilighteboard_oric_read(struct twilighte* twilighte, uint16_t addr) +{ + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) + { + return twilighte->t_register; + } - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_VDDRB) - { - twilighte->VDDRB=data; - } + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) + { + return twilighte->DDRA; + } - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) - { + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_IORAh) + { + return twilighte->IORAh; + } + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) + { + return twilighte->DDRB; + } - if (mask==0x00) + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_IORB) { - unsigned char lastpb6; - unsigned char lastpb7; + return twilighte->IORB; + } - data=data&0xdf; - if (data==0) - { - twilighte->DDRB=0; - return 0; - } + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) + { + return twilighte->t_banking_register; + } - lastpb6=twilighte->DDRB&64; - lastpb7=twilighte->DDRB&128; + + return 0; +} - if (lastpb6 && data==64) return 0; - if (lastpb7 && data==128) return 0; - if (lastpb7 && lastpb6 && data==128+64) return 0; +unsigned char twilighteboard_oric_write(struct twilighte* twilighte, uint16_t addr, unsigned char mask, unsigned char data) +{ + // mask: $00 => lecture/criture via + // mask: $ff => mise jour du port joystick - if (!lastpb6 && data==64) twilighte->DDRB=twilighte->DDRB+64; - if (!lastpb7 && data==128) twilighte->DDRB=twilighte->DDRB+128; - if (!lastpb7 && !lastpb6 && data==128+64) twilighte->DDRB=128+64; + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) + { + twilighte->DDRA = data; + } - /* - twilighte->DDRB=data&(255); + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_IORAh) + { - lastpb6=twilighte->DDRB&64; - lastpb7=twilighte->DDRB&128; + if (mask == 0) + twilighte->IORAh = data & twilighte->DDRA; + else + twilighte->IORAh = (twilighte->IORAh & twilighte->DDRA) | (data & (twilighte->DDRA ^ 0xff)); - if (lastpb6 || lastpb7) - */ - twilighte->DDRB=twilighte->DDRB|1|2|4|8|16; + twilighte->current_bank = twilighte->IORAh & 7; + } + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) + { + twilighte->DDRB = data; } + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_IORB) + { + if (mask == 0) + twilighte->IORB = data & twilighte->DDRB; + else + twilighte->IORB = (twilighte->IORB & twilighte->DDRB) | (data & (twilighte->DDRB ^ 0xff)); + } + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) + { + twilighte->t_register = data; + } - } + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) + { + twilighte->t_banking_register = data; + } - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) - { - twilighte->t_register=data; - } - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) - { - twilighte->t_banking_register=data; - } - return 0; + return 0; } - From d854916f0f085db176ceb34a066da92497ba8f0c Mon Sep 17 00:00:00 2001 From: jedeoric Date: Fri, 22 Oct 2021 09:12:34 +0200 Subject: [PATCH 087/143] Cleaning --- plugins/ch376/oric_ch376_plugin.c | 50 +++++++++++++++---------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/plugins/ch376/oric_ch376_plugin.c b/plugins/ch376/oric_ch376_plugin.c index 0ad31017..8289ef4a 100644 --- a/plugins/ch376/oric_ch376_plugin.c +++ b/plugins/ch376/oric_ch376_plugin.c @@ -23,53 +23,53 @@ void dbg_printf(char *fmt, ...); struct ch376 * ch376_oric_init() { - return ch376_create(NULL); + return ch376_create(NULL); } void ch376_oric_reset(struct ch376 *ch376) { - ch376_reset(ch376); + ch376_reset(ch376); } void ch376_oric_destroy(struct ch376 *ch376) { - ch376_destroy(ch376); + ch376_destroy(ch376); } void ch376_oric_config(struct ch376 *ch376) { - ch376_set_sdcard_drive_path(ch376, "sdcard/"); - ch376_set_usb_drive_path(ch376, "usbdrive/"); + ch376_set_sdcard_drive_path(ch376, "sdcard/"); + ch376_set_usb_drive_path(ch376, "usbdrive/"); } void ch376_oric_write(struct ch376 *ch376, Uint16 addr, Uint8 data) { - if (addr == CH376_ORIC_EXTENSION_DATA_PORT) - { - ch376_write_data_port(ch376, data); - } + if (addr == CH376_ORIC_EXTENSION_DATA_PORT) + { + ch376_write_data_port(ch376, data); + } - if (addr == CH376_ORIC_EXTENSION_COMMAND_PORT) - { - ch376_write_command_port(ch376, data); - } + if (addr == CH376_ORIC_EXTENSION_COMMAND_PORT) + { + ch376_write_command_port(ch376, data); + } } unsigned char ch376_oric_read(struct ch376 *ch376, Uint16 addr) { - unsigned char temp; - if (addr == CH376_ORIC_EXTENSION_DATA_PORT) - { - temp=ch376_read_data_port(ch376); - return temp; - } + unsigned char temp; + if (addr == CH376_ORIC_EXTENSION_DATA_PORT) + { + temp=ch376_read_data_port(ch376); + return temp; + } - if (addr == CH376_ORIC_EXTENSION_COMMAND_PORT) - { - temp=ch376_read_command_port(ch376); - return temp; - } - return 0; + if (addr == CH376_ORIC_EXTENSION_COMMAND_PORT) + { + temp=ch376_read_command_port(ch376); + return temp; + } + return 0; } From 663ca03ae5b5fd7e23868d810d6f24639b4678c8 Mon Sep 17 00:00:00 2001 From: Cedric PAILLE Date: Thu, 31 Mar 2022 18:41:26 +0200 Subject: [PATCH 088/143] Add monitor memory search (#180) * Add monitor memory search * Add help * Better memory search view * Back to mp keyword + Fix cmake for SDL2 build --- CMakeLists.txt | 18 ++++++---- ReadMe.txt | 4 +++ monitor.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 105 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 16a04f74..f735eb8e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,19 +40,21 @@ if (WIN32) endif (WIN32) if (UNIX) - # Use the package PkgConfig to detect GTK+ headers/library files - find_package(PkgConfig REQUIRED) - PKG_CHECK_MODULES(GTK3 REQUIRED gtk+-3.0) if (USE_SDL2) find_package(SDL2 REQUIRED) - + find_package(OpenGL) # Setup CMake to use GTK+ and SDL2, tell the compiler where to look for headers # and to the linker where to look for libraries include_directories(${GTK3_INCLUDE_DIRS} ${SDL2_INCLUDE_DIRS}) - link_directories(${GTK3_LIBRARY_DIRS}) + if (OPENGL_FOUND) + add_definitions(-D__OPENGL_AVAILABLE__) + endif(OPENGL_FOUND) add_definitions(${GTK3_CFLAGS_OTHER} -DSDL_MAJOR_VERSION=2 -D__SPECIFY_SDL_DIR__=1 -DAPP_NAME_FULL="${ORICUTRON_APPNAME_FULL}" -DAPP_YEAR="${ORICUTRON_APPYEAR}" -DVERSION_COPYRIGHTS="${ORICUTRON_VERSION_COPYRIGHTS}") else() + # Use the package PkgConfig to detect GTK+ headers/library files + find_package(PkgConfig REQUIRED) + PKG_CHECK_MODULES(GTK3 REQUIRED gtk+-3.0) find_package(SDL REQUIRED) # Setup CMake to use GTK+ and SDL, tell the compiler where to look for headers @@ -92,9 +94,11 @@ SET (SRCGTK SET (SRCSDL filereq_sdl.c + gui_x11.c msgbox_sdl.c ) + SET (SRCSWIN filereq_win32.c gui_win.c @@ -146,8 +150,8 @@ endif (WIN32) if (UNIX) if (USE_SDL2) - add_executable(Oricutron-sdl2 ${SRCS} ${SRCGTK}) - target_link_libraries(Oricutron-sdl2 ${GTK3_LIBRARIES} ${SDL2_LIBRARIES}) + add_executable(Oricutron-sdl2 ${SRCS} ${SRCSDL}) + target_link_libraries(Oricutron-sdl2 ${OPENGL_LIBRARIES} ${SDL2_LIBRARIES}) else() add_executable(Oricutron ${SRCS} ${SRCGTK}) target_link_libraries(Oricutron ${GTK3_LIBRARIES} SDL GL X11) diff --git a/ReadMe.txt b/ReadMe.txt index 9bcc98b8..5b3ec8c5 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -37,6 +37,7 @@ Credits Kamel Biskri Iss Christian from defence-force forum + Cedric Paille Amiga & Windows ports @@ -298,6 +299,9 @@ Commands: m - Dump memory mm - Modify memory mw - Memory watch at addr + ms - Search value in RAM memory + mr - Refine search with new value + mp - Print memory search addresses nl - Load snapshot ns - Save snapshot r - Set to diff --git a/monitor.c b/monitor.c index bf9b33b3..5a9b68b4 100644 --- a/monitor.c +++ b/monitor.c @@ -87,6 +87,7 @@ static int ilen, iloff=0, cursx, histu=0, histp=-1; static unsigned short mon_addr, mon_asmmode = SDL_FALSE; static SDL_bool kshifted = SDL_FALSE, updatepreview = SDL_FALSE; static int helpcount=0; +static int memory_search_pos=0; static struct symboltable defaultsyms; @@ -110,6 +111,8 @@ static struct via via2_old; static SDL_bool via2_oldvalid = SDL_FALSE; static SDL_bool modified = SDL_FALSE; +static uint16_t memory_search[0x9800-0x0500]; +static int memory_hits= 0; // 12345678901 12345678 static struct msym defsym_tele[] = { { 0x0300, 0, "VIA_IORB" , "VIA_IORB" , "VIA_IORB" }, { 0x0301, 0, "VIA_IORA" , "VIA_IORA" , "VIA_IORA" }, @@ -2944,6 +2947,88 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) switch( cmd[i] ) { + case 's': + lastcmd = 0; + i++; + + if( !mon_getnum( oric, &w, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) + { + mon_str( "Value expected" ); + break; + } + memory_search_pos = 0; + uint16_t* collection = memory_search; + memory_hits = 0; + for (int j=0x500; j < 0x9800; j++){ + unsigned char byte = mon_read( oric, j ); + if ((unsigned char)w == byte){ + *collection++ = j; + memory_hits++; + } + } + sprintf( vsptmp, "Found %i match(es)", memory_hits ); + mon_str(vsptmp); + break; + + case 'r': + lastcmd = 0; + i++; + + if( !mon_getnum( oric, &w, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) + { + mon_str( "Value expected" ); + break; + } + + memory_search_pos = 0; + int newhits = 0; + for (int j = 0; j < memory_hits; j++){ + int16_t curr_mem_addr = memory_search[j]; + unsigned char byte = mon_read( oric, curr_mem_addr ); + if ((unsigned char)w == byte){ + memory_search[newhits++] = curr_mem_addr; + } + } + memory_hits = newhits; + + sprintf( vsptmp, "Refined match(es) : %i", memory_hits ); + mon_str( vsptmp ); + break; + + case 'p': + { + lastcmd = 0; + + int lines = 0; + char tmp[16]; + int j, k = 0; + + vsptmp[0] = 0; + for (j = memory_search_pos; j < memory_hits; j++, k++){ + unsigned char byte = mon_read( oric, memory_search[j] ); + sprintf( tmp, "[%04X]:[%02X] ", memory_search[j], byte ); + strcat( vsptmp, tmp ); + if (k == 4){ + mon_str( vsptmp ); + vsptmp[0] = 0; + lines++; + k = 0; + } + if (lines > 16){ + memory_search_pos = j; + break; + } + } + if (strlen( vsptmp )){ + mon_str( vsptmp ); + } + if ( j >= memory_hits ){ + memory_search_pos = 0; + lastcmd = 0; + } + break; + } + case 'm': lastcmd = 0; i++; @@ -3326,11 +3411,12 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) mon_str( " m - Dump memory" ); mon_str( " mm - Modify memory" ); mon_str( " mw - Memory watch at addr" ); + mon_str( " ms - Memory search" ); + mon_str( " mr - Memory search refine" ); + mon_str( " mp - Memory print search" ); mon_str( " nl - Load snapshot" ); mon_str( " ns - Save snapshot" ); mon_str( " r - Set to " ); - mon_str( " q, x or qm - Quit monitor" ); - mon_str( " qe - Quit emulator" ); mon_str( " sa - Add or move user sym." ); mon_str( " sk - Kill user symbol" ); mon_str( " sc - Symbols not case-sens." ); @@ -3339,13 +3425,13 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) mon_str( " sx - Export user symbols" ); mon_str( " sz - Zap user symbols" ); mon_str( " " ); - mon_str( " " ); mon_str( "---- MORE" ); helpcount++; break; case 2: - mon_str( " fd - Disassemble to file" ); + mon_str( " q, x or qm - Quit monitor" ); + mon_str( " qe - Quit emulator" ); mon_str( " fd - Disassemble to file" ); mon_str( " fw - Write mem to bin file" ); // ToDo: mon_str( " ft - Write mem to tap file" ); mon_str( " fr - Read bin file to mem" ); @@ -3362,8 +3448,6 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) mon_str( " " ); mon_str( " " ); mon_str( " " ); - mon_str( " " ); - mon_str( " " ); helpcount = 0; lastcmd = 0; break; From 4e06db76a82129a61684b9e0cdd4a3a9b7a8afff Mon Sep 17 00:00:00 2001 From: iss Date: Thu, 31 Mar 2022 20:31:42 +0300 Subject: [PATCH 089/143] update and cleanup (see ChangeLog for details) --- 8912.c | 42 +++++++++++++---- 8912.h | 5 +- ChangeLog.txt | 3 ++ machine.c | 1 + machine.h | 1 + main.c | 1 + monitor.c | 7 ++- oricutron.cfg | 4 ++ system_sdl.c | 126 +++++++++++++++++++++++++++++++------------------- tape.c | 4 +- via.c | 1 + 11 files changed, 133 insertions(+), 62 deletions(-) diff --git a/8912.c b/8912.c index 980bbe7e..6b3eb677 100644 --- a/8912.c +++ b/8912.c @@ -287,7 +287,7 @@ void ay_dowrite( struct ay8912 *ay, struct aywrite *aw ) ay->regs[aw->reg] = aw->val; ay->toneper[2] = (((ay->regs[AY_CHC_PER_H]&0xf)<<8)|ay->regs[AY_CHC_PER_L]) * TONETIME; break; - + case AY_STATUS: // Status ay->regs[aw->reg] = aw->val; ay->tonebit[0] = (aw->val&0x01)?1:0; @@ -315,7 +315,7 @@ void ay_dowrite( struct ay8912 *ay, struct aywrite *aw ) ay->vol[i] = voltab[aw->val&0xf]; ay->newout |= (1<regs[aw->reg] = aw->val; @@ -369,7 +369,8 @@ void ay_callback( void *dummy, Sint8 *stream, int length ) dcadjustave = 0; dcadjustmax = soundsilence; - tapenoise = ay->oric->tapenoise && ((!ay->oric->tapeturbo)||(ay->oric->rawtape)); + tapenoise = ay->soundloopon || (ay->oric->tapenoise && ((!ay->oric->tapeturbo)||(ay->oric->rawtape))); + if( !tapenoise ) ay->tapeout = 0; out = (Uint16 *)stream; @@ -378,7 +379,7 @@ void ay_callback( void *dummy, Sint8 *stream, int length ) actual_length = length/(2*sizeof(Uint16)); actual_length = (actual_length < AUDIO_BUFLEN)? actual_length : AUDIO_BUFLEN; actual_length = (actual_length < obtained.samples)? actual_length : obtained.samples; - + for( i=0,j=0; iccyc = ay->ccycle>>FPBITS; @@ -494,7 +495,7 @@ void ay_ticktock( struct ay8912 *ay, int cycles ) ay->oric->cpu.calcop = ay->oric->cpu.read( &ay->oric->cpu, ay->oric->cpu.calcpc ); } break; - + case MACH_ORIC1: case MACH_ORIC1_16K: if( ( ay->oric->cpu.pc == 0xe905 ) && ( ay->oric->romon ) ) @@ -529,7 +530,7 @@ void ay_ticktock( struct ay8912 *ay, int cycles ) ay->oric->auto_jasmin_reset = SDL_FALSE; } break; - + case MACH_ORIC1: case MACH_ORIC1_16K: if( ( ay->oric->cpu.pc == 0xe905 ) && ( ay->oric->romon ) ) @@ -629,6 +630,7 @@ SDL_bool ay_init( struct ay8912 *ay, struct machine *oric ) ay->creg = 0; // Current register to 0 ay->oric = oric; ay->soundon = soundavailable && soundon && (!warpspeed); + ay->soundloopon = oric->soundloopon; ay->currnoise = 0; ay->rndrack = 1; ay->logged = 0; @@ -726,7 +728,7 @@ void ay_modeset( struct ay8912 *ay ) ay->oric->via.write_port_a( &ay->oric->via, 0xff, ay->oric->porta_ay ); ay->oric->porta_is_ay = SDL_TRUE; break; - + case AYBMF_BDIR: // Write AY register if( ay->creg >= NUM_AY_REGS ) break; v = ay->oric->via.read_port_a( &ay->oric->via ); @@ -790,7 +792,7 @@ void ay_modeset( struct ay8912 *ay ) break; } break; - + case AYBMF_BDIR|AYBMF_BC1: // Set register ay->creg = ay->oric->via.read_port_a( &ay->oric->via ); break; @@ -821,3 +823,27 @@ void ay_set_bdir( struct ay8912 *ay, unsigned char state ) ay_modeset( ay ); } +void ay_soundloop( struct ay8912 *ay, unsigned char oldval, unsigned char newval) +{ + if( !ay->soundloopon ) + return; + + oldval &= 0x80; + newval &= 0x80; + + if( oldval == newval ) + return; + + ay_lockaudio( ay ); + if(ay->do_logcycle_reset) + { + ay->logcycle = ay->newlogcycle; + ay->do_logcycle_reset = SDL_FALSE; + } + if(ay->tlogged < TAPELOG_SIZE) + { + ay->tapelog[ay->tlogged].cycle = ay->logcycle; + ay->tapelog[ay->tlogged++].val = newval? 1 : 0; + } + ay_unlockaudio( ay ); +} diff --git a/8912.h b/8912.h index 4dddf061..66931c50 100644 --- a/8912.h +++ b/8912.h @@ -81,7 +81,7 @@ struct ay8912 Uint8 regs[NUM_AY_REGS], eregs[NUM_AY_REGS]; SDL_bool keystates[8], newnoise; SDL_bool soundon; - SDL_bool tapenoiseon; + SDL_bool soundloopon; Uint32 toneper[3], noiseper, envper; Uint16 tonebit[3], noisebit[3], vol[3], newout; Sint32 ct[3], ctn, cte; @@ -119,3 +119,6 @@ void ay_modeset( struct ay8912 *ay ); void ay_lockaudio( struct ay8912 *ay ); void ay_unlockaudio( struct ay8912 *ay ); void ay_flushlog( struct ay8912 *ay ); + +void ay_soundloop( struct ay8912 *ay, unsigned char oldval, unsigned char newval); + diff --git a/ChangeLog.txt b/ChangeLog.txt index 423df76d..806aceba 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -3,6 +3,9 @@ Oricutron ChangeLog pre-release changes (work in progress) -------------------------------------- +* Added monitor memory search (#180) (@cedricp) +* Added Sound loopback (useful to simulate speech software) +* Properly #ifdef-ed key_dump routines (define DEBUG_KEY_DUMP when build) * Added Android target platform * Updated BD500 for DOS70 * Added option to disable menu color scheme diff --git a/machine.c b/machine.c index 036d2c18..9350fd69 100644 --- a/machine.c +++ b/machine.c @@ -1181,6 +1181,7 @@ void preinit_machine( struct machine *oric ) oric->printenable = SDL_TRUE; oric->printfilter = SDL_TRUE; oric->dcadjust = SDL_TRUE; + oric->soundloopon = SDL_FALSE; oric->aciabackend = ACIA_TYPE_NONE; oric->aciaoffset = 0x31c; diff --git a/machine.h b/machine.h index 9780b4c1..24b45662 100644 --- a/machine.h +++ b/machine.h @@ -245,6 +245,7 @@ struct machine SDL_bool printenable; SDL_bool printfilter; SDL_bool dcadjust; + SDL_bool soundloopon; SDL_bool lightpen; Uint8 lightpenx, lightpeny; diff --git a/main.c b/main.c index 8f3936e0..8891465a 100644 --- a/main.c +++ b/main.c @@ -467,6 +467,7 @@ static void load_config( struct start_opts *sto, struct machine *oric ) if( read_config_bool( &sto->lctmp[i], "printenable", &oric->printenable ) ) continue; if( read_config_bool( &sto->lctmp[i], "printfilter", &oric->printfilter ) ) continue; if( read_config_bool( &sto->lctmp[i], "dcadjust", &oric->dcadjust ) ) continue; + if( read_config_bool( &sto->lctmp[i], "soundloopon", &oric->soundloopon ) ) continue; if( read_config_int( &sto->lctmp[i], "serial_address", &oric->aciaoffset, 0x310, 0x3fc ) ) continue; if( read_config_string( &sto->lctmp[i], "serial", oric->aciabackendname, ACIA_BACKEND_NAME_LEN ) ) { diff --git a/monitor.c b/monitor.c index 5a9b68b4..f387dc44 100644 --- a/monitor.c +++ b/monitor.c @@ -3417,6 +3417,8 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) mon_str( " nl - Load snapshot" ); mon_str( " ns - Save snapshot" ); mon_str( " r - Set to " ); + mon_str( " q, x or qm - Quit monitor" ); + mon_str( " qe - Quit emulator" ); mon_str( " sa - Add or move user sym." ); mon_str( " sk - Kill user symbol" ); mon_str( " sc - Symbols not case-sens." ); @@ -3430,8 +3432,7 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) break; case 2: - mon_str( " q, x or qm - Quit monitor" ); - mon_str( " qe - Quit emulator" ); mon_str( " fd - Disassemble to file" ); + mon_str( " fd - Disassemble to file" ); mon_str( " fw - Write mem to bin file" ); // ToDo: mon_str( " ft - Write mem to tap file" ); mon_str( " fr - Read bin file to mem" ); @@ -3448,6 +3449,8 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) mon_str( " " ); mon_str( " " ); mon_str( " " ); + mon_str( " " ); + mon_str( " " ); helpcount = 0; lastcmd = 0; break; diff --git a/oricutron.cfg b/oricutron.cfg index 4fe3a574..1ec42223 100644 --- a/oricutron.cfg +++ b/oricutron.cfg @@ -157,6 +157,10 @@ lightpen = no ; default enabled ;dcadjust = yes +; Enable sound loopback +; default disabled +;soundloopon = no + ; ACIA emulation back-end name: ; 'none' - no serial present ; 'loopback' - for testing - all TX data is returned to RX diff --git a/system_sdl.c b/system_sdl.c index 4a85e760..233c9f8e 100644 --- a/system_sdl.c +++ b/system_sdl.c @@ -234,74 +234,104 @@ int SDL_COMPAT_EnableUNICODE(int enable) } #endif +// NOTE: uncomment to have key codes in monitor mode +// dumped to con and to 'key_dump.txt' file +// #define DEBUG_KEY_DUMP +#ifdef DEBUG_KEY_DUMP +static FILE* fkd = 0; +static const char* skd = "key_dump.txt"; +#define key_dump(x...) \ +{ printf(x); if(!fkd) fkd=fopen(skd, "a"); \ + if(fkd) fprintf(fkd,x); } +#endif + #if SDL_MAJOR_VERSION == 1 SDL_COMPAT_KEY SDL_COMPAT_GetKeysymUnicode(SDL_KEYSYM keysym) { + // FIXME +#ifdef DEBUG_KEY_DUMP + char c = 0x7f & keysym.sym; c = (c < ' ')? ' ' : c; + key_dump("SDL : GetKeysymUnicode: " + "c=|%c| scancode=$%.4X, sym=$%.4X, mod=$%.4X, unicode=$%.4X -> unicode=$%.4X\n", + c, keysym.scancode, keysym.sym, keysym.mod, keysym.unicode, keysym.unicode); +#endif + // FIXME + return keysym.unicode; } SDL_COMPAT_KEY SDL_COMPAT_TranslateUnicode(SDL_KEYSYM keysym) { + // FIXME +#ifdef DEBUG_KEY_DUMP + char c = 0x7f & keysym.sym; c = (c < ' ')? ' ' : c; + key_dump("SDL : TranslateUnicode: " + "c=|%c| scancode=$%.4X, sym=$%.4X, mod=$%.4X, unicode=$%.4X -> unicode=$%.4X\n", + c, keysym.scancode, keysym.sym, keysym.mod, keysym.unicode, keysym.unicode); +#endif + // FIXME return keysym.unicode; } #else +SDL_COMPAT_KEY SDL_COMPAT_GetKeysymUnicode(SDL_KEYSYM keysym) +{ + // FIXME +#ifdef DEBUG_KEY_DUMP + char c = 0x7f & keysym.sym; c = (c < ' ')? ' ' : c; + key_dump("SDL2: GetKeysymUnicode: " + "c=|%c| scancode=$%.4X, sym=$%.4X, mod=$%.4X, unicode=----- -> keysym.sym=$%.4X\n", + c, keysym.scancode, keysym.sym, keysym.mod, keysym.sym); +#endif + // FIXME + return keysym.sym; +} SDL_COMPAT_KEY SDL_COMPAT_TranslateUnicode(SDL_KEYSYM keysym) { + // FIXME + SDL_COMPAT_KEY sym_out = keysym.sym; +#ifdef DEBUG_KEY_DUMP + SDL_COMPAT_KEY sym_in = keysym.sym; +#endif + // FIXME if(keysym.mod & KMOD_SHIFT) { switch(keysym.sym) { - case '0': - return ')'; - case '1': - return '!'; - case '2': - return '@'; - case '3': - return '#'; - case '4': - return '$'; - case '5': - return '%'; - case '6': - return '^'; - case '7': - return '&'; - case '8': - return '*'; - case '9': - return '('; - case ';': - return ':'; - case '\'': - return '"'; - case '\\': - return '|'; - case ',': - return '<'; - case '.': - return '>'; - case '/': - return '?'; - case '`': - return '~'; - case '-': - return '_'; - case '=': - return '+'; - case '[': - return '{'; - case ']': - return '}'; + case '0' : sym_out = ')'; break; + case '1' : sym_out = '!'; break; + case '2' : sym_out = '@'; break; + case '3' : sym_out = '#'; break; + case '4' : sym_out = '$'; break; + case '5' : sym_out = '%'; break; + case '6' : sym_out = '^'; break; + case '7' : sym_out = '&'; break; + case '8' : sym_out = '*'; break; + case '9' : sym_out = '('; break; + case ';' : sym_out = ':'; break; + case '\'' : sym_out = '"'; break; + case '\\' : sym_out = '|'; break; + case ',' : sym_out = '<'; break; + case '.' : sym_out = '>'; break; + case '/' : sym_out = '?'; break; + case '`' : sym_out = '~'; break; + case '-' : sym_out = '_'; break; + case '=' : sym_out = '+'; break; + case '[' : sym_out = '{'; break; + case ']' : sym_out = '}'; break; default: - keysym.sym = toupper(keysym.sym); + sym_out = keysym.sym = toupper(keysym.sym); break; } } - return keysym.sym; -} -SDL_COMPAT_KEY SDL_COMPAT_GetKeysymUnicode(SDL_KEYSYM keysym) -{ - return keysym.sym; + // FIXME +#ifdef DEBUG_KEY_DUMP + char c = 0x7f & keysym.sym; c = (c < ' ')? ' ' : c; + key_dump("SDL2: TranslateUnicode: " + "c=|%c| scancode=$%.4X, sym=$%.4X, mod=$%.4X, unicode=----- -> keysym.sym=$%.4X\n", + c, keysym.scancode, sym_in, keysym.mod, sym_out); +#endif + // FIXME + + return sym_out; } #endif diff --git a/tape.c b/tape.c index 76db3097..1c0f6c78 100644 --- a/tape.c +++ b/tape.c @@ -1381,8 +1381,6 @@ void tape_patches( struct machine *oric ) // Emulate the specified cpu-cycles time for the tape void tape_ticktock( struct machine *oric, int cycles ) { - Sint32 j; - // Update the counter since last PB7 toggle if( ( oric->tapecap ) && ( oric->tapecapcount != -1 ) ) oric->tapecapcount += cycles; @@ -1399,7 +1397,7 @@ void tape_ticktock( struct machine *oric, int cycles ) // is less 260. if( oric->vsynchack ) { - j = (0 == oric->vsync || 260 < oric->vsync); + unsigned char j = (0 == oric->vsync || 260 < oric->vsync); if( oric->via.cb1 != j ) via_write_CB1( &oric->via, j ); } diff --git a/via.c b/via.c index 46fffb6a..967d374f 100644 --- a/via.c +++ b/via.c @@ -687,6 +687,7 @@ void via_write( struct via *v, int offset, unsigned char data ) } if( v->w_iorb ) v->w_iorb( v, tmp ); if( v->orbchange ) v->orbchange( v ); + ay_soundloop( &v->oric->ay, tmp, data ); break; case VIA_IORA: v->ora = data; From c0376045cbc3ba626fb56a0e02ab9e2ec23af082 Mon Sep 17 00:00:00 2001 From: iss Date: Thu, 31 Mar 2022 22:04:13 +0300 Subject: [PATCH 090/143] update: auto-repeat commands in monitor mode --- monitor.c | 56 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/monitor.c b/monitor.c index f387dc44..3da4d73b 100644 --- a/monitor.c +++ b/monitor.c @@ -81,7 +81,8 @@ extern SDL_bool refreshstatus; static char distmp[128]; static unsigned short disaddrs[10]; -static char ibuf[128], lastcmd; +static char ibuf[128]; +unsigned char lastcmd; static char history[10][128]; static int ilen, iloff=0, cursx, histu=0, histp=-1; static unsigned short mon_addr, mon_asmmode = SDL_FALSE; @@ -113,6 +114,15 @@ static SDL_bool modified = SDL_FALSE; static uint16_t memory_search[0x9800-0x0500]; static int memory_hits= 0; + +// auto repeat commands +#define ARPT_HELP '?' +#define ARPT_MEMORY 'm' +#define ARPT_DISASM 'd' +#define ARPT_ASSEM 'a' +#define ARPT_QUIT 'q' +#define ARPT_SEARCH 0x80 + // 12345678901 12345678 static struct msym defsym_tele[] = { { 0x0300, 0, "VIA_IORB" , "VIA_IORB" , "VIA_IORB" }, { 0x0301, 0, "VIA_IORA" , "VIA_IORA" , "VIA_IORA" }, @@ -2576,7 +2586,7 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) switch( cmd[i] ) { case 'a': - lastcmd = cmd[i]; + lastcmd = ARPT_ASSEM; i++; if( mon_getnum( oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) @@ -2942,7 +2952,7 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) break; case 'm': - lastcmd = cmd[i]; + lastcmd = ARPT_MEMORY; i++; switch( cmd[i] ) @@ -2997,7 +3007,7 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) case 'p': { - lastcmd = 0; + lastcmd = ARPT_SEARCH; int lines = 0; char tmp[16]; @@ -3107,7 +3117,7 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) break; case 'd': - lastcmd = cmd[i]; + lastcmd = ARPT_DISASM; i++; if( mon_getnum( oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) mon_addr = v; @@ -3180,7 +3190,7 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) return SDL_FALSE; case 'q': - lastcmd = cmd[i]; + lastcmd = ARPT_QUIT; switch( cmd[i+1] ) { case 32: @@ -3381,7 +3391,7 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) break; case '?': - lastcmd = cmd[i]; + lastcmd = ARPT_HELP; switch( helpcount ) { case 0: @@ -3957,30 +3967,40 @@ static SDL_bool mon_console_keydown( SDL_Event *ev, struct machine *oric, SDL_bo case SDLK_KP_ENTER: mon_hide_curs(); ibuf[ilen] = 0; - if( ilen == 0 ) + if( 0 != lastcmd ) { switch( lastcmd ) { - case '?': - case 'm': - case 'd': + case ARPT_HELP: // '?' + case ARPT_MEMORY: // 'm' + case ARPT_DISASM: // 'd' ibuf[cursx++] = lastcmd; ibuf[cursx] = 0; ilen = 1; break; + case ARPT_SEARCH: // 'mp' + ibuf[cursx++] = 'm'; + ibuf[cursx++] = 'p'; + ibuf[cursx] = 0; + ilen = 2; + break; } + } else { - if( ( histu > 0 ) && ( strcmp( &history[0][0], ibuf ) == 0 ) ) + if ( 0 < ilen ) { - } else { - if( histu > 0 ) + if( ( histu > 0 ) && ( strcmp( &history[0][0], ibuf ) == 0 ) ) { - for( i=histu; i>0; i-- ) - strcpy( &history[i][0], &history[i-1][0] ); + } else { + if( histu > 0 ) + { + for( i=histu; i>0; i-- ) + strcpy( &history[i][0], &history[i-1][0] ); + } + strcpy( &history[0][0], ibuf ); + if( histu < 10 ) histu++; } - strcpy( &history[0][0], ibuf ); - if( histu < 10 ) histu++; } } histp = -1; From 3a75800027c8e90a8bccfa2ddf9e6ad28004f98f Mon Sep 17 00:00:00 2001 From: iss Date: Sun, 3 Apr 2022 23:48:28 +0300 Subject: [PATCH 091/143] fix: auto-repeat commands, $ or # fo hex numbers --- monitor.c | 51 +++++++++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/monitor.c b/monitor.c index 3da4d73b..8806b2ab 100644 --- a/monitor.c +++ b/monitor.c @@ -81,8 +81,7 @@ extern SDL_bool refreshstatus; static char distmp[128]; static unsigned short disaddrs[10]; -static char ibuf[128]; -unsigned char lastcmd; +static char ibuf[128], lastcmd; static char history[10][128]; static int ilen, iloff=0, cursx, histu=0, histp=-1; static unsigned short mon_addr, mon_asmmode = SDL_FALSE; @@ -116,12 +115,16 @@ static uint16_t memory_search[0x9800-0x0500]; static int memory_hits= 0; // auto repeat commands -#define ARPT_HELP '?' -#define ARPT_MEMORY 'm' -#define ARPT_DISASM 'd' -#define ARPT_ASSEM 'a' -#define ARPT_QUIT 'q' -#define ARPT_SEARCH 0x80 +enum +{ + ARPT_NULL = 0, + ARPT_SEARCH = 1, + ARPT_HELP = '?', + ARPT_MEMORY = 'm', + ARPT_DISASM = 'd', + ARPT_ASSEM = 'a', + ARPT_QUIT = 'q', +}; // 12345678901 12345678 static struct msym defsym_tele[] = { { 0x0300, 0, "VIA_IORB" , "VIA_IORB" , "VIA_IORB" }, @@ -2357,7 +2360,7 @@ SDL_bool mon_getnum( struct machine *oric, unsigned int *num, char *buf, int *of return SDL_TRUE; } - if( buf[i] == '$' ) + if( buf[i] == '$' || buf[i] == '#' ) { // Hex i++; @@ -3967,13 +3970,15 @@ static SDL_bool mon_console_keydown( SDL_Event *ev, struct machine *oric, SDL_bo case SDLK_KP_ENTER: mon_hide_curs(); ibuf[ilen] = 0; - if( 0 != lastcmd ) + if( 0 == ilen && 0 != lastcmd ) { switch( lastcmd ) { case ARPT_HELP: // '?' case ARPT_MEMORY: // 'm' case ARPT_DISASM: // 'd' + case ARPT_ASSEM: // 'a' + case ARPT_QUIT: // 'q', ibuf[cursx++] = lastcmd; ibuf[cursx] = 0; ilen = 1; @@ -3984,25 +3989,27 @@ static SDL_bool mon_console_keydown( SDL_Event *ev, struct machine *oric, SDL_bo ibuf[cursx] = 0; ilen = 2; break; + default: + lastcmd = 0; + ilen = 0; + break; } + } - } else { - if ( 0 < ilen ) + else if ( 0 < ilen ) + { + if( !( ( histu > 0 ) && ( strcmp( &history[0][0], ibuf ) == 0 ) ) ) { - if( ( histu > 0 ) && ( strcmp( &history[0][0], ibuf ) == 0 ) ) + if( histu > 0 ) { - } else { - if( histu > 0 ) - { - for( i=histu; i>0; i-- ) - strcpy( &history[i][0], &history[i-1][0] ); - - } - strcpy( &history[0][0], ibuf ); - if( histu < 10 ) histu++; + for( i=histu; i>0; i-- ) + strcpy( &history[i][0], &history[i-1][0] ); } + strcpy( &history[0][0], ibuf ); + if( histu < 10 ) histu++; } } + histp = -1; tzsetcol( tz[TZ_MONITOR], 2, 3 ); From 1e5481be53f9de73dbe0d42907fd0acc44be81dc Mon Sep 17 00:00:00 2001 From: jedeoric Date: Sat, 9 Apr 2022 15:44:17 +0200 Subject: [PATCH 092/143] remove debug --- .../oric_twilighte_board_plugin.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index 0ec9596e..3c59992c 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -1,9 +1,9 @@ -#define TWILIGHTE_CARD_ORIC_EXTENSION_DDRA 0x323 +#define TWILIGHTE_CARD_ORIC_EXTENSION_DDRA 0x323 #define TWILIGHTE_CARD_ORIC_EXTENSION_IORAh 0x321 -#define TWILIGHTE_CARD_ORIC_EXTENSION_DDRB 0x322 -#define TWILIGHTE_CARD_ORIC_EXTENSION_IORB 0x320 +#define TWILIGHTE_CARD_ORIC_EXTENSION_DDRB 0x322 +#define TWILIGHTE_CARD_ORIC_EXTENSION_IORB 0x320 #define TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER 0x342 #define TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER 0x343 @@ -21,8 +21,8 @@ * +--> Fire 3 * +------> Fire 2 * - * DDRx: bit 0 => bit en entre - * bit 1 => bit en sortie + * DDRx: bit à 0 => bit en entrée + * bit à 1 => bit en sortie */ #include @@ -210,7 +210,7 @@ struct twilighte* twilighte_oric_init(void) { if (twilighte->twilrombankfiles[i][0] != 0) { - error_printf("Load bank (ROM) #%d: %s", i, twilighte->twilrombankfiles[i]); + //error_printf("Load bank (ROM) #%d: %s", i, twilighte->twilrombankfiles[i]); if (!load_rom_twilighte(twilighte->twilrombankfiles[i], -16384, twilighte->twilrombankdata[i])) { error_printf("Cannot load %s", twilighte->twilrombankfiles[i]); @@ -220,7 +220,7 @@ struct twilighte* twilighte_oric_init(void) if (twilighte->twilrambankfiles[i][0] != 0) { - error_printf("Load bank (RAM) #%d: %s", i, twilighte->twilrambankfiles[i]); + //error_printf("Load bank (RAM) #%d: %s", i, twilighte->twilrambankfiles[i]); if (!load_rom_twilighte(twilighte->twilrambankfiles[i], -16384, twilighte->twilrambankdata[i])) { error_printf("Cannot load %s", twilighte->twilrambankfiles[i]); @@ -341,8 +341,8 @@ unsigned char twilighteboard_oric_read(struct twilighte* twilighte, uint16_t ad unsigned char twilighteboard_oric_write(struct twilighte* twilighte, uint16_t addr, unsigned char mask, unsigned char data) { - // mask: $00 => lecture/criture via - // mask: $ff => mise jour du port joystick + // mask: $00 => lecture/écriture via + // mask: $ff => mise à jour du port joystick if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) { From 14b6ad5c757ed919448a17b886dc8aa753854d45 Mon Sep 17 00:00:00 2001 From: jedeoric Date: Sat, 9 Apr 2022 15:46:40 +0200 Subject: [PATCH 093/143] remove rom in cfg --- plugins/twilighte_board/twilighte.cfg | 30 ++------------------------- 1 file changed, 2 insertions(+), 28 deletions(-) diff --git a/plugins/twilighte_board/twilighte.cfg b/plugins/twilighte_board/twilighte.cfg index 94f1475b..199c8d48 100644 --- a/plugins/twilighte_board/twilighte.cfg +++ b/plugins/twilighte_board/twilighte.cfg @@ -1,34 +1,8 @@ -twilbankrom31='roms/empty32' -twilbankrom30='roms/empty_orix' -twilbankrom29='roms/empty_orix' -twilbankrom28='roms/empty_orix' -twilbankrom27='roms/empty_orix' -twilbankrom26='roms/empty_orix' -twilbankrom25='roms/empty_orix' -twilbankrom24='roms/empty_orix' -twilbankrom23='roms/empty_orix' -twilbankrom22='roms/empty_orix' -twilbankrom21='roms/empty_orix' -twilbankrom20='roms/empty_orix' -twilbankrom19='roms/empty_orix' -twilbankrom18='roms/empty_orix' -twilbankrom17='roms/empty_orix' -twilbankrom16='roms/empty_orix' -twilbankrom15='roms/empty_orix' -twilbankrom14='roms/empty_orix' -twilbankrom13='roms/empty_orix' -twilbankrom12='roms/empty_orix' -twilbankrom11='roms/empty_noname11' -twilbankrom10='roms/empty10' -twilbankrom09='roms/empty9' -twilbankrom08='roms/empty8' + twilbankrom07='roms/kernel' twilbankrom06='roms/basicus2' twilbankrom05='roms/shell' -twilbankrom04='roms/basicus1' -twilbankrom03='roms/basicus0' -twilbankrom02='roms/empty_orix' -twilbankrom01='roms/empty_orix' + ;twilbankram30='' ;twilbankram29='' From 9c043a49194c59b1b0349e518ff2865b769a95e1 Mon Sep 17 00:00:00 2001 From: iss Date: Fri, 22 Apr 2022 17:09:59 +0300 Subject: [PATCH 094/143] fix: #182 and some cleanup --- monitor.c | 75 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 42 insertions(+), 33 deletions(-) diff --git a/monitor.c b/monitor.c index 8806b2ab..d2d6dc46 100644 --- a/monitor.c +++ b/monitor.c @@ -2967,21 +2967,24 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) if( !mon_getnum( oric, &w, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) { mon_str( "Value expected" ); - break; } - memory_search_pos = 0; - uint16_t* collection = memory_search; - memory_hits = 0; - for (int j=0x500; j < 0x9800; j++){ - unsigned char byte = mon_read( oric, j ); - if ((unsigned char)w == byte){ + else + { + Uint16* collection = memory_search; + memory_search_pos = 0; + memory_hits = 0; + for ( j=0x500; j < 0x9800; j++ ) + { + if ((unsigned char)w == mon_read( oric, j ) ) + { *collection++ = j; memory_hits++; + } } + sprintf( vsptmp, "Found %i match(es)", memory_hits ); + mon_str(vsptmp); } - sprintf( vsptmp, "Found %i match(es)", memory_hits ); - mon_str(vsptmp); - break; + break; case 'r': lastcmd = 0; @@ -2990,52 +2993,58 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) if( !mon_getnum( oric, &w, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) { mon_str( "Value expected" ); - break; } - - memory_search_pos = 0; - int newhits = 0; - for (int j = 0; j < memory_hits; j++){ - int16_t curr_mem_addr = memory_search[j]; - unsigned char byte = mon_read( oric, curr_mem_addr ); - if ((unsigned char)w == byte){ - memory_search[newhits++] = curr_mem_addr; + else + { + int newhits = 0; + memory_search_pos = 0; + for ( j = 0; j < memory_hits; j++ ) + { + Uint16 curr_mem_addr = memory_search[j]; + if ( (unsigned char)w == mon_read( oric, curr_mem_addr ) ) + { + memory_search[newhits++] = curr_mem_addr; + } } - } - memory_hits = newhits; + memory_hits = newhits; - sprintf( vsptmp, "Refined match(es) : %i", memory_hits ); - mon_str( vsptmp ); + sprintf( vsptmp, "Refined match(es) : %i", memory_hits ); + mon_str( vsptmp ); + } break; case 'p': { - lastcmd = ARPT_SEARCH; - - int lines = 0; char tmp[16]; + int lines = 0; int j, k = 0; + lastcmd = ARPT_SEARCH; vsptmp[0] = 0; - for (j = memory_search_pos; j < memory_hits; j++, k++){ - unsigned char byte = mon_read( oric, memory_search[j] ); - sprintf( tmp, "[%04X]:[%02X] ", memory_search[j], byte ); + + for ( j = memory_search_pos; j < memory_hits; j++, k++ ) + { + sprintf( tmp, "[%04X]:[%02X] ", memory_search[j], mon_read( oric, memory_search[j] ) ); strcat( vsptmp, tmp ); - if (k == 4){ + if (k == 4) + { mon_str( vsptmp ); vsptmp[0] = 0; lines++; k = 0; } - if (lines > 16){ + if (lines > 16) + { memory_search_pos = j; break; } } - if (strlen( vsptmp )){ + if (strlen( vsptmp )) + { mon_str( vsptmp ); } - if ( j >= memory_hits ){ + if ( j >= memory_hits ) + { memory_search_pos = 0; lastcmd = 0; } From 41100d26f0190710b056b228de5120afd4bc983e Mon Sep 17 00:00:00 2001 From: jede Date: Fri, 6 May 2022 22:52:43 +0200 Subject: [PATCH 095/143] add twilighte board registers into debugger --- ReadMe.txt | 2 +- gui.c | 1 + gui.h | 1 + monitor.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/ReadMe.txt b/ReadMe.txt index 5b3ec8c5..a87bae0c 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -245,7 +245,7 @@ Keys F1 - Go to the menu F2 - Return to the emulator F3 - Toggle console/debug output/memwatch - F4 - Toggle VIA/AY/disk information + F4 - Toggle VIA/AY/disk information/Twilighte board registers F9 - Reset cycle count F10 - Step over code F11 - Step over code without tracing into diff --git a/gui.c b/gui.c index 6394706b..d39d4d4c 100644 --- a/gui.c +++ b/gui.c @@ -2403,6 +2403,7 @@ SDL_bool init_gui( struct machine *oric, Sint32 rendermode ) if( !alloc_textzone( oric, TZ_VIA2, 400, 228, 30, 21, "Telestrat VIA Status" ) ) return SDL_FALSE; if( !alloc_textzone( oric, TZ_AY, 400, 228, 30, 21, "AY Status" ) ) return SDL_FALSE; if( !alloc_textzone( oric, TZ_DISK, 400, 228, 30, 21, "Disk Status" ) ) return SDL_FALSE; + if( !alloc_textzone( oric, TZ_TWIL, 400, 228, 30, 21, "Twilighte Status" ) ) return SDL_FALSE; // Set up SDL audio wanted.freq = AUDIO_FREQ; diff --git a/gui.h b/gui.h index da1e491e..1693f618 100644 --- a/gui.h +++ b/gui.h @@ -38,6 +38,7 @@ enum TZ_VIA2, TZ_AY, TZ_DISK, + TZ_TWIL, TZ_MENU, TZ_MSGBOX, TZ_FILEREQ, diff --git a/monitor.c b/monitor.c index d2d6dc46..b8958c7e 100644 --- a/monitor.c +++ b/monitor.c @@ -43,6 +43,7 @@ #include "ula.h" #include "tape.h" #include "snapshot.h" +#include "plugins/twilighte_board/oric_twilighte_board_plugin.h" #define LOG_DEBUG 0 @@ -197,6 +198,7 @@ enum MSHOW_VIA2, MSHOW_AY, MSHOW_DISK, + MSHOW_TWIL, MSHOW_LAST }; @@ -1643,6 +1645,40 @@ void mon_update_disk( struct machine *oric ) } } +void mon_update_twil( struct machine *oric ) +{ + if ( (oric->twilighteboard_activated == SDL_FALSE ) && (oric->ch376_activated == SDL_FALSE) ) + return; + + + if ( oric->twilighteboard_activated ) + { + tzprintfpos( tz[TZ_TWIL], 2, 2, "Board version = %02X", (twilighteboard_oric_read(oric->twilighte, 0x342) & 0x07) ); + tzprintfpos( tz[TZ_TWIL], 2, 4, "Bank set = %02X", twilighteboard_oric_read(oric->twilighte, 0x343) ); + tzprintfpos( tz[TZ_TWIL], 2, 5, "Bank number = %02X", (twilighteboard_oric_read(oric->twilighte, 0x321) & 0x07)); + tzprintfpos( tz[TZ_TWIL], 2, 6, "Bank type = %s" , (twilighteboard_oric_read(oric->twilighte, 0x342) & 0x20) ? "SRAM ": "EEPROM"); + tzprintfpos( tz[TZ_TWIL], 2, 9, "Twil register = %02X", twilighteboard_oric_read(oric->twilighte, 0x342) ); + tzprintfpos( tz[TZ_TWIL], 2, 10, "Bank register = %02X", twilighteboard_oric_read(oric->twilighte, 0x343) ); + tzprintfpos( tz[TZ_TWIL], 2, 12, "IORB = %02X", twilighteboard_oric_read(oric->twilighte, 0x320) ); + tzprintfpos( tz[TZ_TWIL], 2, 13, "IORAh = %02X", twilighteboard_oric_read(oric->twilighte, 0x321) ); + tzprintfpos( tz[TZ_TWIL], 2, 14, "DDRB = %02X", twilighteboard_oric_read(oric->twilighte, 0x322) ); + tzprintfpos( tz[TZ_TWIL], 2, 15, "DDRA = %02X", twilighteboard_oric_read(oric->twilighte, 0x323) ); + + } + + int offs = 8*tz[TZ_TWIL]->w+1; + for( int k=0; k<28; k++ ) + { + tz[TZ_TWIL]->tx[offs+k] = 2; + tz[TZ_TWIL]->bc[offs+k] = 3; + tz[TZ_TWIL]->fc[offs+k] = 2; + } + + if ( oric->ch376_activated ) + { + } +} + void mon_state_reset( struct machine *oric ) { mwatch_oldvalid = SDL_FALSE; @@ -1750,6 +1786,10 @@ void mon_update( struct machine *oric ) case MSHOW_DISK: mon_update_disk( oric ); break; + + case MSHOW_TWIL: + mon_update_twil( oric ); + break; } switch( cshow ) @@ -1783,6 +1823,10 @@ void mon_render( struct machine *oric ) case MSHOW_DISK: oric->render_textzone( oric, TZ_DISK ); break; + + case MSHOW_TWIL: + oric->render_textzone( oric, TZ_TWIL ); + break; } switch( cshow ) @@ -4295,6 +4339,8 @@ SDL_bool mon_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) mshow = (mshow+1)%MSHOW_LAST; if( ( oric->drivetype == DRV_NONE ) && ( mshow == MSHOW_DISK ) ) mshow = (mshow+1)%MSHOW_LAST; + if( ( oric->twilighteboard_activated == SDL_FALSE ) && ( mshow == MSHOW_TWIL ) ) + mshow = (mshow+1)%MSHOW_LAST; *needrender = SDL_TRUE; break; From 2df939c88a30b7c5fcc3868cc3066210e71ea965 Mon Sep 17 00:00:00 2001 From: iss Date: Sun, 3 Jul 2022 12:36:38 +0300 Subject: [PATCH 096/143] new BR flag 't', minor fixes, formatting, cleanup --- 6502.c | 10 ++- 6502.h | 2 + ChangeLog.txt | 1 + ReadMe.txt | 19 +++--- joystick.c | 2 +- monitor.c | 62 ++++++++++--------- .../oric_twilighte_board_plugin.c | 4 ++ 7 files changed, 61 insertions(+), 39 deletions(-) diff --git a/6502.c b/6502.c index c51f849d..2cf017d3 100644 --- a/6502.c +++ b/6502.c @@ -319,8 +319,14 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) { if( ( cpu->breakpoints[i] != -1 ) && ( cpu->calcpc == cpu->breakpoints[i] ) ) { - if( (cpu->breakpoint_flags[i] & MBPF_RESETCYCLES) == MBPF_RESETCYCLES ) cpu->cycles = 0; - if( (cpu->breakpoint_flags[i] & MBPF_RESETCYCLESCONTINUE) != MBPF_RESETCYCLESCONTINUE ) return SDL_TRUE; + if( (cpu->breakpoint_flags[i] & MBPF_RESETCYCLESPRINT) == MBPF_RESETCYCLESPRINT ) + printf("%.4X: %d\n", cpu->breakpoints[i], cpu->cycles); + + if( (cpu->breakpoint_flags[i] & MBPF_RESETCYCLES) == MBPF_RESETCYCLES ) + cpu->cycles = 0; + + if( (cpu->breakpoint_flags[i] & MBPF_RESETCYCLESCONTINUE) != MBPF_RESETCYCLESCONTINUE ) + return SDL_TRUE; } } } diff --git a/6502.h b/6502.h index 582c5619..ac8a8932 100644 --- a/6502.h +++ b/6502.h @@ -58,6 +58,8 @@ #define MBPF_RESETCYCLES (1<f_n<<7)|(cpu->f_v<<6)|(1<<5)|(cpu->f_b<<4)|(cpu->f_d<<3)|(cpu->f_i<<2)|(cpu->f_z<<1)|cpu->f_c) diff --git a/ChangeLog.txt b/ChangeLog.txt index 806aceba..0afe7226 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -3,6 +3,7 @@ Oricutron ChangeLog pre-release changes (work in progress) -------------------------------------- +* New breakpoint flag 't' to print current counter * Added monitor memory search (#180) (@cedricp) * Added Sound loopback (useful to simulate speech software) * Properly #ifdef-ed key_dump routines (define DEBUG_KEY_DUMP when build) diff --git a/ReadMe.txt b/ReadMe.txt index a87bae0c..79b4972f 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -288,7 +288,7 @@ Commands: bcm - Clear mem breakpoint bl - List breakpoints blm - List mem breakpoints - bs [zc] - Set breakpoint + bs [zct] - Set breakpoint bsm [rwc] - Set mem breakpoint bz - Zap breakpoints bzm - Zap mem breakpoints @@ -324,12 +324,15 @@ There are two types of breakpoint. "Normal" breakpoints trigger when the CPU is about to execute an instruction at the breakpoint address. "Memory" breakpoints trigger when the breakpoint address is accessed or modified. -Normal breakpoints can use 'z' and/or 'c' modifiers. +Normal breakpoints can use 'z','c' and 't' modifiers. bs $0c00 <-- Break when the CPU is about to execute code at $0c00 bs $0c00 z <-- Break when the CPU is about to execute code at $0c00 and set cycles counter to 0 bs $0c00 zc <-- Set cycles counter to 0 and continues bs $0c00 c <-- Continues execution (i.e. disabled breakpoint) +bs $0c00 zct <-- Prints in console current counter, + set cycles counter to 0 and continues + The main purpose of these modifiers is to make cycle counting easier. If symbols are loaded, they can be used instead of absolute addresses. @@ -473,7 +476,7 @@ CH376 emulation added for : CH376_CMD_FILE_ERASE suppress a file CH376_CMD_DIR_CREATE create folder -Twilighte board emulation +Twilighte board emulation =============== The twilighte board is working on atmos (and Oric-1). It disables internal Oric ROM and add 64 banks (by bank switching). @@ -482,11 +485,11 @@ EEprom can be programmed from Orix command line. The board handles ch376 (sdcard/usbdrive/usb/hid controler). And the board adds 2 joysticks ports. -The emulation, for instance, handles 32 ROM banks and 32 RAM banks. It emulates this bank switching. +The emulation, for instance, handles 32 ROM banks and 32 RAM banks. It emulates this bank switching. Board is working with a cumulus. Anyway, this part is not emulated and you need to switch to Telestrat mode to have this behavior. -Anyway, on Telestrat, orix can start floppy disk because FDC is present. +Anyway, on Telestrat, orix can start floppy disk because FDC is present. Not emulated parts : * joysticks @@ -497,13 +500,13 @@ Not emulated parts : To activate the plugin, you must activate twilighte_board option in oricutron.cfg -Update twilighte.cfg plugin in plugins/twilighte_card/twilighte.cfg if you want to load others roms. +Update twilighte.cfg plugin in plugins/twilighte_card/twilighte.cfg if you want to load others roms. -In order to start at least, minimal configuration, kernel.rom must be set in twilbankrom07 and shell.rom in twilbankrom05. +In order to start at least, minimal configuration, kernel.rom must be set in twilbankrom07 and shell.rom in twilbankrom05. Last roms can be found here : http://repo.orix.oric.org/dists/official/tgz/6502/ * kernel.tgz contains kernel.rom -* shell.tgz contains shell.rom +* shell.tgz contains shell.rom Under linux, sdcard folder and/or usbdrive folder must have uppercase filenames or else, no binaries can be started. You can mount a fat32 filesystem in sdcard or usbdrive. diff --git a/joystick.c b/joystick.c index 63e5a208..419ffb27 100644 --- a/joystick.c +++ b/joystick.c @@ -261,7 +261,7 @@ void joy_buildmask( struct machine *oric ) Uint8 telestrat_joysel = oric->tele_via.read_port_b( &oric->tele_via ); Uint8 twilighteboard_joysel = 0; - + SDL_bool gimme_port_a = SDL_FALSE; SDL_bool gimme_port_b = SDL_FALSE; diff --git a/monitor.c b/monitor.c index b8958c7e..07b6a0bb 100644 --- a/monitor.c +++ b/monitor.c @@ -1651,32 +1651,32 @@ void mon_update_twil( struct machine *oric ) return; - if ( oric->twilighteboard_activated ) - { - tzprintfpos( tz[TZ_TWIL], 2, 2, "Board version = %02X", (twilighteboard_oric_read(oric->twilighte, 0x342) & 0x07) ); - tzprintfpos( tz[TZ_TWIL], 2, 4, "Bank set = %02X", twilighteboard_oric_read(oric->twilighte, 0x343) ); - tzprintfpos( tz[TZ_TWIL], 2, 5, "Bank number = %02X", (twilighteboard_oric_read(oric->twilighte, 0x321) & 0x07)); - tzprintfpos( tz[TZ_TWIL], 2, 6, "Bank type = %s" , (twilighteboard_oric_read(oric->twilighte, 0x342) & 0x20) ? "SRAM ": "EEPROM"); - tzprintfpos( tz[TZ_TWIL], 2, 9, "Twil register = %02X", twilighteboard_oric_read(oric->twilighte, 0x342) ); - tzprintfpos( tz[TZ_TWIL], 2, 10, "Bank register = %02X", twilighteboard_oric_read(oric->twilighte, 0x343) ); - tzprintfpos( tz[TZ_TWIL], 2, 12, "IORB = %02X", twilighteboard_oric_read(oric->twilighte, 0x320) ); - tzprintfpos( tz[TZ_TWIL], 2, 13, "IORAh = %02X", twilighteboard_oric_read(oric->twilighte, 0x321) ); - tzprintfpos( tz[TZ_TWIL], 2, 14, "DDRB = %02X", twilighteboard_oric_read(oric->twilighte, 0x322) ); - tzprintfpos( tz[TZ_TWIL], 2, 15, "DDRA = %02X", twilighteboard_oric_read(oric->twilighte, 0x323) ); + if ( oric->twilighteboard_activated ) + { + tzprintfpos( tz[TZ_TWIL], 2, 2, "Board version = %02X", (twilighteboard_oric_read(oric->twilighte, 0x342) & 0x07) ); + tzprintfpos( tz[TZ_TWIL], 2, 4, "Bank set = %02X", twilighteboard_oric_read(oric->twilighte, 0x343) ); + tzprintfpos( tz[TZ_TWIL], 2, 5, "Bank number = %02X", (twilighteboard_oric_read(oric->twilighte, 0x321) & 0x07)); + tzprintfpos( tz[TZ_TWIL], 2, 6, "Bank type = %s" , (twilighteboard_oric_read(oric->twilighte, 0x342) & 0x20) ? "SRAM ": "EEPROM"); + tzprintfpos( tz[TZ_TWIL], 2, 9, "Twil register = %02X", twilighteboard_oric_read(oric->twilighte, 0x342) ); + tzprintfpos( tz[TZ_TWIL], 2, 10, "Bank register = %02X", twilighteboard_oric_read(oric->twilighte, 0x343) ); + tzprintfpos( tz[TZ_TWIL], 2, 12, "IORB = %02X", twilighteboard_oric_read(oric->twilighte, 0x320) ); + tzprintfpos( tz[TZ_TWIL], 2, 13, "IORAh = %02X", twilighteboard_oric_read(oric->twilighte, 0x321) ); + tzprintfpos( tz[TZ_TWIL], 2, 14, "DDRB = %02X", twilighteboard_oric_read(oric->twilighte, 0x322) ); + tzprintfpos( tz[TZ_TWIL], 2, 15, "DDRA = %02X", twilighteboard_oric_read(oric->twilighte, 0x323) ); - } + } - int offs = 8*tz[TZ_TWIL]->w+1; - for( int k=0; k<28; k++ ) - { - tz[TZ_TWIL]->tx[offs+k] = 2; - tz[TZ_TWIL]->bc[offs+k] = 3; - tz[TZ_TWIL]->fc[offs+k] = 2; - } + int offs = 8*tz[TZ_TWIL]->w+1; + for( int k=0; k<28; k++ ) + { + tz[TZ_TWIL]->tx[offs+k] = 2; + tz[TZ_TWIL]->bc[offs+k] = 3; + tz[TZ_TWIL]->fc[offs+k] = 2; + } - if ( oric->ch376_activated ) - { - } + if ( oric->ch376_activated ) + { + } } void mon_state_reset( struct machine *oric ) @@ -2811,11 +2811,12 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) { if( oric->cpu.breakpoints[j] != -1 ) { - mon_printf( "%02d: $%04X %s%s", + mon_printf( "%02d: $%04X %s%s%s", j, oric->cpu.breakpoints[j], (oric->cpu.breakpoint_flags[j]&MBPF_RESETCYCLES) ? "z" : "", - (oric->cpu.breakpoint_flags[j]&MBPF_RESETCYCLESCONTINUE) ? "c" : ""); + (oric->cpu.breakpoint_flags[j]&MBPF_RESETCYCLESCONTINUE) ? "c" : "", + (oric->cpu.breakpoint_flags[j]&MBPF_RESETCYCLESPRINT) ? "t" : "" ); oric->cpu.anybp = SDL_TRUE; } } @@ -2919,15 +2920,20 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) oric->cpu.breakpoint_flags[j] |= MBPF_RESETCYCLESCONTINUE; i++; continue; + case 't': + oric->cpu.breakpoint_flags[j] |= MBPF_RESETCYCLESPRINT; + i++; + continue; } break; } - mon_printf( "%02d: $%04X %s%s", + mon_printf( "%02d: $%04X %s%s%s", j, oric->cpu.breakpoints[j], (oric->cpu.breakpoint_flags[j]&MBPF_RESETCYCLES) ? "z" : "", - (oric->cpu.breakpoint_flags[j]&MBPF_RESETCYCLESCONTINUE) ? "c" : "" ); + (oric->cpu.breakpoint_flags[j]&MBPF_RESETCYCLESCONTINUE) ? "c" : "", + (oric->cpu.breakpoint_flags[j]&MBPF_RESETCYCLESPRINT) ? "t" : "" ); break; case 'c': @@ -3464,7 +3470,7 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) mon_str( " bcm - Clear mem breakpoint" ); mon_str( " bl - List breakpoints" ); mon_str( " blm - List mem breakpoints" ); - mon_str( " bs [zc] - Set breakpoint/cycles" ); + mon_str( " bs [zct] - Set breakpoint/cycles" ); mon_str( " bsm [rwc] - Set mem breakpoint" ); mon_str( " bz - Zap breakpoints" ); mon_str( " bzm - Zap mem breakpoints" ); diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index 3c59992c..17be5bc5 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -160,6 +160,10 @@ struct twilighte* twilighte_oric_init(void) while (!feof(f)) { result = fgets(line, 1024, f); + if( result ) + { + // FIXME: do something to silence the compiler warning ... + } if (read_config_int(line, "twilighte_firmware", &twilighte->firmware_version, 1, 3)) From 461b2890132ee33ed686a650058997addd3cfaee Mon Sep 17 00:00:00 2001 From: jede Date: Fri, 6 May 2022 23:15:30 +0200 Subject: [PATCH 097/143] update orix roms --- ReadMe.txt | 8 +++++--- plugins/twilighte_board/twilighte.cfg | 2 +- roms/shell.rom | Bin 16384 -> 16384 bytes 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/ReadMe.txt b/ReadMe.txt index 79b4972f..dec40aef 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -492,11 +492,11 @@ Board is working with a cumulus. Anyway, this part is not emulated and you need Anyway, on Telestrat, orix can start floppy disk because FDC is present. Not emulated parts : -* joysticks * eeprom programming sequence * loading ROM into RAM bank (which could emulate RAM saved with battery) -* save on disk any modification into RAM bank (whic could emulate RAM saved with battery) +* save on disk any modification into RAM bank (which could emulate RAM saved with battery) * ch376 is not fully supported in the emulation mode. There is a lot of others functionnalities which are missing on ch376 emulation +* firmware 2 of the board. Only firmware 1 of the board is supported To activate the plugin, you must activate twilighte_board option in oricutron.cfg @@ -513,7 +513,9 @@ Under linux, sdcard folder and/or usbdrive folder must have uppercase filenames Filenames must be in uppercase, because usb chip manage by default FAT32 filesystem. For basic11 rom which handles joysticks and .tap load from sdcard or usbdrive, you have to download basic.tgz here : http://repo.orix.oric.org/dists/official/tgz/6502/ -And you need to replace twilbankrom06 with the rom in basic11.tgz. +And you need to replace twilbankrom06 with the rom in basic11.tgz. + +Oricutron is provided with kernel (Orix) and shell (Orix) v2022.1 roms. For updates, see http://repo.orix.oric.org/dists/official/tgz/6502/ ROM patch files diff --git a/plugins/twilighte_board/twilighte.cfg b/plugins/twilighte_board/twilighte.cfg index 199c8d48..684fa096 100644 --- a/plugins/twilighte_board/twilighte.cfg +++ b/plugins/twilighte_board/twilighte.cfg @@ -1,6 +1,6 @@ twilbankrom07='roms/kernel' -twilbankrom06='roms/basicus2' +twilbankrom06='roms/basic11b' twilbankrom05='roms/shell' diff --git a/roms/shell.rom b/roms/shell.rom index 431b7c7b04c43f41ab2e2ec6d9c5f8e987069bdd..b7b6b42ae540bc73f422b2093e3c597b3e66d8d6 100755 GIT binary patch literal 16384 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 Date: Wed, 28 Sep 2022 01:06:01 +0200 Subject: [PATCH 098/143] firmware version 2 management for twilighte board --- .../oric_twilighte_board_plugin.c | 42 ++++++++++++++++--- plugins/twilighte_board/twilighte.cfg | 1 + 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index 17be5bc5..e4724628 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -1,4 +1,6 @@ +#define TWILIGHTE_CARD_ORIC_EXTENSION_MIRROR_314 0x314 + #define TWILIGHTE_CARD_ORIC_EXTENSION_DDRA 0x323 #define TWILIGHTE_CARD_ORIC_EXTENSION_IORAh 0x321 @@ -58,6 +60,7 @@ struct twilighte int firmware_version; + unsigned char mirror_0x314; unsigned char DDRA; unsigned char IORAh; @@ -245,7 +248,9 @@ struct twilighte* twilighte_oric_init(void) twilighte->IORB = 0; twilighte->DDRB = 0b11000000; - + if (twilighte->firmware_version==2) + twilighte->mirror_0x314=0; + return twilighte; } @@ -254,6 +259,17 @@ unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte* twilighte, uin unsigned char data; unsigned char bank; + if (twilighte->firmware_version==2) + { + // If bit 1 of $314 is equal to 0 (romdis low), then send bank 0 value + if ((twilighte->mirror_0x314&2)==0) // Test bit 0 + { + data = twilighte->twilrambankdata[0][addr]; + return data; + } + // If bit 2 is equal to 1, then continue and current_bank is the right value to get bank data. + } // If it's not firmware version 2, continue + if (twilighte->current_bank == 0) { data = twilighte->twilrambankdata[0][addr]; @@ -282,6 +298,19 @@ unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte* twilighte, ui { unsigned char bank; + + if (twilighte->firmware_version==2) + { + // If bit 1 of $314 is equal to 0 (romdis low), then send bank 0 value + if ((twilighte->mirror_0x314&2)==0) // Test bit 0 + { + twilighte->twilrambankdata[twilighte->current_bank][addr] = data; + return 0; + } + // If bit 2 is equal to 1, then continue and current_bank is the right value to get bank data. + } // If it's not firmware version 2, continue + + if (twilighte->current_bank == 0) { twilighte->twilrambankdata[twilighte->current_bank][addr] = data; @@ -338,8 +367,6 @@ unsigned char twilighteboard_oric_read(struct twilighte* twilighte, uint16_t ad return twilighte->t_banking_register; } - - return 0; } @@ -371,7 +398,6 @@ unsigned char twilighteboard_oric_write(struct twilighte* twilighte, uint16_t a if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_IORB) { - if (mask == 0) twilighte->IORB = data & twilighte->DDRB; else @@ -388,7 +414,13 @@ unsigned char twilighteboard_oric_write(struct twilighte* twilighte, uint16_t a twilighte->t_banking_register = data; } - + if (twilighte->firmware_version==2) + { + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_MIRROR_314) + { + twilighte->mirror_0x314 = data; + } + } return 0; } diff --git a/plugins/twilighte_board/twilighte.cfg b/plugins/twilighte_board/twilighte.cfg index 684fa096..8971c5e2 100644 --- a/plugins/twilighte_board/twilighte.cfg +++ b/plugins/twilighte_board/twilighte.cfg @@ -65,3 +65,4 @@ kbjoy2_fire1 = 'SPACE' kbjoy2_fire2 = 'N' kbjoy2_fire3 = 'LALT' +twilighte_firmware=1 \ No newline at end of file From 63e943a4a39d02e08d692f33968c1f08362dec1d Mon Sep 17 00:00:00 2001 From: jede Date: Wed, 28 Sep 2022 01:10:27 +0200 Subject: [PATCH 099/143] fix bug twilighte board firmware --- plugins/twilighte_board/README.md | 7 +++++++ plugins/twilighte_board/oric_twilighte_board_plugin.c | 2 +- plugins/twilighte_board/twilighte.cfg | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 plugins/twilighte_board/README.md diff --git a/plugins/twilighte_board/README.md b/plugins/twilighte_board/README.md new file mode 100644 index 00000000..92046876 --- /dev/null +++ b/plugins/twilighte_board/README.md @@ -0,0 +1,7 @@ +# Twilighte board emulation + +## Firmware 1 vs Firmware 2 + +Firmware 2 manage a mirroring of ram overlay management in $314. + +It means that firmware 2, when $314 select internal ram overlay in the oric, it selects instead bank 0 (RAM) of the twilighte board. diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index e4724628..3ab7a549 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -249,7 +249,7 @@ struct twilighte* twilighte_oric_init(void) twilighte->DDRB = 0b11000000; if (twilighte->firmware_version==2) - twilighte->mirror_0x314=0; + twilighte->mirror_0x314=2; return twilighte; diff --git a/plugins/twilighte_board/twilighte.cfg b/plugins/twilighte_board/twilighte.cfg index 8971c5e2..8c84a257 100644 --- a/plugins/twilighte_board/twilighte.cfg +++ b/plugins/twilighte_board/twilighte.cfg @@ -65,4 +65,4 @@ kbjoy2_fire1 = 'SPACE' kbjoy2_fire2 = 'N' kbjoy2_fire3 = 'LALT' -twilighte_firmware=1 \ No newline at end of file +twilighte_firmware=2 From 250fa76a3663fafa96fd0d9039bd319d938b61fe Mon Sep 17 00:00:00 2001 From: jede Date: Thu, 29 Sep 2022 00:13:41 +0200 Subject: [PATCH 100/143] microdis management --- gui.c | 3 ++- machine.c | 23 ++++++++++++++++--- oricutron.cfg | 4 ++-- plugins/ch376/oric_ch376_plugin.c | 1 - plugins/ch376/oric_ch376_plugin.h | 2 +- .../oric_twilighte_board_plugin.c | 17 +++++++++++--- .../oric_twilighte_board_plugin.h | 4 +++- 7 files changed, 42 insertions(+), 12 deletions(-) diff --git a/gui.c b/gui.c index d39d4d4c..77803afa 100644 --- a/gui.c +++ b/gui.c @@ -1320,7 +1320,8 @@ void insertdisk( struct machine *oric, struct osdmenuitem *mitem, int drive ) if( oric->drivetype == DRV_NONE ) { - swapmach( oric, NULL, (DRV_MICRODISC<<16)|oric->type ); + if (!oric->twilighteboard_activated) + swapmach( oric, NULL, (DRV_MICRODISC<<16)|oric->type ); // setemumode( oric, NULL, EM_DEBUG ); return; } diff --git a/machine.c b/machine.c index 9350fd69..7387fa29 100644 --- a/machine.c +++ b/machine.c @@ -329,7 +329,10 @@ void atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) ch376_oric_write(oric->ch376, addr, data); else if(oric->twilighteboard_activated && ((0x342 <= addr && addr < 0x344 ) || (0x320 <= addr && addr < 0x330 ))) - twilighteboard_oric_write(oric->twilighte,addr,0x00,data); + twilighteboard_oric_write(oric->twilighte,addr,0x00,data); + + else if(oric->twilighteboard_activated && get_twilighte_board_microdisc_connection()==SDL_TRUE && (0x310 <= addr && addr < 0x319 )) + microdisc_read( &oric->md, addr ); else via_write( &oric->via, addr, data ); @@ -715,8 +718,18 @@ unsigned char atmosread( struct m6502 *cpu, unsigned short addr ) if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) return ch376_oric_read(oric->ch376, addr); - if( oric->twilighteboard_activated && ((0x342 <= addr && addr < 0x344 ) || (0x320 <= addr && addr < 0x330 ))) - return twilighteboard_oric_read(oric->twilighte,addr); + if( oric->twilighteboard_activated) + { + if ((0x342 <= addr && addr < 0x344 ) || (0x320 <= addr && addr < 0x330 )) + return twilighteboard_oric_read(oric->twilighte,addr); + + if (get_twilighte_board_microdisc_connection()==SDL_TRUE) + { + if (0x310 <= addr && addr < 0x319) + microdisc_read( &oric->md, addr ); + } + + } return via_read( &oric->via, addr ); } @@ -1367,6 +1380,7 @@ SDL_bool emu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) oric->ch376_activated=SDL_TRUE; oric->twilighte=twilighte_oric_init(); } + if (oric->twilighte==NULL) { oric->twilighteboard_activated=SDL_FALSE; @@ -2030,7 +2044,10 @@ SDL_bool init_machine( struct machine *oric, int type, SDL_bool nukebreakpoints { oric->twilighte=twilighte_oric_init(); oric->ch376_activated=SDL_TRUE; + if (get_twilighte_board_microdisc_connection()==SDL_TRUE) + microdisc_init( &oric->md, &oric->wddisk, oric ); } + if (oric->twilighte==NULL) oric->twilighteboard_activated=SDL_FALSE; m6502_reset( &oric->cpu ); diff --git a/oricutron.cfg b/oricutron.cfg index 1ec42223..97c64641 100644 --- a/oricutron.cfg +++ b/oricutron.cfg @@ -221,5 +221,5 @@ kbjoy2_fire3 = 'LALT' ; ch376 chip emulation. This chip can read a usbkey. For more information : http://orix.oric.org ; only available in telestrat mode -ch376 = no -twilighte_board=no +ch376 = yes +twilighte_board=yes diff --git a/plugins/ch376/oric_ch376_plugin.c b/plugins/ch376/oric_ch376_plugin.c index 8289ef4a..cbd5d6c6 100644 --- a/plugins/ch376/oric_ch376_plugin.c +++ b/plugins/ch376/oric_ch376_plugin.c @@ -55,7 +55,6 @@ void ch376_oric_write(struct ch376 *ch376, Uint16 addr, Uint8 data) ch376_write_command_port(ch376, data); } } - unsigned char ch376_oric_read(struct ch376 *ch376, Uint16 addr) { diff --git a/plugins/ch376/oric_ch376_plugin.h b/plugins/ch376/oric_ch376_plugin.h index 4701665a..3e04ddd5 100644 --- a/plugins/ch376/oric_ch376_plugin.h +++ b/plugins/ch376/oric_ch376_plugin.h @@ -1,6 +1,6 @@ struct ch376 * ch376_oric_init(void); void ch376_oric_reset(struct ch376 *ch376); -void ch376_oric_write(struct ch376 *ch376, Uint16 addr, Uint8 data); +void ch376_oric_write(struct ch376 *ch376, Uint16 addr, Uint8 data); unsigned char ch376_oric_read(struct ch376 *ch376, Uint16 addr); void ch376_oric_config(struct ch376 *ch376); void ch376_oric_destroy(struct ch376 *ch376); diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index 3ab7a549..8cdc8056 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -60,6 +60,8 @@ struct twilighte int firmware_version; + SDL_bool microdisc; + unsigned char mirror_0x314; unsigned char DDRA; @@ -133,6 +135,11 @@ static SDL_bool load_rom_twilighte(char* fname, int size, unsigned char where[]) return SDL_TRUE; } +SDL_bool get_twilighte_board_microdisc_connection() +{ + return SDL_FALSE; +} + struct twilighte* twilighte_oric_init(void) { @@ -143,8 +150,9 @@ struct twilighte* twilighte_oric_init(void) char tbtmpram[32]; char line[1024]; struct twilighte* twilighte = malloc(sizeof(struct twilighte)); - twilighte->t_banking_register = 0; + twilighte->t_banking_register = 0; + twilighte->microdisc=SDL_FALSE; twilighte->t_register = 128 + 1; // Firmware f = fopen("plugins/twilighte_board/twilighte.cfg", "r"); @@ -169,12 +177,15 @@ struct twilighte* twilighte_oric_init(void) } - if (read_config_int(line, "twilighte_firmware", &twilighte->firmware_version, 1, 3)) + if (read_config_int(line, "firmware", &twilighte->firmware_version, 1, 3)) { twilighte->t_register = twilighte->t_register | twilighte->firmware_version; continue; } + + if( read_config_bool( line, "microdisc", &twilighte->microdisc ) ) continue; + for (j = 1; j < 32; j++) { sprintf(tbtmp, "twilbankrom%02d", j); @@ -248,10 +259,10 @@ struct twilighte* twilighte_oric_init(void) twilighte->IORB = 0; twilighte->DDRB = 0b11000000; + // It's not really the behavior of the firmware 2, because it initialize 0X314 internal register of the twilighte board to 0 if (twilighte->firmware_version==2) twilighte->mirror_0x314=2; - return twilighte; } diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.h b/plugins/twilighte_board/oric_twilighte_board_plugin.h index d70fc82a..9610288e 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.h +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.h @@ -1,4 +1,3 @@ - struct twilighte * twilighte_oric_init(void); unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uint16_t addr) ; @@ -6,3 +5,6 @@ unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uin unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t addr,unsigned char mask, unsigned char data); unsigned char twilighteboard_oric_read(struct twilighte* twilighte, uint16_t addr); + + +SDL_bool get_twilighte_board_microdisc_connection(); \ No newline at end of file From 3fef72bee0808a0be035d242e0bde972655409ee Mon Sep 17 00:00:00 2001 From: jede Date: Thu, 29 Sep 2022 00:48:19 +0200 Subject: [PATCH 101/143] fix bug --- machine.c | 4 ++-- .../oric_twilighte_board_plugin.c | 4 ++-- roms/kernel.rom | Bin 16384 -> 16384 bytes roms/shell.rom | Bin 16384 -> 16384 bytes 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/machine.c b/machine.c index 7387fa29..fe847a0e 100644 --- a/machine.c +++ b/machine.c @@ -331,7 +331,7 @@ void atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) else if(oric->twilighteboard_activated && ((0x342 <= addr && addr < 0x344 ) || (0x320 <= addr && addr < 0x330 ))) twilighteboard_oric_write(oric->twilighte,addr,0x00,data); - else if(oric->twilighteboard_activated && get_twilighte_board_microdisc_connection()==SDL_TRUE && (0x310 <= addr && addr < 0x319 )) + else if(oric->twilighteboard_activated && get_twilighte_board_microdisc_connection(oric->twilighte)==SDL_TRUE && (0x310 <= addr && addr < 0x319 )) microdisc_read( &oric->md, addr ); else @@ -723,7 +723,7 @@ unsigned char atmosread( struct m6502 *cpu, unsigned short addr ) if ((0x342 <= addr && addr < 0x344 ) || (0x320 <= addr && addr < 0x330 )) return twilighteboard_oric_read(oric->twilighte,addr); - if (get_twilighte_board_microdisc_connection()==SDL_TRUE) + if (get_twilighte_board_microdisc_connection(oric->twilighte)==SDL_TRUE) { if (0x310 <= addr && addr < 0x319) microdisc_read( &oric->md, addr ); diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index 8cdc8056..41246a6d 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -135,9 +135,9 @@ static SDL_bool load_rom_twilighte(char* fname, int size, unsigned char where[]) return SDL_TRUE; } -SDL_bool get_twilighte_board_microdisc_connection() +SDL_bool get_twilighte_board_microdisc_connection(struct twilighte* twilighte) { - return SDL_FALSE; + return twilighte->microdisc; } struct twilighte* twilighte_oric_init(void) diff --git a/roms/kernel.rom b/roms/kernel.rom index f19cd83fc92413b827029278f4b304bdc108670b..45388d21bee4c6a635fa94849fb965e85579ab42 100755 GIT binary patch delta 9952 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 Wo+(V#TXo>?$?vnfR3p`R2mN1OSTGm> delta 9333 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 L!&C#+a0mS#O+T8J diff --git a/roms/shell.rom b/roms/shell.rom index b7b6b42ae540bc73f422b2093e3c597b3e66d8d6..d10b0e0d658bcafb7a6d186dbdd27b8d30a10f7b 100755 GIT binary patch delta 7099 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 delta 5288 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 From 107195411470340b0aa1450b99b950e6c551292a Mon Sep 17 00:00:00 2001 From: jede Date: Thu, 29 Sep 2022 23:36:26 +0200 Subject: [PATCH 102/143] Emulation bug fixed --- machine.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/machine.c b/machine.c index fe847a0e..c490f1fd 100644 --- a/machine.c +++ b/machine.c @@ -332,7 +332,7 @@ void atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) twilighteboard_oric_write(oric->twilighte,addr,0x00,data); else if(oric->twilighteboard_activated && get_twilighte_board_microdisc_connection(oric->twilighte)==SDL_TRUE && (0x310 <= addr && addr < 0x319 )) - microdisc_read( &oric->md, addr ); + microdisc_write( &oric->md, addr, data ); else via_write( &oric->via, addr, data ); @@ -725,8 +725,9 @@ unsigned char atmosread( struct m6502 *cpu, unsigned short addr ) if (get_twilighte_board_microdisc_connection(oric->twilighte)==SDL_TRUE) { - if (0x310 <= addr && addr < 0x319) - microdisc_read( &oric->md, addr ); + if (0x310 <= addr && addr < 0x319) + return microdisc_read( &oric->md, addr ); + //printf("Hello"); } } @@ -2044,8 +2045,10 @@ SDL_bool init_machine( struct machine *oric, int type, SDL_bool nukebreakpoints { oric->twilighte=twilighte_oric_init(); oric->ch376_activated=SDL_TRUE; - if (get_twilighte_board_microdisc_connection()==SDL_TRUE) + if (get_twilighte_board_microdisc_connection(oric->twilighte)==SDL_TRUE) + { microdisc_init( &oric->md, &oric->wddisk, oric ); + } } if (oric->twilighte==NULL) oric->twilighteboard_activated=SDL_FALSE; From 996aecb1914252802b03596d1d8ffc43358725dc Mon Sep 17 00:00:00 2001 From: jede Date: Fri, 30 Sep 2022 22:57:00 +0200 Subject: [PATCH 103/143] Now microdisc can be attached with twilighte board --- .../oric_twilighte_board_plugin.c | 39 +++++++++++++------ .../oric_twilighte_board_plugin.h | 2 +- plugins/twilighte_board/twilighte.cfg | 4 +- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index 41246a6d..445fdd83 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -38,6 +38,8 @@ SDL_bool read_config_int(char* buf, char* token, int* dest, int min, int max); SDL_bool read_config_bool(char* buf, char* token, SDL_bool* dest); +void dbg_printf(char *fmt, ...); + struct twilbankinfo @@ -71,6 +73,8 @@ struct twilighte unsigned char IORB; unsigned char current_bank; + unsigned char save_current_bank; + }; @@ -137,7 +141,7 @@ static SDL_bool load_rom_twilighte(char* fname, int size, unsigned char where[]) SDL_bool get_twilighte_board_microdisc_connection(struct twilighte* twilighte) { - return twilighte->microdisc; + return SDL_TRUE; } struct twilighte* twilighte_oric_init(void) @@ -256,6 +260,8 @@ struct twilighte* twilighte_oric_init(void) twilighte->IORAh = 0x07; twilighte->DDRA = 0b10100111; twilighte->current_bank = 7; + twilighte->save_current_bank=twilighte->current_bank; + twilighte->IORB = 0; twilighte->DDRB = 0b11000000; @@ -270,16 +276,6 @@ unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte* twilighte, uin unsigned char data; unsigned char bank; - if (twilighte->firmware_version==2) - { - // If bit 1 of $314 is equal to 0 (romdis low), then send bank 0 value - if ((twilighte->mirror_0x314&2)==0) // Test bit 0 - { - data = twilighte->twilrambankdata[0][addr]; - return data; - } - // If bit 2 is equal to 1, then continue and current_bank is the right value to get bank data. - } // If it's not firmware version 2, continue if (twilighte->current_bank == 0) { @@ -313,11 +309,13 @@ unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte* twilighte, ui if (twilighte->firmware_version==2) { // If bit 1 of $314 is equal to 0 (romdis low), then send bank 0 value + /* if ((twilighte->mirror_0x314&2)==0) // Test bit 0 { twilighte->twilrambankdata[twilighte->current_bank][addr] = data; return 0; } + */ // If bit 2 is equal to 1, then continue and current_bank is the right value to get bank data. } // If it's not firmware version 2, continue @@ -378,6 +376,11 @@ unsigned char twilighteboard_oric_read(struct twilighte* twilighte, uint16_t ad return twilighte->t_banking_register; } + // In firmware mode 2, $314 is not returned by the twilighte board + // $314 is only writen in order to have twilighte board aware of the state of the overlay ram + // It's returned by the disk controler + // That is why, it never returns here $314 from the twilighte board regiter + return 0; } @@ -430,7 +433,19 @@ unsigned char twilighteboard_oric_write(struct twilighte* twilighte, uint16_t a if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_MIRROR_314) { twilighte->mirror_0x314 = data; - } + // If bit 1 of $314 is equal to 0 (romdis low), then send bank 0 value + if ((twilighte->mirror_0x314&2)==0) // Test bit 1 + { + twilighte->save_current_bank=twilighte->current_bank; + twilighte->current_bank=0; + } + else + { + twilighte->current_bank=6; + } + // If bit 2 is equal to 1, then continue and current_bank is the right value to get bank data. + } // If it's not firmware version 2, continue + } return 0; diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.h b/plugins/twilighte_board/oric_twilighte_board_plugin.h index 9610288e..5eb9fe9e 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.h +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.h @@ -6,5 +6,5 @@ unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uin unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t addr,unsigned char mask, unsigned char data); unsigned char twilighteboard_oric_read(struct twilighte* twilighte, uint16_t addr); +SDL_bool get_twilighte_board_microdisc_connection(); -SDL_bool get_twilighte_board_microdisc_connection(); \ No newline at end of file diff --git a/plugins/twilighte_board/twilighte.cfg b/plugins/twilighte_board/twilighte.cfg index 8c84a257..e1b896b4 100644 --- a/plugins/twilighte_board/twilighte.cfg +++ b/plugins/twilighte_board/twilighte.cfg @@ -65,4 +65,6 @@ kbjoy2_fire1 = 'SPACE' kbjoy2_fire2 = 'N' kbjoy2_fire3 = 'LALT' -twilighte_firmware=2 +firmware = 2 + +microdisc = no From b2216f306591482487bd05b63feb61527b78e1f8 Mon Sep 17 00:00:00 2001 From: jede Date: Sat, 1 Oct 2022 00:40:49 +0200 Subject: [PATCH 104/143] add bank management --- .../oric_twilighte_board_plugin.c | 177 ++++++------------ .../oric_twilighte_board_plugin.h | 35 +++- 2 files changed, 91 insertions(+), 121 deletions(-) diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index 445fdd83..a8f31913 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -1,6 +1,6 @@ -#define TWILIGHTE_CARD_ORIC_EXTENSION_MIRROR_314 0x314 +#define TWILIGHTE_CARD_ORIC_EXTENSION_MIRROR_314 0x314 #define TWILIGHTE_CARD_ORIC_EXTENSION_DDRA 0x323 #define TWILIGHTE_CARD_ORIC_EXTENSION_IORAh 0x321 @@ -34,58 +34,23 @@ #include #include "../../system_sdl.h" + SDL_bool read_config_int(char* buf, char* token, int* dest, int min, int max); SDL_bool read_config_bool(char* buf, char* token, SDL_bool* dest); -void dbg_printf(char *fmt, ...); - - - -struct twilbankinfo -{ - unsigned char type; - unsigned char* ptr; -}; - -struct twilighte -{ - - unsigned char t_register; - unsigned char t_banking_register; - char twilrombankfiles[32][1024]; - - char twilrambankfiles[32][1024]; - - unsigned char twilrombankdata[32][16834]; - unsigned char twilrambankdata[32][16834]; - - int firmware_version; - - SDL_bool microdisc; - - unsigned char mirror_0x314; - - unsigned char DDRA; - unsigned char IORAh; - - unsigned char DDRB; - unsigned char IORB; - unsigned char current_bank; - - unsigned char save_current_bank; - -}; - - - - - #include "../../system.h" +#include "oric_twilighte_board_plugin.h" extern SDL_bool read_config_string(char* buf, char* token, char* dest, Sint32 maxlen); ///extern SDL_bool load_rom( struct machine *oric, char *fname, int size, unsigned char *where, struct symboltable *stab, int symflags ); + +SDL_bool get_twilighte_board_microdisc_connection(struct twilighte* twilighte) +{ + return twilighte->microdisc; +} + static SDL_bool load_rom_twilighte(char* fname, int size, unsigned char where[]) { SDL_RWops* f; @@ -139,11 +104,6 @@ static SDL_bool load_rom_twilighte(char* fname, int size, unsigned char where[]) return SDL_TRUE; } -SDL_bool get_twilighte_board_microdisc_connection(struct twilighte* twilighte) -{ - return SDL_TRUE; -} - struct twilighte* twilighte_oric_init(void) { @@ -154,9 +114,9 @@ struct twilighte* twilighte_oric_init(void) char tbtmpram[32]; char line[1024]; struct twilighte* twilighte = malloc(sizeof(struct twilighte)); - twilighte->t_banking_register = 0; twilighte->microdisc=SDL_FALSE; + twilighte->t_register = 128 + 1; // Firmware f = fopen("plugins/twilighte_board/twilighte.cfg", "r"); @@ -166,7 +126,7 @@ struct twilighte* twilighte_oric_init(void) return NULL; } - for (j = 1; j < 32; j++) + for (j = 0; j < 32; j++) { twilighte->twilrombankfiles[j][0] = 0; twilighte->twilrambankfiles[j][0] = 0; @@ -180,32 +140,19 @@ struct twilighte* twilighte_oric_init(void) // FIXME: do something to silence the compiler warning ... } - if (read_config_int(line, "firmware", &twilighte->firmware_version, 1, 3)) { twilighte->t_register = twilighte->t_register | twilighte->firmware_version; continue; } - if( read_config_bool( line, "microdisc", &twilighte->microdisc ) ) continue; - for (j = 1; j < 32; j++) + for (j = 0; j < 32; j++) { - sprintf(tbtmp, "twilbankrom%02d", j); - sprintf(tbtmpram, "twilbankram%02d", j); - /* - if (j>9) - { - sprintf( tbtmp, "twilbankrom%d", j); - sprintf(tbtmpram, "twilbankram%d", j); - } - else - { - sprintf( tbtmp, "twilbankrom0%d", j); - sprintf(tbtmpram, "twilbankram0%d", j); - } - */ + sprintf(tbtmp, "twilbankrom%02d", j+1); + sprintf(tbtmpram, "twilbankram%02d", j+1); + if (twilighte->twilrombankfiles[j][0] == 0) { if (read_config_string(line, tbtmp, twilighte->twilrombankfiles[j], 1024)) @@ -251,17 +198,13 @@ struct twilighte* twilighte_oric_init(void) } } - /* - */ // Flush sram (first bank) - for (j = 0; j < 16384; j++) twilighte->twilrambankdata[0][j] = 0; + // for (j = 0; j < 16384; j++) twilighte->twilrambankdata[0][j] = 0; twilighte->IORAh = 0x07; twilighte->DDRA = 0b10100111; twilighte->current_bank = 7; - twilighte->save_current_bank=twilighte->current_bank; - twilighte->IORB = 0; twilighte->DDRB = 0b11000000; @@ -272,31 +215,48 @@ struct twilighte* twilighte_oric_init(void) return twilighte; } +unsigned char twilighte_board_mapping_bank(struct twilighte *twilighte) { + unsigned char bank; + // RAM Overlay? + if (twilighte->current_bank == 0) + bank = 7; + + // ROM + else if ( (twilighte->current_bank >=5) && (twilighte->current_bank <=7) ) + bank = twilighte->current_bank-1; + + // ROM/RAM fonction du bit5 de twilighte->t_register + else if (twilighte->t_banking_register < 4) + bank = (twilighte->current_bank-1+twilighte->t_banking_register*8); + + // ROM/RAM fonction du bit5 de twilighte->t_register + else if (twilighte->t_banking_register >= 4) + bank = (twilighte->current_bank+3+(twilighte->t_banking_register & 3)*8); + + // Valeurs invalides + else + error_printf("Banking error: bank=%d, set=%d", twilighte->current_bank, twilighte->t_banking_register); + + // error_printf("Banking[0]: set=%d, bank=%d ram/rom=%x => %d", twilighte->t_banking_register, twilighte->current_bank, (twilighte->t_register >> 5) & 1, bank); + return bank; +} + unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte* twilighte, uint16_t addr) { unsigned char data; unsigned char bank; - if (twilighte->current_bank == 0) { - data = twilighte->twilrambankdata[0][addr]; + data = twilighte->twilrambankdata[7][addr]; } else { - if (twilighte->current_bank < 5) - { - if (twilighte->t_banking_register != 0) - bank = twilighte->current_bank + 8 + ((twilighte->t_banking_register - 1) * 4); - else - bank = twilighte->current_bank; - } - else - bank = twilighte->current_bank; + bank=twilighte_board_mapping_bank(twilighte); - if ((twilighte->t_register & 32) == 32 && twilighte->current_bank < 5) // Is it a ram bank access ? - data = twilighte->twilrambankdata[bank][addr]; + if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? + data=twilighte->twilrambankdata[bank][addr]; else - data = twilighte->twilrombankdata[bank][addr]; + data=twilighte->twilrombankdata[bank][addr]; } return data; } @@ -305,40 +265,20 @@ unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte* twilighte, ui { unsigned char bank; - - if (twilighte->firmware_version==2) - { - // If bit 1 of $314 is equal to 0 (romdis low), then send bank 0 value - /* - if ((twilighte->mirror_0x314&2)==0) // Test bit 0 - { - twilighte->twilrambankdata[twilighte->current_bank][addr] = data; - return 0; - } - */ - // If bit 2 is equal to 1, then continue and current_bank is the right value to get bank data. - } // If it's not firmware version 2, continue - - if (twilighte->current_bank == 0) { - twilighte->twilrambankdata[twilighte->current_bank][addr] = data; + twilighte->twilrambankdata[7][addr] = data; } else { - if (twilighte->current_bank < 5) - { - if (twilighte->t_banking_register != 0) - bank = twilighte->current_bank + 8 + ((twilighte->t_banking_register - 1) * 4); - else - bank = twilighte->current_bank; - } - else - bank = twilighte->current_bank; + bank=twilighte_board_mapping_bank(twilighte); + + if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? + twilighte->twilrambankdata[bank][addr]=data; - if ((twilighte->t_register & 32) == 32 && twilighte->current_bank < 5) // Is it a ram bank access ? - twilighte->twilrambankdata[bank][addr] = data; // ROM is readonly + //else + // error_printf("Flash write: set=%d, bank=%d ram/rom=%x => %d, address=%04x, data=%02x", twilighte->t_banking_register, twilighte->current_bank, (twilighte->t_register >> 5) & 1, bank, addr, data); } return 0; } @@ -377,9 +317,9 @@ unsigned char twilighteboard_oric_read(struct twilighte* twilighte, uint16_t ad } // In firmware mode 2, $314 is not returned by the twilighte board - // $314 is only writen in order to have twilighte board aware of the state of the overlay ram - // It's returned by the disk controler - // That is why, it never returns here $314 from the twilighte board regiter + // $314 is only writen in order to have information of the state of the overlay ram + // $314 register is returned by the disk controler + // That is why, it never returns here $314 register from the twilighte board register return 0; } @@ -412,6 +352,7 @@ unsigned char twilighteboard_oric_write(struct twilighte* twilighte, uint16_t a if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_IORB) { + if (mask == 0) twilighte->IORB = data & twilighte->DDRB; else @@ -436,7 +377,6 @@ unsigned char twilighteboard_oric_write(struct twilighte* twilighte, uint16_t a // If bit 1 of $314 is equal to 0 (romdis low), then send bank 0 value if ((twilighte->mirror_0x314&2)==0) // Test bit 1 { - twilighte->save_current_bank=twilighte->current_bank; twilighte->current_bank=0; } else @@ -447,6 +387,5 @@ unsigned char twilighteboard_oric_write(struct twilighte* twilighte, uint16_t a } // If it's not firmware version 2, continue } - return 0; } diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.h b/plugins/twilighte_board/oric_twilighte_board_plugin.h index 5eb9fe9e..a4d8f0e6 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.h +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.h @@ -1,10 +1,41 @@ +struct twilbankinfo +{ + unsigned char type; + unsigned char *ptr; +}; + +struct twilighte +{ + unsigned char t_register; + unsigned char t_banking_register; + char twilrombankfiles[32][1024]; + + char twilrambankfiles[32][1024]; + + unsigned char twilrombankdata[32][16834]; + unsigned char twilrambankdata[32][16834]; + + int firmware_version; + + int microdisc; + + unsigned char DDRA; + unsigned char IORAh; + + unsigned char DDRB; + unsigned char IORB; + unsigned char current_bank; + unsigned char mirror_0x314; +}; + struct twilighte * twilighte_oric_init(void); +unsigned char twilighte_board_mapping_bank(struct twilighte *twilighte); + unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uint16_t addr) ; unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uint16_t addr, unsigned char data); unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t addr,unsigned char mask, unsigned char data); unsigned char twilighteboard_oric_read(struct twilighte* twilighte, uint16_t addr); -SDL_bool get_twilighte_board_microdisc_connection(); - +SDL_bool get_twilighte_board_microdisc_connection(struct twilighte* twilighte); From d522284ae0ee650f0b498a6204e03d8cfdcddb91 Mon Sep 17 00:00:00 2001 From: jede Date: Sat, 1 Oct 2022 01:14:57 +0200 Subject: [PATCH 105/143] fix bank (patch from Assinie) --- machine.c | 21 +- monitor.c | 6 +- .../oric_twilighte_board_plugin.bkp.c | 424 ++++++++++++++++++ .../oric_twilighte_board_plugin.c | 7 - 4 files changed, 445 insertions(+), 13 deletions(-) create mode 100644 plugins/twilighte_board/oric_twilighte_board_plugin.bkp.c diff --git a/machine.c b/machine.c index c490f1fd..1847044a 100644 --- a/machine.c +++ b/machine.c @@ -331,8 +331,12 @@ void atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) else if(oric->twilighteboard_activated && ((0x342 <= addr && addr < 0x344 ) || (0x320 <= addr && addr < 0x330 ))) twilighteboard_oric_write(oric->twilighte,addr,0x00,data); - else if(oric->twilighteboard_activated && get_twilighte_board_microdisc_connection(oric->twilighte)==SDL_TRUE && (0x310 <= addr && addr < 0x319 )) + else if(oric->twilighteboard_activated && oric->twilighte->microdisc==SDL_TRUE && (0x310 <= addr && addr < 0x319 )) + { + if (addr==0x314) + twilighteboard_oric_write(oric->twilighte,addr,0x00,data); microdisc_write( &oric->md, addr, data ); + } else via_write( &oric->via, addr, data ); @@ -723,11 +727,10 @@ unsigned char atmosread( struct m6502 *cpu, unsigned short addr ) if ((0x342 <= addr && addr < 0x344 ) || (0x320 <= addr && addr < 0x330 )) return twilighteboard_oric_read(oric->twilighte,addr); - if (get_twilighte_board_microdisc_connection(oric->twilighte)==SDL_TRUE) + if (oric->twilighte->microdisc==SDL_TRUE) { if (0x310 <= addr && addr < 0x319) return microdisc_read( &oric->md, addr ); - //printf("Hello"); } } @@ -1380,6 +1383,12 @@ SDL_bool emu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) { oric->ch376_activated=SDL_TRUE; oric->twilighte=twilighte_oric_init(); + if (oric->twilighte->microdisc==SDL_TRUE) + { + oric->drivetype = DRV_MICRODISC; + oric->disksyms = NULL; + microdisc_init( &oric->md, &oric->wddisk, oric ); + } } if (oric->twilighte==NULL) @@ -2045,10 +2054,14 @@ SDL_bool init_machine( struct machine *oric, int type, SDL_bool nukebreakpoints { oric->twilighte=twilighte_oric_init(); oric->ch376_activated=SDL_TRUE; - if (get_twilighte_board_microdisc_connection(oric->twilighte)==SDL_TRUE) + + if (oric->twilighte->microdisc==SDL_TRUE) { + oric->drivetype = DRV_MICRODISC; + oric->disksyms = NULL; microdisc_init( &oric->md, &oric->wddisk, oric ); } + } if (oric->twilighte==NULL) oric->twilighteboard_activated=SDL_FALSE; diff --git a/monitor.c b/monitor.c index 07b6a0bb..b50c52a6 100644 --- a/monitor.c +++ b/monitor.c @@ -1653,10 +1653,12 @@ void mon_update_twil( struct machine *oric ) if ( oric->twilighteboard_activated ) { + int current_bank = oric->twilighte->current_bank & 0x07; + int is_ram = (current_bank == 0) || ((twilighteboard_oric_read(oric->twilighte, 0x342) & 0x20) && (current_bank < 5)); tzprintfpos( tz[TZ_TWIL], 2, 2, "Board version = %02X", (twilighteboard_oric_read(oric->twilighte, 0x342) & 0x07) ); tzprintfpos( tz[TZ_TWIL], 2, 4, "Bank set = %02X", twilighteboard_oric_read(oric->twilighte, 0x343) ); - tzprintfpos( tz[TZ_TWIL], 2, 5, "Bank number = %02X", (twilighteboard_oric_read(oric->twilighte, 0x321) & 0x07)); - tzprintfpos( tz[TZ_TWIL], 2, 6, "Bank type = %s" , (twilighteboard_oric_read(oric->twilighte, 0x342) & 0x20) ? "SRAM ": "EEPROM"); + tzprintfpos( tz[TZ_TWIL], 2, 5, "Bank number = %02X", twilighte_board_mapping_bank(oric->twilighte) ); + tzprintfpos( tz[TZ_TWIL], 2, 6, "Bank type = %s" , is_ram ? "SRAM ": "EEPROM"); tzprintfpos( tz[TZ_TWIL], 2, 9, "Twil register = %02X", twilighteboard_oric_read(oric->twilighte, 0x342) ); tzprintfpos( tz[TZ_TWIL], 2, 10, "Bank register = %02X", twilighteboard_oric_read(oric->twilighte, 0x343) ); tzprintfpos( tz[TZ_TWIL], 2, 12, "IORB = %02X", twilighteboard_oric_read(oric->twilighte, 0x320) ); diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.bkp.c b/plugins/twilighte_board/oric_twilighte_board_plugin.bkp.c new file mode 100644 index 00000000..93c6a27a --- /dev/null +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.bkp.c @@ -0,0 +1,424 @@ + +#define TWILIGHTE_CARD_ORIC_EXTENSION_MIRROR_314 0x314 + +#define TWILIGHTE_CARD_ORIC_EXTENSION_DDRA 0x323 +#define TWILIGHTE_CARD_ORIC_EXTENSION_IORAh 0x321 + +#define TWILIGHTE_CARD_ORIC_EXTENSION_DDRB 0x322 +#define TWILIGHTE_CARD_ORIC_EXTENSION_IORB 0x320 + +#define TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER 0x342 +#define TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER 0x343 + +/* + * Port B + * 7 6 5 4 3 2 1 0 + * U D F L R + * +-> select left port + * +---> select right port + * + * Port A + * 7 6 5 4 3 2 1 0 + * +---+---> Bank # + * +--> Fire 3 + * +------> Fire 2 + * + * DDRx: bit à 0 => bit en entrée + * bit à 1 => bit en sortie +*/ + +#include +#include +#include +#include +#include + +#include "../../system_sdl.h" +SDL_bool read_config_int(char* buf, char* token, int* dest, int min, int max); +SDL_bool read_config_bool(char* buf, char* token, SDL_bool* dest); + + +void dbg_printf(char *fmt, ...); + + +#include "../../system.h" +#include "oric_twilighte_board_plugin.h" + +extern SDL_bool read_config_string(char* buf, char* token, char* dest, Sint32 maxlen); + +static SDL_bool load_rom_twilighte(char* fname, int size, unsigned char where[]) +{ + SDL_RWops* f; + char* tmpname; + + // MinGW doesn't have asprintf :-( + tmpname = malloc(strlen(fname) + 10); + if (!tmpname) { + + return SDL_FALSE; + } + + sprintf(tmpname, "%s.rom", fname); + f = SDL_RWFromFile(tmpname, "rb"); + if (!f) + { + error_printf("Unable to open '%s'\n", tmpname); + free(tmpname); + return SDL_FALSE; + } + + if (size < 0) + { + int filesize; + SDL_RWseek(f, 0, SEEK_END); + filesize = SDL_RWtell(f); + SDL_RWseek(f, 0, SEEK_SET); + + if (filesize > -size) + { + error_printf("ROM '%s' exceeds %d bytes.\n", fname, -size); + SDL_RWclose(f); + free(tmpname); + return SDL_FALSE; + } + + where += (-size) - filesize; + size = filesize; + } + + if (SDL_RWread(f, where, size, 1) != 1) + { + error_printf("Unable to read '%s'\n", tmpname); + SDL_RWclose(f); + free(tmpname); + return SDL_FALSE; + } + + SDL_RWclose(f); + free(tmpname); + return SDL_TRUE; +} + +SDL_bool get_twilighte_board_microdisc_connection(struct twilighte* twilighte) +{ + return SDL_TRUE; +} + +struct twilighte* twilighte_oric_init(void) +{ + + FILE* f; + unsigned int i, j; + char* result; + char tbtmp[32]; + char tbtmpram[32]; + char line[1024]; + struct twilighte* twilighte = malloc(sizeof(struct twilighte)); + + twilighte->t_banking_register = 0; + twilighte->microdisc=SDL_FALSE; + twilighte->t_register = 128 + 1; // Firmware + + f = fopen("plugins/twilighte_board/twilighte.cfg", "r"); + if (!f) + { + error_printf("plugins/twilighte_board/twilighte.cfg not found\n"); + return NULL; + } + + for (j = 1; j < 32; j++) + { + twilighte->twilrombankfiles[j][0] = 0; + twilighte->twilrambankfiles[j][0] = 0; + } + + while (!feof(f)) + { + result = fgets(line, 1024, f); + if( result ) + { + // FIXME: do something to silence the compiler warning ... + } + + + if (read_config_int(line, "firmware", &twilighte->firmware_version, 1, 3)) + { + twilighte->t_register = twilighte->t_register | twilighte->firmware_version; + continue; + } + + + if( read_config_bool( line, "microdisc", &twilighte->microdisc ) ) continue; + + for (j = 1; j < 32; j++) + { + sprintf(tbtmp, "twilbankrom%02d", j); + sprintf(tbtmpram, "twilbankram%02d", j); + + if (twilighte->twilrombankfiles[j][0] == 0) + { + if (read_config_string(line, tbtmp, twilighte->twilrombankfiles[j], 1024)) + { + break; + } + } + + if (twilighte->twilrambankfiles[j][0] == 0) + { + if (read_config_string(line, tbtmpram, twilighte->twilrambankfiles[j], 1024)) + { + break; + } + } + + } + } + + fclose(f); + + // Now load rom + for (i = 0; i < 32; i++) + { + if (twilighte->twilrombankfiles[i][0] != 0) + { + //error_printf("Load bank (ROM) #%d: %s", i, twilighte->twilrombankfiles[i]); + if (!load_rom_twilighte(twilighte->twilrombankfiles[i], -16384, twilighte->twilrombankdata[i])) + { + error_printf("Cannot load %s", twilighte->twilrombankfiles[i]); + return NULL; + } + } + + if (twilighte->twilrambankfiles[i][0] != 0) + { + //error_printf("Load bank (RAM) #%d: %s", i, twilighte->twilrambankfiles[i]); + if (!load_rom_twilighte(twilighte->twilrambankfiles[i], -16384, twilighte->twilrambankdata[i])) + { + error_printf("Cannot load %s", twilighte->twilrambankfiles[i]); + return NULL; + } + } + + } + + + twilighte->IORAh = 0x07; + twilighte->DDRA = 0b10100111; + twilighte->current_bank = 7; + twilighte->save_current_bank=twilighte->current_bank; + + twilighte->IORB = 0; + twilighte->DDRB = 0b11000000; + + // It's not really the behavior of the firmware 2, because it initialize 0X314 internal register of the twilighte board to 0 + if (twilighte->firmware_version==2) + twilighte->mirror_0x314=2; + + return twilighte; +} + + +unsigned char twilighte_board_mapping_bank(struct twilighte *twilighte) { + unsigned char bank; + // RAM Overlay? + if (twilighte->current_bank == 0) + bank = 7; + + // ROM + else if ( (twilighte->current_bank >=5) && (twilighte->current_bank <=7) ) + bank = twilighte->current_bank-1; + + // ROM/RAM fonction du bit5 de twilighte->t_register + else if (twilighte->t_banking_register < 4) + bank = (twilighte->current_bank-1+twilighte->t_banking_register*8); + + // ROM/RAM fonction du bit5 de twilighte->t_register + else if (twilighte->t_banking_register >= 4) + bank = (twilighte->current_bank+3+(twilighte->t_banking_register & 3)*8); + + // Valeurs invalides + else + error_printf("Banking error: bank=%d, set=%d", twilighte->current_bank, twilighte->t_banking_register); + + // error_printf("Banking[0]: set=%d, bank=%d ram/rom=%x => %d", twilighte->t_banking_register, twilighte->current_bank, (twilighte->t_register >> 5) & 1, bank); + return bank; +} + +unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte* twilighte, uint16_t addr) { + unsigned char data; + unsigned char bank; + + + if (twilighte->current_bank == 0) + { + data = twilighte->twilrambankdata[0][addr]; + } + else + { + if (twilighte->current_bank < 5) + { + if (twilighte->t_banking_register != 0) + bank = twilighte->current_bank + 8 + ((twilighte->t_banking_register - 1) * 4); + else + bank = twilighte->current_bank; + } + else + bank = twilighte->current_bank; + + if ((twilighte->t_register & 32) == 32 && twilighte->current_bank < 5) // Is it a ram bank access ? + data = twilighte->twilrambankdata[bank][addr]; + else + data = twilighte->twilrombankdata[bank][addr]; + } + return data; +} + +unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte* twilighte, uint16_t addr, unsigned char data) +{ + + unsigned char bank; + + if (twilighte->firmware_version==2) + { + // If bit 1 of $314 is equal to 0 (romdis low), then send bank 0 value + /* + if ((twilighte->mirror_0x314&2)==0) // Test bit 0 + { + twilighte->twilrambankdata[twilighte->current_bank][addr] = data; + return 0; + } + */ + // If bit 2 is equal to 1, then continue and current_bank is the right value to get bank data. + } // If it's not firmware version 2, continue + + + if (twilighte->current_bank == 0) + { + twilighte->twilrambankdata[twilighte->current_bank][addr] = data; + } + else + { + if (twilighte->current_bank < 5) + { + if (twilighte->t_banking_register != 0) + bank = twilighte->current_bank + 8 + ((twilighte->t_banking_register - 1) * 4); + else + bank = twilighte->current_bank; + } + else + bank = twilighte->current_bank; + + if ((twilighte->t_register & 32) == 32 && twilighte->current_bank < 5) // Is it a ram bank access ? + twilighte->twilrambankdata[bank][addr] = data; + // ROM is readonly + } + return 0; +} + + +unsigned char twilighteboard_oric_read(struct twilighte* twilighte, uint16_t addr) +{ + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) + { + return twilighte->t_register; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) + { + return twilighte->DDRA; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_IORAh) + { + return twilighte->IORAh; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) + { + return twilighte->DDRB; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_IORB) + { + return twilighte->IORB; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) + { + return twilighte->t_banking_register; + } + + // In firmware mode 2, $314 is not returned by the twilighte board + // $314 is only writen in order to have twilighte board aware of the state of the overlay ram + // It's returned by the disk controler + // That is why, it never returns here $314 from the twilighte board regiter + + return 0; +} + +unsigned char twilighteboard_oric_write(struct twilighte* twilighte, uint16_t addr, unsigned char mask, unsigned char data) +{ + // mask: $00 => lecture/écriture via + // mask: $ff => mise à jour du port joystick + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) + { + twilighte->DDRA = data; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_IORAh) + { + + if (mask == 0) + twilighte->IORAh = data & twilighte->DDRA; + else + twilighte->IORAh = (twilighte->IORAh & twilighte->DDRA) | (data & (twilighte->DDRA ^ 0xff)); + + twilighte->current_bank = twilighte->IORAh & 7; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) + { + twilighte->DDRB = data; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_IORB) + { + if (mask == 0) + twilighte->IORB = data & twilighte->DDRB; + else + twilighte->IORB = (twilighte->IORB & twilighte->DDRB) | (data & (twilighte->DDRB ^ 0xff)); + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) + { + twilighte->t_register = data; + } + + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) + { + twilighte->t_banking_register = data; + } + + if (twilighte->firmware_version==2) + { + if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_MIRROR_314) + { + twilighte->mirror_0x314 = data; + // If bit 1 of $314 is equal to 0 (romdis low), then send bank 0 value + if ((twilighte->mirror_0x314&2)==0) // Test bit 1 + { + twilighte->save_current_bank=twilighte->current_bank; + twilighte->current_bank=0; + } + else + { + twilighte->current_bank=6; + } + // If bit 2 is equal to 1, then continue and current_bank is the right value to get bank data. + } // If it's not firmware version 2, continue + + } + + return 0; +} diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index a8f31913..219755e0 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -43,13 +43,6 @@ SDL_bool read_config_bool(char* buf, char* token, SDL_bool* dest); #include "oric_twilighte_board_plugin.h" extern SDL_bool read_config_string(char* buf, char* token, char* dest, Sint32 maxlen); -///extern SDL_bool load_rom( struct machine *oric, char *fname, int size, unsigned char *where, struct symboltable *stab, int symflags ); - - -SDL_bool get_twilighte_board_microdisc_connection(struct twilighte* twilighte) -{ - return twilighte->microdisc; -} static SDL_bool load_rom_twilighte(char* fname, int size, unsigned char where[]) { From 51e902a149cd3bcc958840f620936ee42010e461 Mon Sep 17 00:00:00 2001 From: jede Date: Sat, 1 Oct 2022 01:21:56 +0200 Subject: [PATCH 106/143] rollback conf --- oricutron.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/oricutron.cfg b/oricutron.cfg index 97c64641..0d56bc78 100644 --- a/oricutron.cfg +++ b/oricutron.cfg @@ -221,5 +221,5 @@ kbjoy2_fire3 = 'LALT' ; ch376 chip emulation. This chip can read a usbkey. For more information : http://orix.oric.org ; only available in telestrat mode -ch376 = yes -twilighte_board=yes +ch376 = no +twilighte_board = no From dc35c8f05caeb1a005d86b34af56f8a269b6cd76 Mon Sep 17 00:00:00 2001 From: jede Date: Sat, 1 Oct 2022 01:23:58 +0200 Subject: [PATCH 107/143] Cleaning --- .../oric_twilighte_board_plugin.bkp.c | 424 ------------------ .../oric_twilighte_board_plugin.h | 4 +- 2 files changed, 2 insertions(+), 426 deletions(-) delete mode 100644 plugins/twilighte_board/oric_twilighte_board_plugin.bkp.c diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.bkp.c b/plugins/twilighte_board/oric_twilighte_board_plugin.bkp.c deleted file mode 100644 index 93c6a27a..00000000 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.bkp.c +++ /dev/null @@ -1,424 +0,0 @@ - -#define TWILIGHTE_CARD_ORIC_EXTENSION_MIRROR_314 0x314 - -#define TWILIGHTE_CARD_ORIC_EXTENSION_DDRA 0x323 -#define TWILIGHTE_CARD_ORIC_EXTENSION_IORAh 0x321 - -#define TWILIGHTE_CARD_ORIC_EXTENSION_DDRB 0x322 -#define TWILIGHTE_CARD_ORIC_EXTENSION_IORB 0x320 - -#define TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER 0x342 -#define TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER 0x343 - -/* - * Port B - * 7 6 5 4 3 2 1 0 - * U D F L R - * +-> select left port - * +---> select right port - * - * Port A - * 7 6 5 4 3 2 1 0 - * +---+---> Bank # - * +--> Fire 3 - * +------> Fire 2 - * - * DDRx: bit à 0 => bit en entrée - * bit à 1 => bit en sortie -*/ - -#include -#include -#include -#include -#include - -#include "../../system_sdl.h" -SDL_bool read_config_int(char* buf, char* token, int* dest, int min, int max); -SDL_bool read_config_bool(char* buf, char* token, SDL_bool* dest); - - -void dbg_printf(char *fmt, ...); - - -#include "../../system.h" -#include "oric_twilighte_board_plugin.h" - -extern SDL_bool read_config_string(char* buf, char* token, char* dest, Sint32 maxlen); - -static SDL_bool load_rom_twilighte(char* fname, int size, unsigned char where[]) -{ - SDL_RWops* f; - char* tmpname; - - // MinGW doesn't have asprintf :-( - tmpname = malloc(strlen(fname) + 10); - if (!tmpname) { - - return SDL_FALSE; - } - - sprintf(tmpname, "%s.rom", fname); - f = SDL_RWFromFile(tmpname, "rb"); - if (!f) - { - error_printf("Unable to open '%s'\n", tmpname); - free(tmpname); - return SDL_FALSE; - } - - if (size < 0) - { - int filesize; - SDL_RWseek(f, 0, SEEK_END); - filesize = SDL_RWtell(f); - SDL_RWseek(f, 0, SEEK_SET); - - if (filesize > -size) - { - error_printf("ROM '%s' exceeds %d bytes.\n", fname, -size); - SDL_RWclose(f); - free(tmpname); - return SDL_FALSE; - } - - where += (-size) - filesize; - size = filesize; - } - - if (SDL_RWread(f, where, size, 1) != 1) - { - error_printf("Unable to read '%s'\n", tmpname); - SDL_RWclose(f); - free(tmpname); - return SDL_FALSE; - } - - SDL_RWclose(f); - free(tmpname); - return SDL_TRUE; -} - -SDL_bool get_twilighte_board_microdisc_connection(struct twilighte* twilighte) -{ - return SDL_TRUE; -} - -struct twilighte* twilighte_oric_init(void) -{ - - FILE* f; - unsigned int i, j; - char* result; - char tbtmp[32]; - char tbtmpram[32]; - char line[1024]; - struct twilighte* twilighte = malloc(sizeof(struct twilighte)); - - twilighte->t_banking_register = 0; - twilighte->microdisc=SDL_FALSE; - twilighte->t_register = 128 + 1; // Firmware - - f = fopen("plugins/twilighte_board/twilighte.cfg", "r"); - if (!f) - { - error_printf("plugins/twilighte_board/twilighte.cfg not found\n"); - return NULL; - } - - for (j = 1; j < 32; j++) - { - twilighte->twilrombankfiles[j][0] = 0; - twilighte->twilrambankfiles[j][0] = 0; - } - - while (!feof(f)) - { - result = fgets(line, 1024, f); - if( result ) - { - // FIXME: do something to silence the compiler warning ... - } - - - if (read_config_int(line, "firmware", &twilighte->firmware_version, 1, 3)) - { - twilighte->t_register = twilighte->t_register | twilighte->firmware_version; - continue; - } - - - if( read_config_bool( line, "microdisc", &twilighte->microdisc ) ) continue; - - for (j = 1; j < 32; j++) - { - sprintf(tbtmp, "twilbankrom%02d", j); - sprintf(tbtmpram, "twilbankram%02d", j); - - if (twilighte->twilrombankfiles[j][0] == 0) - { - if (read_config_string(line, tbtmp, twilighte->twilrombankfiles[j], 1024)) - { - break; - } - } - - if (twilighte->twilrambankfiles[j][0] == 0) - { - if (read_config_string(line, tbtmpram, twilighte->twilrambankfiles[j], 1024)) - { - break; - } - } - - } - } - - fclose(f); - - // Now load rom - for (i = 0; i < 32; i++) - { - if (twilighte->twilrombankfiles[i][0] != 0) - { - //error_printf("Load bank (ROM) #%d: %s", i, twilighte->twilrombankfiles[i]); - if (!load_rom_twilighte(twilighte->twilrombankfiles[i], -16384, twilighte->twilrombankdata[i])) - { - error_printf("Cannot load %s", twilighte->twilrombankfiles[i]); - return NULL; - } - } - - if (twilighte->twilrambankfiles[i][0] != 0) - { - //error_printf("Load bank (RAM) #%d: %s", i, twilighte->twilrambankfiles[i]); - if (!load_rom_twilighte(twilighte->twilrambankfiles[i], -16384, twilighte->twilrambankdata[i])) - { - error_printf("Cannot load %s", twilighte->twilrambankfiles[i]); - return NULL; - } - } - - } - - - twilighte->IORAh = 0x07; - twilighte->DDRA = 0b10100111; - twilighte->current_bank = 7; - twilighte->save_current_bank=twilighte->current_bank; - - twilighte->IORB = 0; - twilighte->DDRB = 0b11000000; - - // It's not really the behavior of the firmware 2, because it initialize 0X314 internal register of the twilighte board to 0 - if (twilighte->firmware_version==2) - twilighte->mirror_0x314=2; - - return twilighte; -} - - -unsigned char twilighte_board_mapping_bank(struct twilighte *twilighte) { - unsigned char bank; - // RAM Overlay? - if (twilighte->current_bank == 0) - bank = 7; - - // ROM - else if ( (twilighte->current_bank >=5) && (twilighte->current_bank <=7) ) - bank = twilighte->current_bank-1; - - // ROM/RAM fonction du bit5 de twilighte->t_register - else if (twilighte->t_banking_register < 4) - bank = (twilighte->current_bank-1+twilighte->t_banking_register*8); - - // ROM/RAM fonction du bit5 de twilighte->t_register - else if (twilighte->t_banking_register >= 4) - bank = (twilighte->current_bank+3+(twilighte->t_banking_register & 3)*8); - - // Valeurs invalides - else - error_printf("Banking error: bank=%d, set=%d", twilighte->current_bank, twilighte->t_banking_register); - - // error_printf("Banking[0]: set=%d, bank=%d ram/rom=%x => %d", twilighte->t_banking_register, twilighte->current_bank, (twilighte->t_register >> 5) & 1, bank); - return bank; -} - -unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte* twilighte, uint16_t addr) { - unsigned char data; - unsigned char bank; - - - if (twilighte->current_bank == 0) - { - data = twilighte->twilrambankdata[0][addr]; - } - else - { - if (twilighte->current_bank < 5) - { - if (twilighte->t_banking_register != 0) - bank = twilighte->current_bank + 8 + ((twilighte->t_banking_register - 1) * 4); - else - bank = twilighte->current_bank; - } - else - bank = twilighte->current_bank; - - if ((twilighte->t_register & 32) == 32 && twilighte->current_bank < 5) // Is it a ram bank access ? - data = twilighte->twilrambankdata[bank][addr]; - else - data = twilighte->twilrombankdata[bank][addr]; - } - return data; -} - -unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte* twilighte, uint16_t addr, unsigned char data) -{ - - unsigned char bank; - - if (twilighte->firmware_version==2) - { - // If bit 1 of $314 is equal to 0 (romdis low), then send bank 0 value - /* - if ((twilighte->mirror_0x314&2)==0) // Test bit 0 - { - twilighte->twilrambankdata[twilighte->current_bank][addr] = data; - return 0; - } - */ - // If bit 2 is equal to 1, then continue and current_bank is the right value to get bank data. - } // If it's not firmware version 2, continue - - - if (twilighte->current_bank == 0) - { - twilighte->twilrambankdata[twilighte->current_bank][addr] = data; - } - else - { - if (twilighte->current_bank < 5) - { - if (twilighte->t_banking_register != 0) - bank = twilighte->current_bank + 8 + ((twilighte->t_banking_register - 1) * 4); - else - bank = twilighte->current_bank; - } - else - bank = twilighte->current_bank; - - if ((twilighte->t_register & 32) == 32 && twilighte->current_bank < 5) // Is it a ram bank access ? - twilighte->twilrambankdata[bank][addr] = data; - // ROM is readonly - } - return 0; -} - - -unsigned char twilighteboard_oric_read(struct twilighte* twilighte, uint16_t addr) -{ - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) - { - return twilighte->t_register; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) - { - return twilighte->DDRA; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_IORAh) - { - return twilighte->IORAh; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) - { - return twilighte->DDRB; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_IORB) - { - return twilighte->IORB; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) - { - return twilighte->t_banking_register; - } - - // In firmware mode 2, $314 is not returned by the twilighte board - // $314 is only writen in order to have twilighte board aware of the state of the overlay ram - // It's returned by the disk controler - // That is why, it never returns here $314 from the twilighte board regiter - - return 0; -} - -unsigned char twilighteboard_oric_write(struct twilighte* twilighte, uint16_t addr, unsigned char mask, unsigned char data) -{ - // mask: $00 => lecture/écriture via - // mask: $ff => mise à jour du port joystick - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) - { - twilighte->DDRA = data; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_IORAh) - { - - if (mask == 0) - twilighte->IORAh = data & twilighte->DDRA; - else - twilighte->IORAh = (twilighte->IORAh & twilighte->DDRA) | (data & (twilighte->DDRA ^ 0xff)); - - twilighte->current_bank = twilighte->IORAh & 7; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) - { - twilighte->DDRB = data; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_IORB) - { - if (mask == 0) - twilighte->IORB = data & twilighte->DDRB; - else - twilighte->IORB = (twilighte->IORB & twilighte->DDRB) | (data & (twilighte->DDRB ^ 0xff)); - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) - { - twilighte->t_register = data; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) - { - twilighte->t_banking_register = data; - } - - if (twilighte->firmware_version==2) - { - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_MIRROR_314) - { - twilighte->mirror_0x314 = data; - // If bit 1 of $314 is equal to 0 (romdis low), then send bank 0 value - if ((twilighte->mirror_0x314&2)==0) // Test bit 1 - { - twilighte->save_current_bank=twilighte->current_bank; - twilighte->current_bank=0; - } - else - { - twilighte->current_bank=6; - } - // If bit 2 is equal to 1, then continue and current_bank is the right value to get bank data. - } // If it's not firmware version 2, continue - - } - - return 0; -} diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.h b/plugins/twilighte_board/oric_twilighte_board_plugin.h index a4d8f0e6..67555ca9 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.h +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.h @@ -17,7 +17,7 @@ struct twilighte int firmware_version; - int microdisc; + SDL_bool microdisc; unsigned char DDRA; unsigned char IORAh; @@ -38,4 +38,4 @@ unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uin unsigned char twilighteboard_oric_write(struct twilighte *twilighte, uint16_t addr,unsigned char mask, unsigned char data); unsigned char twilighteboard_oric_read(struct twilighte* twilighte, uint16_t addr); -SDL_bool get_twilighte_board_microdisc_connection(struct twilighte* twilighte); + From 557cf17bb9d388b757dee986cda1690d17653a29 Mon Sep 17 00:00:00 2001 From: jede Date: Tue, 4 Oct 2022 00:21:22 +0200 Subject: [PATCH 108/143] fix board version bug and monitor bug --- monitor.c | 6 ++-- .../oric_twilighte_board_plugin.c | 33 ++++++++++++++++++- .../oric_twilighte_board_plugin.h | 1 + 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/monitor.c b/monitor.c index b50c52a6..335c2455 100644 --- a/monitor.c +++ b/monitor.c @@ -1657,15 +1657,15 @@ void mon_update_twil( struct machine *oric ) int is_ram = (current_bank == 0) || ((twilighteboard_oric_read(oric->twilighte, 0x342) & 0x20) && (current_bank < 5)); tzprintfpos( tz[TZ_TWIL], 2, 2, "Board version = %02X", (twilighteboard_oric_read(oric->twilighte, 0x342) & 0x07) ); tzprintfpos( tz[TZ_TWIL], 2, 4, "Bank set = %02X", twilighteboard_oric_read(oric->twilighte, 0x343) ); - tzprintfpos( tz[TZ_TWIL], 2, 5, "Bank number = %02X", twilighte_board_mapping_bank(oric->twilighte) ); - tzprintfpos( tz[TZ_TWIL], 2, 6, "Bank type = %s" , is_ram ? "SRAM ": "EEPROM"); + tzprintfpos( tz[TZ_TWIL], 2, 5, "Bank hardware number = %02X", twilighte_board_mapping_bank(oric->twilighte) ); + tzprintfpos( tz[TZ_TWIL], 2, 6, "Bank software number = %02X", twilighte_board_mapping_software_bank(oric->twilighte) ); + tzprintfpos( tz[TZ_TWIL], 2, 7, "Bank type = %s" , is_ram ? "SRAM ": "EEPROM"); tzprintfpos( tz[TZ_TWIL], 2, 9, "Twil register = %02X", twilighteboard_oric_read(oric->twilighte, 0x342) ); tzprintfpos( tz[TZ_TWIL], 2, 10, "Bank register = %02X", twilighteboard_oric_read(oric->twilighte, 0x343) ); tzprintfpos( tz[TZ_TWIL], 2, 12, "IORB = %02X", twilighteboard_oric_read(oric->twilighte, 0x320) ); tzprintfpos( tz[TZ_TWIL], 2, 13, "IORAh = %02X", twilighteboard_oric_read(oric->twilighte, 0x321) ); tzprintfpos( tz[TZ_TWIL], 2, 14, "DDRB = %02X", twilighteboard_oric_read(oric->twilighte, 0x322) ); tzprintfpos( tz[TZ_TWIL], 2, 15, "DDRA = %02X", twilighteboard_oric_read(oric->twilighte, 0x323) ); - } int offs = 8*tz[TZ_TWIL]->w+1; diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index 219755e0..5be50a92 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -135,7 +135,12 @@ struct twilighte* twilighte_oric_init(void) if (read_config_int(line, "firmware", &twilighte->firmware_version, 1, 3)) { - twilighte->t_register = twilighte->t_register | twilighte->firmware_version; + // because we initialize board version to 1. If firmware_version is set, then we have a look to firmware_version. + // If it's equal to 1, then do not overlap the value + if (twilighte->firmware_version!=1) { + twilighte->t_register=twilighte->t_register&0b11111110; // Remove bit 0 (firmware 1 which is the default when the .cfg does not contain firmware version) + twilighte->t_register = twilighte->t_register | (twilighte->firmware_version); + } continue; } @@ -208,6 +213,32 @@ struct twilighte* twilighte_oric_init(void) return twilighte; } +unsigned char twilighte_board_mapping_software_bank(struct twilighte *twilighte) { + + unsigned char bank=0; + int current_bank = twilighte->IORAh & 0x07; + // RAM Overlay? + if (current_bank == 0) + bank = 0; + // Bank 7 downto 5 are always the same bank on any set + else if ( (current_bank >=5) && (current_bank <=7) ) + bank = current_bank; + // ROM + else if ( (current_bank >=1) && (current_bank <=4) && (twilighteboard_oric_read(twilighte, 0x342) & 0x20)==0 && twilighteboard_oric_read(twilighte, 0x343)!=4) { + bank = current_bank*twilighteboard_oric_read(twilighte, 0x343); + } + // Special case for bank 8 + else if ( (current_bank==4 ) && (twilighteboard_oric_read(twilighte, 0x342) & 0x20)==0 && twilighteboard_oric_read(twilighte, 0x343)==4) { + bank = 8; + } + // RAM + else if ( (current_bank >=1) && (current_bank <=4) && (twilighteboard_oric_read(twilighte, 0x342) & 0x20)==0x20) + bank = current_bank*twilighteboard_oric_read(twilighte, 0x343)+31; + + + return bank; +} + unsigned char twilighte_board_mapping_bank(struct twilighte *twilighte) { unsigned char bank; // RAM Overlay? diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.h b/plugins/twilighte_board/oric_twilighte_board_plugin.h index 67555ca9..74dd6ac2 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.h +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.h @@ -31,6 +31,7 @@ struct twilighte struct twilighte * twilighte_oric_init(void); unsigned char twilighte_board_mapping_bank(struct twilighte *twilighte); +unsigned char twilighte_board_mapping_software_bank(struct twilighte *twilighte); unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte *twilighte, uint16_t addr) ; unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte *twilighte, uint16_t addr, unsigned char data); From 3b18a38b6cd6a45b0f463c8260e52a870249fbe6 Mon Sep 17 00:00:00 2001 From: jede Date: Tue, 4 Oct 2022 22:17:26 +0200 Subject: [PATCH 109/143] fix software bank mapping --- .../oric_twilighte_board_plugin.c | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index 5be50a92..25cfa452 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -140,7 +140,7 @@ struct twilighte* twilighte_oric_init(void) if (twilighte->firmware_version!=1) { twilighte->t_register=twilighte->t_register&0b11111110; // Remove bit 0 (firmware 1 which is the default when the .cfg does not contain firmware version) twilighte->t_register = twilighte->t_register | (twilighte->firmware_version); - } + } continue; } @@ -224,16 +224,22 @@ unsigned char twilighte_board_mapping_software_bank(struct twilighte *twilighte) else if ( (current_bank >=5) && (current_bank <=7) ) bank = current_bank; // ROM - else if ( (current_bank >=1) && (current_bank <=4) && (twilighteboard_oric_read(twilighte, 0x342) & 0x20)==0 && twilighteboard_oric_read(twilighte, 0x343)!=4) { - bank = current_bank*twilighteboard_oric_read(twilighte, 0x343); + else if ( (twilighteboard_oric_read(twilighte, 0x342) & 0x20)==0 && twilighteboard_oric_read(twilighte, 0x343)<=3 && twilighteboard_oric_read(twilighte, 0x343)>=1) { + bank = current_bank+4*(twilighteboard_oric_read(twilighte, 0x343)+1); + } + else if ( (twilighteboard_oric_read(twilighte, 0x342) & 0x20)==0 && twilighteboard_oric_read(twilighte, 0x343)<=3 && twilighteboard_oric_read(twilighte, 0x343)==0) { + bank = current_bank; + } + else if ( (current_bank >=1) && (current_bank <=4) && (twilighteboard_oric_read(twilighte, 0x342) & 0x20)==0 && twilighteboard_oric_read(twilighte, 0x343)>4) { + bank = current_bank+4*twilighteboard_oric_read(twilighte, 0x343); } - // Special case for bank 8 - else if ( (current_bank==4 ) && (twilighteboard_oric_read(twilighte, 0x342) & 0x20)==0 && twilighteboard_oric_read(twilighte, 0x343)==4) { - bank = 8; + // Special case for bank 8,7,6,5 + else if ( (twilighteboard_oric_read(twilighte, 0x342) & 0x20)==0 && twilighteboard_oric_read(twilighte, 0x343)==4) { + bank = current_bank+4; } // RAM else if ( (current_bank >=1) && (current_bank <=4) && (twilighteboard_oric_read(twilighte, 0x342) & 0x20)==0x20) - bank = current_bank*twilighteboard_oric_read(twilighte, 0x343)+31; + bank = current_bank+4*twilighteboard_oric_read(twilighte, 0x343)+32; return bank; From 3d93570e89280d223aa68bba4bd0412c6d47e636 Mon Sep 17 00:00:00 2001 From: jede Date: Thu, 6 Oct 2022 22:26:44 +0200 Subject: [PATCH 110/143] fix behavior of 314 register --- .../oric_twilighte_board_plugin.c | 26 ++++++++++++++----- .../oric_twilighte_board_plugin.h | 2 ++ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index 25cfa452..3203a24c 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -203,8 +203,10 @@ struct twilighte* twilighte_oric_init(void) twilighte->IORAh = 0x07; twilighte->DDRA = 0b10100111; twilighte->current_bank = 7; + twilighte->saved_current_bank = twilighte->current_bank; twilighte->IORB = 0; twilighte->DDRB = 0b11000000; + //twilighte->mirror_0x314_write_detected=SDL_FALSE; // It's not really the behavior of the firmware 2, because it initialize 0X314 internal register of the twilighte board to 0 if (twilighte->firmware_version==2) @@ -275,6 +277,21 @@ unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte* twilighte, uin unsigned char data; unsigned char bank; + if (twilighte->firmware_version==2) + { + if (twilighte->mirror_0x314_write_detected==SDL_TRUE) + { + if ((twilighte->mirror_0x314&2)==0) + twilighte->current_bank = 0; + else + { + twilighte->current_bank = 6; + twilighte->t_banking_register=0; + twilighte->t_register=twilighte->t_register&0b1101111; + } + } + } + if (twilighte->current_bank == 0) { data = twilighte->twilrambankdata[7][addr]; @@ -407,14 +424,9 @@ unsigned char twilighteboard_oric_write(struct twilighte* twilighte, uint16_t a // If bit 1 of $314 is equal to 0 (romdis low), then send bank 0 value if ((twilighte->mirror_0x314&2)==0) // Test bit 1 { - twilighte->current_bank=0; - } - else - { - twilighte->current_bank=6; + twilighte->mirror_0x314_write_detected=SDL_TRUE; } - // If bit 2 is equal to 1, then continue and current_bank is the right value to get bank data. - } // If it's not firmware version 2, continue + } } return 0; diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.h b/plugins/twilighte_board/oric_twilighte_board_plugin.h index 74dd6ac2..af375783 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.h +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.h @@ -25,7 +25,9 @@ struct twilighte unsigned char DDRB; unsigned char IORB; unsigned char current_bank; + unsigned char saved_current_bank; unsigned char mirror_0x314; + unsigned char mirror_0x314_write_detected; }; struct twilighte * twilighte_oric_init(void); From 209e49e1218d7acace542d1a0b93e787372ebdc3 Mon Sep 17 00:00:00 2001 From: jede Date: Thu, 6 Oct 2022 22:37:29 +0200 Subject: [PATCH 111/143] fix bug 314 for twilighte board --- .../oric_twilighte_board_plugin.c | 20 +++++++++++++++++-- .../oric_twilighte_board_plugin.h | 1 - 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index 3203a24c..681ccc00 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -203,10 +203,9 @@ struct twilighte* twilighte_oric_init(void) twilighte->IORAh = 0x07; twilighte->DDRA = 0b10100111; twilighte->current_bank = 7; - twilighte->saved_current_bank = twilighte->current_bank; twilighte->IORB = 0; twilighte->DDRB = 0b11000000; - //twilighte->mirror_0x314_write_detected=SDL_FALSE; + twilighte->mirror_0x314_write_detected=SDL_FALSE; // It's not really the behavior of the firmware 2, because it initialize 0X314 internal register of the twilighte board to 0 if (twilighte->firmware_version==2) @@ -312,6 +311,23 @@ unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte* twilighte, ui { unsigned char bank; + + if (twilighte->firmware_version==2) + { + if (twilighte->mirror_0x314_write_detected==SDL_TRUE) + { + if ((twilighte->mirror_0x314&2)==0) + twilighte->current_bank = 0; + else + { + twilighte->current_bank = 6; + twilighte->t_banking_register=0; + twilighte->t_register=twilighte->t_register&0b1101111; + } + } + } + + if (twilighte->current_bank == 0) { twilighte->twilrambankdata[7][addr] = data; diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.h b/plugins/twilighte_board/oric_twilighte_board_plugin.h index af375783..39e4ced1 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.h +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.h @@ -25,7 +25,6 @@ struct twilighte unsigned char DDRB; unsigned char IORB; unsigned char current_bank; - unsigned char saved_current_bank; unsigned char mirror_0x314; unsigned char mirror_0x314_write_detected; }; From 8e53c84b08587a51877c4126cc5637d4b8db7aab Mon Sep 17 00:00:00 2001 From: Stefan Date: Sat, 8 Oct 2022 18:51:54 +0200 Subject: [PATCH 112/143] Fixed #185 --- ReadMe.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/ReadMe.txt b/ReadMe.txt index dec40aef..d46db0a5 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -227,6 +227,7 @@ Keys F12 - Paste (BeOS, Linux & Windows) Help - Show guide (Amiga, MorphOS and AROS) AltGr - Additional modifier + PrtSc - Save screen as BMP In menus From 70b17153af7bf124c1eb384b1b8e8e4e35756743 Mon Sep 17 00:00:00 2001 From: Stefan Date: Sat, 8 Oct 2022 19:25:48 +0200 Subject: [PATCH 113/143] Fixed some typos --- ReadMe.txt | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/ReadMe.txt b/ReadMe.txt index d46db0a5..2a6054d0 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -415,7 +415,7 @@ Back-ends are: - com - Oricutron uses any real or virtual COM port in the host machine and communicates with the hardware attached to this serial port - modem - unites ACIA with attached modem linked to internet with server and client sockets -In 'modem' mode are available folowing 'AT' commands: +In 'modem' mode are available following 'AT' commands: AT - returns 'OK' ATZ - initialize the modem AT&F - initialize the modem @@ -443,7 +443,7 @@ emulation: contact Jede (jede@oric.org). Because this emulation is used also in ACE emulator (cpc emulation). Offset and me are trying to keep the same emulation. It's easier to work together than alone. -CH376 command emulated : +CH376 command emulated: - CH376_CMD_GET_IC_VER - CH376_CMD_CHECK_EXIST - CH376_CMD_SET_USB_MODE @@ -466,24 +466,24 @@ CH376 command emulated : - CH376_CMD_DIR_CREATE (not emulated under linux) - CH376_CMD_DISK_RD_GO -Known bug : +Known bug: Under windows, API's file does not send "." and ".." entries when we read the content on the folder. It's a problem because ch376 chip send these entries, when we ask to this chip to read the content of a directory. -If someone wants to emulate CH376_CMD_DIR_CREATE and CH376_CMD_FILE_ERASE. It's easy to do : it justs need to copy WIN32 function and replace DeleteFile +If someone wants to emulate CH376_CMD_DIR_CREATE and CH376_CMD_FILE_ERASE. It's easy to do: it justs need to copy WIN32 function and replace DeleteFile and CreateDir with rm() and mkdir(). But it's not done because we are not able to test it. -CH376 emulation added for : +CH376 emulation added for: CH376_CMD_FILE_ERASE suppress a file CH376_CMD_DIR_CREATE create folder Twilighte board emulation -=============== +========================= The twilighte board is working on atmos (and Oric-1). It disables internal Oric ROM and add 64 banks (by bank switching). It adds 32 banks of ROM (eeprom) and 32 banks of RAM (Static RAM saved with a battery). EEprom can be programmed from Orix command line. -The board handles ch376 (sdcard/usbdrive/usb/hid controler). +The board handles ch376 (sdcard/usbdrive/usb/hid controller). And the board adds 2 joysticks ports. The emulation, for instance, handles 32 ROM banks and 32 RAM banks. It emulates this bank switching. @@ -492,11 +492,11 @@ Board is working with a cumulus. Anyway, this part is not emulated and you need Anyway, on Telestrat, orix can start floppy disk because FDC is present. -Not emulated parts : +Not emulated parts: * eeprom programming sequence * loading ROM into RAM bank (which could emulate RAM saved with battery) * save on disk any modification into RAM bank (which could emulate RAM saved with battery) -* ch376 is not fully supported in the emulation mode. There is a lot of others functionnalities which are missing on ch376 emulation +* ch376 is not fully supported in the emulation mode. There is a lot of others functionalities which are missing on ch376 emulation * firmware 2 of the board. Only firmware 1 of the board is supported To activate the plugin, you must activate twilighte_board option in oricutron.cfg @@ -505,7 +505,7 @@ Update twilighte.cfg plugin in plugins/twilighte_card/twilighte.cfg if you want In order to start at least, minimal configuration, kernel.rom must be set in twilbankrom07 and shell.rom in twilbankrom05. -Last roms can be found here : http://repo.orix.oric.org/dists/official/tgz/6502/ +Last roms can be found here: http://repo.orix.oric.org/dists/official/tgz/6502/ * kernel.tgz contains kernel.rom * shell.tgz contains shell.rom @@ -513,7 +513,7 @@ Under linux, sdcard folder and/or usbdrive folder must have uppercase filenames Filenames must be in uppercase, because usb chip manage by default FAT32 filesystem. -For basic11 rom which handles joysticks and .tap load from sdcard or usbdrive, you have to download basic.tgz here : http://repo.orix.oric.org/dists/official/tgz/6502/ +For basic11 rom which handles joysticks and .tap load from sdcard or usbdrive, you have to download basic.tgz here: http://repo.orix.oric.org/dists/official/tgz/6502/ And you need to replace twilbankrom06 with the rom in basic11.tgz. Oricutron is provided with kernel (Orix) and shell (Orix) v2022.1 roms. For updates, see http://repo.orix.oric.org/dists/official/tgz/6502/ @@ -524,7 +524,7 @@ ROM patch files For detailed usage see included '.pch' files in roms subdirectory. -Additionaly unlimited number of binary patches can be added: +Additionally unlimited number of binary patches can be added: $XXXX:00112233445566778899AABBCCDDEEFF.... $YYYY:AA55AA55.... From 9e4e3ca32c3c3f33246555953cd241c55e9d2b78 Mon Sep 17 00:00:00 2001 From: iss Date: Thu, 8 Dec 2022 23:34:28 +0200 Subject: [PATCH 114/143] minor fixes and cleanups --- 6551_modem.c | 114 ++++++++++++++++++++++++++------------------------- gui.c | 3 +- joystick.c | 16 +++----- machine.c | 2 - main.c | 4 +- render_gl.c | 14 +++---- system_sdl.c | 34 ++++++++++++++- system_sdl.h | 1 + 8 files changed, 105 insertions(+), 83 deletions(-) diff --git a/6551_modem.c b/6551_modem.c index fba4ea93..0a012f31 100644 --- a/6551_modem.c +++ b/6551_modem.c @@ -52,7 +52,9 @@ static Uint8 mdm_cmd_buf[CMD_BUF_SIZE]; // happen if you ran Oricutron for ~50 days solid static Uint32 mdm_time_buf[CMD_BUF_SIZE]; -#define DATA_BUF_SIZE 4096 +// FIXME: BUG: drops byte(s)... kind of buffer overflow ??? +#define DATA_BUF_SIZE 0x10000 + static int mdm_in = 0; static Uint8 mdm_in_buf[DATA_BUF_SIZE]; static int mdm_out = 0; @@ -158,11 +160,11 @@ static void mdm_connect(const char* s) char ip[1024]; char* p = NULL; int port = 0; - + strcpy(ip, s); trim(ip); p = strrchr(ip, ':'); - + if(p) { port = atoi(p+1); @@ -170,7 +172,7 @@ static void mdm_connect(const char* s) } // default telnet port if(port == 0) port = ACIA_TYPE_MODEM_DEFAULT_PORT; - + if( socket_create(&cnt_sck, oric->aciabackendcfgdomain) ) { if(socket_connect(cnt_sck, ip, port, oric->aciabackendcfgdomain)) @@ -184,7 +186,7 @@ static void mdm_connect(const char* s) } else send_responce("NO DIALTINE"); - + mdm_hangup(); } @@ -192,7 +194,7 @@ static void parse_command(const char* s) { if(!s) return; - + if( escaped ) { if('\0' == s[0]) @@ -235,7 +237,7 @@ static void parse_command(const char* s) char* p = trim(strdup(s+5)); int on = atoi(p); free(p); - + if(0oric; - + mdm_in = 0; mdm_out = 0; - + mdm_in_buf[0] = 0x00; mdm_out_buf[0] = 0x00; memset(mdm_cmd_buf, 0, sizeof(Uint8)*CMD_BUF_SIZE); memset(mdm_time_buf, 0, sizeof(Uint32)*CMD_BUF_SIZE); - + acia->done = modem_done; acia->stat = modem_stat; acia->has_byte = modem_has_byte; acia->get_byte = modem_get_byte; acia->put_byte = modem_put_byte; - + srv_sck = -1; cnt_sck = -1; - + connected = SDL_FALSE; listening = SDL_FALSE; escaped = SDL_FALSE; - + if(socket_init()) { oric->aciabackend = ACIA_TYPE_MODEM; return SDL_TRUE; } - + // fall-back to none acia_init_none( acia ); return SDL_FALSE; @@ -490,7 +492,7 @@ char *inet_ntoa(struct in_addr n) { static char a[sizeof "XXX.XXX.XXX.XXX"]; char *p = (char *)&n; - + snprintf(a, sizeof a, "%d.%d.%d.%d", p[0]&0xff, p[1]&0xff, p[2]&0xff, p[3]&0xff); return a; } @@ -565,14 +567,14 @@ static int socket_create(int* sock, int domain) *sock = socket(domain, SOCK_STREAM, 0); if(*sock == -1) return 0; - + if(setsockopt(*sock, SOL_SOCKET, SO_REUSEADDR, (const char*) &on, sizeof(on)) == -1) return 0; #ifdef __APPLE__ if(setsockopt(*sock, SOL_SOCKET, SO_REUSEPORT, (const char*) &on, sizeof(on)) == -1) return 0; #endif - + return 1; } @@ -581,14 +583,14 @@ static int socket_create(int* sock, int domain) static int socket_bind(int sock, int port, int domain) { - + #ifdef NO_GETADDRINFO struct sockaddr_in srv_addr; memset((void*)&srv_addr, 0, sizeof(srv_addr)); srv_addr.sin_family = AF_INET; srv_addr.sin_addr.s_addr = htonl(INADDR_ANY); srv_addr.sin_port = htons(port); - + if(bind(sock, (struct sockaddr*) &srv_addr, sizeof(srv_addr)) == -1) { perror("socket_bind, bind error: "); return 0; @@ -597,7 +599,7 @@ static int socket_bind(int sock, int port, int domain) struct addrinfo hints, *res, *ressave; char service[NI_MAXSERV]; int n; - + memset(&hints, 0, sizeof(hints)); hints.ai_flags = AI_PASSIVE; if (domain == 6) @@ -605,34 +607,34 @@ static int socket_bind(int sock, int port, int domain) else hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; - + sprintf(service, "%d", port); - + if ( (n = getaddrinfo(NULL, service, &hints, &res)) != 0) { printf("socket_bind, getaddrinfo error: %s", gai_strerror(n)); return 0; } ressave = res; - + // loop through all the addresses that we got do { if (bind(sock, res->ai_addr, res->ai_addrlen) == 0) break; /* success */ } while ( (res = res->ai_next) != NULL); - + freeaddrinfo(ressave); - + if (res == NULL) { perror("socket_bind, bind error: "); return 0; } #endif - - + + #if defined(__LINUX__) || defined(__APPLE__) || defined(__amigaos4__) || defined(__MORPHOS__) fcntl(sock, F_SETFL, fcntl(sock, F_GETFL, 0) | O_NONBLOCK); #endif - + #ifdef WIN32 u_long imode = 1; ioctlsocket(sock, FIONBIO, &imode); @@ -644,7 +646,7 @@ static int socket_listen(int sock) { if(listen(sock, 1) == -1) return 0; - + return 1; } @@ -656,7 +658,7 @@ static int socket_accept(int sock, int* sck) struct sockaddr_storage cli_addr; #endif socklen_t cli_addr_len = sizeof(cli_addr); - + *sck = accept(sock, (struct sockaddr*) &cli_addr, (socklen_t*) &cli_addr_len); if(*sck == -1) return 0; @@ -665,13 +667,13 @@ static int socket_accept(int sock, int* sck) #if defined(__LINUX__) || defined(__amigaos4__) || defined(__MORPHOS__) fcntl(*sck, F_SETFL, fcntl(*sck, F_GETFL, 0) | O_NONBLOCK); #endif - + #if defined(WIN32) u_long imode = 1; ioctlsocket(*sck, FIONBIO, &imode); #endif } - + return 1; } @@ -717,10 +719,10 @@ static int socket_connect(int sock, const char* host, int port, int domain) struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(port); - + hostname_to_ip(host, ip, 64); addr.sin_addr.s_addr = inet_addr((unsigned char*)ip); - + if(connect(sock, (struct sockaddr*) &addr, sizeof(addr)) != 0) { perror("socket_connect, connect error: "); return 0; @@ -729,45 +731,45 @@ static int socket_connect(int sock, const char* host, int port, int domain) struct addrinfo hints, *res, *ressave; char service[NI_MAXSERV]; int n; - + memset(&hints, 0, sizeof(hints)); if (domain == 6) hints.ai_family = AF_INET6; else hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; - + sprintf(service, "%d", port); - + if ( (n = getaddrinfo(host, service, &hints, &res)) != 0) { printf("socket_connect, getaddrinfo error: %s", gai_strerror(n)); return 0; } ressave = res; - + // loop through all the addresses that we got do { if (connect(sock, res->ai_addr, res->ai_addrlen) == 0) break; /* success */ } while ( (res = res->ai_next) != NULL); - + freeaddrinfo(ressave); - + if (res == NULL) { perror("socket_bind, connect error: "); return 0; } #endif - + #if defined(__LINUX__) || defined(__APPLE__) || defined(__amigaos4__) || defined(__MORPHOS__) fcntl(sock, F_SETFL, fcntl(sock, F_GETFL, 0) | O_NONBLOCK); #endif - + #ifdef WIN32 u_long imode = 1; ioctlsocket(sock, FIONBIO, &imode); #endif - + return 1; } @@ -775,7 +777,7 @@ int socket_close(int sock) { if(_closesocket(sock) == -1) return 0; - + return 1; } diff --git a/gui.c b/gui.c index d39d4d4c..1949878d 100644 --- a/gui.c +++ b/gui.c @@ -2152,9 +2152,8 @@ void swap_render_mode( struct machine *oric, struct osdmenuitem *mitem, int newr need_sdl_quit = SDL_FALSE; // Go SDL! - if( SDL_Init( SDL_INIT_VIDEO | SDL_INIT_AUDIO ) < 0 ) + if( SDL_COMPAT_Init( SDL_INIT_VIDEO | SDL_INIT_AUDIO ) < 0 ) { - error_printf( "SDL init failed\n" ); oric->emu_mode = EM_PLEASEQUIT; return; } diff --git a/joystick.c b/joystick.c index 419ffb27..38b38a06 100644 --- a/joystick.c +++ b/joystick.c @@ -165,7 +165,7 @@ static SDL_bool dojoyevent( SDL_Event *ev, struct machine *oric, Sint16 mode, Ui case SDL_KEYDOWN: for( i=0; i<7; i++ ) { - if( ev->key.keysym.sym == kbtab[i] ) + if( (ev->key.keysym.sym&0xffff) == kbtab[i] ) { joystate[i] = 1; swallowit = SDL_TRUE; @@ -176,7 +176,7 @@ static SDL_bool dojoyevent( SDL_Event *ev, struct machine *oric, Sint16 mode, Ui case SDL_KEYUP: for( i=0; i<7; i++ ) { - if( ev->key.keysym.sym == kbtab[i] ) + if( (ev->key.keysym.sym&0xffff) == kbtab[i] ) { joystate[i] = 0; swallowit = SDL_TRUE; @@ -261,12 +261,9 @@ void joy_buildmask( struct machine *oric ) Uint8 telestrat_joysel = oric->tele_via.read_port_b( &oric->tele_via ); Uint8 twilighteboard_joysel = 0; - SDL_bool gimme_port_a = SDL_FALSE; SDL_bool gimme_port_b = SDL_FALSE; - - if (oric->twilighteboard_activated) twilighteboard_joysel= twilighteboard_oric_read(oric->twilighte,0x320); @@ -306,13 +303,11 @@ void joy_buildmask( struct machine *oric ) if( gimme_port_b ) { - // port B + // port B //twilighteboard_oric_write(oric->twilighte, 0x320, 0xff, mkmask); } } - else - - if (oric->type == MACH_TELESTRAT) + else if (oric->type == MACH_TELESTRAT) { if ( telestrat_joysel & 0x80 ) { @@ -351,7 +346,6 @@ void joy_buildmask( struct machine *oric ) oric->tele_via.write_port_b( &oric->tele_via, 0xff, mkmask ); } } - else { switch( oric->joy_iface ) @@ -417,7 +411,7 @@ void joy_buildmask( struct machine *oric ) } else { if( !oric->porta_is_ay ) { - oric->via.write_port_a( &oric->via, 0xff, oric->porta_ay ); + oric->via.write_port_a( &oric->via, 0xff, oric->porta_ay ); oric->porta_is_ay = SDL_TRUE; } } diff --git a/machine.c b/machine.c index 9350fd69..1acc4c15 100644 --- a/machine.c +++ b/machine.c @@ -388,7 +388,6 @@ void telestratwrite( struct m6502 *cpu, unsigned short addr, unsigned char data { switch( addr & 0x0f0 ) { - case 0x20: via_write( &oric->tele_via, addr, data ); break; @@ -408,7 +407,6 @@ void telestratwrite( struct m6502 *cpu, unsigned short addr, unsigned char data break; } - default: via_write( &oric->via, addr, data ); break; diff --git a/main.c b/main.c index 8891465a..f05f5a82 100644 --- a/main.c +++ b/main.c @@ -695,6 +695,7 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) preinit_machine( oric ); preinit_render_sw( oric ); preinit_render_sw8( oric ); + #ifdef __OPENGL_AVAILABLE__ preinit_render_gl( oric ); #endif @@ -703,9 +704,8 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) kbd_init(oric); // Go SDL! - if( SDL_Init( SDL_INIT_VIDEO | SDL_INIT_AUDIO ) < 0 ) + if( SDL_COMPAT_Init( SDL_INIT_VIDEO | SDL_INIT_AUDIO ) < 0 ) { - error_printf( "SDL init failed" ); free( sto ); return SDL_FALSE; } diff --git a/render_gl.c b/render_gl.c index 6b7223a7..5a3b9172 100644 --- a/render_gl.c +++ b/render_gl.c @@ -32,7 +32,6 @@ #endif #ifndef __APPLE__ - #include #else #include @@ -525,18 +524,17 @@ static SDL_bool go_go_gadget_texture( int i, int w, int h, int blendtype, SDL_bo SDL_bool init_render_gl( struct machine *oric ) { - int depth, i, x, y; + Uint32 flags = SDL_COMPAT_OPENGL | ( fullscreen? SDL_COMPAT_FULLSCREEN : 0 ); int BitsPerPixel = SDL_COMPAT_GetBitsPerPixel(); + int depth = 32; + int y = 480 + ( oric->show_keyboard? 240:0 ); + int x = 640; + int i; - depth = 32; if( BitsPerPixel ) depth = BitsPerPixel; - if (oric->show_keyboard) { - screen = SDL_COMPAT_SetVideoMode( 640, 480+240, depth, fullscreen ? SDL_COMPAT_OPENGL|SDL_COMPAT_FULLSCREEN : SDL_COMPAT_OPENGL ); - } else { - screen = SDL_COMPAT_SetVideoMode( 640, 480, depth, fullscreen ? SDL_COMPAT_OPENGL|SDL_COMPAT_FULLSCREEN : SDL_COMPAT_OPENGL ); - } + screen = SDL_COMPAT_SetVideoMode( x, y, depth, flags ); if( !screen ) { diff --git a/system_sdl.c b/system_sdl.c index 233c9f8e..8e9b61b7 100644 --- a/system_sdl.c +++ b/system_sdl.c @@ -125,6 +125,32 @@ static void FreeResources(void) } #endif +int SDL_COMPAT_Init(Uint32 flags) +{ + int rc; + +#ifdef DEBUG_SDLINFO + SDL_version ver; + SDL_VERSION(&ver); + fprintf(stderr,"SDL version %u.%u.%u", ver.major, ver.minor, ver.patch); + +#if SDL_MAJOR_VERSION == 1 + // SDL_GetVersion not defined in SDL-1.x +#else + SDL_GetVersion(&ver); + fprintf(stderr,"/%u.%u.%u", ver.major, ver.minor, ver.patch); +#endif + + fprintf(stderr,"\n"); +#endif + + rc = SDL_Init( flags ); + if( rc < 0 ) + error_printf( "SDL init failed: %s", SDL_GetError() ); + + return rc; +} + #if SDL_MAJOR_VERSION == 1 int SDL_COMPAT_GetWMInfo(SDL_SysWMinfo *info) { @@ -413,8 +439,10 @@ SDL_Surface* SDL_COMPAT_SetVideoMode(int width, int height, int bitsperpixel, Ui FreeResources(); - // When leaving fullscreen mode, X and Y coordinates should be recentered relative to the display. - if (flags ^ SDL_WINDOW_FULLSCREEN) { + // When leaving fullscreen mode, X and Y coordinates + // should be recentered relative to the display. + if ( !(flags & SDL_WINDOW_FULLSCREEN) ) + { g_lastx = SDL_WINDOWPOS_CENTERED; g_lasty = SDL_WINDOWPOS_CENTERED; } @@ -433,6 +461,8 @@ SDL_Surface* SDL_COMPAT_SetVideoMode(int width, int height, int bitsperpixel, Ui { g_screen = SDL_GetWindowSurface(g_window); g_glcontext = SDL_GL_CreateContext(g_window); + + SDL_GL_SetSwapInterval(1); } else { diff --git a/system_sdl.h b/system_sdl.h index 651eb950..fafcce74 100644 --- a/system_sdl.h +++ b/system_sdl.h @@ -131,6 +131,7 @@ typedef SDL_RendererInfo SDL_COMPAT_VideoInfo; int SDL_COMPAT_GetWMInfo(SDL_SysWMinfo *info); #endif +int SDL_COMPAT_Init(Uint32 flags); void SDL_COMPAT_WM_SetIcon(SDL_Surface *icon, Uint8 *mask); void SDL_COMPAT_WM_SetCaption(const char *title, const char *icon); SDL_bool SDL_COMPAT_IsAppActive(SDL_Event* event); From 15af7adc9c4162968ce2fc35f8f754f057057182 Mon Sep 17 00:00:00 2001 From: iss Date: Tue, 31 Jan 2023 19:28:08 +0200 Subject: [PATCH 115/143] fix: macosx chdir handling --- main.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/main.c b/main.c index f05f5a82..fb62b65d 100644 --- a/main.c +++ b/main.c @@ -1612,22 +1612,22 @@ int main( int argc, char *argv[] ) putenv("SDL_VIDEO_CENTERED=center"); #endif - // ---------------------------------------------------------------------------- - // This makes relative paths work in C++ in Xcode by changing directory to the Resources folder inside the .app bundle #ifdef __APPLE__ - CFBundleRef mainBundle = CFBundleGetMainBundle(); - CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle); - char path[PATH_MAX]; - if (!CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8 *)path, PATH_MAX)) - { - // error! - } - CFRelease(resourcesURL); + // -------------------------------------------------------------------- + // This makes relative paths work in C++ in Xcode by changing directory + // to the Resources folder inside the .app bundle + CFBundleRef mainBundle = CFBundleGetMainBundle(); + CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle); + char path[PATH_MAX]; + if (!CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8 *)path, PATH_MAX)) + { // this directory is something/Oricutron.app/Contents/Resources // go down 3 times to find the app containing directory strcat(path, "/../../.."); chdir(path); - //printf("Current Path: %s\n", path); + } + CFRelease(resourcesURL); + //printf("Current Path: %s\n", path); #endif memset(&ctx.oric, 0, sizeof(ctx.oric)); From 2e3f760c460cfe0c4ec365d5df20945bead8bba0 Mon Sep 17 00:00:00 2001 From: iss Date: Tue, 31 Jan 2023 19:31:43 +0200 Subject: [PATCH 116/143] ... --- main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.c b/main.c index fb62b65d..578d097c 100644 --- a/main.c +++ b/main.c @@ -1619,7 +1619,7 @@ int main( int argc, char *argv[] ) CFBundleRef mainBundle = CFBundleGetMainBundle(); CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle); char path[PATH_MAX]; - if (!CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8 *)path, PATH_MAX)) + if (CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8 *)path, PATH_MAX)) { // this directory is something/Oricutron.app/Contents/Resources // go down 3 times to find the app containing directory From 91d7409f39ddc03ea21062b1484a77852119aa2c Mon Sep 17 00:00:00 2001 From: Stefan Date: Tue, 31 Jan 2023 19:45:36 +0100 Subject: [PATCH 117/143] Fixed typo --- ReadMe.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReadMe.txt b/ReadMe.txt index 2a6054d0..38a776c4 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -470,7 +470,7 @@ Known bug: Under windows, API's file does not send "." and ".." entries when we read the content on the folder. It's a problem because ch376 chip send these entries, when we ask to this chip to read the content of a directory. -If someone wants to emulate CH376_CMD_DIR_CREATE and CH376_CMD_FILE_ERASE. It's easy to do: it justs need to copy WIN32 function and replace DeleteFile +If someone wants to emulate CH376_CMD_DIR_CREATE and CH376_CMD_FILE_ERASE. It's easy to do: it just needs to copy WIN32 function and replace DeleteFile and CreateDir with rm() and mkdir(). But it's not done because we are not able to test it. CH376 emulation added for: From 606b34b5e0adae2120bc22d50379543cfc7848ac Mon Sep 17 00:00:00 2001 From: Stefan Date: Tue, 31 Jan 2023 20:50:06 +0100 Subject: [PATCH 118/143] Fixed dependency of package-osx See #188 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 73cf7326..f7aa7ead 100644 --- a/Makefile +++ b/Makefile @@ -637,7 +637,7 @@ package-beos package-haiku: install -m 644 $(DOCFILES) $(PKGDIR) zip -ry9 $(PKGDIR).zip $(PKGDIR)/ -package-osx: +package-osx: $(TARGET) mkdir -p $(PKGDIR)/Oricutron.app/Contents/MacOS mkdir -p $(PKGDIR)/Oricutron.app/Contents/Resources/images mkdir -p $(PKGDIR)/Oricutron.app/Contents/Resources/roms From 78331c96d6d6a1a13de10985fcc65133ef2e2225 Mon Sep 17 00:00:00 2001 From: jede Date: Thu, 16 Mar 2023 22:20:07 +0100 Subject: [PATCH 119/143] Fix bugs for . and .., and seek is now emulated --- plugins/ch376/ch376.c | 126 ++++++++++++++---- .../oric_twilighte_board_plugin.c | 16 +++ 2 files changed, 119 insertions(+), 23 deletions(-) diff --git a/plugins/ch376/ch376.c b/plugins/ch376/ch376.c index 021349e6..d718c58a 100644 --- a/plugins/ch376/ch376.c +++ b/plugins/ch376/ch376.c @@ -19,8 +19,9 @@ 21.08.2017 - Jede : Added support for CMD_DIR_CREATE and CMD_FILE_ERASE (WIN32 only) 22.07.2017 - OffseT : Added support for CMD_DIR_CREATE and CMD_FILE_ERASE (Added related Amiga system APIs only) 01.02.2021 - Assinie: Fix time struct (Linux Only) - - */ + 02.04.2022 - Assinie: Added support for CMD_READ_VAR32 (FILE_SIZE and CURRENT_OFFSET only) (Linux Only) + 10.03.2023 - Assinie: Fix bug : . and .. was reading as right entry. Now, it's skipped +*/ /* /// "Portable includes" */ @@ -78,7 +79,7 @@ extern struct Library *SysBase; #define CH376_CMD_NONE 0x00 #define CH376_CMD_GET_IC_VER 0x01 #define CH376_CMD_CHECK_EXIST 0x06 -#define CH376_CMD_GET_FILE_SIZE 0x0c +#define CH376_CMD_READ_VAR32 0x0c #define CH376_CMD_SET_USB_MODE 0x15 #define CH376_CMD_GET_STATUS 0x22 #define CH376_CMD_RD_USB_DATA0 0x27 @@ -104,13 +105,17 @@ extern struct Library *SysBase; #define CH376_ARG_SET_USB_MODE_SD_HOST 0x03 #define CH376_ARG_SET_USB_MODE_USB_HOST 0x06 +// VAR32 offsets +#define CH376_VAR_FILE_SIZE 0x68 +#define CH376_VAR_CURRENT_OFFSET 0x6c + // Status & errors #define CH376_ERR_OPEN_DIR 0x41 #define CH376_ERR_MISS_FILE 0x42 #define CH376_ERR_FOUND_NAME 0x43 -#define CH376_RET_SUCCESS 0x51 -#define CH376_RET_ABORT 0x5f +#define CH376_RET_SUCCESS 0x51 +#define CH376_RET_ABORT 0x5f #define CH376_INT_SUCCESS 0x14 #define CH376_INT_DISK_READ 0x1d @@ -120,7 +125,7 @@ extern struct Library *SysBase; /* /// "CH376 data structures" */ -#define CMD_DATA_REQ_SIZE 0xff +#define CMD_DATA_REQ_SIZE 0xff // Attributes #define DIR_ATTR_READ_ONLY 0x01 @@ -185,7 +190,7 @@ union CommandData CH376_U8 CMD_FileReadWrite[2]; // [W/O] CH376_CMD_BYTE_READ, CH376_CMD_BYTE_WRITE CH376_U8 CMD_IOBuffer[255]; // [R/W] CH376_CMD_BYTE_READ, CH376_CMD_BYTE_RD_GO, CH376_CMD_BYTE_WRITE, CH376_CMD_BYTE_WR_GO CH376_U8 CMD_CheckByte; // [R/W] CH376_CMD_CHECK_EXIST - CH376_U8 CMD_FileSize[4]; // [R/W] CH376_CMD_GET_FILE_SIZE, CH376_CMD_SET_FILE_SIZE + CH376_U8 CMD_VAR32[4]; // [R/W] CH376_CMD_GET_FILE_SIZE, CH376_CMD_SET_FILE_SIZE }; #pragma pack() @@ -311,6 +316,9 @@ static void system_finish_examine_directory(CH376_CONTEXT *context, CH376_DIR fi // Get the size of the current file static CH376_S32 system_get_file_size(CH376_CONTEXT *context, CH376_FILE file); +// Get the offset position of the current file +static CH376_S32 system_get_file_offset(CH376_CONTEXT *context, CH376_FILE file); + /* /// */ #if defined(__MORPHOS__) || defined (__AMIGA__) || defined (__AROS__) @@ -672,6 +680,20 @@ static CH376_S32 system_get_file_size(CH376_CONTEXT *context, CH376_FILE file) return file_size; } +static CH376_S32 system_get_file_offset(CH376_CONTEXT *context, CH376_FILE file) +{ + CH376_S32 file_offset = 0xffffffff; + + if (file) + { + dbg_printf("system_get_file_offset: unsupported error\n"); + } + else + dbg_printf("system_get_file_offset: no file handle\n"); + + return file_offset; +} + /* /// */ #elif defined(WIN32) @@ -1023,6 +1045,20 @@ static CH376_S32 system_get_file_size(CH376_CONTEXT *context, CH376_FILE file) return file_size; } +static CH376_S32 system_get_file_offset(CH376_CONTEXT *context, CH376_FILE file) +{ + CH376_S32 file_offset = 0xffffffff; + + if (file) + { + dbg_printf("system_get_file_offset: unsupported error\n"); + } + else + dbg_printf("system_get_file_offset: no file handle\n"); + + return file_offset; +} + /* /// */ #elif defined(__unix__) || defined(__APPLE__) || defined(__HAIKU__) @@ -1430,6 +1466,25 @@ static CH376_S32 system_get_file_size(CH376_CONTEXT *context, CH376_FILE file) return file_size; } +static CH376_S32 system_get_file_offset(CH376_CONTEXT *context, CH376_FILE file) +{ + CH376_S32 file_offset = 0xffffffff; + + if (file) + { + file_offset = ftell(file); + + if(file_offset == -1) + { + dbg_printf("system_get_file_offset: error\n"); + } + } + else + dbg_printf("system_get_file_offset: no file handle\n"); + + return file_offset; +} + /* /// */ #else @@ -1511,6 +1566,13 @@ static const char * normalize_file_name(const char *file_name, char *normalized_ dbg_printf("normalize_file_name: %s\n", file_name); + // '.' or '..' + if(file_name[0] == '.') + { + if( (file_name[1] == '\0') || (file_name[1] == '.' && file_name[2] == '\0')) + return NULL; + } + while(file_name[i] != '\0' && file_name[i] != '.' && j < 8) { c = normalize_char(file_name[i++]); @@ -1785,14 +1847,14 @@ CH376_U8 ch376_read_data_port(struct ch376 *ch376) dbg_printf("[READ][DATA][CH376_CMD_CHECK_EXIST] setting data port to &%02x\n", data_out); break; - case CH376_CMD_GET_FILE_SIZE: + case CH376_CMD_READ_VAR32: if(ch376->nb_bytes_in_cmd_data) { if(ch376->nb_bytes_in_cmd_data != ch376->pos_rw_in_cmd_data) { - data_out = ch376->cmd_data.CMD_FileSize[ch376->pos_rw_in_cmd_data]; + data_out = ch376->cmd_data.CMD_VAR32[ch376->pos_rw_in_cmd_data]; - dbg_printf("[READ][DATA][CH376_CMD_GET_FILE_SIZE] read &%02x from i/o buffer at position &%02x\n", data_out, ch376->pos_rw_in_cmd_data); + dbg_printf("[READ][DATA][CH376_CMD_READ_VAR32] read &%02x from i/o buffer at position &%02x\n", data_out, ch376->pos_rw_in_cmd_data); if(++ch376->pos_rw_in_cmd_data == ch376->nb_bytes_in_cmd_data) ch376->nb_bytes_in_cmd_data = 0; @@ -1801,7 +1863,7 @@ CH376_U8 ch376_read_data_port(struct ch376 *ch376) else { data_out = 0; - dbg_printf("[READ][DATA][CH376_CMD_GET_FILE_SIZE] nothing to read from i/o buffer\n"); + dbg_printf("[READ][DATA][CH376_CMD_READ_VAR32] nothing to read from i/o buffer\n"); } break; @@ -1910,9 +1972,9 @@ void ch376_write_command_port(struct ch376 *ch376, CH376_U8 command) dbg_printf("[WRITE][COMMAND][CH376_CMD_CHECK_EXIST] waiting for check byte\n"); break; - case CH376_CMD_GET_FILE_SIZE: - ch376->command = CH376_CMD_GET_FILE_SIZE; - dbg_printf("[WRITE][COMMAND][CH376_CMD_GET_FILE_SIZE] wait for &68 byte\n"); + case CH376_CMD_READ_VAR32: + ch376->command = CH376_CMD_READ_VAR32; + dbg_printf("[WRITE][COMMAND][CH376_CMD_READ_VAR32] wait for var offset byte\n"); break; case CH376_CMD_GET_IC_VER: @@ -2396,18 +2458,18 @@ void ch376_write_data_port(struct ch376 *ch376, CH376_U8 data) dbg_printf("[WRITE][DATA][CH376_CMD_CHECK_EXIST] got check byte &%02x\n", data); break; - case CH376_CMD_GET_FILE_SIZE: + case CH376_CMD_READ_VAR32: // dbg_printf("[WRITE][DATA][CH376_CMD_GET_FILE_SIZE] got &%02x byte\n", data); - if (data == 0x68) + if (data == CH376_VAR_FILE_SIZE) { CH376_S32 file_size = system_get_file_size(&ch376->context, ch376->current_file); - ch376->cmd_data.CMD_FileSize[0] = (CH376_U8)((file_size & 0x000000ff) >> 0); - ch376->cmd_data.CMD_FileSize[1] = (CH376_U8)((file_size & 0x0000ff00) >> 8); - ch376->cmd_data.CMD_FileSize[2] = (CH376_U8)((file_size & 0x00ff0000) >> 16); - ch376->cmd_data.CMD_FileSize[3] = (CH376_U8)((file_size & 0xff000000) >> 24); + ch376->cmd_data.CMD_VAR32[0] = (CH376_U8)((file_size & 0x000000ff) >> 0); + ch376->cmd_data.CMD_VAR32[1] = (CH376_U8)((file_size & 0x0000ff00) >> 8); + ch376->cmd_data.CMD_VAR32[2] = (CH376_U8)((file_size & 0x00ff0000) >> 16); + ch376->cmd_data.CMD_VAR32[3] = (CH376_U8)((file_size & 0xff000000) >> 24); - ch376->nb_bytes_in_cmd_data = sizeof(ch376->cmd_data.CMD_FileSize); + ch376->nb_bytes_in_cmd_data = sizeof(ch376->cmd_data.CMD_VAR32); ch376->pos_rw_in_cmd_data = 0; dbg_printf("[WRITE][DATA][CH376_CMD_GET_FILE_SIZE] done, file size is %d, waiting for data read\n", file_size); @@ -2416,9 +2478,27 @@ void ch376_write_data_port(struct ch376 *ch376, CH376_U8 data) ch376->interface_status = 127; ch376->command_status = CH376_INT_SUCCESS; } + else if(data == CH376_VAR_CURRENT_OFFSET) + { + CH376_S32 file_offset = system_get_file_offset(&ch376->context, ch376->current_file); + + ch376->cmd_data.CMD_VAR32[0] = (CH376_U8)((file_offset & 0x000000ff) >> 0); + ch376->cmd_data.CMD_VAR32[1] = (CH376_U8)((file_offset & 0x0000ff00) >> 8); + ch376->cmd_data.CMD_VAR32[2] = (CH376_U8)((file_offset & 0x00ff0000) >> 16); + ch376->cmd_data.CMD_VAR32[3] = (CH376_U8)((file_offset & 0xff000000) >> 24); + + ch376->nb_bytes_in_cmd_data = sizeof(ch376->cmd_data.CMD_VAR32); + ch376->pos_rw_in_cmd_data = 0; + + dbg_printf("[WRITE][DATA][CH376_CMD_GET_FILE_OFFSET] done, file position is %d, waiting for data read\n", file_offset); + + // Lignes suivantes utiles? + ch376->interface_status = 127; + ch376->command_status = CH376_INT_SUCCESS; + } else { - dbg_printf("[WRITE][DATA][CH376_CMD_GET_FILE_SIZE] wrong command byte: looking for &68, got &%02x\n", data); + dbg_printf("[WRITE][DATA][CH376_CMD_READ_VAR32] wrong command byte: looking for &68 or &6c, got &%02x\n", data); ch376->interface_status = 0; ch376->command_status = CH376_RET_ABORT; @@ -2654,4 +2734,4 @@ const char * ch376_get_usb_drive_path(struct ch376 *ch376) { return ch376->usb_drive_path; } -/* /// */ +/* /// */ \ No newline at end of file diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index 681ccc00..989a7cd8 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -1,4 +1,20 @@ +/******************************************************************** + * * + * Twilighte board emulation * + * * + * Code: * + * Jérôme 'Jede' Debrune * + * Philippe 'OffseT' Rimauro * + * Christian 'Assinie' Lardière * + * * + ** ch376.c *********************************************************/ +/* + Changes: + XX.XX.2022 - Assinie: Fix bug in banking management + XX.12.2022 - Jede: Firmware 1 and Firmware 2 management. + XX.12.2022 - Now we can attach a microdisc controler with the Twilighte board (as on real hardware : microdisc or cumulus) +*/ #define TWILIGHTE_CARD_ORIC_EXTENSION_MIRROR_314 0x314 #define TWILIGHTE_CARD_ORIC_EXTENSION_DDRA 0x323 From c15d662f208ada09f47f4419617069b4eb916e86 Mon Sep 17 00:00:00 2001 From: iss Date: Wed, 29 Mar 2023 00:03:18 +0300 Subject: [PATCH 120/143] fix: joystick emulation + cleanup --- joystick.c | 69 ++++++++++++++++++++++------------------------------ joystick.h | 2 +- machine.c | 13 +--------- system_sdl.c | 12 ++++----- system_sdl.h | 8 +++--- 5 files changed, 41 insertions(+), 63 deletions(-) diff --git a/joystick.c b/joystick.c index 38b38a06..f27d2c94 100644 --- a/joystick.c +++ b/joystick.c @@ -121,7 +121,7 @@ static void close_joysticks( struct machine *oric ) } // Return an SDL keysym corresponding to the specified name (or 0) -Sint16 joy_keyname_to_sym( char *name ) +SDL_COMPAT_KEY joy_keyname_to_sym( char *name ) { Sint32 i; char c; @@ -138,7 +138,10 @@ Sint16 joy_keyname_to_sym( char *name ) for( i=0; keyjoytab[i].id; i++ ) { if( strcasecmp( keyjoytab[i].id, name ) == 0 ) + { + // dbg_printf("%s => %.8X\n", name, keyjoytab[i].sym); return keyjoytab[i].sym; + } } return 0; @@ -146,11 +149,8 @@ Sint16 joy_keyname_to_sym( char *name ) static SDL_bool dojoyevent( SDL_Event *ev, struct machine *oric, Sint16 mode, Uint8 *joystate, SDL_Joystick *sjoy ) { - Sint32 i; - SDL_COMPAT_KEY *kbtab; SDL_bool swallowit = SDL_FALSE; - kbtab = oric->kbjoy2; switch( mode ) { case JOYMODE_NONE: @@ -158,33 +158,22 @@ static SDL_bool dojoyevent( SDL_Event *ev, struct machine *oric, Sint16 mode, Ui return SDL_FALSE; case JOYMODE_KB1: - kbtab = oric->kbjoy1; case JOYMODE_KB2: - switch( ev->type ) + { + SDL_COMPAT_KEY *kbtab = mode == JOYMODE_KB1? oric->kbjoy1 : oric->kbjoy2; + int st = ev->type == SDL_KEYDOWN? 1 : 0; + int i; + for( i=0; i<7; i++ ) { - case SDL_KEYDOWN: - for( i=0; i<7; i++ ) - { - if( (ev->key.keysym.sym&0xffff) == kbtab[i] ) - { - joystate[i] = 1; - swallowit = SDL_TRUE; - } - } - break; - - case SDL_KEYUP: - for( i=0; i<7; i++ ) - { - if( (ev->key.keysym.sym&0xffff) == kbtab[i] ) - { - joystate[i] = 0; - swallowit = SDL_TRUE; - } - } - break; + if( ev->key.keysym.sym == kbtab[i] ) + { + // dbg_printf("%d: %.8X <> %.8X => %d\n", i, kbtab[i], ev->key.keysym.sym, st); + joystate[i] = st; + swallowit = SDL_TRUE; + } } - break; + } + break; case JOYMODE_SDL0: case JOYMODE_SDL1: @@ -421,23 +410,23 @@ void joy_buildmask( struct machine *oric ) SDL_bool joy_filter_event( SDL_Event *ev, struct machine *oric ) { SDL_bool swallow_event; + SDL_bool mode = (oric->type==MACH_TELESTRAT || (oric->twilighteboard_activated && oric->type==MACH_ATMOS))? SDL_TRUE : SDL_FALSE; - swallow_event = dojoyevent( ev, oric, (oric->type==MACH_TELESTRAT || (oric->twilighteboard_activated && oric->type==MACH_ATMOS)) ? oric->telejoymode_a : oric->joymode_a, joystate_a, oric->sdljoy_a ); - swallow_event |= dojoyevent( ev, oric, (oric->type==MACH_TELESTRAT || (oric->twilighteboard_activated && oric->type==MACH_ATMOS)) ? oric->telejoymode_b : oric->joymode_b, joystate_b, oric->sdljoy_b ); + swallow_event = dojoyevent( ev, oric, mode ? oric->telejoymode_a : oric->joymode_a, joystate_a, oric->sdljoy_a ); + swallow_event |= dojoyevent( ev, oric, mode ? oric->telejoymode_b : oric->joymode_b, joystate_b, oric->sdljoy_b ); if( swallow_event ) { -// char testytesttest[64]; - joy_buildmask( oric ); -/* - sprintf( testytesttest, "A: %d%d%d%d-%d%d B: %d%d%d%d-%d%d", - joystate_a[0], joystate_a[1], joystate_a[2], joystate_a[3], - joystate_a[4], joystate_a[5], - joystate_b[0], joystate_b[1], joystate_b[2], joystate_b[3], - joystate_b[4], joystate_b[5] ); - SDL_WM_SetCaption( testytesttest, testytesttest ); -*/ + // { + // char testytesttest[64]; + // sprintf( testytesttest, "A: %d%d%d%d-%d%d B: %d%d%d%d-%d%d", + // joystate_a[0], joystate_a[1], joystate_a[2], joystate_a[3], + // joystate_a[4], joystate_a[5], + // joystate_b[0], joystate_b[1], joystate_b[2], joystate_b[3], + // joystate_b[4], joystate_b[5] ); + // SDL_WM_SetCaption( testytesttest, testytesttest ); + // } } return swallow_event; diff --git a/joystick.h b/joystick.h index f1bd63a1..d78a5ffa 100644 --- a/joystick.h +++ b/joystick.h @@ -49,7 +49,7 @@ enum SDL_bool init_joy( struct machine *oric ); void shut_joy( struct machine *oric ); -Sint16 joy_keyname_to_sym( char *name ); +SDL_COMPAT_KEY joy_keyname_to_sym( char *name ); void joy_setup( struct machine *oric ); SDL_bool joy_filter_event( SDL_Event *ev, struct machine *oric ); void joy_buildmask( struct machine *oric ); diff --git a/machine.c b/machine.c index 1acc4c15..523a7a10 100644 --- a/machine.c +++ b/machine.c @@ -1359,7 +1359,6 @@ SDL_bool emu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) via_init( &oric->tele_via, oric, VIA_TELESTRAT ); acia_init( &oric->tele_acia, oric ); - if (oric->twilighteboard_activated) { oric->ch376_activated=SDL_TRUE; @@ -1378,9 +1377,6 @@ SDL_bool emu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) if (oric->ch376 != NULL) ch376_oric_config(oric->ch376); } - - - break; case SDLK_F5: @@ -1391,14 +1387,7 @@ SDL_bool emu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) break; case SDLK_F6: - if( vidcap ) - { - warpspeed = SDL_FALSE; - } - else - { - warpspeed = warpspeed ? SDL_FALSE : SDL_TRUE; - } + warpspeed = ( vidcap || warpspeed )? SDL_FALSE : SDL_TRUE; if( soundavailable && soundon ) { diff --git a/system_sdl.c b/system_sdl.c index 8e9b61b7..02588c09 100644 --- a/system_sdl.c +++ b/system_sdl.c @@ -215,13 +215,13 @@ SDL_bool SDL_COMPAT_IsAppFocused(SDL_Event* event) #else SDL_bool SDL_COMPAT_IsAppActive(SDL_Event* event) { - /* NOTE: not needed wit SDL 2.0 + /* NOTE: not needed with SDL 2.0 * return (event->window.event == SDL_WINDOWEVENT_FOCUS_GAINED)? SDL_TRUE : SDL_FALSE; */ return SDL_FALSE; } SDL_bool SDL_COMPAT_IsAppFocused(SDL_Event* event) { - /* NOTE: not needed wit SDL 2.0 + /* NOTE: not needed with SDL 2.0 * switch( event->window.event ) * { * case SDL_WINDOWEVENT_FOCUS_GAINED: @@ -272,7 +272,7 @@ static const char* skd = "key_dump.txt"; #endif #if SDL_MAJOR_VERSION == 1 -SDL_COMPAT_KEY SDL_COMPAT_GetKeysymUnicode(SDL_KEYSYM keysym) +SDL_COMPAT_KEY SDL_COMPAT_GetKeysymUnicode(SDL_COMPAT_KEYSYM keysym) { // FIXME #ifdef DEBUG_KEY_DUMP @@ -285,7 +285,7 @@ SDL_COMPAT_KEY SDL_COMPAT_GetKeysymUnicode(SDL_KEYSYM keysym) return keysym.unicode; } -SDL_COMPAT_KEY SDL_COMPAT_TranslateUnicode(SDL_KEYSYM keysym) +SDL_COMPAT_KEY SDL_COMPAT_TranslateUnicode(SDL_COMPAT_KEYSYM keysym) { // FIXME #ifdef DEBUG_KEY_DUMP @@ -298,7 +298,7 @@ SDL_COMPAT_KEY SDL_COMPAT_TranslateUnicode(SDL_KEYSYM keysym) return keysym.unicode; } #else -SDL_COMPAT_KEY SDL_COMPAT_GetKeysymUnicode(SDL_KEYSYM keysym) +SDL_COMPAT_KEY SDL_COMPAT_GetKeysymUnicode(SDL_COMPAT_KEYSYM keysym) { // FIXME #ifdef DEBUG_KEY_DUMP @@ -310,7 +310,7 @@ SDL_COMPAT_KEY SDL_COMPAT_GetKeysymUnicode(SDL_KEYSYM keysym) // FIXME return keysym.sym; } -SDL_COMPAT_KEY SDL_COMPAT_TranslateUnicode(SDL_KEYSYM keysym) +SDL_COMPAT_KEY SDL_COMPAT_TranslateUnicode(SDL_COMPAT_KEYSYM keysym) { // FIXME SDL_COMPAT_KEY sym_out = keysym.sym; diff --git a/system_sdl.h b/system_sdl.h index fafcce74..1bfb37b2 100644 --- a/system_sdl.h +++ b/system_sdl.h @@ -75,7 +75,7 @@ /* SDL compatability definitions and macroses */ #if SDL_MAJOR_VERSION == 1 typedef Uint16 SDL_COMPAT_KEY; /* Used in 8912.c */ -typedef SDL_keysym SDL_KEYSYM; +typedef SDL_keysym SDL_COMPAT_KEYSYM; typedef SDL_VideoInfo SDL_COMPAT_VideoInfo; #define SDL_COMPAT_HWSURFACE SDL_HWSURFACE @@ -93,7 +93,7 @@ typedef SDL_VideoInfo SDL_COMPAT_VideoInfo; #else typedef Uint32 SDL_COMPAT_KEY; /* Used in 8912.c */ -typedef SDL_Keysym SDL_KEYSYM; +typedef SDL_Keysym SDL_COMPAT_KEYSYM; typedef SDL_RendererInfo SDL_COMPAT_VideoInfo; #define SDL_COMPAT_HWSURFACE 0 /* FIXME */ @@ -138,8 +138,8 @@ SDL_bool SDL_COMPAT_IsAppActive(SDL_Event* event); SDL_bool SDL_COMPAT_IsAppFocused(SDL_Event* event); int SDL_COMPAT_EnableKeyRepeat(int delay, int interval); int SDL_COMPAT_EnableUNICODE(int enable); -SDL_COMPAT_KEY SDL_COMPAT_GetKeysymUnicode(SDL_KEYSYM keysym); -SDL_COMPAT_KEY SDL_COMPAT_TranslateUnicode(SDL_KEYSYM keysym); +SDL_COMPAT_KEY SDL_COMPAT_GetKeysymUnicode(SDL_COMPAT_KEYSYM keysym); +SDL_COMPAT_KEY SDL_COMPAT_TranslateUnicode(SDL_COMPAT_KEYSYM keysym); int SDL_COMPAT_Flip(SDL_Surface* screen); int SDL_COMPAT_GetBitsPerPixel(void); int SDL_COMPAT_WM_ToggleFullScreen(SDL_Surface *surface); From 88c5b7a292da8b1426d569ad8911d896248e5e53 Mon Sep 17 00:00:00 2001 From: jedeoric Date: Sun, 1 Oct 2023 10:23:15 +0200 Subject: [PATCH 121/143] fix/joystick management twilighteboard (#191) see remarks... --- joystick.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/joystick.c b/joystick.c index f27d2c94..c038141e 100644 --- a/joystick.c +++ b/joystick.c @@ -287,13 +287,13 @@ void joy_buildmask( struct machine *oric ) if( gimme_port_a ) { - //twilighteboard_oric_write(oric->twilighte, 0x321, 0xff, mkmask_f); + twilighteboard_oric_write(oric->twilighte, 0x321, 0xff, mkmask_f); } if( gimme_port_b ) { // port B - //twilighteboard_oric_write(oric->twilighte, 0x320, 0xff, mkmask); + twilighteboard_oric_write(oric->twilighte, 0x320, 0xff, mkmask); } } else if (oric->type == MACH_TELESTRAT) From df8f5a92039e718f8ac65f767cf92c07b937e648 Mon Sep 17 00:00:00 2001 From: erik-persson <7281153+erik-persson@users.noreply.github.com> Date: Sun, 5 Nov 2023 11:26:23 +0100 Subject: [PATCH 122/143] Improve fidelity of 8912 audio output, making PING clearer This change is best appreciated by pressing Ctrl-G in Oricutron before and after the change. The 8912 model has long been modelling the audio channels accurately from cycle to cycle, but only sampled them sparsely with a 44.1 kHz interval. The sparse sampling gives significant aliasing noise, mainly affecting high pitched sounds. The present change replaces the sparse sampling with averaging. Within each sample interval, the cycle by cycle model output is added up, then finally divided to form the audio output sample. We retain the pre-existing newout mechanism to save cycle by cycle work. This is not a state of the art re-sampling technique, but it reduces the aliasing significantly, making PING sound close to on a real Oric. --- 8912.c | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/8912.c b/8912.c index 6b3eb677..af285cfb 100644 --- a/8912.c +++ b/8912.c @@ -157,11 +157,11 @@ static Uint32 ayrand( struct ay8912 *ay ) void ay_audioticktock( struct ay8912 *ay, Uint32 cycles ) { - Sint32 i; + Sint32 t, i, sum = 0; Sint32 output; // For each clock cycle... - while( cycles > 0 ) + for( t=0; tctn) >= ay->noiseper ) @@ -236,27 +236,23 @@ void ay_audioticktock( struct ay8912 *ay, Uint32 cycles ) } } - // Done one cycle! - cycles--; - } - - if( !ay->newout ) return; - - // "Output" accumulates the audio data from all sources - output = soundsilence; - - // Loop through the channels - for( i=0; i<3; i++ ) - { - // Yep, calculate the squarewave signal... - if( ay->newout & (1<out[i] = ((ay->tonebit[i]|ay->sign[i])&(ay->noisebit[i]|ay->currnoise)) * ay->vol[i]; + // Loop through the channels + for( i=0; i<3; i++ ) + { + // Yep, calculate the squarewave signal... + if( ay->newout & (1<out[i] = ((ay->tonebit[i]|ay->sign[i])&(ay->noisebit[i]|ay->currnoise)) * ay->vol[i]; - // Mix in the output of this channel - output += ay->out[i]; + // Mix in the output of this channel + sum += ay->out[i]; + } + ay->newout = 0; } - ay->newout = 0; + if( !cycles ) return; // avoid div by zero + + // Reduce aliasing by averaging over the cycles in the sample interval + output = soundsilence + sum/cycles; // Clamp the output if( output > 32767 ) output = 32767; From 5ef6678032a6d45b8f29978322c3dd948c9ed6d6 Mon Sep 17 00:00:00 2001 From: erik-persson <7281153+erik-persson@users.noreply.github.com> Date: Sun, 5 Nov 2023 18:26:57 +0100 Subject: [PATCH 123/143] Fix linker error when building with sdl2 on macOS (#192) --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f7aa7ead..49b9a65a 100644 --- a/Makefile +++ b/Makefile @@ -333,7 +333,7 @@ LFLAGS += $(CROSS_LFLAGS) -s else LFLAGS += $(shell $(SDL_LIB)-config --libs) -s endif -LFLAGS += -lm -Wl,-framework,OpenGL +LFLAGS += -lm -Wl,-framework,OpenGL -Wl,-framework,Cocoa TARGET = $(TARGET_NAME) FILEREQ_OBJ = MSGBOX_OBJ = From bf4f6784a84211b6b1230f65b00fdee84e41a3c5 Mon Sep 17 00:00:00 2001 From: iss Date: Thu, 16 Nov 2023 18:42:36 +0200 Subject: [PATCH 124/143] hack: fixes macOS cross build --- system_sdl.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/system_sdl.c b/system_sdl.c index 02588c09..284e3850 100644 --- a/system_sdl.c +++ b/system_sdl.c @@ -627,3 +627,14 @@ void SDL_COMPAT_TakeScreenshot(char *fname) } #endif #endif + +// This is an ugly hack for OSX will be removed +#ifdef __APPLE__ +int32_t __isPlatformVersionAtLeast(int32_t Major, int32_t Minor, int32_t Subminor) +{ + (void) Major; + (void) Minor; + (void) Subminor; + return SDL_TRUE; +} +#endif From 0df3c17684af7a34dbdc6aa2ee7a6d4a4f4a61cc Mon Sep 17 00:00:00 2001 From: erik-persson <7281153+erik-persson@users.noreply.github.com> Date: Sun, 19 Nov 2023 12:20:02 +0100 Subject: [PATCH 125/143] Revise path handling to address issue #188 (#194) Purpose of this change: * To make Oricutron runnable without cd'ing to its directory first * To support relative paths with the -t option * On macOS, to help command line users by not requiring a bundled app, allow "./oricutron" in the source directory much like under Linux. * To make the macOS version runnable from the source directory like you might expect if coming from Linux, e.g. by "make && ./oricutron". Code changes: * Factor out FILEPREFIX from ROMPREFIX and IMAGEPREFIX constants * Apply FILEPREFIX for all filenames in oricutron.cfg which was done previously only for the keymap path * Let function get_fileprefix() replace the FILEPREFIX constant, and use run-time concatenation instead of compile-time * For Linux let get_fileprefix() return program binary's directory * For macOS, let get_fileprefix() return parent of .app bundle if the program is bundled, otherwise do as in Linux. --- gui.c | 51 +++++++++++------- main.c | 162 ++++++++++++++++++++++++++++++++++++++++++------------- system.h | 40 ++++---------- 3 files changed, 165 insertions(+), 88 deletions(-) diff --git a/gui.c b/gui.c index a310c2f9..cb23bb35 100644 --- a/gui.c +++ b/gui.c @@ -384,6 +384,16 @@ struct osdmenu menus[] = { { "Main Menu", LAST_ITEM(mainitems)-4, mainite { "Overclock", LAST_ITEM(ovopitems), ovopitems }, { "Keyboard options", LAST_ITEM(keopitems), keopitems }}; +#define MKPATH_MAX (1024) + +// Prepend file prefix to filename +static void mkpath( char buf[MKPATH_MAX], const char *filename ) +{ + strncpy( buf, get_fileprefix(), MKPATH_MAX ); + buf[MKPATH_MAX-1] = 0; + strncat( buf, filename, MKPATH_MAX-strlen(buf)-1 ); +} + // Load a 24bit BMP for the GUI SDL_bool gimg_load( struct guiimg *gi ) { @@ -391,9 +401,11 @@ SDL_bool gimg_load( struct guiimg *gi ) Uint8 hdrbuf[640*3]; Sint32 x, y; SDL_bool fileok; + char path[MKPATH_MAX]; // Get the file - f = SDL_RWFromFile( gi->filename, "rb" ); + mkpath( path, gi->filename ); + f = SDL_RWFromFile( path, "rb" ); if( !f ) { error_printf( "Unable to open '%s'\n", gi->filename ); @@ -2196,44 +2208,45 @@ void swap_render_mode( struct machine *oric, struct osdmenuitem *mitem, int newr setemumode( oric, NULL, EM_RUNNING ); } - // Set things to default that can't fail void preinit_gui( struct machine *oric ) { int i; for( i=0; i/Oricutron.app/Contents/MacOS/ + // but data files are further up in the parent of Oricutron.app. + const char *suffix = ".app/Contents/MacOS/"; + int suffix_len = strlen(suffix); + if ( len > suffix_len && !strcasecmp( fileprefix + len - suffix_len, suffix ) ) + { + // Located in bundle - go to parent of .app dir + len -= suffix_len; // strip the suffix we matched + while ( len && fileprefix[len-1] != PATHSEP ) // strip the .app dir + len--; + fileprefix[len] = 0; + } + // else not bundled, stay in program directory +#endif + +#else + fileprefix = ""; +#endif +} + +// Get prefix string to locate program resources +const char *get_fileprefix() +{ + return fileprefix; +} + +// Check if filename looks to be absolute path +SDL_bool is_abs_path( const char *filename ) +{ + char c = *(filename++); + + // Detect unix-style absolute path + if ( c == '/' || c == '\\' || c == '~' ) + return SDL_TRUE; + + // Detect Amiga style absolute path or DOS drive letter + while ( c ) + { + if ( c == ':' ) + return SDL_TRUE; + c = *(filename++); + } + + return SDL_FALSE; +} + +// Prepend file prefix to relative path, buffer of size maxlen +void add_fileprefix( char *filename, int maxlen ) +{ + const char *prefix = get_fileprefix(); + Sint32 prefix_len = strlen( prefix ); + if ( prefix_len == 0 ) + return; // no file prefix on this platform + + Sint32 filename_len = strlen( filename ); + if ( prefix_len + filename_len + 1 > maxlen ) + return; // won't fit in buffer + + if ( is_abs_path ( filename ) ) + return; // don't apply prefix to absolute path + + // Move filename including terminating zero + for ( int i=filename_len+1; i>=0; i-- ) + filename[prefix_len+i] = filename[i]; + + // Put the prefix before + for (int i=0; ilctmp[i], "palghosting", &oric->palghost ) ) continue; if( read_config_bool( &sto->lctmp[i], "rom16", &oric->rom16 ) ) continue; if( read_config_bool( &sto->lctmp[i], "dos70", &oric->dos70 ) ) continue; - if( read_config_string( &sto->lctmp[i], "diskimage", sto->start_disk, 1024 ) ) continue; - if( read_config_string( &sto->lctmp[i], "tapeimage", sto->start_tape, 1024 ) ) continue; - if( read_config_string( &sto->lctmp[i], "symbols", sto->start_syms, 1024 ) ) continue; - if( read_config_string( &sto->lctmp[i], "tapepath", tapepath, 1024 ) ) continue; - if( read_config_string( &sto->lctmp[i], "diskpath", diskpath, 1024 ) ) continue; - if( read_config_string( &sto->lctmp[i], "telediskpath", telediskpath, 1024 ) ) continue; - if( read_config_string( &sto->lctmp[i], "pravdiskpath", pravdiskpath, 1024 ) ) continue; - if( read_config_string( &sto->lctmp[i], "atmosrom", atmosromfile, 1024 ) ) continue; - if( read_config_string( &sto->lctmp[i], "oric1rom", oric1romfile, 1024 ) ) continue; - if( read_config_string( &sto->lctmp[i], "mdiscrom", mdiscromfile, 1024 ) ) continue; - if( read_config_string( &sto->lctmp[i], "bd500rom", bd500romfile, 1024 ) ) continue; - if( read_config_string( &sto->lctmp[i], "jasminrom", jasmnromfile, 1024 ) ) continue; - if( read_config_string( &sto->lctmp[i], "pravetzrom", pravetzromfile[0], 1024 ) ) continue; - if( read_config_string( &sto->lctmp[i], "pravetz8drom", pravetzromfile[1], 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "diskimage", sto->start_disk, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "tapeimage", sto->start_tape, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "symbols", sto->start_syms, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "tapepath", tapepath, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "diskpath", diskpath, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "telediskpath", telediskpath, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "pravdiskpath", pravdiskpath, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "atmosrom", atmosromfile, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "oric1rom", oric1romfile, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "mdiscrom", mdiscromfile, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "bd500rom", bd500romfile, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "jasminrom", jasmnromfile, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "pravetzrom", pravetzromfile[0], 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "pravetz8drom", pravetzromfile[1], 1024 ) ) continue; if( read_config_int( &sto->lctmp[i], "rampattern", &oric->rampattern, 0, 1 ) ) continue; if( read_config_option( &sto->lctmp[i], "swdepth", &oric->sw_depth, swdepths ) ) { @@ -461,7 +565,7 @@ static void load_config( struct start_opts *sto, struct machine *oric ) for( j=0; j<8; j++ ) { sprintf( tbtmp, "telebank%c", j+'0' ); - if( read_config_string( &sto->lctmp[i], tbtmp, telebankfiles[j], 1024 ) ) break; + if( read_config_path( &sto->lctmp[i], tbtmp, telebankfiles[j], 1024 ) ) break; } if( read_config_bool( &sto->lctmp[i], "lightpen", &oric->lightpen ) ) continue; if( read_config_bool( &sto->lctmp[i], "printenable", &oric->printenable ) ) continue; @@ -533,10 +637,8 @@ static void load_config( struct start_opts *sto, struct machine *oric ) if( read_config_bool( &sto->lctmp[i], "disable_menuscheme", &oric->disable_menuscheme ) ) continue; if( read_config_bool( &sto->lctmp[i], "show_keyboard", &oric->show_keyboard ) ) continue; if( read_config_bool( &sto->lctmp[i], "sticky_mod_keys", &oric->sticky_mod_keys ) )continue; - if( read_config_string( &sto->lctmp[i], "autoload_keyboard_mapping", keymap_file, 4096 ) ) + if( read_config_path( &sto->lctmp[i], "autoload_keyboard_mapping", keymap_path, 4096 ) ) { - strcpy(keymap_path, FILEPREFIX""); - strcat(keymap_path, keymap_file); load_keymap = SDL_TRUE; continue; } @@ -1612,23 +1714,7 @@ int main( int argc, char *argv[] ) putenv("SDL_VIDEO_CENTERED=center"); #endif -#ifdef __APPLE__ - // -------------------------------------------------------------------- - // This makes relative paths work in C++ in Xcode by changing directory - // to the Resources folder inside the .app bundle - CFBundleRef mainBundle = CFBundleGetMainBundle(); - CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle); - char path[PATH_MAX]; - if (CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8 *)path, PATH_MAX)) - { - // this directory is something/Oricutron.app/Contents/Resources - // go down 3 times to find the app containing directory - strcat(path, "/../../.."); - chdir(path); - } - CFRelease(resourcesURL); - //printf("Current Path: %s\n", path); -#endif + init_fileprefix( argv ); memset(&ctx.oric, 0, sizeof(ctx.oric)); if (!init(&ctx.oric, argc, argv)) diff --git a/system.h b/system.h index f254d6e9..d92f86a7 100644 --- a/system.h +++ b/system.h @@ -34,40 +34,18 @@ /* Output audio frequency */ #define AUDIO_FREQ 44100 - -#if defined(__amigaos4__) - -#define PATHSEP '/' -#define PATHSEPSTR "/" -#define FILEPREFIX "PROGDIR:" -#define ROMPREFIX "PROGDIR:roms/" -#define IMAGEPREFIX "PROGDIR:images/" - -#elif defined(WIN32) - -#define PATHSEP '\\' -#define PATHSEPSTR "\\" -#define FILEPREFIX -#define ROMPREFIX "roms\\" -#define IMAGEPREFIX "images\\" - -#elif defined(__ANDROID__) - -#define PATHSEP '/' -#define PATHSEPSTR "/" -#define FILEPREFIX "/data/data/com.emul.oricutron/files/" -#define ROMPREFIX FILEPREFIX"roms/" -#define IMAGEPREFIX FILEPREFIX"images/" - +#if defined(WIN32) + #define PATHSEP '\\' + #define PATHSEPSTR "\\" #else + #define PATHSEP '/' + #define PATHSEPSTR "/" +#endif -#define PATHSEP '/' -#define PATHSEPSTR "/" -#define FILEPREFIX -#define ROMPREFIX "roms/" -#define IMAGEPREFIX "images/" +#define ROMPREFIX "roms"PATHSEPSTR +#define IMAGEPREFIX "images"PATHSEPSTR -#endif +const char *get_fileprefix(); /* SDL related stuff */ #include "system_sdl.h" From f1af4d1316702969a40621b8b0cfae14a429c058 Mon Sep 17 00:00:00 2001 From: iss Date: Sun, 19 Nov 2023 14:01:49 +0200 Subject: [PATCH 126/143] fix: strncpy/MKPATH_MAX warning --- gui.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui.c b/gui.c index cb23bb35..e494786d 100644 --- a/gui.c +++ b/gui.c @@ -389,7 +389,7 @@ struct osdmenu menus[] = { { "Main Menu", LAST_ITEM(mainitems)-4, mainite // Prepend file prefix to filename static void mkpath( char buf[MKPATH_MAX], const char *filename ) { - strncpy( buf, get_fileprefix(), MKPATH_MAX ); + strncpy( buf, get_fileprefix(), MKPATH_MAX-1 ); buf[MKPATH_MAX-1] = 0; strncat( buf, filename, MKPATH_MAX-strlen(buf)-1 ); } From 35160b40c20289696ff505adb97010b322acbb62 Mon Sep 17 00:00:00 2001 From: seclorum Date: Sat, 18 May 2024 13:06:37 +0200 Subject: [PATCH 127/143] Master www merge (#196) * local branch for www dev * emcmake cmake .. is now working * Readme file First push to origin * Menus are now working. Need to debug filerequestors. * Added a warning about the gfx_atmoskbd.psd which is quite big and useless for Oricutron. * Menus are starting to work even though there are still some memory problems from time to time. Also fixed Mac compilation of the SDL2 version which is WAY faster. * Fixing deprecation of NSAlertDefaultReturn in filereq_osx.m * The web version is now able to download .dsk and .tap files from the same directory on the webserver. Moreover these files are stored in the browser's IndexedDB so that you can save your modifications to the files. * Added a solution for people who do not have PHP on their website. Removed a few useless traces and work around bugs (audio not pausing) that cannot be solved (emscripten and/or SDL port bugs). * Updating the current version of Oricutron.js * Mistakenly overwrote the good oricutron.html file. Going back to the previous committed version. Thanks a lot to git for being able to correct my gitty blunders ;) * Persisting snapshot and tape saves to IDBFS. Ie you can now save snapshots and ort tapes in your browser storage. * You can now download tape, dsk or snapshot files to your computer. * Simplifying the code to be able to better debug. Added compile options to disable the Monitor, the Pravetz (partial) and the Oric1 (partial) hardwares. --------- Co-authored-by: Patrice Torguet Co-authored-by: Patrice Torguet --- Makefile | 6 +- .../Oricutron.xcodeproj/project.pbxproj | 65 ++- .../UserInterfaceState.xcuserstate | Bin 110290 -> 180558 bytes .../xcschemes/Oricutron.xcscheme | 37 +- .../Oricutron/Oricutron/Oricutron-Info.plist | 2 +- .../Oricutron/Oricutron/Oricutron-Prefix.pch | 15 + .../OricutronTests/OricutronTests-Info.plist | 2 +- disk.c | 13 + filereq_osx.m | 9 +- filereq_sdl.c | 28 +- gui.c | 34 +- gui.h | 4 + keyboard.c | 2 +- keyboard.h | 2 +- machine.c | 31 +- main.c | 427 +++++++++++++++--- monitor.c | 17 + msgbox_sdl.c | 11 + oricutron.cfg | 8 +- snapshot.c | 15 + system.h | 34 +- tape.c | 20 + www/CMakeLists.txt | 59 +++ www/Oricutron.data | Bin 0 -> 1608333 bytes www/Oricutron.js | 1 + www/Oricutron.wasm | Bin 0 -> 1485607 bytes www/Readme.txt | 116 +++++ www/dir.php | 16 + www/download.html | 28 ++ www/index.html | 46 ++ www/index_nophp.html | 49 ++ www/oricutron.html | 257 +++++++++++ 32 files changed, 1246 insertions(+), 108 deletions(-) create mode 100644 XCode/Oricutron/Oricutron/Oricutron-Prefix.pch create mode 100644 www/CMakeLists.txt create mode 100644 www/Oricutron.data create mode 100644 www/Oricutron.js create mode 100755 www/Oricutron.wasm create mode 100644 www/Readme.txt create mode 100644 www/dir.php create mode 100644 www/download.html create mode 100644 www/index.html create mode 100644 www/index_nophp.html create mode 100644 www/oricutron.html diff --git a/Makefile b/Makefile index 49b9a65a..a720b0af 100644 --- a/Makefile +++ b/Makefile @@ -329,11 +329,11 @@ else CFLAGS += -D__OPENGL_AVAILABLE__ -D__CBCOPY__ -D__CBPASTE__ $(shell $(SDL_LIB)-config --cflags) endif ifneq (,$(CROSS_LFLAGS)) -LFLAGS += $(CROSS_LFLAGS) -s +LFLAGS += $(CROSS_LFLAGS) else -LFLAGS += $(shell $(SDL_LIB)-config --libs) -s +LFLAGS += $(shell $(SDL_LIB)-config --libs) endif -LFLAGS += -lm -Wl,-framework,OpenGL -Wl,-framework,Cocoa +LFLAGS += -lm -Wl,-framework,OpenGL -framework CoreFoundation -framework AppKit TARGET = $(TARGET_NAME) FILEREQ_OBJ = MSGBOX_OBJ = diff --git a/XCode/Oricutron/Oricutron.xcodeproj/project.pbxproj b/XCode/Oricutron/Oricutron.xcodeproj/project.pbxproj index ff6edafa..bf3fb8c5 100644 --- a/XCode/Oricutron/Oricutron.xcodeproj/project.pbxproj +++ b/XCode/Oricutron/Oricutron.xcodeproj/project.pbxproj @@ -40,6 +40,8 @@ 181F131918CA6378009690E0 /* msgbox_osx.m in Sources */ = {isa = PBXBuildFile; fileRef = 181F131618CA6378009690E0 /* msgbox_osx.m */; }; 181F131B18CA63F0009690E0 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 181F131A18CA63F0009690E0 /* OpenGL.framework */; }; 181F131D18CA6505009690E0 /* SDL.framework in Resources */ = {isa = PBXBuildFile; fileRef = 181F131118CA6219009690E0 /* SDL.framework */; }; + 1863CD96255BEA4300B1D09B /* oric_ch376_plugin.c in Sources */ = {isa = PBXBuildFile; fileRef = 1863CD92255BEA4300B1D09B /* oric_ch376_plugin.c */; }; + 1863CD97255BEA4300B1D09B /* ch376.c in Sources */ = {isa = PBXBuildFile; fileRef = 1863CD95255BEA4300B1D09B /* ch376.c */; }; 18A21B171B5CD8EC00B1BF3F /* system_sdl.c in Sources */ = {isa = PBXBuildFile; fileRef = 18A21B161B5CD8EC00B1BF3F /* system_sdl.c */; }; 18D270CA18D7346600467488 /* keyboard.c in Sources */ = {isa = PBXBuildFile; fileRef = 18D270C818D7346600467488 /* keyboard.c */; }; 18DC24B119D010EA00C6BCBE /* 6551_com.c in Sources */ = {isa = PBXBuildFile; fileRef = 18DC24AE19D010EA00C6BCBE /* 6551_com.c */; }; @@ -65,7 +67,6 @@ 181F128A18CA616A009690E0 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 181F128D18CA616A009690E0 /* Oricutron-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Oricutron-Info.plist"; sourceTree = ""; }; 181F128F18CA616A009690E0 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 181F129318CA616A009690E0 /* Oricutron-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Oricutron-Prefix.pch"; sourceTree = ""; }; 181F129518CA616A009690E0 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; 181F129D18CA616A009690E0 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 181F12A318CA616A009690E0 /* OricutronTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = OricutronTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -119,6 +120,11 @@ 181F131518CA6378009690E0 /* gui_osx.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = gui_osx.m; path = ../../../gui_osx.m; sourceTree = ""; }; 181F131618CA6378009690E0 /* msgbox_osx.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = msgbox_osx.m; path = ../../../msgbox_osx.m; sourceTree = ""; }; 181F131A18CA63F0009690E0 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = ../../../../../../../System/Library/Frameworks/OpenGL.framework; sourceTree = ""; }; + 1863CD8B255BE39500B1D09B /* Oricutron-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Oricutron-Prefix.pch"; sourceTree = ""; }; + 1863CD92255BEA4300B1D09B /* oric_ch376_plugin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = oric_ch376_plugin.c; path = ../../../plugins/ch376/oric_ch376_plugin.c; sourceTree = ""; }; + 1863CD93255BEA4300B1D09B /* ch376.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ch376.h; path = ../../../plugins/ch376/ch376.h; sourceTree = ""; }; + 1863CD94255BEA4300B1D09B /* oric_ch376_plugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = oric_ch376_plugin.h; path = ../../../plugins/ch376/oric_ch376_plugin.h; sourceTree = ""; }; + 1863CD95255BEA4300B1D09B /* ch376.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ch376.c; path = ../../../plugins/ch376/ch376.c; sourceTree = ""; }; 18A21B161B5CD8EC00B1BF3F /* system_sdl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = system_sdl.c; path = ../../../system_sdl.c; sourceTree = ""; }; 18A21B181B5CDAD100B1BF3F /* system_sdl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = system_sdl.h; path = ../../../system_sdl.h; sourceTree = ""; }; 18D270C818D7346600467488 /* keyboard.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = keyboard.c; path = ../../../keyboard.c; sourceTree = ""; }; @@ -194,6 +200,10 @@ 181F128B18CA616A009690E0 /* Oricutron */ = { isa = PBXGroup; children = ( + 1863CD95255BEA4300B1D09B /* ch376.c */, + 1863CD93255BEA4300B1D09B /* ch376.h */, + 1863CD92255BEA4300B1D09B /* oric_ch376_plugin.c */, + 1863CD94255BEA4300B1D09B /* oric_ch376_plugin.h */, 18A21B181B5CDAD100B1BF3F /* system_sdl.h */, 18A21B161B5CD8EC00B1BF3F /* system_sdl.c */, 18D270C818D7346600467488 /* keyboard.c */, @@ -259,8 +269,8 @@ children = ( 181F128D18CA616A009690E0 /* Oricutron-Info.plist */, 181F128E18CA616A009690E0 /* InfoPlist.strings */, - 181F129318CA616A009690E0 /* Oricutron-Prefix.pch */, 181F129418CA616A009690E0 /* Credits.rtf */, + 1863CD8B255BE39500B1D09B /* Oricutron-Prefix.pch */, ); name = "Supporting Files"; sourceTree = ""; @@ -309,7 +319,7 @@ 181F127A18CA616A009690E0 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0500; + LastUpgradeCheck = 1210; ORGANIZATIONNAME = "Peter Gordon"; TargetAttributes = { 181F12A218CA616A009690E0 = { @@ -319,7 +329,7 @@ }; buildConfigurationList = 181F127D18CA616A009690E0 /* Build configuration list for PBXProject "Oricutron" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -377,6 +387,7 @@ 181F130A18CA61C6009690E0 /* tape.c in Sources */, 18DC24B219D010EA00C6BCBE /* 6551_loopback.c in Sources */, 181F12EE18CA61C6009690E0 /* 6502.c in Sources */, + 1863CD96255BEA4300B1D09B /* oric_ch376_plugin.c in Sources */, 18DC24B119D010EA00C6BCBE /* 6551_com.c in Sources */, 181F131918CA6378009690E0 /* msgbox_osx.m in Sources */, 181F12F118CA61C6009690E0 /* avi.c in Sources */, @@ -386,6 +397,7 @@ 181F131818CA6378009690E0 /* gui_osx.m in Sources */, 181F130918CA61C6009690E0 /* snapshot.c in Sources */, 18D270CA18D7346600467488 /* keyboard.c in Sources */, + 1863CD97255BEA4300B1D09B /* ch376.c in Sources */, 181F12F318CA61C6009690E0 /* disk.c in Sources */, 181F12F018CA61C6009690E0 /* 8912.c in Sources */, 181F12FB18CA61C6009690E0 /* gui.c in Sources */, @@ -435,21 +447,37 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", @@ -464,6 +492,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.9; ONLY_ACTIVE_ARCH = YES; + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = YES; SDKROOT = macosx; }; name = Debug; @@ -472,22 +501,37 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -496,6 +540,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.9; ONLY_ACTIVE_ARCH = YES; + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = YES; SDKROOT = macosx; }; name = Release; @@ -505,6 +550,9 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_OBJC_ARC = NO; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; + CODE_SIGN_IDENTITY = "-"; COMBINE_HIDPI_IMAGES = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -512,6 +560,7 @@ ); GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Oricutron/Oricutron-Prefix.pch"; + HEADER_SEARCH_PATHS = /opt/X11/include; INFOPLIST_FILE = "Oricutron/Oricutron-Info.plist"; LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Resources/"; OTHER_CFLAGS = ""; @@ -527,6 +576,7 @@ "-D__OPENGL_AVAILABLE__", "-DSDL_MAJOR_VERSION=1", ); + PRODUCT_BUNDLE_IDENTIFIER = "uk.org.petergordon.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -537,6 +587,9 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_OBJC_ARC = NO; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; + CODE_SIGN_IDENTITY = "-"; COMBINE_HIDPI_IMAGES = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -544,6 +597,7 @@ ); GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Oricutron/Oricutron-Prefix.pch"; + HEADER_SEARCH_PATHS = /opt/X11/include; INFOPLIST_FILE = "Oricutron/Oricutron-Info.plist"; LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Resources/"; OTHER_CFLAGS = ""; @@ -559,6 +613,7 @@ "-DBACKEND_COM", "-DBACKEND_MODEM", ); + PRODUCT_BUNDLE_IDENTIFIER = "uk.org.petergordon.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -580,6 +635,7 @@ "$(inherited)", ); INFOPLIST_FILE = "OricutronTests/OricutronTests-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "uk.org.petergordon.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUNDLE_LOADER)"; WRAPPER_EXTENSION = xctest; @@ -598,6 +654,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Oricutron/Oricutron-Prefix.pch"; INFOPLIST_FILE = "OricutronTests/OricutronTests-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "uk.org.petergordon.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUNDLE_LOADER)"; WRAPPER_EXTENSION = xctest; diff --git a/XCode/Oricutron/Oricutron.xcodeproj/project.xcworkspace/xcuserdata/torguet.xcuserdatad/UserInterfaceState.xcuserstate b/XCode/Oricutron/Oricutron.xcodeproj/project.xcworkspace/xcuserdata/torguet.xcuserdatad/UserInterfaceState.xcuserstate index 31cc5640b683f23701a1fb3b006affa319b83de3..3a0c0179e1f3b42d3cb4dc8e4a5461c1960561f6 100644 GIT binary patch literal 180558 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

ZNUtY%d5)2UEMLP@km+HM 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 BO9cP` literal 110290 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 diff --git a/XCode/Oricutron/Oricutron.xcodeproj/xcuserdata/torguet.xcuserdatad/xcschemes/Oricutron.xcscheme b/XCode/Oricutron/Oricutron.xcodeproj/xcuserdata/torguet.xcuserdatad/xcschemes/Oricutron.xcscheme index 24c244f2..4975b9fc 100644 --- a/XCode/Oricutron/Oricutron.xcodeproj/xcuserdata/torguet.xcuserdatad/xcschemes/Oricutron.xcscheme +++ b/XCode/Oricutron/Oricutron.xcodeproj/xcuserdata/torguet.xcuserdatad/xcschemes/Oricutron.xcscheme @@ -1,6 +1,6 @@ + shouldUseLaunchSchemeArgsEnv = "YES"> + + + + @@ -39,26 +48,19 @@ - - - - - + - - - + CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - uk.org.petergordon.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/XCode/Oricutron/Oricutron/Oricutron-Prefix.pch b/XCode/Oricutron/Oricutron/Oricutron-Prefix.pch new file mode 100644 index 00000000..5d15dfce --- /dev/null +++ b/XCode/Oricutron/Oricutron/Oricutron-Prefix.pch @@ -0,0 +1,15 @@ +// +// Oricutron-Prefix.pch +// Oricutron +// +// Created by Patrice Torguet on 11/11/2020. +// Copyright © 2020 Peter Gordon. All rights reserved. +// + +#ifndef Oricutron_Prefix_pch +#define Oricutron_Prefix_pch + +// Include any system framework and library headers here that should be included in all compilation units. +// You will also need to set the Prefix Header build setting of one or more of your targets to reference this file. + +#endif /* Oricutron_Prefix_pch */ diff --git a/XCode/Oricutron/OricutronTests/OricutronTests-Info.plist b/XCode/Oricutron/OricutronTests/OricutronTests-Info.plist index 0a7da72d..169b6f71 100644 --- a/XCode/Oricutron/OricutronTests/OricutronTests-Info.plist +++ b/XCode/Oricutron/OricutronTests/OricutronTests-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - uk.org.petergordon.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType diff --git a/disk.c b/disk.c index ebdae267..63dab2ee 100644 --- a/disk.c +++ b/disk.c @@ -47,6 +47,10 @@ #include "msgbox.h" #include "filereq.h" +#ifdef WWW +#include +#endif + extern char diskfile[], diskpath[], filetmp[]; extern char telediskfile[], telediskpath[]; extern char pravdiskfile[], pravdiskpath[]; @@ -321,6 +325,15 @@ SDL_bool diskimage_save( struct machine *oric, char *fname, int drive ) oric->wddisk.disk[drive]->modified = SDL_FALSE; oric->wddisk.disk[drive]->modified_time = 0; +#ifdef WWW + // sync from memory state to persisted + EM_ASM( + FS.syncfs(function (err) { + assert(!err); + }); + ); +#endif + // Remember to update the GUI refreshdisks = SDL_TRUE; return SDL_TRUE; diff --git a/filereq_osx.m b/filereq_osx.m index fb5a6b3f..a672abf9 100644 --- a/filereq_osx.m +++ b/filereq_osx.m @@ -37,6 +37,13 @@ #include "machine.h" #include "filereq.h" +#ifndef MAC_OS_X_VERSION_10_9 +#define MAC_OS_X_VERSION_10_9 1090 +#endif + +#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_9 +#define NSModalResponseOK NSFileHandlingPanelOKButton +#endif SDL_bool init_filerequester( struct machine *oric ) { @@ -128,7 +135,7 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna } } - ret = [sp runModal] == NSAlertDefaultReturn; + ret = [sp runModal] == NSModalResponseOK; if (!ret) return ret; diff --git a/filereq_sdl.c b/filereq_sdl.c index 82a0c8b3..61386212 100644 --- a/filereq_sdl.c +++ b/filereq_sdl.c @@ -40,6 +40,10 @@ #include "machine.h" #include "filereq.h" +#ifdef WWW +#include +#endif + // Externs extern SDL_Surface *screen; extern struct textzone *tz[NUM_TZ]; @@ -88,7 +92,6 @@ static void filereq_render( struct machine *oric ) oric->render_video( oric, SDL_TRUE ); oric->render_textzone( oric, TZ_FILEREQ ); - oric->render_end( oric ); } @@ -334,8 +337,15 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna for( ;; ) { +#ifdef WWW + if( !SDL_PollEvent( &event )) { + emscripten_sleep(10); + continue; + } +#else if( !SDL_WaitEvent( &event ) ) break; +#endif mx = -1; my = -1; @@ -367,8 +377,14 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna break; case SDL_MOUSEBUTTONDOWN: - if( ( mx < 1 ) || ( mx > 38 ) ) + if( ( mx < 1 ) || ( mx > 38 ) ) { +#ifdef WWW + SDL_COMPAT_EnableUNICODE( wasunicode ); + SDL_COMPAT_EnableKeyRepeat( wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0 ); + return SDL_FALSE; +#endif break; + } if( ( my == 28 ) || ( my == 30 ) ) { @@ -380,8 +396,14 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna break; } - if( ( my < 1 ) || ( my > 26 ) ) + if( ( my < 1 ) || ( my > 26 ) ) { +#ifdef WWW + SDL_COMPAT_EnableUNICODE( wasunicode ); + SDL_COMPAT_EnableKeyRepeat( wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0 ); + return SDL_FALSE; +#endif break; + } freqf_cgad = 2; diff --git a/gui.c b/gui.c index e494786d..6a5bb232 100644 --- a/gui.c +++ b/gui.c @@ -109,9 +109,14 @@ struct guiimg gimgs[NUM_GIMG] = { { IMAGEPREFIX"statusbar.bmp", 64 { IMAGEPREFIX"tape_stop.bmp", GIMG_W_TAPE, 16, NULL }, { IMAGEPREFIX"tape_record.bmp", GIMG_W_TAPE, 16, NULL }, { IMAGEPREFIX"avirec.bmp", GIMG_W_AVIR, 16, NULL }, +#ifndef WWW_NO_ORIC1 { IMAGEPREFIX"gfx_oric1kbd.bmp", 640, 240, NULL }, +#endif { IMAGEPREFIX"gfx_atmoskbd.bmp", 640, 240, NULL }, - { IMAGEPREFIX"gfx_pravetzkbd.bmp", 640, 240, NULL }}; +#ifndef WWW_NO_PRAVETZ + { IMAGEPREFIX"gfx_pravetzkbd.bmp", 640, 240, NULL } +#endif + }; SDL_bool soundavailable, soundon; #if defined(__linux__) @@ -252,14 +257,18 @@ struct osdmenuitem mainitems[] = { { "Insert tape...", "T", 't', { "Debug options...", "D", 'd', gotomenu, 3, 0 }, { "Overclock options...", "C", 'c', gotomenu, 6, 0 }, { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, +#ifndef WWW_NO_MONITOR { "Monitor", "[F2]", SDLK_F2, setemumode, EM_DEBUG, 0 }, +#endif { "Reset Button NMI", "[F3]", SDLK_F3, softresetoric, 0, 0 }, { "Hard Reset", "[F4]", SDLK_F4, resetoric, 0, 0 }, { "Back", "\x17", SDLK_BACKSPACE,setemumode, EM_RUNNING, 0 }, { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, { "About", NULL, 0, gotomenu, 5, 0 }, { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, +#ifndef WWW { "Quit", NULL, 0, setemumode, EM_PLEASEQUIT, 0 }, +#endif { NULL, } }; struct osdmenuitem hwopitems[] = { { " Oric-1", "1", SDLK_1, swapmach, (0xffff<<16)|MACH_ORIC1, 0 }, @@ -476,13 +485,17 @@ void draw_keyboard( struct machine *oric ) { if (oric->show_keyboard) { switch( oric->type ) { +#ifndef WWW_NO_PRAVETZ case MACH_PRAVETZ: oric->render_gimg( GIMG_PRAVETZ_KEYBOARD, 0, 480); break; +#endif +#ifndef WWW_NO_ORIC1 case MACH_ORIC1: case MACH_ORIC1_16K: oric->render_gimg( GIMG_ORIC1_KEYBOARD, 0, 480); break; +#endif default: oric->render_gimg( GIMG_ATMOS_KEYBOARD, 0, 480); break; @@ -608,8 +621,10 @@ void render( struct machine *oric ) { int perc, fps; //, i; +#ifndef WWW_NO_MONITOR if( oric->emu_mode == EM_DEBUG ) mon_update( oric ); +#endif oric->render_begin( oric ); @@ -651,9 +666,11 @@ void render( struct machine *oric ) } break; +#ifndef WWW_NO_MONITOR case EM_DEBUG: mon_render( oric ); break; +#endif } oric->render_end( oric ); @@ -1150,7 +1167,9 @@ void inserttape( struct machine *oric, struct osdmenuitem *mitem, int dummy ) } tape_load_tap( oric, filetmp ); +#ifndef WWW_NO_MONITOR if( oric->symbolsautoload ) mon_new_symbols( &oric->usersyms, oric, "symbols", SYM_BESTGUESS, SDL_TRUE, SDL_TRUE ); +#endif setemumode( oric, NULL, EM_RUNNING ); } @@ -1321,7 +1340,9 @@ void insertdisk( struct machine *oric, struct osdmenuitem *mitem, int drive ) { oric->lasttapefile[0] = 0; tape_load_tap( oric, filetmp ); +#ifndef WWW_NO_MONITOR if( oric->symbolsautoload ) mon_new_symbols( &oric->usersyms, oric, "symbols", SYM_BESTGUESS, SDL_TRUE, SDL_TRUE ); +#endif } setemumode( oric, NULL, EM_RUNNING ); return; @@ -1773,7 +1794,6 @@ void gotomenu( struct machine *oric, struct osdmenuitem *mitem, int menunum ) keyw = (int)strlen( cmenu->items[i].key )+1; } } - w+=keyw+2; i+=2; if( !alloc_textzone( oric, TZ_MENU, 320-w*4, 240-i*6, w, i, cmenu->title ) ) @@ -1888,11 +1908,9 @@ SDL_bool menu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) { SDL_bool done = SDL_FALSE; int i, x, y; - // Wot, no menu?! if( ( !cmenu ) || ( !tz[TZ_MENU] ) ) return done; - x = -1; y = -1; switch( ev->type ) @@ -2027,6 +2045,12 @@ SDL_bool menu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) case SDLK_ESCAPE: setemumode( oric, NULL, EM_RUNNING ); +#ifdef WWW + if( oric->ay.soundon ) + { + SDL_PauseAudio(0); + } +#endif *needrender = SDL_TRUE; break; @@ -2203,7 +2227,9 @@ void swap_render_mode( struct machine *oric, struct osdmenuitem *mitem, int newr } joy_setup( oric ); +#ifdef WWW_MONITOR mon_warminit( oric ); +#endif setemumode( oric, NULL, EM_RUNNING ); } diff --git a/gui.h b/gui.h index 1693f618..ae113f4f 100644 --- a/gui.h +++ b/gui.h @@ -111,9 +111,13 @@ enum GIMG_TAPE_STOP, GIMG_TAPE_RECORD, GIMG_AVI_RECORD, +#ifndef WWW_NO_ORIC1 GIMG_ORIC1_KEYBOARD, +#endif GIMG_ATMOS_KEYBOARD, +#ifndef WWW_NO_PRAVETZ GIMG_PRAVETZ_KEYBOARD, +#endif NUM_GIMG }; diff --git a/keyboard.c b/keyboard.c index 75b8cdba..9e448cf3 100644 --- a/keyboard.c +++ b/keyboard.c @@ -465,7 +465,7 @@ SDL_bool keyboard_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrend return done; } -void release_sticky_keys() +void release_sticky_keys(void) { release_keys = SDL_TRUE; } diff --git a/keyboard.h b/keyboard.h index b5aac594..e7a1a609 100644 --- a/keyboard.h +++ b/keyboard.h @@ -43,7 +43,7 @@ int kbd_init( struct machine *oric ); SDL_bool keyboard_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ); -void release_sticky_keys(); +void release_sticky_keys(void); void add_to_keyboard_mapping( struct keyboard_mapping *map, SDL_COMPAT_KEY host_key, SDL_COMPAT_KEY oric_key ); diff --git a/machine.c b/machine.c index 3f127ab3..71cdc1ba 100644 --- a/machine.c +++ b/machine.c @@ -271,7 +271,7 @@ void setemumode( struct machine *oric, struct osdmenuitem *mitem, int mode ) if( soundavailable ) SDL_PauseAudio( 1 ); break; - +#ifndef WWW_NO_MONITOR case EM_DEBUG: if( vidcap ) avi_close( &vidcap ); mon_enter( oric ); @@ -281,6 +281,7 @@ void setemumode( struct machine *oric, struct osdmenuitem *mitem, int mode ) if( soundavailable ) SDL_PauseAudio( 1 ); break; +#endif } } @@ -1096,10 +1097,11 @@ static SDL_bool load_rom( struct machine *oric, char *fname, int size, unsigned } SDL_RWclose( f ); - +#ifndef WWW_NO_MONITOR sprintf( tmpname, "%s.sym", fname ); mon_new_symbols( stab, oric, tmpname, symflags, SDL_FALSE, SDL_FALSE ); free( tmpname ); +#endif return SDL_TRUE; } @@ -1107,7 +1109,7 @@ static SDL_bool load_rom( struct machine *oric, char *fname, int size, unsigned void preinit_machine( struct machine *oric ) { int i; - +#ifndef WWW_NO_MONITOR mon_init_symtab( &sym_microdisc ); mon_init_symtab( &sym_jasmin ); mon_init_symtab( &oric->romsyms ); @@ -1119,6 +1121,7 @@ void preinit_machine( struct machine *oric ) mon_init_symtab( &oric->tele_banksyms[5] ); mon_init_symtab( &oric->tele_banksyms[6] ); mon_init_symtab( &oric->tele_banksyms[7] ); +#endif oric->mem = NULL; oric->rom = NULL; @@ -1320,7 +1323,6 @@ SDL_bool emu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) break; } break; - case SDL_MOUSEBUTTONUP: if( ev->button.button == SDL_BUTTON_LEFT ) lightpendown = SDL_FALSE; @@ -1330,7 +1332,20 @@ SDL_bool emu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) move_lightpen( oric, ev->motion.x, ev->motion.y ); break; - case SDL_KEYUP: +#ifdef WWW + case SDL_MULTIGESTURE: + { + SDL_MultiGestureEvent *m = (SDL_MultiGestureEvent*)ev; + if (m->numFingers == 2) + { + setemumode( oric, NULL, EM_MENU ); + *needrender = SDL_TRUE; + } + break; + } +#endif + + case SDL_KEYUP: switch( ev->key.keysym.sym ) { case SDLK_F1: @@ -2092,6 +2107,7 @@ void shut_machine( struct machine *oric ) if( oric->tsavf ) tape_stop_savepatch( oric ); if( oric->tapecap ) toggletapecap( oric, find_item_by_function(mainitems, toggletapecap), 0 ); if (oric->tapebuf) { free(oric->tapebuf); oric->tapebuf = NULL; } +#ifndef WWW_NO_MONITOR mon_freesyms( &sym_microdisc ); mon_freesyms( &sym_bd500 ); mon_freesyms( &sym_jasmin ); @@ -2105,6 +2121,7 @@ void shut_machine( struct machine *oric ) mon_freesyms( &oric->tele_banksyms[5] ); mon_freesyms( &oric->tele_banksyms[6] ); mon_freesyms( &oric->tele_banksyms[7] ); +#endif } void setdrivetype( struct machine *oric, struct osdmenuitem *mitem, int type ) @@ -2135,7 +2152,9 @@ void setdrivetype( struct machine *oric, struct osdmenuitem *mitem, int type ) break; } +#ifndef WWW_NO_MONITOR mon_state_reset( oric ); +#endif if( !init_machine( oric, oric->type, SDL_FALSE ) ) { shut( oric ); @@ -2167,7 +2186,9 @@ void swapmach( struct machine *oric, struct osdmenuitem *mitem, int which ) /* Wipe it to prevent garbage. */ clear_textzone( oric, TZ_DISK ); +#ifndef WWW_NO_MONITOR mon_state_reset( oric ); +#endif if( !init_machine( oric, which, which!=oric->type ) ) { shut( oric ); diff --git a/main.c b/main.c index 03939e9e..02405c07 100644 --- a/main.c +++ b/main.c @@ -18,6 +18,11 @@ ** */ +#ifdef WWW +#include +#include +#endif + #ifdef __APPLE__ #include "CoreFoundation/CoreFoundation.h" #endif @@ -643,7 +648,6 @@ static void load_config( struct start_opts *sto, struct machine *oric ) continue; } } - fclose( f ); } @@ -792,7 +796,6 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) #else hwsurface = SDL_FALSE; #endif - preinit_ula( oric ); preinit_machine( oric ); preinit_render_sw( oric ); @@ -1302,6 +1305,62 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) if( sto->start_disk[0] ) { +#ifdef WWW + // NOT SURE WHY I HAD TO DO THIS ??? + if( sto->start_disk[0] ) + { + if( sto->start_disks_count < 4 ) + { + strcpy( sto->start_disks[sto->start_disks_count], sto->start_disk ); + sto->start_disks_count++; + } + } +#endif + switch (detect_image_type(sto->start_disk)) + { + case IMG_ATMOS_MICRODISC: + if (!sto->start_machine_set) sto->start_machine = MACH_ATMOS; + if (!sto->start_disktype_set) sto->start_disktype = DRV_MICRODISC; + break; + + case IMG_ATMOS_JASMIN: + if (!sto->start_machine_set) sto->start_machine = MACH_ATMOS; + if (!sto->start_disktype_set) sto->start_disktype = DRV_JASMIN; + break; + + case IMG_TELESTRAT_DISK: + if (!sto->start_machine_set) sto->start_machine = MACH_TELESTRAT; + if (!sto->start_disktype_set) sto->start_disktype = DRV_MICRODISC; + break; + + case IMG_BD500_DISK: + if (!sto->start_machine_set) sto->start_machine = MACH_ATMOS; + if (!sto->start_disktype_set) sto->start_disktype = DRV_BD500; + break; + + case IMG_PRAVETZ_DISK: + if (!sto->start_machine_set) sto->start_machine = MACH_PRAVETZ; + if (!sto->start_disktype_set) sto->start_disktype = DRV_PRAVETZ; + break; + + case IMG_GUESS_MICRODISC: + if (!sto->start_disktype_set) sto->start_disktype = DRV_MICRODISC; + break; + + case IMG_TAPE: + printf("'%s' seems to be a tape image.\n", sto->start_disk); + strcpy(sto->start_tape, sto->start_disk); + sto->start_disk[0] = 0; + break; + + case IMG_SNAPSHOT: + printf("'%s' seems to be a snapshot file.\n", opt_arg); + strncpy( sto->start_snapshot, opt_arg, 1024); + sto->start_snapshot[1023] = 0; + sto->start_disk[0] = 0; + break; + } + for( i=0; i<4; i++ ) { disk_eject( oric, i ); @@ -1327,6 +1386,7 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) queuekeys( "CLOAD\"\"\x0d" ); } +#ifndef WWW_NO_MONITOR mon_init( oric ); if( sto->start_syms[0] ) mon_new_symbols( &oric->usersyms, oric, sto->start_syms, SYM_BESTGUESS, SDL_TRUE, SDL_TRUE ); @@ -1391,7 +1451,7 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) if( sto->start_debug ) setemumode( oric, NULL, EM_DEBUG ); - +#endif free( sto ); return SDL_TRUE; } @@ -1407,7 +1467,9 @@ void shut( struct machine *oric ) shut_machine( oric ); shut_joy( oric ); shut_ula( oric ); +#ifndef WWW_NO_MONITOR mon_shut( oric ); +#endif shut_filerequester( oric ); shut_msgbox( oric ); shut_gui( oric ); @@ -1429,9 +1491,11 @@ void frameloop_overclock( struct machine *oric, SDL_bool *framedone, SDL_bool *n { if( m6502_set_icycles( &oric->cpu, SDL_TRUE, mon_bpmsg ) ) { +#ifndef WWW_NO_MONITOR // Hit breakpoint setemumode( oric, NULL, EM_DEBUG ); *needrender = SDL_TRUE; +#endif break; } @@ -1476,9 +1540,11 @@ void frameloop_overclock( struct machine *oric, SDL_bool *framedone, SDL_bool *n if( m6502_inst( &oric->cpu ) ) { // Hit JAM instruction +#ifndef WWW_NO_MONITOR mon_printf_above( "Opcode %02X executed at %04X", oric->cpu.calcop, oric->cpu.lastpc ); setemumode( oric, NULL, EM_DEBUG ); *needrender = SDL_TRUE; +#endif break; } } @@ -1499,9 +1565,11 @@ void frameloop_normal( struct machine *oric, SDL_bool *framedone, SDL_bool *need { if( m6502_set_icycles( &oric->cpu, SDL_TRUE, mon_bpmsg ) ) { +#ifndef WWW_NO_MONITOR // Hit breakpoint setemumode( oric, NULL, EM_DEBUG ); *needrender = SDL_TRUE; +#endif break; } @@ -1530,10 +1598,12 @@ void frameloop_normal( struct machine *oric, SDL_bool *framedone, SDL_bool *need oric->cpu.rastercycles -= oric->cpu.icycles; if( m6502_inst( &oric->cpu ) ) { +#ifndef WWW_NO_MONITOR // Hit JAM instruction mon_printf_above( "Opcode %02X executed at %04X", oric->cpu.calcop, oric->cpu.lastpc ); setemumode( oric, NULL, EM_DEBUG ); *needrender = SDL_TRUE; +#endif break; } } @@ -1648,8 +1718,13 @@ static void loop_handler( void* arg ) ctx->framedone = SDL_FALSE; } +#if defined(WWW) + if (!SDL_PollEvent(event)) + break; +#else if (!SDL_PollEvent(event)) continue; +#endif } else { @@ -1659,83 +1734,323 @@ static void loop_handler( void* arg ) render( oric ); ctx->needrender = SDL_FALSE; } +#if defined(WWW) + if (!SDL_PollEvent(event)) + break; +#else if (!SDL_WaitEvent(event)) break; +#endif } do { - switch (event->type) + switch (event->type) { + case SDL_COMPAT_ACTIVEEVENT: { + if (SDL_COMPAT_IsAppActive(event)) { + oric->shut_render(oric); + oric->init_render(oric); + ctx->needrender = SDL_TRUE; + } + } + break; + case SDL_QUIT: + done = SDL_TRUE; + break; + + default: + switch (oric->emu_mode) { + case EM_MENU: + done |= menu_event(event, oric, &ctx->needrender); + break; + + case EM_RUNNING: + done |= emu_event(event, oric, &ctx->needrender); + break; +#ifndef WWW_NO_MONITOR + case EM_DEBUG: + done |= mon_event(event, oric, &ctx->needrender); + break; +#endif + } + } + if (oric->show_keyboard) + keyboard_event(event, oric, &ctx->needrender); + } while ( SDL_PollEvent( event ) ); + +#if defined(WWW) + // 1 loop only because emscripten will simulate the actual looping + done = SDL_TRUE; +#endif + + } +#if defined(WWW) +#else + ay_unlockaudio(&oric->ay); + shut(oric); +#endif + } + +#ifdef WWW + +#include +#include +#include + +struct context *gCtx = NULL; + +void success(char* path, const char* fileToLoad) +{ + int i; + printf("Loading disk %s\n", fileToLoad); + switch (detect_image_type(path)) + { + case IMG_SNAPSHOT: + load_snapshot(&gCtx->oric, path); + break; + + case IMG_ATMOS_MICRODISC: + if ((gCtx->oric.type != MACH_ATMOS) && + (gCtx->oric.type != MACH_ORIC1) && + (gCtx->oric.type != MACH_PRAVETZ)) { - case SDL_COMPAT_ACTIVEEVENT: - if (SDL_COMPAT_IsAppActive(event)) - ctx->needrender = SDL_TRUE; - break; + swapmach( &gCtx->oric, NULL, (DRV_MICRODISC<<16)|MACH_ATMOS ); + break; + } - case SDL_QUIT: - done = SDL_TRUE; - break; + if ((gCtx->oric.drivetype != DRV_MICRODISC) && + (gCtx->oric.drivetype != DRV_NONE)) + { + swapmach( &gCtx->oric, NULL, (DRV_MICRODISC<<16)|gCtx->oric.type ); + } + break; - default: - switch ( oric->emu_mode ) - { - case EM_MENU: - done |= menu_event( event, oric, &ctx->needrender ); - break; + case IMG_ATMOS_JASMIN: + if ((gCtx->oric.type != MACH_ATMOS) && + (gCtx->oric.type != MACH_ORIC1) && + (gCtx->oric.type != MACH_PRAVETZ)) + { + swapmach( &gCtx->oric, NULL, (DRV_JASMIN<<16)|MACH_ATMOS ); + gCtx->oric.auto_jasmin_reset = SDL_TRUE; + break; + } - case EM_RUNNING: - done |= emu_event( event, oric, &ctx->needrender ); - break; + if (gCtx->oric.drivetype == DRV_NONE) + { + swapmach( &gCtx->oric, NULL, (DRV_JASMIN<<16)|gCtx->oric.type); + gCtx->oric.auto_jasmin_reset = SDL_TRUE; + break; + } - case EM_DEBUG: - done |= mon_event( event, oric, &ctx->needrender ); - break; - } + if (gCtx->oric.drivetype != DRV_JASMIN) + { + swapmach( &gCtx->oric, NULL, (DRV_JASMIN<<16)|gCtx->oric.type ); + gCtx->oric.auto_jasmin_reset = SDL_TRUE; + break; + } + break; + + case IMG_TELESTRAT_DISK: + if (gCtx->oric.type != MACH_TELESTRAT) + { + swapmach( &gCtx->oric, NULL, MACH_TELESTRAT ); + break; + } + break; + + case IMG_PRAVETZ_DISK: + if (gCtx->oric.type != MACH_PRAVETZ) + { + swapmach( &gCtx->oric, NULL, (DRV_PRAVETZ<<16)|MACH_PRAVETZ ); + pravdiskboot( &gCtx->oric ); + break; + } + + if (gCtx->oric.drivetype == DRV_NONE) + { + swapmach( &gCtx->oric, NULL, (DRV_PRAVETZ<<16)|MACH_PRAVETZ ); + pravdiskboot( &gCtx->oric ); + break; + } + + if (gCtx->oric.drivetype != DRV_PRAVETZ) + { + swapmach( &gCtx->oric, NULL, (DRV_PRAVETZ<<16)|MACH_PRAVETZ ); + pravdiskboot( &gCtx->oric ); + break; + } + break; + + case IMG_GUESS_MICRODISC: + if (gCtx->oric.drivetype == DRV_PRAVETZ) + { + swapmach( &gCtx->oric, NULL, (DRV_MICRODISC<<16)|gCtx->oric.type ); + break; } - if (oric->show_keyboard) - keyboard_event( event, oric, &ctx->needrender ); + break; + + case IMG_TAPE: + gCtx->oric.lasttapefile[0] = 0; + tape_load_tap( &(gCtx->oric), path ); +#ifndef WWW_NO_MONITOR + if( gCtx->oric.symbolsautoload ) mon_new_symbols( &gCtx->oric.usersyms, &(gCtx->oric), "symbols", SYM_BESTGUESS, SDL_TRUE, SDL_TRUE ); +#endif + queuekeys( "CLOAD\"\"\x0d" ); + return; + } + + diskimage_load( &(gCtx->oric), path, 0 ); - } while ( SDL_PollEvent( event ) ); + if( gCtx->oric.drivetype == DRV_NONE ) + { + swapmach( &(gCtx->oric), NULL, (DRV_MICRODISC<<16)|gCtx->oric.type ); + return; + } +} + +void downloadSucceeded(emscripten_fetch_t *fetch) { + int fd; + char path[1024]; + + printf("Finished downloading %llu bytes from URL %s.\n", fetch->numBytes, fetch->url); + // The data is now available at fetch->data[0] through fetch->data[fetch->numBytes-1]; + printf("%s\n",fetch->data); + printf("status %d\n",fetch->status); + + sprintf(path, "/readwritefs/%s", fetch->url), + fd = open(path, O_RDWR | O_CREAT, 0666); + if (fd == -1) + perror("Failing to create file"); + else + { + if (write(fd, fetch->data, fetch->numBytes) != fetch->numBytes) { + perror("Failing to write to file"); + } else if (close(fd) != 0) { + perror("Failing to close file"); + } else { + success(path, fetch->url); + } } - ay_unlockaudio(&oric->ay); - shut(oric); + // sync from memory state to persisted + EM_ASM( + FS.syncfs(function (err) { + assert(!err); + }); + ); + + emscripten_fetch_close(fetch); // Free data associated with the fetch. } -int main( int argc, char *argv[] ) -{ - static struct context ctx; +void downloadFailed(emscripten_fetch_t *fetch) { + printf("Downloading %s failed, HTTP failure status code: %d.\n", fetch->url, fetch->status); + emscripten_fetch_close(fetch); // Also free data on failure. +} + + void EMSCRIPTEN_KEEPALIVE www_async_dload() { + + // is the file here + char * fileToLoad = getenv("FILE"); + + printf("Downloading file %s\n", fileToLoad); + + if(fileToLoad == NULL) + return; + + char path[1024]; + sprintf(path, "/readwritefs/%s", fileToLoad); + + int fd = open(path, O_RDWR); + if (fd == -1) + { + emscripten_fetch_attr_t attr; + emscripten_fetch_attr_init(&attr); + strcpy(attr.requestMethod, "GET"); + attr.attributes = EMSCRIPTEN_FETCH_LOAD_TO_MEMORY; + + attr.onsuccess = downloadSucceeded; + attr.onerror = downloadFailed; + emscripten_fetch(&attr, fileToLoad); + } else { + printf("%s is already downloaded!\n", fileToLoad); + success(path, fileToLoad); + } + } +#endif + + int main( int argc, char *argv[] ) + { + static struct context ctx; #ifdef _MSC_VER - _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); + _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); #endif - // This should center SDL window + // This should center SDL window #ifndef __MORPHOS__ - putenv("SDL_VIDEO_CENTERED=center"); + putenv("SDL_VIDEO_CENTERED=center"); #endif +#ifndef WWW init_fileprefix( argv ); +#endif + // ---------------------------------------------------------------------------- + // This makes relative paths work in C++ in Xcode by changing directory to the Resources folder inside the .app bundle +#ifdef __APPLE__ + CFBundleRef mainBundle = CFBundleGetMainBundle(); + CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle); + char path[PATH_MAX]; + if (!CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8 *)path, PATH_MAX)) + { + // error! + } + CFRelease(resourcesURL); + // this directory is something/Oricutron.app/Contents/Resources + // go down 3 times to find the app containing directory + strcat(path, "/../../.."); + chdir(path); + //printf("Current Path: %s\n", path); +#endif - memset(&ctx.oric, 0, sizeof(ctx.oric)); - if (!init(&ctx.oric, argc, argv)) - { - shut(&ctx.oric); - return EXIT_FAILURE; - } - // call to SDL_GetTicks must be behind init - ctx.now = SDL_GetTicks(); - ctx.nextframe_ms = ctx.now; - ctx.nextframe_us = ((Uint64)ctx.nextframe_ms) * 1000; - ctx.needrender = SDL_TRUE; - ctx.framedone = SDL_FALSE; - - if (load_keymap) - { - load_keyboard_mapping(&ctx.oric, keymap_path); - load_keymap = SDL_FALSE; - } + memset(&ctx.oric, 0, sizeof(ctx.oric)); + if (!init(&ctx.oric, argc, argv)) + { + shut(&ctx.oric); + return EXIT_FAILURE; + } + // call to SDL_GetTicks must be behind init + ctx.now = SDL_GetTicks(); + ctx.nextframe_ms = ctx.now; + ctx.nextframe_us = ((Uint64)ctx.nextframe_ms) * 1000; + ctx.needrender = SDL_TRUE; + ctx.framedone = SDL_FALSE; + + if (load_keymap) + { + load_keyboard_mapping(&ctx.oric, keymap_path); + load_keymap = SDL_FALSE; + } - loop_handler(&ctx); +#ifdef WWW + // save the context to a global + gCtx = &ctx; + // create read-write fs + EM_ASM( + FS.mkdir('/readwritefs'); + FS.mount(IDBFS, {}, '/readwritefs'); + + // sync from persisted state into memory and then + // run the 'www_async_dload' function + FS.syncfs(true, function (err) { + assert(!err); + // async download of space1999-fr.dsk + ccall('www_async_dload', 'v'); + }); + ); + + emscripten_set_main_loop_arg(loop_handler, &ctx, -1, 0); +#else + loop_handler(&ctx); +#endif - return EXIT_SUCCESS; -} + return EXIT_SUCCESS; + } diff --git a/monitor.c b/monitor.c index 335c2455..aed1e0bf 100644 --- a/monitor.c +++ b/monitor.c @@ -19,6 +19,8 @@ ** Monitor/Debugger */ +#ifndef WWW_NO_MONITOR + #define MAX_CONS_INPUT 127 // Max line length in console #define MAX_ASM_INPUT 36 #define CONS_WIDTH 46 // Actual console width for input @@ -29,7 +31,12 @@ #include #include +#endif + #include "system.h" + +#ifndef WWW_NO_MONITOR + #undef REG_PC // MorphOS should not define REG_PC #define REG_PC _REG_PC #include "6502.h" @@ -92,8 +99,12 @@ static int memory_search_pos=0; static struct symboltable defaultsyms; +#endif + char mon_bpmsg[80]; +#ifndef WWW_NO_MONITOR + static SDL_bool mw_split = SDL_FALSE; static int mw_which = 0; static unsigned short mw_addr[2]; @@ -610,6 +621,8 @@ static struct disinf distab[] = { { "BRK", AM_IMM }, // 00 { "INC", AM_ABX }, // FE { "ISC", AM_ABX } };// FF (illegal) +#endif + SDL_bool isws( char c ) { if( ( c == 9 ) || ( c == 32 ) ) return SDL_TRUE; @@ -665,6 +678,8 @@ int hexit( char c ) return -1; } +#ifndef WWW_NO_MONITOR + static int bp_at( struct machine *oric, unsigned short addr, int *xbp, int *mbp ) { int bpmask = 0, i; @@ -4638,3 +4653,5 @@ void dump_cputrace(struct machine *oric) } } #endif + +#endif \ No newline at end of file diff --git a/msgbox_sdl.c b/msgbox_sdl.c index 75308a39..c1d2e700 100644 --- a/msgbox_sdl.c +++ b/msgbox_sdl.c @@ -41,6 +41,10 @@ #include "machine.h" #include "msgbox.h" +#ifdef WWW +#include +#endif + struct msgboxbut { int x, y; @@ -175,8 +179,15 @@ SDL_bool msgbox( struct machine *oric, int type, char *msg ) presson = -1; for( ;; ) { +#ifdef WWW + if( !SDL_PollEvent( &event )) { + emscripten_sleep(10); + continue; + } +#else if( !SDL_WaitEvent( &event ) ) break; +#endif switch( event.type ) { diff --git a/oricutron.cfg b/oricutron.cfg index 0d56bc78..19c9af7a 100644 --- a/oricutron.cfg +++ b/oricutron.cfg @@ -63,7 +63,7 @@ diskautosave = yes ; Start with this disk in drive 0 (backslash is an escape char to insert ; quotes, so double backslash is required to insert a backslash. You can use ; forward slash as a path seperator, even on windows. -;diskimage = 'disks/barbitoric.dsk' +;diskimage = 'assets/disks/aigledor.dsk' ; ---------------------------------- @@ -83,7 +83,7 @@ pravdiskautoboot = yes ; ---------------------------------- ; Start with this tape inserted -;tapeimage = 'tapes/cyclotron.tap' +;tapeimage = 'assets/tapes/Cyclotron.tap' ; ---------------------------------- @@ -212,8 +212,8 @@ kbjoy2_fire2 = 'N' kbjoy2_fire3 = 'LALT' ; Visual keyboard -;show_keyboard = yes -;sticky_mod_keys = yes +show_keyboard = yes +sticky_mod_keys = yes ;autoload_keyboard_mapping = 'keymap/my_keymap.kma' ; Disable menu color scheme diff --git a/snapshot.c b/snapshot.c index d3b649be..f4469533 100644 --- a/snapshot.c +++ b/snapshot.c @@ -41,6 +41,10 @@ #include "tape.h" #include "msgbox.h" +#ifdef WWW +#include +#endif + extern char diskpath[]; #define MAX_BLOCK (262144) @@ -532,6 +536,15 @@ SDL_bool save_snapshot(struct machine *oric, char *filename) if (!ok) msgbox(oric, MSGBOX_OK, "Snapshot failed! (3)"); +#ifdef WWW + // sync from memory state to persisted + EM_ASM( + FS.syncfs(function (err) { + assert(!err); + }); + ); +#endif + return ok; } @@ -1481,6 +1494,7 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) free_block(blk); } +#ifdef WWW_MONITOR /* Get the rom symbols block */ if ((blk = load_block(oric, "SYR\x00", f, SDL_FALSE, -1, SDL_FALSE))) { @@ -1531,6 +1545,7 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) free_block(blk); } +#endif free_blockheaders(); fclose(f); diff --git a/system.h b/system.h index d92f86a7..ced9e137 100644 --- a/system.h +++ b/system.h @@ -34,17 +34,39 @@ /* Output audio frequency */ #define AUDIO_FREQ 44100 -#if defined(WIN32) - #define PATHSEP '\\' - #define PATHSEPSTR "\\" + +#if defined(__amigaos4__) + +#define PATHSEP '/' +#define PATHSEPSTR "/" +#define FILEPREFIX "PROGDIR:" +#define ROMPREFIX "PROGDIR:roms/" +#define IMAGEPREFIX "PROGDIR:images/" + +#elif defined(WIN32) + +#define PATHSEP '\\' +#define PATHSEPSTR "\\" +#define FILEPREFIX +#define ROMPREFIX "roms\\" +#define IMAGEPREFIX "images\\" + +#elif defined(WWW) + +#define PATHSEP '/' +#define PATHSEPSTR "/" +#define FILEPREFIX "assets/" +#define ROMPREFIX "assets/roms/" +#define IMAGEPREFIX "assets/images/" + #else + #define PATHSEP '/' #define PATHSEPSTR "/" + #define ROMPREFIX "roms"PATHSEPSTR + #define IMAGEPREFIX "images"PATHSEPSTR #endif -#define ROMPREFIX "roms"PATHSEPSTR -#define IMAGEPREFIX "images"PATHSEPSTR - const char *get_fileprefix(); /* SDL related stuff */ diff --git a/tape.c b/tape.c index 1c0f6c78..e01bc8a0 100644 --- a/tape.c +++ b/tape.c @@ -36,6 +36,10 @@ #include "tape.h" #include "msgbox.h" +#ifdef WWW +#include +#endif + extern char tapefile[], tapepath[]; extern SDL_bool refreshtape; char tmptapename[4096]; @@ -67,6 +71,14 @@ void toggletapecap( struct machine *oric, struct osdmenuitem *mitem, int dummy ) if( oric->tapecap ) { fclose( oric->tapecap ); +#ifdef WWW + // sync from memory state to persisted + EM_ASM( + FS.syncfs(function (err) { + assert(!err); + }); + ); +#endif oric->tapecap = NULL; mitem->name = "Save tape output..."; refreshtape = SDL_TRUE; @@ -1126,6 +1138,14 @@ void tape_stop_savepatch( struct machine *oric ) else { fclose( oric->tsavf ); +#ifdef WWW + // sync from memory state to persisted + EM_ASM( + FS.syncfs(function (err) { + assert(!err); + }); + ); +#endif } oric->tsavf = NULL; diff --git a/www/CMakeLists.txt b/www/CMakeLists.txt new file mode 100644 index 00000000..130293c4 --- /dev/null +++ b/www/CMakeLists.txt @@ -0,0 +1,59 @@ +cmake_minimum_required(VERSION 3.10) +set (CMAKE_C_STANDARD 99) + + +project(Oricutron) + + find_library(SDL2_LIBRARY NAME SDL2) + + include_directories(${SDL2_INCLUDE_DIRS}) + add_definitions(-D__SPECIFY_SDL_DIR__=1 -DWWW -DWWW_NO_MONITOR -DWWW_NO_PRAVETZ -DWWW_NO_ORIC1 -DAPP_NAME_FULL="Oricutron 1.2" -DAPP_YEAR="2015" + -DVERSION_COPYRIGHTS="Oricutron 1.2.0 2016 Peter Gordon" + -O3 -s USE_SDL=2 + -fsanitize=undefined -fsanitize-minimal-runtime ) + +include_directories( + ${CMAKE_CURRENT_BINARY_DIR} +) + +SET (SRCSDL + ../filereq_sdl.c + ../msgbox_sdl.c +) + +SET (SRCS + ../6551.c + ../6551_com.c + ../6551_loopback.c + ../6551_modem.c + ../gui.c + ../render_gl.c + ../render_null.c + ../render_sw.c + ../render_sw8.c + ../6502.c + ../8912.c + ../avi.c + ../plugins/ch376/ch376.c + ../disk.c + ../disk_pravetz.c + ../font.c + ../joystick.c + ../keyboard.c + ../machine.c + ../main.c + ../monitor.c + ../plugins/ch376/oric_ch376_plugin.c + ../plugins/twilighte_board/oric_twilighte_board_plugin.c + ../snapshot.c + ../system_sdl.c + ../tape.c + ../ula.c + ../via.c +) + +SET(CMAKE_EXECUTABLE_SUFFIX ".html") + + add_executable(Oricutron ${SRCS} ${SRCSDL}) + set_target_properties(Oricutron PROPERTIES LINK_FLAGS "-O3 -s USE_SDL=2 -s ASYNCIFY --preload-file assets -fsanitize=undefined -fsanitize-minimal-runtime -s INITIAL_MEMORY=256mb -s FETCH -s FORCE_FILESYSTEM=1 -lidbfs.js") + target_link_libraries(Oricutron ${SDL2_LIBRARIES}) diff --git a/www/Oricutron.data b/www/Oricutron.data new file mode 100644 index 0000000000000000000000000000000000000000..a920a4e6cd13c3cab69935034c8b7683e3dbf65d GIT binary patch literal 1608333 zcmeFaXLMavw(qIqD9JXKZE%q}7$}=6;{cRNMHRtNP=$daQ&1RLI<|#n$w;z|p#Xz3 z&Q{jRX{VE;k|pOHfx7qI+x@!VhwlE+-@3<*qd)ZM-&|V~!oaOJs_whDMh~B{y|vET zE6z37{LirV@gwDrIG_5Ua`l>8m$RzAZh6fL=kglT%j+AQFErFtt!-+kuPc9~oMKmg z?)j4+srAweOH_-E^PF>@f8mv<9(F!W(+%~j8|OL~zu+XxSyNY4ySCcpY+C7Z&YH)g zS*iw=T^}^L>Kbe6>*hIMS?OwYIV&6ZS6%I@c2=%!s$X5%R8v)1Tf1Q%WuIN{thC3z zzNTrVYOJwxwaZz@ZLV|K+9s#UucV8{4RkTmHg#(nnef`W>bXuHEvv6>q-<@ibD7Io zTVE-?EoW5DnkHvuUA1#7hEXA6bqFRN^N8HERfD2$ldG0FHdHn_ zmsQrSYAk<5G9YDTs`#sJ4BSqPi$y% zITts;7S5k7SYWrXteWKL7F5RfR{wQn<7${pvCVrbJ-VKq^Su>EEk5I2^(_u~uzGYO z4_4O;DTi3$yU*_Z3rP72OC>vCb!FAcnmV?Az0F5tz}!!sjII;ehjZ=)m*1d+)-nYDorw> zN1akw#_)PW4O3ZGS+&ZEd~#N;tgKt%YLscJ_G?yG%GWtH%biVY8|siJ^~;yfb#AC% z>s-m+lyYktT#f7~=hF|!xAm&M;bv63e3jJXMJTuwbSmn63OaZQ;D>1 zbg}g-o9Y|pI$i6K!-(DWHFeeX>l=Xv8M>ml2m^$NtEq9m%%*4Uc{$&30lA-zlv)cfRmD;#>{P9`kTjmG%8qN4CUp zJ;{*r!*z$h|3KG6`)Ihfd>vhT_&c?Slfqxi>g${Sz4=S%GsHBmYMXRdu9+g?{3kb5 z)z*tvGLP?n!J^p=E+DFOoFPOX!Si1_=dgd~*VVJF1me}^mgRd6jX-uD+Q_i7P*XR& z8HbdC@<)arvGUaq&#!N+UNwL91~zs5d#&ad%zt9>;ul_)2lcBL3WzdY=RM9v z_pfrUu16c2GsLH=?og4sdM8DGw#Y70{>Z4Rf4-!7$yHa4ptU<~tY6-Q&|l-KTTy#= zd4qbSo;->GS>7bQyexA?*wod69F3#aX(VrCt(H`>H2g!gZD@e-&dNq8*5pJ~)QE@z zdY}1l{vvLw`^NH0`^kvxe1={5Az)Bh>qOCUHC3(rra!0i=l9$*G*kpm?S}G|LuE$# zfAR6>oGVt=qX*Wl__r#qsjM9?Hd5E-&*f`tYtbrPuDV~Af0G_5^ok2~d3o`3B0Z6i zh(pA0H6jw`T-&g`vdTrbt7}%QY+|-FQz=}##$_w8-?S$%3uRGo?XuPNAQ@u6ZiPJg zCVzG1DmE#wP~Xt#x*LsN)1hL=en9|mqNicwUry3 z%V@0HwWet$avQB3Hh>lB@xFVVbCBVU^(e~2Gny;USat@A?%v>9?W)}X5Y(@q>#T9j zbGlrvHC0Yz15Cltp096MEvCUYR*bFFuRtvah(XR}=&rP-;9blEz?jiAx?HOjP^0|Y zjW;#WjjKu4ka|ENv>q8HX=+e+hz;BX;IDlCgF;M>HR4_^CP( zJ;*usouXI0bGG{8YFJvowrO6|2bdIMG}(ZOB}8$=ypa);2b+cGU@I zd}ox^Rrd35>OcPEvyTsHu43wm-f|BzOBtOH(}YvTQ|FqE)I@fo5!E0`M76Vf;Bjqz z{TitzMU?6wRwJBtk5U|8dBa&<*;FYi7ShL76=AuT-mu%2nXP{7;WhOQO}~HZ;hHt; z7X4n@8B(Pi5qqnh@^HxXZE8Z@hLWnD0WptnDfe$FV6c$^^q~r+P(KV=b)j~xti`46aITXY)UmRrDWQM zf0Nq1LS-agqx0Dp*DVsop~(dhK2XltX&_>d)VoG-PTzjcFz9J*q?l1$wJvW-+Z2{ zsayL2mAozUliL!|NGz z12)L8F-a*kP8uC%ex8c-uUuA-ku=i84|Tt48BHvd{#EK;Ni|m2lKK2>=Nx=Kj8(aK z7D%@b-7Vu%Jua<;Tz2hm@|KY|Y$E=5k5p86MZrI3j0|^mJ-j}IqEmOT5sJb@1XHl^;h2XXJv@LwNl?B1orgCB1G z-lfAse|)6O$iNqmWQ`2_U#=N^CV6*bb=Y8pknt#WNxR?l85 zZ$yJ$I{XcyiGucs;@S;M*|qXWHoM9edrzF8BjuN_u3WQ55DL0dkZ)Kv@|4uPRjVsi zk5w!0djMq(k}Tz){H>VG?R!4*T>gFM zGiE5~X8t;;UsBSzY<=UJWwrIozEk#U##IVjrNC7RT&2KO3S6bYUk3%iZ26Q9>O&ekK-F;${e5ic??(Hts!E%- z_23w)>KHOH9Cme{JEb^(9~=6+(f(^!FLBt_OB_QzJBBP2hw7brPF1|b@tFPh>isGO zu2SH;6cF2ed`WdlO-Wkieo$6cR$8{S;)ahty6@im2y!i0`0-rlM++A`bpKrEq6H6p{Bc?7kM3Id=(F#x z-tgf^fB5*5E_+&zA<l;6YPIcG++0mR8(R`o`L2H5^T8+FGoM=r4@y@@$tKsaO#T|tJRZ9lWzZUY3W;%|0FIg!W}~ue)3Z)RKC*4OooOze?eJU zMdK^0@bcSL%kTeLX<0?}t2jltfDsCEX$uY%oqvH<8osPR43mp$T9&!BK@e9Y3j^`Xp9M3ymbiC?#$FbD$ zu49>FrQ>}^gQL;0*731pt7DsEyJM%L#o=}M9DYa8k#_Vt`W*d^6ON0HuO0u@9^jZ^ zE?+W=QAs-f7jEBX*db5cn0LOHVV`>XSN~ZI`}b3XOQ+Ac_PUw3-Ff%C`yPDs@sWkR zV(mt=k>VViH5AJXvxHi~Z}TB5e&bE$w@i8!&T@V54IkTlJF&6GEQ-$Z3FPu~{9!9mF-e10`ykZ=jY(IUd{EbS=-&+&lcA-M17jz=9&JDzbo>-Y^E_^RV|#~Y5{Io@(q zJC-|EIBFd4DgImM_`tEj@wsD@;=_H81CD0Ji6KYq3ch>x3cibfo9|ZFFJ3(40WN*$ zu^0E=m^}LUl_jeGM2R&k|1D9x?&XF$4mGTxRoM#@z^>ILl_e|Kt&O8)`?nr^OS;d$ zw(ZJ_qlY~Zx&7jG_OQRz29bb~f&WmMZw-C^Wx7GZZ78W{h~FCANanW&HfHgE8(m@a zp!Pqp_sgL{jno}IpznMBt-*{{n(_FOCTO)rXf?`Le`Z)h{AXeP^&fq7?*gFyz6bto zsP7blvhKq|@Jgr`RbbQWJ_lbL;a`{-yr7qm-rS$*}k7qg8B-mw}*H2{_jMAv35I7@&7;d!}0%r zr{1nMbCm*DDe%`w0mrz-FE4(Akqv9rR}NBq?N0u^%Rl)@xsCQ;RfU^!$MaXYd8HN%8p)4+aeR#;)4`SMC2H$H8b_=7((i(dPCKmHC!F^H**E zv+e9NfZ`XB?W+6(cgcSI?nj=>zwdn1z8}hEGpjbfQ|M~ORSI0Cz*P!drNC7RT&2KY z6$NYs{OTFNzp6#KI+&{z_$#4+$Ok9?d8HmFVE6OaT54oy1dRl^sBylcG}h zv7x^k?Z4#k`42byRj*fXS1E9n0>cy-iUCv%#Q;iv!2TaDe)aEF3S6bY{|_nfCu0Bt z+3yZbT+$o)$6tly+`gp*@I{=3*Yi((c%V?^`Ldn<-urF0-DcR!BbY2>21{jo{%`s=UTUq=eq`Lk!wP9);gy>Q|D6&D3= zc;Wx$BJs>KzZ!WuI^Q%+Xmxh@!`%7sZKRA{{k7L#Bmas_P1mSxtf+(5BFAn=d>_>U)sKlaKFf0Msg zROc(1)Lp)Ox!32V?y=*?e(3sc-NlO+Uw{4eoaT4C-PAq$1D`7@+QTN3H(IKysyaG5 z{^1|~;qZ~e-@QgxBz?u#S+i!fwY5?A(04vpl(e5;k=fGH5)Ox{e#K{`7>Uu3M&~#G z@P}f2zWaP6zog`eC5uWYs_(=5ej||me~~l1?@M^T1VJGGhCjznpE`ExPU)S*q2tE}j~?qke2A-O@L;~TH{VC^2Q&Ts>HdB#mos~c@&4X;Z;#d8 zZ4`RK$(&y3;WB&rtnS`uwqWFoM!ulsb9%n0<@0)>s1>B7neWlFMI+lCO&2I>^+>JM zz(KCe!Gqbsf#ku1iGjn`z(DNaA?x5keBe;B|4_WQPcQZ+dV7k82AEO2r;zHGS*v*! zv&HUQcMlU3I`nii+CpESeC;h}dMVSLC>E1FMV_X*-hwe-xS=I(YoZz_G)F$M^~nj`SWr48`mV0zy(K%t#W&LaK+6^d!4!HlHXI zQr+~@ohr&b&AnKR7rPVP-4II8WMYLvJSRg+779t~b{DxzBi%)=L?Iu`Ws~__rdVM7 zq@_SUm&|6!iDlAcTIm!CGMNYkVmvM6llgp#L@t{qoy(_kg;ZXyL^j7gT_|!Ta(OeC zvkC<>Ux*dD&1^B2?=f@vI74FO3?pAm7Y88^%Vk+O0%6F&p-I-!{GE3t$OD_d0 zo0Y*A3RXVPW#qfHR4!5MH8S~Rcb}flCGy>h4!yBlp2Bn;FXYW^fsSICEbYYd>MC?w z`C_urL-}~FXr^=VVsA9Vy~oVvEryzdPYQajNT!y{>baaz%<0)|ELWg?#%$%X30NzW z(Xv^yPza~f(QGD~$fjxZ0)1flX) zv0y-!EX3^PVjo$BURsNFbI-?$_LYkjb7mpS*JQCMY_G0ZE+-UIyaB~nYnxYD?pUT6 z&vx5O5X%>>LOw1X$sFmI9Hy2k_QtcYM>jK#sRWrZHS3Y(qfMAl);bS2_P|<3reNd> zMj_9N=qwY<2YbVKnWCP`(;6$DfVLSJSmrCNl}aUZIeYG@LLnhMAf(o_X{(Tnb?1#- zhN(r8(yNRbT`r!S$Z(nFVaAS>cRe0Pfx1n zAge>O@q7>b788l5HXS5QXJCFa1KY5UY#DZ6kC1QzAW z6~n1QG}{exhSC`=Q{Yksy0uI(TF3{onUL&}0{m>`;OcB7k(JfV7U4P*^7izmy8AP| zU`>BcfkO9@BfZCu_8=`!9zS&E^s#eiPh2>E^5O+95?rS)T_kPa?aY(pT)KGb!uit| zFL0eCarx5m^XKF#UoTyd^l(MeJe6k8ojr5u;@L|V&s@B4mSX46oVk2~%(E9Sk$L{h z%csttJ9qgKPfydJG=A>XrE^EloT0BHXHL@&jc}1Te&*ECQzuTGJ$>Zl@x!N%gM9+36U?-h7OZX^HGy*(njd%BarN{<2> zgg-z7OBWE``3&e&pd=J4=K6ZUYe6O9oc?0}!F+#T5r_w8f#4&D`i}rQ#||Dji~`WB zGPw)f_X)GvphJ(yglIAo@9B%P4GZ12*hGv(^Z9Tt8_6Rli=kvXlFr()4(JS}a$Hfi zo?6ymG84|^BWxM=DZ9Sd6YuR!cK7B64yF1B6f_~fsGycz+>M~K?|B3ZwIEKmy9Zd|&b|XE69UIQ z0CD%B0YH}N+bYoD@uPi52Kx^kfkZv51u9UVs3K4pvZUw{2vCR#ET-vQeYGLdl>G~P zrw|&69+7Majc7KlrPCzLY?{J)DhWi!!R1WaLXu=s@hn#+mPPC%+cRc570;w&h>LU@ z=@etX#Nx3OnUc`s2?|pnk;^2RS|%-N5GtE7Gij45=?qou)}+&Xmci&b21ffib!F+= zOr^|JI-brN>5P#~QOiitT^b=~C22DoM|h@EjMhpexf@I&lY^K7Qfb5^+cT}DQc-nj zh^cH2Im7UDEGEQYCKFAjm^dORmdb)_kz_gqx+#IFC+Utd=pMyLGNWhmaF?D*GnfdF zn#qJy6iy<*^?WuMi$NJZnKYAWBbiQ6IGzl~;xryfCL;+3hD^>z=>?2~+2YJDA5937 zGASgsmdU`J!9*&UNCMfxL?Vz#_*0p#c*>JZ2N+v6OOMiZI)m(rAih#XGgV-mdNR$} zz`=kSCrz95#l_qs@g$vwvbnB!l6FFwJZ-}NS~ef17*dWQC366Tj@(P4C*&lDQ7PR( zPeCzIBWtAvf)x*BEJ1kzAV@(Pva3W+mI;a}SP?+X7Eozq#bFgRUg!*A(>c@DbI=oD z5@9nqBnLkv^97ZrFAxEE${Gnc3aX~SJ4T2yU}V7~;TBoStjbKIs)4F`kk?)>(h;Si z=t+S&#sl6#r9`eflE^4FD44l|md^SulXVFvlb}pEMFP_0A_+Ju1#if@F!4;zo)MI! z3QGW~;V3PYL}514DVaXoB%2MzV-TDv!z2+X&wNFBL(m+bA$_7A4OJ|r8QnJWZA^Q>Gtjbu=PP*cI&UUVlb--8+kKr2&4)H6L_ zFhzkuTa)Ra48+J$^AfTvT(;L8t;tHG&7wz9o?-NJrFsWgpiJLDyr*BFywDBrMbq$` zKyWY)OXoq=a60d^QsGoSL}nrb$l8~l>kgwpW^#eFfG_0(v6NNp)>sAEq3~5+ldXh; zM@iWQ2>%#5K!1Otw>LA;UpRWW``F?B6UPQmo;Y^?jKCZy42E7ff9CQfK$gU*3l~m< zo|i73IDbxkJx_WFe+8p29=mv6aQWf|^3PCSq43Fz=TBTbcl;tae*V;DTA;xTr@+<= zXU}~FtaDwWihZ5EtkSCMlb28f&Ws)a;{klp1OQ*IW2aAozei4=IDG2Z!4pS&j~+d! zz*mgZLl|WTi-!gQ9o84nEcA*2n;ACZu>O?wluLGF(Vzee(4@M1#k>NN@&)eLhVd+_ zH9J%crF3^8*^RoMN13Ep7F1QB+&ehXe`v68P_99&U}X#U92x9BJP7m`2M57l5Gn)2 zOCvoYGr%}t(53)iR$OvoDStc>&gOlo zv`>jC1JgKLpgO9c1)u}9J$)uD)IR_a^EKH&fTe8o^qRmWMkRQP4vCtLZjYIel?xOW zV+2(*pB0**UZV43+@We>ts}9s2xMfhXw*;x#6b{Y3y7YNiBTxVFffaGh>Wg+qd++y z2GM_d4<7`J`wkznmqYZHK70;6S+<_2`bbM)E(Ib0WNdtqoa|qPR%~SOH=K+IV-|P5 zMl+Jb6-gz)RxO!C1_G2Zq);48Nf=3FO9F;RvLSr*WJ0b)JQ|N{@dS6Suo(-RmL3N* zvjAKaag>Nj0T4Ms3sg^pFAiI|>7vL(ZG!2+e^DRiKUnM@gpq(<}wjJhLx={gp)te}-Zs}CnLv`K?r z({vk_+lsqmabG;iydWL@0?>g(+Mh@V<9WZC3L1$JBWGRGIYE$2J{V8H%mI)$nL@BL z0EOe}4m0kFCEZpc7*Fw(JID)2fdb4|=B^q+vI!!jknMm}A(G62^`e2KFufT-LX6Ey(I;b0T5TyPztHR;FOmtT1g%CX%H6Y&e#TSi&&E194#q8F{V{%@m^P zVmO`;St(pnr~zC|9PSeCRa&K%%SW>U!OS{>+6he{JGzbNa_C5+_JGs~5L^wY@yJ-f z7oPwIEHEnYhk1)9uuz0hX0As|bw^VGYp=i}E)f7-ie+`MQoi!2+rpKEs}L0C!sKL9 zISl^-@)mm>>l^gPvWA^dEX93M=&^D=W(Fq-Hgb=J*zf7XD*^=5K7$8IeI~4%_9J^^ zs4IEknCX+iC?)|w8#&xQ0@k2&P-HbLD+VvahDAYt)(ZtjjPX==yl~LSbQ`%I<;Db# z>9lBdV~O{t`}(^Pl{mjoojiKx3?Pefdh*;^U{owtEYr)%<`v6S5O(A)5UKDN<5%oo z`HF=rrmmnf_Pntq?jdu;XhMG$n&9dbX(OIh91Hjg@a^~afx_K`{U|2_#{&n+5&uI^H<$8~ z;i!Z^1(HBg+4z7|98gO}vB;9}d>jM`#$!0RLWvk(gK-jZI}x@lYJqM*TNG@yVhBbp z9s~6PF_G#%%cRYqX@o4Dd(bokhT$^}Pektu>wY8VjhcSb!W^Irzd^AWSI~<2Ez4)c zd@O+@~8Dn1YFD z5ecc~r`cG7mL+Xj0W0BSY?kTOqRbThMQqX+EkGG^yo`;xTk)U~k_27sd(l#^ZK^@dOOZYsUQ+)gfuhXT<%Ot`__z$WG${3!MQ` z!>B~+qQ=t~C@eaIXbUNN1f7vfl1?Tm=`kQ0Vv3T9fDzZ!u)$w{BI%8%1S?O-HQkzN3ugy?Um zPk2s5Gfc2kfMDb{72{#U6eSiH4TdMU$?l-K4Tx+*K`xpS^$%NH^e(^=qbVk=4%}Nw z&|f68*zd~5WJoqMtFZxycmvRgMDL2AHYAfQC^KRynH>~hkT(7Tc|H@(Fvrqs;BO+$ zQ%H*b33S3pA~9mhB33xUxT%SdqSFjV|4qAD<26bbQ5%Yfw(1dKx*+&kzw%IAZk zB4H6RqSJ*Q!C&0qV$mb7Xdm%g07mh~pcF9-zJhBwf5g8HumbCO!9hUKz7T`9$5@b& zTA0Q_c>+aUd_>fe@uLWd!-3ZDQ8PRs5`4q}DOh6BfbRtcA53L@aGK&VA3KieE1ZQ6 z*hF+BcjbZ>SC6d{$c{3`|9H9OJ`4B9`bLW{pw5Gwgrw)3W#4ge&O7)OXrS)xwhvS zz-0hmUgD1B%XRAf*`t`ir%w!?!0k-<^(eOI0KVv>NALq9`MDPd1~7p!&2oeqCC);K zjkQ+psr*nJ3b(2_WN^hOMNSg9HvuW7$C4@K0UBZ)*_56mdLk~V5nm-ZPRn31&_j?B z#3!_o?eEDC5Z5>;{_5U7EMG4C*cg?t9~Rb7U#PE{9O4m~jN)nwC|UYs+6OKq;$5c5 z{{SK}4&0<733d=dFOCpn#o+|_90BXmO&^8{%B|9n;Yl1F_OhmW`qAjbz{lhih$O(5 zLlodNLwbOu;3;M!bJSBx;3QKCadnFC6zdW?u%V*toeZ8&1b$2@C*l_s`KD0VwpAf) zobXu|k8TzRLKbTD6$?bwfn#+S{{w`=ji8hqb~@Mr)&Qn}BY*|832X_{0WpFjKEqIG z0%QP}0)hft3QPrRbt?pthIO9?NX3FN)2r*~_JA6-v{)=+86jN{7+gj`H{DU)s~HM? z5(2@d>H_T3&48Kk=`p_^^MKJNcXb&S;L@eXx(w3`{Kev4LzluaOCT~9SHKO1T7Co5 zHDNabGGb9*uzsxC4JIC^n;)%c8-!#{ltxV{&4Ag%iM50bG_<24lbm zUR3~)MVPa%8M#L@nSw}H&=ANN#$N@{cytA!CPzJjJS*9ae z1ZMb%j%UfF05US!Bc`}AV#>vl&|?D7pe3F&MREsNx0^Ku`(Q$gtalPk>!p)ud&=QlHp;p`>UU3=gan zC{GAXvmZ?)zm>2OSw|h}F1Mx=K44LV4mzwT3JHM#uwGa$9>c%QdWqd_q0eBsqex&Xf~Tk-;Cm9N1$4wT z0DmP=0=P@$C7MWL?}L5t7<(N30XGO(kDO8RkeE~fJqN!xv%o_|%Q5g#d3X$>Hljpj zhz{d75W`ly{lvwTcRGjR++$^m;t!Fd0tASWc)dEY4^TUqkEMWhT=5bPz*Ua=B#sC= z5=<9II%JVCE42j34rg=zRJMctlFax}Y`923x+Ll!=1-0&NdQSM)~*=EVi#ll@-&7D zhlc^-tYY6vk+6rV;J%gb z7HmC9$n~taf=6s#Oyd#cwG%u7c_m(qv8;l;l8*^2hYT*pWUryQ zX~H>dy`+KLGn?W70~h)&D~Pd{0Gd&f(o9T zBR{)L(`zExENl>X9<`GgSxipj6o~(V#RkYrtX7@sLDdu$oxKoG3dk~FoWNP2JYnw? zJ(0rIHtYmr%JLK!G-MH%F9eAvm^Hf_`d~BS)}sYrR0u1S5vu`GCkvvPfXgXPN!ba! z_YzRU|HB4nM&i%x3Tu*JYl~P0j+1P23^cz1u1NvXpdQc(rU13{8wT%mE1+Q#f~4SJ ztRoV}O6}Bij}dokfSR&!HOsGAz9@AqZ`5)}47s9)HyR^{S{~A15KUn=>Xb3uh6y&g zDX+)fQL|HB9h&5LKxf11(oK)1p%}QMQClSd^gX&I(g`%ttuD>*QC-F_@G1za3%pW= z1#;7f9`DrX#q^k#TSl&R$*^hJVDNyWSIWoSG;3L&n7UYB3`Tl^G7KAPFpQ`!u#RG& zBlDTB^h>86<{LpviPM)`w}d9TKozutwc1fvFg9&cpp(c*EU6MTLPk6c3L7RAgV~re z79|t$iYtJL7&J}`2o}V(-%L=;tuf|AM^sRlk;_v9Y{CP;03a+1kF?(w)mx)_n`X4@ zW|!z2v}Vb~qj)6fnz=Aq!Qa+MtRtG})RUc2RG>s_SYrwx1>9~cMbMwEL7UBn*A=jn_ZyvRXi=IIx=@c z>airSO9D&}qXp^g5!ACZ?AHZ_4b~BwC)gTzD%?6e36iFvM!-tDqf8v57?e?6q*6X~ zKhb>RtTG-3748&w1k4bKGw}qfEY#Mp_2L4lq7xb*DR_jRSxjJjabhR(NI9h?93xJC zLLTC=(c}25@mfHHn1p+vmFV{3^cH>6AXFp{88N7VNQ;OMi;F)2xF`06!#|^8LB|On z^<4?d|Na1o9r6rZavBN<@%82C)@``^xFTR~v)^Fe_DBvvz z`cW8E`;1DWgaEO9Y>$(BIK$<%nDUA%8&LVi#U3x9NThlX<_8aTr?HK{m(Gc|`AhJWN9PCupZgMYzHs)dFDV9U zQ(ofB;<6S$Huf*RYiUPabSlNb;!78gojFPTm*DSl6#_nV{OA#`6X5S*u0zM<{B7@m zcs}LeQ?DGdCD;n~#W?bz98fqvSpp!H_#<%~Q(GMBPFOv{4NCCc9fuIPS*{$kN{?m{9pXc72qIn-X%bo`bcHxdrlB_b0w+Jm zW7vbZsu(1WM>mp3fG_5WXnssr-3;kwSjVy>WQmwH+*-t^Yx339y@uw|qj-Q3J{YPX z5g4H^5Y_<1fh`|~DzK$tr29=m1f@BN9cn1GoTa zXDF&30ksw=+#c4Tc4t)K1x*Db-Y_7p)30C9R`W)5fj=ff^@zZ6m!@?@b!knYO%w@t zI4Xlt1sH87$inb6qbm~Wit;GxrWXcpnr-25TQKAnkQF^az>%2(c0mo%)b5KyH?OYw zw5SkAV-p)kcL;8%By zYZ~c{>WE+NjD%T;KA_wz!gygSCfcJY4_0Rw%EX%e;VwFY{)*<_h!%o%L1*X?i9m`D z2#8XFnju~Vv;u>RF$jW3bo2pe)vj4Bw5-KCHLEjXg8t-#AW9R!8zAPqXjY=^-9Slqf z4~fx7X23)nvDl{p&E(7gN)B`uVzMO_f{U91NTPjM7uP{du#fVTq+$dF#J8h?suDGz zck~lFf*HJqC`iys5MS0#=7Ot%Rl`aZl~OqeWZlt!qyUPdbWK_`pKmlVHok$PB_%~E zjd>&Rr0I_c>#{CgsF9l06}4JJEQEgSiG;N0t2i9QdoKYLVHi zAliXij%E=iK6dsD(cyE%d;v!(22f(aV#Z#^T*YI2;xdukizL8PP!*`fFO9$Y>}3E~ z&{mLF9f}q-SN>b?&rn{~qHY)`{asPaHdP>a#WbMT614hLYo5Tym301NC2xn*s31eZ_p|gQ3SbsQG z0AIE_1#lKA9)kV$azmWmv?vCrHZiG;;bBK3v^0bli2OBOSbVGtw*f^Fv&`~z38 zxOnhzF-5Q+!Fm$tx)?jCwc=RAiHGVN7b^)tfk%!VsEm923B1Peec{H80r62&x!UZL8yrGV=X}KI zP##oUR{O+(44MEX8jd@EIO2^&K;AAb;+8?0e&8t_a)(1+J=zrxb%sKn;Ye2`3SxGK zB4D>S97W*!K#C{@!qftV0d#_@6acNj9gGVe0jwRNNP8gC6*fA7n2^@$4|PQZBU(bC zmQb`g5T-mp3CMy$T@j-#5ZUYYv_~SH(MYEj?TTvcGy;GIqg?>8rny5QPay1z0LNxm zFxnoBw1uPXp`gMSqZ4omYji4r8`aw-5hdLoWNc9{2*?P-5vTk7+55XZqOc%wg$q?RG^cwK^6>Zv5{G8Deq?R;b?~{ zBf?x43lw-oVF2zuLXBv9Ak4)8x)h;k4LUGd%0PjZK%gZMq)K~4-xt&lg!EmVK98Pg z3r1Ums#ZkwB_`!Z<%n7|;+8HT2oMaBwRSG%3;0H&?cqqX&kwtzc+h5N)M&>>rhEik zMlC@RvfBJna1%;`?CsI0*R;@u)Kd@~C5OxO=;%UpitZtrl`JceBrXeD5QVBEf(l`^ zg`j|i_9fZ{_=~Dwnli#rG^klYP0Vn2NEd4qR6^1U)QUQRdjZ`kfF=`yQ7u?Pa9<%N zPidhmq;aP($ie{N4GJ)QR5H-nCkhg=53?gAE)=Cu88k>Qu$dc(6cswgIPrdT(3F}2 z16DeQx%j_(HRFtkzl!b7I*a);Q^z6`L9cbnP#G*q&HzZE0QC5_^9RZId5HML4U&Q zM6P+kN{+V5OKk-51`nS;O*j}wG$CL)mqlP#jv`;cy?o+4$ED7mJbxN6J#`UFR;*O; z_t-`86^px=6H^z?pP(=}t4>n`viPXwfR?g+`Ff7?T11xBK`#)Q8~~aIC1Dr4z%OF2|Ulo<$ml47bY;aF!oB}|)Yr>dXbwVS1>3LY2?l|c84d;j ztXOaWuGoO`ZiobW#2m(}EJsfh@|EKg9Hhj`1CjtoVirI!z|CD^D+;5fiUMUarGOZH zf?w)H2j?w;bvfC~abMiCVo0jPMe0mKfag+swUFF>b=mU6(zetRI&SRjBh`}34a^eMJRwfJ4!kmV}4~&ruWeh`1 zT}~nqK!h?0aZ+Ib3IYN;z!`%+9q=axJh}gW@!y2BrLWw#&Rgs8VUn#twSge z1V_mMRizk~wWhU&LtW?(g1^zufIuy}M|()=2CB^tpC~8v0?jGLdfCVb)}v975AuST zt$|QmFtX1ZY>gUwJORZ10n&a3DFXxXaRqb+!k&=c;g7caBaoW;a-kly1z4a+i#K5F zU7Zlq8=#~1kk&%UfYuz;nnT)tf3zh4pz8;Gkyb(WXp5*cEJ3&}!o1LeOvw*vKx&)9 zZqbNrD#@hqEtu^=v8+|gVV(k2EG2VSnv5>GN)XLWJQ&`v=?xhS81QB7NO*$qEzT2k zTAf9d0$f22{G|%&4f+gBB8)8nN}6WT$IuCJw#4X^-a%o?P(aE=WF#FyjCzsb2aiu!?6YVMTqRd!NFt4!QT^{gE}XX zT>DrQ7Va@YSR%P+$pnt^51+Wmk!FeBp866L=8%<~aJDb7l>``yF)Ma7_OHU_b3pKg zA+)7{#C$pTr9976At4pjp)YAi;V(bIarE>FJO0bzE0Fi#(ZdJjRa|}oLf%3x4#@l6 zawwNGw?&-lL<$Ho$om~Y3FaH|3!Kjqz~%Ijc$nqnEpS7cgcxxOf(i8aILVVBP9$d$ zsY}QyD8UOH6mnz;^r4Cbj1oA4v`7rU2Obr)Xia?7@~(=!RR@j-lTt=bYe=LFSD}Ws zMuSAM?87{GHL*?DT<`B_kgls!3wV}ko4mVG{OiW5q{XarXeh^#Tf7(O4gO1a~6 zCLC;{RpO07`Q+pzP89-7xY~$DiJOSMhU?GZh%d7U$!T7A9sz>2BJn{qMwAC69%2D; zhbs^9E9y5!Vjzq_?i8f+xA^`0y`BR;Pm9k7Fzxq%lHnFlu)`l|$F~Ut_`@g|``x}a zU#Q*hrwSL4+T{be#Jzc(C9iA3O#iW8^p$sa4FTB?s*e8?;@0FHu3uw)hp;KQFq~N}@!?V{D+~W=I z^@VACzsK8*@(?jwu~kKXh_w2`9U-GV2!fj}!RUT(km<-sd}vLP10FBv1Btkry+H=K z&lB41_U`kATf#dLMd=6=cVNAu9cU)v=RxfW zcLq@^OgE#20s-PImZ(yJ$dKu+3~+@<7~{yg1VDoW1dRv`!a;|Bo0usO-vwp?lp5y0 z1VnsP3G863>`wHCYnh3HRZ9(S^L2)&xA9moamW-C`R>!^4{KQ9q zL#o*vCOHv#-j(JzE{>c(J8=5cLEgH(aQ@K6a|7qjkT`z%($Py74sjs)!uewtE}Xdd z)v@!JN#KGO2Q|mHc>m~2c|n--%ttPsJ9_E7x-J~yJQe4!#1XAtRsvfAbaKADBu4Z_ zISVaeUv-fdEXL`5_LRJQq`;TM&z!%KAL8Kr^U=fHF@*aL58!#`T~vPID$^~8le2|f zig#piqQ=!}3UJMoC_je>h+lw!1RaP70Cog5?AI1>5n$p0rWka*{K8A1xWDA6Y7F|r zOA&c3Mb1CS(H$I3Xj23!aDs{7!;~|n{y0Y^dBh=JLRVOxQnh%c(O=%Qh9aflaDolU~C3a)XQ1vd*^m`4#SRirmz=smwzP($GE=Y#TLys-9QcDRUVpRO z*W&i>ce|VY{ylE@uCC6#UGDup@9r)SA{U^c*zS%lE=G&(qoCP$pv$}8gY5FPF$I8w zbf@Ql+t=;~XMG(WZ@X8380jal7yv2!NV7d&+6?e@KX|9$Z=Xk=N}GUwFaVAq9vKz* z3nqeqd%S_&9{;W`_a1lWuFj5qJ}*Ps-Q@;@c6q!zI@@=;yJ+@{_Rf7?-|kKipa$0L z^LUxU&bBVlc`xNVy?edBJ#H^)5_>&h4U^?7PXqfrfxTV+Jsl7saKP;c>B!vO<)y%$ zE;rqA?ds^*@Ad9%Z{O>o3pe@zPl2;$pN}pW{4S4sm%D3cXFDU@)aM>AN71l=!MNaba z8poug>4cU}gw+*D#r#AxQbgb6__sQrgN!wBRS`o8rR2B{hkv+GEZcRX&5X4g#({9S zUB(t-gsqWibBIAIKL&dtiqK|WKz67-5=KM|6GnI%Cde+kKm&Pk9YmS?KG*=_sObwS zqFQSdunW;9);Ag&Ipjl`wrIF5ie`d@4>t$>`vbmxJ`Y`pBO)AXk3yedbI{kJMLHt5 zCIS>AR)QC+Rh%{fw}z_$<0R zjOQV;KOAh=#3v(*5{?{*ME3^$QkdvWG-^9NI(QWDx8k2+{4^Uz|M9kk&=Q5!_xXMM zgMqyPAM`ok7ydb*Cc>U-rKuq5pO+Yl3=(-l_@23I(RN*LiH183t;^I!K5#dpz$3b`05$O>J2$d>s0aW6v$b&x=O%N#}EfELn29DNjs6PL$4 z*S&FpSHcA3!-wpq16~h=^&(4?_zdNhI+zCu%-aFP@6_9xIL1wAzSrmOGBqE@5s!Fh zFrDC2xa2obS#=p7=^4aZfeCs z3(+5hel(^{T4Hyux9dGhP8 zPJQ+DY3`h-`ttJmufO7u)#3J2;sKWZUhEiXjy4h}9ITtg8~lParOFd81_@B@cfyg`FFrGUs%zrQ0ICNkI-4Z*IA zmVv>*GFnE+fRPXExJaaph)f(c&+;XCH!~(zk`oB9P^uHuh82^rI={exk0r)lKwI-A z63k2ZKZ)-}@3PD`J<8rW5R@1qy&z;dbh<;x2asURAz!;Dva20Y6Y{r2qx(Tm!oCbC zf@SJ!3Ho`&`#8##8g}auj~Vuup$-i(7(|pIC{TgAA`<__|4cNQ6G|TF91TNxPt0s3 zp+(xG;z>pjL3|{G*F+mZAS3sJJ`3+ws4d|0>tRnM;5Qu@`Y%S zsKbE5kyb6xW*`!S?K(19TJ{*MNR&$oM?+mmEn0{K-K3+$XG7u}S0j}8Y$W10G&D3X z3&Btk=|MuGK_cB9A-_A!q#0+(-5GRu2HfsIS6863!`IQ~Z*LEFxFhb4 zU}w9py))3^@wK#%1EnO|G?zVPMTXSa%*S?N@dpq{-Zrii7W$(`B{kvM4x9{1# zb>|mbcYX22-rbwO*tU85)@|FjZQ8tP)8@^aw`?Zy`RAYg;nR=TfB3mKmEv(=bn7w`KOos_UV`2Sn}I9 zUU=!P-@f|JYp?$PwU^#}<<+-ef9>tpfA{X&OP4QuyXu`c-+lX)w_ktZwU=Ia?S&U# ze{soc&;RDPzkcqwzkc?)U;XOY#ZN!|#M4hb_N%8Kf9QdG7tXu;fkg`+`^7_#Klbo5 zzj|WHlBeH(>-D<2_tvj({OF?(KKbOs4Ii%m?2|uy@`nu!kFS6D!-kJP`Do*&k2h`o zbmQkAf4=F{k3RX}lZ_v3-M)F_=bvo+TK`C|9>?K?Mrv3tw*otwVcxpn8RZ98dp z$L7u3KKp#jr<=BXx^?@eZC`9=YFodc*tV@ZHf`GW*(S!Yb>qe@8$aLr83oAPvh6dw z%9ib)@7TF@$4-W^ZP)JYyLWBdyJyGl-P`x<-LZTB&M)>enjO2E`MzWG&aHcz_wH@p zvuW$++jnl=PUAbbezAMU7dy8>sEwa}0_m9V7khRcXlvfzx_{^1om+Qp`*h2u4WEAe z$!82;^GBa=Z1`yX2OB?WT)(cq@%{Ikni|$N)iHUWH*RE~au;GKX z>((|lHmqB}uBoZ9v5995^$qWnXdv16{@SKS@*CDR*1f-GRsHJKYwBGqU90O>t*TwI zV%3V3t7>X$-&i8}6|Q%eSHD&H&eG~-Rm+zzTd|zXcbB`CR#m=J zRr$NhrEe_#{p;_%{p#CqzV`b!UtjvWH{X5h?aH^`eCN&A-g@nK?pyf4 z1B>P_oPW=~^B3N?;K83QeE7lp7u`31!Q8ulJnOcf-f{cf*>~Q3C#~H&>&6@JxcI`6#omN|FM`pJ)H{e;Hn%)aNYJLcXw>w)?6e*M^EPdxCzeRF0%z}8ss z)BETD#N}FA?9Ju-yZI5q!jVHces$r<5zbEM2M%=~KH78WDDUC&;~xA1VPWtv?-~=M zj~Dx6#lB?U!Bj6l#>nsY@|#Hfm@V%^$-!(hEw5e6TZd7T-~3cLxn!|Noz~8C+**E} z^1@lH;NxfcElPfZ8$UNQ9GyKc-_ZgkspUnwG#OC2ASi z-`=*jwPnlBo$Ef_@c!Dyea-vao-VhqtF5!GwWEd0jYj8l`@@{+z)P$%9(?2clwvFy zkMf2@!qj30r=BuB#c%?*PuODsPoXxy&x`gO2sFDrEuEO2!S=4U)~>b=zqczI?Bc7p zv(wkr>Fq#Dx4Ao8I@_At+qidlyU1_zbhLD~?r&?|*WR+X^}zm)mR-$z_q6Wc+q!>u z^S&MX_UzcRYy0k<$n9+i@Esz$5m1}9ZT@7_ryqRshmSXZ{@M1epY7Pn#$2zyZutDO zkGE`U`oo9oKK`ijqYbOqHPke$UbU`%Wn*1+-FvS3nq{k&zgx4SdR0wzeXVQF>dI9s zR@A@eT2;NOe&xzlRn;q(F0ZL_)l^lkc(-b0RaMQqmCN6LXZc%iyMFi1%6D9=WpA!n zwQ~9D6|UOlt{T@e*Rtg+D{JdktgNkGR#TYMMp{K^~8|MsQd{PyMNUi|H^UVQPH=a&5HnP;AS>X|2>{ms+Q zJiGXX7k>TPt1rLw%8S2V^6V4OJn{1RY6X6i(~UNdF9i`(-xF$|089z?0v13d4{}lK?PbN6z&Tp>UUq|jF>`eYIwUGqr@#-r%VGJZnI7}e33G19o*AQkNoj~uGAaTCVa#m0>< z8OKm3j+@A6$2!U;jF~ikOvS`;QzwqQX8f4R;~lg-X~LMYu_faiG7SD-7cPE0p8JH7 zk}^lhL@t%)sSMRFrZUN)H=c6Yvml3BTz01YmAl=7Jz$>N6{#{(i%0fX?o5XZ0@`W2 zjGETaqtONI#(6qK0aejX(}LZjeYe}EcROJ>XfKm}pHezu@fH(jC5yLwA;(VSmw$ianNEp zuA~eGR=Z;?eCuG>u!+V_DJ`8kVdAuLWmCsYoKiA&>ez7==AJ(%2dbXdRGULaMja;AK%6Sdm?B zwCLvBZocKlAKh^MbvNJmqg!se{+1hO-g5oSTd$va^Yz!=@T2Q)z2yeyE!W?A+f2FN zI`fuWuDk8lnK$1u(|Oy>+h<)rYu1gkX5D~y5$b%4L`a2_8-r=?N;XvcieT` ztUGVz(XGxKXU?2fQ8DG3sZ+`)m0f?sb+c~2g%zJXaqRR-r8B2ao-ujSjLD@lrj*UN zX417&r(8e1;^rG>+;Zb}x85{!)~z?(<-FytTW^>}ty`{h-ZJy{TW+|Me?Piz+O^YW z%$zoTM#YTj71vF#xOV!q8Ph7JPn&wv%;`UxUNLie#gDF?Hgg7#rp~Ci=Gtl3Tw8I? z%;{6FpH}gsX%#aorp~NTiD^@3Tr*|*moaLWjpQLGy-$X%*=L}Hi={A z?C!nq{VVTxy6xP3cDdbCU0u}O=R4o2Q&k_+-T>PB4>^X6`#AWMe}sMVQSitA2>s+A z!Q(z66Tgo?3gA2a@zL!GV6k0pkf_!G57ZejyV4gMC@?r6AUrHIG&CqYG&nMhrym{>8XguD91$WvBSJzW!ox#C z!-9f>LxV#jf+M&)QeKeo;NVc=0)vBtLPA1A<$Vnbi}VQ$_6rUVq#vjde}nu(!$Lws zLc&FR2oDX52o4Vq3J(ho3l9#D2#<;mi-?Sfj0%g43gy*|h$KFUtimHWp-`zyL}U<= z;Sv7f;e>#Qh~UVGz>tuza9&?(7aAxbEF>~AG&+i8;ZadB(b2K7vFv*jJ0T{T5E~s4 z9T621#YtpLR0Mycqtri(9bLLN+GBY6&nK66HG=1u%8Howg zCQhE6FmZN#-1NlwX_FGBB#`ZdNwKtJ!o&#^q?E|W2@_~vWGqr4E;>FsGBzeUJ}x#f zMuc2k0w+=NvC$-mM?wSu4ZK7F{xM;^7JiC^iQrFUBw~hV6)ycA#>*2LiXs^q9TpPK zNq8tRawH}^l!r$d6I96*$;%NDh0v1MA}l;6EP@UVL+Gub@a3CcI z`UM0A1_cEK_=bfA#*17={!U4pGBbYSw1i1BCQY3kKXE#}8co+F(1GzWu{`sH332gp zJi3?(k^GB|i%(3HCmAbm1y4IFhKCs!850{39TP2SVk2WGghfS1@{aI`sbfS8Jrflc z6B@uL5cbi>pYTHZ1_h4y^AF_P;jXyEn1qQDu?Z20Q^FIbL?up*;mPuR6Q;%|PK%#3 zonykJnQ@b5#3W9MNtnW=SRUwvNm0CFF%x6rCPnkydC-ZI6DCfdGL~=xwh~0)jg+}cYkH~$;+chaG$uk z|ICe@M=y^Yxj1(G%C1w_Mvh$=I&^N=>1#uW&Ws+pIC|v5*#1Lf`wtK9+SfBQ>gX95 z*>`Z)S4W4&_6?5h^X~d;U~J#O*xo+xZttE01EYJL*o?fpy9ai<`^N0B1_thCWhNK*Qe zCJd3zM-WIY{epvhLji?gzo0;$fFNHY`AU5JXflxj0erLpe*XS6-_I}5*U#6--*3FH zzmH##bj^4Y2KWaA1^SaHFu>QJB7Hs~F%=4=hke6ox!lVYUw{7qU&$^|a^yP<3h@mH z8t3N+y32PN;dI zo;_#ctT_qOXHK0ncgkmTr+g}5@|@46%$+xD;o><9mrS3xaK^j^a~FT{*%ymGU9{k{ z#fv^)x^%(v*R5T?Zk>9*YU75rTefUWPFXKu+s4$4 z4aw>2Q!+NEXRS*~Ta&bHU2^({da)+CplEY; zo@BBuV`E0v>TMZGnK{YX`5QB{*Kgmko?~YAx~!aa*}0o?a<=AVZ^_C`&Xvr!W@m5C z%G{Ehla!yIoL9JIM|Ns%UPf^-A*-Zxdr5JYrYxhZWP54xwxXg8jb>|ZUS?TYmZp4L zaZz$XetKDHN>Smq!h*~aO-5mHT0wqBQ4z=V!UBvMsd;(Z^7G`JV_tqnem;3-7L{fc z6lE5bWEYiX6_sq~uDk*ww-XAB(+i5z@{3dRi&FCoGmFZ|Gq<#gOJQAWL2YwhbyGoo zb8byTQGH8cb$wZFQ%QA$roOGTR##lrRIF_%tFABA)|XZ_o;vQp1*%m4vM+tNFPpdHIIqW$TicuS;6Bfj2h&^DkG9 z3ku=Wj!B5$l986Ht<0{h&aSAT6u5=zT6@{4v9mF_4k z$t)<&%rD9+D9kD@PS4Lz&CN~AEl4XUO3Kbn&dE>BD@@HPNZyf`x}z{TD{os)L27n> zYEFK7Zc$oxL0XQ4%!1NcpD+2uKWLnPKzMA-noS!sa&j{A3)1pSwiT6cDK6h!Qjt

eU~t&v=~FM= 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⁢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

#Ab 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 XQVv&o+a#s^oSZiC2I3Vg0m6!o_G&BkKWbuZv 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 =HJtEb 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 z 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

@kI*s}OlahW;kW&5_* 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

G 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ℑ}e$@&b>)LQBg~Aa@C%aCC!Vx7TBy8;N#@*ir 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 V+~I=1)IdNLL+U3bf&Zft_!sQ0?eqWu literal 0 HcmV?d00001 diff --git a/www/Oricutron.js b/www/Oricutron.js new file mode 100644 index 00000000..2352dd63 --- /dev/null +++ b/www/Oricutron.js @@ -0,0 +1 @@ +var Module=typeof Module!=="undefined"?Module:{};if(!Module.expectedDataFileDownloads){Module.expectedDataFileDownloads=0}Module.expectedDataFileDownloads++;(function(){var loadPackage=function(metadata){var PACKAGE_PATH;if(typeof window==="object"){PACKAGE_PATH=window["encodeURIComponent"](window.location.pathname.toString().substring(0,window.location.pathname.toString().lastIndexOf("/"))+"/")}else if(typeof location!=="undefined"){PACKAGE_PATH=encodeURIComponent(location.pathname.toString().substring(0,location.pathname.toString().lastIndexOf("/"))+"/")}else{throw"using preloaded data can only be done on a web page or in a web worker"}var PACKAGE_NAME="Oricutron.data";var REMOTE_PACKAGE_BASE="Oricutron.data";if(typeof Module["locateFilePackage"]==="function"&&!Module["locateFile"]){Module["locateFile"]=Module["locateFilePackage"];err("warning: you defined Module.locateFilePackage, that has been renamed to Module.locateFile (using your locateFilePackage for now)")}var REMOTE_PACKAGE_NAME=Module["locateFile"]?Module["locateFile"](REMOTE_PACKAGE_BASE,""):REMOTE_PACKAGE_BASE;var REMOTE_PACKAGE_SIZE=metadata["remote_package_size"];var PACKAGE_UUID=metadata["package_uuid"];function fetchRemotePackage(packageName,packageSize,callback,errback){var xhr=new XMLHttpRequest;xhr.open("GET",packageName,true);xhr.responseType="arraybuffer";xhr.onprogress=function(event){var url=packageName;var size=packageSize;if(event.total)size=event.total;if(event.loaded){if(!xhr.addedTotal){xhr.addedTotal=true;if(!Module.dataFileDownloads)Module.dataFileDownloads={};Module.dataFileDownloads[url]={loaded:event.loaded,total:size}}else{Module.dataFileDownloads[url].loaded=event.loaded}var total=0;var loaded=0;var num=0;for(var download in Module.dataFileDownloads){var data=Module.dataFileDownloads[download];total+=data.total;loaded+=data.loaded;num++}total=Math.ceil(total*Module.expectedDataFileDownloads/num);if(Module["setStatus"])Module["setStatus"]("Downloading data... ("+loaded+"/"+total+")")}else if(!Module.dataFileDownloads){if(Module["setStatus"])Module["setStatus"]("Downloading data...")}};xhr.onerror=function(event){throw new Error("NetworkError for: "+packageName)};xhr.onload=function(event){if(xhr.status==200||xhr.status==304||xhr.status==206||xhr.status==0&&xhr.response){var packageData=xhr.response;callback(packageData)}else{throw new Error(xhr.statusText+" : "+xhr.responseURL)}};xhr.send(null)}function handleError(error){console.error("package error:",error)}var fetchedCallback=null;var fetched=Module["getPreloadedPackage"]?Module["getPreloadedPackage"](REMOTE_PACKAGE_NAME,REMOTE_PACKAGE_SIZE):null;if(!fetched)fetchRemotePackage(REMOTE_PACKAGE_NAME,REMOTE_PACKAGE_SIZE,function(data){if(fetchedCallback){fetchedCallback(data);fetchedCallback=null}else{fetched=data}},handleError);function runWithFS(){function assert(check,msg){if(!check)throw msg+(new Error).stack}Module["FS_createPath"]("/","assets",true,true);Module["FS_createPath"]("/assets","tapes",true,true);Module["FS_createPath"]("/assets","images",true,true);Module["FS_createPath"]("/assets","roms",true,true);Module["FS_createPath"]("/assets","disks",true,true);function DataRequest(start,end,audio){this.start=start;this.end=end;this.audio=audio}DataRequest.prototype={requests:{},open:function(mode,name){this.name=name;this.requests[name]=this;Module["addRunDependency"]("fp "+this.name)},send:function(){},onload:function(){var byteArray=this.byteArray.subarray(this.start,this.end);this.finish(byteArray)},finish:function(byteArray){var that=this;Module["FS_createDataFile"](this.name,null,byteArray,true,true,true);Module["removeRunDependency"]("fp "+that.name);this.requests[this.name]=null}};var files=metadata["files"];for(var i=0;i1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){arguments_=scriptArgs}else if(typeof arguments!="undefined"){arguments_=arguments}if(typeof quit==="function"){quit_=function(status){quit(status)}}if(typeof print!=="undefined"){if(typeof console==="undefined")console={};console.log=print;console.warn=console.error=typeof printErr!=="undefined"?printErr:print}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var STACK_ALIGN=16;function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;return Math.ceil(size/factor)*factor}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var tempRet0=0;var setTempRet0=function(value){tempRet0=value};var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime;if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var wasmMemory;var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string")return UTF8ToString(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i0;if(runningAsync&&!prevRunningAsync){return new Promise(function(resolve){Asyncify.asyncFinalizers.push(function(ret){if(stack!==0)stackRestore(stack);resolve(convertReturnValue(ret))})})}ret=convertReturnValue(ret);if(stack!==0)stackRestore(stack);if(opts&&opts.async)return Promise.resolve(ret);return ret}var ALLOC_NORMAL=0;var ALLOC_STACK=1;function allocate(slab,allocator){var ret;if(allocator==ALLOC_STACK){ret=stackAlloc(slab.length)}else{ret=_malloc(slab.length)}if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heap,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heap[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}function allocateUTF8OnStack(str){var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8Array(str,HEAP8,ret,size);return ret}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var WASM_PAGE_SIZE=65536;var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_INITIAL_MEMORY=Module["INITIAL_MEMORY"]||268435456;if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_INITIAL_MEMORY/WASM_PAGE_SIZE,"maximum":INITIAL_INITIAL_MEMORY/WASM_PAGE_SIZE})}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){FS.ignorePermissions=false;callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);throw e}function hasPrefix(str,prefix){return String.prototype.startsWith?str.startsWith(prefix):str.indexOf(prefix)===0}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return hasPrefix(filename,dataURIPrefix)}var fileURIPrefix="file://";function isFileURI(filename){return hasPrefix(filename,fileURIPrefix)}var wasmBinaryFile="Oricutron.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(){try{if(wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(wasmBinaryFile)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary()})}return Promise.resolve().then(getBinary)}var wasmOffsetConverter;function WasmOffsetConverter(wasmBytes,wasmModule){var offset=8;var funcidx=0;this.offset_map={};this.func_starts=[];this.name_map={};this.import_functions=0;var buffer=wasmBytes;function unsignedLEB128(){var result=0;var shift=0;do{var byte=buffer[offset++];result+=(byte&127)<0){offset=unsignedLEB128()+offset;offset=unsignedLEB128()+offset;switch(buffer[offset++]){case 0:++funcidx;unsignedLEB128();break;case 1:++offset;skipLimits();break;case 2:skipLimits();break;case 3:offset+=2;break}}this.import_functions=funcidx;break;case 10:var count=unsignedLEB128();while(count-- >0){var size=unsignedLEB128();this.offset_map[funcidx++]=offset;this.func_starts.push(offset);offset+=size}break binary_parse}offset=end}var sections=WebAssembly.Module.customSections(wasmModule,"name");for(var i=0;i0){var index=unsignedLEB128();var length=unsignedLEB128();this.name_map[index]=UTF8ArrayToString(buffer,offset,length);offset+=length}}}WasmOffsetConverter.prototype.convert=function(funcidx,offset){return this.offset_map[funcidx]+offset};WasmOffsetConverter.prototype.getIndex=function(offset){var lo=0;var hi=this.func_starts.length;var mid;while(looffset){hi=mid}else{lo=mid+1}}return lo+this.import_functions-1};WasmOffsetConverter.prototype.isSameFunc=function(offset1,offset2){return this.getIndex(offset1)==this.getIndex(offset2)};WasmOffsetConverter.prototype.getName=function(offset){var index=this.getIndex(offset);return this.name_map[index]||"wasm-function["+index+"]"};function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;exports=Asyncify.instrumentWasmExports(exports);Module["asm"]=exports;wasmTable=Module["asm"]["Kd"];removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiatedSource(output){receiveInstance(output["instance"])}addRunDependency("offset-converter");function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){var result=WebAssembly.instantiate(binary,info);result.then(function(instance){wasmOffsetConverter=new WasmOffsetConverter(binary,instance.module);removeRunDependency("offset-converter")});return result}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);Promise.all([response.clone().arrayBuffer(),result]).then(function(results){wasmOffsetConverter=new WasmOffsetConverter(new Uint8Array(results[0]),results[1].module);removeRunDependency("offset-converter")},function(reason){err("failed to initialize offset-converter: "+reason)});return result.then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiatedSource)})})}else{return instantiateArrayBuffer(receiveInstantiatedSource)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);exports=Asyncify.instrumentWasmExports(exports);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;var ASM_CONSTS={6825:function(){FS.syncfs(function(err){assert(!err)})},9553:function(){FS.syncfs(function(err){assert(!err)})},9731:function(){FS.mkdir("/readwritefs");FS.mount(IDBFS,{},"/readwritefs");FS.syncfs(true,function(err){assert(!err);ccall("www_async_dload","v")})},17593:function(){FS.syncfs(function(err){assert(!err)})},18598:function(){FS.syncfs(function(err){assert(!err)})},19482:function($0){var str=UTF8ToString($0)+"\n\n"+"Abort/Retry/Ignore/AlwaysIgnore? [ariA] :";var reply=window.prompt(str,"i");if(reply===null){reply="i"}return allocate(intArrayFromString(reply),"i8",ALLOC_NORMAL)},56780:function($0,$1,$2){var w=$0;var h=$1;var pixels=$2;if(!Module["SDL2"])Module["SDL2"]={};var SDL2=Module["SDL2"];if(SDL2.ctxCanvas!==Module["canvas"]){SDL2.ctx=Module["createContext"](Module["canvas"],false,true);SDL2.ctxCanvas=Module["canvas"]}if(SDL2.w!==w||SDL2.h!==h||SDL2.imageCtx!==SDL2.ctx){SDL2.image=SDL2.ctx.createImageData(w,h);SDL2.w=w;SDL2.h=h;SDL2.imageCtx=SDL2.ctx}var data=SDL2.image.data;var src=pixels>>2;var dst=0;var num;if(typeof CanvasPixelArray!=="undefined"&&data instanceof CanvasPixelArray){num=data.length;while(dst>8&255;data[dst+2]=val>>16&255;data[dst+3]=255;src++;dst+=4}}else{if(SDL2.data32Data!==data){SDL2.data32=new Int32Array(data.buffer);SDL2.data8=new Uint8Array(data.buffer)}var data32=SDL2.data32;num=data32.length;data32.set(HEAP32.subarray(src,src+num));var data8=SDL2.data8;var i=3;var j=i+4*num;if(num%8==0){while(i>2;var dst=0;var num;if(typeof CanvasPixelArray!=="undefined"&&data instanceof CanvasPixelArray){num=data.length;while(dst>8&255;data[dst+2]=val>>16&255;data[dst+3]=val>>24&255;src++;dst+=4}}else{var data32=new Int32Array(data.buffer);num=data32.length;data32.set(HEAP32.subarray(src,src+num))}ctx.putImageData(image,0,0);var url=hot_x===0&&hot_y===0?"url("+canvas.toDataURL()+"), auto":"url("+canvas.toDataURL()+") "+hot_x+" "+hot_y+", auto";var urlBuf=_malloc(url.length+1);stringToUTF8(url,urlBuf,url.length+1);return urlBuf},59248:function($0){if(Module["canvas"]){Module["canvas"].style["cursor"]=UTF8ToString($0)}return 0},59341:function(){if(Module["canvas"]){Module["canvas"].style["cursor"]="none"}},60566:function(){return screen.width},60593:function(){return screen.height},60621:function(){return window.innerWidth},60653:function(){return window.innerHeight},60731:function($0){if(typeof setWindowTitle!=="undefined"){setWindowTitle(UTF8ToString($0))}return 0},60865:function(){if(typeof AudioContext!=="undefined"){return 1}else if(typeof webkitAudioContext!=="undefined"){return 1}return 0},61031:function(){if(typeof navigator.mediaDevices!=="undefined"&&typeof navigator.mediaDevices.getUserMedia!=="undefined"){return 1}else if(typeof navigator.webkitGetUserMedia!=="undefined"){return 1}return 0},61257:function($0){if(typeof Module["SDL2"]==="undefined"){Module["SDL2"]={}}var SDL2=Module["SDL2"];if(!$0){SDL2.audio={}}else{SDL2.capture={}}if(!SDL2.audioContext){if(typeof AudioContext!=="undefined"){SDL2.audioContext=new AudioContext}else if(typeof webkitAudioContext!=="undefined"){SDL2.audioContext=new webkitAudioContext}if(SDL2.audioContext){autoResumeAudioContext(SDL2.audioContext)}}return SDL2.audioContext===undefined?-1:0},61810:function(){var SDL2=Module["SDL2"];return SDL2.audioContext.sampleRate},61880:function($0,$1,$2,$3){var SDL2=Module["SDL2"];var have_microphone=function(stream){if(SDL2.capture.silenceTimer!==undefined){clearTimeout(SDL2.capture.silenceTimer);SDL2.capture.silenceTimer=undefined}SDL2.capture.mediaStreamNode=SDL2.audioContext.createMediaStreamSource(stream);SDL2.capture.scriptProcessorNode=SDL2.audioContext.createScriptProcessor($1,$0,1);SDL2.capture.scriptProcessorNode.onaudioprocess=function(audioProcessingEvent){if(SDL2===undefined||SDL2.capture===undefined){return}audioProcessingEvent.outputBuffer.getChannelData(0).fill(0);SDL2.capture.currentCaptureBuffer=audioProcessingEvent.inputBuffer;dynCall("vi",$2,[$3])};SDL2.capture.mediaStreamNode.connect(SDL2.capture.scriptProcessorNode);SDL2.capture.scriptProcessorNode.connect(SDL2.audioContext.destination);SDL2.capture.stream=stream};var no_microphone=function(error){};SDL2.capture.silenceBuffer=SDL2.audioContext.createBuffer($0,$1,SDL2.audioContext.sampleRate);SDL2.capture.silenceBuffer.getChannelData(0).fill(0);var silence_callback=function(){SDL2.capture.currentCaptureBuffer=SDL2.capture.silenceBuffer;dynCall("vi",$2,[$3])};SDL2.capture.silenceTimer=setTimeout(silence_callback,$1/SDL2.audioContext.sampleRate*1e3);if(navigator.mediaDevices!==undefined&&navigator.mediaDevices.getUserMedia!==undefined){navigator.mediaDevices.getUserMedia({audio:true,video:false}).then(have_microphone).catch(no_microphone)}else if(navigator.webkitGetUserMedia!==undefined){navigator.webkitGetUserMedia({audio:true,video:false},have_microphone,no_microphone)}},63532:function($0,$1,$2,$3){var SDL2=Module["SDL2"];SDL2.audio.scriptProcessorNode=SDL2.audioContext["createScriptProcessor"]($1,0,$0);SDL2.audio.scriptProcessorNode["onaudioprocess"]=function(e){if(SDL2===undefined||SDL2.audio===undefined){return}SDL2.audio.currentOutputBuffer=e["outputBuffer"];dynCall("vi",$2,[$3])};SDL2.audio.scriptProcessorNode["connect"](SDL2.audioContext["destination"])},63942:function($0,$1){var SDL2=Module["SDL2"];var numChannels=SDL2.capture.currentCaptureBuffer.numberOfChannels;for(var c=0;c>2]}}},65027:function($0){var SDL2=Module["SDL2"];if($0){if(SDL2.capture.silenceTimer!==undefined){clearTimeout(SDL2.capture.silenceTimer)}if(SDL2.capture.stream!==undefined){var tracks=SDL2.capture.stream.getAudioTracks();for(var i=0;i0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){getDynCaller("v",func)()}else{getDynCaller("vi",func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function demangle(func){return func}function demangleAll(text){var regex=/\b_Z[\w\d_]+/g;return text.replace(regex,function(x){var y=demangle(x);return x===y?x:y+" ["+x+"]"})}function dynCallLegacy(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}return Module["dynCall_"+sig].call(null,ptr)}function dynCall(sig,ptr,args){return dynCallLegacy(sig,ptr,args)}function getDynCaller(sig,ptr){var argCache=[];return function(){argCache.length=arguments.length;for(var i=0;i=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:function(path){if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},extname:function(path){return PATH.splitPath(path)[3]},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:function(l,r){return PATH.normalize(l+"/"+r)}};function setErrNo(value){HEAP32[___errno_location()>>2]=value;return value}function getRandomDevice(){if(typeof crypto==="object"&&typeof crypto["getRandomValues"]==="function"){var randomBuffer=new Uint8Array(1);return function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");return function(){return crypto_module["randomBytes"](1)[0]}}catch(e){}}return function(){abort("randomDevice")}}var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:function(from,to){from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function mmapAlloc(size){var alignedSize=alignMemory(size,16384);var ptr=_malloc(alignedSize);while(size=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0;return}if(!node.contents||node.contents.subarray){var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize;return}if(!node.contents)node.contents=[];if(node.contents.length>newSize)node.contents.length=newSize;else while(node.contents.length=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:function(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:function(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:function(node){FS.hashRemoveNode(node)},isRoot:function(node){return node===node.parent},isMountpoint:function(node){return!!node.mounted},isFile:function(mode){return(mode&61440)===32768},isDir:function(mode){return(mode&61440)===16384},isLink:function(mode){return(mode&61440)===40960},isChrdev:function(mode){return(mode&61440)===8192},isBlkdev:function(mode){return(mode&61440)===24576},isFIFO:function(mode){return(mode&61440)===4096},isSocket:function(mode){return(mode&49152)===49152},flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return 2}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return 2}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return 2}return 0},mayLookup:function(dir){var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:function(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:function(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:function(fd){return FS.streams[fd]},createStream:function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=function(){};FS.FSStream.prototype={object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}}}}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:function(fd){FS.streams[fd]=null},chrdev_stream_ops:{open:function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:function(){throw new FS.ErrnoError(70)}},major:function(dev){return dev>>8},minor:function(dev){return dev&255},makedev:function(ma,mi){return ma<<8|mi},registerDevice:function(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:function(dev){return FS.devices[dev]},getMounts:function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:function(parent,name){return parent.node_ops.lookup(parent,name)},mknod:function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:function(path,mode){var dirs=path.split("/");var d="";for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}};var lazyArray=this;lazyArray.setDataGetter(function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(29)}return fn.apply(null,arguments)}});stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(29)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+80>>2]=tempI64[0],HEAP32[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},doMkdir:function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0},doMknod:function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}FS.mknod(path,mode,dev);return 0},doReadlink:function(path,buf,bufsize){if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len},doAccess:function(path,amode){if(amode&~7){return-28}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0},doDup:function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd},doReadv:function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream},get64:function(low,high){return low}};function ___sys_chdir(path){try{path=SYSCALLS.getStr(path);FS.chdir(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.open(stream.path,stream.flags,0,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_fstat64(fd,buf){try{var stream=SYSCALLS.getStreamFromFD(fd);return SYSCALLS.doStat(FS.stat,stream.path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_getcwd(buf,size){try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd);if(size>>0,(tempDouble=id,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos>>2]=tempI64[0],HEAP32[dirp+pos+4>>2]=tempI64[1];tempI64=[(idx+1)*struct_size>>>0,(tempDouble=(idx+1)*struct_size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos+8>>2]=tempI64[0],HEAP32[dirp+pos+12>>2]=tempI64[1];HEAP16[dirp+pos+16>>1]=280;HEAP8[dirp+pos+18>>0]=type;stringToUTF8(name,dirp+pos+19,256);pos+=struct_size;idx+=1}FS.llseek(stream,idx*struct_size,0);return pos}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_mkdir(path,mode){try{path=SYSCALLS.getStr(path);return SYSCALLS.doMkdir(path,mode)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_open(path,flags,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(path);var mode=SYSCALLS.get();var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_readlink(path,buf,bufsize){try{path=SYSCALLS.getStr(path);return SYSCALLS.doReadlink(path,buf,bufsize)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_stat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_statfs64(path,size,buf){try{path=SYSCALLS.getStr(path);HEAP32[buf+4>>2]=4096;HEAP32[buf+40>>2]=4096;HEAP32[buf+8>>2]=1e6;HEAP32[buf+12>>2]=5e5;HEAP32[buf+16>>2]=5e5;HEAP32[buf+20>>2]=FS.nextInode;HEAP32[buf+24>>2]=1e6;HEAP32[buf+28>>2]=42;HEAP32[buf+44>>2]=2;HEAP32[buf+36>>2]=255;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_unlink(path){try{path=SYSCALLS.getStr(path);FS.unlink(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function __emscripten_fetch_free(id){delete Fetch.xhrs[id-1]}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=function(){var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else if(typeof dateNow!=="undefined"){_emscripten_get_now=dateNow}else _emscripten_get_now=function(){return performance.now()};var _emscripten_get_now_is_monotonic=true;function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()}else if((clk_id===1||clk_id===4)&&_emscripten_get_now_is_monotonic){now=_emscripten_get_now()}else{setErrNo(28);return-1}HEAP32[tp>>2]=now/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function _dlclose(handle){abort("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")}function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,Browser.mainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,timeUntilNextTick)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate==="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";var Browser_setImmediate_messageHandler=function(event){if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}};addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}function setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop,arg,noSetTiming){noExitRuntime=true;assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Browser.mainLoop.func=browserIterationFunc;Browser.mainLoop.arg=arg;var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;Browser.mainLoop.runner=function Browser_mainLoop_runner(){if(ABORT)return;if(Browser.mainLoop.queue.length>0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}console.log('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(thisMainLoopId1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}Browser.mainLoop.runIter(browserIterationFunc);if(thisMainLoopId0)_emscripten_set_main_loop_timing(0,1e3/fps);else _emscripten_set_main_loop_timing(1,1);Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"unwind"}}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;setMainLoop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()},updateStatus:function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;Browser.safeSetTimeout(function(){finish(audio)},1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||function(){};canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||function(){};canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",function(ev){if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}},false)}}},createContext:function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false,majorVersion:1};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}if(typeof GL!=="undefined"){contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx==="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach(function(callback){callback()});Browser.init()}return ctx},destroyContext:function(canvas,useWebGL,setInModule){},fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen:function(lockPointer,resizeCanvas){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;if(typeof Browser.lockPointer==="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas==="undefined")Browser.resizeCanvas=false;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=Browser.exitFullscreen;if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?function(){canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"])}:null)||(canvasContainer["webkitRequestFullScreen"]?function(){canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"])}:null);canvasContainer.requestFullscreen()},exitFullscreen:function(){if(!Browser.isFullscreen){return false}var CFS=document["exitFullscreen"]||document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["msExitFullscreen"]||document["webkitCancelFullScreen"]||function(){};CFS.apply(document,[]);return true},nextRAF:0,fakeRequestAnimationFrame:function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)},requestAnimationFrame:function(func){if(typeof requestAnimationFrame==="function"){requestAnimationFrame(func);return}var RAF=Browser.fakeRequestAnimationFrame;RAF(func)},safeCallback:function(func){return function(){if(!ABORT)return func.apply(null,arguments)}},allowAsyncCallbacks:true,queuedAsyncCallbacks:[],pauseAsyncCallbacks:function(){Browser.allowAsyncCallbacks=false},resumeAsyncCallbacks:function(){Browser.allowAsyncCallbacks=true;if(Browser.queuedAsyncCallbacks.length>0){var callbacks=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[];callbacks.forEach(function(func){func()})}},safeRequestAnimationFrame:function(func){return Browser.requestAnimationFrame(function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}})},safeSetTimeout:function(func,timeout){noExitRuntime=true;return setTimeout(function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}},timeout)},safeSetInterval:function(func,timeout){noExitRuntime=true;return setInterval(function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}},timeout)},getMimetype:function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]},getUserMedia:function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)},getMovementX:function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0},getMovementY:function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0},getMouseWheelDelta:function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail/3;break;case"mousewheel":delta=event.wheelDelta/120;break;case"wheel":delta=event.deltaY;switch(event.deltaMode){case 0:delta/=100;break;case 1:delta/=3;break;case 2:delta*=80;break;default:throw"unrecognized mouse wheel delta mode: "+event.deltaMode}break;default:throw"unrecognized mouse wheel event: "+event.type}return delta},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!=="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!=="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}},asyncLoad:function(url,onload,onerror,noRunDep){var dep=!noRunDep?getUniqueRunDependency("al "+url):"";readAsync(url,function(arrayBuffer){assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},function(event){if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}});if(dep)addRunDependency(dep)},resizeListeners:[],updateResizeListeners:function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach(function(listener){listener(canvas.width,canvas.height)})},setCanvasSize:function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},updateCanvasDimensions:function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h>2];if(param==12321){var alphaSize=HEAP32[attribList+4>>2];EGL.contextAttributes.alpha=alphaSize>0}else if(param==12325){var depthSize=HEAP32[attribList+4>>2];EGL.contextAttributes.depth=depthSize>0}else if(param==12326){var stencilSize=HEAP32[attribList+4>>2];EGL.contextAttributes.stencil=stencilSize>0}else if(param==12337){var samples=HEAP32[attribList+4>>2];EGL.contextAttributes.antialias=samples>0}else if(param==12338){var samples=HEAP32[attribList+4>>2];EGL.contextAttributes.antialias=samples==1}else if(param==12544){var requestedPriority=HEAP32[attribList+4>>2];EGL.contextAttributes.lowLatency=requestedPriority!=12547}else if(param==12344){break}attribList+=8}}if((!config||!config_size)&&!numConfigs){EGL.setErrorCode(12300);return 0}if(numConfigs){HEAP32[numConfigs>>2]=1}if(config&&config_size>0){HEAP32[config>>2]=62002}EGL.setErrorCode(12288);return 1}};function _eglBindAPI(api){if(api==12448){EGL.setErrorCode(12288);return 1}else{EGL.setErrorCode(12300);return 0}}function _eglChooseConfig(display,attrib_list,configs,config_size,numConfigs){return EGL.chooseConfig(display,attrib_list,configs,config_size,numConfigs)}function __webgl_enable_ANGLE_instanced_arrays(ctx){var ext=ctx.getExtension("ANGLE_instanced_arrays");if(ext){ctx["vertexAttribDivisor"]=function(index,divisor){ext["vertexAttribDivisorANGLE"](index,divisor)};ctx["drawArraysInstanced"]=function(mode,first,count,primcount){ext["drawArraysInstancedANGLE"](mode,first,count,primcount)};ctx["drawElementsInstanced"]=function(mode,count,type,indices,primcount){ext["drawElementsInstancedANGLE"](mode,count,type,indices,primcount)};return 1}}function __webgl_enable_OES_vertex_array_object(ctx){var ext=ctx.getExtension("OES_vertex_array_object");if(ext){ctx["createVertexArray"]=function(){return ext["createVertexArrayOES"]()};ctx["deleteVertexArray"]=function(vao){ext["deleteVertexArrayOES"](vao)};ctx["bindVertexArray"]=function(vao){ext["bindVertexArrayOES"](vao)};ctx["isVertexArray"]=function(vao){return ext["isVertexArrayOES"](vao)};return 1}}function __webgl_enable_WEBGL_draw_buffers(ctx){var ext=ctx.getExtension("WEBGL_draw_buffers");if(ext){ctx["drawBuffers"]=function(n,bufs){ext["drawBuffersWEBGL"](n,bufs)};return 1}}function __webgl_enable_WEBGL_multi_draw(ctx){return!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"))}var GL={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],uniforms:[],shaders:[],vaos:[],contexts:[],offscreenCanvases:{},timerQueriesEXT:[],programInfos:{},stringCache:{},unpackAlignment:4,recordError:function recordError(errorCode){if(!GL.lastError){GL.lastError=errorCode}},getNewId:function(table){var ret=GL.counter++;for(var i=table.length;i>2]:-1;source+=UTF8ToString(HEAP32[string+i*4>>2],len<0?undefined:len)}return source},createContext:function(canvas,webGLContextAttributes){var ctx=canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:function(ctx,webGLContextAttributes){var handle=GL.getNewId(GL.contexts);var context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault==="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}return handle},makeContextCurrent:function(contextHandle){GL.currentContext=GL.contexts[contextHandle];Module.ctx=GLctx=GL.currentContext&&GL.currentContext.GLctx;return!(contextHandle&&!GLctx)},getContext:function(contextHandle){return GL.contexts[contextHandle]},deleteContext:function(contextHandle){if(GL.currentContext===GL.contexts[contextHandle])GL.currentContext=null;if(typeof JSEvents==="object")JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas);if(GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas)GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined;GL.contexts[contextHandle]=null},initExtensions:function(context){if(!context)context=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;__webgl_enable_ANGLE_instanced_arrays(GLctx);__webgl_enable_OES_vertex_array_object(GLctx);__webgl_enable_WEBGL_draw_buffers(GLctx);GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query");__webgl_enable_WEBGL_multi_draw(GLctx);var automaticallyEnabledExtensions=["OES_texture_float","OES_texture_half_float","OES_standard_derivatives","OES_vertex_array_object","WEBGL_compressed_texture_s3tc","WEBGL_depth_texture","OES_element_index_uint","EXT_texture_filter_anisotropic","EXT_frag_depth","WEBGL_draw_buffers","ANGLE_instanced_arrays","OES_texture_float_linear","OES_texture_half_float_linear","EXT_blend_minmax","EXT_shader_texture_lod","EXT_texture_norm16","WEBGL_compressed_texture_pvrtc","EXT_color_buffer_half_float","WEBGL_color_buffer_float","EXT_sRGB","WEBGL_compressed_texture_etc1","EXT_disjoint_timer_query","WEBGL_compressed_texture_etc","WEBGL_compressed_texture_astc","EXT_color_buffer_float","WEBGL_compressed_texture_s3tc_srgb","EXT_disjoint_timer_query_webgl2","WEBKIT_WEBGL_compressed_texture_pvrtc"];var exts=GLctx.getSupportedExtensions()||[];exts.forEach(function(ext){if(automaticallyEnabledExtensions.indexOf(ext)!=-1){GLctx.getExtension(ext)}})},populateUniformTable:function(program){var p=GL.programs[program];var ptable=GL.programInfos[program]={uniforms:{},maxUniformLength:0,maxAttributeLength:-1,maxUniformBlockNameLength:-1};var utable=ptable.uniforms;var numUniforms=GLctx.getProgramParameter(p,35718);for(var i=0;i>2];if(param==12440){glesContextVersion=HEAP32[contextAttribs+4>>2]}else if(param==12344){break}else{EGL.setErrorCode(12292);return 0}contextAttribs+=8}if(glesContextVersion!=2){EGL.setErrorCode(12293);return 0}EGL.contextAttributes.majorVersion=glesContextVersion-1;EGL.contextAttributes.minorVersion=0;EGL.context=GL.createContext(Module["canvas"],EGL.contextAttributes);if(EGL.context!=0){EGL.setErrorCode(12288);GL.makeContextCurrent(EGL.context);Module.useWebGL=true;Browser.moduleContextCreatedCallbacks.forEach(function(callback){callback()});GL.makeContextCurrent(null);return 62004}else{EGL.setErrorCode(12297);return 0}}function _eglCreateWindowSurface(display,config,win,attrib_list){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(config!=62002){EGL.setErrorCode(12293);return 0}EGL.setErrorCode(12288);return 62006}function _eglDestroyContext(display,context){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(context!=62004){EGL.setErrorCode(12294);return 0}GL.deleteContext(EGL.context);EGL.setErrorCode(12288);if(EGL.currentContext==context){EGL.currentContext=0}return 1}function _eglDestroySurface(display,surface){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(surface!=62006){EGL.setErrorCode(12301);return 1}if(EGL.currentReadSurface==surface){EGL.currentReadSurface=0}if(EGL.currentDrawSurface==surface){EGL.currentDrawSurface=0}EGL.setErrorCode(12288);return 1}function _eglGetConfigAttrib(display,config,attribute,value){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(config!=62002){EGL.setErrorCode(12293);return 0}if(!value){EGL.setErrorCode(12300);return 0}EGL.setErrorCode(12288);switch(attribute){case 12320:HEAP32[value>>2]=EGL.contextAttributes.alpha?32:24;return 1;case 12321:HEAP32[value>>2]=EGL.contextAttributes.alpha?8:0;return 1;case 12322:HEAP32[value>>2]=8;return 1;case 12323:HEAP32[value>>2]=8;return 1;case 12324:HEAP32[value>>2]=8;return 1;case 12325:HEAP32[value>>2]=EGL.contextAttributes.depth?24:0;return 1;case 12326:HEAP32[value>>2]=EGL.contextAttributes.stencil?8:0;return 1;case 12327:HEAP32[value>>2]=12344;return 1;case 12328:HEAP32[value>>2]=62002;return 1;case 12329:HEAP32[value>>2]=0;return 1;case 12330:HEAP32[value>>2]=4096;return 1;case 12331:HEAP32[value>>2]=16777216;return 1;case 12332:HEAP32[value>>2]=4096;return 1;case 12333:HEAP32[value>>2]=0;return 1;case 12334:HEAP32[value>>2]=0;return 1;case 12335:HEAP32[value>>2]=12344;return 1;case 12337:HEAP32[value>>2]=EGL.contextAttributes.antialias?4:0;return 1;case 12338:HEAP32[value>>2]=EGL.contextAttributes.antialias?1:0;return 1;case 12339:HEAP32[value>>2]=4;return 1;case 12340:HEAP32[value>>2]=12344;return 1;case 12341:case 12342:case 12343:HEAP32[value>>2]=-1;return 1;case 12345:case 12346:HEAP32[value>>2]=0;return 1;case 12347:HEAP32[value>>2]=0;return 1;case 12348:HEAP32[value>>2]=1;return 1;case 12349:case 12350:HEAP32[value>>2]=0;return 1;case 12351:HEAP32[value>>2]=12430;return 1;case 12352:HEAP32[value>>2]=4;return 1;case 12354:HEAP32[value>>2]=0;return 1;default:EGL.setErrorCode(12292);return 0}}function _eglGetDisplay(nativeDisplayType){EGL.setErrorCode(12288);return 62e3}function _eglGetError(){return EGL.errorCode}function _eglGetProcAddress(name_){return _emscripten_GetProcAddress(name_)}function _eglInitialize(display,majorVersion,minorVersion){if(display==62e3){if(majorVersion){HEAP32[majorVersion>>2]=1}if(minorVersion){HEAP32[minorVersion>>2]=4}EGL.defaultDisplayInitialized=true;EGL.setErrorCode(12288);return 1}else{EGL.setErrorCode(12296);return 0}}function _eglMakeCurrent(display,draw,read,context){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(context!=0&&context!=62004){EGL.setErrorCode(12294);return 0}if(read!=0&&read!=62006||draw!=0&&draw!=62006){EGL.setErrorCode(12301);return 0}GL.makeContextCurrent(context?EGL.context:null);EGL.currentContext=context;EGL.currentDrawSurface=draw;EGL.currentReadSurface=read;EGL.setErrorCode(12288);return 1}function _eglQueryString(display,name){if(display!=62e3){EGL.setErrorCode(12296);return 0}EGL.setErrorCode(12288);if(EGL.stringCache[name])return EGL.stringCache[name];var ret;switch(name){case 12371:ret=allocateUTF8("Emscripten");break;case 12372:ret=allocateUTF8("1.4 Emscripten EGL");break;case 12373:ret=allocateUTF8("");break;case 12429:ret=allocateUTF8("OpenGL_ES");break;default:EGL.setErrorCode(12300);return 0}EGL.stringCache[name]=ret;return ret}function _eglSwapBuffers(){if(!EGL.defaultDisplayInitialized){EGL.setErrorCode(12289)}else if(!Module.ctx){EGL.setErrorCode(12290)}else if(Module.ctx.isContextLost()){EGL.setErrorCode(12302)}else{EGL.setErrorCode(12288);return 1}return 0}function _eglSwapInterval(display,interval){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(interval==0)_emscripten_set_main_loop_timing(0,0);else _emscripten_set_main_loop_timing(1,interval);EGL.setErrorCode(12288);return 1}function _eglTerminate(display){if(display!=62e3){EGL.setErrorCode(12296);return 0}EGL.currentContext=0;EGL.currentReadSurface=0;EGL.currentDrawSurface=0;EGL.defaultDisplayInitialized=false;EGL.setErrorCode(12288);return 1}function _eglWaitClient(){EGL.setErrorCode(12288);return 1}function _eglWaitGL(){return _eglWaitClient()}function _eglWaitNative(nativeEngineId){EGL.setErrorCode(12288);return 1}function _emscripten_asm_const_int(code,sigPtr,argbuf){var args=readAsmConstArgs(sigPtr,argbuf);return ASM_CONSTS[code].apply(null,args)}var JSEvents={inEventHandler:0,removeAllEventListeners:function(){for(var i=JSEvents.eventHandlers.length-1;i>=0;--i){JSEvents._removeHandler(i)}JSEvents.eventHandlers=[];JSEvents.deferredCalls=[]},registerRemoveEventListeners:function(){if(!JSEvents.removeEventListenersRegistered){__ATEXIT__.push(JSEvents.removeAllEventListeners);JSEvents.removeEventListenersRegistered=true}},deferredCalls:[],deferCall:function(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return false;for(var i in arrA){if(arrA[i]!=arrB[i])return false}return true}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList)){return}}JSEvents.deferredCalls.push({targetFunction:targetFunction,precedence:precedence,argsList:argsList});JSEvents.deferredCalls.sort(function(x,y){return x.precedence2?UTF8ToString(cString):cString}var specialHTMLTargets=[0,typeof document!=="undefined"?document:0,typeof window!=="undefined"?window:0];function findEventTarget(target){target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||(typeof document!=="undefined"?document.querySelector(target):undefined);return domElement}function findCanvasEventTarget(target){return findEventTarget(target)}function _emscripten_get_canvas_element_size(target,width,height){var canvas=findCanvasEventTarget(target);if(!canvas)return-4;HEAP32[width>>2]=canvas.width;HEAP32[height>>2]=canvas.height}function __get_canvas_element_size(target){var stackTop=stackSave();var w=stackAlloc(8);var h=w+4;var targetInt=stackAlloc(target.id.length+1);stringToUTF8(target.id,targetInt,target.id.length+1);var ret=_emscripten_get_canvas_element_size(targetInt,w,h);var size=[HEAP32[w>>2],HEAP32[h>>2]];stackRestore(stackTop);return size}function _emscripten_set_canvas_element_size(target,width,height){var canvas=findCanvasEventTarget(target);if(!canvas)return-4;canvas.width=width;canvas.height=height;return 0}function __set_canvas_element_size(target,width,height){if(!target.controlTransferredOffscreen){target.width=width;target.height=height}else{var stackTop=stackSave();var targetInt=stackAlloc(target.id.length+1);stringToUTF8(target.id,targetInt,target.id.length+1);_emscripten_set_canvas_element_size(targetInt,width,height);stackRestore(stackTop)}}function __registerRestoreOldStyle(canvas){var canvasSize=__get_canvas_element_size(canvas);var oldWidth=canvasSize[0];var oldHeight=canvasSize[1];var oldCssWidth=canvas.style.width;var oldCssHeight=canvas.style.height;var oldBackgroundColor=canvas.style.backgroundColor;var oldDocumentBackgroundColor=document.body.style.backgroundColor;var oldPaddingLeft=canvas.style.paddingLeft;var oldPaddingRight=canvas.style.paddingRight;var oldPaddingTop=canvas.style.paddingTop;var oldPaddingBottom=canvas.style.paddingBottom;var oldMarginLeft=canvas.style.marginLeft;var oldMarginRight=canvas.style.marginRight;var oldMarginTop=canvas.style.marginTop;var oldMarginBottom=canvas.style.marginBottom;var oldDocumentBodyMargin=document.body.style.margin;var oldDocumentOverflow=document.documentElement.style.overflow;var oldDocumentScroll=document.body.scroll;var oldImageRendering=canvas.style.imageRendering;function restoreOldStyle(){var fullscreenElement=document.fullscreenElement||document.webkitFullscreenElement||document.msFullscreenElement;if(!fullscreenElement){document.removeEventListener("fullscreenchange",restoreOldStyle);document.removeEventListener("webkitfullscreenchange",restoreOldStyle);__set_canvas_element_size(canvas,oldWidth,oldHeight);canvas.style.width=oldCssWidth;canvas.style.height=oldCssHeight;canvas.style.backgroundColor=oldBackgroundColor;if(!oldDocumentBackgroundColor)document.body.style.backgroundColor="white";document.body.style.backgroundColor=oldDocumentBackgroundColor;canvas.style.paddingLeft=oldPaddingLeft;canvas.style.paddingRight=oldPaddingRight;canvas.style.paddingTop=oldPaddingTop;canvas.style.paddingBottom=oldPaddingBottom;canvas.style.marginLeft=oldMarginLeft;canvas.style.marginRight=oldMarginRight;canvas.style.marginTop=oldMarginTop;canvas.style.marginBottom=oldMarginBottom;document.body.style.margin=oldDocumentBodyMargin;document.documentElement.style.overflow=oldDocumentOverflow;document.body.scroll=oldDocumentScroll;canvas.style.imageRendering=oldImageRendering;if(canvas.GLctxObject)canvas.GLctxObject.GLctx.viewport(0,0,oldWidth,oldHeight);if(__currentFullscreenStrategy.canvasResizedCallback){getDynCaller("iiii",__currentFullscreenStrategy.canvasResizedCallback)(37,0,__currentFullscreenStrategy.canvasResizedCallbackUserData)}}}document.addEventListener("fullscreenchange",restoreOldStyle);document.addEventListener("webkitfullscreenchange",restoreOldStyle);return restoreOldStyle}function __setLetterbox(element,topBottom,leftRight){element.style.paddingLeft=element.style.paddingRight=leftRight+"px";element.style.paddingTop=element.style.paddingBottom=topBottom+"px"}function __getBoundingClientRect(e){return specialHTMLTargets.indexOf(e)<0?e.getBoundingClientRect():{"left":0,"top":0}}function _JSEvents_resizeCanvasForFullscreen(target,strategy){var restoreOldStyle=__registerRestoreOldStyle(target);var cssWidth=strategy.softFullscreen?innerWidth:screen.width;var cssHeight=strategy.softFullscreen?innerHeight:screen.height;var rect=__getBoundingClientRect(target);var windowedCssWidth=rect.width;var windowedCssHeight=rect.height;var canvasSize=__get_canvas_element_size(target);var windowedRttWidth=canvasSize[0];var windowedRttHeight=canvasSize[1];if(strategy.scaleMode==3){__setLetterbox(target,(cssHeight-windowedCssHeight)/2,(cssWidth-windowedCssWidth)/2);cssWidth=windowedCssWidth;cssHeight=windowedCssHeight}else if(strategy.scaleMode==2){if(cssWidth*windowedRttHeight>3]=rect.width;HEAPF64[height>>3]=rect.height;return 0}function __fillGamepadEventData(eventStruct,e){HEAPF64[eventStruct>>3]=e.timestamp;for(var i=0;i>3]=e.axes[i]}for(var i=0;i>3]=e.buttons[i].value}else{HEAPF64[eventStruct+i*8+528>>3]=e.buttons[i]}}for(var i=0;i>2]=e.buttons[i].pressed}else{HEAP32[eventStruct+i*4+1040>>2]=e.buttons[i]==1}}HEAP32[eventStruct+1296>>2]=e.connected;HEAP32[eventStruct+1300>>2]=e.index;HEAP32[eventStruct+8>>2]=e.axes.length;HEAP32[eventStruct+12>>2]=e.buttons.length;stringToUTF8(e.id,eventStruct+1304,64);stringToUTF8(e.mapping,eventStruct+1368,64)}function _emscripten_get_gamepad_status(index,gamepadState){if(index<0||index>=JSEvents.lastGamepadState.length)return-5;if(!JSEvents.lastGamepadState[index])return-7;__fillGamepadEventData(gamepadState,JSEvents.lastGamepadState[index]);return 0}function _emscripten_get_num_gamepads(){return JSEvents.lastGamepadState.length}function _emscripten_glActiveTexture(x0){GLctx["activeTexture"](x0)}function _emscripten_glAttachShader(program,shader){GLctx.attachShader(GL.programs[program],GL.shaders[shader])}function _emscripten_glBeginQueryEXT(target,id){GLctx.disjointTimerQueryExt["beginQueryEXT"](target,GL.timerQueriesEXT[id])}function _emscripten_glBindAttribLocation(program,index,name){GLctx.bindAttribLocation(GL.programs[program],index,UTF8ToString(name))}function _emscripten_glBindBuffer(target,buffer){GLctx.bindBuffer(target,GL.buffers[buffer])}function _emscripten_glBindFramebuffer(target,framebuffer){GLctx.bindFramebuffer(target,GL.framebuffers[framebuffer])}function _emscripten_glBindRenderbuffer(target,renderbuffer){GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])}function _emscripten_glBindTexture(target,texture){GLctx.bindTexture(target,GL.textures[texture])}function _emscripten_glBindVertexArrayOES(vao){GLctx["bindVertexArray"](GL.vaos[vao])}function _emscripten_glBlendColor(x0,x1,x2,x3){GLctx["blendColor"](x0,x1,x2,x3)}function _emscripten_glBlendEquation(x0){GLctx["blendEquation"](x0)}function _emscripten_glBlendEquationSeparate(x0,x1){GLctx["blendEquationSeparate"](x0,x1)}function _emscripten_glBlendFunc(x0,x1){GLctx["blendFunc"](x0,x1)}function _emscripten_glBlendFuncSeparate(x0,x1,x2,x3){GLctx["blendFuncSeparate"](x0,x1,x2,x3)}function _emscripten_glBufferData(target,size,data,usage){GLctx.bufferData(target,data?HEAPU8.subarray(data,data+size):size,usage)}function _emscripten_glBufferSubData(target,offset,size,data){GLctx.bufferSubData(target,offset,HEAPU8.subarray(data,data+size))}function _emscripten_glCheckFramebufferStatus(x0){return GLctx["checkFramebufferStatus"](x0)}function _emscripten_glClear(x0){GLctx["clear"](x0)}function _emscripten_glClearColor(x0,x1,x2,x3){GLctx["clearColor"](x0,x1,x2,x3)}function _emscripten_glClearDepthf(x0){GLctx["clearDepth"](x0)}function _emscripten_glClearStencil(x0){GLctx["clearStencil"](x0)}function _emscripten_glColorMask(red,green,blue,alpha){GLctx.colorMask(!!red,!!green,!!blue,!!alpha)}function _emscripten_glCompileShader(shader){GLctx.compileShader(GL.shaders[shader])}function _emscripten_glCompressedTexImage2D(target,level,internalFormat,width,height,border,imageSize,data){GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,data?HEAPU8.subarray(data,data+imageSize):null)}function _emscripten_glCompressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,imageSize,data){GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,data?HEAPU8.subarray(data,data+imageSize):null)}function _emscripten_glCopyTexImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexImage2D"](x0,x1,x2,x3,x4,x5,x6,x7)}function _emscripten_glCopyTexSubImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexSubImage2D"](x0,x1,x2,x3,x4,x5,x6,x7)}function _emscripten_glCreateProgram(){var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;GL.programs[id]=program;return id}function _emscripten_glCreateShader(shaderType){var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id}function _emscripten_glCullFace(x0){GLctx["cullFace"](x0)}function _emscripten_glDeleteBuffers(n,buffers){for(var i=0;i>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null}}function _emscripten_glDeleteFramebuffers(n,framebuffers){for(var i=0;i>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}}function _emscripten_glDeleteProgram(id){if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null;GL.programInfos[id]=null}function _emscripten_glDeleteQueriesEXT(n,ids){for(var i=0;i>2];var query=GL.timerQueriesEXT[id];if(!query)continue;GLctx.disjointTimerQueryExt["deleteQueryEXT"](query);GL.timerQueriesEXT[id]=null}}function _emscripten_glDeleteRenderbuffers(n,renderbuffers){for(var i=0;i>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}}function _emscripten_glDeleteShader(id){if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null}function _emscripten_glDeleteTextures(n,textures){for(var i=0;i>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}}function _emscripten_glDeleteVertexArraysOES(n,vaos){for(var i=0;i>2];GLctx["deleteVertexArray"](GL.vaos[id]);GL.vaos[id]=null}}function _emscripten_glDepthFunc(x0){GLctx["depthFunc"](x0)}function _emscripten_glDepthMask(flag){GLctx.depthMask(!!flag)}function _emscripten_glDepthRangef(x0,x1){GLctx["depthRange"](x0,x1)}function _emscripten_glDetachShader(program,shader){GLctx.detachShader(GL.programs[program],GL.shaders[shader])}function _emscripten_glDisable(x0){GLctx["disable"](x0)}function _emscripten_glDisableVertexAttribArray(index){GLctx.disableVertexAttribArray(index)}function _emscripten_glDrawArrays(mode,first,count){GLctx.drawArrays(mode,first,count)}function _emscripten_glDrawArraysInstancedANGLE(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}var tempFixedLengthArray=[];function _emscripten_glDrawBuffersWEBGL(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}function _emscripten_glDrawElements(mode,count,type,indices){GLctx.drawElements(mode,count,type,indices)}function _emscripten_glDrawElementsInstancedANGLE(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _emscripten_glEnable(x0){GLctx["enable"](x0)}function _emscripten_glEnableVertexAttribArray(index){GLctx.enableVertexAttribArray(index)}function _emscripten_glEndQueryEXT(target){GLctx.disjointTimerQueryExt["endQueryEXT"](target)}function _emscripten_glFinish(){GLctx["finish"]()}function _emscripten_glFlush(){GLctx["flush"]()}function _emscripten_glFramebufferRenderbuffer(target,attachment,renderbuffertarget,renderbuffer){GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])}function _emscripten_glFramebufferTexture2D(target,attachment,textarget,texture,level){GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)}function _emscripten_glFrontFace(x0){GLctx["frontFace"](x0)}function __glGenObject(n,buffers,createFunction,objectTable){for(var i=0;i>2]=id}}function _emscripten_glGenBuffers(n,buffers){__glGenObject(n,buffers,"createBuffer",GL.buffers)}function _emscripten_glGenFramebuffers(n,ids){__glGenObject(n,ids,"createFramebuffer",GL.framebuffers)}function _emscripten_glGenQueriesEXT(n,ids){for(var i=0;i>2]=0;return}var id=GL.getNewId(GL.timerQueriesEXT);query.name=id;GL.timerQueriesEXT[id]=query;HEAP32[ids+i*4>>2]=id}}function _emscripten_glGenRenderbuffers(n,renderbuffers){__glGenObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)}function _emscripten_glGenTextures(n,textures){__glGenObject(n,textures,"createTexture",GL.textures)}function _emscripten_glGenVertexArraysOES(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}function _emscripten_glGenerateMipmap(x0){GLctx["generateMipmap"](x0)}function __glGetActiveAttribOrUniform(funcName,program,index,bufSize,length,size,type,name){program=GL.programs[program];var info=GLctx[funcName](program,index);if(info){var numBytesWrittenExclNull=name&&stringToUTF8(info.name,name,bufSize);if(length)HEAP32[length>>2]=numBytesWrittenExclNull;if(size)HEAP32[size>>2]=info.size;if(type)HEAP32[type>>2]=info.type}}function _emscripten_glGetActiveAttrib(program,index,bufSize,length,size,type,name){__glGetActiveAttribOrUniform("getActiveAttrib",program,index,bufSize,length,size,type,name)}function _emscripten_glGetActiveUniform(program,index,bufSize,length,size,type,name){__glGetActiveAttribOrUniform("getActiveUniform",program,index,bufSize,length,size,type,name)}function _emscripten_glGetAttachedShaders(program,maxCount,count,shaders){var result=GLctx.getAttachedShaders(GL.programs[program]);var len=result.length;if(len>maxCount){len=maxCount}HEAP32[count>>2]=len;for(var i=0;i>2]=id}}function _emscripten_glGetAttribLocation(program,name){return GLctx.getAttribLocation(GL.programs[program],UTF8ToString(name))}function writeI53ToI64(ptr,num){HEAPU32[ptr>>2]=num;HEAPU32[ptr+4>>2]=(num-HEAPU32[ptr>>2])/4294967296}function emscriptenWebGLGet(name_,p,type){if(!p){GL.recordError(1281);return}var ret=undefined;switch(name_){case 36346:ret=1;break;case 36344:if(type!=0&&type!=1){GL.recordError(1280)}return;case 36345:ret=0;break;case 34466:var formats=GLctx.getParameter(34467);ret=formats?formats.length:0;break}if(ret===undefined){var result=GLctx.getParameter(name_);switch(typeof result){case"number":ret=result;break;case"boolean":ret=result?1:0;break;case"string":GL.recordError(1280);return;case"object":if(result===null){switch(name_){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 34068:{ret=0;break}default:{GL.recordError(1280);return}}}else if(result instanceof Float32Array||result instanceof Uint32Array||result instanceof Int32Array||result instanceof Array){for(var i=0;i>2]=result[i];break;case 2:HEAPF32[p+i*4>>2]=result[i];break;case 4:HEAP8[p+i>>0]=result[i]?1:0;break}}return}else{try{ret=result.name|0}catch(e){GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Unknown object returned from WebGL getParameter("+name_+")! (error: "+e+")");return}}break;default:GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Native code calling glGet"+type+"v("+name_+") and it returns "+result+" of type "+typeof result+"!");return}}switch(type){case 1:writeI53ToI64(p,ret);break;case 0:HEAP32[p>>2]=ret;break;case 2:HEAPF32[p>>2]=ret;break;case 4:HEAP8[p>>0]=ret?1:0;break}}function _emscripten_glGetBooleanv(name_,p){emscriptenWebGLGet(name_,p,4)}function _emscripten_glGetBufferParameteriv(target,value,data){if(!data){GL.recordError(1281);return}HEAP32[data>>2]=GLctx.getBufferParameter(target,value)}function _emscripten_glGetError(){var error=GLctx.getError()||GL.lastError;GL.lastError=0;return error}function _emscripten_glGetFloatv(name_,p){emscriptenWebGLGet(name_,p,2)}function _emscripten_glGetFramebufferAttachmentParameteriv(target,attachment,pname,params){var result=GLctx.getFramebufferAttachmentParameter(target,attachment,pname);if(result instanceof WebGLRenderbuffer||result instanceof WebGLTexture){result=result.name|0}HEAP32[params>>2]=result}function _emscripten_glGetIntegerv(name_,p){emscriptenWebGLGet(name_,p,0)}function _emscripten_glGetProgramInfoLog(program,maxLength,length,infoLog){var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _emscripten_glGetProgramiv(program,pname,p){if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}var ptable=GL.programInfos[program];if(!ptable){GL.recordError(1282);return}if(pname==35716){var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){HEAP32[p>>2]=ptable.maxUniformLength}else if(pname==35722){if(ptable.maxAttributeLength==-1){program=GL.programs[program];var numAttribs=GLctx.getProgramParameter(program,35721);ptable.maxAttributeLength=0;for(var i=0;i>2]=ptable.maxAttributeLength}else if(pname==35381){if(ptable.maxUniformBlockNameLength==-1){program=GL.programs[program];var numBlocks=GLctx.getProgramParameter(program,35382);ptable.maxUniformBlockNameLength=0;for(var i=0;i>2]=ptable.maxUniformBlockNameLength}else{HEAP32[p>>2]=GLctx.getProgramParameter(GL.programs[program],pname)}}function _emscripten_glGetQueryObjecti64vEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.timerQueriesEXT[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}writeI53ToI64(params,ret)}function _emscripten_glGetQueryObjectivEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.timerQueriesEXT[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret}function _emscripten_glGetQueryObjectui64vEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.timerQueriesEXT[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}writeI53ToI64(params,ret)}function _emscripten_glGetQueryObjectuivEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.timerQueriesEXT[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret}function _emscripten_glGetQueryivEXT(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.disjointTimerQueryExt["getQueryEXT"](target,pname)}function _emscripten_glGetRenderbufferParameteriv(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.getRenderbufferParameter(target,pname)}function _emscripten_glGetShaderInfoLog(shader,maxLength,length,infoLog){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _emscripten_glGetShaderPrecisionFormat(shaderType,precisionType,range,precision){var result=GLctx.getShaderPrecisionFormat(shaderType,precisionType);HEAP32[range>>2]=result.rangeMin;HEAP32[range+4>>2]=result.rangeMax;HEAP32[precision>>2]=result.precision}function _emscripten_glGetShaderSource(shader,bufSize,length,source){var result=GLctx.getShaderSource(GL.shaders[shader]);if(!result)return;var numBytesWrittenExclNull=bufSize>0&&source?stringToUTF8(result,source,bufSize):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _emscripten_glGetShaderiv(shader,pname,p){if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;HEAP32[p>>2]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;HEAP32[p>>2]=sourceLength}else{HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}}function stringToNewUTF8(jsString){var length=lengthBytesUTF8(jsString)+1;var cString=_malloc(length);stringToUTF8(jsString,cString,length);return cString}function _emscripten_glGetString(name_){if(GL.stringCache[name_])return GL.stringCache[name_];var ret;switch(name_){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));ret=stringToNewUTF8(exts.join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=stringToNewUTF8(s);break;case 7938:var glVersion=GLctx.getParameter(7938);{glVersion="OpenGL ES 2.0 ("+glVersion+")"}ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion="OpenGL ES GLSL ES "+ver_num[1]+" ("+glslVersion+")"}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280);return 0}GL.stringCache[name_]=ret;return ret}function _emscripten_glGetTexParameterfv(target,pname,params){if(!params){GL.recordError(1281);return}HEAPF32[params>>2]=GLctx.getTexParameter(target,pname)}function _emscripten_glGetTexParameteriv(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.getTexParameter(target,pname)}function jstoi_q(str){return parseInt(str)}function _emscripten_glGetUniformLocation(program,name){name=UTF8ToString(name);var arrayIndex=0;if(name[name.length-1]=="]"){var leftBrace=name.lastIndexOf("[");arrayIndex=name[leftBrace+1]!="]"?jstoi_q(name.slice(leftBrace+1)):0;name=name.slice(0,leftBrace)}var uniformInfo=GL.programInfos[program]&&GL.programInfos[program].uniforms[name];if(uniformInfo&&arrayIndex>=0&&arrayIndex>2]=data;break;case 2:HEAPF32[params>>2]=data;break}}else{for(var i=0;i>2]=data[i];break;case 2:HEAPF32[params+i*4>>2]=data[i];break}}}}function _emscripten_glGetUniformfv(program,location,params){emscriptenWebGLGetUniform(program,location,params,2)}function _emscripten_glGetUniformiv(program,location,params){emscriptenWebGLGetUniform(program,location,params,0)}function _emscripten_glGetVertexAttribPointerv(index,pname,pointer){if(!pointer){GL.recordError(1281);return}HEAP32[pointer>>2]=GLctx.getVertexAttribOffset(index,pname)}function emscriptenWebGLGetVertexAttrib(index,pname,params,type){if(!params){GL.recordError(1281);return}var data=GLctx.getVertexAttrib(index,pname);if(pname==34975){HEAP32[params>>2]=data&&data["name"]}else if(typeof data=="number"||typeof data=="boolean"){switch(type){case 0:HEAP32[params>>2]=data;break;case 2:HEAPF32[params>>2]=data;break;case 5:HEAP32[params>>2]=Math.fround(data);break}}else{for(var i=0;i>2]=data[i];break;case 2:HEAPF32[params+i*4>>2]=data[i];break;case 5:HEAP32[params+i*4>>2]=Math.fround(data[i]);break}}}}function _emscripten_glGetVertexAttribfv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,2)}function _emscripten_glGetVertexAttribiv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,5)}function _emscripten_glHint(x0,x1){GLctx["hint"](x0,x1)}function _emscripten_glIsBuffer(buffer){var b=GL.buffers[buffer];if(!b)return 0;return GLctx.isBuffer(b)}function _emscripten_glIsEnabled(x0){return GLctx["isEnabled"](x0)}function _emscripten_glIsFramebuffer(framebuffer){var fb=GL.framebuffers[framebuffer];if(!fb)return 0;return GLctx.isFramebuffer(fb)}function _emscripten_glIsProgram(program){program=GL.programs[program];if(!program)return 0;return GLctx.isProgram(program)}function _emscripten_glIsQueryEXT(id){var query=GL.timerQueriesEXT[id];if(!query)return 0;return GLctx.disjointTimerQueryExt["isQueryEXT"](query)}function _emscripten_glIsRenderbuffer(renderbuffer){var rb=GL.renderbuffers[renderbuffer];if(!rb)return 0;return GLctx.isRenderbuffer(rb)}function _emscripten_glIsShader(shader){var s=GL.shaders[shader];if(!s)return 0;return GLctx.isShader(s)}function _emscripten_glIsTexture(id){var texture=GL.textures[id];if(!texture)return 0;return GLctx.isTexture(texture)}function _emscripten_glIsVertexArrayOES(array){var vao=GL.vaos[array];if(!vao)return 0;return GLctx["isVertexArray"](vao)}function _emscripten_glLineWidth(x0){GLctx["lineWidth"](x0)}function _emscripten_glLinkProgram(program){GLctx.linkProgram(GL.programs[program]);GL.populateUniformTable(program)}function _emscripten_glPixelStorei(pname,param){if(pname==3317){GL.unpackAlignment=param}GLctx.pixelStorei(pname,param)}function _emscripten_glPolygonOffset(x0,x1){GLctx["polygonOffset"](x0,x1)}function _emscripten_glQueryCounterEXT(id,target){GLctx.disjointTimerQueryExt["queryCounterEXT"](GL.timerQueriesEXT[id],target)}function computeUnpackAlignedImageSize(width,height,sizePerPixel,alignment){function roundedToNextMultipleOf(x,y){return x+y-1&-y}var plainRowSize=width*sizePerPixel;var alignedRowSize=roundedToNextMultipleOf(plainRowSize,alignment);return height*alignedRowSize}function __colorChannelsInGlTextureFormat(format){var colorChannels={5:3,6:4,8:2,29502:3,29504:4};return colorChannels[format-6402]||1}function heapObjectForWebGLType(type){type-=5120;if(type==1)return HEAPU8;if(type==4)return HEAP32;if(type==6)return HEAPF32;if(type==5||type==28922)return HEAPU32;return HEAPU16}function heapAccessShiftForWebGLHeap(heap){return 31-Math.clz32(heap.BYTES_PER_ELEMENT)}function emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat){var heap=heapObjectForWebGLType(type);var shift=heapAccessShiftForWebGLHeap(heap);var byteSize=1<>shift,pixels+bytes>>shift)}function _emscripten_glReadPixels(x,y,width,height,format,type,pixels){var pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,format);if(!pixelData){GL.recordError(1280);return}GLctx.readPixels(x,y,width,height,format,type,pixelData)}function _emscripten_glReleaseShaderCompiler(){}function _emscripten_glRenderbufferStorage(x0,x1,x2,x3){GLctx["renderbufferStorage"](x0,x1,x2,x3)}function _emscripten_glSampleCoverage(value,invert){GLctx.sampleCoverage(value,!!invert)}function _emscripten_glScissor(x0,x1,x2,x3){GLctx["scissor"](x0,x1,x2,x3)}function _emscripten_glShaderBinary(){GL.recordError(1280)}function _emscripten_glShaderSource(shader,count,string,length){var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)}function _emscripten_glStencilFunc(x0,x1,x2){GLctx["stencilFunc"](x0,x1,x2)}function _emscripten_glStencilFuncSeparate(x0,x1,x2,x3){GLctx["stencilFuncSeparate"](x0,x1,x2,x3)}function _emscripten_glStencilMask(x0){GLctx["stencilMask"](x0)}function _emscripten_glStencilMaskSeparate(x0,x1){GLctx["stencilMaskSeparate"](x0,x1)}function _emscripten_glStencilOp(x0,x1,x2){GLctx["stencilOp"](x0,x1,x2)}function _emscripten_glStencilOpSeparate(x0,x1,x2,x3){GLctx["stencilOpSeparate"](x0,x1,x2,x3)}function _emscripten_glTexImage2D(target,level,internalFormat,width,height,border,format,type,pixels){GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat):null)}function _emscripten_glTexParameterf(x0,x1,x2){GLctx["texParameterf"](x0,x1,x2)}function _emscripten_glTexParameterfv(target,pname,params){var param=HEAPF32[params>>2];GLctx.texParameterf(target,pname,param)}function _emscripten_glTexParameteri(x0,x1,x2){GLctx["texParameteri"](x0,x1,x2)}function _emscripten_glTexParameteriv(target,pname,params){var param=HEAP32[params>>2];GLctx.texParameteri(target,pname,param)}function _emscripten_glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels){var pixelData=null;if(pixels)pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,0);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixelData)}function _emscripten_glUniform1f(location,v0){GLctx.uniform1f(GL.uniforms[location],v0)}var miniTempWebGLFloatBuffers=[];function _emscripten_glUniform1fv(location,count,value){if(count<=288){var view=miniTempWebGLFloatBuffers[count-1];for(var i=0;i>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1fv(GL.uniforms[location],view)}function _emscripten_glUniform1i(location,v0){GLctx.uniform1i(GL.uniforms[location],v0)}var __miniTempWebGLIntBuffers=[];function _emscripten_glUniform1iv(location,count,value){if(count<=288){var view=__miniTempWebGLIntBuffers[count-1];for(var i=0;i>2]}}else{var view=HEAP32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1iv(GL.uniforms[location],view)}function _emscripten_glUniform2f(location,v0,v1){GLctx.uniform2f(GL.uniforms[location],v0,v1)}function _emscripten_glUniform2fv(location,count,value){if(count<=144){var view=miniTempWebGLFloatBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2fv(GL.uniforms[location],view)}function _emscripten_glUniform2i(location,v0,v1){GLctx.uniform2i(GL.uniforms[location],v0,v1)}function _emscripten_glUniform2iv(location,count,value){if(count<=144){var view=__miniTempWebGLIntBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2iv(GL.uniforms[location],view)}function _emscripten_glUniform3f(location,v0,v1,v2){GLctx.uniform3f(GL.uniforms[location],v0,v1,v2)}function _emscripten_glUniform3fv(location,count,value){if(count<=96){var view=miniTempWebGLFloatBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3fv(GL.uniforms[location],view)}function _emscripten_glUniform3i(location,v0,v1,v2){GLctx.uniform3i(GL.uniforms[location],v0,v1,v2)}function _emscripten_glUniform3iv(location,count,value){if(count<=96){var view=__miniTempWebGLIntBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3iv(GL.uniforms[location],view)}function _emscripten_glUniform4f(location,v0,v1,v2,v3){GLctx.uniform4f(GL.uniforms[location],v0,v1,v2,v3)}function _emscripten_glUniform4fv(location,count,value){if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<4*count;i+=4){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4fv(GL.uniforms[location],view)}function _emscripten_glUniform4i(location,v0,v1,v2,v3){GLctx.uniform4i(GL.uniforms[location],v0,v1,v2,v3)}function _emscripten_glUniform4iv(location,count,value){if(count<=72){var view=__miniTempWebGLIntBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2];view[i+3]=HEAP32[value+(4*i+12)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4iv(GL.uniforms[location],view)}function _emscripten_glUniformMatrix2fv(location,count,transpose,value){if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniformMatrix2fv(GL.uniforms[location],!!transpose,view)}function _emscripten_glUniformMatrix3fv(location,count,transpose,value){if(count<=32){var view=miniTempWebGLFloatBuffers[9*count-1];for(var i=0;i<9*count;i+=9){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2];view[i+4]=HEAPF32[value+(4*i+16)>>2];view[i+5]=HEAPF32[value+(4*i+20)>>2];view[i+6]=HEAPF32[value+(4*i+24)>>2];view[i+7]=HEAPF32[value+(4*i+28)>>2];view[i+8]=HEAPF32[value+(4*i+32)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*36>>2)}GLctx.uniformMatrix3fv(GL.uniforms[location],!!transpose,view)}function _emscripten_glUniformMatrix4fv(location,count,transpose,value){if(count<=18){var view=miniTempWebGLFloatBuffers[16*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<16*count;i+=16){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3];view[i+4]=heap[dst+4];view[i+5]=heap[dst+5];view[i+6]=heap[dst+6];view[i+7]=heap[dst+7];view[i+8]=heap[dst+8];view[i+9]=heap[dst+9];view[i+10]=heap[dst+10];view[i+11]=heap[dst+11];view[i+12]=heap[dst+12];view[i+13]=heap[dst+13];view[i+14]=heap[dst+14];view[i+15]=heap[dst+15]}}else{var view=HEAPF32.subarray(value>>2,value+count*64>>2)}GLctx.uniformMatrix4fv(GL.uniforms[location],!!transpose,view)}function _emscripten_glUseProgram(program){GLctx.useProgram(GL.programs[program])}function _emscripten_glValidateProgram(program){GLctx.validateProgram(GL.programs[program])}function _emscripten_glVertexAttrib1f(x0,x1){GLctx["vertexAttrib1f"](x0,x1)}function _emscripten_glVertexAttrib1fv(index,v){GLctx.vertexAttrib1f(index,HEAPF32[v>>2])}function _emscripten_glVertexAttrib2f(x0,x1,x2){GLctx["vertexAttrib2f"](x0,x1,x2)}function _emscripten_glVertexAttrib2fv(index,v){GLctx.vertexAttrib2f(index,HEAPF32[v>>2],HEAPF32[v+4>>2])}function _emscripten_glVertexAttrib3f(x0,x1,x2,x3){GLctx["vertexAttrib3f"](x0,x1,x2,x3)}function _emscripten_glVertexAttrib3fv(index,v){GLctx.vertexAttrib3f(index,HEAPF32[v>>2],HEAPF32[v+4>>2],HEAPF32[v+8>>2])}function _emscripten_glVertexAttrib4f(x0,x1,x2,x3,x4){GLctx["vertexAttrib4f"](x0,x1,x2,x3,x4)}function _emscripten_glVertexAttrib4fv(index,v){GLctx.vertexAttrib4f(index,HEAPF32[v>>2],HEAPF32[v+4>>2],HEAPF32[v+8>>2],HEAPF32[v+12>>2])}function _emscripten_glVertexAttribDivisorANGLE(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}function _emscripten_glVertexAttribPointer(index,size,type,normalized,stride,ptr){GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)}function _emscripten_glViewport(x0,x1,x2,x3){GLctx["viewport"](x0,x1,x2,x3)}function _emscripten_has_asyncify(){return 1}function _emscripten_is_main_browser_thread(){return!ENVIRONMENT_IS_WORKER}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function __emscripten_do_request_fullscreen(target,strategy){if(!JSEvents.fullscreenEnabled())return-1;target=findEventTarget(target);if(!target)return-4;if(!target.requestFullscreen&&!target.webkitRequestFullscreen){return-3}var canPerformRequests=JSEvents.canPerformEventHandlerRequests();if(!canPerformRequests){if(strategy.deferUntilInEventHandler){JSEvents.deferCall(_JSEvents_requestFullscreen,1,[target,strategy]);return 1}else{return-2}}return _JSEvents_requestFullscreen(target,strategy)}function _emscripten_request_fullscreen_strategy(target,deferUntilInEventHandler,fullscreenStrategy){var strategy={scaleMode:HEAP32[fullscreenStrategy>>2],canvasResolutionScaleMode:HEAP32[fullscreenStrategy+4>>2],filteringMode:HEAP32[fullscreenStrategy+8>>2],deferUntilInEventHandler:deferUntilInEventHandler,canvasResizedCallback:HEAP32[fullscreenStrategy+12>>2],canvasResizedCallbackUserData:HEAP32[fullscreenStrategy+16>>2]};return __emscripten_do_request_fullscreen(target,strategy)}function _emscripten_request_pointerlock(target,deferUntilInEventHandler){target=findEventTarget(target);if(!target)return-4;if(!target.requestPointerLock&&!target.msRequestPointerLock){return-1}var canPerformRequests=JSEvents.canPerformEventHandlerRequests();if(!canPerformRequests){if(deferUntilInEventHandler){JSEvents.deferCall(__requestPointerLock,2,[target]);return 1}else{return-2}}return __requestPointerLock(target)}function abortOnCannotGrowMemory(requestedSize){abort("OOM")}function _emscripten_resize_heap(requestedSize){requestedSize=requestedSize>>>0;abortOnCannotGrowMemory(requestedSize)}function _emscripten_generate_pc(frame){var match;if(match=/\bwasm-function\[\d+\]:(0x[0-9a-f]+)/.exec(frame)){return+match[1]}else if(match=/\bwasm-function\[(\d+)\]:(\d+)/.exec(frame)){return wasmOffsetConverter.convert(+match[1],+match[2])}else if(match=/:(\d+):\d+(?:\)|$)/.exec(frame)){return 2147483648|+match[1]}else{return 0}}function _emscripten_return_address(level){var callstack=(new Error).stack.split("\n");if(callstack[0]=="Error"){callstack.shift()}return _emscripten_generate_pc(callstack[level+2])}function _emscripten_sample_gamepad_data(){return(JSEvents.lastGamepadState=navigator.getGamepads?navigator.getGamepads():navigator.webkitGetGamepads?navigator.webkitGetGamepads():null)?0:-1}function __registerBeforeUnloadEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString){var beforeUnloadEventHandlerFunc=function(ev){var e=ev||event;var confirmationMessage=getDynCaller("iiii",callbackfunc)(eventTypeId,0,userData);if(confirmationMessage){confirmationMessage=UTF8ToString(confirmationMessage)}if(confirmationMessage){e.preventDefault();e.returnValue=confirmationMessage;return confirmationMessage}};var eventHandler={target:findEventTarget(target),eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:beforeUnloadEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_beforeunload_callback_on_thread(userData,callbackfunc,targetThread){if(typeof onbeforeunload==="undefined")return-1;if(targetThread!==1)return-5;__registerBeforeUnloadEventCallback(2,userData,true,callbackfunc,28,"beforeunload");return 0}function __registerFocusEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.focusEvent)JSEvents.focusEvent=_malloc(256);var focusEventHandlerFunc=function(ev){var e=ev||event;var nodeName=JSEvents.getNodeNameForTarget(e.target);var id=e.target.id?e.target.id:"";var focusEvent=JSEvents.focusEvent;stringToUTF8(nodeName,focusEvent+0,128);stringToUTF8(id,focusEvent+128,128);if(getDynCaller("iiii",callbackfunc)(eventTypeId,focusEvent,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:focusEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_blur_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){__registerFocusEventCallback(target,userData,useCapture,callbackfunc,12,"blur",targetThread);return 0}function _emscripten_set_element_css_size(target,width,height){target=findEventTarget(target);if(!target)return-4;target.style.width=width+"px";target.style.height=height+"px";return 0}function _emscripten_set_focus_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){__registerFocusEventCallback(target,userData,useCapture,callbackfunc,13,"focus",targetThread);return 0}function __fillFullscreenChangeEventData(eventStruct){var fullscreenElement=document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement;var isFullscreen=!!fullscreenElement;HEAP32[eventStruct>>2]=isFullscreen;HEAP32[eventStruct+4>>2]=JSEvents.fullscreenEnabled();var reportedElement=isFullscreen?fullscreenElement:JSEvents.previousFullscreenElement;var nodeName=JSEvents.getNodeNameForTarget(reportedElement);var id=reportedElement&&reportedElement.id?reportedElement.id:"";stringToUTF8(nodeName,eventStruct+8,128);stringToUTF8(id,eventStruct+136,128);HEAP32[eventStruct+264>>2]=reportedElement?reportedElement.clientWidth:0;HEAP32[eventStruct+268>>2]=reportedElement?reportedElement.clientHeight:0;HEAP32[eventStruct+272>>2]=screen.width;HEAP32[eventStruct+276>>2]=screen.height;if(isFullscreen){JSEvents.previousFullscreenElement=fullscreenElement}}function __registerFullscreenChangeEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.fullscreenChangeEvent)JSEvents.fullscreenChangeEvent=_malloc(280);var fullscreenChangeEventhandlerFunc=function(ev){var e=ev||event;var fullscreenChangeEvent=JSEvents.fullscreenChangeEvent;__fillFullscreenChangeEventData(fullscreenChangeEvent);if(getDynCaller("iiii",callbackfunc)(eventTypeId,fullscreenChangeEvent,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:fullscreenChangeEventhandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_fullscreenchange_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){if(!JSEvents.fullscreenEnabled())return-1;target=findEventTarget(target);if(!target)return-4;__registerFullscreenChangeEventCallback(target,userData,useCapture,callbackfunc,19,"fullscreenchange",targetThread);__registerFullscreenChangeEventCallback(target,userData,useCapture,callbackfunc,19,"webkitfullscreenchange",targetThread);return 0}function __registerGamepadEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.gamepadEvent)JSEvents.gamepadEvent=_malloc(1432);var gamepadEventHandlerFunc=function(ev){var e=ev||event;var gamepadEvent=JSEvents.gamepadEvent;__fillGamepadEventData(gamepadEvent,e["gamepad"]);if(getDynCaller("iiii",callbackfunc)(eventTypeId,gamepadEvent,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),allowsDeferredCalls:true,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:gamepadEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_gamepadconnected_callback_on_thread(userData,useCapture,callbackfunc,targetThread){if(!navigator.getGamepads&&!navigator.webkitGetGamepads)return-1;__registerGamepadEventCallback(2,userData,useCapture,callbackfunc,26,"gamepadconnected",targetThread);return 0}function _emscripten_set_gamepaddisconnected_callback_on_thread(userData,useCapture,callbackfunc,targetThread){if(!navigator.getGamepads&&!navigator.webkitGetGamepads)return-1;__registerGamepadEventCallback(2,userData,useCapture,callbackfunc,27,"gamepaddisconnected",targetThread);return 0}function __registerKeyEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.keyEvent)JSEvents.keyEvent=_malloc(164);var keyEventHandlerFunc=function(e){var keyEventData=JSEvents.keyEvent;var idx=keyEventData>>2;HEAP32[idx+0]=e.location;HEAP32[idx+1]=e.ctrlKey;HEAP32[idx+2]=e.shiftKey;HEAP32[idx+3]=e.altKey;HEAP32[idx+4]=e.metaKey;HEAP32[idx+5]=e.repeat;HEAP32[idx+6]=e.charCode;HEAP32[idx+7]=e.keyCode;HEAP32[idx+8]=e.which;stringToUTF8(e.key||"",keyEventData+36,32);stringToUTF8(e.code||"",keyEventData+68,32);stringToUTF8(e.char||"",keyEventData+100,32);stringToUTF8(e.locale||"",keyEventData+132,32);if(getDynCaller("iiii",callbackfunc)(eventTypeId,keyEventData,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),allowsDeferredCalls:true,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:keyEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_keydown_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){__registerKeyEventCallback(target,userData,useCapture,callbackfunc,2,"keydown",targetThread);return 0}function _emscripten_set_keypress_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){__registerKeyEventCallback(target,userData,useCapture,callbackfunc,1,"keypress",targetThread);return 0}function _emscripten_set_keyup_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){__registerKeyEventCallback(target,userData,useCapture,callbackfunc,3,"keyup",targetThread);return 0}function _emscripten_set_main_loop_arg(func,arg,fps,simulateInfiniteLoop){var browserIterationFunc=function(){getDynCaller("vi",func)(arg)};setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop,arg)}function __fillMouseEventData(eventStruct,e,target){var idx=eventStruct>>2;HEAP32[idx+0]=e.screenX;HEAP32[idx+1]=e.screenY;HEAP32[idx+2]=e.clientX;HEAP32[idx+3]=e.clientY;HEAP32[idx+4]=e.ctrlKey;HEAP32[idx+5]=e.shiftKey;HEAP32[idx+6]=e.altKey;HEAP32[idx+7]=e.metaKey;HEAP16[idx*2+16]=e.button;HEAP16[idx*2+17]=e.buttons;HEAP32[idx+9]=e["movementX"];HEAP32[idx+10]=e["movementY"];var rect=__getBoundingClientRect(target);HEAP32[idx+11]=e.clientX-rect.left;HEAP32[idx+12]=e.clientY-rect.top}function __registerMouseEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.mouseEvent)JSEvents.mouseEvent=_malloc(64);target=findEventTarget(target);var mouseEventHandlerFunc=function(ev){var e=ev||event;__fillMouseEventData(JSEvents.mouseEvent,e,target);if(getDynCaller("iiii",callbackfunc)(eventTypeId,JSEvents.mouseEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:eventTypeString!="mousemove"&&eventTypeString!="mouseenter"&&eventTypeString!="mouseleave",eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:mouseEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_mousedown_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){__registerMouseEventCallback(target,userData,useCapture,callbackfunc,5,"mousedown",targetThread);return 0}function _emscripten_set_mouseenter_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){__registerMouseEventCallback(target,userData,useCapture,callbackfunc,33,"mouseenter",targetThread);return 0}function _emscripten_set_mouseleave_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){__registerMouseEventCallback(target,userData,useCapture,callbackfunc,34,"mouseleave",targetThread);return 0}function _emscripten_set_mousemove_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){__registerMouseEventCallback(target,userData,useCapture,callbackfunc,8,"mousemove",targetThread);return 0}function _emscripten_set_mouseup_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){__registerMouseEventCallback(target,userData,useCapture,callbackfunc,6,"mouseup",targetThread);return 0}function __fillPointerlockChangeEventData(eventStruct){var pointerLockElement=document.pointerLockElement||document.mozPointerLockElement||document.webkitPointerLockElement||document.msPointerLockElement;var isPointerlocked=!!pointerLockElement;HEAP32[eventStruct>>2]=isPointerlocked;var nodeName=JSEvents.getNodeNameForTarget(pointerLockElement);var id=pointerLockElement&&pointerLockElement.id?pointerLockElement.id:"";stringToUTF8(nodeName,eventStruct+4,128);stringToUTF8(id,eventStruct+132,128)}function __registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.pointerlockChangeEvent)JSEvents.pointerlockChangeEvent=_malloc(260);var pointerlockChangeEventHandlerFunc=function(ev){var e=ev||event;var pointerlockChangeEvent=JSEvents.pointerlockChangeEvent;__fillPointerlockChangeEventData(pointerlockChangeEvent);if(getDynCaller("iiii",callbackfunc)(eventTypeId,pointerlockChangeEvent,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:pointerlockChangeEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_pointerlockchange_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){if(!document||!document.body||!document.body.requestPointerLock&&!document.body.mozRequestPointerLock&&!document.body.webkitRequestPointerLock&&!document.body.msRequestPointerLock){return-1}target=findEventTarget(target);if(!target)return-4;__registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,20,"pointerlockchange",targetThread);__registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,20,"mozpointerlockchange",targetThread);__registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,20,"webkitpointerlockchange",targetThread);__registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,20,"mspointerlockchange",targetThread);return 0}function __registerUiEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.uiEvent)JSEvents.uiEvent=_malloc(36);target=findEventTarget(target);var uiEventHandlerFunc=function(ev){var e=ev||event;if(e.target!=target){return}var b=document.body;if(!b){return}var uiEvent=JSEvents.uiEvent;HEAP32[uiEvent>>2]=e.detail;HEAP32[uiEvent+4>>2]=b.clientWidth;HEAP32[uiEvent+8>>2]=b.clientHeight;HEAP32[uiEvent+12>>2]=innerWidth;HEAP32[uiEvent+16>>2]=innerHeight;HEAP32[uiEvent+20>>2]=outerWidth;HEAP32[uiEvent+24>>2]=outerHeight;HEAP32[uiEvent+28>>2]=pageXOffset;HEAP32[uiEvent+32>>2]=pageYOffset;if(getDynCaller("iiii",callbackfunc)(eventTypeId,uiEvent,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:uiEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_resize_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){__registerUiEventCallback(target,userData,useCapture,callbackfunc,10,"resize",targetThread);return 0}function __registerTouchEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.touchEvent)JSEvents.touchEvent=_malloc(1684);target=findEventTarget(target);var touchEventHandlerFunc=function(e){var touches={};var et=e.touches;for(var i=0;i>2;HEAP32[idx+1]=e.ctrlKey;HEAP32[idx+2]=e.shiftKey;HEAP32[idx+3]=e.altKey;HEAP32[idx+4]=e.metaKey;idx+=5;var targetRect=__getBoundingClientRect(target);var numTouches=0;for(var i in touches){var t=touches[i];HEAP32[idx+0]=t.identifier;HEAP32[idx+1]=t.screenX;HEAP32[idx+2]=t.screenY;HEAP32[idx+3]=t.clientX;HEAP32[idx+4]=t.clientY;HEAP32[idx+5]=t.pageX;HEAP32[idx+6]=t.pageY;HEAP32[idx+7]=t.isChanged;HEAP32[idx+8]=t.onTarget;HEAP32[idx+9]=t.clientX-targetRect.left;HEAP32[idx+10]=t.clientY-targetRect.top;idx+=13;if(++numTouches>31){break}}HEAP32[touchEvent>>2]=numTouches;if(getDynCaller("iiii",callbackfunc)(eventTypeId,touchEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:eventTypeString=="touchstart"||eventTypeString=="touchend",eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:touchEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_touchcancel_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){__registerTouchEventCallback(target,userData,useCapture,callbackfunc,25,"touchcancel",targetThread);return 0}function _emscripten_set_touchend_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){__registerTouchEventCallback(target,userData,useCapture,callbackfunc,23,"touchend",targetThread);return 0}function _emscripten_set_touchmove_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){__registerTouchEventCallback(target,userData,useCapture,callbackfunc,24,"touchmove",targetThread);return 0}function _emscripten_set_touchstart_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){__registerTouchEventCallback(target,userData,useCapture,callbackfunc,22,"touchstart",targetThread);return 0}function __fillVisibilityChangeEventData(eventStruct){var visibilityStates=["hidden","visible","prerender","unloaded"];var visibilityState=visibilityStates.indexOf(document.visibilityState);HEAP32[eventStruct>>2]=document.hidden;HEAP32[eventStruct+4>>2]=visibilityState}function __registerVisibilityChangeEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.visibilityChangeEvent)JSEvents.visibilityChangeEvent=_malloc(8);var visibilityChangeEventHandlerFunc=function(ev){var e=ev||event;var visibilityChangeEvent=JSEvents.visibilityChangeEvent;__fillVisibilityChangeEventData(visibilityChangeEvent);if(getDynCaller("iiii",callbackfunc)(eventTypeId,visibilityChangeEvent,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:visibilityChangeEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_visibilitychange_callback_on_thread(userData,useCapture,callbackfunc,targetThread){if(!specialHTMLTargets[1]){return-4}__registerVisibilityChangeEventCallback(specialHTMLTargets[1],userData,useCapture,callbackfunc,21,"visibilitychange",targetThread);return 0}function __registerWheelEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.wheelEvent)JSEvents.wheelEvent=_malloc(96);var wheelHandlerFunc=function(ev){var e=ev||event;var wheelEvent=JSEvents.wheelEvent;__fillMouseEventData(wheelEvent,e,target);HEAPF64[wheelEvent+64>>3]=e["deltaX"];HEAPF64[wheelEvent+72>>3]=e["deltaY"];HEAPF64[wheelEvent+80>>3]=e["deltaZ"];HEAP32[wheelEvent+88>>2]=e["deltaMode"];if(getDynCaller("iiii",callbackfunc)(eventTypeId,wheelEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:true,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:wheelHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_wheel_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target=findEventTarget(target);if(typeof target.onwheel!=="undefined"){__registerWheelEventCallback(target,userData,useCapture,callbackfunc,9,"wheel",targetThread);return 0}else{return-1}}function _emscripten_sleep(ms){Asyncify.handleSleep(function(wakeUp){Browser.safeSetTimeout(wakeUp,ms)})}var Fetch={xhrs:[],setu64:function(addr,val){HEAPU32[addr>>2]=val;HEAPU32[addr+4>>2]=val/4294967296|0},openDatabase:function(dbname,dbversion,onsuccess,onerror){try{var openRequest=indexedDB.open(dbname,dbversion)}catch(e){return onerror(e)}openRequest.onupgradeneeded=function(event){var db=event.target.result;if(db.objectStoreNames.contains("FILES")){db.deleteObjectStore("FILES")}db.createObjectStore("FILES")};openRequest.onsuccess=function(event){onsuccess(event.target.result)};openRequest.onerror=function(error){onerror(error)}},staticInit:function(){var isMainThread=true;var onsuccess=function(db){Fetch.dbInstance=db;if(isMainThread){removeRunDependency("library_fetch_init")}};var onerror=function(){Fetch.dbInstance=false;if(isMainThread){removeRunDependency("library_fetch_init")}};Fetch.openDatabase("emscripten_filesystem",1,onsuccess,onerror);if(typeof ENVIRONMENT_IS_FETCH_WORKER==="undefined"||!ENVIRONMENT_IS_FETCH_WORKER)addRunDependency("library_fetch_init")}};function __emscripten_fetch_xhr(fetch,onsuccess,onerror,onprogress,onreadystatechange){var url=HEAPU32[fetch+8>>2];if(!url){onerror(fetch,0,"no url specified!");return}var url_=UTF8ToString(url);var fetch_attr=fetch+112;var requestMethod=UTF8ToString(fetch_attr);if(!requestMethod)requestMethod="GET";var userData=HEAPU32[fetch+4>>2];var fetchAttributes=HEAPU32[fetch_attr+52>>2];var timeoutMsecs=HEAPU32[fetch_attr+56>>2];var withCredentials=!!HEAPU32[fetch_attr+60>>2];var destinationPath=HEAPU32[fetch_attr+64>>2];var userName=HEAPU32[fetch_attr+68>>2];var password=HEAPU32[fetch_attr+72>>2];var requestHeaders=HEAPU32[fetch_attr+76>>2];var overriddenMimeType=HEAPU32[fetch_attr+80>>2];var dataPtr=HEAPU32[fetch_attr+84>>2];var dataLength=HEAPU32[fetch_attr+88>>2];var fetchAttrLoadToMemory=!!(fetchAttributes&1);var fetchAttrStreamData=!!(fetchAttributes&2);var fetchAttrSynchronous=!!(fetchAttributes&64);var userNameStr=userName?UTF8ToString(userName):undefined;var passwordStr=password?UTF8ToString(password):undefined;var overriddenMimeTypeStr=overriddenMimeType?UTF8ToString(overriddenMimeType):undefined;var xhr=new XMLHttpRequest;xhr.withCredentials=withCredentials;xhr.open(requestMethod,url_,!fetchAttrSynchronous,userNameStr,passwordStr);if(!fetchAttrSynchronous)xhr.timeout=timeoutMsecs;xhr.url_=url_;xhr.responseType="arraybuffer";if(overriddenMimeType){xhr.overrideMimeType(overriddenMimeTypeStr)}if(requestHeaders){for(;;){var key=HEAPU32[requestHeaders>>2];if(!key)break;var value=HEAPU32[requestHeaders+4>>2];if(!value)break;requestHeaders+=8;var keyStr=UTF8ToString(key);var valueStr=UTF8ToString(value);xhr.setRequestHeader(keyStr,valueStr)}}Fetch.xhrs.push(xhr);var id=Fetch.xhrs.length;HEAPU32[fetch+0>>2]=id;var data=dataPtr&&dataLength?HEAPU8.slice(dataPtr,dataPtr+dataLength):null;function saveResponse(condition){var ptr=0;var ptrLen=0;if(condition){ptrLen=xhr.response?xhr.response.byteLength:0;ptr=_malloc(ptrLen);HEAPU8.set(new Uint8Array(xhr.response),ptr)}HEAPU32[fetch+12>>2]=ptr;Fetch.setu64(fetch+16,ptrLen)}xhr.onload=function(e){saveResponse(fetchAttrLoadToMemory&&!fetchAttrStreamData);var len=xhr.response?xhr.response.byteLength:0;Fetch.setu64(fetch+24,0);if(len){Fetch.setu64(fetch+32,len)}HEAPU16[fetch+40>>1]=xhr.readyState;HEAPU16[fetch+42>>1]=xhr.status;if(xhr.statusText)stringToUTF8(xhr.statusText,fetch+44,64);if(xhr.status>=200&&xhr.status<300){if(onsuccess)onsuccess(fetch,xhr,e)}else{if(onerror)onerror(fetch,xhr,e)}};xhr.onerror=function(e){saveResponse(fetchAttrLoadToMemory);var status=xhr.status;Fetch.setu64(fetch+24,0);Fetch.setu64(fetch+32,xhr.response?xhr.response.byteLength:0);HEAPU16[fetch+40>>1]=xhr.readyState;HEAPU16[fetch+42>>1]=status;if(onerror)onerror(fetch,xhr,e)};xhr.ontimeout=function(e){if(onerror)onerror(fetch,xhr,e)};xhr.onprogress=function(e){var ptrLen=fetchAttrLoadToMemory&&fetchAttrStreamData&&xhr.response?xhr.response.byteLength:0;var ptr=0;if(fetchAttrLoadToMemory&&fetchAttrStreamData){ptr=_malloc(ptrLen);HEAPU8.set(new Uint8Array(xhr.response),ptr)}HEAPU32[fetch+12>>2]=ptr;Fetch.setu64(fetch+16,ptrLen);Fetch.setu64(fetch+24,e.loaded-ptrLen);Fetch.setu64(fetch+32,e.total);HEAPU16[fetch+40>>1]=xhr.readyState;if(xhr.readyState>=3&&xhr.status===0&&e.loaded>0)xhr.status=200;HEAPU16[fetch+42>>1]=xhr.status;if(xhr.statusText)stringToUTF8(xhr.statusText,fetch+44,64);if(onprogress)onprogress(fetch,xhr,e);if(ptr){_free(ptr)}};xhr.onreadystatechange=function(e){HEAPU16[fetch+40>>1]=xhr.readyState;if(xhr.readyState>=2){HEAPU16[fetch+42>>1]=xhr.status}if(onreadystatechange)onreadystatechange(fetch,xhr,e)};try{xhr.send(data)}catch(e){if(onerror)onerror(fetch,xhr,e)}}function __emscripten_fetch_cache_data(db,fetch,data,onsuccess,onerror){if(!db){onerror(fetch,0,"IndexedDB not available!");return}var fetch_attr=fetch+112;var destinationPath=HEAPU32[fetch_attr+64>>2];if(!destinationPath)destinationPath=HEAPU32[fetch+8>>2];var destinationPathStr=UTF8ToString(destinationPath);try{var transaction=db.transaction(["FILES"],"readwrite");var packages=transaction.objectStore("FILES");var putRequest=packages.put(data,destinationPathStr);putRequest.onsuccess=function(event){HEAPU16[fetch+40>>1]=4;HEAPU16[fetch+42>>1]=200;stringToUTF8("OK",fetch+44,64);onsuccess(fetch,0,destinationPathStr)};putRequest.onerror=function(error){HEAPU16[fetch+40>>1]=4;HEAPU16[fetch+42>>1]=413;stringToUTF8("Payload Too Large",fetch+44,64);onerror(fetch,0,error)}}catch(e){onerror(fetch,0,e)}}function __emscripten_fetch_load_cached_data(db,fetch,onsuccess,onerror){if(!db){onerror(fetch,0,"IndexedDB not available!");return}var fetch_attr=fetch+112;var path=HEAPU32[fetch_attr+64>>2];if(!path)path=HEAPU32[fetch+8>>2];var pathStr=UTF8ToString(path);try{var transaction=db.transaction(["FILES"],"readonly");var packages=transaction.objectStore("FILES");var getRequest=packages.get(pathStr);getRequest.onsuccess=function(event){if(event.target.result){var value=event.target.result;var len=value.byteLength||value.length;var ptr=_malloc(len);HEAPU8.set(new Uint8Array(value),ptr);HEAPU32[fetch+12>>2]=ptr;Fetch.setu64(fetch+16,len);Fetch.setu64(fetch+24,0);Fetch.setu64(fetch+32,len);HEAPU16[fetch+40>>1]=4;HEAPU16[fetch+42>>1]=200;stringToUTF8("OK",fetch+44,64);onsuccess(fetch,0,value)}else{HEAPU16[fetch+40>>1]=4;HEAPU16[fetch+42>>1]=404;stringToUTF8("Not Found",fetch+44,64);onerror(fetch,0,"no data")}};getRequest.onerror=function(error){HEAPU16[fetch+40>>1]=4;HEAPU16[fetch+42>>1]=404;stringToUTF8("Not Found",fetch+44,64);onerror(fetch,0,error)}}catch(e){onerror(fetch,0,e)}}function __emscripten_fetch_delete_cached_data(db,fetch,onsuccess,onerror){if(!db){onerror(fetch,0,"IndexedDB not available!");return}var fetch_attr=fetch+112;var path=HEAPU32[fetch_attr+64>>2];if(!path)path=HEAPU32[fetch+8>>2];var pathStr=UTF8ToString(path);try{var transaction=db.transaction(["FILES"],"readwrite");var packages=transaction.objectStore("FILES");var request=packages.delete(pathStr);request.onsuccess=function(event){var value=event.target.result;HEAPU32[fetch+12>>2]=0;Fetch.setu64(fetch+16,0);Fetch.setu64(fetch+24,0);Fetch.setu64(fetch+32,0);HEAPU16[fetch+40>>1]=4;HEAPU16[fetch+42>>1]=200;stringToUTF8("OK",fetch+44,64);onsuccess(fetch,0,value)};request.onerror=function(error){HEAPU16[fetch+40>>1]=4;HEAPU16[fetch+42>>1]=404;stringToUTF8("Not Found",fetch+44,64);onerror(fetch,0,error)}}catch(e){onerror(fetch,0,e)}}function _emscripten_start_fetch(fetch,successcb,errorcb,progresscb,readystatechangecb){if(typeof noExitRuntime!=="undefined")noExitRuntime=true;var fetch_attr=fetch+112;var requestMethod=UTF8ToString(fetch_attr);var onsuccess=HEAPU32[fetch_attr+36>>2];var onerror=HEAPU32[fetch_attr+40>>2];var onprogress=HEAPU32[fetch_attr+44>>2];var onreadystatechange=HEAPU32[fetch_attr+48>>2];var fetchAttributes=HEAPU32[fetch_attr+52>>2];var fetchAttrPersistFile=!!(fetchAttributes&4);var fetchAttrNoDownload=!!(fetchAttributes&32);var fetchAttrReplace=!!(fetchAttributes&16);var reportSuccess=function(fetch,xhr,e){if(onsuccess)getDynCaller("vi",onsuccess)(fetch);else if(successcb)successcb(fetch)};var reportProgress=function(fetch,xhr,e){if(onprogress)getDynCaller("vi",onprogress)(fetch);else if(progresscb)progresscb(fetch)};var reportError=function(fetch,xhr,e){if(onerror)getDynCaller("vi",onerror)(fetch);else if(errorcb)errorcb(fetch)};var reportReadyStateChange=function(fetch,xhr,e){if(onreadystatechange)getDynCaller("vi",onreadystatechange)(fetch);else if(readystatechangecb)readystatechangecb(fetch)};var performUncachedXhr=function(fetch,xhr,e){__emscripten_fetch_xhr(fetch,reportSuccess,reportError,reportProgress,reportReadyStateChange)};var cacheResultAndReportSuccess=function(fetch,xhr,e){var storeSuccess=function(fetch,xhr,e){if(onsuccess)getDynCaller("vi",onsuccess)(fetch);else if(successcb)successcb(fetch)};var storeError=function(fetch,xhr,e){if(onsuccess)getDynCaller("vi",onsuccess)(fetch);else if(successcb)successcb(fetch)};__emscripten_fetch_cache_data(Fetch.dbInstance,fetch,xhr.response,storeSuccess,storeError)};var performCachedXhr=function(fetch,xhr,e){__emscripten_fetch_xhr(fetch,cacheResultAndReportSuccess,reportError,reportProgress,reportReadyStateChange)};if(requestMethod==="EM_IDB_STORE"){var ptr=HEAPU32[fetch_attr+84>>2];__emscripten_fetch_cache_data(Fetch.dbInstance,fetch,HEAPU8.slice(ptr,ptr+HEAPU32[fetch_attr+88>>2]),reportSuccess,reportError)}else if(requestMethod==="EM_IDB_DELETE"){__emscripten_fetch_delete_cached_data(Fetch.dbInstance,fetch,reportSuccess,reportError)}else if(!fetchAttrReplace){__emscripten_fetch_load_cached_data(Fetch.dbInstance,fetch,reportSuccess,fetchAttrNoDownload?reportError:fetchAttrPersistFile?performCachedXhr:performUncachedXhr)}else if(!fetchAttrNoDownload){__emscripten_fetch_xhr(fetch,fetchAttrPersistFile?cacheResultAndReportSuccess:reportSuccess,reportError,reportProgress,reportReadyStateChange)}else{return 0}return fetch}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator==="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAP32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAP32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAP32[penviron_buf_size>>2]=bufSize;return 0}function _exit(status){exit(status)}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_fdstat_get(fd,pbuf){try{var stream=SYSCALLS.getStreamFromFD(fd);var type=stream.tty?2:FS.isDir(stream.mode)?3:FS.isLink(stream.mode)?7:4;HEAP8[pbuf>>0]=type;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_read(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doReadv(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){try{var stream=SYSCALLS.getStreamFromFD(fd);var HIGH_OFFSET=4294967296;var offset=offset_high*HIGH_OFFSET+(offset_low>>>0);var DOUBLE_LIMIT=9007199254740992;if(offset<=-DOUBLE_LIMIT||offset>=DOUBLE_LIMIT){return-61}FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doWritev(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _gettimeofday(ptr){var now=Date.now();HEAP32[ptr>>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}function _usleep(useconds){var start=_emscripten_get_now();while(_emscripten_get_now()-start>2];var nanoseconds=HEAP32[rqtp+4>>2];if(nanoseconds<0||nanoseconds>999999999||seconds<0){setErrNo(28);return-1}if(rmtp!==0){HEAP32[rmtp>>2]=0;HEAP32[rmtp+4>>2]=0}return _usleep(seconds*1e6+nanoseconds/1e3)}function _setTempRet0($i){setTempRet0($i|0)}function _sigaction(signum,act,oldact){return 0}var __sigalrm_handler=0;function _signal(sig,func){if(sig==14){__sigalrm_handler=func}else{}return 0}function _system(command){if(ENVIRONMENT_IS_NODE){if(!command)return 1;var cmdstr=UTF8ToString(command);if(!cmdstr.length)return 0;var cp=require("child_process");var ret=cp.spawnSync(cmdstr,[],{shell:true,stdio:"inherit"});var _W_EXITCODE=function(ret,sig){return ret<<8|sig};if(ret.status===null){var signalToNumber=function(sig){switch(sig){case"SIGHUP":return 1;case"SIGINT":return 2;case"SIGQUIT":return 3;case"SIGFPE":return 8;case"SIGKILL":return 9;case"SIGALRM":return 14;case"SIGTERM":return 15}return 2};return _W_EXITCODE(0,signalToNumber(ret.signal))}return _W_EXITCODE(ret.status,0)}if(!command)return 0;setErrNo(6);return-1}var readAsmConstArgsArray=[];function readAsmConstArgs(sigPtr,buf){readAsmConstArgsArray.length=0;var ch;buf>>=2;while(ch=HEAPU8[sigPtr++]){var double=ch<105;if(double&&buf&1)buf++;readAsmConstArgsArray.push(double?HEAPF64[buf++>>1]:HEAP32[buf]);++buf}return readAsmConstArgsArray}function runAndAbortIfError(func){try{return func()}catch(e){abort(e)}}var Asyncify={State:{Normal:0,Unwinding:1,Rewinding:2},state:0,StackSize:4096,currData:null,handleSleepReturnValue:0,exportCallStack:[],callStackNameToId:{},callStackIdToName:{},callStackId:0,afterUnwind:null,asyncFinalizers:[],sleepCallbacks:[],getCallStackId:function(funcName){var id=Asyncify.callStackNameToId[funcName];if(id===undefined){id=Asyncify.callStackId++;Asyncify.callStackNameToId[funcName]=id;Asyncify.callStackIdToName[id]=funcName}return id},instrumentWasmExports:function(exports){var ret={};for(var x in exports){(function(x){var original=exports[x];if(typeof original==="function"){ret[x]=function(){Asyncify.exportCallStack.push(x);try{return original.apply(null,arguments)}finally{if(ABORT)return;var y=Asyncify.exportCallStack.pop();assert(y===x);Asyncify.maybeStopUnwind()}}}else{ret[x]=original}})(x)}return ret},maybeStopUnwind:function(){if(Asyncify.currData&&Asyncify.state===Asyncify.State.Unwinding&&Asyncify.exportCallStack.length===0){Asyncify.state=Asyncify.State.Normal;runAndAbortIfError(Module["_asyncify_stop_unwind"]);if(typeof Fibers!=="undefined"){Fibers.trampoline()}if(Asyncify.afterUnwind){Asyncify.afterUnwind();Asyncify.afterUnwind=null}}},allocateData:function(){var ptr=_malloc(12+Asyncify.StackSize);Asyncify.setDataHeader(ptr,ptr+12,Asyncify.StackSize);Asyncify.setDataRewindFunc(ptr);return ptr},setDataHeader:function(ptr,stack,stackSize){HEAP32[ptr>>2]=stack;HEAP32[ptr+4>>2]=stack+stackSize},setDataRewindFunc:function(ptr){var bottomOfCallStack=Asyncify.exportCallStack[0];var rewindId=Asyncify.getCallStackId(bottomOfCallStack);HEAP32[ptr+8>>2]=rewindId},getDataRewindFunc:function(ptr){var id=HEAP32[ptr+8>>2];var name=Asyncify.callStackIdToName[id];var func=Module["asm"][name];return func},handleSleep:function(startAsync){if(ABORT)return;noExitRuntime=true;if(Asyncify.state===Asyncify.State.Normal){var reachedCallback=false;var reachedAfterCallback=false;startAsync(function(handleSleepReturnValue){if(ABORT)return;Asyncify.handleSleepReturnValue=handleSleepReturnValue||0;reachedCallback=true;if(!reachedAfterCallback){return}Asyncify.state=Asyncify.State.Rewinding;runAndAbortIfError(function(){Module["_asyncify_start_rewind"](Asyncify.currData)});if(typeof Browser!=="undefined"&&Browser.mainLoop.func){Browser.mainLoop.resume()}var start=Asyncify.getDataRewindFunc(Asyncify.currData);var asyncWasmReturnValue=start();if(!Asyncify.currData){var asyncFinalizers=Asyncify.asyncFinalizers;Asyncify.asyncFinalizers=[];asyncFinalizers.forEach(function(func){func(asyncWasmReturnValue)})}});reachedAfterCallback=true;if(!reachedCallback){Asyncify.state=Asyncify.State.Unwinding;Asyncify.currData=Asyncify.allocateData();runAndAbortIfError(function(){Module["_asyncify_start_unwind"](Asyncify.currData)});if(typeof Browser!=="undefined"&&Browser.mainLoop.func){Browser.mainLoop.pause()}}}else if(Asyncify.state===Asyncify.State.Rewinding){Asyncify.state=Asyncify.State.Normal;runAndAbortIfError(Module["_asyncify_stop_rewind"]);_free(Asyncify.currData);Asyncify.currData=null;Asyncify.sleepCallbacks.forEach(function(func){func()})}else{abort("invalid state: "+Asyncify.state)}return Asyncify.handleSleepReturnValue},handleAsync:function(startAsync){return Asyncify.handleSleep(function(wakeUp){startAsync().then(wakeUp)})}};var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;Module["FS_unlink"]=FS.unlink;Module["requestFullscreen"]=function Module_requestFullscreen(lockPointer,resizeCanvas){Browser.requestFullscreen(lockPointer,resizeCanvas)};Module["requestAnimationFrame"]=function Module_requestAnimationFrame(func){Browser.requestAnimationFrame(func)};Module["setCanvasSize"]=function Module_setCanvasSize(width,height,noUpdates){Browser.setCanvasSize(width,height,noUpdates)};Module["pauseMainLoop"]=function Module_pauseMainLoop(){Browser.mainLoop.pause()};Module["resumeMainLoop"]=function Module_resumeMainLoop(){Browser.mainLoop.resume()};Module["getUserMedia"]=function Module_getUserMedia(){Browser.getUserMedia()};Module["createContext"]=function Module_createContext(canvas,useWebGL,setInModule,webGLContextAttributes){return Browser.createContext(canvas,useWebGL,setInModule,webGLContextAttributes)};var GLctx;for(var i=0;i<32;++i)tempFixedLengthArray.push(new Array(i));var miniTempWebGLFloatBuffersStorage=new Float32Array(288);for(var i=0;i<288;++i){miniTempWebGLFloatBuffers[i]=miniTempWebGLFloatBuffersStorage.subarray(0,i+1)}var __miniTempWebGLIntBuffersStorage=new Int32Array(288);for(var i=0;i<288;++i){__miniTempWebGLIntBuffers[i]=__miniTempWebGLIntBuffersStorage.subarray(0,i+1)}Fetch.staticInit();function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}__ATINIT__.push({func:function(){___wasm_call_ctors()}});var asmLibraryArg={"sa":___sys_chdir,"r":___sys_fcntl64,"na":___sys_fstat64,"ua":___sys_getcwd,"va":___sys_getdents64,"qa":___sys_ioctl,"ka":___sys_mkdir,"l":___sys_open,"ra":___sys_readlink,"s":___sys_rmdir,"q":___sys_stat64,"la":___sys_statfs64,"oa":___sys_unlink,"wa":__emscripten_fetch_free,"n":_clock_gettime,"Ca":_dlclose,"cd":_eglBindAPI,"ma":_eglChooseConfig,"lb":_eglCreateContext,"Hb":_eglCreateWindowSurface,"wb":_eglDestroyContext,"Sb":_eglDestroySurface,"ta":_eglGetConfigAttrib,"T":_eglGetDisplay,"ab":_eglGetError,"nd":_eglGetProcAddress,"Id":_eglInitialize,"bc":_eglMakeCurrent,"Ra":_eglQueryString,"mc":_eglSwapBuffers,"xc":_eglSwapInterval,"ca":_eglTerminate,"Tc":_eglWaitGL,"Ic":_eglWaitNative,"b":_emscripten_asm_const_int,"Da":_emscripten_exit_fullscreen,"Ga":_emscripten_exit_pointerlock,"i":_emscripten_get_device_pixel_ratio,"e":_emscripten_get_element_css_size,"v":_emscripten_get_gamepad_status,"Ba":_emscripten_get_num_gamepads,"Ad":_emscripten_glActiveTexture,"zd":_emscripten_glAttachShader,"aa":_emscripten_glBeginQueryEXT,"yd":_emscripten_glBindAttribLocation,"xd":_emscripten_glBindBuffer,"wd":_emscripten_glBindFramebuffer,"vd":_emscripten_glBindRenderbuffer,"ud":_emscripten_glBindTexture,"U":_emscripten_glBindVertexArrayOES,"td":_emscripten_glBlendColor,"sd":_emscripten_glBlendEquation,"rd":_emscripten_glBlendEquationSeparate,"qd":_emscripten_glBlendFunc,"pd":_emscripten_glBlendFuncSeparate,"od":_emscripten_glBufferData,"md":_emscripten_glBufferSubData,"ld":_emscripten_glCheckFramebufferStatus,"kd":_emscripten_glClear,"jd":_emscripten_glClearColor,"id":_emscripten_glClearDepthf,"hd":_emscripten_glClearStencil,"gd":_emscripten_glColorMask,"fd":_emscripten_glCompileShader,"ed":_emscripten_glCompressedTexImage2D,"dd":_emscripten_glCompressedTexSubImage2D,"bd":_emscripten_glCopyTexImage2D,"ad":_emscripten_glCopyTexSubImage2D,"$c":_emscripten_glCreateProgram,"_c":_emscripten_glCreateShader,"Zc":_emscripten_glCullFace,"Yc":_emscripten_glDeleteBuffers,"Xc":_emscripten_glDeleteFramebuffers,"Wc":_emscripten_glDeleteProgram,"da":_emscripten_glDeleteQueriesEXT,"Vc":_emscripten_glDeleteRenderbuffers,"Uc":_emscripten_glDeleteShader,"Sc":_emscripten_glDeleteTextures,"Hd":_emscripten_glDeleteVertexArraysOES,"Rc":_emscripten_glDepthFunc,"Qc":_emscripten_glDepthMask,"Pc":_emscripten_glDepthRangef,"Oc":_emscripten_glDetachShader,"Nc":_emscripten_glDisable,"Mc":_emscripten_glDisableVertexAttribArray,"Lc":_emscripten_glDrawArrays,"Dd":_emscripten_glDrawArraysInstancedANGLE,"Ed":_emscripten_glDrawBuffersWEBGL,"Kc":_emscripten_glDrawElements,"Cd":_emscripten_glDrawElementsInstancedANGLE,"Jc":_emscripten_glEnable,"Hc":_emscripten_glEnableVertexAttribArray,"$":_emscripten_glEndQueryEXT,"Gc":_emscripten_glFinish,"Fc":_emscripten_glFlush,"Ec":_emscripten_glFramebufferRenderbuffer,"Dc":_emscripten_glFramebufferTexture2D,"Cc":_emscripten_glFrontFace,"Bc":_emscripten_glGenBuffers,"zc":_emscripten_glGenFramebuffers,"ea":_emscripten_glGenQueriesEXT,"yc":_emscripten_glGenRenderbuffers,"wc":_emscripten_glGenTextures,"Gd":_emscripten_glGenVertexArraysOES,"Ac":_emscripten_glGenerateMipmap,"vc":_emscripten_glGetActiveAttrib,"uc":_emscripten_glGetActiveUniform,"tc":_emscripten_glGetAttachedShaders,"sc":_emscripten_glGetAttribLocation,"rc":_emscripten_glGetBooleanv,"qc":_emscripten_glGetBufferParameteriv,"pc":_emscripten_glGetError,"oc":_emscripten_glGetFloatv,"nc":_emscripten_glGetFramebufferAttachmentParameteriv,"lc":_emscripten_glGetIntegerv,"jc":_emscripten_glGetProgramInfoLog,"kc":_emscripten_glGetProgramiv,"W":_emscripten_glGetQueryObjecti64vEXT,"Y":_emscripten_glGetQueryObjectivEXT,"V":_emscripten_glGetQueryObjectui64vEXT,"X":_emscripten_glGetQueryObjectuivEXT,"Z":_emscripten_glGetQueryivEXT,"ic":_emscripten_glGetRenderbufferParameteriv,"gc":_emscripten_glGetShaderInfoLog,"fc":_emscripten_glGetShaderPrecisionFormat,"ec":_emscripten_glGetShaderSource,"hc":_emscripten_glGetShaderiv,"dc":_emscripten_glGetString,"cc":_emscripten_glGetTexParameterfv,"ac":_emscripten_glGetTexParameteriv,"Zb":_emscripten_glGetUniformLocation,"$b":_emscripten_glGetUniformfv,"_b":_emscripten_glGetUniformiv,"Wb":_emscripten_glGetVertexAttribPointerv,"Yb":_emscripten_glGetVertexAttribfv,"Xb":_emscripten_glGetVertexAttribiv,"Vb":_emscripten_glHint,"Ub":_emscripten_glIsBuffer,"Tb":_emscripten_glIsEnabled,"Rb":_emscripten_glIsFramebuffer,"Qb":_emscripten_glIsProgram,"ba":_emscripten_glIsQueryEXT,"Pb":_emscripten_glIsRenderbuffer,"Ob":_emscripten_glIsShader,"Nb":_emscripten_glIsTexture,"Fd":_emscripten_glIsVertexArrayOES,"Mb":_emscripten_glLineWidth,"Lb":_emscripten_glLinkProgram,"Kb":_emscripten_glPixelStorei,"Jb":_emscripten_glPolygonOffset,"_":_emscripten_glQueryCounterEXT,"Ib":_emscripten_glReadPixels,"Gb":_emscripten_glReleaseShaderCompiler,"Fb":_emscripten_glRenderbufferStorage,"Eb":_emscripten_glSampleCoverage,"Db":_emscripten_glScissor,"Cb":_emscripten_glShaderBinary,"Bb":_emscripten_glShaderSource,"Ab":_emscripten_glStencilFunc,"zb":_emscripten_glStencilFuncSeparate,"yb":_emscripten_glStencilMask,"xb":_emscripten_glStencilMaskSeparate,"vb":_emscripten_glStencilOp,"ub":_emscripten_glStencilOpSeparate,"tb":_emscripten_glTexImage2D,"sb":_emscripten_glTexParameterf,"rb":_emscripten_glTexParameterfv,"qb":_emscripten_glTexParameteri,"pb":_emscripten_glTexParameteriv,"ob":_emscripten_glTexSubImage2D,"nb":_emscripten_glUniform1f,"mb":_emscripten_glUniform1fv,"kb":_emscripten_glUniform1i,"jb":_emscripten_glUniform1iv,"ib":_emscripten_glUniform2f,"hb":_emscripten_glUniform2fv,"gb":_emscripten_glUniform2i,"fb":_emscripten_glUniform2iv,"eb":_emscripten_glUniform3f,"db":_emscripten_glUniform3fv,"cb":_emscripten_glUniform3i,"bb":_emscripten_glUniform3iv,"$a":_emscripten_glUniform4f,"_a":_emscripten_glUniform4fv,"Za":_emscripten_glUniform4i,"Ya":_emscripten_glUniform4iv,"Xa":_emscripten_glUniformMatrix2fv,"Wa":_emscripten_glUniformMatrix3fv,"Va":_emscripten_glUniformMatrix4fv,"Ua":_emscripten_glUseProgram,"Ta":_emscripten_glValidateProgram,"Sa":_emscripten_glVertexAttrib1f,"Qa":_emscripten_glVertexAttrib1fv,"Pa":_emscripten_glVertexAttrib2f,"Oa":_emscripten_glVertexAttrib2fv,"Na":_emscripten_glVertexAttrib3f,"Ma":_emscripten_glVertexAttrib3fv,"La":_emscripten_glVertexAttrib4f,"Ka":_emscripten_glVertexAttrib4fv,"Bd":_emscripten_glVertexAttribDivisorANGLE,"Ja":_emscripten_glVertexAttribPointer,"Ia":_emscripten_glViewport,"p":_emscripten_has_asyncify,"ya":_emscripten_is_main_browser_thread,"fa":_emscripten_memcpy_big,"Ea":_emscripten_request_fullscreen_strategy,"R":_emscripten_request_pointerlock,"ga":_emscripten_resize_heap,"c":_emscripten_return_address,"w":_emscripten_sample_gamepad_data,"x":_emscripten_set_beforeunload_callback_on_thread,"J":_emscripten_set_blur_callback_on_thread,"h":_emscripten_set_canvas_element_size,"o":_emscripten_set_element_css_size,"K":_emscripten_set_focus_callback_on_thread,"A":_emscripten_set_fullscreenchange_callback_on_thread,"u":_emscripten_set_gamepadconnected_callback_on_thread,"t":_emscripten_set_gamepaddisconnected_callback_on_thread,"D":_emscripten_set_keydown_callback_on_thread,"B":_emscripten_set_keypress_callback_on_thread,"C":_emscripten_set_keyup_callback_on_thread,"Fa":_emscripten_set_main_loop_arg,"P":_emscripten_set_mousedown_callback_on_thread,"N":_emscripten_set_mouseenter_callback_on_thread,"M":_emscripten_set_mouseleave_callback_on_thread,"Q":_emscripten_set_mousemove_callback_on_thread,"O":_emscripten_set_mouseup_callback_on_thread,"E":_emscripten_set_pointerlockchange_callback_on_thread,"z":_emscripten_set_resize_callback_on_thread,"F":_emscripten_set_touchcancel_callback_on_thread,"H":_emscripten_set_touchend_callback_on_thread,"G":_emscripten_set_touchmove_callback_on_thread,"I":_emscripten_set_touchstart_callback_on_thread,"y":_emscripten_set_visibilitychange_callback_on_thread,"L":_emscripten_set_wheel_callback_on_thread,"g":_emscripten_sleep,"xa":_emscripten_start_fetch,"ia":_environ_get,"ja":_environ_sizes_get,"j":_exit,"f":_fd_close,"ha":_fd_fdstat_get,"pa":_fd_read,"Ha":_fd_seek,"k":_fd_write,"m":_gettimeofday,"a":wasmMemory,"za":_nanosleep,"S":_setTempRet0,"d":_sigaction,"Aa":_signal,"Jd":_system};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["Ld"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["Md"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["Nd"]).apply(null,arguments)};var _www_async_dload=Module["_www_async_dload"]=function(){return(_www_async_dload=Module["_www_async_dload"]=Module["asm"]["Od"]).apply(null,arguments)};var _main=Module["_main"]=function(){return(_main=Module["_main"]=Module["asm"]["Pd"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["Qd"]).apply(null,arguments)};var _emscripten_GetProcAddress=Module["_emscripten_GetProcAddress"]=function(){return(_emscripten_GetProcAddress=Module["_emscripten_GetProcAddress"]=Module["asm"]["Rd"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["Sd"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["Td"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["Ud"]).apply(null,arguments)};var dynCall_vi=Module["dynCall_vi"]=function(){return(dynCall_vi=Module["dynCall_vi"]=Module["asm"]["Vd"]).apply(null,arguments)};var dynCall_ii=Module["dynCall_ii"]=function(){return(dynCall_ii=Module["dynCall_ii"]=Module["asm"]["Wd"]).apply(null,arguments)};var dynCall_iii=Module["dynCall_iii"]=function(){return(dynCall_iii=Module["dynCall_iii"]=Module["asm"]["Xd"]).apply(null,arguments)};var dynCall_viii=Module["dynCall_viii"]=function(){return(dynCall_viii=Module["dynCall_viii"]=Module["asm"]["Yd"]).apply(null,arguments)};var dynCall_vii=Module["dynCall_vii"]=function(){return(dynCall_vii=Module["dynCall_vii"]=Module["asm"]["Zd"]).apply(null,arguments)};var dynCall_viiii=Module["dynCall_viiii"]=function(){return(dynCall_viiii=Module["dynCall_viiii"]=Module["asm"]["_d"]).apply(null,arguments)};var dynCall_viiiiiii=Module["dynCall_viiiiiii"]=function(){return(dynCall_viiiiiii=Module["dynCall_viiiiiii"]=Module["asm"]["$d"]).apply(null,arguments)};var dynCall_viiiii=Module["dynCall_viiiii"]=function(){return(dynCall_viiiii=Module["dynCall_viiiii"]=Module["asm"]["ae"]).apply(null,arguments)};var dynCall_v=Module["dynCall_v"]=function(){return(dynCall_v=Module["dynCall_v"]=Module["asm"]["be"]).apply(null,arguments)};var dynCall_iiiii=Module["dynCall_iiiii"]=function(){return(dynCall_iiiii=Module["dynCall_iiiii"]=Module["asm"]["ce"]).apply(null,arguments)};var dynCall_iiii=Module["dynCall_iiii"]=function(){return(dynCall_iiii=Module["dynCall_iiii"]=Module["asm"]["de"]).apply(null,arguments)};var dynCall_iiiiii=Module["dynCall_iiiiii"]=function(){return(dynCall_iiiiii=Module["dynCall_iiiiii"]=Module["asm"]["ee"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return(dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["fe"]).apply(null,arguments)};var dynCall_ji=Module["dynCall_ji"]=function(){return(dynCall_ji=Module["dynCall_ji"]=Module["asm"]["ge"]).apply(null,arguments)};var dynCall_iiiiiiiiii=Module["dynCall_iiiiiiiiii"]=function(){return(dynCall_iiiiiiiiii=Module["dynCall_iiiiiiiiii"]=Module["asm"]["he"]).apply(null,arguments)};var dynCall_iiiiiidii=Module["dynCall_iiiiiidii"]=function(){return(dynCall_iiiiiidii=Module["dynCall_iiiiiidii"]=Module["asm"]["ie"]).apply(null,arguments)};var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=function(){return(dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=Module["asm"]["je"]).apply(null,arguments)};var dynCall_viiiiiiiiiii=Module["dynCall_viiiiiiiiiii"]=function(){return(dynCall_viiiiiiiiiii=Module["dynCall_viiiiiiiiiii"]=Module["asm"]["ke"]).apply(null,arguments)};var dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=function(){return(dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=Module["asm"]["le"]).apply(null,arguments)};var dynCall_i=Module["dynCall_i"]=function(){return(dynCall_i=Module["dynCall_i"]=Module["asm"]["me"]).apply(null,arguments)};var dynCall_iidiiii=Module["dynCall_iidiiii"]=function(){return(dynCall_iidiiii=Module["dynCall_iidiiii"]=Module["asm"]["ne"]).apply(null,arguments)};var dynCall_vffff=Module["dynCall_vffff"]=function(){return(dynCall_vffff=Module["dynCall_vffff"]=Module["asm"]["oe"]).apply(null,arguments)};var dynCall_vf=Module["dynCall_vf"]=function(){return(dynCall_vf=Module["dynCall_vf"]=Module["asm"]["pe"]).apply(null,arguments)};var dynCall_viiiiiiii=Module["dynCall_viiiiiiii"]=function(){return(dynCall_viiiiiiii=Module["dynCall_viiiiiiii"]=Module["asm"]["qe"]).apply(null,arguments)};var dynCall_viiiiiiiii=Module["dynCall_viiiiiiiii"]=function(){return(dynCall_viiiiiiiii=Module["dynCall_viiiiiiiii"]=Module["asm"]["re"]).apply(null,arguments)};var dynCall_vff=Module["dynCall_vff"]=function(){return(dynCall_vff=Module["dynCall_vff"]=Module["asm"]["se"]).apply(null,arguments)};var dynCall_vfi=Module["dynCall_vfi"]=function(){return(dynCall_vfi=Module["dynCall_vfi"]=Module["asm"]["te"]).apply(null,arguments)};var dynCall_viif=Module["dynCall_viif"]=function(){return(dynCall_viif=Module["dynCall_viif"]=Module["asm"]["ue"]).apply(null,arguments)};var dynCall_vif=Module["dynCall_vif"]=function(){return(dynCall_vif=Module["dynCall_vif"]=Module["asm"]["ve"]).apply(null,arguments)};var dynCall_viff=Module["dynCall_viff"]=function(){return(dynCall_viff=Module["dynCall_viff"]=Module["asm"]["we"]).apply(null,arguments)};var dynCall_vifff=Module["dynCall_vifff"]=function(){return(dynCall_vifff=Module["dynCall_vifff"]=Module["asm"]["xe"]).apply(null,arguments)};var dynCall_viffff=Module["dynCall_viffff"]=function(){return(dynCall_viffff=Module["dynCall_viffff"]=Module["asm"]["ye"]).apply(null,arguments)};var dynCall_viiiiii=Module["dynCall_viiiiii"]=function(){return(dynCall_viiiiii=Module["dynCall_viiiiii"]=Module["asm"]["ze"]).apply(null,arguments)};var _asyncify_start_unwind=Module["_asyncify_start_unwind"]=function(){return(_asyncify_start_unwind=Module["_asyncify_start_unwind"]=Module["asm"]["Ae"]).apply(null,arguments)};var _asyncify_stop_unwind=Module["_asyncify_stop_unwind"]=function(){return(_asyncify_stop_unwind=Module["_asyncify_stop_unwind"]=Module["asm"]["Be"]).apply(null,arguments)};var _asyncify_start_rewind=Module["_asyncify_start_rewind"]=function(){return(_asyncify_start_rewind=Module["_asyncify_start_rewind"]=Module["asm"]["Ce"]).apply(null,arguments)};var _asyncify_stop_rewind=Module["_asyncify_stop_rewind"]=function(){return(_asyncify_stop_rewind=Module["_asyncify_stop_rewind"]=Module["asm"]["De"]).apply(null,arguments)};var ___heap_base=Module["___heap_base"]=6853456;var ___global_base=Module["___global_base"]=1024;Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;Module["FS_unlink"]=FS.unlink;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}var calledMain=false;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args){var entryFunction=Module["_main"];args=args||[];var argc=args.length+1;var argv=stackAlloc((argc+1)*4);HEAP32[argv>>2]=allocateUTF8OnStack(thisProgram);for(var i=1;i>2)+i]=allocateUTF8OnStack(args[i-1])}HEAP32[(argv>>2)+argc]=0;try{var ret=entryFunction(argc,argv);if(!noExitRuntime){exit(ret,true)}}catch(e){if(e instanceof ExitStatus){return}else if(e=="unwind"){noExitRuntime=true;return}else{var toLog=e;if(e&&typeof e==="object"&&e.stack){toLog=[e,e.stack]}err("exception thrown: "+toLog);quit_(1,e)}}finally{calledMain=true}}function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0)return;function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&noExitRuntime&&status===0){return}if(noExitRuntime){}else{EXITSTATUS=status;exitRuntime();if(Module["onExit"])Module["onExit"](status);ABORT=true}quit_(status,new ExitStatus(status))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"])shouldRunNow=false;noExitRuntime=true;run(); diff --git a/www/Oricutron.wasm b/www/Oricutron.wasm new file mode 100755 index 0000000000000000000000000000000000000000..f9506ff23d3d389bbbaa1605578cf5a31759a7a5 GIT binary patch literal 1485607 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

#TC~ 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�h5KnpilKFGa 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 literal 0 HcmV?d00001 diff --git a/www/Readme.txt b/www/Readme.txt new file mode 100644 index 00000000..4c8ce16b --- /dev/null +++ b/www/Readme.txt @@ -0,0 +1,116 @@ +// Web version of Oricutron + +If you only want to host the provided version of Oricutron and some disks and tapes files : + +Requirement: have PHP running on your website. + +Note : If you don't have PHP you can use the index_nophp.html file and edit it by hand +adding your .dsk and .tap names in the JavaScript lists. + +Copy the following files to your web directory +dir.php +index.html +Oricutron.data +oricutron.html +Oricutron.js +Oricutron.wasm + +Add all your .tap and .dsk files in the same directory. + +That's all folks! + + + +If you want to compile your own version of Oricutron : + +Requirements: + +Install Emscripten SDK from https://emscripten.org/ + +https://emscripten.org/docs/getting_started/downloads.html + +Note : you can use a docker image if you don't want to install everything +(look at the end of the above linked page). + +Cmake building : + +; Create a build directory in the www directory : +cd www +mkdir build +; Change to this new directory +cd build +; Use emcmake and cmake to generate Makefile +emcmake cmake .. + +Prepare your assets : + +; create an assets directory +mkdir assets +; copy the images directory +; WARNING you'd better remove the gfx_atmoskbd.psd file as it is quite big and not used by Oricutron +cp -r ../../images assets/ +; copy the roms directory (after adding the actual roms - not included in the git repository) +cp -r ../../roms assets/ + +Either : + +; if you want to include a tap +; copy the tap +mkdir assets/tapes +cp ../../tapes/Cyclotron.tap assets/tapes + +Or : + +; if you want to include a dsk +; copy the dsk +mkdir assets/disks +cp ../../disks/aigledor.dsk assets/disks + +Edit the configuration file (so that it autoloads the tape or the disk) : +You want to search for tapeimage and have it look like this : +tapeimage = 'assets/tapes/Cyclotron.tap' +Or you want to search for diskimage and have it look like this : +diskimage = 'assets/disks/aigledor.dsk' + +You may also want to show the keyboard automatically and enable sticky mod keys +(for the shift and ctrl keys) : +show_keyboard = yes +sticky_mod_keys = yes + +Copy the configuration file : + +cp ../../oricutron.cfg assets/ + +Building : + +make + +Note : if you want to change the configuration/tapes/disks you will need to do : + +rm Oricutron.html +make + + +Testing the build : + +emrun Oricutron.html + +If everything is okay : + +You now need to move the following files to your website : +Oricutron.html ->> the web page +Oricutron.js ->> the javascript launcher file +Oricutron.wasm ->> the web assembly (the machine code) +Oricutron.data ->> all the assets + +If your data is very big you might want to look at the end of the following page + to send it compressed to navigators : +https://emscripten.org/docs/compiling/WebAssembly.html + + +Reference documentation : + +https://emscripten.org/index.html + +https://lyceum-allotments.github.io/2016/06/emscripten-and-sdl-2-tutorial-part-1/ + diff --git a/www/dir.php b/www/dir.php new file mode 100644 index 00000000..d9af6758 --- /dev/null +++ b/www/dir.php @@ -0,0 +1,16 @@ +// this php file lists dsk, tap, and oricutron config files +var dskFiles = ; +var tapFiles = ; +var cfgFiles = ; \ No newline at end of file diff --git a/www/download.html b/www/download.html new file mode 100644 index 00000000..69bd5be3 --- /dev/null +++ b/www/download.html @@ -0,0 +1,28 @@ + + + + + Oricutron.js Downloader + + +

Oricutron.js Downloader

+ + + + + + + + diff --git a/www/index.html b/www/index.html new file mode 100644 index 00000000..1b601adc --- /dev/null +++ b/www/index.html @@ -0,0 +1,46 @@ + + + + + Oricutron.js Launcher + + +

Oricutron.js Launcher

+

Please click on one of those links:

+

Disks :

+
+ +
+

Tapes :

+
+ +
+ + + + \ No newline at end of file diff --git a/www/index_nophp.html b/www/index_nophp.html new file mode 100644 index 00000000..baa4e722 --- /dev/null +++ b/www/index_nophp.html @@ -0,0 +1,49 @@ + + + + Oricutron.js Launcher + + +

Oricutron.js Launcher

+

Please click on one of those links:

+

Disks :

+
+

Tapes :

+ + + + + \ No newline at end of file diff --git a/www/oricutron.html b/www/oricutron.html new file mode 100644 index 00000000..5468b15b --- /dev/null +++ b/www/oricutron.html @@ -0,0 +1,257 @@ + + + + + + Emscripten-Generated Code + + + +
The Disks and Tapes files are in the /readwritefs/ directory! + You may need to go up twice in the directory structure to find this directory.
+ Remember to save snapshots, tapes and dsk in this directory as it is the only one + that is saved in your browser's storage space. +
+ In order to download one tape or dsk file so that you can use it in an emulator + on your computer first click on this button and then on the name of the file +
+ +
+
+ +
+
+
+
Downloading...
+
+ +
+
+ +
+ + + + + + + + + + + + \ No newline at end of file From 256bf6a9bddf932c2c9f660d80a60832e539e904 Mon Sep 17 00:00:00 2001 From: iss Date: Sat, 18 May 2024 18:53:42 +0300 Subject: [PATCH 128/143] minor compiler warnings fix --- main.c | 2 +- snapshot.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/main.c b/main.c index 02405c07..4b7142f6 100644 --- a/main.c +++ b/main.c @@ -766,7 +766,7 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) { Sint32 i; struct start_opts *sto; - char opt_type, *opt_arg, *tmp; + char opt_type, *opt_arg = NULL, *tmp; sto = malloc( sizeof( struct start_opts ) ); if( !sto ) return SDL_FALSE; diff --git a/snapshot.c b/snapshot.c index f4469533..152f1cea 100644 --- a/snapshot.c +++ b/snapshot.c @@ -759,12 +759,14 @@ static Uint32 getu32(struct blockheader *blk) return val; } +#ifdef WWW_MONITOR static Sint32 gets32(struct blockheader *blk) { Sint32 val = (blk->buf[blk->offs]<<24)|(blk->buf[blk->offs+1]<<16)|(blk->buf[blk->offs+2]<<8)|blk->buf[blk->offs+3]; blk->offs+=4; return val; } +#endif static Uint16 getu16(struct blockheader *blk) { From 99b90235f105cfdb8d3a6f358b35f44e7bc129bd Mon Sep 17 00:00:00 2001 From: Jay Vaughan Date: Sun, 9 Jun 2024 12:44:41 +0200 Subject: [PATCH 129/143] Add LICENSE.txt to the project: GPLV2, as per source headers. --- LICENSE.txt | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 LICENSE.txt diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..1f7c908c --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,86 @@ +GNU GENERAL PUBLIC LICENSE + +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification follow. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. +b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. +c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, +b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, +c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) +The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS From 3fcacb7096c8854168629b477777c50759e199c1 Mon Sep 17 00:00:00 2001 From: seclorum Date: Thu, 7 Nov 2024 20:10:49 +0100 Subject: [PATCH 130/143] Add the --nostatusbar command line option (#199) * Add LICENSE.txt to the project: GPLV2, as per source headers. * Add the --nostatusbar argument --- gui.c | 3 ++- main.c | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/gui.c b/gui.c index 6a5bb232..90cde0cb 100644 --- a/gui.c +++ b/gui.c @@ -67,6 +67,7 @@ #include "plugins/twilighte_board/oric_twilighte_board_plugin.h" extern SDL_bool fullscreen; +extern SDL_bool nostatusbar; char tapepath[4096], tapefile[512]; char diskpath[4096], diskfile[512]; @@ -475,7 +476,7 @@ SDL_bool gimg_load( struct guiimg *gi ) // Draw the statusbar at the bottom void draw_statusbar( struct machine *oric ) { - if (oric->statusbar_mode == STATUSBARMODE_NONE) + if ((oric->statusbar_mode == STATUSBARMODE_NONE) || (nostatusbar)) oric->render_clear_area( 0, GIMG_POS_SBARY, 640, 480-GIMG_POS_SBARY ); else oric->render_gimg( GIMG_STATUSBAR, 0, GIMG_POS_SBARY ); diff --git a/main.c b/main.c index 4b7142f6..655dda6f 100644 --- a/main.c +++ b/main.c @@ -78,6 +78,7 @@ SDL_bool need_sdl_quit = SDL_FALSE; SDL_bool fullscreen, hwsurface; +SDL_bool nostatusbar; extern SDL_bool warpspeed, soundon; Uint32 lastframetimes[FRAMES_TO_AVERAGE], frametimeave; extern char mon_bpmsg[]; @@ -526,6 +527,7 @@ static void load_config( struct start_opts *sto, struct machine *oric ) if( read_config_option( &sto->lctmp[i], "disktype", &sto->start_disktype, disktypes ) ) continue; if( read_config_bool( &sto->lctmp[i], "debug", &sto->start_debug ) ) continue; if( read_config_bool( &sto->lctmp[i], "fullscreen", &fullscreen ) ) continue; + if( read_config_bool( &sto->lctmp[i], "nostatusbar", &nostatusbar) ) continue; if( read_config_bool( &sto->lctmp[i], "hwsurface", &hwsurface ) ) continue; if( read_config_bool( &sto->lctmp[i], "scanlines", &oric->scanlines ) ) continue; if( read_config_bool( &sto->lctmp[i], "aratio", &oric->aratio ) ) continue; @@ -675,6 +677,7 @@ static void usage( int ret ) "\n" " -s / --symbols = Load symbols from a file\n" " -f / --fullscreen = Run oricutron fullscreen\n" + " -n / --nostatusbar = Don't display statusbar\n" " -w / --window = Run oricutron in a window\n" #ifdef __OPENGL_AVAILABLE__ " -R / --rendermode = Render mode. Valid modes are:\n" @@ -791,6 +794,7 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) sto->start_breakpoint = NULL; oric->ch376_activated = SDL_FALSE; fullscreen = SDL_FALSE; + nostatusbar = SDL_FALSE; #ifdef WIN32 hwsurface = SDL_TRUE; #else @@ -832,6 +836,7 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) tmp = &argv[i][2]; if( strcasecmp( tmp, "fullscreen" ) == 0 ) { opt_type = 'f'; break; } + if( strcasecmp( tmp, "nostatusbar") == 0 ) { opt_type = 'n'; break; } if( strcasecmp( tmp, "window" ) == 0 ) { opt_type = 'w'; break; } if( strcasecmp( tmp, "debug" ) == 0 ) { opt_type = 'b'; break; } if( strcasecmp( tmp, "hwsurface" ) == 0 ) { hwsurface = SDL_TRUE; break; } @@ -1173,8 +1178,14 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) case 'f': fullscreen = SDL_TRUE; + oric->statusbar_mode = STATUSBARMODE_NONE; break; + case 'n': + nostatusbar = SDL_TRUE; + oric->statusbar_mode = STATUSBARMODE_NONE; + break; + case 'w': fullscreen = SDL_FALSE; break; From 1c6adaac3fec5bd1b3262b3beebfc4df280de00b Mon Sep 17 00:00:00 2001 From: Peter Gordon Date: Thu, 7 Nov 2024 19:35:56 +0000 Subject: [PATCH 131/143] Set statusbar mode from cmdline/cfg without disabling F5 --- gui.c | 3 +- machine.h | 2 +- main.c | 94 +++++++++++++++++++++++++++++++-------------------- oricutron.cfg | 5 ++- 4 files changed, 63 insertions(+), 41 deletions(-) diff --git a/gui.c b/gui.c index 90cde0cb..6a5bb232 100644 --- a/gui.c +++ b/gui.c @@ -67,7 +67,6 @@ #include "plugins/twilighte_board/oric_twilighte_board_plugin.h" extern SDL_bool fullscreen; -extern SDL_bool nostatusbar; char tapepath[4096], tapefile[512]; char diskpath[4096], diskfile[512]; @@ -476,7 +475,7 @@ SDL_bool gimg_load( struct guiimg *gi ) // Draw the statusbar at the bottom void draw_statusbar( struct machine *oric ) { - if ((oric->statusbar_mode == STATUSBARMODE_NONE) || (nostatusbar)) + if (oric->statusbar_mode == STATUSBARMODE_NONE) oric->render_clear_area( 0, GIMG_POS_SBARY, 640, 480-GIMG_POS_SBARY ); else oric->render_gimg( GIMG_STATUSBAR, 0, GIMG_POS_SBARY ); diff --git a/machine.h b/machine.h index 24b45662..ca3ebd97 100644 --- a/machine.h +++ b/machine.h @@ -233,7 +233,7 @@ struct machine char statusstr[40]; SDL_bool newstatusstr; - int statusbar_mode; + Sint32 statusbar_mode; int rampattern; diff --git a/main.c b/main.c index 655dda6f..224438cc 100644 --- a/main.c +++ b/main.c @@ -78,7 +78,6 @@ SDL_bool need_sdl_quit = SDL_FALSE; SDL_bool fullscreen, hwsurface; -SDL_bool nostatusbar; extern SDL_bool warpspeed, soundon; Uint32 lastframetimes[FRAMES_TO_AVERAGE], frametimeave; extern char mon_bpmsg[]; @@ -184,6 +183,8 @@ static char *rendermodes[] = { "{{INVALID}}", static char *swdepths[] = { "8", "16", "32", NULL }; +static char *sbarmodes[] = { "full", "nofps", "none", NULL }; + static char *fileprefix = 0; // Initialize path prefix for locating program resources @@ -523,34 +524,34 @@ static void load_config( struct start_opts *sto, struct machine *oric ) for( i=0; isws( sto->lctmp[i] ); i++ ) ; - if( read_config_option( &sto->lctmp[i], "machine", &sto->start_machine, machtypes ) ) continue; - if( read_config_option( &sto->lctmp[i], "disktype", &sto->start_disktype, disktypes ) ) continue; - if( read_config_bool( &sto->lctmp[i], "debug", &sto->start_debug ) ) continue; - if( read_config_bool( &sto->lctmp[i], "fullscreen", &fullscreen ) ) continue; - if( read_config_bool( &sto->lctmp[i], "nostatusbar", &nostatusbar) ) continue; - if( read_config_bool( &sto->lctmp[i], "hwsurface", &hwsurface ) ) continue; - if( read_config_bool( &sto->lctmp[i], "scanlines", &oric->scanlines ) ) continue; - if( read_config_bool( &sto->lctmp[i], "aratio", &oric->aratio ) ) continue; - if( read_config_bool( &sto->lctmp[i], "hstretch", &oric->hstretch ) ) continue; - if( read_config_bool( &sto->lctmp[i], "palghosting", &oric->palghost ) ) continue; - if( read_config_bool( &sto->lctmp[i], "rom16", &oric->rom16 ) ) continue; - if( read_config_bool( &sto->lctmp[i], "dos70", &oric->dos70 ) ) continue; - if( read_config_path( &sto->lctmp[i], "diskimage", sto->start_disk, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "tapeimage", sto->start_tape, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "symbols", sto->start_syms, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "tapepath", tapepath, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "diskpath", diskpath, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "telediskpath", telediskpath, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "pravdiskpath", pravdiskpath, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "atmosrom", atmosromfile, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "oric1rom", oric1romfile, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "mdiscrom", mdiscromfile, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "bd500rom", bd500romfile, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "jasminrom", jasmnromfile, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "pravetzrom", pravetzromfile[0], 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "pravetz8drom", pravetzromfile[1], 1024 ) ) continue; - if( read_config_int( &sto->lctmp[i], "rampattern", &oric->rampattern, 0, 1 ) ) continue; - if( read_config_option( &sto->lctmp[i], "swdepth", &oric->sw_depth, swdepths ) ) + if( read_config_option( &sto->lctmp[i], "machine", &sto->start_machine, machtypes ) ) continue; + if( read_config_option( &sto->lctmp[i], "disktype", &sto->start_disktype, disktypes ) ) continue; + if( read_config_bool( &sto->lctmp[i], "debug", &sto->start_debug ) ) continue; + if( read_config_bool( &sto->lctmp[i], "fullscreen", &fullscreen ) ) continue; + if( read_config_option( &sto->lctmp[i], "statusbarmode", &oric->statusbar_mode, sbarmodes) ) continue; + if( read_config_bool( &sto->lctmp[i], "hwsurface", &hwsurface ) ) continue; + if( read_config_bool( &sto->lctmp[i], "scanlines", &oric->scanlines ) ) continue; + if( read_config_bool( &sto->lctmp[i], "aratio", &oric->aratio ) ) continue; + if( read_config_bool( &sto->lctmp[i], "hstretch", &oric->hstretch ) ) continue; + if( read_config_bool( &sto->lctmp[i], "palghosting", &oric->palghost ) ) continue; + if( read_config_bool( &sto->lctmp[i], "rom16", &oric->rom16 ) ) continue; + if( read_config_bool( &sto->lctmp[i], "dos70", &oric->dos70 ) ) continue; + if( read_config_path( &sto->lctmp[i], "diskimage", sto->start_disk, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "tapeimage", sto->start_tape, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "symbols", sto->start_syms, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "tapepath", tapepath, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "diskpath", diskpath, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "telediskpath", telediskpath, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "pravdiskpath", pravdiskpath, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "atmosrom", atmosromfile, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "oric1rom", oric1romfile, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "mdiscrom", mdiscromfile, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "bd500rom", bd500romfile, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "jasminrom", jasmnromfile, 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "pravetzrom", pravetzromfile[0], 1024 ) ) continue; + if( read_config_path( &sto->lctmp[i], "pravetz8drom", pravetzromfile[1], 1024 ) ) continue; + if( read_config_int( &sto->lctmp[i], "rampattern", &oric->rampattern, 0, 1 ) ) continue; + if( read_config_option( &sto->lctmp[i], "swdepth", &oric->sw_depth, swdepths ) ) { /* Convert index to depth */ switch (oric->sw_depth) @@ -677,7 +678,7 @@ static void usage( int ret ) "\n" " -s / --symbols = Load symbols from a file\n" " -f / --fullscreen = Run oricutron fullscreen\n" - " -n / --nostatusbar = Don't display statusbar\n" + " --statusbar = Set initial status bar mode: 'full', 'nofps' or 'none'\n" " -w / --window = Run oricutron in a window\n" #ifdef __OPENGL_AVAILABLE__ " -R / --rendermode = Render mode. Valid modes are:\n" @@ -794,7 +795,6 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) sto->start_breakpoint = NULL; oric->ch376_activated = SDL_FALSE; fullscreen = SDL_FALSE; - nostatusbar = SDL_FALSE; #ifdef WIN32 hwsurface = SDL_TRUE; #else @@ -836,7 +836,6 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) tmp = &argv[i][2]; if( strcasecmp( tmp, "fullscreen" ) == 0 ) { opt_type = 'f'; break; } - if( strcasecmp( tmp, "nostatusbar") == 0 ) { opt_type = 'n'; break; } if( strcasecmp( tmp, "window" ) == 0 ) { opt_type = 'w'; break; } if( strcasecmp( tmp, "debug" ) == 0 ) { opt_type = 'b'; break; } if( strcasecmp( tmp, "hwsurface" ) == 0 ) { hwsurface = SDL_TRUE; break; } @@ -938,6 +937,32 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) if( !on_or_off( argv[i-1], opt_arg, &oric->scanlines ) ) exit( EXIT_FAILURE ); continue; } + + if( strcasecmp( tmp, "statusbar" ) == 0 ) + { + if( opt_arg ) + { + if( strcasecmp( opt_arg, "none" ) == 0 ) + { + oric->statusbar_mode = STATUSBARMODE_NONE; + continue; + } + if( strcasecmp( opt_arg, "full" ) == 0 ) + { + oric->statusbar_mode = STATUSBARMODE_FULL; + continue; + } + if( strcasecmp( opt_arg, "nofps" ) == 0 ) + { + oric->statusbar_mode = STATUSBARMODE_NOFPS; + continue; + } + } + + error_printf( "Invalid statusbar mode" ); + free( sto ); + exit( EXIT_FAILURE ); + } break; default: @@ -1181,11 +1206,6 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) oric->statusbar_mode = STATUSBARMODE_NONE; break; - case 'n': - nostatusbar = SDL_TRUE; - oric->statusbar_mode = STATUSBARMODE_NONE; - break; - case 'w': fullscreen = SDL_FALSE; break; diff --git a/oricutron.cfg b/oricutron.cfg index 19c9af7a..cfdc66ce 100644 --- a/oricutron.cfg +++ b/oricutron.cfg @@ -107,8 +107,11 @@ debug = no ; ---------------------------------- +; Initial status bar mode (none, nofps, full) +;statusbarmode = nofps + ; Render mode (soft, opengl) -rendermode = soft +rendermode = opengl ; Show scanlines? (yes/no) scanlines = no From 4b57ae6e5ccd33b48c667d65a06ddc33cddbb015 Mon Sep 17 00:00:00 2001 From: iss Date: Thu, 20 Feb 2025 20:22:57 +0200 Subject: [PATCH 132/143] small fix for pravetz dsk images --- disk.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/disk.c b/disk.c index 63dab2ee..832eebab 100644 --- a/disk.c +++ b/disk.c @@ -168,7 +168,9 @@ static struct diskimage *diskimage_alloc( Uint32 rawimglen ) { // FIXME: this is temporary solution to allow // low-level formatting up to 128 track per side - if( rawimglen < 128*2*6400+256 ) rawimglen = 128*2*6400+256; + if( 143360 != rawimglen && rawimglen < 128*2*6400+256 ) + rawimglen = 128*2*6400+256; + buf = malloc( rawimglen ); if( !buf ) return NULL; } From 235a6e417ddf329ac76a32947c36c99f77db669f Mon Sep 17 00:00:00 2001 From: seclorum Date: Thu, 24 Apr 2025 21:18:37 +0200 Subject: [PATCH 133/143] OSX Packaging fix and WebAssembly target update (#203) * hacking around to get oricutron build/run'able on mojave 10.14.5 * Tweaks to make master.j buildable * Add LICENSE.txt to the project: GPLV2, as per source headers. * Add the --nostatusbar argument * Update cmake-sdl1-win64.yml Add "on: workflow_dispatch" to enable Run. * Update cmake-sdl1-win64.yml * Merge gui.c from pete-gordons' repo * Update cmake-sdl1-win64.yml Add "Upload Build" artefact. * Update cmake-win64.yml Added artefact save to workflow. * Update cmake-sdl1.yml Add Build artefacts to workflow. * Update cmake.yml Add build artefacts to workflow. * Artefact actions should be @v4 * fix SDL define * www: CMake now builds SDL2 as a _dep instead of searching for it locally * .gitignore fixed * Makefile: use build/ for PKG_DIR by default * .gitignore: oricutron binary build * Delete Oricutron_osx_v12/ package from repo - now gets put in build/, which is .gitignore'd * Remove local Frameworks path --------- Co-authored-by: Jay Vaughan Co-authored-by: Jay Vaughan --- .DS_Store | Bin 0 -> 10244 bytes .github/workflows/cmake-sdl1-win64.yml | 8 +- .github/workflows/cmake-sdl1.yml | 5 + .github/workflows/cmake-win64.yml | 5 + .github/workflows/cmake.yml | 6 + .gitignore | 47 +- Makefile | 2 +- XCode/.DS_Store | Bin 0 -> 6148 bytes XCode/Oricutron/.DS_Store | Bin 0 -> 6148 bytes .../Oricutron.xcodeproj/project.pbxproj | 13 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 31449 bytes .../xcshareddata/xcschemes/Oricutron.xcscheme | 107 + .../xcschemes/xcschememanagement.plist | 27 + cscope.out | 133741 +++++++++++++++ gui.c | 3 +- images/status_bar.bmp | Bin 0 -> 41098 bytes oricutron | Bin 0 -> 370992 bytes roms/orixbank1.rom | Bin 0 -> 16384 bytes roms/orixbank2.rom | Bin 0 -> 16384 bytes roms/orixbank3.rom | Bin 0 -> 16384 bytes roms/orixbank4.rom | Bin 0 -> 16384 bytes roms/orixbank5.rom | Bin 0 -> 16384 bytes roms/orixbank6.rom | Bin 0 -> 16384 bytes roms/orixbank7.rom | Bin 0 -> 16384 bytes www/CMakeLists.txt | 29 +- 26 files changed, 133967 insertions(+), 34 deletions(-) create mode 100644 .DS_Store create mode 100644 XCode/.DS_Store create mode 100644 XCode/Oricutron/.DS_Store create mode 100644 XCode/Oricutron/Oricutron.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 XCode/Oricutron/Oricutron.xcodeproj/project.xcworkspace/xcuserdata/j.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 XCode/Oricutron/Oricutron.xcodeproj/xcshareddata/xcschemes/Oricutron.xcscheme create mode 100644 XCode/Oricutron/Oricutron.xcodeproj/xcuserdata/j.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 cscope.out create mode 100644 images/status_bar.bmp create mode 100755 oricutron create mode 100755 roms/orixbank1.rom create mode 100755 roms/orixbank2.rom create mode 100755 roms/orixbank3.rom create mode 100755 roms/orixbank4.rom create mode 100755 roms/orixbank5.rom create mode 100755 roms/orixbank6.rom create mode 100755 roms/orixbank7.rom diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..2e859f8a1aaac0980e1e88a25b873a26efb9364f GIT binary patch literal 10244 zcmeHMYitx%6h5cj(wPD56hR*A%0fYT6li(KLmt})LU{<yXC1h z#%GKMH8H*-LE|4#k|rd^@B;x6qA?PQuK+RemnKHz4Z*qBx70ipmP(2q%Z7+rh{)3aYuDa+S1kwo%`R9Ag#(&$MSSq2pW z0s#U60s#U60s#X56$I#=&5AIT%itOy5FijBFn|DCAENYQGM1NpT-r+qUF;(O$q-fB zh3;i`Lo%9|vApc#k~CD1yOQLtm_K45cc=Pj-Y%AxeOz*P!2IC@^N}%sLP0w^wI8+3 z0b^VS*8qV4fno&M**yd^p$jyyT<7-{KeK(ofUd`AZce0(1l0+NEkiFa+w@_BTd!PK zpYC>i8+h<@a)k;|D5?p&z;s1sI+xZNn>780T2Haq4*wowFuK2mD?XV}DW~`bBwexb zy>|vR&bUA9sJeP(jos(GpEG8$))fy=v3NtMw>=OitW{5sXPt<8_0HHA9yufaw$_gA zYQvd9DH~TFb$t}Zoky-Uqo)kLi|X0Z8lntM$azu0kxrd6w|5uG1zZMvoq74`T{&@V zs$m^u2%jWm!J<0@bm*k3342K9pdMzs#%Xcw1j^_JyqvlApFLf`@rFDHIdyZMuKq2J zQldAKsb?fAAq^=)gUw7G%$L)vOPXXik=gQOz-)Z2oVk$2ATCAiIkURHr7J%cm+{CXf+dJ% zY++Je=s@VFVv7=adD#es%GJquDw$2iEwv$)YSs3sW{0KjvDn>a)5us&wqb`xzO1fOmb0e% zkV+0(PHiSPQ%3RVuu+kTcTcaIw`f`OrQx?#$k_=W=OL{*%aG$(Rg#$+0tA= zR>TddctTC_s`=7FL0&Dk=Qx_Yax*^;o$mfOaEcTkXX{}4E zI)!JwTRuJ<-o)w~6h&18L8ysM;Y_d*sEO6_Cy{2_SlT$pU?ps&6(bFM;aPYNo`=`q zZ8!$~a1uU-^Y96L3K!v9_zr%AU*Qk<6aIp~Q9u!g;xHVG6R`#-VI3~SMYtH3U?Z-^ zHTVFo!#3Q8+i?fRu?y3<8%?zE06vaS;M4dFzKE~m8~7$3#^d-tp2jnH7C*wz@C&@m z6D%vxc`bh~T#>C3PCA>p{ERKz?nl_j^7~iZBEo(%jIp$O#O)(T-BmMX#_aiv8wLi_ zGj>iI+05b8uqjiZggt<69&$QMkqyKwbx$c)%ax2n!X;)sJ{pP0j6D2t(qwupBYyM8 zsna5oTu$s2ZR44;Dtr&Wz%}Ar1yEyYAjk$xF&UdB1h3j1;+Mj+L{+g!` zz)*8*b0c-Iuw(G{m7VgV^xHu{R+wEMm$nOC><q7%^)5T6IX*Z6!X@I7VwwCUR0*wdu=Z0{Pe In>+vi1JOt~!T" run: cmake --build . --config $BUILD_TYPE + - name: Upload Build Artifacts + uses: actions/upload-artifact@v4 + with: + name: build-artifacts + path: ${{github.workspace}}/build + # We have no tests at the moment # - name: Test # working-directory: ${{github.workspace}}/build diff --git a/.github/workflows/cmake-sdl1.yml b/.github/workflows/cmake-sdl1.yml index 059a414d..b41cc81e 100644 --- a/.github/workflows/cmake-sdl1.yml +++ b/.github/workflows/cmake-sdl1.yml @@ -41,6 +41,11 @@ jobs: # Execute the build. You can specify a specific target with "--target " run: cmake --build . --config $BUILD_TYPE + - name: Upload Build Artifacts + uses: actions/upload-artifact@v4 + with: + name: build-artifacts + path: ${{github.workspace}}/build # We have no tests at the moment # - name: Test # working-directory: ${{github.workspace}}/build diff --git a/.github/workflows/cmake-win64.yml b/.github/workflows/cmake-win64.yml index 3d0f4a33..1e466d78 100644 --- a/.github/workflows/cmake-win64.yml +++ b/.github/workflows/cmake-win64.yml @@ -41,6 +41,11 @@ jobs: # Execute the build. You can specify a specific target with "--target " run: cmake --build . --config $BUILD_TYPE + - name: Upload Build Artifacts + uses: actions/upload-artifact@v4 + with: + name: build-artifacts + path: ${{github.workspace}}/build # We have no tests at the moment # - name: Test # working-directory: ${{github.workspace}}/build diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index b607c838..980337a6 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -41,6 +41,12 @@ jobs: # Execute the build. You can specify a specific target with "--target " run: cmake --build . --config $BUILD_TYPE + - name: Upload Build Artifacts + uses: actions/upload-artifact@v4 + with: + name: build-artifacts + path: ${{github.workspace}}/build + # We have no tests at the moment # - name: Test # working-directory: ${{github.workspace}}/build diff --git a/.gitignore b/.gitignore index d491e1e0..71c3af61 100644 --- a/.gitignore +++ b/.gitignore @@ -4,26 +4,27 @@ Release/ x64/ *.d *.o -/msvc/**/Debug clang -/msvc/**/Release clang -/msvc/**/images -/msvc/**/oricutron.cfg -/msvc/**/roms -/msvc/**/sdl -/msvc/**/sdl2 -/roms/*.rom -/roms/orix*.rom -/oricutron.aps -/msvc/**/Oricutron.psess -/msvc/**/*.user -/msvc/**/vcpkg -build -/Oricutron -/Oricutron-sdl2.exe -/Oricutron.exe -/SDL.dll -/SDL2.dll -/disks/*.dsk -/pravdisks/*.dsk -/teledisks/*.dsk -/Oricutron-sdl2 +msvc/**/Debug clang +msvc/**/Release clang +msvc/**/images +msvc/**/oricutron.cfg +msvc/**/roms +msvc/**/sdl +msvc/**/sdl2 +roms/*.rom +roms/orix*.rom +oricutron.aps +msvc/**/Oricutron.psess +msvc/**/*.user +msvc/**/vcpkg +build/** +Oricutron +Oricutron-sdl2.exe +Oricutron.exe +SDL.dll +SDL2.dll +disks/*.dsk +pravdisks/*.dsk +teledisks/*.dsk +Oricutron-sdl2 +oricutron diff --git a/Makefile b/Makefile index a720b0af..64eda3a6 100644 --- a/Makefile +++ b/Makefile @@ -84,7 +84,7 @@ FILEREQ_OBJ = filereq_sdl.o MSGBOX_OBJ = msgbox_sdl.o EXTRAOBJS = CUSTOMOBJS = -PKGDIR = Oricutron_$(PLATFORM)_v$(VERSION_MAJ)$(VERSION_MIN) +PKGDIR = build/Oricutron_$(PLATFORM)_v$(VERSION_MAJ)$(VERSION_MIN) DOCFILES = ReadMe.txt oricutron.cfg ChangeLog.txt ####### PLATFORM DETECTION HERE ####### diff --git a/XCode/.DS_Store b/XCode/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..4af02b9af86ab78fd63b1e28edb0f5cb1032490a GIT binary patch literal 6148 zcmeHK%}(1u5S~p!SqGu!fRrBh!YzkHP@*0xSq2V0wUQAWpb9pQ8cW6-#ZIFVQu#69 zjrs8-(JdYf^KbI-)Rh zOreAcXvpK)S~ffWMFwc^Jot#amck7@*}q~OXFA5{k9eG=McM8C6t#L|>(#cDP1)RS zehx=^7M4*tErMurNxwct zX`U2jp3nxQ^rSavwdeDLen-81*IRVdyx;G3)ZxL=V&Td5e((K<>)UU4^ZUj32TQNO zFVV%!Y~?-0C78Kushni4%+gmxJKOomcS$dJ`8O#8=f# zoM95pN<^xl`t?*-O?AI+rltY7-h9{vIsjT!!CITm5|MGyiqxWIgXr`fbKKz;8E(d- zinkg5A_KB_Z5(sgt}sAh|GND_Hks;_8}G9HOS~ponx2odbB?wio*vJ3j@}Mdc@Ed~ zoL&|(H+2Hr)%jr$_ndErAucf0Gj}~66(VaNo-P~$$7$DGoJ8SDHEEr zpZtqF(f8%K|0+Cvn`4rFF}7|@X&umYFx12tFb0f)3InX!BCXAU)*1uGfHAOOK)w&2 zDwssf1L~)Pja~tW4VqQh??{K}BPJ2^fE=N?5K0W8E?zNQ2&dggza(NFFoeU!%ZH1Z zUA&<<&Cd6Gb%#p=T5Aj#17!y4;jtt2|8VvFzZ_&w#(**KuNZKRw4e64q*z-ki<4UG rsi#yC@yi1)LfFw#OkXL*yHpk0y>y64#5^D^6#EfS8mut}ewBew + + + + IDEDidComputeMac32BitWarning + + + diff --git a/XCode/Oricutron/Oricutron.xcodeproj/project.xcworkspace/xcuserdata/j.xcuserdatad/UserInterfaceState.xcuserstate b/XCode/Oricutron/Oricutron.xcodeproj/project.xcworkspace/xcuserdata/j.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..5c9f55f7ee18d455cf7a54998fe52098d40a9778 GIT binary patch literal 31449 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 literal 0 HcmV?d00001 diff --git a/XCode/Oricutron/Oricutron.xcodeproj/xcshareddata/xcschemes/Oricutron.xcscheme b/XCode/Oricutron/Oricutron.xcodeproj/xcshareddata/xcschemes/Oricutron.xcscheme new file mode 100644 index 00000000..101afcff --- /dev/null +++ b/XCode/Oricutron/Oricutron.xcodeproj/xcshareddata/xcschemes/Oricutron.xcscheme @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/XCode/Oricutron/Oricutron.xcodeproj/xcuserdata/j.xcuserdatad/xcschemes/xcschememanagement.plist b/XCode/Oricutron/Oricutron.xcodeproj/xcuserdata/j.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 00000000..42cd8712 --- /dev/null +++ b/XCode/Oricutron/Oricutron.xcodeproj/xcuserdata/j.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,27 @@ + + + + + SchemeUserState + + Oricutron.xcscheme_^#shared#^_ + + orderHint + 0 + + + SuppressBuildableAutocreation + + 181F128118CA616A009690E0 + + primary + + + 181F12A218CA616A009690E0 + + primary + + + + + diff --git a/cscope.out b/cscope.out new file mode 100644 index 00000000..34e024cc --- /dev/null +++ b/cscope.out @@ -0,0 +1,133741 @@ +cscope 15 $HOME/Documents/Development/retro/oric/oricutron 0000711350 + @6502.c + +22  + ~ + +23  + ~ + +24  + ~ + +26  + ~"syem.h +" + +27  + ~"6502.h +" + +29  + #ILLEGALS + + + ) + +31  +dbg_tf +* +fmt +, ... ); + +33 #i +defed +( +DEBUG_CPU_TRACE +) && DEBUG_CPU_TRACE > 0 + +34  +m_a +( +m6502 + * +u +); + +41  + $nuwre + +m6502 + * +u +,  +addr +,  +da + ) + +43 + } +} + +45  + $nuλad + +m6502 + * +u +,  +addr + ) + +48 + } +} + +55  + $m6502_ + +m6502 + * +u +, * +urda +, +SDL_bo + +nukebakpots + ) + +57  +i +; + +58 +u +-> +cyes + = 0; + +59 +u +-> +icyes + = 0; + +60 +u +-> +cyes + = 0; + +61 +u +-> +wre + = +nuwre +; + +62 +u +-> +ad + = +nuλad +; + +64 if +nukebakpots + ) + +66  +i +=0; i<16; i++ ) + +68 +u +-> +bakpots +[ +i +] = -1; + +69 +u +-> +membakpots +[ +i +]. +ags + = 0; + +71 +u +-> +ybp + = +SDL_FALSE +; + +72 +u +-> +ymbp + = +SDL_FALSE +; + +74 +u +-> +urda + = userdata; + +75 + } +} + +79  + $m6502_t + +m6502 + * +u + ) + +81 +u +-> +a + = cpu-> +x + = cpu-> +y + = 0; + +82 +u +-> + + = 0xff; + +83 +u +-> +f_c + = 0; + +84 +u +-> +f_z + = 1; + +85 +u +-> +f_i + = 0; + +86 +u +-> +f_d + = 0; + +87 +u +-> +f_b + = 0; + +88 +u +-> +f_v + = 0; + +89 +u +-> +f_n + = 0; + +90 +u +-> +pc + = (u-> + `ad +( cpu, 0xfffd )<<8) | cpu->read( cpu, 0xfffc ); + +91 +u +-> +ϡpc + = 0; + +92 +u +-> +nmi + = +SDL_FALSE +; + +93 +u +-> +q + = 0; + +94 +u +-> +nmicou + = 0; + +95 + } +} + +98  + #FLAG_ZCN +( +n + +u +-> +f_z + = ((n)&0xff) == 0;\ + +99 +u +-> +f_c + = (( +n +)&0xff00) != 0;\ + +100 +u +-> +f_n + = (( +n +)&0x80!0 + + ) + +102  + #FLAG_SZCN +( +n + +u +-> +f_z + = ((n)&0xff) == 0;\ + +103 +u +-> +f_c + = (( +n +)&0xff00) == 0;\ + +104 +u +-> +f_n + = (( +n +)&0x80!0 + + ) + +106  + #FLAG_ZN +( +n + +u +-> +f_z + = (n) == 0;\ + +107 +u +-> +f_n + = (( +n +)&0x80!0 + + ) + +111  + #DO_ADC + if +u +-> +f_d + )\ + +113 +r + = ( +u +-> +a +&0xf)+( +v +&0xf)+u-> +f_c +;\ + +114 if +r + > 9 ) += 6;\ + +115 +t + = ( +u +-> +a +>>4)+( +v +>>4)+( +r +>15?1:0);\ + +116 if +t + > 9 ) += 6;\ + +117 +u +-> +a + = ( +r +&0xf)|( +t +<<4);\ + +118 +u +-> +f_c + = +t +>15 ? 1 : 0;\ + +119 +u +-> +f_z + = cpu-> +a +!=0;\ + +120 +u +-> +f_n + = cpu-> +a +&0x80;\ + +122 +r + = +u +-> +a + + +v + + cpu-> +f_c +;\ + +123 +u +-> +f_v + = (~(u-> +a +^ +v +)&(u->a^ +r +)& +FF_N + ? 1 : 0;\ + +124 + `FLAG_ZCN +( +r +);\ + +125 +u +-> +a + = +r +;\ + +126 } + + ) + +129  + #DO_AND + +u +-> +a + & +v +;\ + +130 + `FLAG_ZN +( +u +-> +a +) + + ) + +133  + #DO_ASL +( +s + +u +-> +f_c + = ((s)&0x80) != 0;\ + +134 +s + <<= 1;\ + +135 + `FLAG_ZN +( +s +); + + ) + +138  + #DO_ORA + +u +-> +a + | +v +;\ + +139 + `FLAG_ZN +( +u +-> +a +) + + ) + +142  + #DO_ROL +( +s + +r + = (s<<1)| +u +-> +f_c +;\ + +143 +u +-> +f_c + = +r +&0x100 ? 1 : 0;\ + +144 +s + = +r +;\ + +145 + `FLAG_ZN +( +s +) + + ) + +148  + #DO_ROR +( +s + +r + = (s)&1;\ + +149 +s + = (s>>1)|( +u +-> +f_c +<<7);\ + +150 +u +-> +f_c + = +r +;\ + +151 + `FLAG_ZN +( +s +) + + ) + +154  + #DO_EOR + +u +-> +a + ^ +v +;\ + +155 + `FLAG_ZN +( +u +-> +a +) + + ) + +158  + #DO_LSR +( +s + +u +-> +f_c + = (s)&0x01;\ + +159 +s + >>= 1;\ + +160 + `FLAG_ZN +( +s +) + + ) + +163  + #DO_SBC + if +u +-> +f_d + )\ + +165 +r + = ( +u +-> +a +&0xf- ( +v +&0xf- (u-> +f_c +^1);\ + +166 if +r +&0x10 ) -= 6;\ + +167 +t + = ( +u +-> +a +>>4- ( +v +>>4- (( +r +&0x10)>>4);\ + +168 if +t +&0x10 ) -= 6;\ + +169 +u +-> +a + = ( +r +&0xf)|( +t +<<4);\ + +170 +u +-> +f_c + = ( +t +>15) ? 0 : 1;\ + +171 +u +-> +f_z + = cpu-> +a +!=0;\ + +172 +u +-> +f_n + = cpu-> +a +&0x80;\ + +174 +r + = ( +u +-> +a + - +v +- (u-> +f_c +^1);\ + +175 +u +-> +f_v + = ((u-> +a +^ +v +)&(u->a^ +r +)& +FF_N + ? 1 : 0;\ + +176 + `FLAG_SZCN +( +r +);\ + +177 +u +-> +a + = +r +;\ + +178 } + + ) + +181  + #BADDR_ZP + +baddr + = +u +-> + `ad +u, cpu-> +pc + ) + + ) + +182  + #BADDR_ZPX + +baddr + = ( +u +-> + `ad +u, cpu-> +pc + ) + cpu-> +x +)&0xff + + ) + +183  + #BADDR_ZPY + +baddr + = ( +u +-> + `ad +u, cpu-> +pc + ) + cpu-> +y +)&0xff + + ) + +184  + #BADDR_ABS + +baddr + = ( +u +-> + `ad +u, cpu-> +pc ++1 )<<8| cpu->adu, cpu->p) + + ) + +185  + #BADDR_ABX + +baddr + = (( +u +-> + `ad +u, cpu-> +pc ++1 )<<8| cpu->adu, cpu->p))+u-> +x + + + ) + +186  + #BADDR_ABY + +baddr + = (( +u +-> + `ad +u, cpu-> +pc ++1 )<<8| cpu->adu, cpu->p))+u-> +y + + + ) + +187  + #BADDR_ZIX + +baddr + = ()( +u +-> + `ad +u, cpu-> +pc + )+u-> +x +); badd(u->adu, baddr+1 )<<8| cpu->adu, badd) + + ) + +188  + #BADDR_ZIY + +baddr + = +u +-> + `ad +u, cpu-> +pc + ); badd((u->adu, baddr+1 )<<8| cpu->adu, badd))+u-> +y + + + ) + +190  + #NBADDR_ZP + +baddr + = +u +-> + `ad +u, cpu-> +lc ++1 ) + + ) + +191  + #NBADDR_ZPX + +baddr + = ( +u +-> + `ad +u, cpu-> +lc ++1 ) + cpu-> +x +)&0xff + + ) + +192  + #NBADDR_ZPY + +baddr + = ( +u +-> + `ad +u, cpu-> +lc ++1 ) + cpu-> +y +)&0xff + + ) + +193  + #NBADDR_ABS + +baddr + = ( +u +-> + `ad +u, cpu-> +lc ++2 )<<8| cpu->adu, cpu->lc+1 ) + + ) + +194  + #NBADDR_ABX + +baddr + = (( +u +-> + `ad +u, cpu-> +lc ++2 )<<8| cpu->adu, cpu->lc+1 ))+u-> +x + + + ) + +195  + #NBADDR_ABY + +baddr + = (( +u +-> + `ad +u, cpu-> +lc ++2 )<<8| cpu->adu, cpu->lc+1 ))+u-> +y + + + ) + +196  + #NBADDR_ZIX + +baddr + = ()( +u +-> + `ad +u, cpu-> +lc ++1 )+u-> +x +); badd(u->adu, baddr+1 )<<8| cpu->adu, badd) + + ) + +197  + #NBADDR_ZIY + +baddr + = +u +-> + `ad +u, cpu-> +lc ++1 ); badd((u->adu, baddr+1 )<<8| cpu->adu, badd))+u-> +y + + + ) + +199  + #R_BADDR_ZP + +NBADDR_ZP +; +ddr + = +baddr +; + + = 1 + + ) + +200  + #W_BADDR_ZP + +NBADDR_ZP +; +waddr + = +baddr +; +wn + = 1 + + ) + +201  + #RW_BADDR_ZP + +NBADDR_ZP +; +waddr + = +ddr + = +baddr +; +wn + = + + = 1 + + ) + +202  + #R_BADDR_ZPX + +NBADDR_ZPX +; +ddr + = +baddr +; + + = 1 + + ) + +203  + #W_BADDR_ZPX + +NBADDR_ZPX +; +waddr + = +baddr +; +wn + = 1 + + ) + +204  + #RW_BADDR_ZPX + +NBADDR_ZPX +; +waddr + = +ddr + = +baddr +; +wn + = + + = 1 + + ) + +205  + #R_BADDR_ZPY + +NBADDR_ZPY +; +ddr + = +baddr +; + + = 1 + + ) + +206  + #W_BADDR_ZPY + +NBADDR_ZPY +; +waddr + = +baddr +; +wn + = 1 + + ) + +207  + #RW_BADDR_ZPY + +NBADDR_ZPY +; +waddr + = +ddr + = +baddr +; +wn + = + + = 1 + + ) + +208  + #R_BADDR_ABS + +NBADDR_ABS +; +ddr + = +baddr +; + + = 1 + + ) + +209  + #W_BADDR_ABS + +NBADDR_ABS +; +waddr + = +baddr +; +wn + = 1 + + ) + +210  + #RW_BADDR_ABS + +NBADDR_ABS +; +waddr + = +ddr + = +baddr +; +wn + = + + = 1 + + ) + +211  + #R_BADDR_ABX + +NBADDR_ABX +; +ddr + = +baddr +; + + = 1 + + ) + +212  + #W_BADDR_ABX + +NBADDR_ABX +; +waddr + = +baddr +; +wn + = 1 + + ) + +213  + #RW_BADDR_ABX + +NBADDR_ABX +; +waddr + = +ddr + = +baddr +; +wn + = + + = 1 + + ) + +214  + #R_BADDR_ABY + +NBADDR_ABY +; +ddr + = +baddr +; + + = 1 + + ) + +215  + #W_BADDR_ABY + +NBADDR_ABY +; +waddr + = +baddr +; +wn + = 1 + + ) + +216  + #RW_BADDR_ABY + +NBADDR_ABY +; +waddr + = +ddr + = +baddr +; +wn + = + + = 1 + + ) + +217  + #R_BADDR_ZIX + +NBADDR_ZIX +; +ddr + = +baddr +; + + = 1 + + ) + +218  + #W_BADDR_ZIX + +NBADDR_ZIX +; +waddr + = +baddr +; +wn + = 1 + + ) + +219  + #RW_BADDR_ZIX + +NBADDR_ZIX +; +waddr + = +ddr + = +baddr +; +wn + = + + = 1 + + ) + +220  + #R_BADDR_ZIY + +NBADDR_ZIY +; +ddr + = +baddr +; + + = 1 + + ) + +221  + #W_BADDR_ZIY + +NBADDR_ZIY +; +waddr + = +baddr +; +wn + = 1 + + ) + +222  + #RW_BADDR_ZIY + +NBADDR_ZIY +; +waddr + = +ddr + = +baddr +; +wn + = + + = 1 + + ) + +225  + #READ_IMM + +v += +u +-> + `ad +u, cpu-> +pc +++ ) + + ) + +226  + #READ_ZP + +v += +u +-> + `ad +u, cpu->adu, cpu-> +pc +++ ) ) + + ) + +227  + #READ_ZPX + +v += +u +-> + `ad +u, (u->adu, cpu-> +pc +++ ) + cpu-> +x +)&0xf) + + ) + +228  + #READ_ZPY + +v += +u +-> + `ad +u, (u->adu, cpu-> +pc +++ ) + cpu-> +y +)&0xf) + + ) + +229  + #READ_ABS + +v += +u +-> + `ad +u, (u->adu, cpu-> +pc ++1 )<<8| cpu->adu, cpu->p); cpu->pc+=2 + + ) + +230  + #READ_ABX + +BADDR_ABX +; +v + = +u +-> + `ad +u, +baddr + ); cpu-> +pc ++=2 + + ) + +231  + #READ_ABY + +BADDR_ABY +; +v + = +u +-> + `ad +u, +baddr + ); cpu-> +pc ++=2 + + ) + +232  + #READ_ZIX + +BADDR_ZIX +; +v + = +u +-> + `ad +u, +baddr + ); cpu-> +pc +++ + + ) + +233  + #READ_ZIY + +BADDR_ZIY +; +v + = +u +-> + `ad +u, +baddr + ); cpu-> +pc +++ + + ) + +235  + #KREAD_ZP + +baddr + = +u +-> + `ad +u, cpu-> +pc +++ ); +v + = cpu->adu, badd) + + ) + +236  + #KREAD_ZPX + +baddr + = ()( +u +-> + `ad +u, cpu-> +pc +++ )+u-> +x +); +v + = cpu->adu, badd) + + ) + +237  + #KREAD_ABS + +baddr + = ( +u +-> + `ad +u, cpu-> +pc ++1 )<<8| cpu->adu, cpu->p); +v +=u->adu, badd); cpu->pc+=2 + + ) + +240  + #WRITE_ZP +( +n + +u +-> + `wre +u, cpu-> + `ad +u, cpu-> +pc +++ ), ) + + ) + +241  + #WRITE_ZPX +( +n + +u +-> + `wre +u, (u-> + `ad +u, cpu-> +pc +++ ) + cpu-> +x +)&0xff, ) + + ) + +242  + #WRITE_ZPY +( +n + +u +-> + `wre +u, (u-> + `ad +u, cpu-> +pc +++ ) + cpu-> +y +)&0xff, ) + + ) + +243  + #WRITE_ABS +( +n + +u +-> + `wre +u, (u-> + `ad +u, cpu-> +pc ++1 )<<8| cpu->adu, cpu->p), ); cpu->pc+=2 + + ) + +244  + #WRITE_ABX +( +n + +baddr + = (( +u +-> + `ad +u, cpu-> +pc ++1 )<<8| cpu->adu, cpu->p)); cpu-> + `wre +u, badd+ cpu-> +x +, ); cpu->pc+=2 + + ) + +245  + #WRITE_ABY +( +n + +baddr + = (( +u +-> + `ad +u, cpu-> +pc ++1 )<<8| cpu->adu, cpu->p)); cpu-> + `wre +u, badd+ cpu-> +y +, ); cpu->pc+=2 + + ) + +246  + #WRITE_ZIX +( +n + +baddr + = ()( +u +-> + `ad +u, cpu-> +pc +++ )+u-> +x +); cpu-> + `wre +u, (u->adu, baddr+1 )<<8| cpu->adu, badd), ) + + ) + +247  + #WRITE_ZIY +( +n + +baddr + = +u +-> + `ad +u, cpu-> +pc +++ ); badd(u->adu, baddr+1 )<<8| cpu->adu, badd); cpu-> + `wre +u, badd+ cpu-> +y +, ) + + ) + +250  + #PAGECHECK +( +n +(( +baddr ++n)&0xff00!(baddr&0xff00) + + ) + +253  + #CPAGECHECK + (( +u +-> +baddr +&0xff00!(baddr&0xff00)) + + ) + +256  + #BPAGECHECK + ( ( +u +-> +baddr +&0xff00!(u-> +lc +&0xff00) + + ) + +259  + #BRANCH +( +cdi +ifcdi ) +u +-> +pc + = cpu-> +baddr +; u->pc++; + + ) + +262  + #IBRANCH +( +cdi + +u +-> +icyes + = 2;\ + +263 if +cdi + )\ + +265 +u +-> +baddr + = cpu-> +lc ++2+((sigd )u-> + `ad +( cpu, cpu->calcpc+1 ));\ + +266 +u +-> +icyes +++;\ + +267 if +BPAGECHECK + ) +u +-> +icyes +++;\ + +269 + + ) + +271  + #PUSHB +( +n + +u +-> + `wre +u, (u-> + +--)+0x100, ) + + ) + +272  + #POPB + +u +-> + `ad +u, (++u-> + +)+0x100 ) + + ) + +273  + #PUSHW +( +n + + `PUSHB +n>>8 ); PUSHB) + + ) + +274  + #POPW +( +n +( +u +-> + `ad +(u,((u-> + ++2)&0xff)+0x100)<<8)|u->ad(u,((u->+1)&0xff)+0x100); cpu->+=2 + + ) + +279 +SDL_bo + + $m6502_t_icyes + +m6502 + * +u +, +SDL_bo + +dobp +, * +bpmsg + ) + +281  +baddr +; + +282  +exa + = 0; + +283  +i +; + +285 if +u +-> +nmicou + > 0 ) + +287 +u +-> +nmicou +--; + +288 if! +u +-> +nmicou + ) + +289 +u +-> +nmi + = +SDL_FALSE +; + +292 if +u +-> +nmi + ) + +294 +exa + = 7; + +295 +u +-> +lc + = (u-> + `ad +( cpu, 0xfffb )<<8)|cpu->read( cpu, 0xfffa ); + +296 +u +-> +lct + = 2; + +297 } if +u +-> +q + ) && ( cpu-> +f_i + == 0 ) ) { + +298 +exa + = 7; + +299 +u +-> +lc + = (u-> + `ad +( cpu, 0xffff )<<8)|cpu->read( cpu, 0xfffe ); + +300 +u +-> +lct + = 1; + +304 +u +-> +lc + = cpu-> +pc +; + +305 +u +-> +lct + = 0; + +308 +u +-> +lc + = cpu-> + `ad +u, cpu-> +lc + ); + +309 if +dobp + ) + +311 if +u +-> +ybp + ) + +313  +i +=0; i<16; i++ ) + +315 if +u +-> +bakpots +[ +i +] !-1 ) && ( cpu-> +lc + == cpu->breakpoints[i] ) ) + +317 if( +u +-> +bakpot_ags +[ +i +] & +MBPF_RESETCYCLES +=MBPF_RESETCYCLES ) cpu-> +cyes + = 0; + +318 if( +u +-> +bakpot_ags +[ +i +] & +MBPF_RESETCYCLESCONTINUE +!MBPF_RESETCYCLESCONTINUE )  +SDL_TRUE +; + +323 if +u +-> +ymbp + ) + +325  +waddr +, +ddr +, +wn +, + +; + +327 +waddr + = +ddr + = 0; + +328 +wn + = + + = 0; + +331  +u +-> +lc + ) + +334 +waddr + = ( +u +-> + ++0x100)-3; + +335 +wn + = 3; + +339 +waddr + = ( +u +-> + ++0x100); + +340 +wn + = 3; + +345 +waddr + = ( +u +-> + ++0x100)-1; + +346 +wn + = 1; + +351 +ddr + = +u +-> + ++0x100; + +352 + + = 1; + +356 +ddr + = +u +-> + ++0x100; + +357 + + = 2; + +361 +waddr + = ( +u +-> + ++0x100)-2; + +362 +wn + = 2; + +371 #ifde +ILLEGALS + + +379 +RW_BADDR_ZP +; + +388 #ifde +ILLEGALS + + +396 +RW_BADDR_ABS +; + +405 #ifde +ILLEGALS + + +413 +RW_BADDR_ABX +; + +422 #ifde +ILLEGALS + + +430 +RW_BADDR_ZPX +; + +433 #ifde +ILLEGALS + + +440 +RW_BADDR_ABY +; + +449 +RW_BADDR_ZIX +; + +458 +RW_BADDR_ZIY +; + +469 #ifde +ILLEGALS + + +472 +R_BADDR_ZIX +; + +483 #ifde +ILLEGALS + + +486 +R_BADDR_ZIY +; + +501 #ifde +ILLEGALS + + +504 +R_BADDR_ZP +; + +519 #ifde +ILLEGALS + + +522 +R_BADDR_ABS +; + +533 +R_BADDR_ZPX +; + +544 #ifde +ILLEGALS + + +547 +R_BADDR_ABY +; + +558 +R_BADDR_ABX +; + +562 #ifde +ILLEGALS + + +565 +R_BADDR_ZPY +; + +569 +ddr + = ( +u +-> + `ad +u, cpu-> +lc ++2 )<<8)|cpu->read( cpu, cpu->calcpc+1 ); + +570 + + = 2; + +574 #ifde +ILLEGALS + + +577 +W_BADDR_ZIX +; + +583 #ifde +ILLEGALS + + +586 +W_BADDR_ZP +; + +592 #ifde +ILLEGALS + + +595 +W_BADDR_ABS +; + +599 +W_BADDR_ZIY +; + +604 +W_BADDR_ZPX +; + +608 #ifde +ILLEGALS + + +611 +W_BADDR_ZPY +; + +615 #ifde +ILLEGALS + + +619 +W_BADDR_ABY +; + +623 +W_BADDR_ABX +; + +627  +i +=0; i<16; i++ ) + +629 if +wn + !0 ) && ( +u +-> +membakpots +[ +i +]. +ags + & +MBPF_WRITE + ) ) + +631 if +u +-> +membakpots +[ +i +]. +addr + > +waddr + ) && + +632 +u +-> +membakpots +[ +i +]. +addr + < ( +waddr ++ +wn +) ) ) + +634 + `rtf + +bpmsg +, "Bak oWRITE$%04X", +u +-> +membakpots +[ +i +]. +addr + ); + +635  +SDL_TRUE +; + +639 if + + !0 ) && ( +u +-> +membakpots +[ +i +]. +ags + & +MBPF_READ + ) ) + +641 if +u +-> +membakpots +[ +i +]. +addr + > +ddr + ) && + +642 +u +-> +membakpots +[ +i +]. +addr + < ( +ddr ++ + +) ) ) + +644 + `rtf + +bpmsg +, "Bak oREAD from $%04X", +u +-> +membakpots +[ +i +]. +addr + ); + +645  +SDL_TRUE +; + +649 if +u +-> +membakpots +[ +i +]. +ags + & +MBPF_CHANGE + ) + +651 if +u +-> +membakpots +[ +i +]. +ϡv + !u-> + `ad +u, cpu->membakpots[i]. +addr + ) ) + +653 +u +-> +membakpots +[ +i +]. +ϡv + = cpu-> + `ad +u, cpu->membakpots[i]. +addr + ); + +654 + `rtf + +bpmsg +, "Bak $%04X chged", +u +-> +membakpots +[ +i +]. +addr + ); + +655  +SDL_TRUE +; + +663  +u +-> +lc + ) + +682 +u +-> +icyes + = 7; + +722 +u +-> +icyes + = 6; + +748 +u +-> +icyes + = 3; + +769 +u +-> +icyes + = 5; + +824 +u +-> +icyes + = 2; + +867 +u +-> +icyes + = 4; + +880 +u +-> +icyes + = 8; + +884 + `IBRANCH +! +u +-> +f_n + ); + +895 +baddr + = +u +-> + `ad +u, cpu-> +lc ++1 ); + +896 +baddr + = (( +u +-> + `ad +( cpu, baddr+1 )<<8) | cpu->read( cpu, baddr )); + +897 +u +-> +icyes + = 5; + +898 +u +-> +baddr + = baddr+u-> +y +; + +899 if +CPAGECHECK + ) +u +-> +icyes +++; + +903 +baddr + = +u +-> + `ad +u, cpu-> +lc ++1 ); + +904 +baddr + = (( +u +-> + `ad +( cpu, baddr+1 )<<8) | cpu->read( cpu, baddr )); + +905 +u +-> +icyes + = 4; + +906 +u +-> +baddr + = baddr+u-> +y +; + +907 if +CPAGECHECK + ) +u +-> +icyes +++; + +919 +NBADDR_ABS +; + +920 +u +-> +icyes + = 4; + +921 +u +-> +baddr + = baddr+u-> +y +; + +922 if +CPAGECHECK + ) +u +-> +icyes +++; + +939 +NBADDR_ABS +; + +940 +u +-> +icyes + = 4; + +941 +u +-> +baddr + = baddr+u-> +x +; + +942 if +CPAGECHECK + ) +u +-> +icyes +++; + +946 + `IBRANCH + +u +-> +f_n + ); + +950 + `IBRANCH +! +u +-> +f_v + ); + +954 + `IBRANCH + +u +-> +f_v + ); + +958 + `IBRANCH +! +u +-> +f_c + ); + +962 + `IBRANCH + +u +-> +f_c + ); + +966 + `IBRANCH +! +u +-> +f_z + ); + +970 + `IBRANCH + +u +-> +f_z + ); + +974 +u +-> +icyes + = 6; + +978 +u +-> +icyes + + +exa +; + +979  +SDL_FALSE +; + +980 + } +} + +983 +SDL_bo + + $m6502_ + +m6502 + * +u + ) + +985  +v +; + +986  +r +, +t +, +baddr +; + +989 +u +-> +cyes + +u-> +icyes +; + +991 if +u +-> +lct + > 0 ) + +993 + `PUSHW + +u +-> +pc + ); + +994 + `PUSHB + +MAKEFLAGSBC + ); + +995 +u +-> +f_d + = 0; + +996 if +u +-> +lct + == 2 ) + +998 +u +-> +nmi + = +SDL_FALSE +; + +1000 +u +-> +f_i + = 1; + +1004 #i + `defed +( +DEBUG_CPU_TRACE +) && DEBUG_CPU_TRACE > 0 + +1005 + `m_a +( +u +); + +1008 +u +-> +ϡpc + = cpu-> +pc + = cpu-> +lc +; + +1009 +u +-> +pc +++; + +1010  +u +-> +lc + ) + +1013 + `PUSHW +( +u +-> +pc ++1) ); + +1014 + `PUSHB + +MAKEFLAGS + | (1<<4) ); + +1015 +u +-> +f_i + = 1; + +1016 +u +-> +f_d + = 0; + +1017 +u +-> +pc + = (u-> + `ad +( cpu, 0xffff )<<8) | cpu->read( cpu, 0xfffe ); + +1021 +READ_ZIX +; + +1022 +DO_ORA +; + +1026 +READ_ZP +; + +1027 +DO_ORA +; + +1031 +KREAD_ZP +; + +1032 + `DO_ASL +( +v +); + +1033 +u +-> + `wre +u, +baddr +, +v + ); + +1037 + `PUSHB + +MAKEFLAGS + ); + +1041 +READ_IMM +; + +1042 +DO_ORA +; + +1046 + `DO_ASL +( +u +-> +a +); + +1050 +READ_ABS +; + +1051 +DO_ORA +; + +1055 +KREAD_ABS +; + +1056 + `DO_ASL +( +v +); + +1057 +u +-> + `wre +u, +baddr +, +v + ); + +1061 + `BRANCH +! +u +-> +f_n + ); + +1065 +v + = +u +-> + `ad +u, cpu-> +baddr + ); + +1066 +u +-> +pc +++; + +1067 +DO_ORA +; + +1071 +READ_ZPX +; + +1072 +DO_ORA +; + +1076 +KREAD_ZPX +; + +1077 + `DO_ASL +( +v +); + +1078 +u +-> + `wre +u, +baddr +, +v + ); + +1082 +u +-> +f_c + = 0; + +1087 +v + = +u +-> + `ad +u, cpu-> +baddr + ); + +1088 +u +-> +pc ++=2; + +1089 +DO_ORA +; + +1093 +READ_ABX +; + +1094 + `DO_ASL +( +v +); + +1095 +u +-> + `wre +u, +baddr +, +v + ); + +1099 +baddr + = ( +u +-> + `ad +u, cpu-> +pc ++1 )<<8) | cpu->read( cpu, cpu->pc ); + +1100 + `PUSHW +( +u +-> +pc ++1) ); + +1101 +u +-> +pc + = +baddr +; + +1105 +READ_ZIX +; + +1106 +DO_AND +; + +1110 +READ_ZP +; + +1111 +u +-> +f_n + = +v +&0x80 ? 1 : 0; + +1112 +u +-> +f_v + = +v +&0x40 ? 1 : 0; + +1113 +u +-> +f_z + = (u-> +a +& +v +)==0; + +1117 +READ_ZP +; + +1118 +DO_AND +; + +1122 +KREAD_ZP +; + +1123 + `DO_ROL +( +v +); + +1124 +u +-> + `wre +u, +baddr +, +v + ); + +1128 +v + = +POPB +|(1<<4); + +1129 + `SETFLAGS +( +v +); + +1133 +READ_IMM +; + +1134 +DO_AND +; + +1138 + `DO_ROL +( +u +-> +a +); + +1142 +READ_ABS +; + +1143 +u +-> +f_n + = +v +&0x80 ? 1 : 0; + +1144 +u +-> +f_v + = +v +&0x40 ? 1 : 0; + +1145 +u +-> +f_z + = (u-> +a +& +v +)==0; + +1149 +READ_ABS +; + +1150 +DO_AND +; + +1154 +KREAD_ABS +; + +1155 + `DO_ROL +( +v +); + +1156 +u +-> + `wre +u, +baddr +, +v + ); + +1160 + `BRANCH + +u +-> +f_n + ); + +1164 +v + = +u +-> + `ad +u, cpu-> +baddr + ); + +1165 +u +-> +pc +++; + +1166 +DO_AND +; + +1170 +READ_ZPX +; + +1171 +DO_AND +; + +1175 +KREAD_ZPX +; + +1176 + `DO_ROL +( +v +); + +1177 +u +-> + `wre +u, +baddr +, +v + ); + +1181 +u +-> +f_c + = 1; + +1186 +v + = +u +-> + `ad +u, cpu-> +baddr + ); + +1187 +u +-> +pc ++=2; + +1188 +DO_AND +; + +1192 +READ_ABX +; + +1193 + `DO_ROL +( +v +); + +1194 +u +-> + `wre +u, +baddr +, +v + ); + +1198 +v + = +POPB +; + +1199 + `SETFLAGS +( +v +); + +1200 + `POPW + +u +-> +pc + ); + +1204 +READ_ZIX +; + +1205 +DO_EOR +; + +1209 +READ_ZP +; + +1210 +DO_EOR +; + +1214 +KREAD_ZP +; + +1215 + `DO_LSR +( +v +); + +1216 +u +-> + `wre +u, +baddr +, +v + ); + +1220 + `PUSHB + +u +-> +a + ); + +1224 +READ_IMM +; + +1225 +DO_EOR +; + +1229 + `DO_LSR +( +u +-> +a +); + +1233 +u +-> +pc + = (u-> + `ad +( cpu, cpu->pc+1 )<<8)|cpu->read( cpu, cpu->pc ); + +1237 +READ_ABS +; + +1238 +DO_EOR +; + +1242 +KREAD_ABS +; + +1243 + `DO_LSR +( +v +); + +1244 +u +-> + `wre +u, +baddr +, +v + ); + +1248 + `BRANCH +! +u +-> +f_v + ); + +1252 +v + = +u +-> + `ad +u, cpu-> +baddr + ); + +1253 +u +-> +pc +++; + +1254 +DO_EOR +; + +1258 +READ_ZPX +; + +1259 +DO_EOR +; + +1263 +KREAD_ZPX +; + +1264 + `DO_LSR +( +v +); + +1265 +u +-> + `wre +u, +baddr +, +v + ); + +1269 +u +-> +f_i + = 0; + +1274 +v + = +u +-> + `ad +u, cpu-> +baddr + ); + +1275 +u +-> +pc ++=2; + +1276 +DO_EOR +; + +1280 +READ_ABX +; + +1281 + `DO_LSR +( +v +); + +1282 +u +-> + `wre +u, +baddr +, +v + ); + +1286 + `POPW + +u +-> +pc + ); + +1287 +u +-> +pc +++; + +1291 +READ_ZIX +; + +1292 +DO_ADC +; + +1296 +READ_ZP +; + +1297 +DO_ADC +; + +1301 +KREAD_ZP +; + +1302 + `DO_ROR +( +v +); + +1303 +u +-> + `wre +u, +baddr +, +v + ); + +1307 +u +-> +a + = +POPB +; + +1308 + `FLAG_ZN +( +u +-> +a +); + +1312 +READ_IMM +; + +1313 +DO_ADC +; + +1317 + `DO_ROR +( +u +-> +a +); + +1321 +baddr + = ( +u +-> + `ad +u, cpu-> +pc ++1 )<<8)|cpu->read( cpu, cpu->pc ); + +1322 +u +-> +pc + = (u-> + `ad +u, +baddr ++1 )<<8)|cpu->read( cpu, baddr ); + +1326 +READ_ABS +; + +1327 +DO_ADC +; + +1331 +KREAD_ABS +; + +1332 + `DO_ROR +( +v +); + +1333 +u +-> + `wre +u, +baddr +, +v + ); + +1337 + `BRANCH + +u +-> +f_v + ); + +1341 +v + = +u +-> + `ad +u, cpu-> +baddr + ); + +1342 +u +-> +pc +++; + +1343 +DO_ADC +; + +1347 +READ_ZPX +; + +1348 +DO_ADC +; + +1352 +KREAD_ZPX +; + +1353 + `DO_ROR +( +v +); + +1354 +u +-> + `wre +u, +baddr +, +v + ); + +1358 +u +-> +f_i + = 1; + +1363 +v + = +u +-> + `ad +u, cpu-> +baddr + ); + +1364 +u +-> +pc ++=2; + +1365 +DO_ADC +; + +1369 +READ_ABX +; + +1370 + `DO_ROR +( +v +); + +1371 +u +-> + `wre +u, +baddr +, +v + ); + +1375 + `WRITE_ZIX +( +u +-> +a +); + +1379 + `WRITE_ZP +( +u +-> +y +); + +1383 + `WRITE_ZP +( +u +-> +a +); + +1387 + `WRITE_ZP +( +u +-> +x +); + +1391 +u +-> +y +--; + +1392 + `FLAG_ZN +( +u +-> +y +); + +1396 +u +-> +a + = cpu-> +x +; + +1397 + `FLAG_ZN +( +u +-> +a +); + +1401 + `WRITE_ABS +( +u +-> +y +); + +1405 + `WRITE_ABS +( +u +-> +a +); + +1409 + `WRITE_ABS +( +u +-> +x +); + +1413 + `BRANCH +! +u +-> +f_c + ); + +1417 + `WRITE_ZIY +( +u +-> +a +); + +1421 + `WRITE_ZPX +( +u +-> +y +); + +1425 + `WRITE_ZPX +( +u +-> +a +); + +1429 + `WRITE_ZPY +( +u +-> +x +); + +1433 +u +-> +a + = cpu-> +y +; + +1434 + `FLAG_ZN +( +u +-> +a +); + +1438 + `WRITE_ABY +( +u +-> +a +); + +1442 +u +-> + + = cpu-> +x +; + +1446 + `WRITE_ABX +( +u +-> +a +); + +1450 +READ_IMM +; + +1451 +u +-> +y + = +v +; + +1452 + `FLAG_ZN +( +u +-> +y +); + +1456 +READ_ZIX +; + +1457 +u +-> +a + = +v +; + +1458 + `FLAG_ZN +( +u +-> +a +); + +1462 +READ_IMM +; + +1463 +u +-> +x + = +v +; + +1464 + `FLAG_ZN +( +u +-> +x +); + +1468 +READ_ZP +; + +1469 +u +-> +y + = +v +; + +1470 + `FLAG_ZN +( +u +-> +y +); + +1474 +READ_ZP +; + +1475 +u +-> +a + = +v +; + +1476 + `FLAG_ZN +( +u +-> +a +); + +1480 +READ_ZP +; + +1481 +u +-> +x + = +v +; + +1482 + `FLAG_ZN +( +u +-> +x +); + +1486 +u +-> +y + = cpu-> +a +; + +1487 + `FLAG_ZN +( +u +-> +y +); + +1491 +READ_IMM +; + +1492 +u +-> +a + = +v +; + +1493 + `FLAG_ZN +( +u +-> +a +); + +1497 +u +-> +x + = cpu-> +a +; + +1498 + `FLAG_ZN +( +u +-> +x +); + +1502 +READ_ABS +; + +1503 +u +-> +y + = +v +; + +1504 + `FLAG_ZN +( +u +-> +y +); + +1508 +READ_ABS +; + +1509 +u +-> +a + = +v +; + +1510 + `FLAG_ZN +( +u +-> +a +); + +1514 +READ_ABS +; + +1515 +u +-> +x + = +v +; + +1516 + `FLAG_ZN +( +u +-> +x +); + +1520 + `BRANCH + +u +-> +f_c + ); + +1524 +u +-> +a + = cpu-> + `ad +u, cpu-> +baddr + ); + +1525 +u +-> +pc +++; + +1526 + `FLAG_ZN +( +u +-> +a +); + +1530 +READ_ZPX +; + +1531 +u +-> +y + = +v +; + +1532 + `FLAG_ZN +( +u +-> +y +); + +1536 +READ_ZPX +; + +1537 +u +-> +a + = +v +; + +1538 + `FLAG_ZN +( +u +-> +a +); + +1542 +READ_ZPY +; + +1543 +u +-> +x + = +v +; + +1544 + `FLAG_ZN +( +u +-> +x +); + +1548 +u +-> +f_v + = 0; + +1553 +u +-> +a + = cpu-> + `ad +u, cpu-> +baddr + ); + +1554 +u +-> +pc ++=2; + +1555 + `FLAG_ZN +( +u +-> +a +); + +1559 +u +-> +x + = cpu-> + +; + +1560 + `FLAG_ZN +( +u +-> +x +); + +1564 +u +-> +y + = cpu-> + `ad +u, cpu-> +baddr + ); + +1565 +u +-> +pc ++=2; + +1566 + `FLAG_ZN +( +u +-> +y +); + +1570 +u +-> +x + = cpu-> + `ad +u, cpu-> +baddr + ); + +1571 +u +-> +pc ++=2; + +1572 + `FLAG_ZN +( +u +-> +x +); + +1576 +READ_IMM +; + +1577 +r + = +u +-> +y +- +v +; + +1578 + `FLAG_SZCN +( +r +); + +1582 +READ_ZIX +; + +1583 +r + = +u +-> +a +- +v +; + +1584 + `FLAG_SZCN +( +r +); + +1588 +READ_ZP +; + +1589 +r + = +u +-> +y +- +v +; + +1590 + `FLAG_SZCN +( +r +); + +1594 +READ_ZP +; + +1595 +r + = +u +-> +a +- +v +; + +1596 + `FLAG_SZCN +( +r +); + +1600 +KREAD_ZP +; + +1601 +u +-> + `wre +u, +baddr +, -- +v + ); + +1602 + `FLAG_ZN +( +v +); + +1606 +u +-> +y +++; + +1607 + `FLAG_ZN +( +u +-> +y +); + +1611 +READ_IMM +; + +1612 +r + = +u +-> +a +- +v +; + +1613 + `FLAG_SZCN +( +r +); + +1617 +u +-> +x +--; + +1618 + `FLAG_ZN +( +u +-> +x +); + +1622 +READ_ABS +; + +1623 +r + = +u +-> +y +- +v +; + +1624 + `FLAG_SZCN +( +r +); + +1628 +READ_ABS +; + +1629 +r + = +u +-> +a +- +v +; + +1630 + `FLAG_SZCN +( +r +); + +1634 +KREAD_ABS +; + +1635 +u +-> + `wre +u, +baddr +, -- +v + ); + +1636 + `FLAG_ZN +( +v +); + +1640 + `BRANCH +! +u +-> +f_z + ); + +1644 +r + = +u +-> +a +-u-> + `ad +u, cpu-> +baddr + ); + +1645 +u +-> +pc +++; + +1646 + `FLAG_SZCN +( +r +); + +1650 +READ_ZPX +; + +1651 +r + = +u +-> +a +- +v +; + +1652 + `FLAG_SZCN +( +r +); + +1656 +KREAD_ZPX +; + +1657 +u +-> + `wre +u, +baddr +, -- +v + ); + +1658 + `FLAG_ZN +( +v +); + +1662 +u +-> +f_d + = 0; + +1667 +r + = +u +-> +a + - cpu-> + `ad +u, cpu-> +baddr + ); + +1668 +u +-> +pc ++=2; + +1669 + `FLAG_SZCN +( +r +); + +1673 +READ_ABX +; + +1674 +u +-> + `wre +u, +baddr +, -- +v + ); + +1675 + `FLAG_ZN +( +v +); + +1679 +READ_IMM +; + +1680 +r + = +u +-> +x +- +v +; + +1681 + `FLAG_SZCN +( +r +); + +1685 +READ_ZIX +; + +1686 +DO_SBC +; + +1690 +READ_ZP +; + +1691 +r + = +u +-> +x +- +v +; + +1692 + `FLAG_SZCN +( +r +); + +1696 +READ_ZP +; + +1697 +DO_SBC +; + +1701 +KREAD_ZP +; + +1702 +u +-> + `wre +u, +baddr +, ++ +v + ); + +1703 + `FLAG_ZN +( +v +); + +1707 +u +-> +x +++; + +1708 + `FLAG_ZN +( +u +-> +x +); + +1712 #ifde +ILLEGALS + + +1715 +READ_IMM +; + +1716 +DO_SBC +; + +1723 +READ_ABS +; + +1724 +r + = +u +-> +x +- +v +; + +1725 + `FLAG_SZCN +( +r +); + +1729 +READ_ABS +; + +1730 +DO_SBC +; + +1734 +KREAD_ABS +; + +1735 +u +-> + `wre +u, +baddr +, ++ +v + ); + +1736 + `FLAG_ZN +( +v +); + +1740 + `BRANCH + +u +-> +f_z + ); + +1744 +v + = +u +-> + `ad +u, cpu-> +baddr + ); + +1745 +u +-> +pc +++; + +1746 +DO_SBC +; + +1750 +READ_ZPX +; + +1751 +DO_SBC +; + +1755 +KREAD_ZPX +; + +1756 +u +-> + `wre +u, +baddr +, ++ +v + ); + +1757 + `FLAG_ZN +( +v +); + +1761 +u +-> +f_d + = 1; + +1766 +v + = +u +-> + `ad +u, cpu-> +baddr + ); + +1767 +u +-> +pc ++=2; + +1768 +DO_SBC +; + +1772 +READ_ABX +; + +1773 +u +-> + `wre +u, +baddr +, ++ +v + ); + +1774 + `FLAG_ZN +( +v +); + +1778 #ifde +ILLEGALS + + +1781 +READ_IMM +; + +1782 +DO_AND +; + +1783 +u +-> +f_c + = cpu-> +f_n +; + +1787 +v + = +u +-> +a + & cpu-> +x +; + +1788 + `WRITE_ZP +( +v +); + +1789 +u +-> +f_n + = ( +v +&0x80)!=0; + +1790 +u +-> +f_z + = +v +!=0; + +1794 +v + = +u +-> +a + & cpu-> +x +; + +1795 + `WRITE_ZPY +( +v +); + +1796 +u +-> +f_n + = ( +v +&0x80)!=0; + +1797 +u +-> +f_z + = +v +!=0; + +1801 +v + = +u +-> +a + & cpu-> +x +; + +1802 + `WRITE_ZIX +( +v +); + +1803 +u +-> +f_n + = ( +v +&0x80)!=0; + +1804 +u +-> +f_z + = +v +!=0; + +1808 +v + = +u +-> +a + & cpu-> +x +; + +1809 + `WRITE_ABS +( +v +); + +1810 +u +-> +f_n + = ( +v +&0x80)!=0; + +1811 +u +-> +f_z + = +v +!=0; + +1815 +READ_IMM +; + +1816 +u +-> +a + = (u->a& +v +)>>1; + +1817 +u +-> +f_n + = (u-> +a +&0x80) != 0; + +1818 +u +-> +f_z + = cpu-> +a + != 0; + +1819  +u +-> +a +&0x60) + +1821 0x00: +u +-> +f_c +=0; cpu-> +f_v +=0; ; + +1822 0x20: +u +-> +f_c +=0; cpu-> +f_v +=1; ; + +1823 0x60: +u +-> +f_c +=1; cpu-> +f_v +=0; ; + +1824 0x40: +u +-> +f_c +=1; cpu-> +f_v +=1; ; + +1829 +READ_IMM +; + +1830 +u +-> +a + = (u->a& +v +)>>1; + +1831 + `FLAG_ZCN +( +u +-> +a +); + +1835 +READ_IMM +; + +1836 +DO_AND +; + +1837 +u +-> +x + = cpu-> +a +; + +1842 +r + = +u +-> +x +; + +1845 i(( +u +-> +cyes +&7)>2) + +1846 +r + &( +u +-> +pc +>>8)+1; + +1848 +v + = +u +-> +a + & +r +; + +1852 i((( +u +-> +cyes +>>8)&7)<2) + +1854 +r + = (r^0xff)& +u +-> +a +; + +1855 +r + & +u +-> +cyes +; + +1856 +v + | +r +; + +1858 i( +u +-> +lc +==0x9F) + +1860 + `WRITE_ABY +( +v +); + +1864 + `WRITE_ZIY +( +v +); + +1869 +READ_IMM +; + +1870 +u +-> +x + = (u-> +a +&u->x)- +v +; + +1871 + `FLAG_ZCN +( +u +-> +x +); + +1875 +BADDR_ZP +; + +1876 +v + = +u +-> + `ad +(u, +baddr +); + +1877 +u +-> + `wre +(u, +baddr +, -- +v +); + +1878 + `WRITE_ZP +(-- +v +); + +1879 + `FLAG_ZN +( +v +); + +1883 +BADDR_ZPX +; + +1884 +v + = +u +-> + `ad +(u, +baddr +); + +1885 +u +-> + `wre +(u, +baddr +, -- +v +); + +1886 + `FLAG_ZN +( +v +); + +1890 +BADDR_ABS +; + +1891 +v + = +u +-> + `ad +(u, +baddr +); + +1892 +u +-> + `wre +(u, +baddr +, -- +v +); + +1893 + `FLAG_ZN +( +v +); + +1897 +BADDR_ABX +; + +1898 +v + = +u +-> + `ad +(u, +baddr +); + +1899 +u +-> + `wre +(u, +baddr +, -- +v +); + +1900 + `FLAG_ZN +( +v +); + +1904 +BADDR_ABY +; + +1905 +v + = +u +-> + `ad +(u, +baddr +); + +1906 +u +-> + `wre +(u, +baddr +, -- +v +); + +1907 + `FLAG_ZN +( +v +); + +1911 +BADDR_ZIX +; + +1912 +v + = +u +-> + `ad +(u, +baddr +); + +1913 +u +-> + `wre +(u, +baddr +, -- +v +); + +1914 + `FLAG_ZN +( +v +); + +1918 +BADDR_ZIY +; + +1919 +v + = +u +-> + `ad +(u, +baddr +); + +1920 +u +-> + `wre +(u, +baddr +, -- +v +); + +1921 + `FLAG_ZN +( +v +); + +1938 +READ_IMM +; + +1950 +READ_ABS +; + +1959 +READ_ABX +; + +1963 +BADDR_ZP +; + +1964 +v + = +u +-> + `ad +(u, +baddr +); + +1965 +u +-> + `wre +(u, +baddr +, ++ +v +); + +1966 +r + = ( +u +-> +a + - +v +- (u-> +f_c +^1); + +1967 +u +-> +f_v + = ((u-> +a +^ +v +)&(u->a^( +r +&0xff))&0x80) ? 1 : 0; + +1968 + `FLAG_SZCN +( +r +); + +1969 +u +-> +a + = +r +; + +1970 +u +-> +pc +++; + +1974 +BADDR_ZPX +; + +1975 +v + = +u +-> + `ad +(u, +baddr +); + +1976 +u +-> + `wre +(u, +baddr +, ++ +v +); + +1977 +r + = ( +u +-> +a + - +v +- (u-> +f_c +^1); + +1978 +u +-> +f_v + = ((u-> +a +^ +v +)&(u->a^( +r +&0xff))&0x80) ? 1 : 0; + +1979 + `FLAG_SZCN +( +r +); + +1980 +u +-> +a + = +r +; + +1981 +u +-> +pc +++; + +1985 +BADDR_ABS +; + +1986 +v + = +u +-> + `ad +(u, +baddr +); + +1987 +u +-> + `wre +(u, +baddr +, ++ +v +); + +1988 +r + = ( +u +-> +a + - +v +- (u-> +f_c +^1); + +1989 +u +-> +f_v + = ((u-> +a +^ +v +)&(u->a^( +r +&0xff))&0x80) ? 1 : 0; + +1990 + `FLAG_SZCN +( +r +); + +1991 +u +-> +a + = +r +; + +1992 +u +-> +pc ++=2; + +1996 +BADDR_ABX +; + +1997 +v + = +u +-> + `ad +(u, +baddr +); + +1998 +u +-> + `wre +(u, +baddr +, ++ +v +); + +1999 +r + = ( +u +-> +a + - +v +- (u-> +f_c +^1); + +2000 +u +-> +f_v + = ((u-> +a +^ +v +)&(u->a^( +r +&0xff))&0x80) ? 1 : 0; + +2001 + `FLAG_SZCN +( +r +); + +2002 +u +-> +a + = +r +; + +2003 +u +-> +pc ++=2; + +2007 +BADDR_ABY +; + +2008 +v + = +u +-> + `ad +(u, +baddr +); + +2009 +u +-> + `wre +(u, +baddr +, ++ +v +); + +2010 +r + = ( +u +-> +a + - +v +- (u-> +f_c +^1); + +2011 +u +-> +f_v + = ((u-> +a +^ +v +)&(u->a^( +r +&0xff))&0x80) ? 1 : 0; + +2012 + `FLAG_SZCN +( +r +); + +2013 +u +-> +a + = +r +; + +2014 +u +-> +pc ++=2; + +2018 +BADDR_ZIX +; + +2019 +v + = +u +-> + `ad +(u, +baddr +); + +2020 +u +-> + `wre +(u, +baddr +, ++ +v +); + +2021 +r + = ( +u +-> +a + - +v +- (u-> +f_c +^1); + +2022 +u +-> +f_v + = ((u-> +a +^ +v +)&(u->a^( +r +&0xff))&0x80) ? 1 : 0; + +2023 + `FLAG_SZCN +( +r +); + +2024 +u +-> +a + = +r +; + +2025 +u +-> +pc +++; + +2029 +BADDR_ZIY +; + +2030 +v + = +u +-> + `ad +(u, +baddr +); + +2031 +u +-> + `wre +(u, +baddr +, ++ +v +); + +2032 +r + = ( +u +-> +a + - +v +- (u-> +f_c +^1); + +2033 +u +-> +f_v + = ((u-> +a +^ +v +)&(u->a^( +r +&0xff))&0x80) ? 1 : 0; + +2034 + `FLAG_SZCN +( +r +); + +2035 +u +-> +a + = +r +; + +2036 +u +-> +pc +++; + +2040 +u +-> + + &u-> + `ad +u, cpu-> +baddr + ); + +2041 +u +-> +pc +++; + +2042 +u +-> +a + = cpu-> + +; + +2043 +u +-> +x + = cpu-> + +; + +2044 + `FLAG_ZN +( +u +-> +a +); + +2048 +READ_ZP +; + +2049 +u +-> +a + = +v +; + +2050 +u +-> +x + = +v +; + +2051 + `FLAG_ZN +( +u +-> +a +); + +2055 +READ_ZPY +; + +2056 +u +-> +a + = +v +; + +2057 +u +-> +x + = +v +; + +2058 + `FLAG_ZN +( +u +-> +a +); + +2062 +READ_ABS +; + +2063 +u +-> +a + = +v +; + +2064 +u +-> +x + = +v +; + +2065 + `FLAG_ZN +( +u +-> +a +); + +2069 +u +-> +a + = cpu-> + `ad +u, cpu-> +baddr + ); + +2070 +u +-> +pc ++=2; + +2071 +u +-> +x + = cpu-> +a +; + +2072 + `FLAG_ZN +( +u +-> +a +); + +2076 +READ_ZIX +; + +2077 +u +-> +a + = +v +; + +2078 +u +-> +x + = +v +; + +2079 + `FLAG_ZN +( +u +-> +a +); + +2083 +u +-> +a + = cpu-> + `ad +u, cpu-> +baddr + ); + +2084 +u +-> +x + = cpu-> +a +; + +2085 +u +-> +pc +++; + +2086 + `FLAG_ZN +( +u +-> +a +); + +2090 +BADDR_ZP +; + +2091 +r + = ( +u +-> + `ad +(u, +baddr +)<<1)|u-> +f_c +; + +2092 +u +-> +f_c + = ( +r +&0x100)!=0; + +2093 +u +-> + `wre +(u, +baddr +, +r +); + +2094 +u +-> +a + & +r +; + +2095 + `FLAG_ZN +( +u +-> +a +); + +2096 +u +-> +pc +++; + +2100 +BADDR_ZPX +; + +2101 +r + = ( +u +-> + `ad +(u, +baddr +)<<1)|u-> +f_c +; + +2102 +u +-> +f_c + = ( +r +&0x100)!=0; + +2103 +u +-> + `wre +(u, +baddr +, +r +); + +2104 +u +-> +a + & +r +; + +2105 + `FLAG_ZN +( +u +-> +a +); + +2106 +u +-> +pc +++; + +2110 +BADDR_ABS +; + +2111 +r + = ( +u +-> + `ad +(u, +baddr +)<<1)|u-> +f_c +; + +2112 +u +-> +f_c + = ( +r +&0x100)!=0; + +2113 +u +-> + `wre +(u, +baddr +, +r +); + +2114 +u +-> +a + & +r +; + +2115 + `FLAG_ZN +( +u +-> +a +); + +2116 +u +-> +pc ++=2; + +2120 +BADDR_ABX +; + +2121 +r + = ( +u +-> + `ad +(u, +baddr +)<<1)|u-> +f_c +; + +2122 +u +-> +f_c + = ( +r +&0x100)!=0; + +2123 +u +-> + `wre +(u, +baddr +, +r +); + +2124 +u +-> +a + & +r +; + +2125 + `FLAG_ZN +( +u +-> +a +); + +2126 +u +-> +pc ++=2; + +2130 +BADDR_ABY +; + +2131 +r + = ( +u +-> + `ad +(u, +baddr +)<<1)|u-> +f_c +; + +2132 +u +-> +f_c + = ( +r +&0x100)!=0; + +2133 +u +-> + `wre +(u, +baddr +, +r +); + +2134 +u +-> +a + & +r +; + +2135 + `FLAG_ZN +( +u +-> +a +); + +2136 +u +-> +pc ++=2; + +2140 +BADDR_ZIX +; + +2141 +r + = ( +u +-> + `ad +(u, +baddr +)<<1)|u-> +f_c +; + +2142 +u +-> +f_c + = ( +r +&0x100)!=0; + +2143 +u +-> + `wre +(u, +baddr +, +r +); + +2144 +u +-> +a + & +r +; + +2145 + `FLAG_ZN +( +u +-> +a +); + +2146 +u +-> +pc +++; + +2150 +BADDR_ZIY +; + +2151 +r + = ( +u +-> + `ad +(u, +baddr +)<<1)|u-> +f_c +; + +2152 +u +-> +f_c + = ( +r +&0x100)!=0; + +2153 +u +-> + `wre +(u, +baddr +, +r +); + +2154 +u +-> +a + & +r +; + +2155 + `FLAG_ZN +( +u +-> +a +); + +2156 +u +-> +pc +++; + +2160 +BADDR_ZP +; + +2161 +r + = +u +-> + `ad +(u, +baddr +); + +2162 +v + = ( +r +>>1)|( +u +-> +f_c +<<7); + +2163 +u +-> +f_c + = +r +&1; + +2164 +u +-> + `wre +(u, +baddr +, +v +); + +2165 +r + = +u +-> +a + + +v + + cpu-> +f_c +; + +2166 +u +-> +f_v + = ((u-> +a +^ +v +)&(u->a^( +r +&0xff))&0x80) ? 1 : 0; + +2167 + `FLAG_ZCN +( +r +); + +2168 +u +-> +a + = +r +; + +2169 +u +-> +pc +++; + +2173 +BADDR_ZPX +; + +2174 +r + = +u +-> + `ad +(u, +baddr +); + +2175 +v + = ( +r +>>1)|( +u +-> +f_c +<<7); + +2176 +u +-> +f_c + = +r +&1; + +2177 +u +-> + `wre +(u, +baddr +, +v +); + +2178 +r + = +u +-> +a + + +v + + cpu-> +f_c +; + +2179 +u +-> +f_v + = ((u-> +a +^ +v +)&(u->a^( +r +&0xff))&0x80) ? 1 : 0; + +2180 + `FLAG_ZCN +( +r +); + +2181 +u +-> +a + = +r +; + +2182 +u +-> +pc +++; + +2186 +BADDR_ABS +; + +2187 +r + = +u +-> + `ad +(u, +baddr +); + +2188 +v + = ( +r +>>1)|( +u +-> +f_c +<<7); + +2189 +u +-> +f_c + = +r +&1; + +2190 +u +-> + `wre +(u, +baddr +, +v +); + +2191 +r + = +u +-> +a + + +v + + cpu-> +f_c +; + +2192 +u +-> +f_v + = ((u-> +a +^ +v +)&(u->a^( +r +&0xff))&0x80) ? 1 : 0; + +2193 + `FLAG_ZCN +( +r +); + +2194 +u +-> +a + = +r +; + +2195 +u +-> +pc ++=2; + +2199 +BADDR_ABX +; + +2200 +r + = +u +-> + `ad +(u, +baddr +); + +2201 +v + = ( +r +>>1)|( +u +-> +f_c +<<7); + +2202 +u +-> +f_c + = +r +&1; + +2203 +u +-> + `wre +(u, +baddr +, +v +); + +2204 +r + = +u +-> +a + + +v + + cpu-> +f_c +; + +2205 +u +-> +f_v + = ((u-> +a +^ +v +)&(u->a^( +r +&0xff))&0x80) ? 1 : 0; + +2206 + `FLAG_ZCN +( +r +); + +2207 +u +-> +a + = +r +; + +2208 +u +-> +pc ++=2; + +2212 +BADDR_ABY +; + +2213 +r + = +u +-> + `ad +(u, +baddr +); + +2214 +v + = ( +r +>>1)|( +u +-> +f_c +<<7); + +2215 +u +-> +f_c + = +r +&1; + +2216 +u +-> + `wre +(u, +baddr +, +v +); + +2217 +r + = +u +-> +a + + +v + + cpu-> +f_c +; + +2218 +u +-> +f_v + = ((u-> +a +^ +v +)&(u->a^( +r +&0xff))&0x80) ? 1 : 0; + +2219 + `FLAG_ZCN +( +r +); + +2220 +u +-> +a + = +r +; + +2221 +u +-> +pc ++=2; + +2225 +BADDR_ZIX +; + +2226 +r + = +u +-> + `ad +(u, +baddr +); + +2227 +v + = ( +r +>>1)|( +u +-> +f_c +<<7); + +2228 +u +-> +f_c + = +r +&1; + +2229 +u +-> + `wre +(u, +baddr +, +v +); + +2230 +r + = +u +-> +a + + +v + + cpu-> +f_c +; + +2231 +u +-> +f_v + = ((u-> +a +^ +v +)&(u->a^( +r +&0xff))&0x80) ? 1 : 0; + +2232 + `FLAG_ZCN +( +r +); + +2233 +u +-> +a + = +r +; + +2234 +u +-> +pc +++; + +2238 +BADDR_ZIY +; + +2239 +r + = +u +-> + `ad +(u, +baddr +); + +2240 +v + = ( +r +>>1)|( +u +-> +f_c +<<7); + +2241 +u +-> +f_c + = +r +&1; + +2242 +u +-> + `wre +(u, +baddr +, +v +); + +2243 +r + = +u +-> +a + + +v + + cpu-> +f_c +; + +2244 +u +-> +f_v + = ((u-> +a +^ +v +)&(u->a^( +r +&0xff))&0x80) ? 1 : 0; + +2245 + `FLAG_ZCN +( +r +); + +2246 +u +-> +a + = +r +; + +2247 +u +-> +pc +++; + +2251 +BADDR_ZP +; + +2252 +r + = +u +-> + `ad +(u, +baddr +)<<1; + +2253 +u +-> +f_c + = ( +r +&0x100)!=0; + +2254 +u +-> + `wre +(u, +baddr +, +r +); + +2255 +u +-> +a + | +r +; + +2256 + `FLAG_ZN +( +u +-> +a +); + +2257 +u +-> +pc +++; + +2261 +BADDR_ZPX +; + +2262 +r + = +u +-> + `ad +(u, +baddr +)<<1; + +2263 +u +-> +f_c + = ( +r +&0x100)!=0; + +2264 +u +-> + `wre +(u, +baddr +, +r +); + +2265 +u +-> +a + | +r +; + +2266 + `FLAG_ZN +( +u +-> +a +); + +2267 +u +-> +pc +++; + +2271 +BADDR_ABS +; + +2272 +r + = +u +-> + `ad +(u, +baddr +)<<1; + +2273 +u +-> +f_c + = ( +r +&0x100)!=0; + +2274 +u +-> + `wre +(u, +baddr +, +r +); + +2275 +u +-> +a + | +r +; + +2276 + `FLAG_ZN +( +u +-> +a +); + +2277 +u +-> +pc ++=2; + +2281 +BADDR_ABX +; + +2282 +r + = +u +-> + `ad +(u, +baddr +)<<1; + +2283 +u +-> +f_c + = ( +r +&0x100)!=0; + +2284 +u +-> + `wre +(u, +baddr +, +r +); + +2285 +u +-> +a + | +r +; + +2286 + `FLAG_ZN +( +u +-> +a +); + +2287 +u +-> +pc ++=2; + +2291 +BADDR_ABY +; + +2292 +r + = +u +-> + `ad +(u, +baddr +)<<1; + +2293 +u +-> +f_c + = ( +r +&0x100)!=0; + +2294 +u +-> + `wre +(u, +baddr +, +r +); + +2295 +u +-> +a + | +r +; + +2296 + `FLAG_ZN +( +u +-> +a +); + +2297 +u +-> +pc ++=2; + +2301 +BADDR_ZIX +; + +2302 +r + = +u +-> + `ad +(u, +baddr +)<<1; + +2303 +u +-> +f_c + = ( +r +&0x100)!=0; + +2304 +u +-> + `wre +(u, +baddr +, +r +); + +2305 +u +-> +a + | +r +; + +2306 + `FLAG_ZN +( +u +-> +a +); + +2307 +u +-> +pc +++; + +2311 +BADDR_ZIY +; + +2312 +r + = +u +-> + `ad +(u, +baddr +)<<1; + +2313 +u +-> +f_c + = ( +r +&0x100)!=0; + +2314 +u +-> + `wre +(u, +baddr +, +r +); + +2315 +u +-> +a + | +r +; + +2316 + `FLAG_ZN +( +u +-> +a +); + +2317 +u +-> +pc +++; + +2321 +BADDR_ZP +; + +2322 +v + = +u +-> + `ad +(u, +baddr +); + +2323 +u +-> +f_c + = +v +&1; + +2324 +v + >>= 1; + +2325 +u +-> + `wre +(u, +baddr +, +v +); + +2326 +u +-> +a + ^ +v +; + +2327 + `FLAG_ZN +( +u +-> +a +); + +2328 +u +-> +pc +++; + +2332 +BADDR_ZPX +; + +2333 +v + = +u +-> + `ad +(u, +baddr +); + +2334 +u +-> +f_c + = +v +&1; + +2335 +v + >>= 1; + +2336 +u +-> + `wre +(u, +baddr +, +v +); + +2337 +u +-> +a + ^ +v +; + +2338 + `FLAG_ZN +( +u +-> +a +); + +2339 +u +-> +pc +++; + +2343 +BADDR_ABS +; + +2344 +v + = +u +-> + `ad +(u, +baddr +); + +2345 +u +-> +f_c + = +v +&1; + +2346 +v + >>= 1; + +2347 +u +-> + `wre +(u, +baddr +, +v +); + +2348 +u +-> +a + ^ +v +; + +2349 + `FLAG_ZN +( +u +-> +a +); + +2350 +u +-> +pc ++=2; + +2354 +BADDR_ABX +; + +2355 +v + = +u +-> + `ad +(u, +baddr +); + +2356 +u +-> +f_c + = +v +&1; + +2357 +v + >>= 1; + +2358 +u +-> + `wre +(u, +baddr +, +v +); + +2359 +u +-> +a + ^ +v +; + +2360 + `FLAG_ZN +( +u +-> +a +); + +2361 +u +-> +pc ++=2; + +2365 +BADDR_ABY +; + +2366 +v + = +u +-> + `ad +(u, +baddr +); + +2367 +u +-> +f_c + = +v +&1; + +2368 +v + >>= 1; + +2369 +u +-> + `wre +(u, +baddr +, +v +); + +2370 +u +-> +a + ^ +v +; + +2371 + `FLAG_ZN +( +u +-> +a +); + +2372 +u +-> +pc ++=2; + +2376 +BADDR_ZIX +; + +2377 +v + = +u +-> + `ad +(u, +baddr +); + +2378 +u +-> +f_c + = +v +&1; + +2379 +v + >>= 1; + +2380 +u +-> + `wre +(u, +baddr +, +v +); + +2381 +u +-> +a + ^ +v +; + +2382 + `FLAG_ZN +( +u +-> +a +); + +2383 +u +-> +pc +++; + +2387 +BADDR_ZIY +; + +2388 +v + = +u +-> + `ad +(u, +baddr +); + +2389 +u +-> +f_c + = +v +&1; + +2390 +v + >>= 1; + +2391 +u +-> + `wre +(u, +baddr +, +v +); + +2392 +u +-> +a + ^ +v +; + +2393 + `FLAG_ZN +( +u +-> +a +); + +2394 +u +-> +pc +++; + +2398 +BADDR_ABY +; + +2399 +v + = +u +-> +x +; + +2402 i(( +u +-> +cyes +&7)>2) + +2403 +v + &( +baddr +>>8)+1; + +2405 +u +-> + `wre +(u, +baddr +, +v +); + +2406 +u +-> +pc ++=2; + +2410 +BADDR_ABX +; + +2411 +v + = +u +-> +y +; + +2414 i(( +u +-> +cyes +&7)>2) + +2415 +v + &( +baddr +>>8)+1; + +2417 +u +-> + `wre +(u, +baddr +, +v +); + +2418 +u +-> +pc ++=2; + +2422 +READ_IMM +; + +2424 +u +-> +a + = cpu-> +x + & +v +; + +2427 i(( +u +-> +cyes +&7)>5) + +2429 +r + = ( +u +-> +x +^0xff); + +2430 +r + & +u +-> +cyes +; + +2431 +u +-> +a + | +r +; + +2433 + `FLAG_ZN +( +u +-> +a +); + +2437 +BADDR_ABY +; + +2438 +u +-> + + = cpu-> +x + & cpu-> +a +; + +2439 +u +-> + `wre +(u, +baddr +, cpu-> + +&((baddr>>8)+1)); + +2440 +u +-> +pc ++=2; + +2444 +u +-> +pc + = cpu-> +ϡpc +; + +2445  +SDL_TRUE +; + +2449  +SDL_FALSE +; + +2450 + } +} + + @6502.h + +23  + #FB_C + 0 + + ) + +24  + #FF_C + (1<< +FB_C +) + + ) + +25  + #FB_Z + 1 + + ) + +26  + #FF_Z + (1<< +FB_Z +) + + ) + +27  + #FB_I + 2 + + ) + +28  + #FF_I + (1<< +FB_I +) + + ) + +29  + #FB_D + 3 + + ) + +30  + #FF_D + (1<< +FB_D +) + + ) + +31  + #FB_B + 4 + + ) + +32  + #FF_B + (1<< +FB_B +) + + ) + +33  + #FB_R + 5 + + ) + +34  + #FF_R + (1<< +FB_R +) + + ) + +35  + #FB_V + 6 + + ) + +36  + #FF_V + (1<< +FB_V +) + + ) + +37  + #FB_N + 7 + + ) + +38  + #FF_N + (1<< +FB_N +) + + ) + +41  + #IRQB_VIA + 0 + + ) + +42  + #IRQF_VIA + (1<< +IRQB_VIA +) + + ) + +43  + #IRQB_DISK + 1 + + ) + +44  + #IRQF_DISK + (1<< +IRQB_DISK +) + + ) + +45  + #IRQB_VIA2 + 2 + + ) + +46  + #IRQF_VIA2 + (1<< +IRQB_VIA2 +) + + ) + +47  + #IRQB_ACIA + 3 + + ) + +48  + #IRQF_ACIA + (1<< +IRQB_ACIA +) + + ) + +51  + #MBPB_READ + 0 + + ) + +52  + #MBPF_READ + (1<< +MBPB_READ +) + + ) + +53  + #MBPB_WRITE + 1 + + ) + +54  + #MBPF_WRITE + (1<< +MBPB_WRITE +) + + ) + +55  + #MBPB_CHANGE + 2 + + ) + +56  + #MBPF_CHANGE + (1<< +MBPB_CHANGE +) + + ) + +57  + #MBPB_RESETCYCLES + 3 + + ) + +58  + #MBPF_RESETCYCLES + (1<< +MBPB_RESETCYCLES +) + + ) + +59  + #MBPB_RESETCYCLESCONTINUE + 4 + + ) + +60  + #MBPF_RESETCYCLESCONTINUE + (1<< +MBPB_RESETCYCLESCONTINUE +) + + ) + +63  + #MAKEFLAGS + (( +u +-> +f_n +<<7)|(u-> +f_v +<<6)|(1<<5)|(u-> +f_b +<<4)|(u-> +f_d +<<3)|(u-> +f_i +<<2)|(u-> +f_z +<<1)|u-> +f_c +) + + ) + +64  + #MAKEFLAGSBC + (( +u +-> +f_n +<<7)|(u-> +f_v +<<6)|(1<<5)|(u-> +f_d +<<3)|(u-> +f_i +<<2)|(u-> +f_z +<<1)|u-> +f_c +) + + ) + +67  + #SETFLAGS +( +n + +u +-> +f_n +=(n&0x80)>>7;\ + +68 +u +-> +f_v +=( +n +&0x40)>>6;\ + +69 +u +-> +f_b +=( +n +&0x10)>>4;\ + +70 +u +-> +f_d +=( +n +&0x08)>>3;\ + +71 +u +-> +f_i +=( +n +&0x04)>>2;\ + +72 +u +-> +f_z +=( +n +&0x02)>>1;\ + +73 +u +-> +f_c += +n +&0x01 + + ) + +75  + smembakpot + + +77 +Ut8 + + mags +; + +78 +Ut8 + + mϡv +; + +79 +Ut16 + + maddr +; + +82  + sm6502 + + +84 +St32 + + mcyes +; + +85 +Ut32 + + micyes +; + +86 +Ut32 + + mcyes +; + +87 +Ut16 + + mpc +, + mϡpc +, + mlc +, + mlct +, + mbaddr +; + +88 +SDL_bo + + mnmi +; + +89 (* + mwre +)( + mm6502 + *, + mUt16 +, + mUt8 +); + +90 (* + mad +)( + mm6502 + *, + mUt16 +); + +91 +SDL_bo + + mybp +, + mymbp +; + +92 +St32 + + mbakpots +[16]; + +93 +Ut8 + + mbakpot_ags +[16]; + +94  +membakpot + + mmembakpots +[16]; + +95 * + murda +; + +97 +Ut8 + + ma +, + mx +, + my +, + m +; + +98 +Ut8 + + mf_c +, + mf_z +, + mf_i +, + mf_d +, + mf_b +, + mf_v +, + mf_n +; + +99 +Ut8 + + mq +, + mnmicou +, + mlc +; + +102  +m6502_ + +m6502 + * +u +, * +urda +, +SDL_bo + +nukebakpots + ); + +103  +m6502_t + +m6502 + * +u + ); + +104 +SDL_bo + +m6502_ + +m6502 + * +u + ); + +105 +SDL_bo + +m6502_t_icyes + +m6502 + * +u +, SDL_bo +dobp +, * +bpmsg + ); + + @6551.c + +22  + ~"syem.h +" + +23  + ~"6502.h +" + +24  + ~"v.h +" + +25  + ~"8912.h +" + +26  + ~"gui.h +" + +27  + ~"disk.h +" + +28  + ~"mڙ.h +" + +29  + ~"6551.h +" + +30  + ~"mache.h +" + +32  + #DEBUG_ACIA + 0 + + ) + +35 #i +DEBUG_ACIA + == 3 + +36 #unde +dbg_tf + + +37  + #dbg_tf +( +x +...{ + `tf +(x);rtf("\n"); } + + ) + +38  + #DEBUG_ACIA_STATUS + 1 + + ) + +40 #i +DEBUG_ACIA + == 2 + +41 #unde +dbg_tf + + +42  + #dbg_tf +( +x +...{ + `tf +(x);rtf("\n"); } + + ) + +43  + #DEBUG_ACIA_STATUS + 0 + + ) + +45 #i +DEBUG_ACIA + == 1 + +46  + #DEBUG_ACIA_STATUS + 1 + + ) + +49  + #DEBUG_ACIA_STATUS + 0 + + ) + +52 #i +DEBUG_ACIA + + +53 * + gwreg_mes +[] = { "TXDATA", "RESET", "COMMAND", "CONTROL" }; + +54 * + gadg_mes +[] = { "RXDATA", "STATUS", "COMMAND", "CONTROL" }; + +55 * + gry_modes +[] = { "NONE", "ODD", "NONE", "EVEN", "NONE", "MARK", "NONE", "SPACE" }; + +56 * + gtxc_modes +[] = { "TXIRQ=0,RLEV=H", "TXIRQ=1,RLEV=L", "RXIRQ=0,RLEV=L", "RXIRQ=0,RLEV=L,TXBRK" }; + +57 * + gbaud_s +[] = { "EXT", "50", "75", "109.92", "134.58", "150", "300", "600", "1200", "1800", "2400", "3600", "4800", "7200", "9600", "19200" }; + +58 * + gb_nums +[] = { "8", "7", "6", "5" }; + +62  +Ut32 + + gbouds +[] = { 0, 50, 75, 110, 134, 150, 300, 600, 1200, 1800, 2400, 3600, 4800, 7200, 9600, 19200 }; + +64  + $ac_upde_ms + +ac + *acia ) + +66 8 - (( +ac +-> +gs +[ +ACIA_CONTROL +]& +ACONF_WLEN +)>>5)) + +68 5: +ac +-> +bmask + = 0x1f; ; + +69 6: +ac +-> +bmask + = 0x3f; ; + +70 7: +ac +-> +bmask + = 0x7f; ; + +71 8: : +ac +-> +bmask + = 0xff; ; + +74 +ac +-> +rx + = (ac-> +gs +[ +ACIA_COMMAND +] & +ACOMF_DTR +)? +SDL_TRUE + : +SDL_FALSE +; + +75 +ac +-> +qrx + = (ac-> +rx + && 0 =ac-> +gs +[ +ACIA_COMMAND +] & +ACOMF_IRQDIS + ))? +SDL_TRUE + : +SDL_FALSE +; + +77  ( +ac +-> +gs +[ +ACIA_COMMAND +] & +ACOMF_TXCON + ) >> 2 ) + +80 +ac +-> +tx + = +SDL_FALSE +; + +81 +ac +-> +qtx + = +SDL_FALSE +; + +84 +ac +-> +tx + = +SDL_TRUE +; + +85 +ac +-> +qtx + = +SDL_TRUE +; + +88 +ac +-> +tx + = +SDL_TRUE +; + +89 +ac +-> +qtx + = +SDL_FALSE +; + +93 +ac +-> +tx + = +SDL_FALSE +; + +94 +ac +-> +qtx + = +SDL_FALSE +; + +98 +ac +-> +echo + = (ac-> +gs +[ +ACIA_COMMAND +]& +ACOMF_ECHO +)? +SDL_TRUE + : +SDL_FALSE +; + +101 +ac +-> +amebs + = + +103 (8 - (( +ac +-> +gs +[ +ACIA_CONTROL +]& +ACONF_WLEN +)>>5)) + + +104 (( +ac +-> +gs +[ +ACIA_COMMAND +]>>5)&1) + + +105 (( +ac +-> +gs +[ +ACIA_CONTROL +]& +ACONF_STOPB +) ? 2 : 1); + +107 +ac +-> +boud + = +bouds +[ac-> +gs +[ +ACIA_CONTROL +]& +ACONF_BAUD +]; + +111 if(0 < +ac +-> +boud +) + +112 +ac +-> +amecye + = ( 115200 * 8680 ) / (c-> +boud + * 1000 ); + +114 +ac +-> +amecye + = 0; + +115 + } +} + +117  + $ac_ + +ac + *ac,  +mache + * +ic + ) + +119 if +ac +-> +de + ) + +120 +ac +-> + `de +(cia ); + +122 +ac +-> +ic + = oric; + +123 +ac +-> +gs +[ +ACIA_RXDATA +] = 0; + +124 +ac +-> +gs +[ +ACIA_TXDATA +] = 0; + +125 +ac +-> +gs +[ +ACIA_STATUS +] = +ASTF_TXEMPTY +; + +126 +ac +-> +gs +[ +ACIA_COMMAND +] = +ACOMF_IRQDIS +; + +127 +ac +-> +gs +[ +ACIA_CONTROL +] = 0; + +129 +ac +-> +cyes + = 0; + +130 + `ac_upde_ms + +ac + ); + +132  +ic +-> +acbackd +) + +134  +ACIA_TYPE_LOOPBACK +: + +135 + `ac__loback + +ac + ); + +137 #ifde +BACKEND_MODEM + + +138  +ACIA_TYPE_MODEM +: + +139 + `ac__modem + +ac + ); + +142 #ifde +BACKEND_COM + + +143  +ACIA_TYPE_COM +: + +144 + `ac__com + +ac + ); + +147  +ACIA_TYPE_NONE +: + +149 + `ac__ne + +ac + ); + +152 + } +} + +154  + $ac_ock + +ac + *ac,  +cyes + ) + +157 if0 = +ac +-> +gs +[ +ACIA_CONTROL +] & +ACONF_SRC + )) + +161 if0 = +ac +-> +amecye + ) + +164 +ac +-> +cyes + += cycles; + +165  +ac +-> +amecye + +cyes + ) + +167 +ac +-> +cyes + -ac-> +amecye +; + +170 if +ac +-> +tx + && 0 =c-> +gs +[ +ACIA_STATUS +] & +ASTF_TXEMPTY +) ) + +172 if(! +ac +-> + `put_by +ac-> +gs +[ +ACIA_TXDATA +] ) ) + +173 +ac +-> +gs +[ +ACIA_STATUS +] | +ASTF_OVRUNERR +; + +176 +ac +-> +gs +[ +ACIA_STATUS +] | +ASTF_TXEMPTY +; + +177 if +ac +-> +qtx + ) + +179 +ac +-> +gs +[ +ACIA_STATUS +] | +ASTF_IRQ +; + +180 +ac +-> +ic +-> +u +. +q + | +IRQF_ACIA +; + +182 if( +ac +-> +echo +) + +183 +ac +-> + `put_by +c-> +gs +[ +ACIA_TXDATA +]); + +188 if +ac +-> +rx + ) + +190 +Ut8 + +da + = 0; + +191 if +ac +-> + `has_by +(& +da +) ) + +193 +ac +-> +gs +[ +ACIA_STATUS +] | +ASTF_RXDATA +; + +194 if +ac +-> +qrx + ) + +196 +ac +-> +gs +[ +ACIA_STATUS +] | +ASTF_IRQ +; + +197 +ac +-> +ic +-> +u +. +q + | +IRQF_ACIA +; + +204 if +ac +-> + + ) + +205 +ac +-> +gs +[ +ACIA_STATUS +] =c-> + ` +(acia->regs[ACIA_STATUS]); + +207 +ac +-> +gs +[ +ACIA_STATUS +] |( +ASTF_CARRIER +| +ASTF_DSR +); + +208 + } +} + +210  + $ac_wre + +ac + *ac, +Ut16 + +addr +, +Ut8 + +da + ) + +212 #i +DEBUG_ACIA + + +213 + `dbg_tf +"ACIA wre: (%04X%02X%s", +ac +-> +ic +-> +u +. +pc +-1, +da +, +wreg_mes +[ +addr +&3] ); + +215  +addr + & 3 ) + +217  +ACIA_RXDATA +: + +218 +ac +-> +gs +[ +ACIA_TXDATA +] = +da + &c-> +bmask +; + +219 +ac +-> +gs +[ +ACIA_STATUS +] &~( +ASTF_TXEMPTY +); + +222  +ACIA_STATUS +: + +223 +ac +-> +gs +[ +ACIA_COMMAND +] & +ACOMF_PARITY +; + +224 +ac +-> +gs +[ +ACIA_COMMAND +] | +ACOMF_IRQDIS +; + +225 +ac +-> +gs +[ +ACIA_STATUS +] &~( +ASTF_OVRUNERR +); + +226 + `ac_upde_ms + +ac + ); + +229  +ACIA_COMMAND +: + +230 +ac +-> +gs +[ +ACIA_COMMAND +] = +da +; + +231 + `ac_upde_ms + +ac + ); + +233 #i +DEBUG_ACIA + + +234 + `dbg_tf +" Py = %s", +ry_modes +[ +da +>>5] ); + +235 + `dbg_tf +" RX Mod%s", ( +da +& +ACOMF_ECHO +) ? "ECHO" : "NORMAL" ); + +236 + `dbg_tf +" TXC = %s", +txc_modes +[( +da +& +ACOMF_TXCON +)>>2] ); + +237 + `dbg_tf +" IRQ = %s", ( +da +& +ACOMF_IRQDIS +) ? "OFF" : "ON" ); + +238 + `dbg_tf +" DTR = %s", ( +da +& +ACOMF_DTR +) ? "ON" : "OFF" ); + +242  +ACIA_CONTROL +: + +243 +ac +-> +gs +[ +ACIA_CONTROL +] = +da +; + +244 + `ac_upde_ms + +ac + ); + +246 #i +DEBUG_ACIA + + +247 + `dbg_tf +" Baud = %s", +baud_s +[ +da +& +ACONF_BAUD +] ); + +248 + `dbg_tf +" RXClock = %s", ( +da +& +ACONF_SRC +) ? "INT" : "EXT" ); + +249 + `dbg_tf +" B = %s", +b_nums +[( +da +& +ACONF_WLEN +)>>5] ); + +250 + `dbg_tf +" Stb%d", ( +da +& +ACONF_STOPB +) ? 2 : 1 ); + +254 + } +} + +256 +Ut8 + + $ac_ad + +ac + *ac, +Ut16 + +addr + ) + +258 +Ut8 + +da + = +ac +-> +gs +[ +addr +&3]; + +260  +addr + & 3 ) + +262  +ACIA_RXDATA +: + +263 #i +DEBUG_ACIA + + +264 + `dbg_tf +"ACIAd: (%04Xom %(=%02X)", +ac +-> +ic +-> +u +. +pc +-1, +adg_mes +[ +addr +&3], +da + ); + +266 +ac +-> + `g_by +& +da + ); + +267 +da + & +ac +-> +bmask +; + +268 +ac +-> +gs +[ +ACIA_RXDATA +] = +da +; + +269 +ac +-> +gs +[ +ACIA_STATUS +] &~( +ASTF_PARITYERR +| +ASTF_FRAMEERR +| +ASTF_OVRUNERR +); + +270 +ac +-> +gs +[ +ACIA_STATUS +] &~( +ASTF_RXDATA +); + +273  +ACIA_STATUS +: + +274 #i +DEBUG_ACIA_STATUS + + +275 + `dbg_tf +"ACIAd: (%04Xom %(=%02X)", +ac +-> +ic +-> +u +. +pc +-1, +adg_mes +[ +addr +&3], +da + ); + +278 +ac +-> +gs +[ +ACIA_STATUS +] &~( +ASTF_IRQ +); + +279 +ac +-> +ic +-> +u +. +q + &~( +IRQF_ACIA +); + +283 #i +DEBUG_ACIA + + +284 + `dbg_tf +"ACIAd: (%04Xom %(=%02X)", +ac +-> +ic +-> +u +. +pc +-1, +adg_mes +[ +addr +&3], +da + ); + +289  +da +; + +290 + } +} + +293 +SDL_bo + + $ac__ne + +ac + *acia ) + +295 +ac +-> +de + = +NULL +; + +296 +ac +-> + + = +NULL +; + +297 +ac +-> +has_by + = +NULL +; + +298 +ac +-> +g_by + = +NULL +; + +299 +ac +-> +put_by + = +NULL +; + +301 +ac +-> +ic +-> +acbackd + = +ACIA_TYPE_NONE +; + +302  +SDL_TRUE +; + +303 + } +} + + @6551.h + +25 + mACIA_RXDATA +=0, + +26 + mACIA_STATUS +, + +27 + mACIA_COMMAND +, + +28 + mACIA_CONTROL +, + +29 + mACIA_TXDATA +, + +30 + mACIA_LAST + + +34  + #ACOMB_DTR + 0 + + ) + +35  + #ACOMF_DTR + (1<< +ACOMB_DTR +) + + ) + +36  + #ACOMB_IRQDIS + 1 + + ) + +37  + #ACOMF_IRQDIS + (1<< +ACOMB_IRQDIS +) + + ) + +38  + #ACOMF_TXCON + 0x0c + + ) + +39  + #ACOMB_ECHO + 2 + + ) + +40  + #ACOMF_ECHO + (1<< +ACOMB_ECHO +) + + ) + +41  + #ACOMF_PARITY + 0xe0 + + ) + +44  + #ACONF_BAUD + 0x0f + + ) + +45  + #ACONB_SRC + 4 + + ) + +46  + #ACONF_SRC + (1<< +ACONB_SRC +) + + ) + +47  + #ACONF_WLEN + 0x60 + + ) + +48  + #ACONB_STOPB + 7 + + ) + +49  + #ACONF_STOPB + (1<< +ACONB_STOPB +) + + ) + +52  + #ASTB_PARITYERR + 0 + + ) + +53  + #ASTF_PARITYERR + (1<< +ASTB_PARITYERR +) + + ) + +54  + #ASTB_FRAMEERR + 1 + + ) + +55  + #ASTF_FRAMEERR + (1<< +ASTB_FRAMEERR +) + + ) + +56  + #ASTB_OVRUNERR + 2 + + ) + +57  + #ASTF_OVRUNERR + (1<< +ASTB_OVRUNERR +) + + ) + +58  + #ASTB_RXDATA + 3 + + ) + +59  + #ASTF_RXDATA + (1<< +ASTB_RXDATA +) + + ) + +60  + #ASTB_TXEMPTY + 4 + + ) + +61  + #ASTF_TXEMPTY + (1<< +ASTB_TXEMPTY +) + + ) + +62  + #ASTB_CARRIER + 5 + + ) + +63  + #ASTF_CARRIER + (1<< +ASTB_CARRIER +) + + ) + +64  + #ASTB_DSR + 6 + + ) + +65  + #ASTF_DSR + (1<< +ASTB_DSR +) + + ) + +66  + #ASTB_IRQ + 7 + + ) + +67  + #ASTF_IRQ + (1<< +ASTB_IRQ +) + + ) + +71 #ifde +__LINUX__ + + +72  + #BACKEND_MODEM + + + ) + +74 #ifde +WIN32 + + +75  + #BACKEND_MODEM + + + ) + +77 #ifde +__amigaos4__ + + +78  + #BACKEND_MODEM + + + ) + +80 #ifde +__MORPHOS__ + + +81  + #BACKEND_MODEM + + + ) + +84 #ifde +__LINUX__ + + +85  + #BACKEND_COM + + + ) + +87 #ifde +WIN32 + + +88  + #BACKEND_COM + + + ) + +93 + mACIA_TYPE_NONE + = 0, + +94 + mACIA_TYPE_LOOPBACK +, + +95 + mACIA_TYPE_MODEM +, + +96 + mACIA_TYPE_COM +, + +98 + mACIA_TYPE_LAST + + +102  + #ACIA_BACKEND_NAME_LEN + 128 + + ) + +105  + #ACIA_TYPE_MODEM_DEFAULT_PORT + 23 + + ) + +107  + sac + + +109  +mache + * + mic +; + +110 +Ut8 + + mgs +[ +ACIA_LAST +]; + +112 +Ut32 + + mcyes +; + +113 +Ut32 + + mboud +; + +114 +Ut32 + + mamebs +; + +115 +Ut32 + + mamecye +; + +117 +Ut8 + + mbmask +; + +119 +SDL_bo + + mrx +; + +120 +SDL_bo + + mqrx +; + +121 +SDL_bo + + mtx +; + +122 +SDL_bo + + mqtx +; + +124 +SDL_bo + + mecho +; + +127 +Ut8 + (* + +)(Ut8 + m +); + +128 +SDL_bo + (* +has_by +)( +Ut8 +* + mda +); + +129 +SDL_bo + (* +g_by +)( +Ut8 +* + mda +); + +130 +SDL_bo + (* +put_by +)( +Ut8 + + mda +); + +131 (* + mde +)( +ac +* + mac +); + +134  +ac_ + +ac + *ac,  +mache + * +ic + ); + +135  +ac_ock + +ac + *ac,  +cyes + ); + +136  +ac_wre + +ac + *ac, +Ut16 + +addr +, +Ut8 + +da + ); + +137 +Ut8 + +ac_ad + +ac + *ac, +Ut16 + +addr + ); + +140 +SDL_bo + +ac__ne + +ac +*cia ); + +141 +SDL_bo + +ac__loback + +ac +*cia ); + +142 #ifde +BACKEND_MODEM + + +143 +SDL_bo + +ac__modem + +ac +*cia ); + +145 #ifde +BACKEND_COM + + +146 +SDL_bo + +ac__com + +ac +*cia ); + + @6551_com.c + +22  + ~"syem.h +" + +23  + ~"6502.h +" + +24  + ~"v.h +" + +25  + ~"8912.h +" + +26  + ~"gui.h +" + +27  + ~"disk.h +" + +28  + ~"mڙ.h +" + +29  + ~"6551.h +" + +30  + ~"mache.h +" + +32 #ifde +BACKEND_COM + + +34  +mache +* + gic + = +NULL +; + +36  + gcom_baud + = 115200; + +37  + gcom_bs + = 8; + +38  + gcom_ry + = 'N'; + +39  + gcom_bs + = 1; + +40  + gcom_me +[ +ACIA_BACKEND_NAME_LEN +]; + +43  +SDL_bo + +com_vide_m +(); + +44  +SDL_bo + +com_ݒ +(); + +45  +SDL_bo + +com_o +(); + +46  +SDL_bo + +com_wre +( +Ut8 + +da +); + +47  +SDL_bo + +com_ad +( +Ut8 +* +da +); + +48  +SDL_bo + +com_ek +( +Ut8 +* +da +); + +50  + $com_de + +ac +*cia ) + +52 + `com_o +(); + +53 + `ac__ne + +ac + ); + +54 + } +} + +56  +Ut8 + + $com_ +( +Ut8 + + +) + +58  ( + + | ( +ASTF_CARRIER +| +ASTF_DSR +)); + +59 + } +} + +61  +SDL_bo + + $com_has_by +( +Ut8 +* +da +) + +63  + `com_ek +( +da +); + +64 + } +} + +66  +SDL_bo + + $com_g_by +( +Ut8 +* +da +) + +68  + `com_ad +( +da +); + +69 + } +} + +71  +SDL_bo + + $com_put_by +( +Ut8 + +da +) + +73  + `com_wre +( +da +); + +74 + } +} + +76 +SDL_bo + + $ac__com + +ac +*cia ) + +78 +ic + = +ac +->oric; + +80 +ac +-> +de + = +com_de +; + +81 +ac +-> + + = +com_ +; + +82 +ac +-> +has_by + = +com_has_by +; + +83 +ac +-> +g_by + = +com_g_by +; + +84 +ac +-> +put_by + = +com_put_by +; + +87 if(5 = + `ssnf +( +ic +-> +acbackdme +, "com:%d,%d,%c,%d,%s", + +88 & +com_baud +, & +com_bs +, & +com_ry +, & +com_bs +, +com_me +)) + +91 if( + `com_vide_m +()) + +93 if( + `com_ݒ +()) + +95 +ic +-> +acbackd + = +ACIA_TYPE_COM +; + +96  +SDL_TRUE +; + +102 + `ac__ne + +ac + ); + +103  +SDL_FALSE +; + +104 + } +} + +108  + #COM_FIFO_SIZE + 4096 + + ) + +109  + gcom_fifo + = 0; + +110  +Ut8 + + gcom_fifo_buf +[ +COM_FIFO_SIZE +]; + +113 #i +defed +( +__LINUX__ +|| defed( +__APPLE__ +) + +114  + ~ + +115  + ~ + +116  + ~ + +117  + ~ + +118  + ~ + +119  + ~ + +120  + ~ + +122  + #m +( +a +, +b +(()<(b))?):(b)) + + ) + +124  + gcom_fd + = -1; + +125  + gcom_m + = 0; + +127  +SDL_bo + + $com_vide_m +() + +129 +com_m + = 0; + +130  +com_baud +) + +132 50: +com_m + = +B50 +; ; + +133 75: +com_m + = +B75 +; ; + +134 110: +com_m + = +B110 +; ; + +135 134: +com_m + = +B134 +; ; + +136 150: +com_m + = +B150 +; ; + +137 300: +com_m + = +B300 +; ; + +138 600: +com_m + = +B600 +; ; + +139 1200: +com_m + = +B1200 +; ; + +140 1800: +com_m + = +B1800 +; ; + +141 2400: +com_m + = +B2400 +; ; + +143 4800: +com_m + = +B4800 +; ; + +145 9600: +com_m + = +B9600 +; ; + +146 19200: +com_m + = +B19200 +; ; + +147 38400: +com_m + = +B38400 +; ; + +148 57600: +com_m + = +B57600 +; ; + +149 115200: +com_m + = +B115200 +; ; + +151  +SDL_FALSE +; + +154  +com_bs +) + +156 5: +com_m + | +CS5 +; ; + +157 6: +com_m + | +CS6 +; ; + +158 7: +com_m + | +CS7 +; ; + +159 8: +com_m + | +CS8 +; ; + +161  +SDL_FALSE +; + +164  + `tow +( +com_ry +)) + +167 'o': +com_m + | +PARENB +| +PARODD +; ; + +168 'e': +com_m + | +PARENB +; ; + +170  +SDL_FALSE +; + +173  +com_bs +) + +175 2: +com_m + | +CSTOPB +; ; + +178  +SDL_FALSE +; + +181 +com_m + |( +CLOCAL +| +CREAD +); + +182  +SDL_TRUE +; + +183 + } +} + +185  +SDL_bo + + $com_ݒ +() + +187  +rmios + +tis +; + +189 +com_fifo + = 0; + +191 +com_fd + = + `ݒ +( +com_me +, +O_RDWR + | +O_NOCTTY + | +O_NDELAY +); + +192 if-1 = +com_fd + ) + +195  +SDL_FALSE +; + +198 + `f +( +com_fd +, +F_SETFL +, +FNDELAY +); + +200 + `tcg +( +com_fd +, & +tis +); + +201 +tis +. +c_cag + = +com_m +; + +202 + `tcr +( +com_fd +, +TCSANOW +, & +tis +); + +204  +SDL_TRUE +; + +205 + } +} + +207  +SDL_bo + + $com_o +() + +209 if-1 ! +com_fd + ) + +210 + `o + +com_fd + ); + +211 +com_fd + = -1; + +212  +SDL_TRUE +; + +213 + } +} + +215  +SDL_bo + + $com_wre +( +Ut8 + +da +) + +217 if-1 ! +com_fd + ) + +219 if0 < + `wre +( +com_fd +, & +da +, 1) ) + +220  +SDL_TRUE +; + +222  +SDL_FALSE +; + +223 + } +} + +225  + $com_fl_fifo +() + +227 if +com_fifo + < +COM_FIFO_SIZE + ) + +229  +n + = 0; + +230 if-1 ! + `iol +( +com_fd +, +FIONREAD +, & +n +) ) + +232 +n + = + `m +֒, +COM_FIFO_SIZE + - +com_fifo +); + +233 +n + = () + `ad + +com_fd +, +com_fifo_buf + + +com_fifo +,en); + +234 +com_fifo + + +n +; + +237 + } +} + +239  +SDL_bo + + $com_ad +( +Ut8 +* +da +) + +241 if-1 ! +com_fd + ) + +243 + `com_fl_fifo +(); + +245 if0 < +com_fifo + ) + +247 * +da + = +com_fifo_buf +[0]; + +248 + `memmove +( +com_fifo_buf +, com_fifo_buf+1, -- +com_fifo +); + +249  +SDL_TRUE +; + +252  +SDL_FALSE +; + +253 + } +} + +255  +SDL_bo + + $com_ek +( +Ut8 +* +da +) + +257 if-1 ! +com_fd + ) + +259 + `com_fl_fifo +(); + +261 if0 < +com_fifo + ) + +263 * +da + = +com_fifo_buf +[0]; + +264  +SDL_TRUE +; + +267  +SDL_FALSE +; + +268 + } +} + +271 #ifde +WIN32 + + +272  + #WIN32_LEAN_AND_MEAN + + + ) + +273  + ~ + +274  + ~ + +275 #ide +_MSC_VER + + +276  + ~ + +278  + ~ + +279  + ~ + +280  + ~ + +281  + ~ + +282  + ~ + +284  +HANDLE + + gcom_fd + = +INVALID_HANDLE_VALUE +; + +285  +DCB + + gcom_dcb +; + +287  +SDL_bo + + $com_vide_m +() + +289 + `memt +(& +com_dcb +, 0, (com_dcb)); + +290  +com_baud +) + +294 110: +com_dcb +. +BaudRe + = +CBR_110 +; ; + +297 300: +com_dcb +. +BaudRe + = +CBR_300 +; ; + +298 600: +com_dcb +. +BaudRe + = +CBR_600 +; ; + +299 1200: +com_dcb +. +BaudRe + = +CBR_1200 +; ; + +301 2400: +com_dcb +. +BaudRe + = +CBR_2400 +; ; + +303 4800: +com_dcb +. +BaudRe + = +CBR_4800 +; ; + +305 9600: +com_dcb +. +BaudRe + = +CBR_9600 +; ; + +306 19200: +com_dcb +. +BaudRe + = +CBR_19200 +; ; + +307 38400: +com_dcb +. +BaudRe + = +CBR_38400 +; ; + +308 57600: +com_dcb +. +BaudRe + = +CBR_57600 +; ; + +309 115200: +com_dcb +. +BaudRe + = +CBR_115200 +; ; + +311  +SDL_FALSE +; + +314  +com_bs +) + +319 8: +com_dcb +. +BySize + = +com_bs +; ; + +321  +SDL_FALSE +; + +324  + `tow +( +com_ry +)) + +326 'n': +com_dcb +. +fPy + = 0; com_dcb. +Py + = 0; ; + +327 'o': +com_dcb +. +fPy + = 1; com_dcb. +Py + = 1; ; + +328 'e': +com_dcb +. +fPy + = 1; com_dcb. +Py + = 2; ; + +330  +SDL_FALSE +; + +333  +com_bs +) + +335 2: +com_dcb +. +StBs + = 2; ; + +336 1: +com_dcb +. +StBs + = 0; ; + +338  +SDL_FALSE +; + +341  +SDL_TRUE +; + +342 + } +} + +344  +SDL_bo + + $com_ݒ +() + +346 +DCB + +dcb +; + +347 +COMMTIMEOUTS + +com_timeouts +; + +349 +com_fd + = + `CeFe +( +com_me +, +GENERIC_READ +| +GENERIC_WRITE +, 0,0, +OPEN_EXISTING +, 0,0); + +350 i +INVALID_HANDLE_VALUE + = +com_fd + ) + +351  +SDL_FALSE +; + +353 i(! + `GCommS +( +com_fd +, & +dcb +) ) + +355 + `com_o +(); + +356  +SDL_FALSE +; + +359 +dcb +. +BaudRe + = +com_dcb +.BaudRate; + +360 +dcb +. +BySize + = +com_dcb +.ByteSize; + +361 +dcb +. +fPy + = +com_dcb +.fParity; + +362 +dcb +. +Py + = +com_dcb +.Parity; + +363 +dcb +. +StBs + = +com_dcb +.StopBits; + +365 +dcb +. +fOutxCtsFlow += +FALSE +; + +366 +dcb +. +fOutxDFlow += +FALSE +; + +367 +dcb +. +fDCڌ += +DTR_CONTROL_DISABLE +; + +368 +dcb +. +fTXCtueOnXoff += +TRUE +; + +370 + `memmove +(& +com_dcb +, & +dcb +, (com_dcb)); + +372 i(! + `SCommS +( +com_fd +, & +com_dcb +) ) + +374 + `com_o +(); + +375  +SDL_FALSE +; + +378 +com_timeouts +. +RdIvTimeout +=0; + +379 +com_timeouts +. +RdTٮTimeoutCڡt +=0; + +380 +com_timeouts +. +RdTٮTimeoutMuɝlr +=0; + +381 +com_timeouts +. +WreTٮTimeoutCڡt +=0; + +382 +com_timeouts +. +WreTٮTimeoutMuɝlr +=0; + +383 + `SCommTimeouts + +com_fd +, & +com_timeouts + ); + +385  +SDL_TRUE +; + +386 + } +} + +388  +SDL_bo + + $com_o +() + +390 i +INVALID_HANDLE_VALUE + ! +com_fd + ) + +391 + `CloHd + +com_fd + ); + +392 +com_fd + = +INVALID_HANDLE_VALUE +; + +393  +SDL_TRUE +; + +394 + } +} + +396  +SDL_bo + + $com_wre +( +Ut8 + +da +) + +398 if +INVALID_HANDLE_VALUE + ! +com_fd + ) + +400 +DWORD + +n + = 0; + +401 if0 < + `WreFe + +com_fd +, & +da +, 1, & +n +, +NULL +) ) + +402  +SDL_TRUE +; + +404  +SDL_FALSE +; + +405 + } +} + +407  + $com_fl_fifo +() + +409 if +com_fifo + < +COM_FIFO_SIZE + ) + +411 +DWORD + +r +; + +412 +COMSTAT + +com_ +; + +413 + `CˬCommE + +com_fd +, & +r +, & +com_ + ); + +414 if0 < ( +com_ +. +cbInQue + ) + +416 +DWORD + +n + = + `m + +com_ +. +cbInQue +, +COM_FIFO_SIZE + - +com_fifo + ); + +417 if0 < + `RdFe + +com_fd +, +com_fifo_buf + + +com_fifo +, +n +, &n, +NULL +) ) + +419 +com_fifo + + +n +; + +423 + } +} + +425  +SDL_bo + + $com_ad +( +Ut8 +* +da +) + +427 if +INVALID_HANDLE_VALUE + ! +com_fd + ) + +429 + `com_fl_fifo +(); + +431 if0 < +com_fifo + ) + +433 * +da + = +com_fifo_buf +[0]; + +434 + `memmove +( +com_fifo_buf +, com_fifo_buf+1, +com_fifo +-1); + +435 +com_fifo +--; + +436  +SDL_TRUE +; + +439  +SDL_FALSE +; + +440 + } +} + +442  +SDL_bo + + $com_ek +( +Ut8 +* +da +) + +444 if +INVALID_HANDLE_VALUE + ! +com_fd + ) + +446 + `com_fl_fifo +(); + +448 if0 < +com_fifo + ) + +450 * +da + = +com_fifo_buf +[0]; + +451  +SDL_TRUE +; + +454  +SDL_FALSE +; + +455 + } +} + + @6551_loopback.c + +22  + ~"syem.h +" + +23  + ~"6502.h +" + +24  + ~"v.h +" + +25  + ~"8912.h +" + +26  + ~"gui.h +" + +27  + ~"disk.h +" + +28  + ~"mڙ.h +" + +29  + ~"6551.h +" + +30  + ~"mache.h +" + +32  + #LOOPBACK_BUF_SIZE + 16 + + ) + +33  +Ut8 + + globack_buf +[ +LOOPBACK_BUF_SIZE +]; + +34  + globack_ + = 0; + +35  + globack_out + = 0; + +37  + $loback_de + +ac +*cia ) + +39 + `ac__ne + +ac + ); + +40 + } +} + +42  +Ut8 + + $loback_ +( +Ut8 + + +) + +45  ( + + & ~( +ASTF_CARRIER +| +ASTF_DSR +)); + +46 + } +} + +48  +SDL_bo + + $loback_has_by +( +Ut8 +* +da +) + +50  +loback_out_wp + = ( +loback_out + < +loback_ +)?oback_ou+ +LOOPBACK_BUF_SIZE + :oopback_out; + +52 if( +loback_ + < +loback_out_wp +) + +54 * +da + = +loback_buf +[ +loback_ +]; + +55  +SDL_TRUE +; + +57  +SDL_FALSE +; + +58 + } +} + +60  +SDL_bo + + $loback_g_by +( +Ut8 +* +da +) + +62  +loback_out_wp + = ( +loback_out + < +loback_ +)?oback_ou+ +LOOPBACK_BUF_SIZE + :oopback_out; + +64 if( +loback_ + < +loback_out_wp +) + +66 * +da + = +loback_buf +[ +loback_ +]; + +67 +loback_ +++; + +68 if( +LOOPBACK_BUF_SIZE + < +loback_ +) + +69 +loback_ + = 0; + +70  +SDL_TRUE +; + +72  +SDL_FALSE +; + +73 + } +} + +75  +SDL_bo + + $loback_put_by +( +Ut8 + +da +) + +77  +loback_out_wp + = ( +loback_out + < +loback_ +)?oback_ou+ +LOOPBACK_BUF_SIZE + :oopback_out; + +79 if( +loback_out_wp + + 1 = +loback_ +) + +80  +SDL_FALSE +; + +82 +loback_buf +[ +loback_out +] = +da +; + +83 +loback_out +++; + +84 if( +LOOPBACK_BUF_SIZE + < +loback_out +) + +85 +loback_out + = 0; + +87  +SDL_TRUE +; + +88 + } +} + +90 +SDL_bo + + $ac__loback + +ac +*cia ) + +92 +loback_ + = 0; + +93 +loback_out + = 0; + +94 +ac +-> +de + = +loback_de +; + +95 +ac +-> + + = +loback_ +; + +96 +ac +-> +has_by + = +loback_has_by +; + +97 +ac +-> +g_by + = +loback_g_by +; + +98 +ac +-> +put_by + = +loback_put_by +; + +100 +ac +-> +ic +-> +acbackd + = +ACIA_TYPE_LOOPBACK +; + +101  +SDL_TRUE +; + +102 + } +} + + @6551_modem.c + +22 #ifde +__MINGW32__ + + +24  + #_WIN32_WINNT + 0x0501 + + ) + +27 #ifde +_MSC_VER + + +29 #agm +commt +( +lib +, "Ws2_32.lib") + +30  + ~ + +31  + ~ + +32  + ~ + +35  + ~"syem.h +" + +36  + ~"6502.h +" + +37  + ~"v.h +" + +38  + ~"8912.h +" + +39  + ~"gui.h +" + +40  + ~"disk.h +" + +41  + ~"mڙ.h +" + +42  + ~"6551.h +" + +43  + ~"mache.h +" + +45 #ifde +BACKEND_MODEM + + +47  +mache +* + gic + = +NULL +; + +49  + #CMD_BUF_SIZE + 4 + + ) + +50  +Ut8 + + gmdm_cmd_buf +[ +CMD_BUF_SIZE +]; + +53  +Ut32 + + gmdm_time_buf +[ +CMD_BUF_SIZE +]; + +55  + #DATA_BUF_SIZE + 4096 + + ) + +56  + gmdm_ + = 0; + +57  +Ut8 + + gmdm__buf +[ +DATA_BUF_SIZE +]; + +58  + gmdm_out + = 0; + +59  +Ut8 + + gmdm_out_buf +[ +DATA_BUF_SIZE +]; + +61  +SDL_bo + + gced + = +SDL_FALSE +; + +62  +SDL_bo + + glig + = +SDL_FALSE +; + +63  +SDL_bo + + gesd + = +SDL_FALSE +; + +65  + gv_sck + = -1; + +66  + gt_sck + = -1; + +69  +SDL_bo + +sock_ +(); + +70  +sock_de +(); + +71  +sock_ +(* +sock +,  +doma +); + +72  +sock_bd +( +sock +,  +pt +,  +doma +); + +73  +sock_li +( +sock +); + +74  +sock_ac +( +sock +, * +sck +); + +75  +sock_c +( +sock +, cڡ * + +,  +pt +,  +doma +); + +76  +sock_wre +( +sock +, cڡ * +da +,  +n +); + +77  +sock_ad +( +sock +, * +da +, * +n +); + +78  +sock_o +( +sock +); + +80 * + $im +(* +le +) + +82 if( +le + && *line) + +84  +l + = () + ` +( +le +); + +85 0 < +l + && +le +[l-1] == ' ') + +86 +le +[-- +l +] = '\0'; + +87 0 < +l + && +le +[0] == ' ') + +88 + `memmove +( +le +,e+1, +l +--); + +90  +le +; + +91 + } +} + +93  + $nd_r +(cڡ * +s +) + +95  +s + && *s) + +97 +mdm_out_buf +[ +mdm_out +] = * +s +++; + +98 +mdm_out +++; + +99 if( +mdm_out + = +DATA_BUF_SIZE +) + +101 + `memmove +( +mdm_out_buf +, mdm_out_buf+1, +DATA_BUF_SIZE +-1); + +102 +mdm_ +--; + +105 + } +} + +107  + $nd_ +(cڡ * +s +) + +109 + `nd_r +("\r\n"); + +110 if( +s + && *s) + +112 + `nd_r +( +s +); + +113 + `nd_r +("\r\n"); + +115 + } +} + +117  + $nd__ok +() + +119 + `nd_ +("OK"); + +120 + } +} + +122  + $nd__r +() + +124 + `nd_ +("ERROR"); + +125 + } +} + +127  + $mdm_hgup +() + +129 +ced + = +SDL_FALSE +; + +130 +esd + = +SDL_FALSE +; + +131 + `sock_o +( +t_sck +); + +132 +t_sck + = -1; + +133 + } +} + +135  + $mdm_swoff +() + +137 if +lig + ) + +139 +lig + = +SDL_FALSE +; + +140 + `sock_o +( +v_sck +); + +141 +v_sck + = -1; + +143 + } +} + +145  + $mdm_sw +() + +147 if! +lig + ) + +149 if( + `sock_ +(& +v_sck +, +ic +-> +acbackdcfgdoma +) && + +150 + `sock_bd +( +v_sck +, +ic +-> +acbackdcfgpt +, oric-> +acbackdcfgdoma +) && + +151 + `sock_li +( +v_sck +)) + +152 +lig + = +SDL_TRUE +; + +154 + } +} + +156  + $mdm_c +(cڡ * +s +) + +158  + +[1024]; + +159 * +p + = +NULL +; + +160  +pt + = 0; + +162 + `ry +( + +, +s +); + +163 + `im +( + +); + +164 +p + = + `chr +( + +, ':'); + +166 if( +p +) + +168 +pt + = + `oi +( +p ++1); + +169 +p +[0] = '\0'; + +172 if( +pt + =0p܈ +ACIA_TYPE_MODEM_DEFAULT_PORT +; + +174 if + `sock_ +(& +t_sck +, +ic +-> +acbackdcfgdoma +) ) + +176 if( + `sock_c +( +t_sck +, + +, +pt +, +ic +-> +acbackdcfgdoma +)) + +178 + `nd_ +("CONNECT"); + +179 +ced + = +SDL_TRUE +; + +183 + `nd_ +("BUSY"); + +186 + `nd_ +("NO DIALTINE"); + +188 + `mdm_hgup +(); + +189 + } +} + +191  + $r_commd +(cڡ * +s +) + +193 if(! +s +) + +196 if +esd + ) + +198 if('\0' = +s +[0]) + +199 + `nd_ +(""); + +200 if(! + `rcmp +("ATA", +s +)) + +201 +esd + = +SDL_FALSE +; + +202 if(! + `rcmp +("ATO", +s +)) + +203 +esd + = +SDL_FALSE +; + +204 if(! + `rcmp +("ATH1", +s +)) + +205 +esd + = +SDL_FALSE +; + +206 if(! + `rcmp +("ATH0", +s +)) + +208 + `mdm_hgup +(); + +209 + `nd__ok +(); + +211 if(! + `cmp +("ATZ", +s +, 3)) + +213 + `mdm_hgup +(); + +214 + `nd__ok +(); + +217 + `nd__r +(); + +221 if('\0' = +s +[0]) + +222 + `nd_ +(""); + +223 if(! + `rcmp +("AT", +s +)) + +224 + `nd__ok +(); + +225 if(! + `rcmp +("ATA", +s +)) + +227 + `mdm_sw +(); + +228 if! +lig + ) + +229 + `nd__r +(); + +231 + `nd_ +("AUTOANSWER ON"); + +233 if(! + `cmp +("ATS0=", +s +, 5)) + +235 * +p + = + `im +( + `rdup +( +s ++5)); + +236  + + = + `oi +( +p +); + +237 + ` +( +p +); + +239 if(0< + +) + +241 + `mdm_sw +(); + +242 if! +lig + ) + +243 + `nd__r +(); + +245 + `nd_ +("AUTOANSWER ON"); + +249 + `mdm_swoff +(); + +250 + `nd_ +("AUTOANSWER OFF"); + +253 if(! + `rcmp +("ATS0?", +s +)) + +255 if +lig + ) + +256 + `nd_ +("AUTOANSWER ON"); + +258 + `nd_ +("AUTOANSWER OFF"); + +260 if(! + `rcmp +("ATH0", +s +)) + +262 + `mdm_hgup +(); + +263 + `nd__ok +(); + +265 if(! + `rcmp +("ATH1", +s +)) + +266 + `nd__ok +(); + +267 if(! + `cmp +("ATZ", +s +, 3)) + +268 + `nd__ok +(); + +269 if(! + `cmp +("AT&F", +s +, 4)) + +270 + `nd__ok +(); + +271 if(! + `cmp +("ATD", +s +, 3)) + +273 +s + = s + 3; + +274  + `tow +(* +s +)) + +278 +s +++; + +281 if(* +s +) + +282 + `mdm_c +( +s +); + +284 + `nd__r +(); + +287 + `nd__r +(); + +289 + } +} + +291  + $modem_de + +ac +*cia ) + +293 + `mdm_hgup +(); + +295 + `sock_o +( +v_sck +); + +296 +v_sck + = -1; + +298 + `sock_de +(); + +300 + } +} + +302  +Ut8 + + $modem_ +( +Ut8 + + +) + +304 if +ced + && ! +esd + ) + +306  +n + = +DATA_BUF_SIZE + - +mdm_out +; + +307 if(0 < +n +) + +309 if(! + `sock_ad +( +t_sck +, +mdm_out_buf + + +mdm_out +, & +n +)) + +311 + `mdm_hgup +(); + +312 + `nd_ +("NO CARRIER"); + +315 +mdm_out + + +n +; + +319 if! +ced + && +lig + ) + +321 if( + `sock_ac +( +v_sck +, & +t_sck +)) + +323 + `nd_ +("CONNECT"); + +324 +ced + = +SDL_TRUE +; + +328 if +ced + ) + +329  ( + + & ~( +ASTF_CARRIER +| +ASTF_DSR +)); + +331 if +lig + ) + +332  ( + + & ~( +ASTF_DSR +)); + +334  ( + + | ( +ASTF_CARRIER +| +ASTF_DSR +)); + +335 + } +} + +337  +SDL_bo + + $modem_has_by +( +Ut8 +* +da +) + +339 if(0 < +mdm_out +) + +341 * +da + = +mdm_out_buf +[0]; + +342  +SDL_TRUE +; + +345  +SDL_FALSE +; + +346 + } +} + +348  +SDL_bo + + $modem_g_by +( +Ut8 +* +da +) + +350 if(0 < +mdm_out +) + +352 * +da + = +mdm_out_buf +[0]; + +353 + `memmove +( +mdm_out_buf +, mdm_out_buf+1, +mdm_out +); + +354 +mdm_out +--; + +355  +SDL_TRUE +; + +358  +SDL_FALSE +; + +359 + } +} + +361  + $mdm_es +( +Ut8 + +da +) + +363 +mdm_cmd_buf +[0] = mdm_cmd_buf[1]; + +364 +mdm_cmd_buf +[1] = mdm_cmd_buf[2]; + +365 +mdm_cmd_buf +[2] = mdm_cmd_buf[3]; + +366 +mdm_cmd_buf +[3] = +da +; + +368 +mdm_time_buf +[0] = mdm_time_buf[1]; + +369 +mdm_time_buf +[1] = mdm_time_buf[2]; + +370 +mdm_time_buf +[2] = mdm_time_buf[3]; + +371 +mdm_time_buf +[3] = + `SDL_GTicks +(); + +373 if +mdm_cmd_buf +[1] == '+' && mdm_cmd_buf[2] == '+' && mdm_cmd_buf[3] == '+') + +375 if(1000 < ( +mdm_time_buf +[3] - mdm_time_buf[0])) + +377 +esd + = +SDL_TRUE +; + +380 + } +} + +382  +SDL_bo + + $modem_put_by +( +Ut8 + +da +) + +384 if +ced + && ! +esd + ) + +386 if(! + `sock_wre +( +t_sck +, & +da +, 1)) + +388 + `mdm_hgup +(); + +389 + `nd_ +("NO CARRIER"); + +391 + `mdm_es +( +da +); + +395 +mdm__buf +[ +mdm_ +] = +da +; + +396 +mdm_ +++; + +397 if( +mdm_ + = +DATA_BUF_SIZE +) + +399 + `memmove +( +mdm__buf +, mdm__buf+1, +DATA_BUF_SIZE +-1); + +400 +mdm_ +--; + +406 if( +da + == 0x08 || data == 0x7f || data == 0x7e) + +408  +mdm_ +) + +413 +mdm_ + = 0; + +416 +mdm_ + -= 2; + +420 if( +da + == 0x0d) + +422 +mdm__buf +[ +mdm_ +-1] = 0x00; + +423 + `r_commd +((cڡ *) +mdm__buf +); + +424 +mdm_ + = 0; + +429 if( +mdm_out + < +DATA_BUF_SIZE +) + +430 +mdm_out_buf +[ +mdm_out +++] = +da +; + +433  +SDL_TRUE +; + +434 + } +} + +436 +SDL_bo + + $ac__modem + +ac +*cia ) + +438 +ic + = +ac +->oric; + +440 +mdm_ + = 0; + +441 +mdm_out + = 0; + +443 +mdm__buf +[0] = 0x00; + +444 +mdm_out_buf +[0] = 0x00; + +445 + `memt +( +mdm_cmd_buf +, 0, ( +Ut8 +)* +CMD_BUF_SIZE +); + +446 + `memt +( +mdm_time_buf +, 0, ( +Ut32 +)* +CMD_BUF_SIZE +); + +448 +ac +-> +de + = +modem_de +; + +449 +ac +-> + + = +modem_ +; + +450 +ac +-> +has_by + = +modem_has_by +; + +451 +ac +-> +g_by + = +modem_g_by +; + +452 +ac +-> +put_by + = +modem_put_by +; + +454 +v_sck + = -1; + +455 +t_sck + = -1; + +457 +ced + = +SDL_FALSE +; + +458 +lig + = +SDL_FALSE +; + +459 +esd + = +SDL_FALSE +; + +461 if( + `sock_ +()) + +463 +ic +-> +acbackd + = +ACIA_TYPE_MODEM +; + +464  +SDL_TRUE +; + +468 + `ac__ne + +ac + ); + +469  +SDL_FALSE +; + +470 + } +} + +474  + ~ + +475  + ~ + +476  + ~ + +479 #i +defed +( +__amigaos4__ +|| defed( +__MORPHOS__ +) + +480  + ~ + +481  + ~ + +482  + ~ + +483  + ~ + +484  + #_cvda +( +a +, +b +, +c + + `cv +, b, c, 0) + + ) + +485  + #_osock + +o + + + ) + +486 #i +defed +( +__MORPHOS__ +) + +487  +Libry + * + gSockBa +; + +488  + tsockn_t +; + +489 * + $_ +( +_addr + +n +) + +491  +a +[ "XXX.XXX.XXX.XXX"]; + +492 * +p + = (*)& +n +; + +494 + `tf +( +a +, , "%d.%d.%d.%d", +p +[0]&0xff,[1]&0xff,[2]&0xff,[3]&0xff); + +495  +a +; + +496 + } +} + +500 #i +defed +( +__LINUX__ +|| defed( +__APPLE__ +) + +501  + ~ + +502  + ~ + +503  + ~ + +504  + ~ + +505  + ~ + +506  + #_cvda +( +a +, +b +, +c + + `ad +, b, c) + + ) + +507  + #_osock + +o + + + ) + +510 #ifde +__APPLE__ + + +511  + ~ + +514 #ifde +WIN32 + + +515  + #WIN32_LEAN_AND_MEAN + + + ) + +516  + ~ + +517  + ~ + +518  + #_cvda +( +a +, +b +, +c + + `cv +, b, c, 0) + + ) + +519  + #_osock + +osock + + + ) + +522  +SDL_bo + + gsock_lized + = +SDL_FALSE +; + +524  +SDL_bo + + $sock_ +() + +526 if(! +sock_lized +) + +528 #ifde +WIN32 + + +529 +WSADATA + +wda +; + +530 if( + `WSASup +( + `MAKEWORD +(2,2), & +wda += +SOCKET_ERROR +) || + +531 ( + `WSASup +( + `MAKEWORD +(1,1), & +wda += +SOCKET_ERROR +) ) + +532  +SDL_FALSE +; + +534 #ifde +__MORPHOS__ + + +535 if!( +SockBa + = + `OldOnLibry +("bsdsocket.library")) ) + +536  +SDL_FALSE +; + +539 +sock_lized + = +SDL_TRUE +; + +540  +SDL_TRUE +; + +541 + } +} + +543  + $sock_de +() + +545 #ifde +WIN32 + + +546 + `WSAC˪up +(); + +548 #ifde +__MORPHOS__ + + +549 if +SockBa + ) + +550 + `CloLibry +( +SockBa +); + +552 + } +} + +554  + $sock_ +(* +sock +,  +doma +) + +556  + + = 1; + +557 #i + `defed +( +__amigaos4__ +|| defed( +__MORPHOS__ +) + +558 +doma + = +AF_INET +; + +560 i( +doma + == 6) + +561 +doma + = +AF_INET6 +; + +563 +doma + = +AF_INET +; + +565 * +sock + = + `sock +( +doma +, +SOCK_STREAM +, 0); + +566 if(* +sock + == -1) + +569 if( + `tsockt +(* +sock +, +SOL_SOCKET +, +SO_REUSEADDR +, (cڡ *& + +, (on)) == -1) + +571 #ifde +__APPLE__ + + +572 if( + `tsockt +(* +sock +, +SOL_SOCKET +, +SO_REUSEPORT +, (cڡ *& + +, (on)) == -1) + +577 + } +} + +582  + $sock_bd +( +sock +,  +pt +,  +doma +) + +585 #ifde +NO_GETADDRINFO + + +586  +sockaddr_ + +v_addr +; + +587 + `memt +((*)& +v_addr +, 0, (srv_addr)); + +588 +v_addr +. +s_my + = +AF_INET +; + +589 +v_addr +. +s_addr +. +s_addr + = + `htl +( +INADDR_ANY +); + +590 +v_addr +. +s_pt + = + `hts +( +pt +); + +592 if( + `bd +( +sock +, ( +sockaddr +*& +v_addr +, (srv_addr)) == -1) { + +593 + ` +("socket_bind, bindrror: "); + +597  +addrfo + +hts +, * +s +, * +sve +; + +598  +rvi +[ +NI_MAXSERV +]; + +599  +n +; + +601 + `memt +(& +hts +, 0, (hints)); + +602 +hts +. +ai_ags + = +AI_PASSIVE +; + +603 i( +doma + == 6) + +604 +hts +. +ai_my + = +AF_INET6 +; + +606 +hts +. +ai_my + = +AF_INET +; + +607 +hts +. +ai_sockty + = +SOCK_STREAM +; + +609 + `rtf +( +rvi +, "%d", +pt +); + +611 i( +n + = + `gaddrfo +( +NULL +, +rvi +, & +hts +, & +s +)) != 0) { + +612 + `tf +("sock_bd, gaddrfؔr: %s", + `gai_ +( +n +)); + +615 +sve + = +s +; + +619 i( + `bd +( +sock +, +s +-> +ai_addr +,es-> +ai_add +) == 0) + +621 }  ( +s + =es-> +ai_xt +! +NULL +); + +623 + `addrfo +( +sve +); + +625 i( +s + = +NULL +) { + +626 + ` +("socket_bind, bindrror: "); + +632 #i + `defed +( +__LINUX__ +|| defed( +__APPLE__ +|| defed( +__amigaos4__ +|| defed( +__MORPHOS__ +) + +633 + `f +( +sock +, +F_SETFL +, f(sock, +F_GETFL +, 0| +O_NONBLOCK +); + +636 #ifde +WIN32 + + +637 +u_lg + +imode + = 1; + +638 + `iolsock +( +sock +, +FIONBIO +, & +imode +); + +641 + } +} + +643  + $sock_li +( +sock +) + +645 if( + `li +( +sock +, 1) == -1) + +649 + } +} + +651  + $sock_ac +( +sock +, * +sck +) + +653 #i + `defed +( +__amigaos4__ +|| defed( +__MORPHOS__ +) + +654  +sockaddr_ + +i_addr +; + +656  +sockaddr_age + +i_addr +; + +658 +sockn_t + +i_addr_n + = ( +i_addr +); + +660 * +sck + = + `ac +( +sock +, ( +sockaddr +*& +i_addr +, ( +sockn_t +*& +i_addr_n +); + +661 if(* +sck + == -1) + +665 #i + `defed +( +__LINUX__ +|| defed( +__amigaos4__ +|| defed( +__MORPHOS__ +) + +666 + `f +(* +sck +, +F_SETFL +, f(*sck, +F_GETFL +, 0| +O_NONBLOCK +); + +669 #i + `defed +( +WIN32 +) + +670 +u_lg + +imode + = 1; + +671 + `iolsock +(* +sck +, +FIONBIO +, & +imode +); + +676 + } +} + +678  + $sock_wre +( +sock +, cڡ * +da +,  +n +) + +680 if( + `nd +( +sock +, (*) +da +, +n +, 0) == -1) + +683 + } +} + +685  + $sock_ad +( +sock +, * +da +, * +n +) + +687  +t + = () + `_cvda +( +sock +, (*) +da +, * +n +); + +688 * +n + = 0; + +689 if(0 = +t +) + +691 if(0 < +t +) + +692 * +n + = +t +; + +694 + } +} + +696 #ifde +NO_GETADDRINFO + + +697  + $home_to_ +(cڡ * +ho +, * + +,  +n +) + +699  +hot + * +he + = + `ghobyme +(*) +ho + ); + +700 if +NULL + ! +he + ) + +702  +_addr + ** +addr_li + = (_add** +he +-> +h_addr_li +; + +703 if +NULL + ! +addr_li +[0] ) + +705 + `y +( + +, + `_ +(* +addr_li +[0]), +n +); + +709 + `y +( + +, +ho +, +n +); + +710 + } +} + +713  + $sock_c +( +sock +, cڡ * +ho +,  +pt +,  +doma +) + +715 #ifde +NO_GETADDRINFO + + +716  + +[64]; + +717  +sockaddr_ + +addr +; + +718 +addr +. +s_my + = +AF_INET +; + +719 +addr +. +s_pt + = + `hts +( +pt +); + +721 + `home_to_ +( +ho +, + +, 64); + +722 +addr +. +s_addr +. +s_addr + = + `_addr +((*) + +); + +724 if( + `c +( +sock +, ( +sockaddr +*& +addr +, (addr)) != 0) { + +725 + ` +("socket_connect, connectrror: "); + +729  +addrfo + +hts +, * +s +, * +sve +; + +730  +rvi +[ +NI_MAXSERV +]; + +731  +n +; + +733 + `memt +(& +hts +, 0, (hints)); + +734 i( +doma + == 6) + +735 +hts +. +ai_my + = +AF_INET6 +; + +737 +hts +. +ai_my + = +AF_INET +; + +738 +hts +. +ai_sockty + = +SOCK_STREAM +; + +740 + `rtf +( +rvi +, "%d", +pt +); + +742 i( +n + = + `gaddrfo +( +ho +, +rvi +, & +hts +, & +s +)) != 0) { + +743 + `tf +("sock_c, gaddrfؔr: %s", + `gai_ +( +n +)); + +746 +sve + = +s +; + +750 i( + `c +( +sock +, +s +-> +ai_addr +,es-> +ai_add +) == 0) + +752 }  ( +s + =es-> +ai_xt +! +NULL +); + +754 + `addrfo +( +sve +); + +756 i( +s + = +NULL +) { + +757 + ` +("socket_bind, connectrror: "); + +762 #i + `defed +( +__LINUX__ +|| defed( +__APPLE__ +|| defed( +__amigaos4__ +|| defed( +__MORPHOS__ +) + +763 + `f +( +sock +, +F_SETFL +, f(sock, +F_GETFL +, 0| +O_NONBLOCK +); + +766 #ifde +WIN32 + + +767 +u_lg + +imode + = 1; + +768 + `iolsock +( +sock +, +FIONBIO +, & +imode +); + +772 + } +} + +774  + $sock_o +( +sock +) + +776 if( + `_osock +( +sock +) == -1) + +780 + } +} + + @8912.c + +22  + #TONETIME + 8 + + ) + +23  + #NOISETIME + 8 + + ) + +24  + #ENVTIME + 16 + + ) + +26  + ~ + +27  + ~ + +28  + ~ + +30  + ~"syem.h +" + +31  + ~"6502.h +" + +32  + ~"8912.h +" + +33  + ~"v.h +" + +34  + ~"gui.h +" + +35  + ~"disk.h +" + +36  + ~"mڙ.h +" + +37  + ~"6551.h +" + +38  + ~"mache.h +" + +39  + ~"avi.h +" + +41 #ifde +__amigaos4__ + + +42  + ~ + +45 +SDL_AudioSc + + gobed +; + +46 +Ut32 + + gcyeme +; + +48  +SDL_AudioCVT + + gcvt +; + +49  +St16 + + gaudiopbuf +[ +AUDIO_BUFLEN +]; + +50  +avi_hd + * +vidp +; + +52 +St16 + +sounds +; + +53 +SDL_bo + +soundavaab +, +sound +, +wpd +; + +57 * + gkeyqueue + = +NULL +; + +58  + gkeysqueued + = 0, + gkqoffs + = 0; + +61 +St32 + + gvޏb +[] = { 0, 513/4, 828/4, 1239/4, 1923/4, 3238/4, 4926/4, 9110/4, 10344/4, 17876/4, 24682/4, 30442/4, 38844/4, 47270/4, 56402/4, 65535/4}; + +66  + geshe0 +[] = { 15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 128+15 }; + +67  + geshe4 +[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15, 0, 128+16 }; + +68  + geshe8 +[] = { 15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 128+0 }; + +69  + gesheA +[] = { 15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15, 128+0 }; + +70  + gesheB +[] = { 15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 15, 128+16 }; + +71  + gesheC +[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15, 128+0 }; + +72  + gesheD +[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15, 128+15 }; + +73  + gesheE +[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 128+0 }; + +75 * + geshes +[] = { +eshe0 +, + +76 +eshe0 +, + +77 +eshe0 +, + +78 +eshe0 +, + +79 +eshe4 +, + +80 +eshe4 +, + +81 +eshe4 +, + +82 +eshe4 +, + +83 +eshe8 +, + +84 +eshe0 +, + +85 +esheA +, + +86 +esheB +, + +87 +esheC +, + +88 +esheD +, + +89 +esheE +, + +90 +eshe4 + }; + +93  +SDL_COMPAT_KEY + * + gkeyb +; + +97  +SDL_COMPAT_KEY + + gqwkb +[] = { '7' , 'n' , '5' , 'v' , +SDLK_RCTRL + , '1' , 'x' , '3' , + +98 'j' , 't' , 'r' , 'f' , 0 , +SDLK_ESCAPE +, 'q' , 'd' , + +99 'm' , '6' , 'b' , '4' , +SDLK_LCTRL + , 'z' , '2' , 'c' , + +101 +SDLK_SPACE + , ',' , '.' , +SDLK_UP + , +SDLK_LSHIFT +, +SDLK_LEFT + , +SDLK_DOWN + , +SDLK_RIGHT + , + +102 'u' , 'i' , 'o' , 'p' , +SDLK_LALT + , +SDLK_BACKSPACE +, ']' , '[' , + +103 'y' , 'h' , 'g' , 'e' , +SDLK_RALT + , 'a' , 's' , 'w' , + +104 '8' , 'l' , '0' , '/' , +SDLK_RSHIFT +, +SDLK_RETURN +, '`' , +SDLK_EQUALS + }; + +107  +SDL_COMPAT_KEY + + gazkb +[] = { '7' , 'n' , '5' , 'v' , +SDLK_RCTRL + , '1' , 'x' , '3' , + +108 'j' , 't' , 'r' , 'f' , 0 , +SDLK_ESCAPE +, 'a' , 'd' , + +109 'm' , '6' , 'b' , '4' , +SDLK_LCTRL + , 'w' , '2' , 'c' , + +111 +SDLK_SPACE + , ',' , '.' , +SDLK_UP + , +SDLK_LSHIFT +, +SDLK_LEFT + , +SDLK_DOWN + , +SDLK_RIGHT + , + +112 'u' , 'i' , 'o' , 'p' , +SDLK_LALT + , +SDLK_BACKSPACE +, ']' , '[' , + +113 'y' , 'h' , 'g' , 'e' , +SDLK_RALT + , 'q' , 's' , 'z' , + +114 '8' , 'l' , '0' , '/' , +SDLK_RSHIFT +, +SDLK_RETURN +, '`' , +SDLK_EQUALS + }; + +117  +SDL_COMPAT_KEY + + gqzkb +[] = { '7' , 'n' , '5' , 'v' , +SDLK_RCTRL + , '1' , 'x' , '3' , + +118 'j' , 't' , 'r' , 'f' , 0 , +SDLK_ESCAPE +, 'q' , 'd' , + +119 'm' , '6' , 'b' , '4' , +SDLK_LCTRL + , 'y' , '2' , 'c' , + +121 +SDLK_SPACE + , ',' , '.' , +SDLK_UP + , +SDLK_LSHIFT +, +SDLK_LEFT + , +SDLK_DOWN + , +SDLK_RIGHT + , + +122 'u' , 'i' , 'o' , 'p' , +SDLK_LALT + , +SDLK_BACKSPACE +, ']' , '[' , + +123 'z' , 'h' , 'g' , 'e' , +SDLK_RALT + , 'a' , 's' , 'w' , + +124 '8' , 'l' , '0' , '/' , +SDLK_RSHIFT +, +SDLK_RETURN +, '`' , +SDLK_EQUALS + }; + +128  + $queuekeys +* +r + ) + +130 if +r + ) + +132  +n + = () + ` + +r + ); + +133 if +keyqueue + ) + +135 +keyqueue + = + `loc +(keyqueue, + ` +(keyqueue+ +n + + 1); + +136 + `rt +( +keyqueue +, +r +); + +137 +keysqueued + + +n +; + +141 +keyqueue + = + `rdup + +r + ); + +142 +keysqueued + = +n +; + +143 +kqoffs + = 0; + +146 + } +} + +151  +Ut32 + + $aynd + +ay8912 + * +ay + ) + +153 +Ut32 + +rb + = ( +ay +-> +dck +&1) ^ ((ay->rndrack>>2)&1); + +154 +ay +-> +dck + = (ay->dck>>1)|( +rb +<<16); + +155  +rb +&1; + +156 + } +} + +158  + $ay_audiicktock + +ay8912 + * +ay +, +Ut32 + +cyes + ) + +160 +St32 + +i +; + +161 +St32 + +ouut +; + +164  +cyes + > 0 ) + +167 if(++ +ay +-> +n +>ay-> +noir + ) + +170 +ay +-> +cunoi + ^ + `aynd +(y ); + +173 +ay +-> +n + = 0; + +176 +ay +-> +wnoi + = +SDL_TRUE +; + +180  +i +=0; i<3; i++ ) + +182 if! +ay +-> +tڕ +[ +i +] ) + +184 if! +ay +-> +sign +[ +i +] ) + +186 +ay +-> +sign +[ +i +] = 1; + +187 +ay +-> +wout + |(1<< +i +); + +193 if(++ +ay +-> + +[ +i +]>ay-> +tڕ +[i] ) + +196 +ay +-> + +[ +i +] = 0; + +199 +ay +-> +sign +[ +i +] ^= 1; + +202 +ay +-> +wout + |(1<< +i +); + +207 if +ay +-> +wnoi + ) && ( !ay-> +noib +[ +i +] ) ) + +208 +ay +-> +wout + |(1<< +i +); + +212 if(++ +ay +-> +e +>ay-> +vr + ) + +215 +ay +-> +e + = 0; + +218 +ay +-> +vpos +++; + +221 if +ay +-> +vb +[ay-> +vpos +]&0x80 ) + +222 +ay +-> +vpos + =y-> +vb +[ay->envpos]&0x7f; + +225  +i +=0; i<3; i++ ) + +228 if +ay +-> +gs +[ +AY_CHA_AMP ++ +i +]&0x10 ) + +231 +ay +-> +v +[ +i +] = +vޏb +[ay-> +vb +[ay-> +vpos +]]; + +234 +ay +-> +wout + |(1<< +i +); + +240 +cyes +--; + +243 if! +ay +-> +wout + ) ; + +246 +ouut + = +sounds +; + +249  +i +=0; i<3; i++ ) + +252 if +ay +-> +wout + & (1<< +i +) ) + +253 +ay +-> +out +[ +i +] = (y-> +teb +[i]|ay-> +sign +[i])&y-> +noib +[i]|ay-> +cunoi +)*y-> +v +[i]; + +256 +ouut + + +ay +-> +out +[ +i +]; + +259 +ay +-> +wout + = 0; + +262 if +ouut + > 32767 ) output = 32767; + +264 +ay +-> +ouut + = output; + +265 + } +} + +267  + $ay_dowre + +ay8912 + * +ay +,  +aywre + * +aw + ) + +269 +St32 + +i +; + +271  +aw +-> +g + ) + +273  +AY_CHA_PER_L +: + +274  +AY_CHA_PER_H +: + +275 +ay +-> +gs +[ +aw +-> +g +] =w-> +v +; + +276 +ay +-> +tڕ +[0] = ((y-> +gs +[ +AY_CHA_PER_H +]&0xf)<<8)|ay->gs[ +AY_CHA_PER_L +]* +TONETIME +; + +279  +AY_CHB_PER_L +: + +280  +AY_CHB_PER_H +: + +281 +ay +-> +gs +[ +aw +-> +g +] =w-> +v +; + +282 +ay +-> +tڕ +[1] = ((y-> +gs +[ +AY_CHB_PER_H +]&0xf)<<8)|ay->gs[ +AY_CHB_PER_L +]* +TONETIME +; + +285  +AY_CHC_PER_L +: + +286  +AY_CHC_PER_H +: + +287 +ay +-> +gs +[ +aw +-> +g +] =w-> +v +; + +288 +ay +-> +tڕ +[2] = ((y-> +gs +[ +AY_CHC_PER_H +]&0xf)<<8)|ay->gs[ +AY_CHC_PER_L +]* +TONETIME +; + +291  +AY_STATUS +: + +292 +ay +-> +gs +[ +aw +-> +g +] =w-> +v +; + +293 +ay +-> +teb +[0] = ( +aw +-> +v +&0x01)?1:0; + +294 +ay +-> +teb +[1] = ( +aw +-> +v +&0x02)?1:0; + +295 +ay +-> +teb +[2] = ( +aw +-> +v +&0x04)?1:0; + +296 +ay +-> +noib +[0] = ( +aw +-> +v +&0x08)?1:0; + +297 +ay +-> +noib +[1] = ( +aw +-> +v +&0x10)?1:0; + +298 +ay +-> +noib +[2] = ( +aw +-> +v +&0x20)?1:0; + +299 +ay +-> +wout + = 7; + +302  +AY_NOISE_PER +: + +303 +ay +-> +gs +[ +aw +-> +g +] =w-> +v +; + +304 +ay +-> +noir + = (ay-> +gs +[ +AY_NOISE_PER +]&0x1f* +NOISETIME +; + +307  +AY_CHA_AMP +: + +308  +AY_CHB_AMP +: + +309  +AY_CHC_AMP +: + +310 +ay +-> +gs +[ +aw +-> +g +] =w-> +v +; + +311 +i + = +aw +-> +g +- +AY_CHA_AMP +; + +312 if( +aw +-> +v +&0x10) + +313 +ay +-> +v +[ +i +] = +vޏb +[ay-> +vb +[ay-> +vpos +]]; + +315 +ay +-> +v +[ +i +] = +vޏb +[ +aw +-> +v +&0xf]; + +316 +ay +-> +wout + |(1<< +i +); + +319  +AY_ENV_PER_L +: + +320  +AY_ENV_PER_H +: + +321 +ay +-> +gs +[ +aw +-> +g +] =w-> +v +; + +322 +ay +-> +vr + = (y-> +gs +[ +AY_ENV_PER_H +]<<8)|ay->gs[ +AY_ENV_PER_L +])* +ENVTIME +; + +325  +AY_ENV_CYCLE +: + +326 if +aw +-> +v + != 0xff ) + +328 +ay +-> +gs +[ +aw +-> +g +] =w-> +v +; + +329 +ay +-> +vb + = +eshes +[ +aw +-> +v +&0xf]; + +330 +ay +-> +vpos + = 0; + +331  +i +=0; i<3; i++ ) + +333 if +ay +-> +gs +[ +AY_CHA_AMP ++ +i +]&0x10 ) + +335 +ay +-> +v +[ +i +] = +vޏb +[ay-> +vb +[ay-> +vpos +]]; + +336 +ay +-> +wout + |(1<< +i +); + +342 + } +} + +344  + $ay_ushlog + +ay8912 + * +ay + ) + +346  +i +; + +348  +i +=0; i< +ay +-> +logged +; i++) + +349 + `ay_dowre + +ay +, &ay-> +wrog +[ +i +] ); + +350 +ay +-> +logged + = 0; + +351 + } +} + +357  + $ay_back +* +dummy +, +St8 + * +am +,  +ngth + ) + +359 +Ut16 + * +out +; + +360 +St16 + +fout +; + +361 +St32 + +i +, +j +, +logc +, +ogc +; + +362  +ay8912 + * +ay + = (ay8912 *) +dummy +; + +363 +St32 + +ddjuave +, +ddjumax +; + +364 +SDL_bo + +noi +; + +365  +au_ngth +; + +367 +logc + = 0; + +368 +ogc + = 0; + +369 +ddjuave + = 0; + +370 +ddjumax + = +sounds +; + +372 +noi + = +ay +-> +ic +->noi && ((!ay->ic-> +turbo +)||y->ic-> +w +)); + +373 if! +noi + ) +ay +-> +out + = 0; + +375 +out + = ( +Ut16 + *) +am +; + +376 +cvt +. +buf + = ( +Ut8 + *) +am +; + +378 +au_ngth + = +ngth +/(2*( +Ut16 +)); + +379 +au_ngth + = (au_ngth < +AUDIO_BUFLEN +)?ctual_length : AUDIO_BUFLEN; + +380 +au_ngth + = (au_ngth < +obed +. +mes +)?ctual_length : obtained.samples; + +382  +i +=0, +j +=0; i< +au_ngth +; i++ ) + +384 +ay +-> +ccyc + =y-> +ccye +>> +FPBITS +; + +386  ( +logc + < +ay +-> +logged + ) && (y-> +ccyc + >ay-> +wrog +[logc]. +cye + ) ) + +387 + `ay_dowre + +ay +, &ay-> +wrog +[ +logc +++] ); + +389 if +noi + ) + +391  ( +ogc + < +ay +-> +ogged + ) && (y-> +ccyc + >ay-> +log +[ogc]. +cye + ) ) + +392 +ay +-> +out + =y-> +log +[ +ogc +++]. +v + * 8192; + +395 if +ay +-> +ccyc + >y-> +ϡcyc + ) + +397 + `ay_audiicktock + +ay +,y-> +ccyc +-ay-> +ϡcyc + ); + +398 +ay +-> +ϡcyc + =y-> +ccyc +; + +401 +fout + = +ay +-> +ouut + +y-> +out +; + +402 +out +[ +j +++] = +fout +; + +403 +out +[ +j +++] = +fout +; + +404 if +vidp + ) +audiopbuf +[ +i +] = +fout +; + +406 if +fout + > +ddjumax + ) dcadjustmax = fout; + +407 +ddjuave + + +fout +; + +409 +ay +-> +ccye + + +cyeme +; + +412 +ddjuave + /( +ngth +/4); + +414 if( +ddjumax +- +ddjuave +) > 32767 ) + +415 +ddjuave + = -(32767- +ddjumax +); + +417 if +ddjuave + ) + +419  +i +=0, +j +=0; i< +au_ngth +; i++ ) + +421 +out +[ +j +++] - +ddjuave +; + +422 +out +[ +j +++] - +ddjuave +; + +423 if +vidp + ) +audiopbuf +[ +i +] - +ddjuave +; + +427 if +vidp + ) + +429 #i +SDL_BYTEORDER + = +SDL_BIG_ENDIAN + + +430  +i +=0; i<( +ngth +/4); i++ ) + +431 +audiopbuf +[ +i +] = + `SDL_Sw16 +(udiocapbuf[i] ); + +433 + `avi_addaudio +& +vidp +, +audiopbuf +, +ngth +/2 ); + +436 i( +ay +-> +logged + > +logc +) + +438 + `memmove +(& +ay +-> +wrog +[0], &ay->wrog[ +logc +], (ay-> +logged +-logc) * (ay->writelog[0])); + +439 +ay +-> +logged + - +logc +; + +440  +i +=0; i< +ay +-> +logged +; i++) + +441 +ay +-> +wrog +[ +i +]. +cye + -ay-> +ϡcyc +; + +444 i( +ay +-> +logged + > 150) + +445 + `ay_ushlog + +ay + ); + +449 +ay +-> +logged + = 0; + +452 if +noi + ) + +454  +ogc + < +ay +-> +ogged + ) + +455 +ay +-> +out + =y-> +log +[ +ogc +++]. +v + * 8192; + +458 + `SDL_CvtAudio +(& +cvt +); + +460 +ay +-> +ccye + -y-> +ϡcyc +<< +FPBITS +); + +461 +ay +-> +ϡcyc + = 0; + +462 +ay +-> +wlogcye + =y-> +ccye +>> +FPBITS +; + +463 +ay +-> +do_logcye_t + = +SDL_TRUE +; + +465 +ay +-> +ogged + = 0; + +466 + } +} + +472  + $ay_ticktock + +ay8912 + * +ay +,  +cyes + ) + +475 if +keyqueue + ) && ( +keysqueued + ) && (! +ay +-> +ic +-> +u +. +q +) ) + +477 if +kqoffs + > +keysqueued + ) + +479 + ` +( +keyqueue +); + +480 +keyqueue + = +NULL +; + +481 +keysqueued + = 0; + +482 +kqoffs + = 0; + +484  +ay +-> +ic +-> +ty + ) + +486  +MACH_ATMOS +: + +487  +MACH_PRAVETZ +: + +488 if +ay +-> +ic +-> +u +. +pc + =0xeb78 ) && (y->ic-> +rom + ) ) + +490 +ay +-> +ic +-> +u +. +a + = +keyqueue +[ +kqoffs +++]; + +491 +ay +-> +ic +-> +u +. + `wre +( &ay->oric->cpu, 0x2df, 0 ); + +492 +ay +-> +ic +-> +u +. +f_n + = 1; + +493 +ay +-> +ic +-> +u +. +lc + = 0xeb88; + +494 +ay +-> +ic +-> +u +. +lc + =y->ic->u. + `ad +&ay->ic->u,y->ic->u. +lc + ); + +498  +MACH_ORIC1 +: + +499  +MACH_ORIC1_16K +: + +500 if +ay +-> +ic +-> +u +. +pc + =0xe905 ) && (y->ic-> +rom + ) ) + +502 +ay +-> +ic +-> +u +. +a + = +keyqueue +[ +kqoffs +++]; + +503 +ay +-> +ic +-> +u +. + `wre +( &ay->oric->cpu, 0x2df, 0 ); + +504 +ay +-> +ic +-> +u +. +f_n + = 1; + +505 +ay +-> +ic +-> +u +. +lc + = 0xe915; + +506 +ay +-> +ic +-> +u +. +lc + =y->ic->u. + `ad +&ay->ic->u,y->ic->u. +lc + ); + +514 if +ay +-> +ic +-> +auto_jasm_t + ) + +516 i( +ay +-> +ic +-> +drivy + = +DRV_JASMIN +) + +518  +ay +-> +ic +-> +ty + ) + +520  +MACH_ATMOS +: + +521  +MACH_PRAVETZ +: + +522 if +ay +-> +ic +-> +u +. +pc + =0xeb78 ) && (y->ic-> +rom + ) ) + +524 +ay +-> +ic +-> +u +. + `wre +( &ay->oric->cpu, 0x3fb, 1 ); + +525 + `om + +ay +-> +ic + ); + +526 + `m6502_t +& +ay +-> +ic +-> +u + ); + +527 + `m6502_t_icyes +& +ay +-> +ic +-> +u +, +SDL_FALSE +, +NULL + ); + +528 + `v_ +& +ay +-> +ic +-> +v +,y->ic, +VIA_MAIN + ); + +529 +ay +-> +ic +-> +auto_jasm_t + = +SDL_FALSE +; + +533  +MACH_ORIC1 +: + +534  +MACH_ORIC1_16K +: + +535 if +ay +-> +ic +-> +u +. +pc + =0xe905 ) && (y->ic-> +rom + ) ) + +537 +ay +-> +ic +-> +u +. + `wre +( &ay->oric->cpu, 0x3fb, 1 ); + +538 + `om + +ay +-> +ic + ); + +539 + `m6502_t +& +ay +-> +ic +-> +u + ); + +540 + `m6502_t_icyes +& +ay +-> +ic +-> +u +, +SDL_FALSE +, +NULL + ); + +541 + `v_ +& +ay +-> +ic +-> +v +,y->ic, +VIA_MAIN + ); + +542 +ay +-> +ic +-> +auto_jasm_t + = +SDL_FALSE +; + +549 +ay +-> +ic +-> +auto_jasm_t + = +SDL_FALSE +; + +553 if +ay +-> +keybday + > 0 ) + +555 if +cyes + > +ay +-> +keybday + ) + +557 +ay +-> +keybday + = 0; + +558 + `ay_upde_keybs + +ay + ); + +560 +ay +-> +keybday + - +cyes +; + +564 if +ay +-> +do_logcye_t + ) + +566 +ay +-> +logcye + =y-> +wlogcye +; + +567 +ay +-> +do_logcye_t + = +SDL_FALSE +; + +569 +ay +-> +logcye + + +cyes +; + +570 + } +} + +572  + $ay_lockaudio + +ay8912 + * +ay + ) + +574 if +ay +-> +audiocked + ) ; + +575 if +ay +-> +ic +-> +emu_mode + ! +EM_RUNNING + ) || ( ! +sound + ) || ( +wpd + ) ) ; + +576 + `SDL_LockAudio +(); + +577 +ay +-> +audiocked + = +SDL_TRUE +; + +578 + } +} + +580  + $ay_uockaudio + +ay8912 + * +ay + ) + +582 if! +ay +-> +audiocked + ) ; + +583 + `SDL_UockAudio +(); + +584 +ay +-> +audiocked + = +SDL_FALSE +; + +585 + } +} + +591 +SDL_bo + + $ay_ + +ay8912 + * +ay +,  +mache + * +ic + ) + +593  +i +; + +595  +ic +-> +keym + ) + +597  +KMAP_AZERTY +: +keyb + = +azkb +; ; + +598  +KMAP_QWERTZ +: +keyb + = +qzkb +; ; + +599 : +keyb + = +qwkb +; ; + +603  +i +=0; i<8; i++ ) + +604 +ay +-> +keyes +[ +i +] = +SDL_FALSE +; + +607  +i +=0; i< +NUM_AY_REGS +; i++ ) + +608 +ay +-> +gs +[ +i +] = 0; + +611  +i +=0; i<3; i++ ) + +613 +ay +-> + +[ +i +] = 0; + +614 +ay +-> +out +[ +i +] = 0; + +615 +ay +-> +sign +[ +i +] = 0; + +616 +ay +-> +teb +[ +i +] = 1; + +617 +ay +-> +noib +[ +i +] = 1; + +618 +ay +-> +v +[ +i +] = 0; + +620 +ay +-> +wout + = 7; + +621 +ay +-> +wnoi + = +SDL_TRUE +; + +622 +ay +-> +n + = 0; + +623 +ay +-> +e + = 0; + +625 +ay +-> +vb + = +eshe0 +; + +626 +ay +-> +vpos + = 0; + +628 +ay +-> +bmode + = 0; + +629 +ay +-> +eg + = 0; + +630 +ay +-> +ic + = oric; + +631 +ay +-> +sound + = +soundavaab + && sound && (! +wpd +); + +632 +ay +-> +cunoi + = 0; + +633 +ay +-> +dck + = 1; + +634 +ay +-> +logged + = 0; + +635 +ay +-> +logcye + = 0; + +636 +ay +-> +do_logcye_t + = +SDL_FALSE +; + +637 +ay +-> +ouut + = +sounds +; + +638 +ay +-> +ϡcyc + = 0; + +639 +ay +-> +ccyc + = 0; + +640 +ay +-> +ccye + = 0; + +641 +ay +-> +ogged + = 0; + +642 +ay +-> +out + = 0; + +643 +ay +-> +keybday + = 0; + +644 +ay +-> +audiocked + = +SDL_FALSE +; + +645 if +soundavaab + ) + +646 + `SDL_PauAudio +( 0 ); + +649 + `SDL_BudAudioCVT +(& +cvt +, +AUDIO_S16SYS +, 2, +AUDIO_FREQ +, +obed +. +fm +, obed. +chls +, obed. +eq +); + +650 +cvt +. +n + = +obed +. +mes + * ( +St16 +* obed. +chls +; + +653  +SDL_TRUE +; + +654 + } +} + +659  + $ay_upde_keybs + +ay8912 + * +ay + ) + +661 +ay +-> +cukeyoffs + =y-> +ic +-> +v +. + `ad_pt_b +( &ay->oric->via ) & 0x7; + +663 if( +ay +-> +egs +[ +AY_STATUS +]&0x40) == 0 ) + +665 +ay +-> +ic +-> +v +. + `wre_pt_b +( &ay->oric->via, 0x08, 0x00 ); + +669 if +ay +-> +keyes +[ay-> +cukeyoffs +] & (ay-> +egs +[ +AY_PORT_A +]^0xff) ) + +670 +ay +-> +ic +-> +v +. + `wre_pt_b +( &ay->oric->via, 0x08, 0x08 ); + +672 +ay +-> +ic +-> +v +. + `wre_pt_b +( &ay->oric->via, 0x08, 0x00 ); + +673 + } +} + +678  + $ay_keyess + +ay8912 + * +ay +, +SDL_COMPAT_KEY + +key +, +SDL_bo + +down + ) + +680  +i +; + +683 if +key + == 0 ) ; + +686  +i +=0; i<64; i++ ) + +687 if +keyb +[ +i +] = +key + ) ; + +690 if +i + == 64 ) ; + +693 if +down + ) + +694 +ay +-> +keyes +[ +i +>>3] |= (1<<(i&7)); + +696 +ay +-> +keyes +[ +i +>>3] &= ~(1<<(i&7)); + +699 if +ay +-> +cukeyoffs + =( +i +>>3) ) + +701 if +ay +-> +keyes +[ay-> +cukeyoffs +] & (ay-> +egs +[ +AY_PORT_A +]^0xff) ) + +702 +ay +-> +ic +-> +v +. + `wre_pt_b +( &ay->oric->via, 0x08, 0x08 ); + +704 +ay +-> +ic +-> +v +. + `wre_pt_b +( &ay->oric->via, 0x08, 0x00 ); + +706 + } +} + +711  + $ay_modet + +ay8912 + * +ay + ) + +713  +v +, +ϡs6 +=0; + +715 if( +ay +-> +bmode + ! +AYBMF_BC1 +&& (ay-> +ic +-> +p܏_ay + != 0xff) ) + +717 +ay +-> +ic +-> +p܏_ay + = 0xff; + +718 if +ay +-> +ic +-> +p܏_is_ay + ) + +719 +ay +-> +ic +-> +v +. + `wre_pt_a +( &ay->oric->via, 0xff, 0xff ); + +722  +ay +-> +bmode + ) + +724  +AYBMF_BC1 +: + +725 +ay +-> +ic +-> +p܏_ay + = (ay-> +eg +>= +NUM_AY_REGS +? 0 :y-> +egs +[ay->creg]; + +726 +ay +-> +ic +-> +v +. + `wre_pt_a +&ay->ic->v, 0xff,y->ic-> +p܏_ay + ); + +727 +ay +-> +ic +-> +p܏_is_ay + = +SDL_TRUE +; + +730  +AYBMF_BDIR +: + +731 if +ay +-> +eg + > +NUM_AY_REGS + ) ; + +732 +v + = +ay +-> +ic +-> +v +. + `ad_pt_a +( &ay->oric->via ); + +734 if +ay +-> +eg + = +AY_STATUS + ) + +735 +ϡs6 + = +ay +-> +egs +[ +AY_STATUS +] & 0x40; + +737 if +ay +-> +eg + ! +AY_ENV_CYCLE + ) || ( +v + != 0xff ) ) + +738 +ay +-> +egs +[ay-> +eg +] = +v +; + +740  +ay +-> +eg + ) + +742  +AY_STATUS +: + +743 if( +ay +-> +egs +[ +AY_STATUS +]&0x40! +ϡs6 + ) + +745 +ay +-> +keybday + = 3; + +747  +AY_CHA_PER_L +: + +748  +AY_CHA_PER_H +: + +749  +AY_CHB_PER_L +: + +750  +AY_CHB_PER_H +: + +751  +AY_CHC_PER_L +: + +752  +AY_CHC_PER_H +: + +753  +AY_NOISE_PER +: + +754  +AY_CHA_AMP +: + +755  +AY_CHB_AMP +: + +756  +AY_CHC_AMP +: + +757  +AY_ENV_PER_L +: + +758  +AY_ENV_PER_H +: + +759  +AY_ENV_CYCLE +: + +760 if! +sound + ) || ( +wpd + ) ) + +762  +aywre + +wrow +; + +764 + `ay_ushlog + +ay + ); + +765 +wrow +. +cye + = 0; + +766 +wrow +. +g + = +ay +-> +eg +; + +767 +wrow +. +v + = +v +; + +768 + `ay_dowre + +ay +, & +wrow + ); + +772 + `ay_lockaudio + +ay + ); + +774 if +ay +-> +do_logcye_t + ) + +776 +ay +-> +logcye + =y-> +wlogcye +; + +777 +ay +-> +do_logcye_t + = +SDL_FALSE +; + +780 if +ay +-> +logged + > +WRITELOG_SIZE + ) + +781 + `ay_ushlog + +ay + ); + +783 +ay +-> +wrog +[ay-> +logged + ]. +cye + =y-> +logcye +; + +784 +ay +-> +wrog +[ay-> +logged + ]. +g + =y-> +eg +; + +785 +ay +-> +wrog +[ay-> +logged +++]. +v + = +v +; + +788  +AY_PORT_A +: + +789 +ay +-> +keybday + = 3; + +794  +AYBMF_BDIR +| +AYBMF_BC1 +: + +795 +ay +-> +eg + =y-> +ic +-> +v +. + `ad_pt_a +( &ay->oric->via ); + +798 + } +} + +800  + $ay_t_bcmode + +ay8912 + * +ay +,  +bc1 +,  +bd + ) + +802 +ay +-> +bmode + = ( +bc1 +? +AYBMF_BC1 +:0)|( +bd +? +AYBMF_BDIR +:0); + +803 + `ay_modet + +ay + ); + +804 + } +} + +806  + $ay_t_bc1 + +ay8912 + * +ay +,  +e + ) + +808 if +e + ) + +809 +ay +-> +bmode + | +AYBMF_BC1 +; + +811 +ay +-> +bmode + &~ +AYBMF_BC1 +; + +812 + `ay_modet + +ay + ); + +813 + } +} + +815  + $ay_t_bd + +ay8912 + * +ay +,  +e + ) + +817 if +e + ) + +818 +ay +-> +bmode + | +AYBMF_BDIR +; + +820 +ay +-> +bmode + &~ +AYBMF_BDIR +; + +821 + `ay_modet + +ay + ); + +822 + } +} + + @8912.h + +24  + #FPBITS + 10 + + ) + +27 #ide +AUDIO_BUFLEN + + +28  + #AUDIO_BUFLEN + 2048 + + ) + +31  + #WRITELOG_SIZE + ( +AUDIO_BUFLEN +*12) + + ) + +32  + #TAPELOG_SIZE + ( +AUDIO_BUFLEN +) + + ) + +34  + #CYCLESPERSECOND + (312*64*50) + + ) + +39  + #AYBMB_BC1 + 0 + + ) + +40  + #AYBMF_BC1 + (1<< +AYBMB_BC1 +) + + ) + +41  + #AYBMB_BDIR + 1 + + ) + +42  + #AYBMF_BDIR + (1<< +AYBMB_BDIR +) + + ) + +47 + mAY_CHA_PER_L + = 0, + +48 + mAY_CHA_PER_H +, + +49 + mAY_CHB_PER_L +, + +50 + mAY_CHB_PER_H +, + +51 + mAY_CHC_PER_L +, + +52 + mAY_CHC_PER_H +, + +53 + mAY_NOISE_PER +, + +54 + mAY_STATUS +, + +55 + mAY_CHA_AMP +, + +56 + mAY_CHB_AMP +, + +57 + mAY_CHC_AMP +, + +58 + mAY_ENV_PER_L +, + +59 + mAY_ENV_PER_H +, + +60 + mAY_ENV_CYCLE +, + +61 + mAY_PORT_A +, + +62 + mNUM_AY_REGS + + +65  + saywre + + +67 +Ut32 + + mcye +; + +68 +Ut8 + + mg +; + +69 +Ut8 + + mv +; + +72  + schge + + +74 +Ut32 + + mcye +; + +75 +Ut8 + + mv +; + +78  + say8912 + + +80 +Ut8 + + mbmode +, + meg +; + +81 +Ut8 + + mgs +[ +NUM_AY_REGS +], + megs +[NUM_AY_REGS]; + +82 +SDL_bo + + mkeyes +[8], + mwnoi +; + +83 +SDL_bo + + msound +; + +84 +SDL_bo + + mnoi +; + +85 +Ut32 + + mtڕ +[3], + mnoir +, + mvr +; + +86 +Ut16 + + mteb +[3], + mnoib +[3], + mv +[3], + mwout +; + +87 +St32 + + m +[3], + mn +, + me +; + +88 +Ut32 + + mtڕos +[3], + mte +[3]; + +89 +St32 + + msign +[3], + mout +[3], + mvpos +; + +90 * + mvb +; + +91  +mache + * + mic +; + +92 +Ut32 + + mcunoi +, + mdck +; + +93 +St16 + + mouut +; + +94 +St16 + + mout +; + +95 +Ut32 + + mccye +, + mϡcyc +, + mccyc +; + +96 +Ut32 + + mkeybday +, + mcukeyoffs +; + +98 +SDL_bo + + maudiocked +; + +99 +SDL_bo + + mdo_logcye_t +; + +100 +St32 + + mlogged +, + mogged +; + +101 +Ut32 + + mlogcye +, + mwlogcye +; + +102  +aywre + + mwrog +[ +WRITELOG_SIZE +]; + +103  +chge + + mlog +[ +TAPELOG_SIZE +]; + +106  +queuekeys +* +r + ); + +108 +SDL_bo + +ay_ + +ay8912 + * +ay +,  +mache + * +ic + ); + +109  +ay_back +* +dummy +, +St8 + * +am +,  +ngth + ); + +110  +ay_ticktock + +ay8912 + * +ay +,  +cyes + ); + +111  +ay_upde_keybs + +ay8912 + * +ay + ); + +112  +ay_keyess + +ay8912 + * +ay +, +SDL_COMPAT_KEY + +key +, +SDL_bo + +down + ); + +114  +ay_t_bc1 + +ay8912 + * +ay +,  +e + ); + +115  +ay_t_bd + +ay8912 + * +ay +,  +e + ); + +116  +ay_t_bcmode + +ay8912 + * +ay +,  +bc1 +,  +bd + ); + +117  +ay_modet + +ay8912 + * +ay + ); + +119  +ay_lockaudio + +ay8912 + * +ay + ); + +120  +ay_uockaudio + +ay8912 + * +ay + ); + +121  +ay_ushlog + +ay8912 + * +ay + ); + + @XCode/Oricutron/Oricutron/SDLMain.h + +8 #ide +_SDLMa_h_ + + +9  + #_SDLMa_h_ + + + ) + +11 #imp܈< +Coc +/Coc. +h +> + +13 @ +r + + gSDLMa + : +NSObje + + +14 @ +d + + + @avi.c + +23  + ~ + +24  + ~ + +25  + ~ + +26  + ~ + +28  + ~"syem.h +" + +29  + ~"avi.h +" + +32 +SDL_AudioSc + +obed +; + +35  +SDL_bo + + $wre32l + +SDL_bo + +lok +,  +avi_hd + * +ah +, +Ut32 + +v +, Ut32 * +m + ) + +37 if! +lok + )  +SDL_FALSE +; + +38 if +m + ) (*m +ah +-> +csize +; + +39 +ah +-> +csize + += 4; + +40 + `_MAKE_LE32 +( +v +); + +41  ( + `fwre +& +v +, 4, 1, +ah +-> +f + ) == 1); + +42 + } +} + +45  +SDL_bo + + $wre16l + +SDL_bo + +lok +,  +avi_hd + * +ah +, +Ut16 + +v +, +Ut32 + * +m + ) + +47 if! +lok + )  +SDL_FALSE +; + +48 if +m + ) (*m +ah +-> +csize +; + +49 +ah +-> +csize + += 2; + +50 + `_MAKE_LE16 +( +v +); + +51  ( + `fwre +& +v +, 2, 1, +ah +-> +f + ) == 1); + +52 + } +} + +56  +SDL_bo + + $wrer + +SDL_bo + +lok +,  +avi_hd + * +ah +, * +r +, +Ut32 + * +m + ) + +58 +St32 + +i + = () + ` + +r + ); + +59 if! +lok + )  +SDL_FALSE +; + +60 if +m + ) (*m +ah +-> +csize +; + +61 +ah +-> +csize + + +i +; + +62  ( + `fwre + +r +, +i +, 1, +ah +-> +f + ) == 1); + +63 + } +} + +66  +SDL_bo + + $ek_wre32l + +SDL_bo + +lok +,  +avi_hd + * +ah +, +Ut32 + +offs +, Ut32 +v + ) + +68 if! +lok + )  +SDL_FALSE +; + +69 if +offs + =0 )  +SDL_TRUE +; + +70 + `fek + +ah +-> +f +, +offs +, +SEEK_SET + ); + +71 + `_MAKE_LE32 +( +v +); + +72  ( + `fwre +& +v +, 4, 1, +ah +-> +f + ) == 1); + +73 + } +} + +76  +SDL_bo + + $wreblk + +SDL_bo + +lok +,  +avi_hd + * +ah +, +Ut8 + * +blk +, +Ut32 + +blkn + ) + +78 if! +lok + )  +SDL_FALSE +; + +79 +ah +-> +csize + + +blkn +; + +80  ( + `fwre + +blk +, +blkn +, 1, +ah +-> +f + ) == 1); + +81 + } +} + +84  +SDL_bo + + $wrebyt + +SDL_bo + +lok +,  +avi_hd + * +ah +, +Ut8 + +v + ) + +86 if! +lok + )  +SDL_FALSE +; + +87 +ah +-> +csize + += 1; + +88  ( + `fwre +& +v +, 1, 1, +ah +-> +f + ) == 1); + +89 + } +} + +91  + #AVIFLAGS + ( +AVIF_ISINTERLEAVED +| +AVIF_WASCAPTUREFILE +) + + ) + +92  +avi_hd + * + $avi_ݒ +* +fame +, +Ut8 + * +l +, +SDL_bo + +dosound +,  +is50hz + ) + +94  +avi_hd + * +ah +; + +95 +SDL_bo + +ok +; + +96 +St32 + +i +; + +98 +ah + = + `mloc + +avi_hd + ) ); + +99 if! +ah + )  +NULL +; + +101 + `memt + +ah +, 0,  +avi_hd + ) ); + +103 +ah +-> +f + = + `fݒ + +fame +, "wb" ); + +104 if! +ah +-> +f + ) + +106 + ` + +ah + ); + +107  +NULL +; + +110 +ah +-> +dod + = +dosound +; + +111 +ah +-> +csize + = 0; + +112 +ah +-> +is50hz + = is50hz; + +114 +ok + = +SDL_TRUE +; + +115 +ok + & + `wrer +ok, +ah +, "RIFF" , +NULL + ); + +116 +ok + & + `wre32l +ok, +ah +, 0, &ah-> +offs_riffsize + ); + +117 +ok + & + `wrer +ok, +ah +, "AVI " , +NULL + ); + +118 +ok + & + `wrer +ok, +ah +, "LIST" , +NULL + ); + +119 +ok + & + `wre32l +ok, +ah +, 0, &ah-> +offs_hdsize + ); + +120 +ok + & + `wrer +ok, +ah +, "hd" , +NULL + ); + +122 +ok + & + `wrer +ok, +ah +, "avih" , +NULL + ); + +123 +ok + & + `wre32l +ok, +ah +, 56, +NULL + ); + +124 +ok + & + `wre32l +ok, +ah +, +is50hz +?20000:16667,&ah-> +offs_um +); + +125 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +126 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +127 +ok + & + `wre32l +ok, +ah +, +AVIFLAGS +, +NULL + ); + +128 +ok + & + `wre32l +ok, +ah +, 0, &ah-> +offs_ames + ); + +129 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +130 +ok + & + `wre32l +ok, +ah +,h-> +dod +?2:1, +NULL + ); + +131 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +132 +ok + & + `wre32l +ok, +ah +, 240, +NULL + ); + +133 +ok + & + `wre32l +ok, +ah +, 224, +NULL + ); + +134 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +135 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +136 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +137 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +139 +ok + & + `wrer +ok, +ah +, "LIST" , +NULL + ); + +140 +ok + & + `wre32l +ok, +ah +,4+8+56+8+40+8*4, +NULL + ); + +141 +ok + & + `wrer +ok, +ah +, "" , +NULL + ); + +143 +ok + & + `wrer +ok, +ah +, "rh" , +NULL + ); + +144 +ok + & + `wre32l +ok, +ah +, 56, +NULL + ); + +145 +ok + & + `wrer +ok, +ah +, "vids" , +NULL + ); + +146 +ok + & + `wrer +ok, +ah +, "MRLE" , +NULL + ); + +147 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +148 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +149 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +150 +ok + & + `wre32l +ok, +ah +, 1000000, +NULL + ); + +151 +ok + & + `wre32l +ok, +ah +, +is50hz +?50000000:60000000,&ah-> +offs_m +); + +152 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +153 +ok + & + `wre32l +ok, +ah +, 0, &ah-> +offs_ames2 + ); + +154 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +155 +ok + & + `wre32l +ok, +ah +, 10000, +NULL + ); + +156 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +157 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +158 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +160 +ok + & + `wrer +ok, +ah +, "rf" , +NULL + ); + +161 +ok + & + `wre32l +ok, +ah +, 40+8*4, +NULL + ); + +162 +ok + & + `wre32l +ok, +ah +, 40, +NULL + ); + +163 +ok + & + `wre32l +ok, +ah +, 240, +NULL + ); + +164 +ok + & + `wre32l +ok, +ah +, 224, +NULL + ); + +165 +ok + & + `wre16l +ok, +ah +, 1, +NULL + ); + +166 +ok + & + `wre16l +ok, +ah +, 8, +NULL + ); + +167 +ok + & + `wre32l +ok, +ah +, 1, +NULL + ); + +168 +ok + & + `wre32l +ok, +ah +, 240*244, +NULL + ); + +169 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +170 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +171 +ok + & + `wre32l +ok, +ah +, 8, +NULL + ); + +172 +ok + & + `wre32l +ok, +ah +, 8, +NULL + ); + +174  +i +=0; i<8; i++ ) + +176 +ok + & + `wrebyt +ok, +ah +, +l +[ +i +*3+2] ); + +177 +ok + & + `wrebyt +ok, +ah +, +l +[ +i +*3+1] ); + +178 +ok + & + `wrebyt +ok, +ah +, +l +[ +i +*3+0] ); + +179 +ok + & + `wrebyt +ok, +ah +, 0 ); + +182 if +ah +-> +dod + ) + +184 +ok + & + `wrer +ok, +ah +, "LIST" , +NULL + ); + +185 +ok + & + `wre32l +ok, +ah +, 4+8+56+8+16, +NULL + ); + +186 +ok + & + `wrer +ok, +ah +, "" , +NULL + ); + +188 +ok + & + `wrer +ok, +ah +, "rh" , +NULL + ); + +189 +ok + & + `wre32l +ok, +ah +, 56, +NULL + ); + +190 +ok + & + `wrer +ok, +ah +, "auds" , +NULL + ); + +191 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +192 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +193 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +194 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +195 +ok + & + `wre32l +ok, +ah +, 1, +NULL + ); + +196 +ok + & + `wre32l +ok, +ah +, +obed +. +eq +, +NULL + ); + +197 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +198 +ok + & + `wre32l +ok, +ah +, 0, &ah-> +offs_audiޒ + ); + +199 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +200 +ok + & + `wre32l +ok, +ah +, 10000, +NULL + ); + +201 +ok + & + `wre32l +ok, +ah +, 2, +NULL + ); + +202 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +203 +ok + & + `wre32l +ok, +ah +, 0, +NULL + ); + +205 +ok + & + `wrer +ok, +ah +, "rf" , +NULL + ); + +206 +ok + & + `wre32l +ok, +ah +, 16, +NULL + ); + +207 +ok + & + `wre16l +ok, +ah +, 1, +NULL + ); + +208 +ok + & + `wre16l +ok, +ah +, 1, +NULL + ); + +209 +ok + & + `wre32l +ok, +ah +, +obed +. +eq +, +NULL + ); + +210 +ok + & + `wre32l +ok, +ah +, +obed +. +eq +*2, +NULL + ); + +211 +ok + & + `wre16l +ok, +ah +, 2, +NULL + ); + +212 +ok + & + `wre16l +ok, +ah +, 16, +NULL + ); + +215 +ah +-> +hdsize + =h-> +csize + -h-> +offs_hdsize + - 4; + +217 +ok + & + `wrer +ok, +ah +, "LIST" , +NULL + ); + +218 +ok + & + `wre32l +ok, +ah +, 0, &ah-> +offs_movisize + ); + +219 +ok + & + `wrer +ok, +ah +, "movi" , +NULL + ); + +221 if! +ok + ) + +223 + ` + +ah + ); + +224  +NULL +; + +227 +ah +-> +ames + = 0; + +228 +ah +-> +amdju + = 0; + +229 +ah +-> +audiޒ + = 0; + +230 +ah +-> +movisize + = 0; + +231 +ah +-> +ϡamevid + = +SDL_FALSE +; + +232 +ah +-> +time_t + = 0; + +234  +ah +; + +235 + } +} + +237  +Ut32 + + $e_puixs + +avi_hd + * +ah +, +Ut8 + * +cda +, +Ut32 + +ec +, Ut32 +cc +, Ut32 +ngth + ) + +239 +Ut32 + +c +, +chunk +; + +241 if +ngth + =0 )  +ec +; + +243  +ngth + > 254 ) + +246 +chunk + = ( +ngth +<258) ? 250 : 254; + +247 +ec + = + `e_puixs + +ah +, +cda +,c, +cc +, +chunk + ); + +248 +cc + + +chunk +; + +249 +ngth + - +chunk +; + +253 if +ngth + < 3 ) + +255  +ngth + > 0 ) + +257 +ah +-> +eda +[ +ec +++] = 0x01; + +258 +ah +-> +eda +[ +ec +++] = +cda +[ +cc +++]; + +259 +ngth +--; + +261  +ec +; + +264 +c + = +ngth +; + +266 +ah +-> +eda +[ +ec +++] = 0x00; + +267 +ah +-> +eda +[ +ec +++] = +ngth +; + +268  +c + > 0 ) + +270 +ah +-> +eda +[ +ec +++] = +cda +[ +cc +++]; + +271 +c +--; + +274 if +ngth + & 1 ) + +275 +ah +-> +eda +[ +ec +++] = 0; + +277  +ec +; + +278 + } +} + +281  + #NOABS + 0xffffffff + + ) + +282  +Ut32 + + $e_code + +avi_hd + * +ah +, +Ut8 + * +cda +, +Ut32 + +ec +, Ut32 +e + ) + +284 +Ut32 + +cc +, +runc +, +abos +, +chunk +; + +285 +Ut8 + +thisc +; + +287 if +e + == 0 ) + +289 +ah +-> +eda +[ +ec +++] = 0x00; + +290 +ah +-> +eda +[ +ec +++] = 0x00; + +291  +ec +; + +294 +cc + = 0; + +295 +abos + = +NOABS +; + +296  +cc + < +e + ) + +299 +thisc + = +cda +[ +cc +]; + +302 if +cc + = +e +-1 ) + +305 if +abos + ! +NOABS + ) +ec + = + `e_puixs + +ah +, +cda +,c,bos, +cc +-abspos ); + +308 +ah +-> +eda +[ +ec +++] = 0x01; + +309 +ah +-> +eda +[ +ec +++] = +thisc +; + +311 +ah +-> +eda +[ +ec +++] = 0x00; + +312 +ah +-> +eda +[ +ec +++] = 0x00; + +313  +ec +; + +316 +runc + = 1; + +317  +cda +[ +cc ++ +runc +] = +thisc + ) + +319 +runc +++; + +320 if( +cc ++ +runc +> +e + ) ; + +324 if +runc + < 2 ) + +327 if +abos + = +NOABS + )bo +cc +; + +330 +cc +++; + +335 if +abos + ! +NOABS + ) + +337 +ec + = + `e_puixs + +ah +, +cda +,c, +abos +, +cc +-abspos ); + +338 +abos + = +NOABS +; + +342 +cc + + +runc +; + +344  +runc + > 255 ) + +346 +chunk + = ( +runc +<258) ? 250 : 255; + +347 +ah +-> +eda +[ +ec +++] = +chunk +; + +348 +ah +-> +eda +[ +ec +++] = +thisc +; + +349 +runc + - +chunk +; + +352 +ah +-> +eda +[ +ec +++] = +runc +; + +353 +ah +-> +eda +[ +ec +++] = +thisc +; + +356 if +abos + ! +NOABS + ) +ec + = + `e_puixs + +ah +, +cda +,c,bos, +cc +-abspos ); + +357 +ah +-> +eda +[ +ec +++] = 0x00; + +358 +ah +-> +eda +[ +ec +++] = 0x00; + +359  +ec +; + +360 + } +} + +362 +SDL_bo + + $avi_addame + +avi_hd + ** +ah +, +Ut8 + * +cda + ) + +364 +SDL_bo + +ok +; + +365 +St32 + +i +, +x +, +ϡle +, +ϡx +; + +366 +Ut32 + +size +; + +368 +ϡle + = 0; + +369 if(* +ah +)-> +ϡamevid + ) + +372  +i +=0; i<224; i++ ) + +374  +x +=0; x<240; x++ ) + +376 if(* +ah +)-> +ϡame +[ +i +*240+ +x +] ! +cda +[i*240+x] ) + +379 if +x +<240 ) ; + +381 +ϡle + = +i +; + +384 if +ϡle + == 224 ) + +386 +size + = 0; + +387 (* +ah +)-> +eda +[ +size +++] = 0x00; + +388 (* +ah +)-> +eda +[ +size +++] = 0x01; + +390  +i +=223, +size +=0; i>= +ϡle +; i-- ) + +392 +ϡx + = 240; + +393 if(* +ah +)-> +ϡamevid + ) + +396  +x +=239; x>=0; x-- ) + +398 if(* +ah +)-> +ϡame +[ +i +*240+ +x +] ! +cda +[i*240+x] ) + +401 +ϡx + = +x ++1; + +403 +size + = + `e_code +* +ah +, & +cda +[ +i +*240], size, +ϡx + ); + +405 (* +ah +)-> +eda +[ +size +-1] = 0x01; + +408 + `memy +(* +ah +)-> +ϡame +, +cda +, 240*224 ); + +409 (* +ah +)-> +ϡamevid + = +SDL_TRUE +; + +411 +ok + = +SDL_TRUE +; + +412 +ok + & + `wrer +ok, * +ah +, "00dc", +NULL + ); + +413 +ok + & + `wre32l +ok, * +ah +, +size +, +NULL + ); + +414 +ok + & + `wreblk +ok, * +ah +, (*ah)-> +eda +, +size + ); + +416 (* +ah +)-> +movisize + + +size + + 8; + +417 (* +ah +)-> +ames +++; + +419 if! +ok + ) + +421 + `avi_o + +ah + ); + +422  +SDL_FALSE +; + +425 if!(* +ah +)-> +time_t + ) + +427 (* +ah +)-> +time_t + = + `SDL_GTicks +(); + +430  +SDL_TRUE +; + +431 + } +} + +433 +SDL_bo + + $avi_addaudio + +avi_hd + ** +ah +, +St16 + * +audioda +, +Ut32 + +audiosize + ) + +435 +SDL_bo + +ok +; + +437 if!(* +ah +)-> +dod + )  +SDL_TRUE +; + +439 +ok + = +SDL_TRUE +; + +440 +ok + & + `wrer +ok, * +ah +, "01wb", +NULL + ); + +441 +ok + & + `wre32l +ok, * +ah +, +audiosize +, +NULL + ); + +442 +ok + & + `wreblk +ok, * +ah +, ( +Ut8 + *) +audioda +, +audiosize + ); + +444 (* +ah +)-> +movisize + + +audiosize ++8; + +445 (* +ah +)-> +audiޒ + + +audiosize +; + +447 if! +ok + ) + +449 + `avi_o + +ah + ); + +450  +SDL_FALSE +; + +453  +SDL_TRUE +; + +454 + } +} + +456  + $avi_o + +avi_hd + ** +ah + ) + +458 +SDL_bo + +ok +; + +459 +Ut32 + +time_d + = + `SDL_GTicks +(); + +460  +time_ms +, + +, +um +; + +462 if! +ah + ) || (!(*ah)) ) ; + +464 if(* +ah +)-> +f + ) + +466 +ok + = +SDL_TRUE +; + +467 +ok + & + `ek_wre32l +ok, * +ah +, (*ah)-> +offs_riffsize +, (*ah)-> +csize +-8 ); + +468 +ok + & + `ek_wre32l +ok, * +ah +, (*ah)-> +offs_hdsize +, (*ah)-> +hdsize + ); + +469 +ok + & + `ek_wre32l +ok, * +ah +, (*ah)-> +offs_ames +, (*ah)-> +ames + ); + +470 +ok + & + `ek_wre32l +ok, * +ah +, (*ah)-> +offs_ames2 +, (*ah)-> +ames + ); + +471 +ok + & + `ek_wre32l +ok, * +ah +, (*ah)-> +offs_movisize +, (*ah)-> +movisize + ); + +472 +ok + & + `ek_wre32l +ok, * +ah +, (*ah)-> +offs_audiޒ +, (*ah)-> +audiޒ + ); + +474 +time_ms + = ()( +time_d + - (* +ah +)-> +time_t +); + +476 + + = (()((* +ah +)-> +ames +* 1000000000.0f/ +time_ms +; + +477 +um + = ( +time_ms +*1000.0f/ (()(* +ah +)-> +ames +); + +479 +ok + & + `ek_wre32l +ok, * +ah +, (*ah)-> +offs_m +, ( +Ut32 +)( + + + .5) ); + +480 +ok + & + `ek_wre32l +ok, * +ah +, (*ah)-> +offs_um +, ( +Ut32 +)( +um + + .5) ); + +482 + `fo +(* +ah +)-> +f + ); + +484 + ` +(* +ah +) ); + +485 * +ah + = +NULL +; + +486 + } +} + + @avi.h + +21  + #AVIF_HASINDEX + 0x00000010 + + ) + +22  + #AVIF_MUSTUSEINDEX + 0x00000020 + + ) + +23  + #AVIF_ISINTERLEAVED + 0x00000100 + + ) + +24  + #AVIF_TRUSTCKTYPE + 0x00000800 + + ) + +25  + #AVIF_WASCAPTUREFILE + 0x00010000 + + ) + +26  + #AVIF_COPYRIGHTED + 0x00020000 + + ) + +28  + savi_hd + + +30 +FILE + * + mf +; + +31 +Ut32 + + mcsize +; + +32 +Ut32 + + mames +, + mamdju +; + +33 +Ut32 + + mhdsize +; + +34 +Ut32 + + mmovisize +; + +35 +Ut32 + + maudiޒ +; + +36 +Ut32 + + moffs_riffsize +; + +37 +Ut32 + + moffs_hdsize +; + +38 +Ut32 + + moffs_ames +; + +39 +Ut32 + + moffs_ames2 +; + +40 +Ut32 + + moffs_movisize +; + +41 +Ut32 + + moffs_audiޒ +; + +42 +Ut32 + + moffs_um +; + +43 +Ut32 + + moffs_m +; + +44 +Ut32 + + mtime_t +; + +46 +SDL_bo + + mdod +; + +47 +SDL_bo + + mϡamevid +; + +48 +Ut8 + + meda +[240*224*4]; + +49 +Ut8 + + mϡame +[240*224]; + +53  + mis50hz +; + +56  +avi_hd + * +avi_ݒ +* +fame +, +Ut8 + * +l +, +SDL_bo + +dosound +,  +is50hz + ); + +57 +SDL_bo + +avi_addame + +avi_hd + ** +ah +, +Ut8 + * +cda + ); + +58 +SDL_bo + +avi_addaudio + +avi_hd + ** +ah +, +St16 + * +audioda +, +Ut32 + +audiosize + ); + +59  +avi_o + +avi_hd + ** +ah + ); + + @disk.c + +31  + #MICRODISC_FUDGE + + + ) + +33  + ~ + +34  + ~ + +35  + ~ + +37  + ~"syem.h +" + +38  + ~"6502.h +" + +39  + ~"v.h +" + +40  + ~"8912.h +" + +41  + ~"gui.h +" + +42  + ~"disk.h +" + +43  + ~"disk_avz.h +" + +44  + ~"mڙ.h +" + +45  + ~"6551.h +" + +46  + ~"mache.h +" + +47  + ~"msgbox.h +" + +48  + ~"feq.h +" + +50  +diskfe +[], +diskth +[], +fmp +[]; + +51  +diskfe +[], +diskth +[]; + +52  +avdiskfe +[], +avdiskth +[]; + +53 +SDL_bo + +eshdisks +; + +55  + #GENERAL_DISK_DEBUG + 0 + + ) + +56  + #DEBUG_SECTOR_DUMP + 0 + + ) + +58 #i +DEBUG_SECTOR_DUMP + + +59  + gdumpr +[64]; + +60  + gdumpcou +; + +63 #ifde +MICRODISC_FUDGE + + +64  +miodisc_tq +* +md + ); + +67  +Ut16 + + $lc_c + +Ut16 + +c +, +Ut8 + +vue +) + +69 +c + = (()(crc >> 8)) | (crc << 8); + +70 +c + ^ +vue +; + +71 +c + ^= (()(crc & 0xff)) >> 4; + +72 +c + ^= (crc << 8) << 4; + +73 +c + ^= ((crc & 0xff) << 4) << 1; + +74  +c +; + +75 + } +} + +78  + $disk_pup + +mache + * +ic +,  +drive + ) + +80  +tmp +[40]; + +81 if! +ic +-> +diskme +[ +drive +][0] ) + +83 + `do_pup + +ic +, "\x14\x15\x13" ); + +87 + `rtf + +tmp +, "\x14\x15""%d %-16s", +drive +, +ic +-> +diskme +[drive] ); + +88 + `do_pup + +ic +, +tmp + ); + +89 + } +} + +92  + $diskimage_ + +mache + * +ic +,  +diskimage + ** +dimg + ) + +94 * +dth +, * +dfe +; + +96 if!(* +dimg +) ) ; + +98 if +ic +-> +ty + ! +MACH_TELESTRAT + ) + +100  +ic +-> +drivy +) + +102  +DRV_PRAVETZ +: + +103 +dth + = +avdiskth +; + +104 +dfe + = +avdiskfe +; + +108 +dth + = +diskth +; + +109 +dfe + = +diskfe +; + +113 +dth + = +diskth +; + +114 +dfe + = +diskfe +; + +117 if(* +dimg +)-> +modifd + ) + +119  +modmsg +[128]; + +120 + `rtf + +modmsg +, "Thdisk idriv%d imodifd.\nWould youiktاvthchges?", (* +dimg +)-> +drivum + ); + +121 if + `msgbox + +ic +, +MSGBOX_YES_NO +, +modmsg + ) ) + +123 + `rtf + +modmsg +, "Savdisk %d", (* +dimg +)-> +drivum + ); + +124 if + `feque + +ic +, +modmsg +, +dth +, +dfe +, +FR_DISKSAVE + ) ) + +126 + `joth + +dth +, +dfe + ); + +127 + `diskimage_ve + +ic +, +fmp +, (* +dimg +)-> +drivum + ); + +132 if(* +dimg +)-> +wimage + ) + ` +( (*dimg)->rawimage ); + +133 + ` +* +dimg + ); + +134 (* +dimg + +NULL +; + +135 + } +} + +138 +Ut32 + + $diskimage_wt + +diskimage + * +dimg +, +Ut32 + +offt + ) + +140 if! +dimg + )  0; + +141 if! +dimg +-> +wimage + ) || ( dimg-> +wimag + < 4 ) )  0; + +142 if +offt + > ( +dimg +-> +wimag +-4) )  0; + +144  ( +dimg +-> +wimage +[ +offt ++3]<<24)|(dimg->rawimage[offset+2]<<16)|(dimg->rawimage[offset+1]<<8)|dimg->rawimage[offset]; + +145 + } +} + +150  +diskimage + * + $diskimage_loc + +Ut32 + +wimgn + ) + +152  +diskimage + * +dimg +; + +153 +Ut8 + * +buf += +NULL +; + +155 if +wimgn + ) + +157 +buf + = + `mloc + +wimgn + ); + +158 if! +buf + )  +NULL +; + +161 +dimg + = + `mloc + +diskimage + ) ); + +162 if! +dimg + ) + +164 + ` + +buf + ); + +165  +NULL +; + +168 +dimg +-> +drivum + = -1; + +169 +dimg +-> +numacks + = 0; + +170 +dimg +-> +numsides + = 0; + +171 +dimg +-> +geomry + = 0; + +172 +dimg +-> +chedack + = -1; + +173 +dimg +-> +chedside + = -1; + +174 +dimg +-> +nums + = 0; + +175 +dimg +-> +wimage + = +buf +; + +176 +dimg +-> +wimag + = +wimgn +; + +177 +dimg +-> +modifd + = +SDL_FALSE +; + +178 +dimg +-> +modifd_time + = 0; + +179  +dimg +; + +180 + } +} + +183  + $disk_eje + +mache + * +ic +,  +drive + ) + +185 + `diskimage_ + +ic +, &ic-> +wddisk +. +disk +[ +drive +] ); + +186 +ic +-> +avz +. +drv +[ +drive +]. +pimg + = +NULL +; + +187 +ic +-> +avz +. +drv +[ +drive +]. +by + = 0; + +188 +ic +-> +avz +. +drv +[ +drive +]. +dty + = +SDL_FALSE +; + +189 +ic +-> +avz +. +drv +[ +drive +]. +hf_ack + = 0; + +190 +ic +-> +diskme +[ +drive +][0] = 0; + +191 + `disk_pup + +ic +, +drive + ); + +192 + } +} + +198  + $diskimage_chck + +diskimage + * +dimg +,  +ack +,  +side + ) + +200 +Ut8 + * +r +, * +e +; + +201 +Ut32 + +cou +, +n +; + +204 if +dimg +-> +chedack + = +ack + ) && + +205 +dimg +-> +chedside + = +side + ) ) + +209  +n +=0;<32;++ ) + +211 +dimg +-> + +[ +n +]. +id_r + = +NULL +; + +212 +dimg +-> + +[ +n +]. +da_r + = +NULL +; + +214 +dimg +-> +nums + = 0; + +215 +dimg +-> +chedack + = -1; + +216 +dimg +-> +chedside + = -1; + +218 if +side + > +dimg +-> +numsides + ) + +222 +r + = & +dimg +-> +wimage +[( +side +*dimg-> +numacks ++ +ack +)*6400+256]; + +223 +e + = & +r +[6400]; + +226 +cou + = 0; + +227  +r + < +e + ) + +230  ( +r +< +e +) && (ptr[0]!=0xfe) )tr++; + +233 if +r + > +e + ) ; + +236 +dimg +-> + +[ +cou +]. +id_r + = +r +; + +237 +dimg +-> + +[ +cou +]. +da_r + = +NULL +; + +238 +cou +++; + +241 +n + = +r +[4]; + +244 +r ++=7; + +247  ( +r +< +e +) && (ptr[0]!=0xfb) && (ptr[0]!=0xf8) )tr++; + +248 if +r + > +e + ) ; + +251 +dimg +-> + +[ +cou +-1]. +da_r + = +r +; + +254 +r + +(1<<( +n ++7))+3; + +257 if0 < +cou + ) + +260 +dimg +-> +nums + = +cou +; + +261 +dimg +-> +chedack + = +ack +; + +262 +dimg +-> +chedside + = +side +; + +264 + } +} + +270 +SDL_bo + + $diskimage_ve + +mache + * +ic +, * +ame +,  +drive + ) + +272 +FILE + * +f +; + +275 if! +ic +-> +wddisk +. +disk +[ +drive +] )  +SDL_FALSE +; + +277 if +ic +-> +drivy + = +DRV_PRAVETZ + ) + +278 + `disk_avz_wre_image +(& +ic +-> +avz +. +drv +[ +drive +]); + +281 +f + = + `fݒ + +ame +, "wb" ); + +282 if! +f + ) + +284 + `do_pup + +ic +, "\x14\x15Save failed" ); + +285  +SDL_FALSE +; + +289 if + `fwre + +ic +-> +wddisk +. +disk +[ +drive +]-> +wimage +, oric->wddisk.disk[drive]-> +wimag +, 1, +f + ) != 1 ) + +291 + `fo + +f + ); + +292 + `do_pup + +ic +, "\x14\x15Save failed" ); + +293  +SDL_FALSE +; + +297 + `fo + +f + ); + +300 if +ame + ! +ic +-> +wddisk +. +disk +[ +drive +]-> +fame + ) + +302 + `y + +ic +-> +wddisk +. +disk +[ +drive +]-> +fame +, +ame +, 4096+512 ); + +303 +ic +-> +wddisk +. +disk +[ +drive +]-> +fame +[4096+511] = 0; + +307 +ic +-> +wddisk +. +disk +[ +drive +]-> +modifd + = +SDL_FALSE +; + +308 +ic +-> +wddisk +. +disk +[ +drive +]-> +modifd_time + = 0; + +311 +eshdisks + = +SDL_TRUE +; + +312  +SDL_TRUE +; + +313 + } +} + +316 +SDL_bo + + $diskimage_ld + +mache + * +ic +, * +ame +,  +drive + ) + +318 +FILE + * +f +; + +319 +Ut32 + +n +; + +322 +f + = + `fݒ + +ame +, "rb" ); + +323 if! +f + )  +SDL_FALSE +; + +326 + `disk_eje + +ic +, +drive + ); + +329 + `fek + +f +, 0, +SEEK_END + ); + +330 +n + = () + `l + +f + ); + +331 + `fek + +f +, 0, +SEEK_SET + ); + +334 if +n + <= 0 ) + +336 + `fo + +f + ); + +337  +SDL_FALSE +; + +341 +ic +-> +wddisk +. +disk +[ +drive +] = + `diskimage_loc + +n + ); + +342 if! +ic +-> +wddisk +. +disk +[ +drive +] ) + +344 + `do_pup + +ic +, "\x14\x15""Out of memory" ); + +345 + `fo + +f + ); + +346  +SDL_FALSE +; + +350 if + `d + +ic +-> +wddisk +. +disk +[ +drive +]-> +wimage +, +n +, 1, +f + ) != 1 ) + +352 + `fo + +f + ); + +353 + `disk_eje + +ic +, +drive + ); + +354 + `do_pup + +ic +, "\x14\x15""Readrror" ); + +355  +SDL_FALSE +; + +358 + `fo + +f + ); + +360 if +ic +-> +drivy + = +DRV_PRAVETZ + ) + +362 +Ut16 + +t_idx +; + +363 +Ut16 + +s_idx +; + +364 +Ut16 + +sb_idx +; + +365 +Ut16 + +tb_idx +; + +367 +ic +-> +avz +. +drv +[ +drive +]. +pimg + = oric-> +wddisk +. +disk +[drive]; + +369 if +drive + >= 2 ) + +371 + `disk_eje + +ic +, +drive + ); + +372 + `do_pup + +ic +, "\x14\x15""Invalid driveumber" ); + +373  +SDL_FALSE +; + +376 if +n + != 143360 ) + +378 + `disk_eje + +ic +, +drive + ); + +379 + `do_pup + +ic +, "\x14\x15""Invalidravetz disk image" ); + +380  +SDL_FALSE +; + +384  +t_idx + = 0;_idx < +PRAV_TRACKS_PER_DISK +;_idx++) + +386 +tb_idx + = 0; + +388  +s_idx + = 0; s_idx < +PRAV_SECTORS_PER_TRACK +; s_idx++) + +390  +sb_idx + = 0; sb_idx < +PRAV_RAW_BYTES_PER_SECTOR +; sb_idx++, +tb_idx +++) + +392 +ic +-> +avz +. +drv +[ +drive +]. +image +[ +t_idx +][ +tb_idx +] = + +393 + `disk_avz_image_w_by +( +ic +, +drive +, +t_idx +, +s_idx +, +sb_idx +); + +397  +tb_idx + < +PRAV_RAW_TRACK_SIZE +) + +399 +ic +-> +avz +. +drv +[ +drive +]. +image +[ +t_idx +][ +tb_idx +] = 0xFF; + +400 +tb_idx +++; + +404 +ic +-> +avz +. +drv +[ +drive +]. +by + = 0; + +405 +ic +-> +avz +. +drv +[ +drive +]. +hf_ack + = 0; + +410 if + `cmp +(*) +ic +-> +wddisk +. +disk +[ +drive +]-> +wimage +, "MFM_DISK", 8 ) != 0 ) + +412 + `disk_eje + +ic +, +drive + ); + +413 + `do_pup + +ic +, "\x14\x15""Invalid disk image" ); + +414  +SDL_FALSE +; + +418 +ic +-> +wddisk +. +disk +[ +drive +]-> +drivum + = drive; + +419 +ic +-> +wddisk +. +disk +[ +drive +]-> +numsides + = + `diskimage_wt +( oric->wddisk.disk[drive], 8 ); + +420 +ic +-> +wddisk +. +disk +[ +drive +]-> +numacks + = + `diskimage_wt +( oric->wddisk.disk[drive], 12 ); + +421 +ic +-> +wddisk +. +disk +[ +drive +]-> +geomry + = + `diskimage_wt +( oric->wddisk.disk[drive], 16 ); + +424 if +ic +-> +wddisk +. +disk +[ +drive +]-> +numsides + < 1 ) || + +425 +ic +-> +wddisk +. +disk +[ +drive +]-> +numsides + > 2 ) ) + +427 + `disk_eje + +ic +, +drive + ); + +428 + `do_pup + +ic +, "\x14\x15""Invalid disk image" ); + +429  +SDL_FALSE +; + +434 +ic +-> +wddisk +. +disk +[ +drive +]-> +modifd + = +SDL_FALSE +; + +435 +ic +-> +wddisk +. +disk +[ +drive +]-> +modifd_time + = 0; + +438 + `y + +ic +-> +wddisk +. +disk +[ +drive +]-> +fame +, +ame +, 4096+512 ); + +439 +ic +-> +wddisk +. +disk +[ +drive +]-> +fame +[4096+511] = 0; + +442 if + ` + +ame + ) > 31 ) + +444 + `y + +ic +-> +diskme +[ +drive +], & +ame +[ + ` +(fname)-31], 32 ); + +445 +ic +-> +diskme +[ +drive +][0] = 22; + +447 + `y + +ic +-> +diskme +[ +drive +], +ame +, 32 ); + +449 +ic +-> +diskme +[ +drive +][31] = 0; + +452 + `disk_pup + +ic +, +drive + ); + +455 +eshdisks + = +SDL_TRUE +; + +456  +SDL_TRUE +; + +457 + } +}; + +461  + $wd17xx_dummy +* +nhg + ) + +463 + } +} + +466  + $wd17xx_ + +wd17xx + * +wd + ) + +468 +wd +-> +r_us + = 0; + +469 +wd +-> +r_ack + = 0; + +470 +wd +-> +r_ + = 0; + +471 +wd +-> +r_da + = 0; + +472 +wd +-> +c_drive + = 0; + +473 +wd +-> +c_side + = 0; + +474 +wd +-> +c_ack + = 0; + +475 +wd +-> +c_ + = 0; + +476 +wd +-> +ϡ__ + = +SDL_FALSE +; + +477 +wd +-> +tq + = +wd17xx_dummy +; + +478 +wd +-> +rq + = +wd17xx_dummy +; + +479 +wd +-> +qg + = +NULL +; + +480 +wd +-> +tdrq + = +wd17xx_dummy +; + +481 +wd +-> +rdrq + = +wd17xx_dummy +; + +482 +wd +-> +drqg + = +NULL +; + +483 +wd +-> +cut + = +COP_NUFFINK +; + +484 +wd +-> +dayedt + = 0; + +485 +wd +-> +dayeddrq + = 0; + +486 +wd +-> +dius + = -1; + +487 +wd +-> +ddus + = -1; + +488 +eshdisks + = +SDL_TRUE +; + +489 + } +} + +492  + $wd17xx_ticktock + +wd17xx + * +wd +,  +cyes + ) + +494 #ifde +MICRODISC_FUDGE + + +495 i(( +wd +-> +cut + = +COP_READ_SECTORS_FUDGE +) || + +496 ( +wd +-> +cut + = +COP_READ_SECTOR_FUDGE +)) + +498 i( +wd +-> +disk +[wd-> +c_drive +]) + +500 +wd +-> +cuoffs + = 0; + +501 +wd +-> +cu + = + `wd17xx_fd_ +wd, wd-> +r_ + ); + +502 if! +wd +-> +cu + ) + +504 +wd +-> +r_us + = +WSF_RNF +; + +505 +wd +-> + `rdrq +wd-> +drqg + ); + +506 +wd +-> + `tq +wd-> +qg + ); + +507 +wd +-> +cut + = +COP_NUFFINK +; + +508 +eshdisks + = +SDL_TRUE +; + +509 #i +GENERAL_DISK_DEBUG + + +510 + `dbg_tf +"DISK: Se %d found.", +wd +-> +r_ + ); + +515 +wd +-> +cu + = 1<<(wd-> +cu +-> +id_r +[4]+7); + +516 +wd +-> +r_us + = +WSF_BUSY +| +WSF_NOTREADY +; + +517 +wd +-> +dayeddrq + = 60; + +518 +wd +-> +cut + = (wd->cut = +COP_READ_SECTORS_FUDGE +? +COP_READ_SECTORS + : +COP_READ_SECTOR +; + +519 +wd +-> +c + = 0xe295; + +520 +eshdisks + = +SDL_TRUE +; + +521 #i +DEBUG_SECTOR_DUMP + + +522 +dumpcou + = 0; + +523 +dumpr +[0] = 0; + +531 if +wd +-> +dayedt + > 0 ) + +534 +wd +-> +dayedt + - +cyes +; + +537 if +wd +-> +dayedt + <= 0 ) + +540 +wd +-> +dayedt + = 0; + +543 if +wd +-> +dius + != -1 ) + +546 +wd +-> +r_us + = wd-> +dius +; + +547 +wd +-> +dius + = -1; + +551 +wd +-> + `tq +wd-> +qg + ); + +552 #i +GENERAL_DISK_DEBUG + + +553 + `dbg_tf +( "DISK: Delayed INTRQ" ); + +559 if +wd +-> +dayeddrq + > 0 ) + +562 +wd +-> +dayeddrq + - +cyes +; + +565 if +wd +-> +dayeddrq + <= 0 ) + +568 +wd +-> +dayeddrq + = 0; + +571 if +wd +-> +ddus + != -1 ) + +574 +wd +-> +r_us + = wd-> +ddus +; + +575 +wd +-> +ddus + = -1; + +579 +wd +-> +r_us + | +WSF_DRQ +; + +580 +wd +-> + `tdrq +wd-> +drqg + ); + +583 + } +} + +586  + $wd17xx_ek_ack + +wd17xx + * +wd +, +Ut8 + +ack +, +SDL_bo + +dofudge + ) + +589 if +wd +-> +disk +[wd-> +c_drive +] ) + +592 if +ack + > +wd +-> +disk +[wd-> +c_drive +]-> +numacks + ) + +594 +ack + = ( +wd +-> +disk +[wd-> +c_drive +]-> +numacks +>0)?wd->disk[wd->c_drive]->numtracks-1:0; + +595 +wd +-> +dius + = +WSFI_HEADL +| +WSFI_SEEKERR +; + +599 +wd +-> +dius + = +WSFI_HEADL +| +WSFI_PULSE +; + +603 + `diskimage_chck + +wd +-> +disk +[wd-> +c_drive +], +ack +, wd-> +c_side + ); + +606 +wd +-> +c_ack + = +ack +; + +607 +wd +-> +c_ + = 0; + +608 +wd +-> +r_ack + = +ack +; + +614 +wd +-> +dayedt + = 20; + +615 if +wd +-> +c_ack + =0 ) wd-> +dius + | +WSFI_TRK0 +; + +616 #i +GENERAL_DISK_DEBUG + + +617 + `dbg_tf +"DISK: Aack %u (%u ses)", +ack +, +wd +-> +disk +[wd-> +c_drive +]-> +nums + ); + +624 +wd +-> + `tq +wd-> +qg + ); + +625 +wd +-> +r_ack + = 0; + +627 #i +GENERAL_DISK_DEBUG + + +628 + `dbg_tf +( "DISK: Seek fail" ); + +631 #ifde +MICRODISC_FUDGE + + +633 i(( +dofudge +&& ( +wd +-> +tq + = +miodisc_tq +)) + +635 +wd +-> +r_us + = 0x44; + +641 +wd +-> +r_us + = +WSF_NOTREADY +| +WSFI_SEEKERR +; + +642 + } +} + +647  +mfm + * + $wd17xx_fd_ + +wd17xx + * +wd +, +Ut8 + +cid + ) + +649  +vs +=0; + +650  +diskimage + * +dimg +; + +653 +dimg + = +wd +-> +disk +[wd-> +c_drive +]; + +656 if! +dimg + )  +NULL +; + +659 + `diskimage_chck + +dimg +, +wd +-> +c_ack +, wd-> +c_side + ); + +662 if +dimg +-> +nums + < 1 ) + +663  +NULL +; + +668  +vs + < 2 ) + +671 +wd +-> +c_ + = (wd->c_+1)% +dimg +-> +nums +; + +674 if! +wd +-> +c_ + ) + +676 +vs +++; + +677 +wd +-> +r_us + | +WSFI_PULSE +; + +681 if +dimg +-> + +[ +wd +-> +c_ +]. +id_r +[3] = +cid + ) + +682  & +dimg +-> + +[ +wd +-> +c_ +]; + +686 #i +GENERAL_DISK_DEBUG + + +687 + `dbg_tf +"Couldn'fd se %u", +cid + ); + +689  +NULL +; + +690 + } +} + +694  +mfm + * + $wd17xx_f_ + +wd17xx + * +wd + ) + +696  +diskimage + * +dimg +; + +698 +dimg + = +wd +-> +disk +[wd-> +c_drive +]; + +701 if! +dimg + )  +NULL +; + +704 + `diskimage_chck + +dimg +, +wd +-> +c_ack +, wd-> +c_side + ); + +707 if +dimg +-> +nums + < 1 ) + +708  +NULL +; + +711 +wd +-> +c_ + = 0; + +712 +wd +-> +r_us + = +WSFI_PULSE +; + +715  & +dimg +-> + +[ +wd +-> +c_ +]; + +716 + } +} + +719  +mfm + * + $wd17xx_xt_ + +wd17xx + * +wd + ) + +721  +diskimage + * +dimg +; + +723 +dimg + = +wd +-> +disk +[wd-> +c_drive +]; + +726 if! +dimg + )  +NULL +; + +729 + `diskimage_chck + +dimg +, +wd +-> +c_ack +, wd-> +c_side + ); + +732 if +dimg +-> +nums + < 1 ) + +733  +NULL +; + +736 +wd +-> +c_ + = (wd->c_+1)% +dimg +-> +nums +; + +739 if! +wd +-> +c_ + ) wd-> +r_us + | +WSFI_PULSE +; + +742  & +dimg +-> + +[ +wd +-> +c_ +]; + +743 + } +} + +746  + $wd17xx_ad + +wd17xx + * +wd +,  +addr + ) + +749  +addr + ) + +752 +wd +-> + `rq +wd-> +qg + ); + +753  +wd +-> +r_us +; + +756  +wd +-> +r_ack +; + +759  +wd +-> +r_ +; + +763  +wd +-> +cut + ) + +765 #ifde +MICRODISC_FUDGE + + +766  +COP_READ_SECTOR_FUDGE +: + +767  +COP_READ_SECTORS_FUDGE +: + +771  +COP_READ_SECTOR +: + +772  +COP_READ_SECTORS +: + +774 if! +wd +-> +cu + ) + +777 +wd +-> +r_us + &~ +WSF_DRQ +; + +778 +wd +-> +r_us + | +WSF_RNF +; + +779 +wd +-> + `rdrq +wd-> +drqg + ); + +780 +wd +-> +cut + = +COP_NUFFINK +; + +781 +eshdisks + = +SDL_TRUE +; + +786 if +wd +-> +cuoffs + =0 ) wd-> +y + = (wd-> +cu +-> +da_r +[wd->cuoffs++]==0xf8)? +WSFR_RECTYP +:0x00; + +789 +wd +-> +r_da + = wd-> +cu +-> +da_r +[wd-> +cuoffs +++]; + +790 +wd +-> +c + = + `lc_c +wd->c, wd-> +r_da + ); + +793 +wd +-> +r_us + &~ +WSF_DRQ +; + +794 +wd +-> + `rdrq +wd-> +drqg + ); + +796 #i +DEBUG_SECTOR_DUMP + + +797 + `rtf +& +dumpr +[ +dumpcou +*2], "%02X", +wd +-> +r_da + ); + +798 +dumpr +[34+ +dumpcou +] = (( +wd +-> +r_da +>31)&&(wd->r_data<127)) ? wd->r_data : '.'; + +799 +dumpcou +++; + +800 if +dumpcou + >= 16 ) + +802 +dumpr +[32] = ' '; + +803 +dumpr +[33] = '\''; + +804 +dumpr +[50] = '\''; + +805 +dumpr +[51] = 0; + +806 + `dbg_tf +"%s", +dumpr + ); + +807 +dumpcou + = 0; + +812 if +wd +-> +cuoffs + > wd-> +cu + ) + +815 #i +DEBUG_SECTOR_DUMP + + +816 if +dumpcou + ) + +818 +dumpr +[33] = '\''; + +819 +dumpr +[34+ +dumpcou +] = '\''; + +820 +dumpr +[35+ +dumpcou +] = 0; + +821  +dumpcou +*=2; sectordumpcount<33; sectordumpcount++ ) + +822 +dumpr +[ +dumpcou +*2] = ' '; + +823 + `dbg_tf +"%s", +dumpr + ); + +824 +dumpcou + = 0; + +830 if +wd +-> +cut + = +COP_READ_SECTORS + ) + +832 #i +GENERAL_DISK_DEBUG + + +833 + `dbg_tf +( "Next sector..." ); + +836 +wd +-> +r_ +++; + +837 +wd +-> +cuoffs + = 0; + +838 +wd +-> +cu + = + `wd17xx_fd_ +wd, wd-> +r_ + ); + +839 +wd +-> +c + = 0xe295; + +843 if! +wd +-> +cu + ) + +845 +wd +-> +dayedt + = 20; + +846 +wd +-> +dius + = wd-> +y +; + +847 +wd +-> +cut + = +COP_NUFFINK +; + +848 +wd +-> +r_us + &(~ +WSF_DRQ +); + +849 +wd +-> + `rdrq +wd-> +drqg + ); + +850 +eshdisks + = +SDL_TRUE +; + +857 +wd +-> +dayeddrq + = 180; + +862 +wd +-> +dayedt + = 32; + +863 +wd +-> +dius + = wd-> +y +; + +864 +wd +-> +cut + = +COP_NUFFINK +; + +865 +wd +-> +r_us + &(~ +WSF_DRQ +); + +866 +wd +-> + `rdrq +wd-> +drqg + ); + +867 +eshdisks + = +SDL_TRUE +; + +869 +wd +-> +dayeddrq + = 32; + +873  +COP_READ_ADDRESS +: + +874 if! +wd +-> +cu + ) + +876 +wd +-> +r_us + &~ +WSF_DRQ +; + +877 +wd +-> + `rdrq +wd-> +drqg + ); + +878 +wd +-> +cut + = +COP_NUFFINK +; + +879 +eshdisks + = +SDL_TRUE +; + +882 if +wd +-> +cuoffs + =0 ) wd-> +r_ + = wd-> +cu +-> +id_r +[1]; + +883 +wd +-> +r_da + = wd-> +cu +-> +id_r +[++wd-> +cuoffs +]; + +884 +wd +-> +r_us + &~ +WSF_DRQ +; + +885 +wd +-> + `rdrq +wd-> +drqg + ); + +886 if +wd +-> +cuoffs + >= 6 ) + +888 +wd +-> +dayedt + = 20; + +889 +wd +-> +dius + = 0; + +890 +wd +-> +cut + = +COP_NUFFINK +; + +891 +eshdisks + = +SDL_TRUE +; + +893 +wd +-> +dayeddrq + = 32; + +898  +wd +-> +r_da +; + +902 + } +} + +904  +SDL_bo + + gϡ__ + = +SDL_FALSE +; + +905  + $wd17xx_wre + +mache + * +ic +,  +wd17xx + * +wd +,  +addr +,  +da + ) + +907  +addr + ) + +910 +wd +-> + `rq +wd-> +qg + ); + +911  +da + & 0xe0 ) + +914  +da + & 0x10 ) + +917 #i +GENERAL_DISK_DEBUG + + +918 + `dbg_tf +"DISK: (%04XRee", +ic +-> +u +. +pc +-1 ); + +920 +wd +-> +r_us + = +WSF_BUSY +; + +921 if +da + & 8 ) +wd +-> +r_us + | +WSFI_HEADL +; + +922 + `wd17xx_ek_ack + +wd +, 0, +ic +-> +u +. +lc + == 0xe3a1 ); + +923 +wd +-> +cut + = +COP_NUFFINK +; + +924 +eshdisks + = +SDL_TRUE +; + +928 #i +GENERAL_DISK_DEBUG + + +929 + `dbg_tf +"DISK: (%04XSk", +ic +-> +u +. +pc +-1 ); + +931 +wd +-> +r_us + = +WSF_BUSY +; + +932 if +da + & 8 ) +wd +-> +r_us + | +WSFI_HEADL +; + +933 + `wd17xx_ek_ack + +wd +, wd-> +r_da +, +SDL_FALSE + ); + +934 +wd +-> +cut + = +COP_NUFFINK +; + +935 +eshdisks + = +SDL_TRUE +; + +941 #i +GENERAL_DISK_DEBUG + + +942 + `dbg_tf +"DISK: (%04XSp", +ic +-> +u +. +pc +-1 ); + +944 +wd +-> +r_us + = +WSF_BUSY +; + +945 if +da + & 8 ) +wd +-> +r_us + | +WSFI_HEADL +; + +946 if +ϡ__ + ) + +947 + `wd17xx_ek_ack + +wd +, wd-> +c_ack ++1, +SDL_FALSE + ); + +949 + `wd17xx_ek_ack + +wd +, wd-> +c_ack + > 0 ? wd->c_ack-1 : 0, +SDL_FALSE + ); + +950 +wd +-> +cut + = +COP_NUFFINK +; + +951 +eshdisks + = +SDL_TRUE +; + +955 #i +GENERAL_DISK_DEBUG + + +956 + `dbg_tf +"DISK: (%04XSp-I(%d,%d)", +ic +-> +u +. +pc +-1, +wd +-> +c_ack +, wd->c_track+1 ); + +958 +wd +-> +r_us + = +WSF_BUSY +; + +959 if +da + & 8 ) +wd +-> +r_us + | +WSFI_HEADL +; + +960 + `wd17xx_ek_ack + +wd +, wd-> +c_ack ++1, +SDL_FALSE + ); + +961 +ϡ__ + = +SDL_TRUE +; + +962 +wd +-> +cut + = +COP_NUFFINK +; + +963 +eshdisks + = +SDL_TRUE +; + +967 #i +GENERAL_DISK_DEBUG + + +968 + `dbg_tf +( "DISK: Step-Out" ); + +970 +wd +-> +r_us + = +WSF_BUSY +; + +971 if +da + & 8 ) +wd +-> +r_us + | +WSFI_HEADL +; + +972 if +wd +-> +c_ack + > 0 ) + +973 + `wd17xx_ek_ack + +wd +, wd-> +c_ack +-1, +SDL_FALSE + ); + +974 +ϡ__ + = +SDL_FALSE +; + +975 +wd +-> +cut + = +COP_NUFFINK +; + +976 +eshdisks + = +SDL_TRUE +; + +980 #i +GENERAL_DISK_DEBUG + + +981  +ic +-> +drivy + ) + +983  +DRV_MICRODISC +: + +984 + `dbg_tf +"DISK: (%04XRd se %u (CODE=%02X,ROM=%s,EPROM=%s)", +ic +-> +u +. +pc +-1, +wd +-> +r_ +, +da +, oric-> +romdis +?"OFF":"ON", oric-> +md +. +diskrom +?"ON":"OFF" ); + +988 + `dbg_tf +"DISK: (%04XRd se %u (CODE=%02X)", +ic +-> +u +. +pc +-1, +wd +-> +r_ +, +da + ); + +992 #ifde +MICRODISC_FUDGE + + +993 i(! +wd +-> +disk +[wd-> +c_drive +]) + +995 +wd +-> +cut + = ( +da +&0x10? +COP_READ_SECTORS_FUDGE + : +COP_READ_SECTOR_FUDGE +; + +1000 +wd +-> +cuoffs + = 0; + +1001 +wd +-> +cu + = + `wd17xx_fd_ +wd, wd-> +r_ + ); + +1002 if! +wd +-> +cu + ) + +1004 +wd +-> +r_us + = +WSF_RNF +; + +1005 +wd +-> + `rdrq +wd-> +drqg + ); + +1006 +wd +-> + `tq +wd-> +qg + ); + +1007 +wd +-> +cut + = +COP_NUFFINK +; + +1008 +eshdisks + = +SDL_TRUE +; + +1009 #i +GENERAL_DISK_DEBUG + + +1010 + `dbg_tf +"DISK: Se %d found.", +wd +-> +r_ + ); + +1016 +wd +-> +cu + = 1<<(wd-> +cu +-> +id_r +[4]+7); + +1017 +wd +-> +r_us + = +WSF_BUSY +| +WSF_NOTREADY +; + +1018 +wd +-> +dayeddrq + = 60; + +1019 +wd +-> +cut + = ( +da +&0x10? +COP_READ_SECTORS + : +COP_READ_SECTOR +; + +1020 +wd +-> +c + = 0xe295; + +1021 +eshdisks + = +SDL_TRUE +; + +1022 #i +DEBUG_SECTOR_DUMP + + +1023 +dumpcou + = 0; + +1024 +dumpr +[0] = 0; + +1029 #i +GENERAL_DISK_DEBUG + + +1030  +ic +-> +drivy + ) + +1032  +DRV_MICRODISC +: + +1033 + `dbg_tf +"DISK: (%04XWr %u (CODE=%02X,ROM=%s,EPROM=%s)", +ic +-> +u +. +pc +-1, +wd +-> +r_ +, +da +, oric-> +romdis +?"OFF":"ON", oric-> +md +. +diskrom +?"ON":"OFF" ); + +1037 + `dbg_tf +"DISK: (%04XWr %u (CODE=%02X)", +ic +-> +u +. +pc +-1, +wd +-> +r_ +, +da + ); + +1041 +wd +-> +cuoffs + = 0; + +1042 +wd +-> +cu + = + `wd17xx_fd_ +wd, wd-> +r_ + ); + +1043 if! +wd +-> +cu + ) + +1045 +wd +-> +r_us + = +WSF_RNF +; + +1046 +wd +-> + `rdrq +wd-> +drqg + ); + +1047 +wd +-> + `tq +wd-> +qg + ); + +1048 +wd +-> +cut + = +COP_NUFFINK +; + +1049 +eshdisks + = +SDL_TRUE +; + +1050 #i +GENERAL_DISK_DEBUG + + +1051 + `dbg_tf +"DISK: Se %d found.", +wd +-> +r_ + ); + +1057 +wd +-> +cu + = 1<<(wd-> +cu +-> +id_r +[4]+7); + +1058 +wd +-> +r_us + = +WSF_BUSY +| +WSF_NOTREADY +; + +1059 +wd +-> +dayeddrq + = 500; + +1060 +wd +-> +cut + = ( +da +&0x10? +COP_WRITE_SECTORS + : +COP_WRITE_SECTOR +; + +1061 +wd +-> +c + = 0xe295; + +1062 +eshdisks + = +SDL_TRUE +; + +1066  +da + & 0x10 ) + +1069 #i +GENERAL_DISK_DEBUG + + +1070 + `dbg_tf +"DISK: (%04XRdddss", +ic +-> +u +. +pc +-1 ); + +1072 +wd +-> +cuoffs + = 0; + +1073 if! +wd +-> +cu + ) + +1074 +wd +-> +cu + = + `wd17xx_f_ +( wd ); + +1076 +wd +-> +cu + = + `wd17xx_xt_ +( wd ); + +1078 if! +wd +-> +cu + ) + +1080 +wd +-> +r_us + = +WSF_RNF +; + +1081 +wd +-> + `rdrq +wd-> +drqg + ); + +1082 +wd +-> +cut + = +COP_NUFFINK +; + +1083 +wd +-> + `tq +wd-> +qg + ); + +1084 +eshdisks + = +SDL_TRUE +; + +1085 #i +GENERAL_DISK_DEBUG + + +1086 + `dbg_tf +( "DISK: No sectors onhisrack?" ); + +1091 #i +GENERAL_DISK_DEBUG + + +1092 + `dbg_tf +( "DISK: %02X,%02X,%02X,%02X,%02X,%02X", + +1093 +wd +-> +cu +-> +id_r +[1], + +1094 +wd +-> +cu +-> +id_r +[2], + +1095 +wd +-> +cu +-> +id_r +[3], + +1096 +wd +-> +cu +-> +id_r +[4], + +1097 +wd +-> +cu +-> +id_r +[5], + +1098 +wd +-> +cu +-> +id_r +[6] ); + +1100 +wd +-> +r_us + = +WSF_NOTREADY +| +WSF_BUSY +| +WSF_DRQ +; + +1101 +wd +-> + `tdrq +wd-> +drqg + ); + +1102 +wd +-> +cut + = +COP_READ_ADDRESS +; + +1103 +eshdisks + = +SDL_TRUE +; + +1107 #i +GENERAL_DISK_DEBUG + + +1108 + `dbg_tf +"DISK: (%04XF i", +ic +-> +u +. +pc +-1 ); + +1110 +wd +-> +r_us + = 0; + +1111 +wd +-> + `rdrq +wd-> +drqg + ); + +1112 +wd +-> + `tq +wd-> +qg + ); + +1113 +wd +-> +dayedt + = 0; + +1114 +wd +-> +dayeddrq + = 0; + +1115 +wd +-> +cut + = +COP_NUFFINK +; + +1116 +eshdisks + = +SDL_TRUE +; + +1122  +da + & 0x10 ) + +1125 #i +GENERAL_DISK_DEBUG + + +1126 + `dbg_tf +"DISK: (%04XRdck", +ic +-> +u +. +pc +-1 ); + +1128 +wd +-> +cut + = +COP_READ_TRACK +; + +1129 +eshdisks + = +SDL_TRUE +; + +1133 #i +GENERAL_DISK_DEBUG + + +1134 + `dbg_tf +"DISK: (%04XWrack", +ic +-> +u +. +pc +-1 ); + +1136 +wd +-> +cut + = +COP_WRITE_TRACK +; + +1137 +eshdisks + = +SDL_TRUE +; + +1145 +wd +-> +r_ack + = +da +; + +1149 +wd +-> +r_ + = +da +; + +1153 +wd +-> +r_da + = +da +; + +1155  +wd +-> +cut + ) + +1157  +COP_WRITE_SECTOR +: + +1158  +COP_WRITE_SECTORS +: + +1159 if! +wd +-> +cu + ) + +1161 +wd +-> +r_us + &~ +WSF_DRQ +; + +1162 +wd +-> +r_us + | +WSF_RNF +; + +1163 +wd +-> + `rdrq +wd-> +drqg + ); + +1164 +wd +-> +cut + = +COP_NUFFINK +; + +1165 +eshdisks + = +SDL_TRUE +; + +1168 if +wd +-> +cuoffs + =0 ) wd-> +cu +-> +da_r +[wd->curroffs++]=0xfb; + +1169 +wd +-> +cu +-> +da_r +[wd-> +cuoffs +++] = wd-> +r_da +; + +1170 +wd +-> +c + = + `lc_c +wd->c, wd-> +r_da + ); + +1171 if! +wd +-> +disk +[wd-> +c_drive +]-> +modifd + ) +eshdisks + = +SDL_TRUE +; + +1172 +wd +-> +disk +[wd-> +c_drive +]-> +modifd + = +SDL_TRUE +; + +1173 +wd +-> +disk +[wd-> +c_drive +]-> +modifd_time + = 0; + +1174 +wd +-> +r_us + &~ +WSF_DRQ +; + +1175 +wd +-> + `rdrq +wd-> +drqg + ); + +1177 if +wd +-> +cuoffs + > wd-> +cu + ) + +1179 +wd +-> +cu +-> +da_r +[wd-> +cuoffs +++] = wd-> +c +>>8; + +1180 +wd +-> +cu +-> +da_r +[wd-> +cuoffs +++] = wd-> +c +; + +1181 if +wd +-> +cut + = +COP_WRITE_SECTORS + ) + +1183 #i +GENERAL_DISK_DEBUG + + +1184 + `dbg_tf +( "Next sector..." ); + +1187 +wd +-> +r_ +++; + +1188 +wd +-> +cuoffs + = 0; + +1189 +wd +-> +cu + = + `wd17xx_fd_ +wd, wd-> +r_ + ); + +1190 +wd +-> +c + = 0xe295; + +1192 if! +wd +-> +cu + ) + +1194 +wd +-> +dayedt + = 20; + +1195 +wd +-> +dius + = wd-> +y +; + +1196 +wd +-> +cut + = +COP_NUFFINK +; + +1197 +wd +-> +r_us + &(~ +WSF_DRQ +); + +1198 +wd +-> + `rdrq +wd-> +drqg + ); + +1199 +eshdisks + = +SDL_TRUE +; + +1202 +wd +-> +dayeddrq + = 180; + +1206 +wd +-> +dayedt + = 32; + +1207 +wd +-> +dius + = wd-> +y +; + +1208 +wd +-> +cut + = +COP_NUFFINK +; + +1209 +wd +-> +r_us + &(~ +WSF_DRQ +); + +1210 +wd +-> + `rdrq +wd-> +drqg + ); + +1211 +eshdisks + = +SDL_TRUE +; + +1213 +wd +-> +dayeddrq + = 32; + +1219 + } +} + +1221  + $miodisc_tdrq +* +md + ) + +1223  +miodisc + * +mdp + = (miodis*) +md +; + +1224 +mdp +-> +drq + = 0; + +1225 + } +} + +1227  + $miodisc_rdrq +* +md + ) + +1229  +miodisc + * +mdp + = (miodis*) +md +; + +1230 +mdp +-> +drq + = +MF_DRQ +; + +1231 + } +} + +1233  + $miodisc_tq +* +md + ) + +1235  +miodisc + * +mdp + = (miodis*) +md +; + +1237 +mdp +-> +q + = 0; + +1238 if +mdp +-> +us + & +MDSF_INTENA + ) + +1239 +mdp +-> +ic +-> +u +. +q + | +IRQF_DISK +; + +1240 + } +} + +1242  + $miodisc_rq +* +md + ) + +1244  +miodisc + * +mdp + = (miodis*) +md +; + +1246 +mdp +-> +q + = +MDSF_INTRQ +; + +1247 +mdp +-> +ic +-> +u +. +q + &~ +IRQF_DISK +; + +1248 + } +} + +1250  + $miodisc_ + +miodisc + * +md +,  +wd17xx + * +wd +,  +mache + * +ic + ) + +1252 + `wd17xx_ + +wd + ); + +1253 +wd +-> +tq + = +miodisc_tq +; + +1254 +wd +-> +rq + = +miodisc_rq +; + +1255 +wd +-> +qg + = (*) +md +; + +1256 +wd +-> +tdrq + = +miodisc_tdrq +; + +1257 +wd +-> +rdrq + = +miodisc_rdrq +; + +1258 +wd +-> +drqg + = (*) +md +; + +1260 +md +-> +us + = 0; + +1261 +md +-> +q + = 0; + +1262 +md +-> +drq + = 0; + +1263 +md +-> +wd + = wd; + +1264 +md +-> +ic + = oric; + +1265 +md +-> +diskrom + = +SDL_TRUE +; + +1266 + } +} + +1268  + $miodisc_ + +miodisc + * +md + ) + +1270  +i +; + +1271  +i +=0; i< +MAX_DRIVES +; i++ ) + +1272 + `disk_eje + +md +-> +ic +, +i + ); + +1273 + } +} + +1275  + $miodisc_ad + +miodisc + * +md +,  +addr + ) + +1278 if +addr + >= 0x310 ) && (ddr < 0x314 ) ) + +1279  + `wd17xx_ad + +md +-> +wd +, +addr +&3 ); + +1281  +addr + ) + +1284  +md +-> +q +|0x7f; + +1287  +md +-> +drq +|0x7f; + +1290  + `v_ad +& +md +-> +ic +-> +v +, +addr + ); + +1294 + } +} + +1296  + $miodisc_wre + +miodisc + * +md +,  +addr +,  +da + ) + +1299 if +addr + >= 0x310 ) && (ddr < 0x314 ) ) + +1301 + `wd17xx_wre + +md +-> +ic +, md-> +wd +, +addr +&3, +da + ); + +1305  +addr + ) + +1308 +md +-> +us + = +da +; + +1311 if +da +& +MDSF_INTENA + ) && ( +md +-> +q + == 0 ) ) + +1313 +md +-> +ic +-> +u +. +q + | +IRQF_DISK +; + +1315 +md +-> +ic +-> +u +. +q + &~ +IRQF_DISK +; + +1318 +md +-> +wd +-> +c_drive + = ( +da +& +MDSF_DRIVE +)>>5; + +1319 +md +-> +wd +-> +c_side + = ( +da +& +MDSF_SIDE +) ? 1 : 0; + +1320 +md +-> +ic +-> +romdis + = ( +da +& +MDSF_ROMDIS +? +SDL_FALSE + : +SDL_TRUE +; + +1321 +md +-> +diskrom + = ( +da +& +MDSF_EPROM +? +SDL_FALSE + : +SDL_TRUE +; + +1325 +md +-> +drq + = ( +da +& +MF_DRQ +); + +1329 + `v_wre +& +md +-> +ic +-> +v +, +addr +, +da + ); + +1332 + } +} + +1334  + $jasm_tdrq +* +j + ) + +1336  +jasm + * +jp + = (jasm *) +j +; + +1337 +jp +-> +ic +-> +u +. +q + | +IRQF_DISK +; + +1338 + } +} + +1340  + $jasm_rdrq +* +j + ) + +1342  +jasm + * +jp + = (jasm *) +j +; + +1343 +jp +-> +ic +-> +u +. +q + &~ +IRQF_DISK +; + +1344 + } +} + +1346  + $jasm_tq +* +j + ) + +1348 + } +} + +1350  + $jasm_rq +* +j + ) + +1352 + } +} + +1354  + $jasm_ + +jasm + * +j +,  +wd17xx + * +wd +,  +mache + * +ic + ) + +1356 + `wd17xx_ + +wd + ); + +1357 +wd +-> +tq + = +jasm_tq +; + +1358 +wd +-> +rq + = +jasm_rq +; + +1359 +wd +-> +qg + = (*) +j +; + +1360 +wd +-> +tdrq + = +jasm_tdrq +; + +1361 +wd +-> +rdrq + = +jasm_rdrq +; + +1362 +wd +-> +drqg + = (*) +j +; + +1364 +j +-> +ay + = 0; + +1365 +j +-> +romdis + = 0; + +1366 +j +-> +wd + = wd; + +1367 +j +-> +ic + = oric; + +1368 + } +} + +1370  + $jasm_ + +jasm + * +j + ) + +1372  +i +; + +1373  +i +=0; i< +MAX_DRIVES +; i++ ) + +1374 + `disk_eje + +j +-> +ic +, +i + ); + +1375 + } +} + +1377  + $jasm_ad + +jasm + * +j +,  +addr + ) + +1380 if +addr + >= 0x3f4 ) && (ddr < 0x3f8 ) ) + +1381  + `wd17xx_ad + +j +-> +wd +, +addr +&3 ); + +1383  +addr + ) + +1386  +j +-> +wd +-> +c_side + ? 1 : 0; + +1396  +j +-> +ay +; + +1399  +j +-> +romdis +; + +1403  + `v_ad +& +j +-> +ic +-> +v +, +addr + ); + +1407 + } +} + +1409  + $jasm_wre + +jasm + * +j +,  +addr +,  +da + ) + +1411 if +addr + >= 0x3f4 ) && (ddr < 0x3f8 ) ) + +1413 + `wd17xx_wre + +j +-> +ic +, j-> +wd +, +addr +&3, +da + ); + +1417  +addr + ) + +1420 +j +-> +wd +-> +c_side + = +da +&1; + +1428 +j +-> +ay + = +da +&1; + +1432 +j +-> +romdis + = +da +&1; + +1433 +j +-> +ic +-> +romdis + = ( +da +!=0? +SDL_TRUE + : +SDL_FALSE +; + +1440 +j +-> +wd +-> +c_drive + = +addr +&3; + +1444 + `v_wre +& +j +-> +ic +-> +v +, +addr +, +da + ); + +1447 + } +} + +1450  + $avz_ + +avz + * +p +,  +mache + * +ic + ) + +1452  +i +; + +1454 +p +-> +ay + = 0; + +1455 +p +-> +romdis + = 1; + +1456 +p +-> +exnsi + = 0; + +1457 +p +-> +ic + = oric; + +1459  +i +=0; i< +MAX_DRIVES +; i++) + +1461 +p +-> +drv +[ +i +]. +wre_ady + = 0x80; + +1462 +p +-> +drv +[ +i +]. +vume + = 254; + +1463 +p +-> +drv +[ +i +]. + + = 0; + +1464 +p +-> +drv +[ +i +]. +m_ + = 0; + +1465 +p +-> +drv +[ +i +]. +pimg + = +NULL +; + +1467 + } +} + +1469  + $avz_ + +avz + * +p + ) + +1471  +i +; + +1472  +i +=0; i< +MAX_DRIVES +; i++ ) + +1473 + `disk_eje + +p +-> +ic +, +i + ); + +1474 + } +} + +1476  + $avz_ad + +avz + * +p +,  +addr + ) + +1478  +da + = 0; + +1479 +da + = + `disk_avz_ad + +p +-> +ic +, +addr + ); + +1480 +p +-> +ic +-> +wddisk +. +cut + =-> +drv +[p->ic->wddisk. +c_drive +]. +m_ + ? +COP_READ_SECTOR + : +COP_NUFFINK +; + +1481  +da +; + +1482 + } +} + +1484  + $avz_wre + +avz + * +p +,  +addr +,  +da + ) + +1486 + `disk_avz_wre + +p +-> +ic +, +addr +, +da + ); + +1487 +p +-> +ic +-> +wddisk +. +cut + =-> +drv +[p->ic->wddisk. +c_drive +]. +m_ + ? +COP_READ_SECTOR + : +COP_NUFFINK +; + +1488 + } +} + + @disk.h + +23  + #MAX_DRIVES + 4 + + ) + +26  + #MDSB_INTENA + 0 + + ) + +27  + #MDSF_INTENA + (1<< +MDSB_INTENA +) + + ) + +28  + #MDSB_ROMDIS + 1 + + ) + +29  + #MDSF_ROMDIS + (1<< +MDSB_ROMDIS +) + + ) + +30  + #MDSB_DENSITY + 3 + + ) + +31  + #MDSF_DENSITY + (1<< +MDSB_DENSITY +) + + ) + +32  + #MDSB_SIDE + 4 + + ) + +33  + #MDSF_SIDE + (1<< +MDSB_SIDE +) + + ) + +34  + #MDSF_DRIVE + 0x60 + + ) + +35  + #MDSB_EPROM + 7 + +36  + #MDSF_EPROM + (1<< +MDSB_EPROM +) + + ) + +37  + #MDSB_INTRQ + 7 + +38  + #MDSF_INTRQ + (1<< +MDSB_INTRQ +) + + ) + +41  + #MB_DRQ + 7 + + ) + +42  + #MF_DRQ + (1<< +MB_DRQ +) + + ) + +47  + #WSB_BUSY + 0 + + ) + +48  + #WSF_BUSY + (1<< +WSB_BUSY +) + + ) + +49  + #WSBI_PULSE + 1 + + ) + +50  + #WSFI_PULSE + (1<< +WSBI_PULSE +) + +51  + #WSB_DRQ + 1 + + ) + +52  + #WSF_DRQ + (1<< +WSB_DRQ +) + + ) + +53  + #WSBI_TRK0 + 2 + + ) + +54  + #WSFI_TRK0 + (1<< +WSBI_TRK0 +) + +55  + #WSB_LOSTDAT + 2 + + ) + +56  + #WSF_LOSTDAT + (1<< +WSB_LOSTDAT +) + + ) + +57  + #WSB_CRCERR + 3 + + ) + +58  + #WSF_CRCERR + (1<< +WSB_CRCERR +) + + ) + +59  + #WSBI_SEEKERR + 4 + + ) + +60  + #WSFI_SEEKERR + (1<< +WSBI_SEEKERR +) + +61  + #WSB_RNF + 4 + + ) + +62  + #WSF_RNF + (1<< +WSB_RNF +) + + ) + +63  + #WSBI_HEADL + 5 + + ) + +64  + #WSFI_HEADL + (1<< +WSBI_HEADL +) + +65  + #WSBR_RECTYP + 5 + + ) + +66  + #WSFR_RECTYP + (1<< +WSBR_RECTYP +) + +67  + #WSB_WRITEERR + 5 + + ) + +68  + #WSF_WRITEERR + (1<< +WSB_WRITEERR +) + + ) + +69  + #WSB_WRPROT + 6 + + ) + +70  + #WSF_WRPROT + (1<< +WSB_WRPROT +) + + ) + +71  + #WSB_NOTREADY + 7 + + ) + +72  + #WSF_NOTREADY + (1<< +WSB_NOTREADY +) + + ) + +75  + #PRAV_DISK_OFFSET + 0x310 + + ) + +77  + #PRAV_SECTORS_PER_TRACK + 16 + + ) + +78  + #PRAV_BYTES_PER_SECTOR + 256 + + ) + +79  + #PRAV_RAW_BYTES_PER_SECTOR + 374 + + ) + +80  + #PRAV_TRACKS_PER_DISK + 35 + + ) + +81  + #PRAV_RAW_TRACK_SIZE + 6200 + + ) + +86 + mCOP_NUFFINK +=0, + +87 + mCOP_READ_TRACK +, + +88 + mCOP_READ_SECTOR +, + +89 + mCOP_READ_SECTORS +, + +90 + mCOP_WRITE_TRACK +, + +91 + mCOP_WRITE_SECTOR +, + +92 + mCOP_WRITE_SECTORS +, + +93 + mCOP_READ_ADDRESS +, + +94 #ifde +MICRODISC_FUDGE + + +95 + mCOP_READ_SECTOR_FUDGE +, + +96 + mCOP_READ_SECTORS_FUDGE + + +103  + smfm + + +105 +Ut8 + * + mid_r +; + +106 +Ut8 + * + mda_r +; + +113  + sdiskimage + + +115 +St16 + + mdrivum +; + +116 +Ut32 + + mnumacks +; + +117 +Ut32 + + mnumsides +; + +118 +Ut32 + + mgeomry +; + +119 +St16 + + mchedack +; + +120 +St16 + + mchedside +; + +121 +Ut32 + + mnums +; + +122  +mfm + + m +[32]; + +123 +Ut8 + * + mwimage +; + +124 +Ut32 + + mwimag +; + +125 +SDL_bo + + mmodifd +; + +126 +St32 + + mmodifd_time +; + +127  + mfame +[4096+512]; + +131  + swd17xx + + +133 +Ut8 + + mr_us +; + +134 +Ut8 + + mr_ack +; + +135 +Ut8 + + mr_ +; + +136 +Ut8 + + mr_da +; + +137 +Ut8 + + mc_drive +; + +138 +Ut8 + + mc_side +; + +139 +Ut8 + + mc_ack +; + +140 +Ut8 + + mc_ +; + +141 +Ut8 + + my +; + +142 +SDL_bo + + mϡ__ +; + +143 (* + mtq +)(*); + +144 (* + mrq +)(*); + +145 * + mqg +; + +146 (* + mtdrq +)(*); + +147 (* + mrdrq +)(*); + +148 * + mdrqg +; + +149  +diskimage + * + mdisk +[ +MAX_DRIVES +]; + +150  + mcut +; + +151  +mfm + * + mcu +; + +152  + mcu +; + +153  + mcuoffs +; + +154  + mdayedt +; + +155  + mdayeddrq +; + +156  + mdius +; + +157  + mddus +; + +158 +Ut16 + + mc +; + +162  + smiodisc + + +164 +Ut8 + + mus +; + +165 +Ut8 + + mq +; + +166 +Ut8 + + mdrq +; + +167  +wd17xx + * + mwd +; + +168  +mache + * + mic +; + +169 +SDL_bo + + mdiskrom +; + +174  + sjasm + + +176 +Ut8 + + may +; + +177 +Ut8 + + mromdis +; + +178  +wd17xx + * + mwd +; + +179  +mache + * + mic +; + +183  + savz_drive + + +185 +Ut8 + + mimage +[ +PRAV_TRACKS_PER_DISK +][ +PRAV_RAW_TRACK_SIZE +]; + +186 +Ut8 + + mvume +; + +187 +Ut8 + + m +; + +188 +Ut8 + + mm_ +; + +189 +Ut8 + + mwre_ady +; + +190 +Ut16 + + mby +; + +191 +Ut16 + + mhf_ack +; + +192 +Ut8 + * + m_r +; + +193 +SDL_bo + + mdty +; + +194  +diskimage + * + mpimg +; + +195 +SDL_bo + + m +; + +198  + savz + + +200 +Ut8 + + may +; + +201 +Ut8 + + mromdis +; + +202 +Ut16 + + mexnsi +; + +203  +mache + * + mic +; + +204  +avz_drive + + mdrv +[ +MAX_DRIVES +]; + +208 +SDL_bo + +diskimage_ld + +mache + * +ic +, * +ame +,  +drive + ); + +209 +SDL_bo + +diskimage_ve + +mache + * +ic +, * +ame +,  +drive + ); + +210  +diskimage_chck + +diskimage + * +dimg +,  +ack +,  +side + ); + +211  +mfm + * +wd17xx_fd_ + +wd17xx + * +wd +, +Ut8 + +cid + ); + +214  +wd17xx_ticktock + +wd17xx + * +wd +,  +cyes + ); + +217  +miodisc_ + +miodisc + * +md +,  +wd17xx + * +wd +,  +mache + * +ic + ); + +218  +miodisc_ + +miodisc + * +md + ); + +219  +miodisc_ad + +miodisc + * +md +,  +addr + ); + +220  +miodisc_wre + +miodisc + * +md +,  +addr +,  +da + ); + +223  +jasm_ + +jasm + * +j +,  +wd17xx + * +wd +,  +mache + * +ic + ); + +224  +jasm_ + +jasm + * +j + ); + +225  +jasm_ad + +jasm + * +j +,  +addr + ); + +226  +jasm_wre + +jasm + * +j +,  +addr +,  +da + ); + +229  +avz_ + +avz + * +p +,  +mache + * +ic + ); + +230  +avz_ + +avz + * +p + ); + +231  +avz_ad + +avz + * +p +,  +addr + ); + +232  +avz_wre + +avz + * +p +,  +addr +,  +da + ); + + @disk_pravetz.c + +26  + ~ + +27  + ~ + +28  + ~ + +30  + ~"syem.h +" + +31  + ~"6502.h +" + +32  + ~"v.h +" + +33  + ~"8912.h +" + +34  + ~"gui.h +" + +35  + ~"disk.h +" + +36  + ~"disk_avz.h +" + +37  + ~"mڙ.h +" + +38  + ~"6551.h +" + +39  + ~"mache.h +" + +41  + #GENERAL_DISK_DEBUG + 0 + + ) + +43 #i +GENERAL_DISK_DEBUG + + +44  + gϡ_ack + = -1; + +45  + gϡ_ + = -1; + +48  +Ut8 + +disk_avz_ad_ed +( +mache + * +ic +); + +49  +disk_avz_wre_ed +( +mache + * +ic +, +Ut8 + +da +); + +50  +disk_avz_swch +( +mache + * +ic +, +Ut16 + +addr +); + +52 +Ut8 + + $disk_avz_ad +( +mache + * +ic +, +Ut16 + +addr +) + +54 + `disk_avz_swch +( +ic +, +addr +- +PRAV_DISK_OFFSET +); + +56  (!( +addr + & 1))? + `disk_avz_ad_ed +( +ic +) : 0; + +57 + } +} + +59  + $disk_avz_wre +( +mache + * +ic +, +Ut16 + +addr +, +Ut8 + +da +) + +61 + `disk_avz_swch +( +ic +, +addr +- +PRAV_DISK_OFFSET +); + +63 if( +addr + & 1) + +65 + `disk_avz_wre_ed +( +ic +, +da +); + +67 + } +} + +70  + gve +[16] = + +76  + ge +[256] = + +112  + $disk_avz_upde_posi + ( +avz_drive + * +drv +) + +114 i( +drv +-> +m_ +) + +116 +drv +-> +by + = (1 + drv->by% +PRAV_RAW_TRACK_SIZE +; + +118 + } +} + +120 +Ut8 + + $disk_avz_image_w_by +( +mache + * +ic +,  +drive +, +Ut16 + +t_idx +, Ut16 +s_idx +, Ut16 +b_idx +) + +122  +f_pos +; + +124  +Ut8 + +d +; + +125  +Ut8 + +e +; + +126  +Ut8 + +w +; + +127  +Ut8 + +check +; + +129  +avz_drive + * +drv + = & +ic +-> +avz +.drv[ +drive +]; + +131 +w + = 0xFF; + +133  +b_idx +) + +165 +check + = +drv +-> +vume +; + +166  0xAA | ( +drv +-> +vume + >> 1); + +170  0xAA | +drv +-> +vume +; + +174 +check + ^ +t_idx +; + +175  0xAA | ( +t_idx + >> 1); + +179  0xAA | +t_idx +; + +183 +check + ^ +s_idx +; + +184  0xAA | ( +s_idx + >> 1); + +188  0xAA | +s_idx +; + +192  0xAA | ( +check + >> 1); + +196  0xAA | +check +; + +215 +e + = 0; + +218 +f_pos + = (256 * 16 * +t_idx ++ (256 * +ve +[ +s_idx +]); + +219 i( +drv +-> +pimg +) + +220 +drv +-> +_r + = &drv-> +pimg +-> +wimage +[ +f_pos +]; + +222 +drv +-> +_r + = +NULL +; + +227  +e +[ +e + & 0x3F]; + +230 +b_idx + -= 28; + +232 i( +b_idx + >= 0x56) + +235 +d + = +drv +-> +_r +[ +b_idx + - 0x56]; + +236 +d + = old >> 2; + +237 +e + ^ +d +; + +238 +w + = +e +[ +e + & 0x3F]; + +239 +e + = +d +; + +244 +d + = ( +drv +-> +_r +[ +b_idx +] & 0x01) << 1; + +245 +d + |( +drv +-> +_r +[ +b_idx +] & 0x02) >> 1; + +246 +d + |( +drv +-> +_r +[ +b_idx + + 0x56] & 0x01) << 3; + +247 +d + |( +drv +-> +_r +[ +b_idx + + 0x56] & 0x02) << 1; + +248 +d + |( +drv +-> +_r +[ +b_idx + + 0xAC] & 0x01) << 5; + +249 +d + |( +drv +-> +_r +[ +b_idx + + 0xAC] & 0x02) << 3; + +250 +e + ^ +d +; + +251 +w + = +e +[ +e + & 0x3F]; + +252 +e + = +d +; + +257  +w +; + +258 + } +} + +265  +Ut8 + + $disk_avz_adby +( +mache + * +ic +) + +267  +avz_drive + * +drv + = & +ic +-> +avz +.drv[ic-> +wddisk +. +c_drive +]; + +270 i(! +drv +-> +pimg +) + +273 + `disk_avz_upde_posi +( +drv +); + +276 #i +GENERAL_DISK_DEBUG + + +277 if( +ϡ_ + ! +drv +-> +by + / +PRAV_RAW_BYTES_PER_SECTOR + || +ϡ_ack + !drv-> +hf_ack +) + +279 + `tf +("{R} fdu: T:%.2d S:%.2X.%.3d [%.2X]\n", + +280 +drv +-> +hf_ack + / 2, + +281 +drv +-> +by + / +PRAV_RAW_BYTES_PER_SECTOR +, + +282 +drv +-> +by + % +PRAV_RAW_BYTES_PER_SECTOR +, + +283 +drv +-> +image +[drv-> +hf_ack + / 2][drv-> +by +]); + +284 +ϡ_ + = +drv +-> +by + / +PRAV_RAW_BYTES_PER_SECTOR +; + +285 +ϡ_ack + = +drv +-> +hf_ack +; + +290  +drv +-> +image +[drv-> +hf_ack + / 2][drv-> +by +]; + +291 + } +} + +298  +Ut8 + + $disk_avz_ad_ed +( +mache + * +ic +) + +300  +avz_drive + * +drv + = & +ic +-> +avz +.drv[ic-> +wddisk +. +c_drive +]; + +302 i(! +drv +-> +wre_ady +) + +304 +drv +-> +wre_ady + = 0x80; + +307  +drv +-> + +) + +310  + `disk_avz_adby +( +ic +); + +313  +drv +-> + + | drv-> +m_ +; + +316  +drv +-> +wre_ady +; + +320 + } +} + +322  +Ut8 + + gmp__bufr +[ +PRAV_BYTES_PER_SECTOR + + 2]; + +324  + $disk_avz_wre_image +( +avz_drive + * +d_r +) + +326 +Ut8 + +e +; + +327 +Ut8 + +s_idx +; + +329  +_ch_cou +; + +331  +t_idx +; + +332  +b_idx +; + +333  +tb_idx +; + +334  +_cou +, +f_pos +; + +336 i(! +d_r +) + +339 i(! +d_r +-> +dty +) + +342 +tb_idx + = 0; + +343  +t_idx + = 0;_idx < +PRAV_TRACKS_PER_DISK +;_idx++) + +345 +_cou + = 16; + +347 +fd_ +: + +351 +_ch_cou + = 0; + +352 0xD5 ! +d_r +-> +image +[ +t_idx +][ +tb_idx +]) + +354 +tb_idx + = (tb_idx + 1% +PRAV_RAW_TRACK_SIZE +; + +355 i(++ +_ch_cou + > +PRAV_RAW_TRACK_SIZE +) ; + +358 +tb_idx + = (tb_idx + 1% +PRAV_RAW_TRACK_SIZE +; + +359 i(0xAA ! +d_r +-> +image +[ +t_idx +][ +tb_idx +]) + +361 +tb_idx + = (tb_idx + 1% +PRAV_RAW_TRACK_SIZE +; + +362  +fd_ +; + +365 +tb_idx + = (tb_idx + 1% +PRAV_RAW_TRACK_SIZE +; + +366 i(0x96 ! +d_r +-> +image +[ +t_idx +][ +tb_idx +]) + +368 +tb_idx + = (tb_idx + 1% +PRAV_RAW_TRACK_SIZE +; + +369  +fd_ +; + +375 +tb_idx + = (tb_idx + 5% +PRAV_RAW_TRACK_SIZE +; + +378 +s_idx + = 0x55 | ( +d_r +-> +image +[ +t_idx +][ +tb_idx +] << 1); + +379 +tb_idx + = (tb_idx + 1% +PRAV_RAW_TRACK_SIZE +; + +380 +s_idx + & +d_r +-> +image +[ +t_idx +][ +tb_idx +]; + +381 +tb_idx + = (tb_idx + 1% +PRAV_RAW_TRACK_SIZE +; + +385 0xD5 ! +d_r +-> +image +[ +t_idx +][ +tb_idx +]) + +386 +tb_idx + = (tb_idx + 1% +PRAV_RAW_TRACK_SIZE +; + +388 +tb_idx + = (tb_idx + 1% +PRAV_RAW_TRACK_SIZE +; + +389 i(0xAA ! +d_r +-> +image +[ +t_idx +][ +tb_idx +]) + +391 +tb_idx + = (tb_idx + 1% +PRAV_RAW_TRACK_SIZE +; + +392  +fd_ +; + +395 +tb_idx + = (tb_idx + 1% +PRAV_RAW_TRACK_SIZE +; + +396 i(0xAD ! +d_r +-> +image +[ +t_idx +][ +tb_idx +]) + +398 +tb_idx + = (tb_idx + 1% +PRAV_RAW_TRACK_SIZE +; + +399  +fd_ +; + +404 +tb_idx + = (tb_idx + 1% +PRAV_RAW_TRACK_SIZE +; + +405 +e + = 0; + +407  +b_idx + = 0; b_idx < 342; b_idx++) + +409 +e + ^ +e +[ +d_r +-> +image +[ +t_idx +][ +tb_idx +]]; + +410 +tb_idx + = (tb_idx + 1% +PRAV_RAW_TRACK_SIZE +; + +412 i( +b_idx + >= 0x56) + +415 +mp__bufr +[ +b_idx + - 0x56] |( +e + << 2); + +420 +mp__bufr +[ +b_idx +] = ( +e + & 0x01) << 1; + +421 +mp__bufr +[ +b_idx +] |( +e + & 0x02) >> 1; + +422 +mp__bufr +[ +b_idx + + 0x56] = ( +e + & 0x04) >> 1; + +423 +mp__bufr +[ +b_idx + + 0x56] |( +e + & 0x08) >> 3; + +424 +mp__bufr +[ +b_idx + + 0xAC] = ( +e + & 0x10) >> 3; + +425 +mp__bufr +[ +b_idx + + 0xAC] |( +e + & 0x20) >> 5; + +430 +f_pos + = ( +PRAV_BYTES_PER_SECTOR + * +PRAV_SECTORS_PER_TRACK + * +t_idx +) + + +431 ( +PRAV_BYTES_PER_SECTOR + * +ve +[ +s_idx +]); + +433 + `memy +(& +d_r +-> +pimg +-> +wimage +[ +f_pos +], +mp__bufr +, +PRAV_BYTES_PER_SECTOR +); + +434 +d_r +-> +pimg +-> +modifd + = +SDL_TRUE +; + +435 +d_r +-> +pimg +-> +modifd_time + = 0; + +436 +_cou +--; + +438 i( +_cou +) + +439  +fd_ +; + +442 +d_r +-> +dty + = +SDL_FALSE +; + +443 + } +} + +449  + $disk_avz_wreby +( +mache + * +ic +, +Ut8 + +w_by +) + +451  +avz_drive + * +drv + = & +ic +-> +avz +.drv[ic-> +wddisk +. +c_drive +]; + +452 + `disk_avz_upde_posi +( +drv +); + +455 i(! +drv +-> +pimg +) + +458 i( +drv +-> + +) + +462 i( +w_by + < 0x96) + +465 +drv +-> +dty + = +SDL_TRUE +; + +466 +drv +-> +image +[drv-> +hf_ack + / 2][drv-> +by +] = +w_by +; + +469 #i +GENERAL_DISK_DEBUG + + +470 if( +ϡ_ + ! +drv +-> +by + / +PRAV_RAW_BYTES_PER_SECTOR + || +ϡ_ack + !drv-> +hf_ack +) + +472 + `tf +("{W} fdu: T:%.2d S:%.2X.%.3d [%.2X]\n", + +473 +drv +-> +hf_ack + / 2, + +474 +drv +-> +by + / +PRAV_RAW_BYTES_PER_SECTOR +, + +475 +drv +-> +by + % +PRAV_RAW_BYTES_PER_SECTOR +, + +476 +w_by +); + +477 +ϡ_ + = +drv +-> +by + / +PRAV_RAW_BYTES_PER_SECTOR +; + +478 +ϡ_ack + = +drv +-> +hf_ack +; + +482 + } +} + +489  + $disk_avz_wre_ed +( +mache + * +ic +, +Ut8 + +w_by +) + +491  +avz_drive + * +drv + = & +ic +-> +avz +.drv[ic-> +wddisk +. +c_drive +]; + +493 i(3 = +drv +-> + +) + +495 i( +drv +-> +m_ +) + +497 i( +drv +-> +wre_ady +) + +499 + `disk_avz_wreby +( +ic +, +w_by +); + +500 +drv +-> +wre_ady + = 0; + +504 + } +} + +506  + $disk_avz_swch + ( +mache + * +ic +, +Ut16 + +addr +) + +508  +avz_drive + * +drv + = & +ic +-> +avz +.drv[ic-> +wddisk +. +c_drive +]; + +510  +addr + & 0xF) + +513 +drv +-> +m_ + = 0; + +514 + `disk_avz_wre_image +( +drv +); + +518 +drv +-> +m_ + = 0x20; + +524 i( +ic +-> +wddisk +. +c_drive + !( +addr +&1)) + +526 + `disk_avz_wre_image +( +drv +); + +527 +ic +-> +wddisk +. +c_drive + = +addr +&1; + +532 +drv +-> + + &= 0xFE; + +536 +drv +-> + + |= 0x01; + +540 +drv +-> + + &= 0xFD; + +544 +drv +-> + + |= 0x02; + +549  +pha + = ( +addr + & 0x06) >> 1; + +552 i( +addr + & 0x01) + +554 +pha + += 4; + +555 +pha + -( +drv +-> +hf_ack + % 4); + +556 +pha + %= 4; + +558 i(1 = +pha +) + +560 i( +drv +-> +hf_ack + < (2 * +PRAV_TRACKS_PER_DISK + - 2)) + +562 +drv +-> +hf_ack +++; + +565 i(3 = +pha +) + +567 i( +drv +-> +hf_ack + > 0) + +569 +drv +-> +hf_ack +--; + +576 + } +} + + @disk_pravetz.h + +26 #ide +__disk_avz_h__ + + +27  + #__disk_avz_h__ + + + ) + +29 +Ut8 + +disk_avz_ad +( +mache + * +ic +, +Ut16 + +addr +); + +30  +disk_avz_wre +( +mache + * +ic +, +Ut16 + +addr +, +Ut8 + +da +); + +31 +Ut8 + +disk_avz_image_w_by +( +mache + * +ic +,  +drive +, +Ut16 + +t_idx +, Ut16 +s_idx +, Ut16 +b_idx +); + +32  +disk_avz_wre_image +( +avz_drive + * +d_r +); + + @filereq.h + +24 + mFR_DISKLOAD +=0, + +25 + mFR_DISKSAVE +, + +26 + mFR_TAPELOAD +, + +27 + mFR_TAPESAVETAP +, + +28 + mFR_TAPESAVEORT +, + +29 + mFR_ROMS +, + +30 + mFR_SNAPSHOTLOAD +, + +31 + mFR_SNAPSHOTSAVE +, + +32 + mFR_KEYMAPPINGLOAD +, + +33 + mFR_KEYMAPPINGSAVE +, + +34 + mFR_OTHER + + +37 +SDL_bo + +_feque + +mache + * +ic + ); + +38  +shut_feque + +mache + * +ic + ); + +39 +SDL_bo + +feque + +mache + * +ic +, * +t +, * +th +, * +ame +,  +ty + ); + + @filereq_amiga.c + +22  + #__USE_INLINE__ + + + ) + +24  + ~ + +25  + ~ + +27  + ~ + +28  + ~ + +29  + ~ + +31  + ~"syem.h +" + +32  + ~"6502.h +" + +33  + ~"v.h +" + +34  + ~"8912.h +" + +35  + ~"disk.h +" + +36  + ~"gui.h +" + +37  + ~"mڙ.h +" + +38  + ~"6551.h +" + +39  + ~"mache.h +" + +40  + ~"feq.h +" + +42  +Libry + * + gABa + = +NULL +; + +43  +FeReque + * + gq + = +NULL +; + +45 #ifde +__amigaos4__ + + +46  +AIFa + * + gIA + = +NULL +; + +49 +SDL_bo + + $_feque + +mache + * +ic + ) + +51 +ABa + = + `OnLibry +( +CONST_STRPTR +) +AName +, 39 ); + +52 if! +ABa + )  +SDL_FALSE +; + +54 #ifde +__amigaos4__ + + +55 +IA + = ( +AIFa + *) + `GI + +ABa +, "ma", 1, +NULL + ); + +56 if! +IA + )  +SDL_FALSE +; + +59 +q + = ( +FeReque + *) + `AocARequeTags + +ASL_FeReque +, +TAG_DONE + ); + +60 if! +q + )  +SDL_FALSE +; + +62  +SDL_TRUE +; + +63 + } +} + +65  + $shut_feque + +mache + * +ic + ) + +67 if +q + ) + `FeAReque +(eq ); + +68 #ifde +__amigaos4__ + + +69 if +IA + ) + `DrI +( +I + *)IAsl ); + +71 if +ABa + ) + `CloLibry +( AslBase ); + +72 + } +} + +74 +SDL_bo + + $feque + +mache + * +ic +, * +t +, * +th +, * +ame +,  +ty + ) + +76 * +t +, + +[16*2+2]; + +77 +BOOL + +dovemode + = +FALSE +; + +79  +ty + ) + +81  +FR_DISKSAVE +: + +82 +dovemode + = +TRUE +; + +83  +FR_DISKLOAD +: + +84 +t + = "#?.dsk"; + +87  +FR_TAPESAVETAP +: + +88 +dovemode + = +TRUE +; + +89 +t + = "#?.tap"; + +92  +FR_TAPESAVEORT +: + +93 +dovemode + = +TRUE +; + +94 +t + = "#?.ort"; + +97  +FR_TAPELOAD +: + +98 +t + = "#?.(tap|ort|wav)"; + +101  +FR_ROMS +: + +102 +t + = "#?.rom"; + +105  +FR_SNAPSHOTSAVE +: + +106 +dovemode + = +TRUE +; + +107  +FR_SNAPSHOTLOAD +: + +108 +t + = "#?.sna"; + +111  +FR_KEYMAPPINGSAVE +: + +112 +dovemode + = +TRUE +; + +113  +FR_KEYMAPPINGLOAD +: + +114 +t + = "#?.kma"; + +118 +t + = +NULL +; + +122 if +t + ) + `PPNoCa +( +CONST_STRPTR +, ( +UBYTE + *) + +, 16*2+2 ); + +124 if! + `ARequeTags + +q +, + +125 +ASLFR_TText +, +t +, + +126 +ASLFR_InlDw +, +th +, + +127 +ASLFR_InlFe +, +ame +, + +128 +ASLFR_DoPs +, +t + ! +NULL +, + +129 +ASLFR_RejeIcs +, +TRUE +, + +130 +ASLFR_DoSaveMode +, +dovemode +, + +131 +t + ? +ASLFR_AcP + : +TAG_IGNORE +, + +, + +132 +t + ? +ASLFR_InlP + : +TAG_IGNORE +,at, + +133 +TAG_DONE + ) ) + +134  +SDL_FALSE +; + +136 + `y + +th +, (cڡ *) +q +-> +_Dw +, 4096 );ath[4095] = 0; + +137 + `y + +ame +, (cڡ *) +q +-> +_Fe +, 512 ); fname[511] = 0; + +139  +SDL_TRUE +; + +140 + } +} + + @filereq_beos.cpp + +22  + ~ + +23  + ~ + +24  + ~ + +25  + ~ + +27  + ~ + +28  + ~ + +29  + ~ + +30  + ~ + +33  + ~"syem.h +" + +34  + ~"6502.h +" + +35  + ~"v.h +" + +36  + ~"8912.h +" + +37  + ~"disk.h +" + +38  + ~"gui.h +" + +39  + ~"mڙ.h +" + +40  + ~"6551.h +" + +41  + ~"mache.h +" + +42  + ~"feq.h +" + +46 as + cPLoݔ + : +public + +BLoݔ + { + +47 +public +: + +48 +PLoݔ +(); + +49 +vtu + ~ +PLoݔ +(); + +50 +vtu +  +MesgeReived +( +BMesge +* +mesge +); + +52  +Wa +(); + +53 +SDL_bo + + $DoIt +(cڡ {  +fDoIt +; }; + +54  + $GRef +( +y_f + & +f +cڡ {e +fRef +; + } +}; + +56 +ive +: + +57 +m_id + +fSem +; + +58 +y_f + +fRef +; + +59 +SDL_bo + +fDoIt +; + +63 + gPLoݔ +:: + $PLoݔ +() + +64 : + `BLoݔ +("PanelLooper"), + +65 + $fDoIt +( +SDL_FALSE +) + +67 +fSem + = + `_m +(0, "PanelLooperock"); + +68 + } +} + +71 + gPLoݔ +::~ + $PLoݔ +() + +73 + `de_m +( +fSem +); + +74 + } +} + +78 + gPLoݔ +:: + $MesgeReived +( +BMesge +* +mesge +) + +81  +mesge +-> +wh +) { + +82  +B_SAVE_REQUESTED +: + +83 +mesge +-> + `FdRef +("fs", & +fRef +); + +84 +fDoIt + = +SDL_TRUE +; + +86  +B_REFS_RECEIVED +: + +87 +mesge +-> + `FdRef +("fs", & +fRef +); + +88 +fDoIt + = +SDL_TRUE +; + +90  +B_CANCEL +: + +94 + `a_m +( +fSem +); + +95 + } +} + +99 + gPLoݔ +:: + $Wa +() + +101 + `acque_m +( +fSem +); + +102 + } +} + +105 +SDL_bo + + $_feque + +mache + * +ic + ) + +107  +SDL_TRUE +; + +108 + } +} + +110  + $shut_feque + +mache + * +ic + ) + +112 + } +} + +114 +SDL_bo + + $feque + +mache + * +ic +, * +t +, * +th +, * +ame +,  +ty + ) + +116 +BFeP + * +l +; + +117 +PLoݔ + * +loݔ + = +w + + `PLoݔ +(); + +118 +loݔ +-> + `Run +(); + +119 +SDL_bo + +t +; + +121 * +t +; + +122 +bo + +dovemode + = +l +; + +124  +ty + ) + +126  +FR_DISKSAVE +: + +127 +dovemode + = +ue +; + +128  +FR_DISKLOAD +: + +129 +t + = "*.dsk"; + +133  +FR_TAPESAVETAP +: + +134  +FR_TAPESAVEORT +: + +135 +dovemode + = +ue +; + +136  +FR_TAPELOAD +: + +137 +t + = "*.tap"; + +140  +FR_ROMS +: + +141 +t + = "*.rom"; + +144  +FR_SNAPSHOTSAVE +: + +145 +dovemode + = +ue +; + +146  +FR_SNAPSHOTLOAD +: + +147 +t + = "*.sna"; + +150  +FR_KEYMAPPINGSAVE +: + +151 +dovemode + = +ue +; + +152  +FR_KEYMAPPINGLOAD +: + +153 +t + = "*.kma"; + +157 +t + = +NULL +; + +163 +l + = +w + + `BFeP +( +dovemode + ? +B_SAVE_PANEL + : +B_OPEN_PANEL +); + +164 +l +-> + `STg +( + `BMesng +( +loݔ +)); + +166 i( +th +) + +167 +l +-> + `SPDey +( +th +); + +169 +l +-> + `Show +(); + +171 +loݔ +-> + `Wa +(); + +172 +t + = +loݔ +-> + `DoIt +(); + +173 +y_f + +f +; + +174 +loݔ +-> + `GRef +( +f +); + +176 +de + +l +; + +177 +loݔ +-> + `Lock +(); + +178 +loݔ +-> + `Qu +(); + +180 i( +t +) { + +181 +BPh + + `p +(& +f +); + +182 + `y + +ame +, +p +. + `Lf +(), 512 ); +th +[511] = 0; + +183 +p +. + `GPt +(&p); + +184 + `y + +th +, +p +. + `Ph +(), 4096 );ath[4095] = 0; + +187  +t +; + +188 + } +} + + @filereq_gtk.c + +22  + ~ + +23  + ~ + +24  + ~ + +25  + ~ + +26  + ~ + +27  + ~ + +29  + ~ + +31  + ~"syem.h +" + +32  + ~"6502.h +" + +33  + ~"v.h +" + +34  + ~"8912.h +" + +35  + ~"gui.h +" + +36  + ~"disk.h +" + +37  + ~"mڙ.h +" + +38  + ~"6551.h +" + +39  + ~"mache.h +" + +40  + ~"feq.h +" + +42 +SDL_bo + +fusn +; + +43  +toggfusn + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +45 +SDL_bo + + $_feque + +mache + * +ic + ) + +47 + `gtk_ +(0, +NULL +); + +48  +SDL_TRUE +; + +49 + } +} + +51  + $shut_feque + +mache + * +ic + ) + +53 + } +} + +61 +SDL_bo + + $feque + +mache + * +ic +, * +t +, * +th +, * +ame +,  +ty + ) + +63 +GtkWidg + * +dlog +; + +64 +SDL_bo + +su + = +SDL_FALSE +; + +65 +GtkFeChoorAi + +ai + = +GTK_FILE_CHOOSER_ACTION_OPEN +; + +66 +GtkFeFr + * +fr + = +NULL +, * +lfr + = + `gtk_fe_fr_w +(); + +67 +SDL_bo + +was_fusn + = +fusn +; + +69 i( +fusn +) + +70 + `toggfusn +( +ic +, +NULL +, 0); + +72 + `gtk_fe_fr_t_me +( +lfr +, "All files"); + +73 + `gtk_fe_fr_add_n +( +lfr +, "*"); + +75  +ty + ) + +77  +FR_DISKSAVE +: + +78 +ai + = +GTK_FILE_CHOOSER_ACTION_SAVE +; + +79  +FR_DISKLOAD +: + +80 +fr + = + `gtk_fe_fr_w +(); + +81 + `gtk_fe_fr_t_me +( +fr +, "Disk images"); + +82 + `gtk_fe_fr_add_n +( +fr +, "*.[Dd][Ss][Kk]"); + +85  +FR_TAPESAVETAP +: + +86 +ai + = +GTK_FILE_CHOOSER_ACTION_SAVE +; + +87 +fr + = + `gtk_fe_fr_w +(); + +88 + `gtk_fe_fr_t_me +( +fr +, ".tap files"); + +89 + `gtk_fe_fr_add_n +( +fr +, "*.[Tt][Aa][Pp]"); + +92  +FR_TAPESAVEORT +: + +93 +ai + = +GTK_FILE_CHOOSER_ACTION_SAVE +; + +94 +fr + = + `gtk_fe_fr_w +(); + +95 + `gtk_fe_fr_t_me +( +fr +, ".ort files"); + +96 + `gtk_fe_fr_add_n +( +fr +, "*.[Oo][Rr][Tt]"); + +99  +FR_TAPELOAD +: + +100 +fr + = + `gtk_fe_fr_w +(); + +101 + `gtk_fe_fr_t_me +( +fr +, "Tape images"); + +102 + `gtk_fe_fr_add_n +( +fr +, "*.[Tt][Aa][Pp]"); + +103 + `gtk_fe_fr_add_n +( +fr +, "*.[Ww][Aa][Vv]"); + +104 + `gtk_fe_fr_add_n +( +fr +, "*.[Oo][Rr][Tt]"); + +107  +FR_ROMS +: + +108 +fr + = + `gtk_fe_fr_w +(); + +109 + `gtk_fe_fr_t_me +( +fr +, "ROM images"); + +110 + `gtk_fe_fr_add_n +( +fr +, "*.[Rr][Oo][Mm]"); + +113  +FR_SNAPSHOTSAVE +: + +114 +ai + = +GTK_FILE_CHOOSER_ACTION_SAVE +; + +115  +FR_SNAPSHOTLOAD +: + +116 +fr + = + `gtk_fe_fr_w +(); + +117 + `gtk_fe_fr_t_me +( +fr +, "Snapshot files"); + +118 + `gtk_fe_fr_add_n +( +fr +, "*.[Ss][Nn][Aa]"); + +121  +FR_KEYMAPPINGSAVE +: + +122 +ai + = +GTK_FILE_CHOOSER_ACTION_SAVE +; + +123  +FR_KEYMAPPINGLOAD +: + +124 +fr + = + `gtk_fe_fr_w +(); + +125 + `gtk_fe_fr_t_me +( +fr +, "Keyboard Mapping files"); + +126 + `gtk_fe_fr_add_n +( +fr +, "*.[Kk][Mm][Aa]"); + +133 +dlog + = + `gtk_fe_choor_dlog_w +( +t +, + +134 +NULL +, + +135 +ai +, + +136 #i +GTK_MAJOR_VERSION + <= 2 + +137 +GTK_STOCK_CANCEL +, +GTK_RESPONSE_CANCEL +, + +138 +GTK_STOCK_OPEN +, +GTK_RESPONSE_ACCEPT +, + +140 "_Cl", +GTK_RESPONSE_CANCEL +, + +141 "_On", +GTK_RESPONSE_ACCEPT +, + +143 +NULL +); + +145 + `gtk_fe_choor_t_cut_fd +( + `GTK_FILE_CHOOSER +( +dlog +), +th +); + +146 i( +ai + = +GTK_FILE_CHOOSER_ACTION_SAVE +) + +147 + `gtk_fe_choor_t_cut_me +( + `GTK_FILE_CHOOSER +( +dlog +), +ame +); + +149 i( +fr +) + +150 + `gtk_fe_choor_add_fr +( + `GTK_FILE_CHOOSER +( +dlog +), +fr +); + +151 + `gtk_fe_choor_add_fr +( + `GTK_FILE_CHOOSER +( +dlog +), +lfr +); + +153 i( + `gtk_dlog_run +( + `GTK_DIALOG + ( +dlog +)= +GTK_RESPONSE_ACCEPT +) + +155 * +fame +; + +156  +i +; + +157 +fame + = + `gtk_fe_choor_g_fame + ( + `GTK_FILE_CHOOSER + ( +dlog +)); + +158 + `y + +th +, +fame +, 4096 );ath[4095] = 0; + +159 +i + = + ` +( +th +)-1; + +160  +i + >= 0) + +162 i( +th +[ +i +] = +PATHSEP +) ; + +163 +i +--; + +165 + `y + +ame +, & +th +[ +i ++1], 512 ); fname[511] = 0; + +166 +th +[ +i ++1] = 0; + +167 + `g_ +( +fame +); + +168 +su + = +SDL_TRUE +; + +171 + `gtk_widg_deroy +( +dlog +); + +172  + `gtk_evts_ndg +()) + +173 + `gtk_ma_i +(); + +175 i( +was_fusn +) + +176 + `toggfusn +( +ic +, +NULL +, 0); + +178  +su +; + +179 + } +} + + @filereq_sdl.c + +22  + ~ + +23  + ~ + +24  + ~ + +25 #ide +_MSC_VER + + +26  + ~ + +28  + ~ + +30  + ~"syem.h +" + +31  + ~"6502.h +" + +32  + ~"v.h +" + +33  + ~"8912.h +" + +34  + ~"gui.h +" + +35  + ~"disk.h +" + +36  + ~"mڙ.h +" + +37  + ~"6551.h +" + +38  + ~"mache.h +" + +39  + ~"feq.h +" + +42 +SDL_Sur + * +sn +; + +43  +xtze + * +tz +[ +NUM_TZ +]; + +46  + sq_t + + +48  + mme +[512]; + +49  + mshowme +[40]; + +50 +SDL_bo + + misd +; + +54  + sq_xtbox + + +56 * + mbuf +; + +57  + mx +, + my +, + mw +; + +58  + mmaxn +, + m +, + mos +, + mvpos +; + +62  +q_xtbox + + geqf_tbox +[] = { { +NULL +, 7, 28, 32, 4096, 0, 0, 0 }, + +63 { +NULL +, 7, 30, 32, 512, 0, 0, 0 } }; + +66  + geqf_size +=0, + geqf_ud +=0, + geqf_cgad +=2; + +67  +q_t + * + geqfes += +NULL +; + +68  + geqf_icktime +=0; + +70 +SDL_bo + + $_feque + +mache + * +ic + ) + +72 if! + `loc_xtze + +ic +, +TZ_FILEREQ +, 160, 48, 40, 32, "Fes" ) )  +SDL_FALSE +; + +74  +SDL_TRUE +; + +75 + } +} + +77  + $shut_feque + +mache + * +ic + ) + +79 + `_xtze + +ic +, +TZ_FILEREQ + ); + +80 + } +} + +83  + $feq_nd + +mache + * +ic + ) + +85 +ic +-> + `nd_beg +( oric ); + +87 +ic +-> + `nd_video +ic, +SDL_TRUE + ); + +88 +ic +-> + `nd_xtze +ic, +TZ_FILEREQ + ); + +90 +ic +-> + `nd_d +( oric ); + +91 + } +} + +94  + $feq_addt + +SDL_bo + +isd +, * +me +, * +showme + ) + +96  +q_t + * +tmpf +; + +97  +i +, +j +; + +100 if! +eqfes + ) || ( +eqf_ud + > +eqf_size + ) ) + +103 +tmpf + = ( +q_t + *) + `loc + +eqfes +, q_* ( +eqf_size ++8) ); + +104 if! +tmpf + ) ; + +106 +eqfes + = +tmpf +; + +107 +eqf_size + += 8; + +111 +j + = 0; + +112 if +eqf_ud + > 0 ) + +114 if +isd + ) + +116  +j +=1; j< +eqf_ud +; j++ ) + +118 if + `rcmp + +me +, +eqfes +[ +j +].name ) <= 0 ) ; + +119 if! +eqfes +[ +j +]. +isd + ) ; + +122  +j +=1; j< +eqf_ud +; j++ ) + +123 if! +eqfes +[ +j +]. +isd + ) ; + +125  ; +j +< +eqf_ud +; j++ ) + +126 if + `rcmp + +me +, +eqfes +[ +j +].name ) <= 0 ) ; + +130 if +j + < +eqf_ud + ) + +132  +i += +eqf_ud +; i> +j +; i-- ) + +133 +eqfes +[ +i +] = freqfiles[i-1]; + +138 +eqfes +[ +j +]. +isd + = isdir; + +139 + `y + +eqfes +[ +j +]. +me +,ame, 512 ); + +140 + `y + +eqfes +[ +j +]. +showme +, showname, 38 ); + +141 +eqfes +[ +j +]. +me +[511] = 0; + +142 +eqfes +[ +j +]. +showme +[37] = 0; + +145 +eqf_ud +++; + +146 + } +} + +149  +SDL_bo + + $feq_sn +* +th + ) + +151 +DIR + * +dh +; + +152  +dt + * +de +; + +153  + + +sb +; + +154 * +od +, * +h +; + +156 +h + = +th +; + +157 #ide +__amigaos4__ + + +158 if! +th +[0] ) + +159 +h + = "."; + +162 +eqf_ud + = 0; + +164 +dh + = + `ݒd + +h + ); + +165 if! +dh + )  +SDL_FALSE +; + +167 +od + = + `gcwd + +NULL +, 0 ); + +168 + `chd + +h + ); + +170 + `feq_addt + +SDL_TRUE +, "", "[Parent]" ); + +172  ( +de + = + `add + +dh + ) ) ) + +174 if + `rcmp + +de +-> +d_me +, "." ) == 0 ) || + +175 + `rcmp + +de +-> +d_me +, ".." ) == 0 ) ) + +177 + ` + +de +-> +d_me +, & +sb + ); + +178 + `feq_addt + + `S_ISDIR +( +sb +. +_mode +), +de +-> +d_me +, de->d_name ); + +181 + `od + +dh + ); + +183 + `chd + +od + ); + +184 + ` + +od + ); + +185  +SDL_TRUE +; + +186 + } +} + +189  + $feq_showfes + +offt +,  +cfe + ) + +191  +i +, +j +, +o +; + +194 if +eqf_cgad + != 2 ) + +195 +cfe + = -1; + +197  +i +=0; i<26; i++ ) + +200 if( +i ++ +offt +< +eqf_ud + ) + +201 + `tztc + +tz +[ +TZ_FILEREQ +], +eqfes +[ +i ++ +offt +]. +isd + ? 1 : 0, (i+offt)== +cfe + ? 7 : 6 ); + +203 + `tztc + +tz +[ +TZ_FILEREQ +], 0, 6 ); + +206 +o + = ( +i ++1)* +tz +[ +TZ_FILEREQ +]-> +w ++1; + +207  +j +=0; j<38; j++, +o +++ ) + +209 +tz +[ +TZ_FILEREQ +]-> +fc +[ +o +] =z[TZ_FILEREQ]-> +cfc +; + +210 +tz +[ +TZ_FILEREQ +]-> +bc +[ +o +] =z[TZ_FILEREQ]-> +cbc +; + +211 +tz +[ +TZ_FILEREQ +]-> +tx +[ +o +] = 32; + +214 if( +i ++ +offt +> +eqf_ud + ) + +218 + `tzos + +tz +[ +TZ_FILEREQ +], 1, +i ++1, +eqfes +[i+ +offt +]. +showme + ); + +220 + } +} + +223  + $feq_box + +q_xtbox + * +tb +, * +buf + ) + +226 +tb +-> +buf + = buf; + +227 +tb +-> + + = + ` + +buf + ); + +230 +tb +-> +os + =b-> + +; + +231 +tb +-> +vpos + =b-> + + > (tb-> +w +-1) ?b->slen-(tb->w-1) : 0; + +232 + } +} + +235  + $feq_dwtbox + +q_xtbox + * +tb +, +SDL_bo + +aive + ) + +237  +i +, +j +, +o +; + +239 + `tztc + +tz +[ +TZ_FILEREQ +], 0, +aive + ? 7 : 6 ); + +240 +o + = ( +tb +-> +y +* +tz +[ +TZ_FILEREQ +]-> +w +)+tb-> +x +; + +241  +i +=0, +j += +tb +-> +vpos +; i +w +; i++, +o +++, j++ ) + +243 if +aive + ) && ( +j +== +tb +-> +os + ) ) + +245 +tz +[ +TZ_FILEREQ +]-> +fc +[ +o +] =z[TZ_FILEREQ]-> +cbc +; + +246 +tz +[ +TZ_FILEREQ +]-> +bc +[ +o +] =z[TZ_FILEREQ]-> +cfc +; + +248 +tz +[ +TZ_FILEREQ +]-> +fc +[ +o +] =z[TZ_FILEREQ]-> +cfc +; + +249 +tz +[ +TZ_FILEREQ +]-> +bc +[ +o +] =z[TZ_FILEREQ]-> +cbc +; + +251 if +j + < +tb +-> + + ) + +252 +tz +[ +TZ_FILEREQ +]-> +tx +[ +o +] = +tb +-> +buf +[ +j +]; + +254 +tz +[ +TZ_FILEREQ +]-> +tx +[ +o +] = 32; + +256 + } +} + +260  + $feq_tfbox + +cfe +, * +ame + ) + +262 if +cfe + < 0 ) || ( cf> +eqf_ud + ) || + +263 +eqfes +[ +cfe +]. +isd + ) ) + +265 +ame +[0] = 0; + +266 +eqf_tbox +[1]. +os +=0; + +267 +eqf_tbox +[1]. +vpos +=0; + +268 +eqf_tbox +[1]. + +=0; + +272 + `y + +ame +, +eqfes +[ +cfe +]. +me +, 512 ); + +273 +ame +[511] = 0; + +274 + `feq_box +& +eqf_tbox +[1], +ame + ); + +275 + } +} + +279 + mACTION_NONE + = 0, + +280 + mACTION_SELECTITEM +, + +281 + mACTION_PAGEUP +, + +282 + mACTION_PAGEDOWN + + +291 +SDL_bo + + $feque + +mache + * +ic +, * +t +, * +th +, * +ame +,  +ty + ) + +293 +SDL_Evt + +evt +; + +294  +q_xtbox + * +tb +; + +295  +t +=0, +cfe +=0, +i +, +mx +, +my +, +mick +; + +296 +SDL_bo + +shiy + = +SDL_FALSE +, +wasunicode +; + +297  +di +; + +299 +wasunicode + = + `SDL_COMPAT_EbUNICODE + +SDL_TRUE + ); + +300 + `SDL_COMPAT_EbKeyRt + +SDL_DEFAULT_REPEAT_DELAY +, +SDL_DEFAULT_REPEAT_INTERVAL + ); + +302 + `feq_box +& +eqf_tbox +[0], +th + ); + +303 + `feq_box +& +eqf_tbox +[1], +ame + ); + +305 + `tz + +tz +[ +TZ_FILEREQ +], +t + ); + +306 + `tztc + +tz +[ +TZ_FILEREQ +], 2, 3 ); + +307 + `tzos + +tz +[ +TZ_FILEREQ +], 1, 28, "Path:" ); + +308 + `tzos + +tz +[ +TZ_FILEREQ +], 1, 30, "File:" ); + +310 if! + `feq_sn + +th + ) ) + +312 if +th +[0] ) + +314 +th +[0] = 0; + +315 + `feq_box +& +eqf_tbox +[0], +th + ); + +316 if! + `feq_sn + +th + ) ) + +318 + `SDL_COMPAT_EbUNICODE + +wasunicode + ); + +319 + `SDL_COMPAT_EbKeyRt + +wasunicode + ? +SDL_DEFAULT_REPEAT_DELAY + : 0, wasunicod? +SDL_DEFAULT_REPEAT_INTERVAL + : 0 ); + +320  +SDL_FALSE +; + +323 + `SDL_COMPAT_EbUNICODE + +wasunicode + ); + +324 + `SDL_COMPAT_EbKeyRt + +wasunicode + ? +SDL_DEFAULT_REPEAT_DELAY + : 0, wasunicod? +SDL_DEFAULT_REPEAT_INTERVAL + : 0 ); + +325  +SDL_FALSE +; + +328 + `feq_showfes + +t +, +cfe + ); + +329 + `feq_dwtbox +& +eqf_tbox +[0], +eqf_cgad +==0 ); + +330 + `feq_dwtbox +& +eqf_tbox +[1], +eqf_cgad +==1 ); + +331 + `feq_nd + +ic + ); + +335 if! + `SDL_WaEvt +& +evt + ) ) + +337 + `SDL_COMPAT_EbUNICODE + +wasunicode + ); + +338 + `SDL_COMPAT_EbKeyRt + +wasunicode + ? +SDL_DEFAULT_REPEAT_DELAY + : 0, wasunicod? +SDL_DEFAULT_REPEAT_INTERVAL + : 0 ); + +339  +SDL_FALSE +; + +342 +mx + = -1; + +343 +my + = -1; + +344 +mick + = 0; + +345 +di + = +ACTION_NONE +; + +346  +evt +. +ty + ) + +348  +SDL_MOUSEMOTION +: + +349 +mx + = ( +evt +. +mi +. +x + - +tz +[ +TZ_FILEREQ +]->x)/8; + +350 +my + = ( +evt +. +mi +. +y + - +tz +[ +TZ_FILEREQ +]->y)/12; + +353  +SDL_MOUSEBUTTONDOWN +: + +354 if +evt +. +bu +.bu = +SDL_BUTTON_LEFT + ) + +356 +mx + = ( +evt +. +bu +. +x + - +tz +[ +TZ_FILEREQ +]->x)/8; + +357 +my + = ( +evt +. +bu +. +y + - +tz +[ +TZ_FILEREQ +]->y)/12; + +358 +mick + = + `SDL_GTicks +(); + +363  +evt +. +ty + ) + +365  +SDL_COMPAT_ACTIVEEVENT +: + +366 if( + `SDL_COMPAT_IsAFocud +& +evt + ) ) { + +367 + `feq_nd + +ic + ); + +371  +SDL_MOUSEBUTTONDOWN +: + +372 if +mx + < 1 ) || ( mx > 38 ) ) + +375 if +my + == 28 ) || ( my == 30 ) ) + +377 +eqf_cgad + = ( +my +-28)/2; + +378 + `feq_showfes + +t +, +cfe + ); + +379 + `feq_dwtbox +& +eqf_tbox +[0], +eqf_cgad +==0 ); + +380 + `feq_dwtbox +& +eqf_tbox +[1], +eqf_cgad +==1 ); + +381 + `feq_nd + +ic + ); + +385 if +my + < 1 ) || ( my > 26 ) ) + +388 +eqf_cgad + = 2; + +390 +i + = ( +my +-1)- +t +; + +391 if +i + > +eqf_ud + ) i = freqf_used-1; + +393 if +cfe + ! +i + ) + +395 +cfe + = +i +; + +396 + `feq_tfbox + +cfe +, +ame + ); + +397 + `feq_showfes + +t +, +cfe + ); + +398 + `feq_dwtbox +& +eqf_tbox +[1], 0 ); + +399 + `feq_nd + +ic + ); + +400 +eqf_icktime + = +mick +; + +404 if +eqf_icktime + == 0 ) || + +405 ( +mick +- +eqf_icktime +) >= 2000 ) ) + +407 +eqf_icktime + = +mick +; + +411 +eqf_icktime + = 0; + +412 +di + = +ACTION_SELECTITEM +; + +415  +SDL_KEYUP +: + +416  +evt +. +key +. +keysym +. +sym + ) + +418  +SDLK_LSHIFT +: + +419  +SDLK_RSHIFT +: + +420 +shiy + = +SDL_FALSE +; + +423  +SDLK_ESCAPE +: + +424 + `SDL_COMPAT_EbUNICODE + +wasunicode + ); + +425 + `SDL_COMPAT_EbKeyRt + +wasunicode + ? +SDL_DEFAULT_REPEAT_DELAY + : 0, wasunicod? +SDL_DEFAULT_REPEAT_INTERVAL + : 0 ); + +426  +SDL_FALSE +; + +428  +SDLK_RETURN +: + +429  +SDLK_KP_ENTER +: + +430  +eqf_cgad + ) + +433 +cfe + = +t + = 0; + +434 if! + `feq_sn + +th + ) ) + +436 if +th +[0] ) + +438 +th +[0] = 0; + +439 + `feq_box +& +eqf_tbox +[0], +th + ); + +440 if! + `feq_sn + +th + ) ) + +442 + `SDL_COMPAT_EbUNICODE + +wasunicode + ); + +443 + `SDL_COMPAT_EbKeyRt + +wasunicode + ? +SDL_DEFAULT_REPEAT_DELAY + : 0, wasunicod? +SDL_DEFAULT_REPEAT_INTERVAL + : 0 ); + +444  +SDL_FALSE +; + +447 + `SDL_COMPAT_EbUNICODE + +wasunicode + ); + +448 + `SDL_COMPAT_EbKeyRt + +wasunicode + ? +SDL_DEFAULT_REPEAT_DELAY + : 0, wasunicod? +SDL_DEFAULT_REPEAT_INTERVAL + : 0 ); + +449  +SDL_FALSE +; + +452 + `feq_showfes + +t +, +cfe + ); + +453 + `feq_dwtbox +& +eqf_tbox +[0], +eqf_cgad +==0 ); + +454 + `feq_dwtbox +& +eqf_tbox +[1], +eqf_cgad +==1 ); + +455 + `feq_nd + +ic + ); + +459 + `SDL_COMPAT_EbUNICODE + +wasunicode + ); + +460 + `SDL_COMPAT_EbKeyRt + +wasunicode + ? +SDL_DEFAULT_REPEAT_DELAY + : 0, wasunicod? +SDL_DEFAULT_REPEAT_INTERVAL + : 0 ); + +461  +SDL_TRUE +; + +464 +di + = +ACTION_SELECTITEM +; + +474  +SDL_KEYDOWN +: + +475  +evt +. +key +. +keysym +. +sym + ) + +477  +SDLK_LSHIFT +: + +478  +SDLK_RSHIFT +: + +479 +shiy + = +SDL_TRUE +; + +482  +SDLK_TAB +: + +483 if +shiy + ) + +484 +eqf_cgad + = (freqf_cgad+2)%3; + +486 +eqf_cgad + = (freqf_cgad+1)%3; + +487 + `feq_showfes + +t +, +cfe + ); + +488 + `feq_dwtbox +& +eqf_tbox +[0], +eqf_cgad +==0 ); + +489 + `feq_dwtbox +& +eqf_tbox +[1], +eqf_cgad +==1 ); + +490 + `feq_nd + +ic + ); + +493  +SDLK_UP +: + +494 if +eqf_cgad + != 2 ) + +496 +eqf_cgad + = 2; + +497 + `feq_showfes + +t +, +cfe + ); + +498 + `feq_dwtbox +& +eqf_tbox +[0], +eqf_cgad +==0 ); + +499 + `feq_dwtbox +& +eqf_tbox +[1], +eqf_cgad +==1 ); + +500 + `feq_nd + +ic + ); + +504 if +cfe + <= 0 ) ; + +505 if +shiy + ) + +507 +di + = +ACTION_PAGEUP +; + +510 +cfe +--; + +511 if +cfe + < +t + )op = cfile; + +512 + `feq_tfbox + +cfe +, +ame + ); + +513 + `feq_showfes + +t +, +cfe + ); + +514 + `feq_dwtbox +& +eqf_tbox +[1], +SDL_FALSE + ); + +515 + `feq_nd + +ic + ); + +518  +SDLK_DOWN +: + +519 if +eqf_cgad + != 2 ) + +521 +eqf_cgad + = 2; + +522 + `feq_showfes + +t +, +cfe + ); + +523 + `feq_dwtbox +& +eqf_tbox +[0], +eqf_cgad +==0 ); + +524 + `feq_dwtbox +& +eqf_tbox +[1], +eqf_cgad +==1 ); + +525 + `feq_nd + +ic + ); + +529 if +cfe + >( +eqf_ud +-1) ) ; + +530 if +shiy + ) + +532 +di + = +ACTION_PAGEDOWN +; + +535 +cfe +++; + +536 if +cfe + > ( +t ++25) )op = cfile-25; + +537 + `feq_tfbox + +cfe +, +ame + ); + +538 + `feq_showfes + +t +, +cfe + ); + +539 + `feq_dwtbox +& +eqf_tbox +[1], +SDL_FALSE + ); + +540 + `feq_nd + +ic + ); + +543  +SDLK_PAGEUP +: + +544 if +eqf_cgad + != 2 ) + +546 +eqf_cgad + = 2; + +547 + `feq_showfes + +t +, +cfe + ); + +548 + `feq_dwtbox +& +eqf_tbox +[0], +eqf_cgad +==0 ); + +549 + `feq_dwtbox +& +eqf_tbox +[1], +eqf_cgad +==1 ); + +550 + `feq_nd + +ic + ); + +554 +di + = +ACTION_PAGEUP +; + +557  +SDLK_PAGEDOWN +: + +558 if +eqf_cgad + != 2 ) + +560 +eqf_cgad + = 2; + +561 + `feq_showfes + +t +, +cfe + ); + +562 + `feq_dwtbox +& +eqf_tbox +[0], +eqf_cgad +==0 ); + +563 + `feq_dwtbox +& +eqf_tbox +[1], +eqf_cgad +==1 ); + +564 + `feq_nd + +ic + ); + +568 +di + = +ACTION_PAGEDOWN +; + +571  +SDLK_BACKSPACE +: + +572 if +eqf_cgad + == 2 ) ; + +573 +tb + = & +eqf_tbox +[ +eqf_cgad +]; + +574 if +tb +-> +os + < 1 ) ; + +575  +i += +tb +-> +os +-1; i + +; i++ ) + +576 +tb +-> +buf +[ +i +] =b->buf[i+1]; + +577 +tb +-> + +--; + +578 if +tb +-> + + < 0 ) + +580 +tb +-> + + = 0; + +581 +tb +-> +os + = 0; + +584  +SDLK_LEFT +: + +585 if +eqf_cgad + == 2 ) ; + +586 +tb + = & +eqf_tbox +[ +eqf_cgad +]; + +587 if +tb +-> +os + > 0 )b->cpos--; + +588 if +tb +-> +os + +vpos + )b->vpos =b->cpos; + +589 if +tb +-> +os + >b-> +vpos ++tb-> +w +) )b->vpos =b->cpos-(tb->w-1); + +590 if +tb +-> +vpos + < 0 )b->vpos = 0; + +591 + `feq_dwtbox + +tb +, +SDL_TRUE + ); + +592 + `feq_nd + +ic + ); + +595  +SDLK_RIGHT +: + +596 if +eqf_cgad + == 2 ) ; + +597 +tb + = & +eqf_tbox +[ +eqf_cgad +]; + +598 if +tb +-> +os + + + )b->cpos++; + +599 if +tb +-> +os + +vpos + )b->vpos =b->cpos; + +600 if +tb +-> +os + >b-> +vpos ++tb-> +w +) )b->vpos =b->cpos-(tb->w-1); + +601 if +tb +-> +vpos + < 0 )b->vpos = 0; + +602 + `feq_dwtbox + +tb +, +SDL_TRUE + ); + +603 + `feq_nd + +ic + ); + +606  +SDLK_DELETE +: + +607 if +eqf_cgad + == 2 ) ; + +608 +tb + = & +eqf_tbox +[ +eqf_cgad +]; + +609 if +tb +-> +os + >tb-> + + ) ; + +610  +i += +tb +-> +os +; i + +; i++ ) + +611 +tb +-> +buf +[ +i +] =b->buf[i+1]; + +612 +tb +-> + +--; + +613 if +tb +-> + + < 0 ) + +615 +tb +-> + + = 0; + +616 +tb +-> +os + = 0; + +618 + `feq_dwtbox + +tb +, +SDL_TRUE + ); + +619 + `feq_nd + +ic + ); + +626  + `SDL_COMPAT_GKeysymUnicode + +evt +. +key +. +keysym + ) ) + +629 if +eqf_cgad + == 2 ) ; + +631 if + `SDL_COMPAT_GKeysymUnicode + +evt +. +key +. +keysym + ) > 31 ) && ( SDL_COMPAT_GetKeysymUnicode(vent.key.keysym ) < 127 ) ) + +633 +tb + = & +eqf_tbox +[ +eqf_cgad +]; + +634 if +tb +-> + + >b-> +maxn +-1) ) ; + +635  +i += +tb +-> + +; i>b-> +os +; i-- ) + +636 +tb +-> +buf +[ +i +] =b->buf[i-1]; + +637 +tb +-> +buf +[tb-> +os +] = + `SDL_COMPAT_GKeysymUnicode + +evt +. +key +. +keysym + ); + +638 +tb +-> + +++; + +639 +tb +-> +os +++; + +640 +tb +-> +buf +[tb-> +os +] = 0; + +641 if +tb +-> +os + +vpos + )b->vpos =b->cpos; + +642 if +tb +-> +os + >b-> +vpos ++tb-> +w +) )b->vpos =b->cpos-(tb->w-1); + +643 if +tb +-> +vpos + < 0 )b->vpos = 0; + +644 + `feq_dwtbox + +tb +, +SDL_TRUE + ); + +645 + `feq_nd + +ic + ); + +651  +SDL_QUIT +: + +652 + `mumode + +ic +, +NULL +, +EM_PLEASEQUIT + ); + +653  +SDL_FALSE +; + +659  +di + ) + +661  +ACTION_PAGEUP +: + +662 if +cfe + > +t + ) + +664 +cfe + = +t +; + +666 +t + -= 25; + +667 if +t + < 0 )op = 0; + +668 +cfe + = +t +; + +670 + `feq_showfes + +t +, +cfe + ); + +671 + `feq_dwtbox +& +eqf_tbox +[0], +eqf_cgad +==0 ); + +672 + `feq_dwtbox +& +eqf_tbox +[1], +eqf_cgad +==1 ); + +673 + `feq_nd + +ic + ); + +676  +ACTION_PAGEDOWN +: + +677 if +cfe + < ( +t ++25) ) + +679 +cfe + = +t ++25; + +681 +cfe + += 25; + +683 if +cfe + > ( +eqf_ud +-1) ) cfile = freqf_used-1; + +684 +t + = +cfe +-25; + +685 if +t + < 0 )op = 0; + +686 + `feq_showfes + +t +, +cfe + ); + +687 + `feq_dwtbox +& +eqf_tbox +[0], +eqf_cgad +==0 ); + +688 + `feq_dwtbox +& +eqf_tbox +[1], +eqf_cgad +==1 ); + +689 + `feq_nd + +ic + ); + +692  +ACTION_SELECTITEM +: + +693 if +eqf_ud + <= 0 ) ; + +694 if +cfe +<=0 ) + +696 +i + = + ` + +th + )-1; + +697 if +i +<=0 ) ; + +698 if +th +[ +i +] = +PATHSEP + ) i--; + +699  +i + > -1 ) + +701 if +th +[ +i +] = +PATHSEP + ) ; + +702 +i +--; + +704 if +i +==-1 ) i++; + +705 +th +[ +i +] = 0; + +706 } if +eqfes +[ +cfe +]. +isd + ) { + +707 +i + = + ` + +th + )-1; + +708 if +i + < 0 ) + +710 +i +++; + +712 if +th +[ +i +] ! +PATHSEP + ) + +713 +i +++; + +715 if +i + > 0 ) +th +[i++] = +PATHSEP +; + +716 + `y +& +th +[ +i +], +eqfes +[ +cfe +]. +me +, 4096-i ); + +717 +th +[4095] = 0; + +719 + `SDL_COMPAT_EbUNICODE + +wasunicode + ); + +720 + `SDL_COMPAT_EbKeyRt + +wasunicode + ? +SDL_DEFAULT_REPEAT_DELAY + : 0, wasunicod? +SDL_DEFAULT_REPEAT_INTERVAL + : 0 ); + +721  +SDL_TRUE +; + +723 +cfe + = +t + = 0; + +724 + `feq_box +& +eqf_tbox +[0], +th + ); + +725 if! + `feq_sn + +th + ) ) + +727 if +th +[0] ) + +729 +th +[0] = 0; + +730 + `feq_box +& +eqf_tbox +[0], +th + ); + +731 if! + `feq_sn + +th + ) ) + +733 + `SDL_COMPAT_EbUNICODE + +wasunicode + ); + +734 + `SDL_COMPAT_EbKeyRt + +wasunicode + ? +SDL_DEFAULT_REPEAT_DELAY + : 0, wasunicod? +SDL_DEFAULT_REPEAT_INTERVAL + : 0 ); + +735  +SDL_FALSE +; + +738 + `SDL_COMPAT_EbUNICODE + +wasunicode + ); + +739 + `SDL_COMPAT_EbKeyRt + +wasunicode + ? +SDL_DEFAULT_REPEAT_DELAY + : 0, wasunicod? +SDL_DEFAULT_REPEAT_INTERVAL + : 0 ); + +740  +SDL_FALSE +; + +743 + `feq_showfes + +t +, +cfe + ); + +744 + `feq_dwtbox +& +eqf_tbox +[0], +eqf_cgad +==0 ); + +745 + `feq_dwtbox +& +eqf_tbox +[1], +eqf_cgad +==1 ); + +746 + `feq_nd + +ic + ); + +751 + `SDL_COMPAT_EbUNICODE + +wasunicode + ); + +752 + `SDL_COMPAT_EbKeyRt + +wasunicode + ? +SDL_DEFAULT_REPEAT_DELAY + : 0, wasunicod? +SDL_DEFAULT_REPEAT_INTERVAL + : 0 ); + +753  +SDL_FALSE +; + +754 + } +} + + @filereq_win32.c + +22  + ~ + +23  + ~ + +24  + ~ + +26  + #WANT_WMINFO + + + ) + +28  + ~"syem.h +" + +29  + ~"6502.h +" + +30  + ~"v.h +" + +31  + ~"8912.h +" + +32  + ~"disk.h +" + +33  + ~"gui.h +" + +34  + ~"mڙ.h +" + +35  + ~"6551.h +" + +36  + ~"mache.h +" + +37  + ~"feq.h +" + +39 +SDL_bo + + $_feque + +mache + * +ic + ) + +41  +SDL_TRUE +; + +42 + } +} + +44  + $shut_feque + +mache + * +ic + ) + +46 + } +} + +48 +SDL_bo + + $feque + +mache + * +ic +, * +t +, * +th +, * +ame +,  +ty + ) + +50 +SDL_SysWMfo + +wmi +; + +51 +OPENFILENAME + +o +; + +52 +HWND + +hwnd +; + +53  +tmp +[4096]; + +54  +i +; + +55 * +od +; + +57 + `ry + +tmp +, +ame + ); + +59 +hwnd + = +NULL +; + +60 + `SDL_VERSION +(& +wmi +. +vsi +); + +61 i( + `SDL_COMPAT_GWMInfo +(& +wmi +)) + +62 #i +SDL_MAJOR_VERSION + == 1 + +63 +hwnd + = ( +HWND +) +wmi +. +wdow +; + +65 +hwnd + = ( +HWND +) +wmi +. +fo +. +w +. +wdow +; + +68 + `ZoMemy +& +o +, ( ofn ) ); + +69 +o +. +lSuSize + = ( ofn ); + +70 +o +. +hwndOwr + = +hwnd +; + +71 +o +. +͡rFe + = +ame +; + +72 +o +. +nMaxFe + = 4096; + +74 +o +. +Fgs + = +OFN_PATHMUSTEXIST + | +OFN_FILEMUSTEXIST +; + +75  +ty + ) + +77  +FR_DISKSAVE +: + +78 +o +. +Fgs + = +OFN_PATHMUSTEXIST +; + +79  +FR_DISKLOAD +: + +80 +o +. +͡rFr + = "All Files\0*.*\0Disk Images (*.dsk)\0*.DSK\0"; + +81 +o +. +nFrIndex + = 2; + +84  +FR_TAPESAVETAP +: + +85 +o +. +Fgs + = +OFN_PATHMUSTEXIST +; + +86 +o +. +͡rFr + = "All Files\0*.*\0Tape Images (*.tap)\0*.TAP\0"; + +87 +o +. +nFrIndex + = 2; + +90  +FR_TAPESAVEORT +: + +91 +o +. +Fgs + = +OFN_PATHMUSTEXIST +; + +92 +o +. +͡rFr + = "All Files\0*.*\0Raw Tape Images (*.ort)\0*.ORT\0"; + +93 +o +. +nFrIndex + = 2; + +96  +FR_TAPELOAD +: + +97 +o +. +͡rFr + = "All Files\0*.*\0Tape Images (*.tap, *.ort, *.wav)\0*.TAP;*.ORT;*.WAV\0"; + +98 +o +. +nFrIndex + = 2; + +101  +FR_ROMS +: + +102 +o +. +͡rFr + = "All Files\0*.*\0Rom Images (*.rom)\0*.ROM\0"; + +103 +o +. +nFrIndex + = 2; + +106  +FR_SNAPSHOTSAVE +: + +107 +o +. +Fgs + = +OFN_PATHMUSTEXIST +; + +108  +FR_SNAPSHOTLOAD +: + +109 +o +. +͡rFr + = "All Files\0*.*\0Snapshot files (*.sna)\0*.SNA\0"; + +110 +o +. +nFrIndex + = 2; + +113  +FR_KEYMAPPINGSAVE +: + +114 +o +. +Fgs + = +OFN_PATHMUSTEXIST +; + +115  +FR_KEYMAPPINGLOAD +: + +116 +o +. +͡rFr + = "All Files\0*.*\0Keyboard Mapping files (*.kma)\0*.KMA\0"; + +117 +o +. +nFrIndex + = 2; + +121 +o +. +͡rFr + = "All Files\0*.*"; + +122 +o +. +nFrIndex + = 1; + +126 +o +. +͡rFeT + = +NULL +; + +127 +o +. +nMaxFeT + = 0; + +128 +o +. +͡rInlD + = +th +; + +130 +od + = + `gcwd + +NULL +, 0 ); + +132  +ty + ) + +134  +FR_SNAPSHOTSAVE +: + +135  +FR_DISKSAVE +: + +136 if! + `GSaveFeName +& +o + ) ) + +138 + `chd + +od + ); + +139 + ` + +od + ); + +140  +SDL_FALSE +; + +145 if! + `GOnFeName +& +o + ) ) + +147 + `chd + +od + ); + +148 + ` + +od + ); + +149  +SDL_FALSE +; + +154 + `chd + +od + ); + +155 + ` + +od + ); + +157 +i + = + ` + +o +. +͡rFe + ); + +158 if! +i + )  +SDL_FALSE +; + +160 +i +--; + +161  +o +. +͡rFe +[ +i +] ! +PATHSEP + ) + +163 if +i + == 0 ) ; + +164 +i +--; + +167 if +o +. +͡rFe +[ +i +] = +PATHSEP + ) && ( i < ( + ` +(ofn.lpstrFile)-1) ) ) + +169 +o +. +͡rFe +[ +i +] = 0; + +170 + `ry + +th +, +o +. +͡rFe + ); + +171 + `y + +ame +, & +o +. +͡rFe +[ +i ++1], 512 ); + +172 +ame +[511] = 0; + +174 +th +[0] = 0; + +175 + `y + +ame +, +o +. +͡rFe +, 512 ); + +176 +ame +[511] = 0; + +179  +SDL_TRUE +; + +180 + } +} + + @font.c + +22  + gtheft +[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + @gui.c + +28  + ~ + +29  + ~ + +30  + ~ + +31  + ~ + +32  + ~ + +34 #ifde +__amigaos4__ + + +35  + ~ + +38 #i +defed +( +__MORPHOS__ +|| defed( +__AROS__ +) + +39  + ~ + +40  + ~ + +44  + ~"syem.h +" + +45  + ~"6502.h +" + +46  + ~"v.h +" + +47  + ~"8912.h +" + +48  + ~"gui.h +" + +49  + ~"disk.h +" + +50  + ~"mڙ.h +" + +51  + ~"6551.h +" + +52  + ~"mache.h +" + +53  + ~"feq.h +" + +54  + ~"nd_sw.h +" + +55  + ~"nd_sw8.h +" + +56  + ~"nd_gl.h +" + +57  + ~"nd_nu.h +" + +58  + ~"u.h +" + +59  + ~".h +" + +60  + ~"joyick.h +" + +61  + ~"sh.h +" + +62  + ~"msgbox.h +" + +63  + ~"keybrd.h +" + +65  + ~"ugs/ch376/ch376.h +" + +66  + ~"ugs/ch376/ic_ch376_ug.h +" + +68 +SDL_bo + +fusn +; + +70  + gth +[4096], + gfe +[512]; + +71  + gdiskth +[4096], + gdiskfe +[512]; + +72  + gdiskth +[4096], + gdiskfe +[512]; + +73  + gavdiskth +[4096], + gavdiskfe +[512]; + +74  +moomfe +[]; + +75  +ic1romfe +[]; + +76  +mdisomfe +[]; + +77  +jasmomfe +[]; + +78  +avzromfe +[2][1024]; + +79  +bkfes +[8][1024]; + +80  + gth +[4096], + gfe +[512]; + +81  + gmpgth +[4096], + gmpgfe +[512]; + +82  + gfmp +[4096+512+4]; + +84 +SDL_bo + + geshus + = +SDL_TRUE +, + geshdisks + = SDL_TRUE, + geshavi + = SDL_TRUE, + gesh + = SDL_TRUE, + +85 + geshkeybrd + = +SDL_TRUE +; + +86  +avi_hd + * +vidp +; + +88 +SDL_bo + +ed_sdl_qu +; + +89 +SDL_AudioSc + +obed +; + +90 +Ut32 + +cyeme +; + +93  + #GIMG_W_DISK + 18 + + ) + +94  + #GIMG_W_TAPE + 20 + + ) + +95  + #GIMG_W_AVIR + 16 + + ) + +98  +guiimg + + ggimgs +[ +NUM_GIMG +] = { + +99 { +IMAGEPREFIX +"disk_ejeed.bmp", +GIMG_W_DISK +, 16, +NULL + }, + +100 { +IMAGEPREFIX +"disk_id.bmp", +GIMG_W_DISK +, 16, +NULL + }, + +101 { +IMAGEPREFIX +"disk_aive.bmp", +GIMG_W_DISK +, 16, +NULL + }, + +102 { +IMAGEPREFIX +"disk_modifd.bmp", +GIMG_W_DISK +, 16, +NULL + }, + +103 { +IMAGEPREFIX +"disk_modaive.bmp", +GIMG_W_DISK +, 16, +NULL + }, + +104 { +IMAGEPREFIX +"_ejeed.bmp", +GIMG_W_TAPE +, 16, +NULL + }, + +105 { +IMAGEPREFIX +"_u.bmp", +GIMG_W_TAPE +, 16, +NULL + }, + +106 { +IMAGEPREFIX +"_ay.bmp", +GIMG_W_TAPE +, 16, +NULL + }, + +107 { +IMAGEPREFIX +"_.bmp", +GIMG_W_TAPE +, 16, +NULL + }, + +108 { +IMAGEPREFIX +"_cd.bmp", +GIMG_W_TAPE +, 16, +NULL + }, + +109 { +IMAGEPREFIX +"avec.bmp", +GIMG_W_AVIR +, 16, +NULL + }, + +110 { +IMAGEPREFIX +"gfx_ic1kbd.bmp", 640, 240, +NULL + }, + +111 { +IMAGEPREFIX +"gfx_moskbd.bmp", 640, 240, +NULL + }, + +112 { +IMAGEPREFIX +"gfx_avzkbd.bmp", 640, 240, +NULL + }}; + +114 +SDL_bo + + gsoundavaab +, + gsound +; + +115 #i +defed +( +__lux__ +) + +116 +St16 + + gsounds + = 0; + +118 +St16 + + gsounds + = -32768; + +120 +SDL_bo + +miodisom_vid +, +jasmrom_vid +, +avzrom_vid +; + +123  + #GIMG_POS_SBARY + (480-16) + + ) + +124  + #GIMG_POS_TAPEX + (640-4- +GIMG_W_TAPE +) + + ) + +125  + #GIMG_POS_DISKX + ( +GIMG_POS_TAPEX +-(6+( +GIMG_W_DISK +*4))) + + ) + +126  + #GIMG_POS_AVIRECX + ( +GIMG_POS_DISKX +-(6+ +GIMG_W_AVIR +)) + + ) + +129  + gsgl +[] = { 0x00, 0x00, 0x00, + +154  + gg_fegroundc +[] = { 0, 0, 1, 1, 0, 2, 1 }; + +155  + gg_backgroundc +[] = { 10, 10, 0, 0, 14, 3, 0 }; + +156  + gg_fegroundcl +[] = { 1, 1, 0, 0, 0, 1, 0 }; + +157  + gg_backgroundcl +[] = { 11, 11, 12, 13, 15, 5, 9 }; + +158  + gg_mu_scheme + = 5; + +162  +xtze + * + gtz +[ +NUM_TZ +]; + +165  + gvtmp +[ +VSPTMPSIZE +]; + +168 +Ut32 + +amimve +; + +169 +SDL_bo + + gwpd += +SDL_FALSE +; + +172  +osdmu + * + gcmu + = +NULL +; + +173  + gcmuem + = 0; + +175 * + gacbackds +[ +ACIA_TYPE_LAST +] = { + +182  + gacbackdb +[32]; + +184  + $mufc +( +SDL_bo + +bSeed +{  (bSeed ? +g_fegroundcl +[ +g_mu_scheme +] : +g_fegroundc +[g_mu_scheme]); + } +} + +185  + $mubc +( +SDL_bo + +bSeed +{  (bSeed ? +g_backgroundcl +[ +g_mu_scheme +] : +g_backgroundc +[g_mu_scheme]); + } +} + +188  +toggˏnoi + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +189  +toggsound + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +190  + + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +191  +disk + +mache + * +ic +,  +osdmuem + * +mem +,  +drive + ); + +192  +tic + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +193  +toggˏturbo + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +194  +toggch376 +( +mache + * +ic +,  +osdmuem + * +mem +,  +dummy +); + +195  +toggautowd + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +196  +toggautot + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +197  +toggsymbާuto + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +198  +toggsyms + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +199  +toggvsynchack + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +200  +sw_nd_mode + +mache + * +ic +,  +osdmuem + * +mem +,  +wndmode + ); + +201  +toggˬio + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +202  +togghtch + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +203  +togg˷lgho + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +204  +toggsƚes + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +205  +toggligh + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +206  +toggacbackd + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +207  +tovock + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +208  +ve + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +209  +ld + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +210  +toggkeybrd + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +211  +defempg + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +212  +toggˡickykeys + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +213  +vempg + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +214  +ldmpg + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +215  +tmpg + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +216 #ifde +__CBCOPY__ + + +217  +bd_cy_gui + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +219 #ifde +__CBPASTE__ + + +220  +bd_e_gui + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +226  +osdmuem + + gmaems +[] = { { "Ine...", "T", 't', + +, 0, 0 }, + +227 { "Sav ouut...", "[F9]", +SDLK_F9 +, +toggˏp +, 0, 0 }, + +228 { "In disk 0...", "0", +SDLK_0 +, +disk +, 0, 0 }, + +229 { "In disk 1...", "1", +SDLK_1 +, +disk +, 1, 0 }, + +230 { "In disk 2...", "2", +SDLK_2 +, +disk +, 2, 0 }, + +231 { "In disk 3...", "3", +SDLK_3 +, +disk +, 3, 0 }, + +232 { +OSDMENUBAR +, +NULL +, 0, NULL, 0, 0 }, + +233 { "Savsh...", +NULL +, 0, +ve +, 0, 0 }, + +234 { "Ld spsh...", +NULL +, 0, +ld +, 0, 0 }, + +235 #i +defed +( +__CBCOPY__ +|| defed( +__CBPASTE__ +) + +236 { +OSDMENUBAR +, +NULL +, 0, NULL, 0, 0 }, + +238 #i +defed +( +__CBCOPY__ +) + +239 { "Cybrd", "[F11]", +SDLK_F11 +, +bd_cy_gui +, 0, 0 }, + +241 #i +defed +( +__CBPASTE__ +) + +242 { "Paom clbrd", "[F12]", +SDLK_F12 +, +bd_e_gui +,0, 0 }, + +244 { +OSDMENUBAR +, +NULL +, 0, NULL, 0, 0 }, + +245 { "Hdwtis...", "H", 'h', +gomu +, 1, 0 }, + +246 { "Auditis...", "A", 'a', +gomu +, 2, 0 }, + +247 { "Videtis...", "V", 'v', +gomu +, 4, 0 }, + +248 { "Keybrd ois...", "K", 'k', +gomu +, 7, 0 }, + +249 { "Debug ois...", "D", 'd', +gomu +, 3, 0 }, + +250 { "Ovock ois...", "C", 'c', +gomu +, 6, 0 }, + +251 { +OSDMENUBAR +, +NULL +, 0, NULL, 0, 0 }, + +252 { "Mڙ", "[F2]", +SDLK_F2 +, +mumode +, +EM_DEBUG +, 0 }, + +253 { "ReBu NMI", "[F3]", +SDLK_F3 +, +soợtic +, 0, 0 }, + +254 { "Hd Ret", "[F4]", +SDLK_F4 +, +tic +, 0, 0 }, + +255 { "Back", "\x17", +SDLK_BACKSPACE +, +mumode +, +EM_RUNNING +, 0 }, + +256 { +OSDMENUBAR +, +NULL +, 0, NULL, 0, 0 }, + +257 { "About", +NULL +, 0, +gomu +, 5, 0 }, + +258 { +OSDMENUBAR +, +NULL +, 0, NULL, 0, 0 }, + +259 { "Qu", +NULL +, 0, +mumode +, +EM_PLEASEQUIT +, 0 }, + +260 { +NULL +, } }; + +262  +osdmuem + + ghwݙems +[] = { { " Oric-1", "1", +SDLK_1 +, +swmach +, (0xffff<<16)| +MACH_ORIC1 +, 0 }, + +263 { " Oric-1 16K", "2", +SDLK_2 +, +swmach +, (0xffff<<16)| +MACH_ORIC1_16K +, 0 }, + +264 { " Atmos", "3", +SDLK_3 +, +swmach +, (0xffff<<16)| +MACH_ATMOS +, 0 }, + +265 { " Tet", "4", +SDLK_4 +, +swmach +, ( +DRV_NONE +<<16)| +MACH_TELESTRAT +, 0 }, + +266 { " Pvz 8D", "5", +SDLK_5 +, +swmach +, (0xffff<<16)| +MACH_PRAVETZ +, 0 }, + +267 { +OSDMENUBAR +, +NULL +, 0, NULL, 0, 0 }, + +268 { " Ndisk", "X", 'x', +tdrivy +, +DRV_NONE +, 0 }, + +269 { " Miodisc", "M", 'm', +tdrivy +, +DRV_MICRODISC +, 0 }, + +270 { " Jasm", "J", 'j', +tdrivy +, +DRV_JASMIN +, 0 }, + +272 { " Pvz 8D disk", "P", 'p', +tdrivy +, +DRV_PRAVETZ +, 0 }, + +273 { +OSDMENUBAR +, +NULL +, 0, NULL, 0, 0 }, + +274 { " Turb؏", +NULL +, 0, +toggˏturbo +, 0, 0 }, + +275 { " Autoe", +NULL +, 0, +toggautot +, 0, 0 }, + +276 { " Autewde", +NULL +, 0, +toggautowd +, 0, 0 }, + +277 { +OSDMENUBAR +, +NULL +, 0, NULL, 0, 0 }, + +278 { " VSynhack", +NULL +, 0, +toggvsynchack +, 0, 0 }, + +279 { " Ligh", +NULL +, 0, +toggligh +, 0, 0 }, + +280 { " Snڐ ", +NULL +, 0, +toggacbackd +, 0, 0 }, + +281 { " CH376 (Tet ", +NULL +, 0, +toggch376 +, 0, 0 }, + +283 { +OSDMENUBAR +, +NULL +, 0, NULL, 0, 0 }, + +284 { "Back", "\x17", +SDLK_BACKSPACE +, +gomu +, 0, 0 }, + +285 { +NULL +, } }; + +287  +osdmuem + + gauݙems +[] = { { " Soundbd", +NULL +, 0, +toggsound +, 0, 0 }, + +288 { " Tnoi", +NULL +, 0, +toggˏnoi +, 0, 0 }, + +289 { +OSDMENUBAR +, +NULL +, 0, NULL, 0, 0 }, + +290 { "Back", "\x17", +SDLK_BACKSPACE +, +gomu +, 0, 0 }, + +291 { +NULL +, } }; + +293  +osdmuem + + gkeݙems +[] = { { " Show keybrd", +NULL +, 0, +toggkeybrd +, 0, 0 }, + +294 { " Sticky mod keys", +NULL +, 0, +toggˡickykeys +,0, 0 }, + +295 { " Defmpg", +NULL +, 0, +defempg +, 0, 0 }, + +296 { "Savmpg...", +NULL +, 0, +vempg +, 0, 0 }, + +297 { "Ld mpg...", +NULL +, 0, +ldmpg +, 0, 0 }, + +298 { "Rempg", +NULL +, 0, +tmpg +, 0, 0 }, + +299 { +OSDMENUBAR +, +NULL +, 0, NULL, 0, 0 }, + +300 { "Back", "\x17", +SDLK_BACKSPACE +, +gomu +, 0, 0 }, + +301 { +NULL +, } }; + +305  +osdmuem + + gdbݙems +[] = { { " Autd symbޠfe", +NULL +, 0, +toggsymbާuto +, 0, 0 }, + +306 { " Ca-nsivsymbs", +NULL +, 0, +toggsyms +, 0, 0 }, + +307 { +OSDMENUBAR +, +NULL +, 0, NULL, 0, 0 }, + +308 { "Back", "\x17", +SDLK_BACKSPACE +, +gomu +, 0, 0 }, + +309 { +NULL +, } }; + +311 #ifde +__OPENGL_AVAILABLE__ + + +312  +osdmuem + + gvdݙems +[] = { { " OnGLdg", "O", 'o', +sw_nd_mode +, +RENDERMODE_GL +, 0 }, + +313 { " Sowndg", "S", 's', +sw_nd_mode +, +RENDERMODE_SW +, 0 }, + +314 { +OSDMENUBAR +, +NULL +, 0, NULL, 0, 0 }, + +315 { " Fusn", "[F8]", +SDLK_F8 +, +toggfusn +, 0, 0 }, + +316 { " Sƚes", "C", 'c', +toggsƚes +, 0, 0 }, + +317 { +OSDMENUBAR +, +NULL +, 0, NULL, 0, 0 }, + +318 { "Back", "\x17", +SDLK_BACKSPACE +, +gomu +, 0, 0 }, + +319 { +NULL +, } }; + +321  +osdmuem + + gvdݙems +[] = { { " Fusn", "F", 'f', +toggfusn +, 0, 0 }, + +322 { " Sƚes", "C", 'c', +toggsƚes +, 0, 0 }, + +323 { +OSDMENUBAR +, +NULL +, 0, NULL, 0, 0 }, + +324 { "Back", "\x17", +SDLK_BACKSPACE +, +gomu +, 0, 0 }, + +325 { +NULL +, } }; + +328  +osdmuem + + gglݙems +[] = { { " OnGLdg", "O", 'o', +sw_nd_mode +, +RENDERMODE_GL +, 0 }, + +329 { " Sowndg", "S", 's', +sw_nd_mode +, +RENDERMODE_SW +, 0 }, + +330 { +OSDMENUBAR +, +NULL +, 0, NULL, 0, 0 }, + +331 { " Fusn", "F", 'f', +toggfusn +, 0, 0 }, + +332 { " 50Hz/60Hzeio", "R", 'r', +toggˬio +, 0, 0 }, + +333 { " Hizڏȡtch", "H", 'h', +togghtch +, 0, 0 }, + +334 { " Sƚes", "C", 'c', +toggsƚes +, 0, 0 }, + +335 { " PAL ghog", "P", 'p', +togg˷lgho +, 0, 0 }, + +336 { +OSDMENUBAR +, +NULL +, 0, NULL, 0, 0 }, + +337 { "Back", "\x17", +SDLK_BACKSPACE +, +gomu +, 0, 0 }, + +338 { +NULL +, } }; + +340  +osdmuem + + gaboutems +[] = { { "", +NULL +, 0, NULL, 0, 0 }, + +341 { +APP_NAME_FULL +, +NULL +, 0, NULL, 0, +OMIF_BRIGHT +| +OMIF_CENTRED + }, + +342 { "hps://ghub.com/-gd/icu", +NULL +, 0, +gose +, 0, +OMIF_CENTRED + }, + +343 { "", +NULL +, 0, NULL, 0, 0 }, + +344 { "(C)" +APP_YEAR + " P Gd", +NULL +, 0, NULL, 0, +OMIF_BRIGHT +| +OMIF_CENTRED + }, + +345 { "hp://www.rgd.g.uk", +NULL +, 0, +gose +, 0, +OMIF_CENTRED + }, + +346 { "", +NULL +, 0, NULL, 0, 0 }, + +347 { "Addiڮrogmmg", +NULL +, 0, NULL, 0, +OMIF_BRIGHT +| +OMIF_CENTRED + }, + +348 { "FncoiRev", +NULL +, 0, NULL, 0, +OMIF_CENTRED + }, + +349 { "SHaubth", +NULL +, 0, NULL, 0, +OMIF_CENTRED + }, + +350 { "Axd Devt", +NULL +, 0, NULL, 0, +OMIF_CENTRED + }, + +351 { "Ibisum", +NULL +, 0, NULL, 0, +OMIF_CENTRED + }, + +352 { "Kam Biskri", +NULL +, 0, NULL, 0, +OMIF_CENTRED + }, + +353 { "Iss", +NULL +, 0, NULL, 0, +OMIF_CENTRED + }, + +354 { "Pri Tgu", +NULL +, 0, NULL, 0, +OMIF_CENTRED + }, + +355 { "", +NULL +, 0, NULL, 0, 0 }, + +356 { +OSDMENUBAR +, +NULL +, 0, NULL, 0, 0 }, + +357 { "Back", "\x17", +SDLK_BACKSPACE +, +gomu +, 0, 0 }, + +358 { +NULL +, } }; + +360  +osdmuem + + govݙems +[] = { { " 1mhz (Ne)", "1", '1', +tovock +, 0, 0 }, + +361 { " 2mhz", "2", '2', +tovock +, 1, 0 }, + +362 { " 4mhz", "3", '3', +tovock +, 2, 0 }, + +363 { " 8mhz", "4", '4', +tovock +, 3, 0 }, + +364 { " 16mhz", "5", '5', +tovock +, 4, 0 }, + +365 { " 32mhz", "6", '6', +tovock +, 5, 0 }, + +366 { " 64mhz", "7", '7', +tovock +, 6, 0 }, + +367 { +OSDMENUBAR +, +NULL +, 0, NULL, 0, 0 }, + +368 { "Back", "\x17", +SDLK_BACKSPACE +, +gomu +,0, 0 }, + +369 { +NULL +, } }; + +371  + #LAST_ITEM +( +x +(((x)/( +osdmuem +))-2) + + ) + +373  +osdmu + + gmus +[] = { { "Ma Mu", +LAST_ITEM +( +maems +)-4, mainitems }, + +374 { "Hdwtis", +LAST_ITEM +( +hwݙems +), hwopitems }, + +375 { "Auditis", +LAST_ITEM +( +auݙems +),uopitems }, + +376 { "Debug ois", +LAST_ITEM +( +dbݙems +), dbopitems }, + +377 { "Videtis", +LAST_ITEM +( +vdݙems +), vdopitems }, + +378 { "AbouOricu", +LAST_ITEM +( +aboutems +),boutitems }, + +379 { "Ovock", +LAST_ITEM +( +ovݙems +), ovopitems }, + +380 { "Keybrd ois", +LAST_ITEM +( +keݙems +), keopitems }}; + +383 +SDL_bo + + $gimg_ld + +guiimg + * +gi + ) + +385 +SDL_RWs + * +f +; + +386 +Ut8 + +hdrbuf +[640*3]; + +387 +St32 + +x +, +y +; + +388 +SDL_bo + +feok +; + +391 +f + = + `SDL_RWFromFe + +gi +-> +fame +, "rb" ); + +392 if! +f + ) + +394 + `r_tf +"guUbˁݒ '%s'\n", +gi +-> +fame + ); + +395 + `r_tf +("SDLr : %s\n", + `SDL_GE +()); + +396  +SDL_FALSE +; + +400 if + `SDL_RWad + +f +, +hdrbuf +, 54, 1 ) != 1 ) + +402 + `r_tf +"E܄dg '%s'\n", +gi +-> +fame + ); + +403 + `SDL_RWo + +f + ); + +404  +SDL_FALSE +; + +407 +feok + = +SDL_TRUE +; + +408 if + `cmp +(*) +hdrbuf +, "BM", 2 ) !0 ) +feok + = +SDL_FALSE +; + +409 if(( +hdrbuf +[21]<<24)|(hdrbuf[20]<<16)|(hdrbuf[19]<<8)|hdrbuf[18]! +gi +-> +w + ) +feok + = +SDL_FALSE +; + +410 if(( +hdrbuf +[25]<<24)|(hdrbuf[24]<<16)|(hdrbuf[23]<<8)|hdrbuf[22]! +gi +-> +h + ) +feok + = +SDL_FALSE +; + +411 if(( +hdrbuf +[27]<<8)|hdrbuf[26]!1 ) +feok + = +SDL_FALSE +; + +412 if(( +hdrbuf +[29]<<8)|hdrbuf[28]!24 ) +feok + = +SDL_FALSE +; + +413 if(( +hdrbuf +[33]<<24)|(hdrbuf[32]<<16)|(hdrbuf[31]<<8)|hdrbuf[30]!0 ) +feok + = +SDL_FALSE +; + +415 if! +feok + ) + +417 + `r_tf +"'%s'dtb%dx%d, uncomesd, 24-b BMP image\n", +gi +-> +fame +, gi-> +w +, gi-> +h + ); + +418 + `SDL_RWo + +f + ); + +419  +SDL_FALSE +; + +423 if! +gi +-> +buf + ) + +424 +gi +-> +buf + = + `mloc +gi-> +w + * gi-> +h + * 3 ); + +426 if! +gi +-> +buf + ) + +428 + `r_tf +( "Out of memory\n" ); + +429 + `SDL_RWo + +f + ); + +430  +SDL_FALSE +; + +434  +y += +gi +-> +h +-1; y>=0; y-- ) + +436 + `SDL_RWad + +f +, +hdrbuf +, (( +gi +-> +w +*3)+3)&0xfffffffc, 1 ); + +437  +x +=0; x< +gi +-> +w +; x++ ) + +439 +gi +-> +buf +[( +y +*gi-> +w ++ +x +)*3+0] = +hdrbuf +[x*3+2]; + +440 +gi +-> +buf +[( +y +*gi-> +w ++ +x +)*3+1] = +hdrbuf +[x*3+1]; + +441 +gi +-> +buf +[( +y +*gi-> +w ++ +x +)*3+2] = +hdrbuf +[x*3]; + +445 + `SDL_RWo + +f + ); + +447  +SDL_TRUE +; + +448 + } +} + +451  + $dw_usb + +mache + * +ic + ) + +453 i( +ic +-> +usb_mode + = +STATUSBARMODE_NONE +) + +454 +ic +-> + `nd_r_ +0, +GIMG_POS_SBARY +, 640, 480-GIMG_POS_SBARY ); + +456 +ic +-> + `nd_gimg + +GIMG_STATUSBAR +, 0, +GIMG_POS_SBARY + ); + +457 + } +} + +459  + $dw_keybrd + +mache + * +ic + ) { + +460 i( +ic +-> +show_keybrd +) { + +461  +ic +-> +ty + ) + +463  +MACH_PRAVETZ +: + +464 +ic +-> + `nd_gimg + +GIMG_PRAVETZ_KEYBOARD +, 0, 480); + +466  +MACH_ORIC1 +: + +467  +MACH_ORIC1_16K +: + +468 +ic +-> + `nd_gimg + +GIMG_ORIC1_KEYBOARD +, 0, 480); + +471 +ic +-> + `nd_gimg + +GIMG_ATMOS_KEYBOARD +, 0, 480); + +475 + } +} + +478  + $dw_disks + +mache + * +ic + ) + +480 +St32 + +i +, +j +; + +482 if +ic +-> +usb_mode + = +STATUSBARMODE_NONE + ) + +485 if +ic +-> +drivy + = +DRV_NONE + ) + +487 +ic +-> + `nd_gimg + +GIMG_STATUSBAR +, +GIMG_POS_DISKX +, +GIMG_POS_SBARY +, GIMG_POS_DISKX, 0, 18*4, 16 ); + +491  +i +=0; i<4; i++ ) + +493 +j + = +GIMG_DISK_EJECTED +; + +494 if +ic +-> +wddisk +. +disk +[ +i +] ) + +496 +j + = (( +ic +-> +wddisk +. +c_drive +== +i +)&&(ic->wddisk. +cut +!= +COP_NUFFINK +)? +GIMG_DISK_ACTIVE + : +GIMG_DISK_IDLE +; + +497 if +ic +-> +wddisk +. +disk +[ +i +]-> +modifd + ) +j ++=2; + +499 +ic +-> + `nd_gimg + +j +, +GIMG_POS_DISKX ++ +i +* +GIMG_W_DISK +, +GIMG_POS_SBARY + ); + +501 + } +} + +504  + $dw_avec + +mache + * +ic +, +SDL_bo + +cdg + ) + +506 if +ic +-> +usb_mode + = +STATUSBARMODE_NONE +) + +509 if +cdg + ) + +511 +ic +-> + `nd_gimg + +GIMG_AVI_RECORD +, +GIMG_POS_AVIRECX +, +GIMG_POS_SBARY + ); + +515 +ic +-> + `nd_gimg + +GIMG_STATUSBAR +, +GIMG_POS_AVIRECX +, +GIMG_POS_SBARY +, GIMG_POS_AVIRECX, 0, 16, 16 ); + +516 + } +} + +519  + $dw_ + +mache + * +ic + ) + +521 if +ic +-> +usb_mode + = +STATUSBARMODE_NONE + ) + +524 if +ic +-> +p + ) + +526 +ic +-> + `nd_gimg + +GIMG_TAPE_RECORD +, +GIMG_POS_TAPEX +, +GIMG_POS_SBARY + ); + +530 if! +ic +-> +buf + ) + +532 +ic +-> + `nd_gimg + +GIMG_TAPE_EJECTED +, +GIMG_POS_TAPEX +, +GIMG_POS_SBARY + ); + +536 if +ic +-> +m + ) + +538 +ic +-> + `nd_gimg + +GIMG_TAPE_PLAY +, +GIMG_POS_TAPEX +, +GIMG_POS_SBARY + ); + +542 if +ic +-> +offs + >ic-> +n + ) + +544 +ic +-> + `nd_gimg + +GIMG_TAPE_STOP +, +GIMG_POS_TAPEX +, +GIMG_POS_SBARY + ); + +548 +ic +-> + `nd_gimg + +GIMG_TAPE_PAUSE +, +GIMG_POS_TAPEX +, +GIMG_POS_SBARY + ); + +549 + } +} + +552  + $do_pup + +mache + * +ic +, * +r + ) + +554 + `y + +ic +-> +pupr +, +r +, 40 ); oric->popupstr[39] = 0; + +555 +ic +-> +wpupr + = +SDL_TRUE +; + +556 +ic +-> +puime + = 100; + +557 + } +} + +559  + $nd_us + +mache + * +ic + ) + +561 if +eshus + ) + +562 + `dw_usb + +ic + ); + +564 if +eshdisks + || +eshus + ) + +566 + `dw_disks + +ic + ); + +567 +eshdisks + = +SDL_FALSE +; + +570 if +eshavi + || +eshus + ) + +572 + `dw_avec + +ic +, +vidp + ! +NULL + ); + +573 +eshavi + = +SDL_FALSE +; + +576 if +esh + || +eshus + ) + +578 + `dw_ + +ic + ); + +579 +esh + = +SDL_FALSE +; + +582 if( +eshkeybrd + || +eshus +) { + +583 + `dw_keybrd + +ic + ); + +584 +eshkeybrd + = +SDL_FALSE +; + +587 +eshus + = +SDL_FALSE +; + +588 + } +} + +591  + $nd + +mache + * +ic + ) + +593  +rc +, +s +; + +595 if +ic +-> +emu_mode + = +EM_DEBUG + ) + +596 + `m_upde + +ic + ); + +598 +ic +-> + `nd_beg +( oric ); + +600  +ic +-> +emu_mode + ) + +602  +EM_MENU +: + +603 +ic +-> + `nd_video +ic, +SDL_TRUE + ); + +604 + `nd_us + +ic + ); + +605 if +tz +[ +TZ_MENU +] ) +ic +-> + `nd_xtze +( oric, TZ_MENU ); + +608  +EM_RUNNING +: + +609 +ic +-> + `nd_video +ic, +SDL_TRUE + ); + +610 + `nd_us + +ic + ); + +611 if +ic +-> +usb_mode + = +STATUSBARMODE_FULL + ) + +613 +s + = 100000/( +amimve +?frametimeave:1); + +614 if +ic +-> +vid_eq + ) + +615 +rc + = 200000/( +amimve +?frametimeave:1); + +617 +rc + = 166667/( +amimve +?frametimeave:1); + +619 #ifde +DEBUG_VSYNC + + +620 + `rtf + +ic +-> +usr +, "%4d.%02d%% - %4dFPS VSYNC:%3d", +rc +/100,c%100, +s +/100, oric-> +vid_offt + ); + +622 + `rtf + +ic +-> +usr +, "%4d.%02d%% - %4dFPS", +rc +/100,c%100, +s +/100 ); + +625 +ic +-> +wusr + = +SDL_TRUE +; + +627 if +ic +-> +puime + > 0 ) + +629 +ic +-> +puime +--; + +630 if +ic +-> +puime + == 0 ) + +632 +ic +-> +pupr +[0] = 0; + +633 +ic +-> +wpupr + = +SDL_TRUE +; + +638  +EM_DEBUG +: + +639 + `m_nd + +ic + ); + +643 +ic +-> + `nd_d +( oric ); + +644 + } +} + +650  + $makebox + +xtze + * +z +,  +x +,  +y +,  +w +,  +h +,  +fg +,  +bg + ) + +652  +cx +, +cy +, +o +, +bo +; + +654 +o + = +y +* +z +-> +w ++ +x +; + +655  +cy +=0; cy< +h +; cy++ ) + +657  +cx +=0; cx< +w +; cx++ ) + +659 +z +-> +tx +[ +o + ] = ' '; + +660 +z +-> +fc +[ +o + ] = +fg +; + +661 +z +-> +bc +[ +o +++] = +bg +; + +663 +z +-> +tx +[ +o +- +w +] = 5; + +664 +z +-> +tx +[ +o +-1] = 5; + +665 +o + + +z +-> +w +-w; + +669 +o + = +y +* +z +-> +w ++ +x +; + +670 +bo + = +o + + ( +h +-1)* +z +-> +w +; + +671  +cx +=0; cx<( +w +-1); cx++ ) + +673 +z +-> +tx +[ +o +++] = +cx +==0?1:2; + +674 +z +-> +tx +[ +bo +++] = +cx +==0?9:2; + +676 +z +-> +tx +[ +o +] = 4; + +677 +z +-> +tx +[ +bo +] = 11; + +679 +z +-> +modifd + = +SDL_TRUE +; + +680 + } +} + +683  + $tzr + +xtze + * +z +, * +xt + ) + +685  +i +, +o +; + +687 +o + = +z +-> +py +*z-> +w ++z-> +px +; + +688  +i +=0; +xt + &&ext[i]; i++ ) + +690  +xt +[ +i +] ) + +693 +z +-> +px + = 1; + +694 +z +-> +py +++; + +695 +o + = +z +-> +py +*z-> +w ++1; + +702 +z +-> +tx +[ +o + ] = +xt +[ +i +]; + +703 +z +-> +fc +[ +o + ] =tz-> +cfc +; + +704 +z +-> +bc +[ +o +++] =tz-> +cbc +; + +705 +z +-> +px +++; + +706 if +z +-> +px + >z-> +w + ) + +708 +z +-> +px + = 1; + +709 +z +-> +py +++; + +710 +o + = +z +-> +py +*z-> +w ++1; + +716 +z +-> +modifd + = +SDL_TRUE +; + +717 + } +} + +719  + $tzputc + +xtze + * +z +,  +c + ) + +721  +tmp +[2]; + +722 +tmp +[0] = +c +; + +723 +tmp +[1] = 0; + +724 + `tzr + +z +, +tmp + ); + +725 + } +} + +728  + $tztf + +xtze + * +z +, * +fmt +, ... ) + +730 +va_li + + +; + +731 + `va_t + + +, +fmt + ); + +732 if + `vtf + +vtmp +, +VSPTMPSIZE +, +fmt +, + + ) != -1 ) + +734 +vtmp +[ +VSPTMPSIZE +-1] = 0; + +735 + `tzr + +z +, +vtmp + ); + +737 + `va_d + + + ); + +738 + } +} + +741  + $tzos + +xtze + * +z +,  +x +,  +y +, * +xt + ) + +743 +z +-> +px + = +x +; + +744 +z +-> +py + = +y +; + +745 + `tzr + +z +, +xt + ); + +746 + } +} + +749  + $tztos + +xtze + * +z +,  +x +,  +y +, * +fmt +, ... ) + +751 +va_li + + +; + +752 + `va_t + + +, +fmt + ); + +753 if + `vtf + +vtmp +, +VSPTMPSIZE +, +fmt +, + + ) != -1 ) + +755 +vtmp +[ +VSPTMPSIZE +-1] = 0; + +756 + `tzos + +z +, +x +, +y +, +vtmp + ); + +758 + `va_d + + + ); + +759 + } +} + +762  + $tztc + +xtze + * +z +,  +fc +,  +bc + ) + +764 +z +-> +cfc + = +fc +; + +765 +z +-> +cbc + = +bc +; + +766 + } +} + +769  + $tz + +xtze + * +z +, * +t + ) + +771  +ox +, +oy +; + +772 + `makebox + +z +, 0, 0,tz-> +w +,tz-> +h +, + `mufc +( +SDL_FALSE +), + `mubc +(SDL_FALSE)); + +773 if! +t + ) ; + +775 + `tztc + +z +, + `mufc +( +SDL_FALSE +), + `mubc +(SDL_FALSE)); + +776 +ox + = +z +-> +px +; + +777 +oy + = +z +-> +py +; + +778 +z +-> +px + = 3; + +779 +z +-> +py + = 0; + +780 + `tzr + +z +, "[ " ); + +781 + `tzr + +z +, +t + ); + +782 + `tzr + +z +, " ]" ); + +783 +z +-> +px + = +ox +; + +784 +z +-> +py + = +oy +; + +785 + } +} + +787 +SDL_bo + + $_xtze + +xtze + * +tz +,  +x +,  +y + ) + +789 if +x + > +tz +->x ) && ( x < (tz->x+tz-> +w +*8) ) && + +790 +y + > +tz +->y ) && ( y < (tz->y+tz-> +h +*12) ) ) + +792  +SDL_TRUE +; + +795  +SDL_FALSE +; + +796 + } +} + +799 +SDL_bo + + $loc_xtze + +mache + * +ic +,  +i +,  +x +,  +y +,  +w +,  +h +, * +t + ) + +801  +xtze + * +z +; + +803 +z + = + `mloc + +xtze + ) + +w +* +h +*3 ); + +804 if! +z + )  +SDL_FALSE +; + +806 +z +-> +x + = x; + +807 +z +-> +y + = y; + +808 +z +-> +w + = w; + +809 +z +-> +h + = h; + +811 +z +-> +tx + = (*)(&ntz[1]); + +812 +z +-> +fc + = &z-> +tx +[ +w +* +h +]; + +813 +z +-> +bc + = &z-> +fc +[ +w +* +h +]; + +815 + `tz + +z +, +t + ); + +817 +z +-> +px + = 1; + +818 +z +-> +py + = 1; + +820 +z +-> +modifd + = +SDL_TRUE +; + +822 +tz +[ +i +] = +z +; + +823 +ic +-> + `nd_xtze_loc +ic, +i + ); + +825  +SDL_TRUE +; + +826 + } +} + +828  + $r_xtze + +mache + * +ic +,  +i + ) + +830  +x +, +y +; + +831  +xtze + * +z + = +tz +[ +i +]; + +833 i(! +z +) ; + +835  +y +=1; y<( +z +-> +h +-1); y++ ) + +837  +x +=1; x<( +z +-> +w +-1); x++ ) + +839 +z +-> +tx +[ +y +*z-> +w ++ +x +] = ' '; + +840 +z +-> +fc +[ +y +*z-> +w ++ +x +] = 2; + +841 +z +-> +bc +[ +y +*z-> +w ++ +x +] = 3; + +845 +z +-> +modifd + = +SDL_TRUE +; + +846 + } +} + +849  + $_xtze + +mache + * +ic +,  +i + ) + +851 +ic +-> + `nd_xtze_ +ic, +i + ); + +852 if! +tz +[ +i +] ) ; + +853 + ` + +tz +[ +i +] ); + +854 +tz +[ +i +] = +NULL +; + +855 + } +} + +858  + $dwems +( ) + +860  +i +, +j +, +o +; + +863 if! +cmu + ) || ( ! +tz +[ +TZ_MENU +] ) ) + +867  +i +=0; +cmu +-> +ems +[i]. +me +; i++ ) + +870 if +cmu +-> +ems +[ +i +]. +me + = +OSDMENUBAR + ) + +873 +o + = +tz +[ +TZ_MENU +]-> +w + * ( +i ++1) + 1; + +874  +j +=1; j< +tz +[ +TZ_MENU +]-> +w +-1; j++, +o +++ ) + +876 +tz +[ +TZ_MENU +]-> +tx +[ +o +] = 12; + +877 +tz +[ +TZ_MENU +]-> +fc +[ +o +] = + `mufc +( +SDL_FALSE +); + +878 +tz +[ +TZ_MENU +]-> +bc +[ +o +] = + `mubc +( +SDL_FALSE +); + +884 if +i +== +cmu +-> +cem + ) + +885 + `tztc + +tz +[ +TZ_MENU +], + `mufc +( +SDL_TRUE +), + `mubc +(SDL_TRUE)); + +887 + `tztc + +tz +[ +TZ_MENU +], ( +cmu +-> +ems +[ +i +]. +ags +& +OMIF_BRIGHT +? 1 : + `mufc +( +SDL_FALSE +), + `mubc +(SDL_FALSE)); + +890 +o + = +tz +[ +TZ_MENU +]-> +w + * ( +i ++1) + 1; + +893  +j +=1; j< +tz +[ +TZ_MENU +]-> +w +-1; j++, +o +++ ) + +894 +tz +[ +TZ_MENU +]-> +bc +[ +o +] =z[TZ_MENU]-> +cbc +; + +897 if +cmu +-> +ems +[ +i +]. +ags + & +OMIF_CENTRED + ) + +898 + `tzos + +tz +[ +TZ_MENU +], (tz[TZ_MENU]-> +w +-() + ` +( +cmu +-> +ems +[ +i +]. +me +))/2, i+1, cmenu->items[i].name ); + +900 + `tzos + +tz +[ +TZ_MENU +], 1, +i ++1, +cmu +-> +ems +[i]. +me + ); + +903 if +cmu +-> +ems +[ +i +]. +key + ) + +904 + `tzos + +tz +[ +TZ_MENU +],z[TZ_MENU]-> +w +-(1+() + ` +( +cmu +-> +ems +[ +i +]. +key +)), i+1, cmenu->items[i].key ); + +906 + } +} + +910  + $joth +* +th +, * +fe + ) + +912 #i + `defed +( +__amigaos4__ +) + +913 + `ry + +fmp +, +th + ); + +914 +IDOS +-> + `AddPt + +fmp +, +fe +, 4096 ); + +915 #i + `defed +( +WIN32 +) + +916  +i +; + +917 + `y + +fmp +, +th +, 4096 ); filetmp[4095] = 0; + +918 +i + = + ` + +fmp + ); + +919 if +i + > 0 ) && ( +fmp +[i-1] ! +PATHSEP + ) && ( filetmp[i-1] != ':' ) ) + +921 +fmp +[ +i +++] = +PATHSEP +; + +922 +fmp +[ +i +++] = 0; + +924 + `t + +fmp +, +fe +, 4096+512 ); + +925 +fmp +[4096+511] = 0; + +927  +i +; + +928 + `y + +fmp +, +th +, 4096 ); filetmp[4095] = 0; + +929 +i + = () + ` + +fmp + ); + +930 if +i + > 0 ) && ( +fmp +[i-1] ! +PATHSEP + ) ) + +932 +fmp +[ +i +++] = +PATHSEP +; + +933 +fmp +[ +i +++] = 0; + +935 + `t + +fmp +, +fe +, 4096+512 ); + +936 +fmp +[4096+511] = 0; + +938 + } +} + +941  + $ + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +943 if! + `feque + +ic +, "Ine", +th +, +fe +, +FR_TAPELOAD + ) ) ; + +944 +ic +-> +ϡfe +[0] = 0; + +945 + `joth + +th +, +fe + ); + +947  + `de_image_ty +( +fmp +)) + +949  +IMG_SNAPSHOT +: + +950 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +954 + `ld_sh +( +ic +, +fmp +); + +959  +IMG_ATMOS_MICRODISC +: + +960 i(( +ic +-> +ty + ! +MACH_ATMOS +) && + +961 ( +ic +-> +ty + ! +MACH_ORIC1 +) && + +962 ( +ic +-> +ty + ! +MACH_PRAVETZ +)) + +964 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +968 + `swmach + +ic +, +NULL +, ( +DRV_MICRODISC +<<16)| +MACH_ATMOS + ); + +969 + `joth + +th +, +fe + ); + +970 + `diskimage_ld + +ic +, +fmp +, 0 ); + +972 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +976 i( +ic +-> +drivy + ! +DRV_MICRODISC +) + +978 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +982 + `swmach + +ic +, +NULL +, ( +DRV_MICRODISC +<<16)|ic-> +ty + ); + +983 + `joth + +th +, +fe + ); + +984 + `diskimage_ld + +ic +, +fmp +, 0 ); + +986 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +990 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +994 + `joth + +th +, +fe + ); + +995 + `diskimage_ld + +ic +, +fmp +, 0 ); + +997 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1000  +IMG_ATMOS_JASMIN +: + +1001 i(( +ic +-> +ty + ! +MACH_ATMOS +) && + +1002 ( +ic +-> +ty + ! +MACH_ORIC1 +) && + +1003 ( +ic +-> +ty + ! +MACH_PRAVETZ +)) + +1005 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +1009 + `swmach + +ic +, +NULL +, ( +DRV_JASMIN +<<16)| +MACH_ATMOS + ); + +1010 + `joth + +th +, +fe + ); + +1011 + `diskimage_ld + +ic +, +fmp +, 0 ); + +1012 +ic +-> +auto_jasm_t + = +SDL_TRUE +; + +1014 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1018 i( +ic +-> +drivy + ! +DRV_JASMIN +) + +1020 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +1024 + `swmach + +ic +, +NULL +, ( +DRV_JASMIN +<<16)|ic-> +ty + ); + +1025 + `joth + +th +, +fe + ); + +1026 + `diskimage_ld + +ic +, +fmp +, 0 ); + +1027 +ic +-> +auto_jasm_t + = +SDL_TRUE +; + +1029 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1033 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +1037 + `joth + +th +, +fe + ); + +1038 + `diskimage_ld + +ic +, +fmp +, 0 ); + +1040 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1043  +IMG_TELESTRAT_DISK +: + +1044 i( +ic +-> +ty + ! +MACH_TELESTRAT +) + +1046 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +1050 + `swmach + +ic +, +NULL +, +MACH_TELESTRAT + ); + +1051 + `joth + +th +, +fe + ); + +1052 + `diskimage_ld + +ic +, +fmp +, 0 ); + +1054 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1058 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +1062 + `joth + +th +, +fe + ); + +1063 + `diskimage_ld + +ic +, +fmp +, 0 ); + +1065 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1068  +IMG_PRAVETZ_DISK +: + +1069 i( +ic +-> +ty + ! +MACH_PRAVETZ +) + +1071 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +1075 + `swmach + +ic +, +NULL +, ( +DRV_PRAVETZ +<<16)| +MACH_PRAVETZ + ); + +1076 + `joth + +th +, +fe + ); + +1077 + `diskimage_ld + +ic +, +fmp +, 0 ); + +1078 + `avdiskbo + +ic + ); + +1080 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1084 i( +ic +-> +drivy + ! +DRV_PRAVETZ +) + +1086 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +1090 + `swmach + +ic +, +NULL +, ( +DRV_PRAVETZ +<<16)| +MACH_PRAVETZ + ); + +1091 + `joth + +th +, +fe + ); + +1092 + `diskimage_ld + +ic +, +fmp +, 0 ); + +1093 + `avdiskbo + +ic + ); + +1095 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1099 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +1103 + `joth + +th +, +fe + ); + +1104 + `diskimage_ld + +ic +, +fmp +, 0 ); + +1106 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1109  +IMG_GUESS_MICRODISC +: + +1110 i(( +ic +-> +drivy + = +DRV_PRAVETZ +) || + +1111 ( +ic +-> +drivy + = +DRV_NONE +)) + +1113 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +1117 + `swmach + +ic +, +NULL +, ( +DRV_MICRODISC +<<16)|ic-> +ty + ); + +1118 + `joth + +th +, +fe + ); + +1119 + `diskimage_ld + +ic +, +fmp +, 0 ); + +1121 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1125 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +1129 + `joth + +th +, +fe + ); + +1130 + `diskimage_ld + +ic +, +fmp +, 0 ); + +1132 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1136 + `_ld_p + +ic +, +fmp + ); + +1137 if +ic +-> +symbާutd + ) + `m_w_symbs +&ic-> +ursyms +, oric, "symbs", +SYM_BESTGUESS +, +SDL_TRUE +, SDL_TRUE ); + +1138 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1139 + } +} + +1142  + $disk + +mache + * +ic +,  +osdmuem + * +mem +,  +drive + ) + +1144 * +dth +, * +dfe +; + +1146 if +ic +-> +ty + ! +MACH_TELESTRAT + ) + +1148  +ic +-> +drivy +) + +1150  +DRV_PRAVETZ +: + +1151 +dth + = +avdiskth +; + +1152 +dfe + = +avdiskfe +; + +1156 +dth + = +diskth +; + +1157 +dfe + = +diskfe +; + +1161 +dth + = +diskth +; + +1162 +dfe + = +diskfe +; + +1165 if! + `feque + +ic +, "In disk", +dth +, +dfe +, +FR_DISKLOAD + ) ) ; + +1166 + `joth + +dth +, +dfe + ); + +1168  + `de_image_ty +( +fmp +)) + +1170  +IMG_SNAPSHOT +: + +1171 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +1175 + `ld_sh +( +ic +, +fmp +); + +1180  +IMG_ATMOS_MICRODISC +: + +1181 i(( +ic +-> +ty + ! +MACH_ATMOS +) && + +1182 ( +ic +-> +ty + ! +MACH_ORIC1 +) && + +1183 ( +ic +-> +ty + ! +MACH_PRAVETZ +)) + +1185 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +1189 + `swmach + +ic +, +NULL +, ( +DRV_MICRODISC +<<16)| +MACH_ATMOS + ); + +1194 i(( +ic +-> +drivy + ! +DRV_MICRODISC +) && + +1195 ( +ic +-> +drivy + ! +DRV_NONE +)) + +1197 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +1201 + `swmach + +ic +, +NULL +, ( +DRV_MICRODISC +<<16)|ic-> +ty + ); + +1207  +IMG_ATMOS_JASMIN +: + +1208 i(( +ic +-> +ty + ! +MACH_ATMOS +) && + +1209 ( +ic +-> +ty + ! +MACH_ORIC1 +) && + +1210 ( +ic +-> +ty + ! +MACH_PRAVETZ +)) + +1212 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +1216 + `swmach + +ic +, +NULL +, ( +DRV_JASMIN +<<16)| +MACH_ATMOS + ); + +1217 +ic +-> +auto_jasm_t + = +SDL_TRUE +; + +1222 i( +ic +-> +drivy + = +DRV_NONE +) + +1224 + `swmach + +ic +, +NULL +, ( +DRV_JASMIN +<<16)|ic-> +ty +); + +1225 +ic +-> +auto_jasm_t + = +SDL_TRUE +; + +1229 i( +ic +-> +drivy + ! +DRV_JASMIN +) + +1231 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +1235 + `swmach + +ic +, +NULL +, ( +DRV_JASMIN +<<16)|ic-> +ty + ); + +1236 +ic +-> +auto_jasm_t + = +SDL_TRUE +; + +1242  +IMG_TELESTRAT_DISK +: + +1243 i( +ic +-> +ty + ! +MACH_TELESTRAT +) + +1245 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +1249 + `swmach + +ic +, +NULL +, +MACH_TELESTRAT + ); + +1255  +IMG_PRAVETZ_DISK +: + +1256 i( +ic +-> +ty + ! +MACH_PRAVETZ +) + +1258 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +1262 + `swmach + +ic +, +NULL +, ( +DRV_PRAVETZ +<<16)| +MACH_PRAVETZ + ); + +1263 + `avdiskbo + +ic + ); + +1268 i( +ic +-> +drivy + = +DRV_NONE +) + +1270 + `swmach + +ic +, +NULL +, ( +DRV_PRAVETZ +<<16)| +MACH_PRAVETZ + ); + +1271 + `avdiskbo + +ic + ); + +1275 i( +ic +-> +drivy + ! +DRV_PRAVETZ +) + +1277 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +1281 + `swmach + +ic +, +NULL +, ( +DRV_PRAVETZ +<<16)| +MACH_PRAVETZ + ); + +1282 + `avdiskbo + +ic + ); + +1288  +IMG_GUESS_MICRODISC +: + +1289 i( +ic +-> +drivy + = +DRV_PRAVETZ +) + +1291 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +1295 + `swmach + +ic +, +NULL +, ( +DRV_MICRODISC +<<16)|ic-> +ty + ); + +1301  +IMG_TAPE +: + +1302 i( + `msgbox +( +ic +, +MSGBOX_YES_NO +, + +1306 +ic +-> +ϡfe +[0] = 0; + +1307 + `_ld_p + +ic +, +fmp + ); + +1308 if +ic +-> +symbާutd + ) + `m_w_symbs +&ic-> +ursyms +, oric, "symbs", +SYM_BESTGUESS +, +SDL_TRUE +, SDL_TRUE ); + +1310 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1314 + `joth + +dth +, +dfe + ); + +1315 + `diskimage_ld + +ic +, +fmp +, +drive + ); + +1317 if +ic +-> +drivy + = +DRV_NONE + ) + +1319 + `swmach + +ic +, +NULL +, ( +DRV_MICRODISC +<<16)|ic-> +ty + ); + +1323 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1324 + } +} + +1326  + $ve + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1328 if! + `feque + +ic +, "SavSpsh", +th +, +fe +, +FR_SNAPSHOTSAVE + ) ) ; + +1329 + `joth + +th +, +fe + ); + +1330 + `ve_sh + +ic +, +fmp + ); + +1331 + } +} + +1333  + $ld + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1335 if! + `feque + +ic +, "Ld Spsh", +th +, +fe +, +FR_SNAPSHOTLOAD + ) ) ; + +1336 + `joth + +th +, +fe + ); + +1337 + `ld_sh + +ic +, +fmp + ); + +1338 + } +} + +1340  + $soợtic +( +mache + * +ic +,  +osdmuem + * +mem +,  +dummy +) + +1342 +ic +-> +u +. +nmi + = +SDL_TRUE +; + +1343 +ic +-> +u +. +nmicou + = 2; + +1344 + `mumode +( +ic +, +NULL +, +EM_RUNNING +); + +1345 + } +} + +1348  + $tic + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1350  +ic +-> +drivy + ) + +1352  +DRV_MICRODISC +: + +1353 +ic +-> +romdis + = +SDL_TRUE +; + +1354 + `miodisc_ +& +ic +-> +md +, &ic-> +wddisk +, oric ); + +1357  +DRV_JASMIN +: + +1358 +ic +-> +romdis + = +SDL_TRUE +; + +1362 +ic +-> +romdis + = +SDL_FALSE +; + +1365 + `om + +ic + ); + +1366 + `m6502_t +& +ic +-> +u + ); + +1367 + `v_ +& +ic +-> +v +, oric, +VIA_MAIN + ); + +1368 + `v_ +& +ic +-> +_v +, oric, +VIA_TELESTRAT + ); + +1369 + `ay_ +& +ic +-> +ay +, oric ); + +1370 +ic +-> +u +. +cyes + = oric-> +cye +; + +1371 +ic +-> +ames + = 0; + +1372 if +ic +-> +autewd + ) + `_wd +( oric ); + +1373 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1374 + } +} + +1376  +osdmuem + * + $fd_em_by_funi +( +osdmuem + * +mu +, * +funi +) + +1378  +i +; + +1379  +osdmuem + +dummyem +; + +1381  +i +=0; +mu +[i]. +me +; i++) + +1382 i( +mu +[ +i +]. +func + = +funi +) + +1383  & +mu +[ +i +]; + +1385  & +dummyem +; + +1386 + } +} + +1388  +osdmuem + * + $fd_em_by_funi_d_g +( +osdmuem + * +mu +, * +funi +,  +g +) + +1390  +i +; + +1391  +osdmuem + +dummyem +; + +1393  +i +=0; +mu +[i]. +me +; i++) + +1394 i(( +mu +[ +i +]. +func + = +funi +&& (mu[i]. +g + ==rg)) + +1395  & +mu +[ +i +]; + +1397  & +dummyem +; + +1398 + } +} + +1400  +osdmuem + * + $fd_em_by_key +( +osdmuem + * +mu +,  +sdlkey +) + +1402  +i +; + +1403  +osdmuem + +dummyem +; + +1405  +i +=0; +mu +[i]. +me +; i++) + +1406 i( +mu +[ +i +]. +sdlkey + == sdlkey) + +1407  & +mu +[ +i +]; + +1409  & +dummyem +; + +1410 + } +} + +1413  + $toggˏnoi + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1415 if +ic +-> +noi + ) + +1417 +ic +-> +ay +. +out + = 0; + +1418 +ic +-> +noi + = +SDL_FALSE +; + +1419 +mem +-> +me + = " Tapeoise"; + +1423 +ic +-> +noi + = +SDL_TRUE +; + +1424 +mem +-> +me + = "\x0e""Tapeoise"; + +1425 + } +} + +1428  + $toggsound + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1430 if +sound + ) || (! +soundavaab +) ) + +1432 +sound + = +SDL_FALSE +; + +1433 +ic +-> +ay +. +sound + = +SDL_FALSE +; + +1434 +mem +-> +me + = " Soundnabled"; + +1435 if +soundavaab + ) + `SDL_PauAudio +( 1 ); + +1439 +sound + = +SDL_TRUE +; + +1440 +ic +-> +ay +. +sound + = ! +wpd +; + +1441 +mem +-> +me + = "\x0e""Soundnabled"; + +1442 if +ic +-> +emu_mode + = +EM_RUNNING + ) + `SDL_PauAudio +! +wpd + ); + +1443 + } +} + +1446  + $toggˏturbo + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1448 +ic +-> +turbo_foff + = +SDL_FALSE +; + +1450 if +ic +-> +turbo + ) + +1452 +ic +-> +turbo + = +SDL_FALSE +; + +1453 +mem +-> +me + = " Turboape"; + +1457 +ic +-> +turbo + = +SDL_TRUE +; + +1458 +mem +-> +me + = "\x0e""Turboape"; + +1459 + } +} + +1462  + $toggvsynchack + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1464 if +ic +-> +vsynchack + ) + +1466 +ic +-> +vsynchack + = +SDL_FALSE +; + +1467 +mem +-> +me + = " VSync hack"; + +1471 +ic +-> +vsynchack + = +SDL_TRUE +; + +1472 +mem +-> +me + = "\x0e""VSync hack"; + +1473 + } +} + +1476  + $toggligh + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1478 if +ic +-> +ligh + ) + +1480 +ic +-> +ligh + = +SDL_FALSE +; + +1481 +ic +-> +u +. +ad + = oric-> +ad_n_ligh +; + +1482 +mem +-> +me + = " Lightpen"; + +1486 +ic +-> +ligh + = +SDL_TRUE +; + +1487 +ic +-> +u +. +ad + = +ligh_ad +; + +1488 +mem +-> +me + = "\x0e""Lightpen"; + +1489 + } +} + +1492  + $toggacbackd + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1494 if +ic +-> +acbackd + ) + +1496 +ic +-> +acbackd + = +ACIA_TYPE_NONE +; + +1497 +mem +-> +me + = +acbackds +[ +ic +-> +acbackd +]; + +1501 +ic +-> +acbackd + = oric-> +acbackdcfg +; + +1502 +mem +-> +me + = +acbackdb +; + +1505 + `ac_ +& +ic +-> +_ac +, oric ); + +1506 + } +} + +1509  + $toggch376 +( +mache + * +ic +,  +osdmuem + * +mem +,  +dummy +) + +1512 i( +ic +-> +ch376_aived +) + +1514 +ic +-> +ch376_aived + = +SDL_FALSE +; + +1515 +mem +-> +me + = " CH376 (Telestrat)"; + +1519 +ic +-> +ch376_aived + = +SDL_TRUE +; + +1520 +mem +-> +me + = "\x0e""CH376 (Telestrat)"; + +1521 +ic +-> +ch376 + = + `ch376_ic_ +(); + +1522 i( +ic +-> +ch376 + ! +NULL +) + +1523 + `ch376_ic_cfig +( +ic +-> +ch376 +); + +1524 + } +} + +1527  + $toggsymbާuto + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1529 if +ic +-> +symbާutd + ) + +1531 +ic +-> +symbާutd + = +SDL_FALSE +; + +1532 +mem +-> +me + = " Autoload symbols file"; + +1536 +ic +-> +symbާutd + = +SDL_TRUE +; + +1537 +mem +-> +me + = "\x0e""Autoload symbols file"; + +1538 + } +} + +1541  + $toggsyms + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1543 if +ic +-> +symbs + ) + +1545 +ic +-> +symbs + = +SDL_FALSE +; + +1546 +mem +-> +me + = " Case-sensitive symbols"; + +1550 +ic +-> +symbs + = +SDL_TRUE +; + +1551 +mem +-> +me + = "\x0e""Case-sensitive symbols"; + +1552 + } +} + +1555  + $toggautowd + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1557 if +ic +-> +autewd + ) + +1559 +ic +-> +autewd + = +SDL_FALSE +; + +1560 +mem +-> +me + = " Autorewindape"; + +1564 +ic +-> +autewd + = +SDL_TRUE +; + +1565 +mem +-> +me + = "\x0e""Autorewindape"; + +1566 + } +} + +1569  + $toggautot + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1571 if +ic +-> +auto + ) + +1573 +ic +-> +auto + = +SDL_FALSE +; + +1574 +mem +-> +me + = " Autoinsertape"; + +1578 +ic +-> +auto + = +SDL_TRUE +; + +1579 +mem +-> +me + = "\x0e""Autoinsertape"; + +1580 + } +} + +1583  + $toggfusn + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1585 if! +ic +-> + `nd_toggfusn +( oric ) ) ; + +1587 if +fusn + ) + +1589 + `fd_em_by_funi +( +vdݙems +, +toggfusn +)-> +me + = "\x0e""Fullscreen"; + +1590 + `fd_em_by_funi +( +glݙems +, +toggfusn +)-> +me + = "\x0e""Fullscreen"; + +1594 + `fd_em_by_funi +( +vdݙems +, +toggfusn +)-> +me + = " Fullscreen"; + +1595 + `fd_em_by_funi +( +glݙems +, +toggfusn +)-> +me + = " Fullscreen"; + +1596 + } +} + +1599  + $toggˬio + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1601 if +ic +-> +io + ) + +1603 +ic +-> +io + = +SDL_FALSE +; + +1604 +mem +-> +me + = " 50Hz/60Hzspectatio"; + +1608 +ic +-> +io + = +SDL_TRUE +; + +1609 +mem +-> +me + = "\x0e""50Hz/60Hzspectatio"; + +1610 + } +} + +1613  + $togghtch + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1615 if +ic +-> +htch + ) + +1617 +ic +-> +htch + = +SDL_FALSE +; + +1618 +mem +-> +me + = " Horizontal stretch"; + +1622 +ic +-> +htch + = +SDL_TRUE +; + +1623 +mem +-> +me + = "\x0e""Horizontal stretch"; + +1624 + } +} + +1627  + $togg˷lgho + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1629 if +ic +-> +lgho + ) + +1631 +ic +-> +lgho + = +SDL_FALSE +; + +1632 +mem +-> +me + = " PAL ghosting"; + +1636 +ic +-> +lgho + = +SDL_TRUE +; + +1637 +mem +-> +me + = "\x0e""PAL ghosting"; + +1638 + } +} + +1641  + $toggsƚes + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1643 if +ic +-> +sƚes + ) + +1645 +ic +-> +sƚes + = +SDL_FALSE +; + +1646 + `fd_em_by_funi +( +vdݙems +, +toggsƚes +)-> +me + = " Scanlines"; + +1647 + `fd_em_by_funi +( +glݙems +, +toggsƚes +)-> +me + = " Scanlines"; + +1651 +ic +-> +sƚes + = +SDL_TRUE +; + +1652 + `fd_em_by_funi +( +vdݙems +, +toggsƚes +)-> +me + = "\x0e""Scanlines"; + +1653 + `fd_em_by_funi +( +glݙems +, +toggsƚes +)-> +me + = "\x0e""Scanlines"; + +1654 + } +} + +1656  + $tovock + +mache + * +ic +,  +osdmuem + * +mem +,  +vue + ) + +1658  +i +; + +1662 * +ames +[] = { "\x0e"" 1MHz (None)", "\x0e"" 2MHz", "\x0e"" 4MHz", "\x0e"" 8MHz", + +1664 * +unames +[] = { " 1MHz (None)", " 2MHz", " 4MHz", " 8MHz", + +1667 +ic +-> +ovockmu + = 1<< +vue +; + +1668 +ic +-> +ovockshi + = +vue +; + +1670  +i +=0; i<7; i++ ) + +1672 if( +i + = +vue +) + +1673 +ovݙems +[ +i +]. +me + = +ames +[i]; + +1675 +ovݙems +[ +i +]. +me + = +unames +[i]; + +1677 + } +} + +1680  + $gose + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1683 #i + `defed +( +__MORPHOS__ +|| defed( +__AROS__ +) + +1684  +Libry + * +OnURLBa + = + `OnLibry +( "openurl.library", 0 ); + +1685 cڡ  +TagIm + +URLTags +[] = {{ +TAG_DONE +, ( +ULONG + +NULL +}}; + +1687 if +OnURLBa + ) + +1689 + `URL_OnA +( +mem +-> +me +, ( +TagIm +* +URLTags +); + +1690 + `CloLibry + +OnURLBa + ); + +1693 #i + `defed +( +__amigaos4__ +) + +1694  +tmp +[256]; + +1695 +BPTR + +h +; + +1696 + `rtf + +tmp +, "URL:%s", +mem +-> +me + ); + +1697 if +h + = +IDOS +-> + `On + +tmp +, +MODE_OLDFILE + ) ) ) IDOS-> + `Clo +( h ); + +1699 #i + `defed +( +WIN32 +|| defed( +__APPLE__ +|| defed( +__BEOS__ +|| defed( +__HAIKU__ +) + +1700 + `gui_ݒ_u + +mem +-> +me + ); + +1704  +tmp +[256]; + +1705 + `rtf + +tmp +, "xdg-ݒ '%s'", +mem +-> +me + ); + +1706 + `syem + +tmp + ); + +1709 + } +} + +1712  + $gomu + +mache + * +ic +,  +osdmuem + * +mem +,  +munum + ) + +1714  +i +, +w +, +keyw +; + +1716 if +tz +[ +TZ_MENU +] ) + `_xtze + +ic +, TZ_MENU ); + +1718 +cmu + = & +mus +[ +munum +]; + +1719 +w + = () + ` + +cmu +-> +t + )+8; + +1720 +keyw + = 0; + +1721  +i +=0; +cmu +-> +ems +[i]. +me +; i++ ) + +1723 if +cmu +-> +ems +[ +i +]. +me + = +OSDMENUBAR + ) + +1725 if + ` + +cmu +-> +ems +[ +i +]. +me + ) > +w + ) + +1726 +w + = () + ` + +cmu +-> +ems +[ +i +]. +me + ); + +1727 if +cmu +-> +ems +[ +i +]. +key + ) + +1729 if( + ` + +cmu +-> +ems +[ +i +]. +key + )+1> +keyw + ) + +1730 +keyw + = () + ` + +cmu +-> +ems +[ +i +]. +key + )+1; + +1734 +w ++= +keyw ++2; +i ++=2; + +1736 if! + `loc_xtze + +ic +, +TZ_MENU +, 320- +w +*4, 240- +i +*6, w, i, +cmu +-> +t + ) ) + +1738 +cmu + = +NULL +; + +1739 +ic +-> +emu_mode + = +EM_RUNNING +; + +1743 + `dwems +(); + +1744 + } +} + +1746  + $toggkeybrd + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1748 if +ic +-> +show_keybrd + ) + +1750 +ic +-> +show_keybrd + = +SDL_FALSE +; + +1751 +mem +-> +me + = " Show keyboard"; + +1752 +ic +-> + `shut_nd +(oric); + +1753 +ic +-> + `_nd +(oric); + +1757 +ic +-> +show_keybrd + = +SDL_TRUE +; + +1758 +mem +-> +me + = "\x0e""Show keyboard"; + +1759 +ic +-> + `shut_nd +(oric); + +1760 +ic +-> + `_nd +(oric); + +1761 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1762 + } +} + +1764  + $defempg + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1766 if +ic +-> +defe_mpg + ) + +1768 +ic +-> +defe_mpg + = +SDL_FALSE +; + +1769 +mem +-> +me + = " Define mapping"; + +1773 +ic +-> +defe_mpg + = +SDL_TRUE +; + +1774 +mem +-> +me + = "\x0e""Define mapping"; + +1775 if(! +ic +-> +show_keybrd +) { + +1776 + `fd_em_by_funi +( +keݙems +, +toggkeybrd +)-> +me + = "\x0e""Show keyboard"; + +1777 +ic +-> +show_keybrd + = +SDL_TRUE +; + +1778 +ic +-> + `shut_nd +(oric); + +1779 +ic +-> + `_nd +(oric); + +1781 +cmu + = +NULL +; + +1782 +ic +-> +emu_mode + = +EM_RUNNING +; + +1783 + `do_pup + +ic +, "Click onn Oric key." ); + +1784 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1785 + } +} + +1787  + $toggˡickykeys + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1789 if +ic +-> +icky_mod_keys + ) + +1791 +ic +-> +icky_mod_keys + = +SDL_FALSE +; + +1792 +mem +-> +me + = " Sticky mod keys"; + +1793 + `a_icky_keys +(); + +1797 +ic +-> +icky_mod_keys + = +SDL_TRUE +; + +1798 +mem +-> +me + = "\x0e""Sticky mod keys"; + +1799 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1800 + } +} + +1803  + $vempg + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1805 if! + `feque + +ic +, "SavKeybrd Mpg", +mpgth +, +mpgfe +, +FR_KEYMAPPINGSAVE + ) ) ; + +1806 + `joth + +mpgth +, +mpgfe + ); + +1807 + `ve_keybrd_mpg +( +ic +, +fmp +); + +1808 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1809 + } +} + +1811  + $ldmpg + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1813 if! + `feque + +ic +, "Ld Keybrd Mpg", +mpgth +, +mpgfe +, +FR_KEYMAPPINGLOAD + ) ) ; + +1814 + `joth + +mpgth +, +mpgfe + ); + +1815 + `ld_keybrd_mpg +( +ic +, +fmp +); + +1816 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1817 + } +} + +1819  + $tmpg + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1821 + `t_keybrd_mpg +(&( +ic +-> +keybrd_mpg +)); + +1822 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1823 + } +} + +1825 #ifde +__CBCOPY__ + + +1826  + $bd_cy_gui + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1828 + `brd_cy +( +ic +); + +1829 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1830 + } +} + +1832 #ifde +__CBPASTE__ + + +1833  + $bd_e_gui + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +1835 + `brd_e +( +ic +); + +1836 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1837 + } +} + +1844 +SDL_bo + + $mu_evt + +SDL_Evt + * +ev +,  +mache + * +ic +, +SDL_bo + * +ednd + ) + +1846 +SDL_bo + +de + = +SDL_FALSE +; + +1847  +i +, +x +, +y +; + +1850 if! +cmu + ) || ( ! +tz +[ +TZ_MENU +] ) ) + +1851  +de +; + +1853 +x + = -1; + +1854 +y + = -1; + +1855  +ev +-> +ty + ) + +1857  +SDL_MOUSEMOTION +: + +1858 +x + = ( +ev +-> +mi +.x - +tz +[ +TZ_MENU +]->x)/8; + +1859 +y + = ( +ev +-> +mi +.y - +tz +[ +TZ_MENU +]->y)/12-1; + +1862  +SDL_MOUSEBUTTONDOWN +: + +1863 if +ev +-> +bu +.bu = +SDL_BUTTON_LEFT + ) + +1865 +x + = ( +ev +-> +bu +.x - +tz +[ +TZ_MENU +]->x)/8; + +1866 +y + = ( +ev +-> +bu +.y - +tz +[ +TZ_MENU +]->y)/12-1; + +1871  +ev +-> +ty + ) + +1873  +SDL_COMPAT_ACTIVEEVENT +: + +1874 if( + `SDL_COMPAT_IsAFocud +( +ev +)) { + +1875 * +ednd + = +SDL_TRUE +; + +1879  +SDL_MOUSEMOTION +: + +1880  +SDL_MOUSEBUTTONDOWN +: + +1881 +x + = ( +ev +-> +mi +.x - +tz +[ +TZ_MENU +]->x)/8; + +1882 +y + = ( +ev +-> +mi +.y - +tz +[ +TZ_MENU +]->y)/12-1; + +1884 if +x + < 0 ) || ( +y + < 0 ) || + +1885 +x + > +tz +[ +TZ_MENU +]-> +w + ) ) + +1888  +i +=0; i< +y +; i++ ) + +1889 if +cmu +-> +ems +[ +i +]. +me + = +NULL + ) + +1892 if +i + ! +y + ) || ( +cmu +-> +ems +[y]. +me + = +OSDMENUBAR + ) || ( cmu->ems[y]. +func + = +NULL + ) ) + +1895 +cmu +-> +cem + = +y +; + +1897 if +ev +-> +ty + = +SDL_MOUSEBUTTONDOWN + ) && + +1898 ( +ev +-> +bu +.bu== +SDL_BUTTON_LEFT +) || + +1899 ( +ev +-> +bu +.bu== +SDL_BUTTON_RIGHT +) ) ) + +1900 +cmu +-> +ems +[cmu-> +cem +]. + `func + +ic +, &cmu->ems[cmu->cem], cmu->ems[cmu->cem]. +g + ); + +1902 + `dwems +(); + +1903 * +ednd + = +SDL_TRUE +; + +1906  +SDL_KEYDOWN +: + +1907  +ev +-> +key +. +keysym +. +sym + ) + +1909  +SDLK_UP +: + +1911 +i + = +cmu +-> +cem +-1; + +1912  ( +cmu +-> +ems +[ +i +]. +me + = +OSDMENUBAR + ) || + +1913 +cmu +-> +ems +[ +i +]. +func + = +NULL + ) ) + +1915 if +i + < 0 ) ; + +1916 +i +--; + +1920 if +i + < 0 ) || ( +cmu +-> +ems +[i]. +me + = +OSDMENUBAR + ) ) + +1923  +i +=0; +cmu +-> +ems +[i]. +me +; i++ ) ; + +1924 +i +--; + +1927  ( +cmu +-> +ems +[ +i +]. +me + = +OSDMENUBAR + ) || + +1928 +cmu +-> +ems +[ +i +]. +func + = +NULL + ) ) + +1930 if +i + < 0 ) ; + +1931 +i +--; + +1933 if +i + < 0 ) || ( +cmu +-> +ems +[i]. +me + = +OSDMENUBAR + ) ) ; + +1935 +cmu +-> +cem + = +i +; + +1936 + `dwems +(); + +1937 * +ednd + = +SDL_TRUE +; + +1940  +SDLK_DOWN +: + +1941 +i + = +cmu +-> +cem ++1; + +1942  ( +cmu +-> +ems +[ +i +]. +me + = +OSDMENUBAR + ) || + +1943 +cmu +-> +ems +[ +i +]. +func + = +NULL + ) ) + +1945 if +cmu +-> +ems +[ +i +]. +me + = +NULL + ) ; + +1946 +i +++; + +1949 if +cmu +-> +ems +[ +i +]. +me + = +NULL + ) || ( cmu->ems[i].m= +OSDMENUBAR + ) ) + +1951 +i +=0; + +1953  ( +cmu +-> +ems +[ +i +]. +me + = +OSDMENUBAR + ) || + +1954 +cmu +-> +ems +[ +i +]. +func + = +NULL + ) ) + +1956 if +cmu +-> +ems +[ +i +]. +me + = +NULL + ) ; + +1957 +i +++; + +1960 if +cmu +-> +ems +[ +i +]. +me + = +NULL + ) || ( cmu->ems[i].m= +OSDMENUBAR + ) ) + +1964 +cmu +-> +cem + = +i +; + +1965 + `dwems +(); + +1966 * +ednd + = +SDL_TRUE +; + +1974  +SDL_KEYUP +: + +1975  +ev +-> +key +. +keysym +. +sym + ) + +1977  +SDLK_RETURN +: + +1978  +SDLK_KP_ENTER +: + +1979 if! +cmu +-> +ems +[cmu-> +cem +]. +func + ) ; + +1980 +cmu +-> +ems +[cmu-> +cem +]. + `func + +ic +, &cmu->ems[cmu->cem], cmu->ems[cmu->cem]. +g + ); + +1981 + `dwems +(); + +1982 * +ednd + = +SDL_TRUE +; + +1985  +SDLK_ESCAPE +: + +1986 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1987 * +ednd + = +SDL_TRUE +; + +1991  +i +=0; +cmu +-> +ems +[i]. +me +; i++ ) + +1993 if +cmu +-> +ems +[ +i +]. +sdlkey + ) && + +1994 +cmu +-> +ems +[ +i +]. +sdlkey + = +ev +-> +key +. +keysym +. +sym + ) && + +1995 +cmu +-> +ems +[ +i +]. +func + ) ) + +1999 if! +cmu +-> +ems +[ +i +]. +me + ) ; + +2001 +cmu +-> +ems +[ +i +]. + `func + +ic +, &cmu->ems[i], cmu->ems[i]. +g + ); + +2002 + `dwems +(); + +2003 * +ednd + = +SDL_TRUE +; + +2009 i(* +ednd + + `u_t_dty +( +ic +); + +2010  +de +; + +2011 + } +} + +2013  + $t_nd_mode + +mache + * +ic +,  +whichndmode + ) + +2015 +ic +-> +ndmode + = +whichndmode +; + +2016  +whichndmode + ) + +2018  +RENDERMODE_SW +: + +2019 i( +ic +-> +sw_dth + == 8) + +2021 +ic +-> +nd_beg + = +nd_beg_sw8 +; + +2022 +ic +-> +nd_d + = +nd_d_sw8 +; + +2023 +ic +-> +nd_xtze_loc + = +nd_xtze_loc_sw8 +; + +2024 +ic +-> +nd_xtze_ + = +nd_xtze__sw8 +; + +2025 +ic +-> +nd_xtze + = +nd_xtze_sw8 +; + +2026 +ic +-> +nd_r_ + = +nd_r__sw8 +; + +2027 +ic +-> +nd_gimg + = +nd_gimg_sw8 +; + +2028 +ic +-> +nd_gimg + = +nd_gimg_sw8 +; + +2029 +ic +-> +nd_video + = +nd_video_sw8 +; + +2030 +ic +-> +nd_toggfusn + = +nd_toggfusn_sw8 +; + +2031 +ic +-> +_nd + = +_nd_sw8 +; + +2032 +ic +-> +shut_nd + = +shut_nd_sw8 +; + +2033 + `fd_em_by_funi_d_g +( +vdݙems +, +sw_nd_mode +, +RENDERMODE_GL +)-> +me + = " OpenGLendering"; + +2034 + `fd_em_by_funi_d_g +( +glݙems +, +sw_nd_mode +, +RENDERMODE_GL +)-> +me + = " OpenGLendering"; + +2035 + `fd_em_by_funi_d_g +( +vdݙems +, +sw_nd_mode +, +RENDERMODE_SW +)-> +me + = "\x0e""Softwareendering"; + +2036 + `fd_em_by_funi_d_g +( +glݙems +, +sw_nd_mode +, +RENDERMODE_SW +)-> +me + = "\x0e""Softwareendering"; + +2037 +mus +[4]. +ems + = +vdݙems +; + +2040 +ic +-> +nd_beg + = +nd_beg_sw +; + +2041 +ic +-> +nd_d + = +nd_d_sw +; + +2042 +ic +-> +nd_xtze_loc + = +nd_xtze_loc_sw +; + +2043 +ic +-> +nd_xtze_ + = +nd_xtze__sw +; + +2044 +ic +-> +nd_xtze + = +nd_xtze_sw +; + +2045 +ic +-> +nd_r_ + = +nd_r__sw +; + +2046 +ic +-> +nd_gimg + = +nd_gimg_sw +; + +2047 +ic +-> +nd_gimg + = +nd_gimg_sw +; + +2048  +ic +-> +sw_dth +) + +2051 +ic +-> +nd_video + = +nd_video_sw_16b +; + +2054 +ic +-> +nd_video + = +nd_video_sw_32b +; + +2058 +ic +-> +nd_video + = +nd_video_sw_16b +; + +2061 +ic +-> +nd_toggfusn + = +nd_toggfusn_sw +; + +2062 +ic +-> +_nd + = +_nd_sw +; + +2063 +ic +-> +shut_nd + = +shut_nd_sw +; + +2064 + `fd_em_by_funi_d_g +( +vdݙems +, +sw_nd_mode +, +RENDERMODE_GL +)-> +me + = " OpenGLendering"; + +2065 + `fd_em_by_funi_d_g +( +glݙems +, +sw_nd_mode +, +RENDERMODE_GL +)-> +me + = " OpenGLendering"; + +2066 + `fd_em_by_funi_d_g +( +vdݙems +, +sw_nd_mode +, +RENDERMODE_SW +)-> +me + = "\x0e""Softwareendering"; + +2067 + `fd_em_by_funi_d_g +( +glݙems +, +sw_nd_mode +, +RENDERMODE_SW +)-> +me + = "\x0e""Softwareendering"; + +2068 +mus +[4]. +ems + = +vdݙems +; + +2071 #ifde +__OPENGL_AVAILABLE__ + + +2072  +RENDERMODE_GL +: + +2073 +ic +-> +nd_beg + = +nd_beg_gl +; + +2074 +ic +-> +nd_d + = +nd_d_gl +; + +2075 +ic +-> +nd_xtze_loc + = +nd_xtze_loc_gl +; + +2076 +ic +-> +nd_xtze_ + = +nd_xtze__gl +; + +2077 +ic +-> +nd_xtze + = +nd_xtze_gl +; + +2078 +ic +-> +nd_r_ + = +nd_r__gl +; + +2079 +ic +-> +nd_gimg + = +nd_gimg_gl +; + +2080 +ic +-> +nd_gimg + = +nd_gimg_gl +; + +2081 +ic +-> +nd_video + = +nd_video_gl +; + +2082 +ic +-> +nd_toggfusn + = +nd_toggfusn_gl +; + +2083 +ic +-> +_nd + = +_nd_gl +; + +2084 +ic +-> +shut_nd + = +shut_nd_gl +; + +2085 + `fd_em_by_funi_d_g +( +vdݙems +, +sw_nd_mode +, +RENDERMODE_GL +)-> +me + = "\x0e""OpenGLendering"; + +2086 + `fd_em_by_funi_d_g +( +glݙems +, +sw_nd_mode +, +RENDERMODE_GL +)-> +me + = "\x0e""OpenGLendering"; + +2087 + `fd_em_by_funi_d_g +( +vdݙems +, +sw_nd_mode +, +RENDERMODE_SW +)-> +me + = " Softwareendering"; + +2088 + `fd_em_by_funi_d_g +( +glݙems +, +sw_nd_mode +, +RENDERMODE_SW +)-> +me + = " Softwareendering"; + +2089 +mus +[4]. +ems + = +glݙems +; + +2094 +ic +-> +nd_beg + = +nd_beg_nu +; + +2095 +ic +-> +nd_d + = +nd_d_nu +; + +2096 +ic +-> +nd_xtze_loc + = +nd_xtze_loc_nu +; + +2097 +ic +-> +nd_xtze_ + = +nd_xtze__nu +; + +2098 +ic +-> +nd_xtze + = +nd_xtze_nu +; + +2099 +ic +-> +nd_r_ + = +nd_r__nu +; + +2100 +ic +-> +nd_gimg + = +nd_gimg_nu +; + +2101 +ic +-> +nd_gimg + = +nd_gimg_nu +; + +2102 +ic +-> +nd_video + = +nd_video_nu +; + +2103 +ic +-> +nd_toggfusn + = +nd_toggfusn_nu +; + +2104 +ic +-> +_nd + = +_nd_nu +; + +2105 +ic +-> +shut_nd + = +shut_nd_nu +; + +2106 + `fd_em_by_funi_d_g +( +vdݙems +, +sw_nd_mode +, +RENDERMODE_GL +)-> +me + = " OpenGLendering"; + +2107 + `fd_em_by_funi_d_g +( +glݙems +, +sw_nd_mode +, +RENDERMODE_GL +)-> +me + = " OpenGLendering"; + +2108 + `fd_em_by_funi_d_g +( +vdݙems +, +sw_nd_mode +, +RENDERMODE_SW +)-> +me + = " Softwareendering"; + +2109 + `fd_em_by_funi_d_g +( +glݙems +, +sw_nd_mode +, +RENDERMODE_SW +)-> +me + = " Softwareendering"; + +2110 +mus +[4]. +ems + = +vdݙems +; + +2113 + } +} + +2115  + $sw_nd_mode + +mache + * +ic +,  +osdmuem + * +mem +,  +wndmode + ) + +2117 if +ic +-> +ndmode + = +wndmode + ) ; + +2119 + `shut_gui + +ic + ); + +2120 + `shut_joy + +ic + ); + +2121 + `SDL_COMPAT_Qu +(); + +2122 +ed_sdl_qu + = +SDL_FALSE +; + +2125 if + `SDL_In + +SDL_INIT_VIDEO + | +SDL_INIT_AUDIO + ) < 0 ) + +2127 + `r_tf +( "SDL init failed\n" ); + +2128 +ic +-> +emu_mode + = +EM_PLEASEQUIT +; + +2131 +ed_sdl_qu + = +SDL_TRUE +; + +2133 #ide +__APPLE__ + + +2134 + `SDL_COMPAT_WM_SIc + + `SDL_LdBMP + +IMAGEPREFIX +"wic.bmp" ), +NULL + ); + +2137 if! + `_joy + +ic + ) ) + +2139 +ic +-> +emu_mode + = +EM_PLEASEQUIT +; + +2143 if! + `_gui + +ic +, +wndmode + ) ) + +2145 +ic +-> +emu_mode + = +EM_PLEASEQUIT +; + +2149 if! + `ay_ +& +ic +-> +ay +, oric ) ) + +2151 +ic +-> +emu_mode + = +EM_PLEASEQUIT +; + +2155 if! + `_feque + +ic + ) ) + +2157 +ic +-> +emu_mode + = +EM_PLEASEQUIT +; + +2161 if! + `_msgbox + +ic + ) ) + +2163 +ic +-> +emu_mode + = +EM_PLEASEQUIT +; + +2167 + `joy_tup + +ic + ); + +2168 + `m_wm + +ic + ); + +2170 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +2171 + } +} + +2175  + $e_gui + +mache + * +ic + ) + +2177  +i +; + +2178  +i +=0; i< +NUM_TZ +; i++ ) +tz +[i] = +NULL +; + +2179  +i +=0; i< +NUM_GIMG +; i++ ) +gimgs +[i]. +buf + = +NULL +; + +2180 + `ry + +th +, +FILEPREFIX +"tapes" ); + +2181 + `ry + +fe +, "" ); + +2182 + `ry + +diskth +, +FILEPREFIX +"disks" ); + +2183 + `ry + +diskfe +, "" ); + +2184 + `ry + +diskth +, +FILEPREFIX +"teledisks" ); + +2185 + `ry + +diskfe +, "" ); + +2186 + `ry + +avdiskth +, +FILEPREFIX +"pravdisks" ); + +2187 + `ry + +avdiskfe +, "" ); + +2188 + `ry + +moomfe +, +ROMPREFIX +"basic11b" ); + +2189 + `ry + +ic1romfe +, +ROMPREFIX +"basic10" ); + +2190 + `ry + +mdisomfe +, +ROMPREFIX +"microdis" ); + +2191 + `ry + +jasmomfe +, +ROMPREFIX +"jasmin" ); + +2192 + `ry + +avzromfe +[0], +ROMPREFIX +"pravetzt" ); + +2193 + `ry + +avzromfe +[1], +ROMPREFIX +"8dos2" ); + +2194 +bkfes +[0][0] = 0; + +2195 +bkfes +[1][0] = 0; + +2196 +bkfes +[2][0] = 0; + +2197 +bkfes +[3][0] = 0; + +2198 +bkfes +[4][0] = 0; + +2199 + `ry + +bkfes +[5], +ROMPREFIX +"teleass" ); + +2200 + `ry + +bkfes +[6], +ROMPREFIX +"hyperbas" ); + +2201 + `ry + +bkfes +[7], +ROMPREFIX +"telmon24" ); + +2202 + `t_nd_mode + +ic +, +RENDERMODE_NULL + ); + +2203 + `ry + +th +, +FILEPREFIX +"snapshots" ); + +2204 + `ry + +fe +, "" ); + +2205 + `ry + +mpgth +, +FILEPREFIX +"keymap" ); + +2206 + `ry + +mpgfe +, "" ); + +2207 + } +} + +2210  + $tmutoggs + +mache + * +ic + ) + +2212  +ic +-> +drivy +) + +2214  +DRV_JASMIN +: + +2215  +DRV_MICRODISC +: + +2216 + `fd_em_by_key +( +maems +, +SDLK_0 +)-> +func + = +disk +; + +2217 + `fd_em_by_key +( +maems +, +SDLK_1 +)-> +func + = +disk +; + +2218 + `fd_em_by_key +( +maems +, +SDLK_2 +)-> +func + = +disk +; + +2219 + `fd_em_by_key +( +maems +, +SDLK_3 +)-> +func + = +disk +; + +2222  +DRV_PRAVETZ +: + +2224 + `fd_em_by_key +( +maems +, +SDLK_0 +)-> +func + = +disk +; + +2225 + `fd_em_by_key +( +maems +, +SDLK_1 +)-> +func + = +disk +; + +2226 + `fd_em_by_key +( +maems +, +SDLK_2 +)-> +func + = +NULL +; + +2227 + `fd_em_by_key +( +maems +, +SDLK_3 +)-> +func + = +NULL +; + +2231 if +soundavaab + && +sound + ) + +2232 + `fd_em_by_funi +( +auݙems +, +toggsound +)-> +me + = "\x0e""Soundnabled"; + +2234 + `fd_em_by_funi +( +auݙems +, +toggsound +)-> +me + = " Soundnabled"; + +2236 if +ic +-> +noi + ) + +2237 + `fd_em_by_funi +( +auݙems +, +toggˏnoi +)-> +me + = "\x0e""Tapeoise"; + +2239 + `fd_em_by_funi +( +auݙems +, +toggˏnoi +)-> +me + = " Tapeoise"; + +2241 if +ic +-> +turbo + ) + +2242 + `fd_em_by_funi +( +hwݙems +, +toggˏturbo +)-> +me + = "\x0e""Turboape"; + +2244 + `fd_em_by_funi +( +hwݙems +, +toggˏturbo +)-> +me + = " Turboape"; + +2246 if +ic +-> +auto + ) + +2247 + `fd_em_by_funi +( +hwݙems +, +toggautot +)-> +me + = "\x0e""Autoinsertape"; + +2249 + `fd_em_by_funi +( +hwݙems +, +toggautot +)-> +me + = " Autoinsertape"; + +2251 if +ic +-> +autewd + ) + +2252 + `fd_em_by_funi +( +hwݙems +, +toggautowd +)-> +me + = "\x0e""Autorewindape"; + +2254 + `fd_em_by_funi +( +hwݙems +, +toggautowd +)-> +me + = " Autorewindape"; + +2256 if +ic +-> +vsynchack + ) + +2257 + `fd_em_by_funi +( +hwݙems +, +toggvsynchack +)-> +me + = "\x0e""VSync hack"; + +2259 + `fd_em_by_funi +( +hwݙems +, +toggvsynchack +)-> +me + = " VSync hack"; + +2261 if +ic +-> +ligh + ) + +2262 + `fd_em_by_funi +( +hwݙems +, +toggligh +)-> +me + = "\x0e""Lightpen"; + +2264 + `fd_em_by_funi +( +hwݙems +, +toggligh +)-> +me + = " Lightpen"; + +2266 if +ic +-> +acbackd + ) + +2268 + `ry +( +acbackdb +, +acbackds +[ +ic +-> +acbackd +]); + +2269 + `rtf +( +acbackdb ++18, "%.4X", +ic +-> +acofft +); + +2270 + `fd_em_by_funi +( +hwݙems +, +toggacbackd +)-> +me + = +acbackdb +; + +2273 + `fd_em_by_funi +( +hwݙems +, +toggacbackd +)-> +me + = +acbackds +[ +ic +-> +acbackd +]; + +2275 if +ic +-> +symbާutd + ) + +2276 + `fd_em_by_funi +( +dbݙems +, +toggsymbާuto +)-> +me + = "\x0e""Autoload symbols file"; + +2278 + `fd_em_by_funi +( +dbݙems +, +toggsymbާuto +)-> +me + = " Autoload symbols file"; + +2280 if +ic +-> +symbs + ) + +2281 + `fd_em_by_funi +( +dbݙems +, +toggsyms +)-> +me + = "\x0e""Case-sensitive symbols"; + +2283 + `fd_em_by_funi +( +dbݙems +, +toggsyms +)-> +me + = " Case-sensitive symbols"; + +2285 if +fusn + ) + +2287 + `fd_em_by_funi +( +vdݙems +, +toggfusn +)-> +me + = "\x0e""Fullscreen"; + +2288 + `fd_em_by_funi +( +glݙems +, +toggfusn +)-> +me + = "\x0e""Fullscreen"; + +2290 + `fd_em_by_funi +( +vdݙems +, +toggfusn +)-> +me + = " Fullscreen"; + +2291 + `fd_em_by_funi +( +glݙems +, +toggfusn +)-> +me + = " Fullscreen"; + +2294 if +ic +-> +io + ) + +2295 + `fd_em_by_funi +( +glݙems +, +toggˬio +)-> +me + = "\x0e""50Hz/60Hzspectatio"; + +2297 + `fd_em_by_funi +( +glݙems +, +toggˬio +)-> +me + = " 50Hz/60Hzspectatio"; + +2299 if +ic +-> +htch + ) + +2300 + `fd_em_by_funi +( +glݙems +, +togghtch +)-> +me + = "\x0e""Horizontal stretch"; + +2302 + `fd_em_by_funi +( +glݙems +, +togghtch +)-> +me + = " Horizontal stretch"; + +2304 if +ic +-> +sƚes + ) + +2306 + `fd_em_by_funi +( +vdݙems +, +toggsƚes +)-> +me + = "\x0e""Scanlines"; + +2307 + `fd_em_by_funi +( +glݙems +, +toggsƚes +)-> +me + = "\x0e""Scanlines"; + +2309 + `fd_em_by_funi +( +vdݙems +, +toggsƚes +)-> +me + = " Scanlines"; + +2310 + `fd_em_by_funi +( +glݙems +, +toggsƚes +)-> +me + = " Scanlines"; + +2313 if +ic +-> +lgho + ) + +2314 + `fd_em_by_funi +( +glݙems +, +togg˷lgho +)-> +me + = "\x0e""PAL ghosting"; + +2316 + `fd_em_by_funi +( +glݙems +, +togg˷lgho +)-> +me + = " PAL ghosting"; + +2319 + `fd_em_by_funi_d_g +( +hwݙems +, +swmach +, (0xffff<<16)| +MACH_ORIC1 + )-> +me + = +ic +-> +ty +==MACH_ORIC1 ? "\x0e""Oric-1" : " Oric-1"; + +2320 + `fd_em_by_funi_d_g +( +hwݙems +, +swmach +, (0xffff<<16)| +MACH_ORIC1_16K + )-> +me + = +ic +-> +ty +==MACH_ORIC1_16K ? "\x0e""Oric-1 16K" : " Oric-1 16K"; + +2321 + `fd_em_by_funi_d_g +( +hwݙems +, +swmach +, (0xffff<<16)| +MACH_ATMOS + )-> +me + = +ic +-> +ty +==MACH_ATMOS ? "\x0e""Atmos" : " Atmos"; + +2322 + `fd_em_by_funi_d_g +( +hwݙems +, +swmach +, ( +DRV_NONE +<<16)| +MACH_TELESTRAT +)-> +me + = +ic +-> +ty +==MACH_TELESTRAT ? "\x0e""Telestrat" : " Telestrat"; + +2323 + `fd_em_by_funi_d_g +( +hwݙems +, +swmach +, (0xffff<<16)| +MACH_PRAVETZ + )-> +me + = +ic +-> +ty +==MACH_PRAVETZ ? "\x0e""Pravetz 8D" : " Pravetz 8D"; + +2325 + `fd_em_by_key +( +hwݙems +, 'm')-> +func + = +miodisom_vid + ? +tdrivy + : +NULL +; + +2326 + `fd_em_by_key +( +hwݙems +, 'j')-> +func + = +jasmrom_vid + ? +tdrivy + : +NULL +; + +2327 + `fd_em_by_key +( +hwݙems +, 'p')-> +func + = +avzrom_vid + ? +tdrivy + : +NULL +; + +2329 + `fd_em_by_key +( +hwݙems +, 'x')-> +me + = +ic +-> +drivy +== +DRV_NONE + ? "\x0e""No disk" : " No disk"; + +2330 + `fd_em_by_key +( +hwݙems +, 'm')-> +me + = +ic +-> +drivy +== +DRV_MICRODISC + ? "\x0e""Microdisc" : " Microdisc"; + +2331 + `fd_em_by_key +( +hwݙems +, 'j')-> +me + = +ic +-> +drivy +== +DRV_JASMIN + ? "\x0e""Jasmin" : " Jasmin"; + +2332 + `fd_em_by_key +( +hwݙems +, 'p')-> +me + = +ic +-> +drivy +== +DRV_PRAVETZ + ? "\x0e""Pravetz 8D disk": " Pravetz 8D disk"; + +2334 if( +ic +-> +show_keybrd +) + +2335 + `fd_em_by_funi +( +keݙems +, +toggkeybrd +)-> +me + = "\x0e""Show keyboard"; + +2337 + `fd_em_by_funi +( +keݙems +, +toggkeybrd +)-> +me + = " Show keyboard"; + +2339 if( +ic +-> +show_keybrd +) + +2340 + `fd_em_by_funi +( +keݙems +, +toggˡickykeys +)-> +me + = "\x0e""Sticky mod keys"; + +2342 + `fd_em_by_funi +( +keݙems +, +toggˡickykeys +)-> +me + = " Sticky mod keys"; + +2344 + `fd_em_by_funi +( +hwݙems +, +toggch376 +)-> +me + = +ic +-> +ch376_aived + ? "\x0e""CH376 (Telestrat)" : " CH376 (Telestrat) "; + +2345 + } +} + +2348 +SDL_bo + + $_gui + +mache + * +ic +, +St32 + +ndmode + ) + +2350  +i +; + +2351 +SDL_AudioSc + +wd +; + +2353  +i +=0; i< +NUM_GIMG +; i++ ) + +2355 if! + `gimg_ld +& +gimgs +[ +i +] ) )  +SDL_FALSE +; + +2358 + `t_nd_mode + +ic +, +ndmode + ); + +2359 if! +ic +-> + `_nd +i +SDL_FALSE +; + +2362 if! + `loc_xtze + +ic +, +TZ_MONITOR +, 0, 228, 50, 21, "Mڙ" ) )  +SDL_FALSE +; + +2363 if! + `loc_xtze + +ic +, +TZ_DEBUG +, 0, 228, 50, 21, "Debug cse" ) )  +SDL_FALSE +; + +2364 if! + `loc_xtze + +ic +, +TZ_MEMWATCH +, 0, 228, 50, 21, "Memy wch" ) )  +SDL_FALSE +; + +2365 if! + `loc_xtze + +ic +, +TZ_REGS +, 240, 0, 50, 19, "6502 Stus" ) )  +SDL_FALSE +; + +2366 if! + `loc_xtze + +ic +, +TZ_VIA +, 400, 228, 30, 21, "VIA Stus" ) )  +SDL_FALSE +; + +2367 if! + `loc_xtze + +ic +, +TZ_VIA2 +, 400, 228, 30, 21, "TeVIA Stus" ) )  +SDL_FALSE +; + +2368 if! + `loc_xtze + +ic +, +TZ_AY +, 400, 228, 30, 21, "AY Stus" ) )  +SDL_FALSE +; + +2369 if! + `loc_xtze + +ic +, +TZ_DISK +, 400, 228, 30, 21, "Disk Stus" ) )  +SDL_FALSE +; + +2372 +wd +. +eq + = +AUDIO_FREQ +; + +2373 +wd +. +fm + = +AUDIO_S16SYS +; + +2374 +wd +. +chls + = 2; + +2375 +wd +. +mes + = +AUDIO_BUFLEN +; + +2377 +wd +. +back + = (*) +ay_back +; + +2378 +wd +. +urda + = & +ic +-> +ay +; + +2380 +soundavaab + = +SDL_FALSE +; + +2381 +sound + = +SDL_FALSE +; + +2382 if + `SDL_OnAudio +& +wd +, & +obed + ) >= 0 ) + +2384 +sound + = +SDL_TRUE +; + +2385 +soundavaab + = +SDL_TRUE +; + +2386 +sounds + = +obed +. +s + * 8192; + +2387 +cyeme + = (( +CYCLESPERSECOND +<< +FPBITS +)/ +obed +. +eq +); + +2390 + `tmutoggs + +ic + ); + +2391 #i + `defed +( +__APPLE__ +|| defed( +__BEOS__ +|| defed( +__HAIKU__ +) + +2392 + `_gui_tive + +ic + ); + +2393 #i + `defed +( +__WIN32__ +|| defed( +__CYGWIN__ +) + +2394 + `_gui_tive + +ic + ); + +2395 #i + `defed +( +__lux__ +) + +2396 + `_gui_tive + +ic + ); + +2398  +SDL_TRUE +; + +2399 + } +} + +2402  + $shut_gui + +mache + * +ic + ) + +2404  +i +; + +2405  +i + = 0; i< +NUM_GIMG +; i++) + +2407 + ` +( +gimgs +[ +i +]. +buf +); + +2408 +gimgs +[ +i +]. +buf + = 0; + +2411 +ic +-> + `shut_nd +( oric ); + +2413  +i +=0; i< +NUM_TZ +; i++ ) + +2414 + `_xtze + +ic +, +i + ); + +2416 #i + `defed +( +__APPLE__ +|| defed( +__BEOS__ +|| defed( +__HAIKU__ +) + +2417 + `shut_gui_tive + +ic + ); + +2418 #i + `defed +( +__WIN32__ +|| defed( +__CYGWIN__ +) + +2419 + `shut_gui_tive + +ic + ); + +2420 #i + `defed +( +__lux__ +) + +2421 + `shut_gui_tive + +ic + ); + +2423 + } +} + +2425  + $avdiskbo + +mache + * +ic + ) + +2427 if +ic +-> +avdiskautobo + ) + +2429 + `queuekeys +( "CALL800\x0d" ); + +2431 + } +} + + @gui.h + +25 + mRENDERMODE_NULL + = 0, + +26 + mRENDERMODE_SW +, + +27 + mRENDERMODE_GL + + +33 + mTZ_MONITOR + = 0, + +34 + mTZ_DEBUG +, + +35 + mTZ_MEMWATCH +, + +36 + mTZ_REGS +, + +37 + mTZ_VIA +, + +38 + mTZ_VIA2 +, + +39 + mTZ_AY +, + +40 + mTZ_DISK +, + +41 + mTZ_MENU +, + +42 + mTZ_MSGBOX +, + +43 + mTZ_FILEREQ +, + +44 + mNUM_TZ + + +49 + mSTATUSBARMODE_FULL + = 0, + +50 + mSTATUSBARMODE_NOFPS +, + +51 + mSTATUSBARMODE_NONE +, + +52 + mSTATUSBARMODE_LAST + + +55  + sxtze + + +57  + mx +, + my +, + mw +, + mh +; + +58  + mpx +, + mpy +, + mcfc +, + mcbc +; + +59 * + mtx +; + +60 * + mfc +, * + mbc +; + +61 +SDL_bo + + mmodifd +; + +65  + #OSDMENUBAR + ((*)-1) + + ) + +68  + #OMIB_CENTRED + 0 + + ) + +69  + #OMIF_CENTRED + (1<< +OMIB_CENTRED +) + + ) + +70  + #OMIB_BRIGHT + 1 + + ) + +71  + #OMIF_BRIGHT + (1<< +OMIB_BRIGHT +) + + ) + +73  + sosdmuem + + +75 * + mme +; + +76 * + mkey +; + +77  + msdlkey +; + +78 (* + mfunc +)( + mmache + *, + mosdmuem + *,); + +79  + mg +; + +80 +Ut16 + + mags +; + +83  + sosdmu + + +85 * + mt +; + +86  + mcem +; + +87  +osdmuem + * + mems +; + +90  + #VSPTMPSIZE + 1024 + + ) + +92  + sguiimg + + +94 * + mfame +; + +95 +Ut16 + + mw +, + mh +; + +96 +Ut8 + * + mbuf +; + +101 + mGIMG_STATUSBAR +, + +102 + mGIMG_DISK_EJECTED +, + +103 + mGIMG_DISK_IDLE +, + +104 + mGIMG_DISK_ACTIVE +, + +105 + mGIMG_DISK_IDLE_MOD +, + +106 + mGIMG_DISK_ACTIVE_MOD +, + +107 + mGIMG_TAPE_EJECTED +, + +108 + mGIMG_TAPE_PAUSE +, + +109 + mGIMG_TAPE_PLAY +, + +110 + mGIMG_TAPE_STOP +, + +111 + mGIMG_TAPE_RECORD +, + +112 + mGIMG_AVI_RECORD +, + +113 + mGIMG_ORIC1_KEYBOARD +, + +114 + mGIMG_ATMOS_KEYBOARD +, + +115 + mGIMG_PRAVETZ_KEYBOARD +, + +116 + mNUM_GIMG + + +119  + #NUM_GUI_COLS + 16 + + ) + +121 +SDL_bo + +loc_xtze + +mache + * +ic +,  +i +,  +x +,  +y +,  +w +,  +h +, * +t + ); + +122  +_xtze + +mache + * +ic +,  +i + ); + +123 +SDL_bo + +_xtze + +xtze + * +tz +,  +x +,  +y + ); + +125  +do_pup + +mache + * +ic +, * +r + ); + +126  +makebox + +xtze + * +z +,  +x +,  +y +,  +w +,  +h +,  +fg +,  +bg + ); + +127  +tz + +xtze + * +z +, * +t + ); + +128  +tzr + +xtze + * +z +, * +xt + ); + +129  +tzputc + +xtze + * +z +,  +c + ); + +130  +tzos + +xtze + * +z +,  +x +,  +y +, * +xt + ); + +131  +tztc + +xtze + * +z +,  +fc +,  +bc + ); + +132  +tztf + +xtze + * +z +, * +fmt +, ... ); + +133  +tztos + +xtze + * +z +,  +x +,  +y +, * +fmt +, ... ); + +134  +dw_xtze + +xtze + * +z + ); + +135  +tr + +x +,  +y +, +Ut32 + +fc +, Ut32 +bc +, * +r + ); + +136  +gose + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +137  +gomu + +mache + * +ic +,  +osdmuem + * +mem +,  +munum + ); + +138 +SDL_bo + +mu_evt + +SDL_Evt + * +ev +,  +mache + * +ic +, SDL_bo * +ednd + ); + +139  +tmutoggs + +mache + * +ic + ); + +140  +t_nd_mode + +mache + * +ic +,  +whichndmode + ); + +142  +nd + +mache + * +ic + ); + +143  +e_gui + +mache + * +ic + ); + +144 +SDL_bo + +_gui + +mache + * +ic +, +St32 + +ndmode + ); + +145  +shut_gui + +mache + * +ic + ); + +147  +dw_usb + +mache + * +ic + ); + +148  +dw_disks + +mache + * +ic + ); + +149  +dw_avec + +mache + * +ic +, +SDL_bo + +cdg + ); + +150  +dw_ + +mache + * +ic + ); + +152  +dw_keybrd + +mache + * +ic + ); + +155  +urtr + +x +, +Ut32 + +fc +, * +r + ); + +156  +joth +* +th +, * +fe + ); + +160 +SDL_bo + +_gui_tive + +mache + * +ic + ); + +161  +shut_gui_tive + +mache + * +ic + ); + +162  +gui_ݒ_u +cڡ * +u + ); + +163 +SDL_bo + +brd_cy + +mache + * +ic + ); + +164 +SDL_bo + +brd_e + +mache + * +ic + ); + +166  +tovock + +mache + * +ic +,  +osdmuem + * +mem +,  +vue + ); + +167  +r_xtze + +mache + * +ic +,  +i + ); + +169  +osdmuem + * +fd_em_by_funi +(osdmuem * +mu +, * +funi +); + +171  +toggfusn + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +173  +soợtic + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +175  +avdiskbo + +mache + * +ic + ); + + @gui_beos.cpp + +22  + ~ + +23  + ~ + +24  + ~ + +25  + ~ + +26  + ~ + +27  + ~ + +28  + ~ + +29  + ~ + +30  + ~ + +31  + ~ + +32  + ~ + +33  + ~ + +34  + ~ + +35  + ~ + +36  + ~ + +37  + ~ + +40  + ~"syem.h +" + +41  + ~"6502.h +" + +42  + ~"v.h +" + +43  + ~"8912.h +" + +44  + ~"gui.h +" + +45  + ~"disk.h +" + +46  + ~"mڙ.h +" + +47  + ~"6551.h +" + +48  + ~"mache.h +" + +51  +rgb_c + +ic_cs +[] = { + +62  +osdmu + +mus +[]; + +63  +osdmuem + +aboutems +[]; + +66 as + cOSDMuIm + : +public + +BMuIm + { + +67 +public +: + +68 + $OSDMuIm +( +osdmuem + * +desc +, cڡ * +me +, +BMesge + * +mesge +) + +69 : + `BMuIm +( +me +, +mesge +), + $fIm +( +desc +) + +71 i( +desc +-> +me +[0] == '\x0e') + +72 + `SMked +( +ue +); + +73 i( +desc +-> +key +) + +74 + `STrigg +( +desc +-> +key +[0]); + +76 +vtu + ~ + $OSDMuIm +({ + } +}; + +77  +osdmuem + * + gfIm +; + +80  + $bud_tive_mus + +osdmu + * +mu +, +BMu + * +m + ) + +82  +osdmuem + * +em + = +mu +-> +ems +; + +84 + `tf +("mu '%s': {\n", +mu +-> +t +); + +85 ; +em +-> +me +; item++) { + +86 +BMuIm + * +mi +; + +87 cڡ * +me + = +em +->name; + +88 i( +me + = +OSDMENUBAR +) { + +89 +me + = "------------"; + +91 i( +em +[1]. +sdlkey + = +SDLK_BACKSPACE +) + +93 +mi + = +w + + `BSIm +(); + +94 } i( +em +-> +func + = +gomu +) { + +95 i( +em +-> +g + == 0) + +98 i( +mus +[ +em +-> +g +]. +ems + = +aboutems +) { + +99 +mi + = +w + + `BMuIm +( +me +,ew + `BMesge +( +B_ABOUT_REQUESTED +)); + +101 +BMu + * +subMu + = +w + + `BMu +( +me +); + +102 +mi + = +w + + `BMuIm +( +subMu +); + +103 + `bud_tive_mus +& +mus +[ +em +-> +g +], +subMu + ); + +106 i( +me +[0] == ' ' ||ame[0] == '\x0e') + +107 +me + = &name[1]; + +108 +mi + = +w + + `OSDMuIm +( +em +, +me +, +NULL +); + +113 +m +-> + `AddIm +( +mi +); + +115 + `tf +("}\n"); + +116 + } +} + +119  + $run_tive_about +( ) + +121  +osdmuem + * +em + = +aboutems +; + +122 +BSg + +xt +; + +123 ; +em +-> +me +; item++) { + +124 i( +em +-> +me + = +OSDMENUBAR +) + +126 +xt + << +em +-> +me +; + +127 +xt + << "\n"; + +129 +BA˹ + * +t + = +w + + `BA˹ +("About", +xt +. + `Sg +(), "Ok"); + +130 +t +-> + `Go +(); + +131 + } +} + +134 +SDL_bo + + $_gui_tive + +mache + * +ic + ) + +136 +BMimeTy + + `Ty +("application/x-oric-tape"); + +137 i(! +Ty +. + `IsInd +()) + +138 +Ty +. + `Inl +(); + +139 +BMesge + +exts +; + +140 i( +Ty +. + `GFeExnsis +(& +exts +! +B_OK +) { + +141 +exts +. + `AddSg +("extensions", "tap"); + +142 +Ty +. + `SShtDesti +("ORIC Tape"); + +143 +Ty +. + `SLgDesti +("ORIC Tape Image formulators"); + +144 +Ty +. + `SPedA +("application/x-vnd.oricutron"); + +145 +Ty +. + `SFeExnsis +(& +exts +); + +146 +Ty +. + `SSnifrRu +("0.40 [0:8](\"\\026\\026\\026\\044\")"); + +148 +exts +. + `MakeEmy +(); + +149 +BMimeTy + + `diskTy +("application/x-oric-disk"); + +150 i(! +diskTy +. + `IsInd +()) + +151 +diskTy +. + `Inl +(); + +152 i( +diskTy +. + `GFeExnsis +(& +exts +! +B_OK +) { + +153 +exts +. + `AddSg +("extensions", "dsk"); + +154 +diskTy +. + `Inl +(); + +155 +diskTy +. + `SShtDesti +("ORIC Disk"); + +156 +diskTy +. + `SLgDesti +("ORIC Disk Image formulators"); + +157 +diskTy +. + `SPedA +("application/x-vnd.oricutron"); + +158 +diskTy +. + `SFeExnsis +(& +exts +); + +159 +diskTy +. + `SSnifrRu +("0.80 (\"MFM_DISK\")"); + +170  +SDL_TRUE +; + +171 + } +} + +173  + $shut_gui_tive + +mache + * +ic + ) + +175 + } +} + +177 "C" +SDL_bo + +brd_cy + +mache + * +ic + ); + +178 "C" +SDL_bo + +brd_e + +mache + * +ic + ); + +180 +xt_run + * + $w_run +( +t32 + +offt +,  +c +) + +182 +BFt + + `ft +( +be_fixed_ft +); + +183 +xt_run + * +run + = +w +ext_run; + +184 +run +-> +offt + = offset; + +185 +run +-> +ft + = font; + +186 +run +-> +c + = +ic_cs +[color]; + +187  +run +; + +188 + } +} + +191 +SDL_bo + + $brd_cy_xt + +mache + * +ic + ) + +193 * +vidmem + = (& +ic +-> +mem +[ic-> +vid_addr +]); + +194  +le +, +c +; + +196 +BSg + +xt +; + +197 +BLi + +xuns +; + +199 +xuns +. + `AddIm +( + `w_run +(0, 0)); + +201  +le + = 0;ine < 28;ine++) { + +202  +c + = 0; col < 40; col++) { + +203  +c + = +vidmem +[ +le + * 40 + +c +]; + +205 i( +c + > 127) { + +206 +c + -= 128; + +209 i( +c + < 8) { + +210 +xuns +. + `AddIm +( + `w_run +( +xt +. + `Lgth +(), +c +)); + +211 +xt + << ' '; + +212 } i( +c + < ' ' || c == 127) { + +213 +xt + << ' '; + +214 } i( +c + == 0x60) { + +215 +xt + << +B_UTF8_COPYRIGHT +; + +217 +xt + << () +c +; + +219 +xt + << '\n'; + +224 +BMesge + * + + = +NULL +; + +225 i( +be_brd +-> + `Lock +()) { + +226 +be_brd +-> + `Cˬ +(); + +227 + + = +be_brd +-> + `Da +(); + +228 i( + +) { + +229 + +-> + `AddDa +("xt/a", +B_MIME_TYPE +, +xt +. + `Sg +(),ext. + `Lgth +()); + +231  +ySize + = ( +xt_run_y +) + +232 + +xuns +. + `CouIms +(* ( +xt_run +); + +233 +xt_run_y + * +y + = (xt_run_y *) + `mloc +( +ySize +); + +234 +y +-> +cou + = +xuns +. + `CouIms +(); + +235  +i + = 0; i < +y +-> +cou +; i++) { + +236 + `memy +(& +y +-> +runs +[ +i +], +xuns +. + `ImAt +(i), ( +xt_run +)); + +238 + +-> + `AddDa +("iti/x-vnd.Be-xt_run_y", +B_MIME_TYPE +, + +239 +y +, +ySize +); + +240 + ` +( +y +); + +242 +be_brd +-> + `Comm +(); + +244 +be_brd +-> + `Uock +(); + +247  +i + = 0; i < +xuns +. + `CouIms +(); i++) { + +248 + `de + ( +xt_run + *)( +xuns +. + `ImAt +( +i +)); + +250 +xuns +. + `MakeEmy +(); + +252  +SDL_TRUE +; + +253 + } +} + +256 +SDL_bo + + $brd_cy + +mache + * +ic + ) + +259 i( +ic +-> +vid_addr + =ic-> +vidbas +[0]) { + +261 } i( +ic +-> +vid_addr + =ic-> +vidbas +[2]) { + +263  + `brd_cy_xt + +ic + ); + +266  +SDL_TRUE +; + +267 + } +} + +269 +SDL_bo + + $brd_e + +mache + * +ic + ) + +271 cڡ * +xt +; + +272 +t32 + +xtL +; + +273 +BMesge + * + + = +NULL +; + +275 i( +be_brd +-> + `Lock +()) { + +276 + + = +be_brd +-> + `Da +(); + +277 i( + + && cl-> + `FdDa +("xt/a", +B_MIME_TYPE +, (cڡ **)& +xt +, & +xtL += +B_OK +) { + +278 + `tf +(":%ld\n", +xtL +); + +279 +BSg + + `t +( +xt +, +xtL +); + +280 +t +. + `RA +('\n', '\r'); + +281 +t +. + `RA +('\t', ' '); + +282 + `queuekeys +(*) +t +. + `Sg +() ); + +284 +be_brd +-> + `Uock +(); + +286  +SDL_TRUE +; + +287 + } +} + +291 +SDL_bo + + $brd_e_sdl + +mache + * +ic + ) + +293 cڡ * +xt +; + +294 +t32 + +xtL +; + +295 +BMesge + * + + = +NULL +; + +296 +SDL_Evt + +ev +; + +297 +ev +. +key +. +keysym +. +sncode + = 0; + +298 +ev +. +key +. +keysym +. +mod + = ( +SDLMod +)0; + +299 +ev +. +key +. +keysym +. +sym + = ( +SDLKey +)0; + +301 i( +be_brd +-> + `Lock +()) { + +302 + + = +be_brd +-> + `Da +(); + +303 i( + + && cl-> + `FdDa +("xt/a", +B_MIME_TYPE +, (cڡ **)& +xt +, & +xtL += +B_OK +) { + +304  +i + = 0; i < +xtL +; i++) { + +305 + `rtf +( +dr +, "pushg key '%c'\n", +xt +[ +i +]); + +306 +ev +. +key +. +keysym +. +sym + = ( +SDLKey +) +xt +[ +i +]; + +307 +ev +. +key +. +keysym +. +unicode + = +xt +[ +i +]; + +308 +ev +. +ty + = +SDL_KEYDOWN +; + +309 +ev +. +key +. +e + = +SDL_PRESSED +; + +310 + `SDL_PushEvt +(& +ev +); + +311 +ev +. +ty + = +SDL_KEYUP +; + +312 +ev +. +key +. +e + = +SDL_RELEASED +; + +313 + `SDL_PushEvt +(& +ev +); + +316 +be_brd +-> + `Uock +(); + +318  +SDL_TRUE +; + +319 + } +} + +321  + $gui_ݒ_u +cڡ * +u + ) + +325 +BSg + + `commd +("/bin/open '"); + +326 +commd + << +u + << "'"; + +327 + `syem +( +commd +. + `Sg +()); + +328 + } +} + + @gui_win.c + +27 #ifde +WIN32 + + +28  + ~ + +29  + #WANT_WMINFO + + + ) + +32  + ~"syem.h +" + +33  + ~"6502.h +" + +34  + ~"v.h +" + +35  + ~"8912.h +" + +36  + ~"disk.h +" + +37  + ~"gui.h +" + +38  + ~"mڙ.h +" + +39  + ~"6551.h +" + +40  + ~"mache.h +" + +42  +HWND + + gg_SDL_Wdow +; + +44  +SDL_bo + + glized + = +SDL_FALSE +; + +46 * + gxt + = +NULL +; + +48  + $_brd +() + +50 if( +lized +) + +54 +SDL_SysWMfo + +fo +; + +55 + `SDL_VERSION +(& +fo +. +vsi +); + +56 i( + `SDL_COMPAT_GWMInfo +(& +fo +)) + +59 #i +SDL_MAJOR_VERSION + == 1 + +60 +g_SDL_Wdow + = +fo +. +wdow +; + +62 +g_SDL_Wdow + = +fo +.fo. +w +. +wdow +; + +64 +lized + = +SDL_TRUE +; + +66 + } +} + +68 * + $g_brd_xt_w +() + +70 i(! +lized +) + +71  +NULL +; + +73 i( + `IsClbrdFmAvaab +( +CF_TEXT +&& + `OnClbrd +( +g_SDL_Wdow +)) + +75 cڡ +HANDLE + +hMem + = + `GClbrdDa +( +CF_TEXT +); + +76 i( +hMem +) + +78 * +c + = (*) + `GlobLock +( +hMem +); + +79 i( +c +) + +81 + ` +( +xt +); + +82 +xt + = + `rdup +( +c +); + +83 + `GlobUock +( +hMem +); + +86 + `CloClbrd +(); + +89  +xt +; + +90 + } +} + +92  + $t_brd_xt_w +(cڡ * +xt +) + +94 i(! +lized +) + +97 i +xt + ! +NULL + ) + +99 i + `OnClbrd +( +g_SDL_Wdow +) ) + +101 +HANDLE + +hMem + = + `GlobAoc +(( +GMEM_MOVEABLE +| +GMEM_DDESHARE +), + ` +( +xt +)+1); + +102 i +hMem + ! +NULL + ) + +104 * +d + = (*) + `GlobLock +( +hMem +); + +105 + `memy +( +d +, +xt +, + ` +(text)+1); + +106 + `GlobUock +( +hMem +); + +107 + `EmyClbrd +(); + +108 + `SClbrdDa +( +CF_TEXT +, +hMem +); + +110 + `CloClbrd +(); + +113 + } +} + +115 +SDL_bo + + $_gui_tive + +mache + * +ic + ) + +117 + `_brd +(); + +118  +lized +; + +119 + } +} + +121  + $shut_gui_tive + +mache + * +ic + ) + +123 if( +xt +) + +125 + ` +( +xt +); + +126 +xt + = 0; + +128 + } +} + +130  + $gui_ݒ_u +cڡ * +u + ) + +132 + `ShlExecu +( +NULL +, "ݒ", +u +, + +133 +NULL +, NULL, +SW_SHOWNORMAL +); + +135 + } +} + +137 +SDL_bo + + $brd_cy + +mache + * +ic + ) + +140 i( +ic +-> +vid_addr + !ic-> +vidbas +[2]) + +141  +SDL_FALSE +; + +143  +le +, +c +, +i +; + +144  +xt +[40 * 28 + 28 + 1]; + +145 * +vidmem + = (& +ic +-> +mem +[ic-> +vid_addr +]); + +147  +i + = 0, +le + = 0;ine < 28;ine++) { + +148  +c + = 0; col < 40; col++) { + +149  +c + = +vidmem +[ +le + * 40 + +c +]; + +151 i( +c + > 127) { + +152 +c + -= 128; + +155 i( +c + < ' ' || c == 127) { + +156 +xt +[ +i +++] = ' '; + +158 +xt +[ +i +++] = () +c +; + +160 +xt +[ +i +++] = '\n'; + +162 +xt +[ +i +++] = '\0'; + +165 + `t_brd_xt_w +( +xt +); + +166  +SDL_TRUE +; + +167 + } +} + +169 +SDL_bo + + $brd_e + +mache + * +ic + ) + +171 if( + `g_brd_xt_w +()) + +173 * +p + = +xt +; + +174  +p + && *p) + +176 * +p +) + +178 '\t': * +p + = ' '; ; + +179 '\n': * +p + = '\r'; ; + +181 * +p + = (*p < 0x20 || 127 < *p)? ' ' : *p; + +184 +p +++; + +186 + `queuekeys +( +xt +); + +188  +SDL_TRUE +; + +189 + } +} + + @gui_x11.c + +27  + #WANT_WMINFO + + + ) + +29  + ~"syem.h +" + +30  + ~"6502.h +" + +31  + ~"v.h +" + +32  + ~"8912.h +" + +33  + ~"gui.h +" + +34  + ~"disk.h +" + +35  + ~"mڙ.h +" + +36  + ~"6551.h +" + +37  + ~"mache.h +" + +39  + ~ + +41  +Diy + * + gdiy +; + +42  +Wdow + + gwdow +; + +44  +SDL_bo + + glized + = +SDL_FALSE +; + +46 #i +SDL_MAJOR_VERSION + == 1 + +48 (* + glock_diy +)( +NULL +; + +49 (* + guock_diy +)( +NULL +; + +51  + $Lock_Diy +() + +53 if( +lock_diy +) + +54 + `lock_diy +(); + +55 + } +} + +57  + $Uock_Diy +() + +59 if( +uock_diy +) + +60 + `uock_diy +(); + +61 + } +} + +63  + $brd_fr +(cڡ +SDL_Evt + * +evt +) + +66 i +evt +-> +ty + = +SDL_SYSWMEVENT + &&vt-> +syswm +. +msg + ! +NULL +) + +68 +XEvt + +xevt + = +evt +-> +syswm +. +msg +->event.xevent; + +71  +xevt +. +ty +) + +74  +SeiReque +: + +76 +XEvt + +vt +; + +77 +XSeiRequeEvt + * +q +; + +78  +_fm +; + +79  +nbys +; + +80  +ovow +; + +81 * +_da +; + +83 +q + = & +xevt +. +xiڻque +; + +84 +vt +. +xi +. +ty + = +SeiNify +; + +85 +vt +. +xi +. +diy + = +q +->display; + +86 +vt +. +xi +. +i + = +q +->selection; + +87 +vt +. +xi +. +rg + = +Ne +; + +88 +vt +. +xi +. +ݔty + = +Ne +; + +89 +vt +. +xi +. +que + = +q +->requestor; + +90 +vt +. +xi +. +time + = +q +->time; + +91 i + `XGWdowPrݔty +( +diy +, + `DeuRoWdow +(display), + +92 +XA_CUT_BUFFER0 +, 0, +INT_MAX +/4, +F +, +q +-> +rg +, + +93 & +vt +. +xi +. +rg +, & +_fm +, + +94 & +nbys +, & +ovow +, & +_da += +Sucss + ) + +96 i +vt +. +xi +. +rg + = +q +->target ) + +98 i +vt +. +xi +. +rg + = +XA_STRING + ) + +100 i +_da +[ +nbys +-1] == '\0' ) + +101 -- +nbys +; + +103 + `XChgePrݔty +( +diy +, +q +-> +que +,eq-> +ݔty +, + +104 +vt +. +xi +. +rg +, +_fm +, +PrModeR +, + +105 +_da +, +nbys +); + +106 +vt +. +xi +. +ݔty + = +q +->property; + +108 + `XFe +( +_da +); + +110 + `XSdEvt +( +diy +, +q +-> +que +, +F +,0,& +vt +); + +111 + `XSync +( +diy +, +F +); + +119 + } +} + +121 * + $g_brd_xt_x11 +() + +123 +Atom + +i +; + +124 +Wdow + +owr +; + +125 +Atom + +_ty +; + +126  +_fm +; + +127  +nbys +; + +128  +ovow +; + +129 * +c +; + +130 * +xt + = +NULL +; + +132 i(! +lized +) + +133  +NULL +; + +135 + `Lock_Diy +(); + +136 +owr + = + `XGSeiOwr +( +diy +, +XA_PRIMARY +); + +137 + `Uock_Diy +(); + +139 i( +owr + = +Ne + || owø= +wdow +) + +141 +owr + = + `DeuRoWdow +( +diy +); + +142 +i + = +XA_CUT_BUFFER0 +; + +146  +i_ڣ + = 0; + +147 +SDL_Evt + +evt +; + +149 +owr + = +wdow +; + +151 + `Lock_Diy +(); + +152 +i + = + `XInAtom +( +diy +, "Oricu", +F +); + +153 + `XCvtSei +( +diy +, +XA_PRIMARY +, +XA_STRING +, +i +, +owr +, +CutTime +); + +154 + `Uock_Diy +(); + +156 ! +i_ڣ +) + +158 + `SDL_WaEvt +(& +evt +); + +159 i( +evt +. +ty + = +SDL_SYSWMEVENT + &&vt. +syswm +. +msg + ! +NULL +) + +161 +XEvt + +xevt + = +evt +. +syswm +. +msg +->event.xevent; + +162 i( +xevt +. +ty + = +SeiNify +) && + +163 ( +xevt +. +xi +. +que + = +owr +) ) + +164 +i_ڣ + = 1; + +169 + `Lock_Diy +(); + +170 i( + `XGWdowPrݔty +( +diy +, +owr +, +i +, 0, + +171 +INT_MAX +/4, +F +, +XA_STRING +, & +_ty +, & +_fm +, + +172 & +nbys +, & +ovow +, (**)& +c += +Sucss +) + +174 i( +_ty + = +XA_STRING +) + +176 +xt + = + `rdup +( +c +); + +178 + `XFe +( +c +); + +180 + `Uock_Diy +(); + +182  +xt +; + +183 + } +} + +185  + $t_brd_xt_x11 +(cڡ * +xt +) + +187 i(! +lized +) + +190 i +xt + ! +NULL + ) + +192 + `Lock_Diy +(); + +193 + `XChgePrݔty +( +diy +, + `DeuRoWdow +(display), + +194 ( +Atom +) +XA_CUT_BUFFER0 +, +XA_STRING +, 8, +PrModeR +, (*) +xt +, + ` +(text)+1); + +195 i + `XGSeiOwr +( +diy +, +XA_PRIMARY +! +wdow + ) + +196 + `XSSeiOwr +( +diy +, +XA_PRIMARY +, +wdow +, +CutTime +); + +197 + `Uock_Diy +(); + +199 + } +} + +201  + $_brd +() + +203 if( +lized +) + +207 +SDL_SysWMfo + +fo +; + +208 + `SDL_VERSION +(& +fo +. +vsi +); + +209 i( + `SDL_COMPAT_GWMInfo +(& +fo +)) + +212 i( +fo +. +subsyem + = +SDL_SYSWM_X11 +) + +214 +diy + = +fo +.fo. +x11 +.display; + +215 +wdow + = +fo +.fo. +x11 +.window; + +216 +lock_diy + = +fo +.fo. +x11 +. +lock_func +; + +217 +uock_diy + = +fo +.fo. +x11 +. +uock_func +; + +220 + `SDL_EvtS +( +SDL_SYSWMEVENT +, +SDL_ENABLE +); + +221 + `SDL_COMPAT_SEvtFr +( +brd_fr +); + +223 +lized + = +SDL_TRUE +; + +226 + } +} + +230  + $_brd +() + +232 if( +lized +) + +236 +SDL_SysWMfo + +fo +; + +237 + `SDL_VERSION +(& +fo +. +vsi +); + +238 i( + `SDL_COMPAT_GWMInfo +(& +fo +)) + +241 i( +fo +. +subsyem + = +SDL_SYSWM_X11 +) + +243 +diy + = +fo +.fo. +x11 +.display; + +244 +wdow + = +fo +.fo. +x11 +.window; + +246 +lized + = +SDL_TRUE +; + +249 + } +} + +253 +SDL_bo + + $_gui_tive + +mache + * +ic + ) + +255 + `_brd +(); + +256  +lized +; + +257 + } +} + +259  + $shut_gui_tive + +mache + * +ic + ) + +262 + } +} + +264  + $gui_ݒ_u +cڡ * +u + ) + +267 + } +} + +269 +SDL_bo + + $brd_cy + +mache + * +ic + ) + +272 i( +ic +-> +vid_addr + !ic-> +vidbas +[2]) + +273  +SDL_FALSE +; + +275  +le +, +c +, +i +; + +276  +xt +[40 * 28 + 28 + 1]; + +277 * +vidmem + = (& +ic +-> +mem +[ic-> +vid_addr +]); + +279  +i + = 0, +le + = 0;ine < 28;ine++) { + +280  +c + = 0; col < 40; col++) { + +281  +c + = +vidmem +[ +le + * 40 + +c +]; + +283 i( +c + > 127) { + +284 +c + -= 128; + +287 i( +c + < ' ' || c == 127) { + +288 +xt +[ +i +++] = ' '; + +290 +xt +[ +i +++] = () +c +; + +292 +xt +[ +i +++] = '\n'; + +294 +xt +[ +i +++] = '\0'; + +297 #i +SDL_MAJOR_VERSION + == 1 + +298 + `t_brd_xt_x11 +( +xt +); + +300 + `SDL_SClbrdText +( +xt +); + +302  +SDL_TRUE +; + +303 + } +} + +305 +SDL_bo + + $brd_e + +mache + * +ic + ) + +307 * +xt + = +NULL +; + +309 #i +SDL_MAJOR_VERSION + == 1 + +310 +xt + = + `g_brd_xt_x11 +(); + +312 if( + `SDL_HasClbrdText +()) + +313 +xt + = + `SDL_GClbrdText +(); + +316 if( +xt + ! +NULL +) + +318 * +p + = +xt +; + +319  +p + && *p) + +321 * +p +) + +323 '\t': * +p + = ' '; ; + +324 '\n': * +p + = '\r'; ; + +326 * +p + = (*p < 0x20 || 128 <= *p)? ' ' : *p; + +329 +p +++; + +331 + `queuekeys +( +xt +); + +332 + ` +( +xt +); + +334  +SDL_TRUE +; + +335 + } +} + + @joystick.c + +22  + ~ + +23  + ~ + +24  + ~ + +25  + ~ + +27  + ~"syem.h +" + +28  + ~"6502.h +" + +29  + ~"v.h +" + +30  + ~"8912.h +" + +31  + ~"gui.h +" + +32  + ~"disk.h +" + +33  + ~"mڙ.h +" + +34  + ~"6551.h +" + +35  + ~"mache.h +" + +36  + ~"joyick.h +" + +38  + skeyjoydef + + +40 * + mid +; + +41 +SDL_COMPAT_KEY + + msym +; + +44  +keyjoydef + + gkeyjoyb +[] = { { "BACKSPACE", +SDLK_BACKSPACE + }, + +45 { "TAB", +SDLK_TAB + }, + +46 { "CLEAR", +SDLK_CLEAR + }, + +47 { "RETURN", +SDLK_RETURN + }, + +48 { "ENTER", +SDLK_RETURN + }, + +49 { "PAUSE", +SDLK_PAUSE + }, + +50 { "ESCAPE", +SDLK_ESCAPE + }, + +51 { "SPACE", +SDLK_SPACE + }, + +52 { "HELP", +SDLK_HELP + }, + +53 { "DELETE", +SDLK_DELETE + }, + +54 { "DEL", +SDLK_DELETE + }, + +55 { "LSHIFT", +SDLK_LSHIFT + }, + +56 { "RSHIFT", +SDLK_RSHIFT + }, + +57 { "RCTRL", +SDLK_RCTRL + }, + +58 { "LCTRL", +SDLK_LCTRL + }, + +59 { "RALT", +SDLK_RALT + }, + +60 { "LALT", +SDLK_LALT + }, + +61 { "KP0", +SDLK_KP0 + }, + +62 { "KP1", +SDLK_KP1 + }, + +63 { "KP2", +SDLK_KP2 + }, + +64 { "KP3", +SDLK_KP3 + }, + +65 { "KP4", +SDLK_KP4 + }, + +66 { "KP5", +SDLK_KP5 + }, + +67 { "KP6", +SDLK_KP6 + }, + +68 { "KP7", +SDLK_KP7 + }, + +69 { "KP8", +SDLK_KP8 + }, + +70 { "KP9", +SDLK_KP9 + }, + +71 { "KP_PERIOD", +SDLK_KP_PERIOD + }, + +72 { "KP_FULLSTOP", +SDLK_KP_PERIOD + }, + +73 { "KP_DIVIDE", +SDLK_KP_DIVIDE + }, + +74 { "KP_MULTIPLY", +SDLK_KP_MULTIPLY + }, + +75 { "KP_MINUS", +SDLK_KP_MINUS + }, + +76 { "KP_PLUS", +SDLK_KP_PLUS + }, + +77 { "KP_ENTER", +SDLK_KP_ENTER + }, + +78 { "KP_EQUALS", +SDLK_KP_EQUALS + }, + +79 { "UP", +SDLK_UP + }, + +80 { "DOWN", +SDLK_DOWN + }, + +81 { "LEFT", +SDLK_LEFT + }, + +82 { "RIGHT", +SDLK_RIGHT + }, + +83 { "INSERT", +SDLK_INSERT + }, + +84 { "HOME", +SDLK_HOME + }, + +85 { "END", +SDLK_END + }, + +86 { "PAGEUP", +SDLK_PAGEUP + }, + +87 { "PAGEDOWN", +SDLK_PAGEDOWN + }, + +88 { +NULL +, 0 } }; + +90  +SDL_bo + + gjoysubed + = +SDL_FALSE +; + +91 +Ut8 + + gjoye_a +[6], + gjoye_b +[6]; + +93  +SDL_bo + + $is__joyick + +St16 + +joymode + ) + +95 if +joymode + > +JOYMODE_SDL0 + ) && ( joymod< +JOYMODE_SDL9 + ) ) + +96  +SDL_TRUE +; + +97  +SDL_FALSE +; + +98 + } +} + +100  + $o_joyicks + +mache + * +ic + ) + +102 if +joysubed + ) + +104 if +ic +-> +sdljoy_a + ) + +106 + `SDL_JoyickClo + +ic +-> +sdljoy_a + ); + +107 if +ic +-> +sdljoy_b + =ic-> +sdljoy_a + ) + +108 +ic +-> +sdljoy_b + = +NULL +; + +109 +ic +-> +sdljoy_a + = +NULL +; + +111 if +ic +-> +sdljoy_b + ) + +113 + `SDL_JoyickClo + +ic +-> +sdljoy_b + ); + +114 +ic +-> +sdljoy_b + = +NULL +; + +117 + `SDL_JoyickEvtS + +SDL_FALSE + ); + +119 + } +} + +122 +St16 + + $joy_keyme_to_sym +* +me + ) + +124 +St32 + +i +; + +125  +c +; + +128 if +me +[1] == 0 ) + +130 +c + = + `tow + +me +[0] ); + +131 if +c + >= 32 ) && ( c < 127 ) )  c; + +136  +i +=0; +keyjoyb +[i]. +id +; i++ ) + +138 if + `rcmp + +keyjoyb +[ +i +]. +id +, +me + ) == 0 ) + +139  +keyjoyb +[ +i +]. +sym +; + +143 + } +} + +145  +SDL_bo + + $dojoyevt + +SDL_Evt + * +ev +,  +mache + * +ic +, +St16 + +mode +, +Ut8 + * +joye +, +SDL_Joyick + * +sjoy + ) + +147 +St32 + +i +; + +148 +SDL_COMPAT_KEY + * +kbb +; + +149 +SDL_bo + +swlow + = +SDL_FALSE +; + +151 +kbb + = +ic +-> +kbjoy2 +; + +152  +mode + ) + +154  +JOYMODE_NONE +: + +155  +JOYMODE_MOUSE +: + +156  +SDL_FALSE +; + +158  +JOYMODE_KB1 +: + +159 +kbb + = +ic +-> +kbjoy1 +; + +160  +JOYMODE_KB2 +: + +161  +ev +-> +ty + ) + +163  +SDL_KEYDOWN +: + +164  +i +=0; i<6; i++ ) + +166 if +ev +-> +key +. +keysym +. +sym + = +kbb +[ +i +] ) + +168 +joye +[ +i +] = 1; + +169 +swlow + = +SDL_TRUE +; + +174  +SDL_KEYUP +: + +175  +i +=0; i<6; i++ ) + +177 if +ev +-> +key +. +keysym +. +sym + = +kbb +[ +i +] ) + +179 +joye +[ +i +] = 0; + +180 +swlow + = +SDL_TRUE +; + +187  +JOYMODE_SDL0 +: + +188  +JOYMODE_SDL1 +: + +189  +JOYMODE_SDL2 +: + +190  +JOYMODE_SDL3 +: + +191  +JOYMODE_SDL4 +: + +192  +JOYMODE_SDL5 +: + +193  +JOYMODE_SDL6 +: + +194  +JOYMODE_SDL7 +: + +195  +JOYMODE_SDL8 +: + +196  +JOYMODE_SDL9 +: + +197 if! +sjoy + )  +SDL_FALSE +; + +199  +ev +-> +ty + ) + +201  +SDL_JOYAXISMOTION +: + +202 if +ev +-> +jaxis +. +which + !( +mode +- +JOYMODE_SDL0 + +SDL_FALSE +; + +203 +swlow + = +SDL_TRUE +; + +204  +ev +-> +jaxis +. +axis + ) + +207 if +ev +-> +jaxis +. +vue + < -3200 ) + +209 +joye +[2] = 1; + +210 +joye +[3] = 0; + +211 } if +ev +-> +jaxis +. +vue + > 3200 ) { + +212 +joye +[2] = 0; + +213 +joye +[3] = 1; + +215 +joye +[2] = 0; + +216 +joye +[3] = 0; + +221 if +ev +-> +jaxis +. +vue + < -3200 ) + +223 +joye +[0] = 1; + +224 +joye +[1] = 0; + +225 } if +ev +-> +jaxis +. +vue + > 3200 ) { + +226 +joye +[0] = 0; + +227 +joye +[1] = 1; + +229 +joye +[0] = 0; + +230 +joye +[1] = 0; + +236  +SDL_JOYBUTTONDOWN +: + +237 if +ev +-> +jbu +. +which + !( +mode +- +JOYMODE_SDL0 + +SDL_FALSE +; + +238 +joye +[4+( +ev +-> +jbu +. +bu +&1)] = 1; + +239 +swlow + = +SDL_TRUE +; + +242  +SDL_JOYBUTTONUP +: + +243 if +ev +-> +jbu +. +which + !( +mode +- +JOYMODE_SDL0 + +SDL_FALSE +; + +244 +joye +[4+( +ev +-> +jbu +. +bu +&1)] = 0; + +245 +swlow + = +SDL_TRUE +; + +251  +swlow +; + +252 + } +} + +254  + $joy_budmask + +mache + * +ic + ) + +256 +Ut8 + +mkmask + = 0xff; + +257 +Ut8 + +joyl + = +ic +-> +v +. + `ad_pt_a +( &oric->via ); + +258 +SDL_bo + +gimme_pt_a + = +SDL_FALSE +; + +260  +ic +-> +joy_i + ) + +262  +JOYIFACE_ALTAI +: + +263 if +joyl + & 0x80 ) + +265 if +joye_a +[0] ) +mkmask + &= 0xef; + +266 if +joye_a +[1] ) +mkmask + &= 0xf7; + +267 if +joye_a +[2] ) +mkmask + &= 0xfe; + +268 if +joye_a +[3] ) +mkmask + &= 0xfd; + +269 if +joye_a +[4] ) +mkmask + &= 0xdf; + +270 +gimme_pt_a + = +SDL_TRUE +; + +273 if +joyl + & 0x40 ) + +275 if +joye_b +[0] ) +mkmask + &= 0xef; + +276 if +joye_b +[1] ) +mkmask + &= 0xf7; + +277 if +joye_b +[2] ) +mkmask + &= 0xfe; + +278 if +joye_b +[3] ) +mkmask + &= 0xfd; + +279 if +joye_b +[4] ) +mkmask + &= 0xdf; + +280 +gimme_pt_a + = +SDL_TRUE +; + +284  +JOYIFACE_IJK +: + +285 +mkmask + &= 0xdf; + +287 if(( +ic +-> +v +. +ddrb + & 0x10)==0) || + +288 (( +ic +-> +v +. + `ad_pt_b +( &oric->via )&0x10)!=0) ) + +291 +gimme_pt_a + = +SDL_TRUE +; + +293 if +joyl + & 0xc0 ) == 0xc0 ) ; + +295 if +joyl + & 0x40 ) + +297 if +joye_a +[0] ) +mkmask + &= 0xef; + +298 if +joye_a +[1] ) +mkmask + &= 0xf7; + +299 if +joye_a +[2] ) +mkmask + &= 0xfd; + +300 if +joye_a +[3] ) +mkmask + &= 0xfe; + +301 if +joye_a +[4] ) +mkmask + &= 0xfb; + +304 if +joyl + & 0x80 ) + +306 if +joye_b +[0] ) +mkmask + &= 0xef; + +307 if +joye_b +[1] ) +mkmask + &= 0xf7; + +308 if +joye_b +[2] ) +mkmask + &= 0xfd; + +309 if +joye_b +[3] ) +mkmask + &= 0xfe; + +310 if +joye_b +[4] ) +mkmask + &= 0xfb; + +315 +ic +-> +p܏_joy + = +mkmask +; + +316 if +gimme_pt_a + ) + +318 +ic +-> +v +. + `wre_pt_a +&ic->v, 0xff, +mkmask + ); + +319 +ic +-> +p܏_is_ay + = +SDL_FALSE +; + +321 if! +ic +-> +p܏_is_ay + ) + +323 +ic +-> +v +. + `wre_pt_a +&ic->v, 0xff, oric-> +p܏_ay + ); + +324 +ic +-> +p܏_is_ay + = +SDL_TRUE +; + +327 + } +} + +329 +SDL_bo + + $joy_fr_evt + +SDL_Evt + * +ev +,  +mache + * +ic + ) + +331 +SDL_bo + +swlow_evt +; + +333 +swlow_evt + = + `dojoyevt + +ev +, +ic +, (ic-> +ty +== +MACH_TELESTRAT +? oric-> +joymode_a + : oric-> +joymode_a +, +joye_a +, oric-> +sdljoy_a + ); + +334 +swlow_evt + | + `dojoyevt + +ev +, +ic +, (ic-> +ty +== +MACH_TELESTRAT +? oric-> +joymode_b + : oric-> +joymode_b +, +joye_b +, oric-> +sdljoy_b + ); + +336 if +swlow_evt + ) + +340 + `joy_budmask + +ic + ); + +351  +swlow_evt +; + +352 + } +} + +354  + $dojoytup + +mache + * +ic +, +St16 + +mode_a +, St16 +mode_b + ) + +356 +St32 + +i +; + +358 + `o_joyicks + +ic + ); + +360  +i +=0; i<6; i++ ) + +362 +joye_a +[ +i +] = 0; + +363 +joye_b +[ +i +] = 0; + +366 if(! + `is__joyick + +mode_a + )&& (!is__joyick +mode_b + )) ) + +369 if! +joysubed + ) + +372 if + `SDL_InSubSyem + +SDL_INIT_JOYSTICK + ) != 0 ) + +376 +joysubed + = +SDL_TRUE +; + +379 if + `is__joyick + +mode_a + ) ) + +381 +ic +-> +sdljoy_a + = + `SDL_JoyickOn + +mode_a + - +JOYMODE_SDL0 + ); + +383 + `SDL_JoyickEvtS + +SDL_TRUE + ); + +386 if + `is__joyick + +mode_b + ) ) + +388 if +mode_b + = +mode_a + ) + +390 +ic +-> +sdljoy_b + = oric-> +sdljoy_a +; + +392 +ic +-> +sdljoy_b + = + `SDL_JoyickOn + +mode_b + - +JOYMODE_SDL0 + ); + +393 + `SDL_JoyickEvtS + +SDL_TRUE + ); + +396 + } +} + +398  + $joy_tup + +mache + * +ic + ) + +400 if +ic +-> +ty + = +MACH_TELESTRAT + ) + +401 + `dojoytup + +ic +, oric-> +joymode_a +, oric-> +joymode_b + ); + +403 + `dojoytup + +ic +, oric-> +joymode_a +, oric-> +joymode_b + ); + +404 + } +} + +408 +SDL_bo + + $_joy + +mache + * +ic + ) + +410  +SDL_TRUE +; + +411 + } +} + +413  + $shut_joy + +mache + * +ic + ) + +415 + `o_joyicks + +ic + ); + +416 + } +} + + @joystick.h + +25 + mJOYIFACE_NONE + = 0, + +26 + mJOYIFACE_ALTAI +, + +27 + mJOYIFACE_IJK + + +33 + mJOYMODE_NONE + = 0, + +34 + mJOYMODE_KB1 +, + +35 + mJOYMODE_KB2 +, + +36 + mJOYMODE_SDL0 +, + +37 + mJOYMODE_SDL1 +, + +38 + mJOYMODE_SDL2 +, + +39 + mJOYMODE_SDL3 +, + +40 + mJOYMODE_SDL4 +, + +41 + mJOYMODE_SDL5 +, + +42 + mJOYMODE_SDL6 +, + +43 + mJOYMODE_SDL7 +, + +44 + mJOYMODE_SDL8 +, + +45 + mJOYMODE_SDL9 +, + +46 + mJOYMODE_MOUSE + + +49 +SDL_bo + +_joy + +mache + * +ic + ); + +50  +shut_joy + +mache + * +ic + ); + +52 +St16 + +joy_keyme_to_sym +* +me + ); + +53  +joy_tup + +mache + * +ic + ); + +54 +SDL_bo + +joy_fr_evt + +SDL_Evt + * +ev +,  +mache + * +ic + ); + +55  +joy_budmask + +mache + * +ic + ); + + @keyboard.c + +22 #ifde +_MSC_VER + + +23  + ~ + +26  + ~ + +28  + ~"syem.h +" + +29  + ~"6502.h +" + +30  + ~"v.h +" + +31  + ~"8912.h +" + +32  + ~"gui.h +" + +33  + ~"disk.h +" + +34  + ~"mڙ.h +" + +35  + ~"6551.h +" + +36  + ~"mache.h +" + +37  + ~"feq.h +" + +38  + ~"nd_sw.h +" + +39  + ~"nd_sw8.h +" + +40  + ~"nd_gl.h +" + +41  + ~"nd_nu.h +" + +42  + ~"u.h +" + +43  + ~".h +" + +44  + ~"joyick.h +" + +45  + ~"msgbox.h +" + +46  + ~"keybrd.h +" + +49  +kbdkey + + gkbd_mos +[65], + gkbd_ic1 +[65], + gkbd_avz +[65]; + +51 +SDL_Sur +* + $CeSur + +width + ,  +height + ) + +53 +ut32_t + +rmask + , +gmask + , +bmask + , +amask +; + +54 +SDL_Sur +* +sur +; + +58 #i +SDL_BYTEORDER + = +SDL_BIG_ENDIAN + + +59 +rmask + = 0xff000000; + +60 +gmask + = 0x00ff0000; + +61 +bmask + = 0x0000ff00; + +62 +amask + = 0x000000ff; + +64 +rmask + = 0x000000ff; + +65 +gmask + = 0x0000ff00; + +66 +bmask + = 0x00ff0000; + +67 +amask + = 0xff000000; + +70 +sur + = + `SDL_CeRGBSur +0 , +width + , +height + , 32 , +rmask + , +gmask + , +bmask + , +amask + ); + +71 if +sur + = +NULL + ) + +73 + `r_tf +("CeRGBSur faed: %s", + `SDL_GE +() ); + +74 + `ex +( +EXIT_FAILURE +); + +77  +sur +; + +78 + } +} + +80  + #KEYSIM_FLAG + (( +SDL_COMPAT_KEY +)0x8000) + + ) + +81  + #KEYSIM_MASK + (( +SDL_COMPAT_KEY +)0x7FFF) + + ) + +83  +SDL_COMPAT_KEY + + gkeyM +[] = { + +85 +SDLK_ESCAPE +, 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', +SDLK_BACKSPACE +, + +86 +SDLK_LCTRL +, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', +SDLK_RETURN +, + +87 +SDLK_LSHIFT +, 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', +SDLK_RSHIFT +, + +88 +SDLK_LEFT +, +SDLK_DOWN +, ' ', +SDLK_UP +, +SDLK_RIGHT +, +SDLK_RALT +, ' ', ' ', ' ', ' ', ' ', ' ' }; + +90  +SDL_COMPAT_KEY + + gkeyMPvz +[] = { + +91 '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', +KEYSIM_FLAG +|';', '-', ';', + +92 +SDLK_ESCAPE +, 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', +KEYSIM_FLAG +|'2', '\\', +SDLK_BACKSPACE +, + +93 +SDLK_LCTRL +, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', '[', ']', +SDLK_RETURN +, + +94 +SDLK_LSHIFT +, 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', +SDLK_RSHIFT +, + +95 +SDLK_LEFT +, +SDLK_DOWN +, ' ', +SDLK_UP +, +SDLK_RIGHT +, +SDLK_RALT +, +KEYSIM_FLAG +|'6', ' ', ' ', ' ', ' ', ' ' }; + +97  +SDL_COMPAT_KEY + + gkeyMShiedPvz +[] = { + +98 '1', '\'', '3', '4', '5', '7', +KEYSIM_FLAG +|'\'', '9', '0', '-', '8', KEYSIM_FLAG|'=', '=', + +99 +SDLK_ESCAPE +, 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '~', '\\', +SDLK_BACKSPACE +, + +100 +SDLK_LCTRL +, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', '[', ']', +SDLK_RETURN +, + +101 +SDLK_LSHIFT +, 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', +SDLK_RSHIFT +, + +102 +SDLK_LEFT +, +SDLK_DOWN +, ' ', +SDLK_UP +, +SDLK_RIGHT +, +SDLK_RALT +, '`', ' ', ' ', ' ', ' ', ' ' }; + +105 + mMOD_CTRL + = 0, + +106 + mMOD_LSHIFT +, + +107 + mMOD_RSHIFT +, + +108 + mMOD_FUNCT +, + +109 + mMODKEY_MAX + + +112  +SDL_COMPAT_KEY + + gmodKeys +[ +MODKEY_MAX +] = { +SDLK_LCTRL +, +SDLK_LSHIFT +, +SDLK_RSHIFT +, +SDLK_LALT + }; + +113 * + gmodKeyNames +[ +MODKEY_MAX +] = { "Ctrl", "Left shift", "Right shift", "Funct" }; + +114 cڡ  + gmodKeyMax + = +MODKEY_MAX +; + +115  +SDL_bo + + gmodKeyPsd +[ +MODKEY_MAX +]; + +116  +SDL_bo + + gmodKeyFakePsd +[ +MODKEY_MAX +]; + +118  + $kbd_ + +mache + * +ic + ) + +120  +i +, +j +; + +122 + `memt +(& +modKeyPsd +[0], 0, (modKeyPressed)); + +123 + `memt +(& +modKeyFakePsd +[0], 0, (modKeyFakePressed)); + +125 +ic +-> +keybrd_mpg +. +nb_m + = 0; + +127  +i +=0; i<62; i++ ) + +129 +kbd_mos +[ +i +]. +w + = 43; + +130 +kbd_mos +[ +i +]. +h + = 43; + +131 +kbd_mos +[ +i +]. +highlight + = 0; + +132 +kbd_mos +[ +i +]. +highlightde + = 0; + +133 +kbd_mos +[ +i +]. +is_mod_key + = 0; + +134 +kbd_mos +[ +i +]. +keysim + = +keyM +[i]; + +136 +kbd_ic1 +[ +i +]. +w + = 43; + +137 +kbd_ic1 +[ +i +]. +h + = 43; + +138 +kbd_ic1 +[ +i +]. +highlight + = 0; + +139 +kbd_ic1 +[ +i +]. +highlightde + = 0; + +140 +kbd_ic1 +[ +i +]. +is_mod_key + = 0; + +141 +kbd_ic1 +[ +i +]. +keysim + = +keyM +[i]; + +143 +kbd_avz +[ +i +]. +w + = 41; + +144 +kbd_avz +[ +i +]. +h + = 41; + +145 +kbd_avz +[ +i +]. +highlight + = 0; + +146 +kbd_avz +[ +i +]. +highlightde + = 0; + +147 +kbd_avz +[ +i +]. +is_mod_key + = 0; + +148 +kbd_avz +[ +i +]. +keysim + = +keyMPvz +[i]; + +149 +kbd_avz +[ +i +]. +keysimshied + = +keyMShiedPvz +[i]; + +153  +j + = 0; j < +modKeyMax +; j++) { + +154 i( +kbd_mos +[ +i +]. +keysim + = +modKeys +[ +j +]) { + +155 +kbd_mos +[ +i +]. +is_mod_key + = 1; + +156 +kbd_ic1 +[ +i +]. +is_mod_key + = 1; + +157 +kbd_avz +[ +i +]. +is_mod_key + = 1; + +164  +i +=0; i<13; i++ ) + +166 +kbd_mos +[ +i +]. +x + = i*43+47; + +167 +kbd_mos +[ +i +]. +y + = 10; + +169 +kbd_ic1 +[ +i +]. +x + = i*43+40; + +170 +kbd_ic1 +[ +i +]. +y + = 15; + +172 +kbd_avz +[ +i +]. +x + = i*42+47; + +173 +kbd_avz +[ +i +]. +y + = 10; + +175  +i +=13; i<27; i++ ) + +177 +kbd_mos +[ +i +]. +x + = (i-13)*43+23; + +178 +kbd_mos +[ +i +]. +y + = 53; + +180 +kbd_ic1 +[ +i +]. +x + = (i-13)*43+16; + +181 +kbd_ic1 +[ +i +]. +y + = 58; + +183 +kbd_avz +[ +i +]. +x + = (i-13)*42+25; + +184 +kbd_avz +[ +i +]. +y + = 51; + +186  +i +=27; i<40; i++ ) + +188 +kbd_mos +[ +i +]. +x + = (i-27)*43+38; + +189 +kbd_mos +[ +i +]. +y + = 96; + +191 +kbd_ic1 +[ +i +]. +x + = (i-27)*43+27; + +192 +kbd_ic1 +[ +i +]. +y + = 101; + +194 +kbd_avz +[ +i +]. +x + = (i-27)*43+40; + +195 +kbd_avz +[ +i +]. +y + = 93; + +197 +kbd_mos +[39]. +w + = 65; + +198 +kbd_ic1 +[39]. +w + = 87; + +200 +kbd_mos +[40]. +x + = 38; + +201 +kbd_mos +[40]. +y + = 139; + +202 +kbd_mos +[40]. +w + = 65; + +204  +i +=41; i<52; i++ ) + +206 +kbd_mos +[ +i +]. +x + = (i-41)*43+103; + +207 +kbd_mos +[ +i +]. +y + = 139; + +209 +kbd_mos +[51]. +w + = 65; + +211 +kbd_mos +[52]. +x + = 60; + +212 +kbd_mos +[52]. +y + = 182; + +213 +kbd_mos +[53]. +x + = 103; + +214 +kbd_mos +[53]. +y + = 182; + +215 +kbd_mos +[54]. +x + = 146; + +216 +kbd_mos +[54]. +y + = 182; + +217 +kbd_mos +[54]. +w + = 344; + +218 +kbd_mos +[55]. +x + = 490; + +219 +kbd_mos +[55]. +y + = 182; + +220 +kbd_mos +[56]. +x + = 533; + +221 +kbd_mos +[56]. +y + = 182; + +222 +kbd_mos +[57]. +x + = 576; + +223 +kbd_mos +[57]. +y + = 182; + +224 +kbd_mos +[58]. +x + = -1; + +226  +i +=40; i<52; i++ ) + +228 +kbd_ic1 +[ +i +]. +x + = (i-40)*43+49; + +229 +kbd_ic1 +[ +i +]. +y + = 144; + +232 +kbd_ic1 +[52]. +x + = 135; + +233 +kbd_ic1 +[52]. +y + = 187; + +234 +kbd_ic1 +[53]. +x + = 178; + +235 +kbd_ic1 +[53]. +y + = 187; + +236 +kbd_ic1 +[54]. +x + = 221; + +237 +kbd_ic1 +[54]. +y + = 187; + +238 +kbd_ic1 +[54]. +w + = 215; + +239 +kbd_ic1 +[55]. +x + = 436; + +240 +kbd_ic1 +[55]. +y + = 187; + +241 +kbd_ic1 +[56]. +x + = 479; + +242 +kbd_ic1 +[56]. +y + = 187; + +243 +kbd_ic1 +[57]. +x + = -1; + +245  +i +=41; i<52; i++ ) + +247 +kbd_avz +[ +i +]. +x + = (i-41)*43+103; + +248 +kbd_avz +[ +i +]. +y + = 137; + +251 +kbd_avz +[26]. +x + = 38; + +252 +kbd_avz +[26]. +y + = 180; + +254 +kbd_avz +[39]. +w + = 65; + +255 +kbd_avz +[40]. +x + = 38; + +256 +kbd_avz +[40]. +y + = 137; + +257 +kbd_avz +[40]. +w + = 65; + +258 +kbd_avz +[51]. +w + = 65; + +260 +kbd_avz +[52]. +x + = 82; + +261 +kbd_avz +[52]. +y + = 180; + +262 +kbd_avz +[53]. +x + = 125; + +263 +kbd_avz +[53]. +y + = 180; + +264 +kbd_avz +[54]. +x + = 168; + +265 +kbd_avz +[54]. +y + = 180; + +266 +kbd_avz +[54]. +w + = 215+88; + +267 +kbd_avz +[55]. +x + = 436+40; + +268 +kbd_avz +[55]. +y + = 180; + +269 +kbd_avz +[56]. +x + = 479+40; + +270 +kbd_avz +[56]. +y + = 180; + +271 +kbd_avz +[58]. +x + = (13)*42+25; + +272 +kbd_avz +[58]. +y + = 51; + +273 +kbd_avz +[59]. +x + = 479+40 +42; + +274 +kbd_avz +[59]. +y + = 180; + +275 +kbd_avz +[60]. +x + = -1; + +278 + } +} + +280  +SDL_bo + + gdefg_key_m + = +SDL_FALSE +; + +281  +kbdkey + * + gcut_key + = +NULL +; + +282  +SDL_bo + + ga_keys + = +SDL_FALSE +; + +286 +SDL_bo + + $keybrd_evt + +SDL_Evt + * +ev +,  +mache + * +ic +, +SDL_bo + * +ednd + ) + +288 +SDL_bo + +de + = +SDL_FALSE +; + +289 +SDL_bo + +lshied + = +modKeyPsd +[ +MOD_LSHIFT +]; + +290 +SDL_bo + +rshied + = +modKeyPsd +[ +MOD_RSHIFT +]; + +292  +i +, +x +, +y +, +cut_key_num + = -1; + +293  +tmp +[64]; + +294  +kbdkey + * +kbd +; + +296 i( +a_keys +) + +298 +x + = 0; + +299  +i +=0; i< +modKeyMax +; i++) + +301 i( +modKeyPsd +[ +i +]) + +303 +modKeyPsd +[ +i +] = +SDL_FALSE +; + +304 + `ay_keyess +& +ic +-> +ay +, +modKeys +[ +i +], +SDL_FALSE + ); + +305 + `tf +( +tmp +, mp), "%ad.", +modKeyNames +[ +i +]); + +306 + `do_pup +( +ic +, +tmp +); + +307 +x +++; + +308 } i( +modKeyFakePsd +[ +i +]) { + +309 +modKeyFakePsd +[ +i +] = +SDL_FALSE +; + +310 + `ay_keyess +& +ic +-> +ay +, +modKeys +[ +i +], +SDL_FALSE + ); + +314 i( +x + > 1) + +315 + `do_pup +( +ic +, "All keyseleased"); + +317 +a_keys + = +SDL_FALSE +; + +320 +x + = -1; + +321 +y + = -1; + +322  +ev +-> +ty + ) + +324  +SDL_MOUSEBUTTONDOWN +: + +325 +x + = +ev +-> +bu +.x; + +326 +y + = +ev +-> +bu +.y - 480; + +328  +ic +-> +ty + ) + +330  +MACH_PRAVETZ +: + +331 +kbd + = +kbd_avz +; + +333  +MACH_ORIC1 +: + +334  +MACH_ORIC1_16K +: + +335 +kbd + = +kbd_ic1 +; + +338 +kbd + = +kbd_mos +; + +343 +cut_key + = +NULL +; + +344  +i +=0; i<62; i++) { + +345 i(( +x + > +kbd +[ +i +].x&& (x < kbd[i].x + kbd[i]. +w +) && + +346 ( +y + > +kbd +[ +i +].y&& (y < kbd[i].y + kbd[i]. +h +)) { + +347 +cut_key + = &( +kbd +[ +i +]); + +348 +cut_key_num + = +i +; + +356 i( +cut_key + ! +NULL +) { + +358 if +ev +-> +bu +.bu = +SDL_BUTTON_LEFT + ) + +360 if( +ic +-> +defe_mpg +) { + +361 + `do_pup + +ic +, "Presshe key you wanto use." ); + +362 +defg_key_m + = +SDL_TRUE +; + +365 i( +cut_key +-> +is_mod_key + && +ic +-> +icky_mod_keys +) { + +366  +i +=0; i< +modKeyMax +; i++) { + +367 i( +cut_key +-> +keysim + = +modKeys +[ +i +]) + +371 i( +i + < +modKeyMax +) { + +372 i( +modKeyPsd +[ +i +]) { + +373 +modKeyPsd +[ +i +] = +SDL_FALSE +; + +374 + `tf +( +tmp +, mp), "%ad.", +modKeyNames +[ +i +]); + +376 +modKeyPsd +[ +i +] = +SDL_TRUE +; + +377 + `tf +( +tmp +, mp), "%esd.", +modKeyNames +[ +i +]); + +379 + `do_pup +( +ic +, +tmp +); + +380 + `ay_keyess +& +ic +-> +ay +, +cut_key +-> +keysim +, +modKeyPsd +[ +i +] ); + +381 +cut_key + = +NULL +; + +382  +de +; + +387  +ic +-> +ty + ) + +389  +MACH_PRAVETZ +: + +390 i( +lshied +) { + +391 i( +cut_key_num + == 24) + +392 + `queuekeys +("\x60"); + +393 i( +KEYSIM_FLAG + & +cut_key +-> +keysimshied +) + +394 + `ay_keyess +& +ic +-> +ay +, +modKeys +[ +MOD_LSHIFT +], +SDL_FALSE + ); + +395 + `ay_keyess +& +ic +-> +ay +, +KEYSIM_MASK + & +cut_key +-> +keysimshied +, +SDL_TRUE + ); + +396 } i( +rshied +) { + +397 i( +cut_key_num + == 24) + +398 + `queuekeys +("\x60"); + +399 i( +KEYSIM_FLAG + & +cut_key +-> +keysimshied +) + +400 + `ay_keyess +& +ic +-> +ay +, +modKeys +[ +MOD_RSHIFT +], +SDL_FALSE + ); + +401 + `ay_keyess +& +ic +-> +ay +, +KEYSIM_MASK + & +cut_key +-> +keysimshied +, +SDL_TRUE + ); + +403 i( +cut_key_num + == 59) { + +404 + `queuekeys +("\x14"); + +405 } i( +KEYSIM_FLAG + & +cut_key +-> +keysim +) { + +406 + `ay_keyess +& +ic +-> +ay +, +modKeys +[ +MOD_LSHIFT +], +SDL_TRUE + ); + +407 + `ay_keyess +& +ic +-> +ay +, +KEYSIM_MASK + & +cut_key +-> +keysim +, +SDL_TRUE + ); + +408 +modKeyFakePsd +[ +MOD_LSHIFT +] = +SDL_TRUE +; + +410 + `ay_keyess +& +ic +-> +ay +, +KEYSIM_MASK + & +cut_key +-> +keysim +, +SDL_TRUE + ); + +414  +MACH_ORIC1 +: + +415  +MACH_ORIC1_16K +: + +416  +MACH_ATMOS +: + +418 + `ay_keyess +& +ic +-> +ay +, +cut_key +-> +keysim +, +SDL_TRUE + ); + +423 +a_keys + = +SDL_TRUE +; + +429  +SDL_MOUSEBUTTONUP +: + +430 i(( +cut_key + = +NULL +|| ( +defg_key_m +)) + +434  +ic +-> +ty + ) + +436  +MACH_PRAVETZ +: + +437 i( +lshied + || +rshied +) { + +438 + `ay_keyess +& +ic +-> +ay +, +KEYSIM_MASK + & +cut_key +-> +keysimshied +, +SDL_FALSE + ); + +440 + `ay_keyess +& +ic +-> +ay +, +KEYSIM_MASK + & +cut_key +-> +keysim +, +SDL_FALSE + ); + +443  +MACH_ORIC1 +: + +444  +MACH_ORIC1_16K +: + +445  +MACH_ATMOS +: + +447 + `ay_keyess +& +ic +-> +ay +, +cut_key +-> +keysim +, +SDL_FALSE + ); + +451 +cut_key + = +NULL +; + +454  +SDL_KEYUP +: + +455 i( +defg_key_m +) { + +456 +SDL_KeybrdEvt + * +kbd_evt + = (SDL_KeybrdEv* +ev +; + +457 + `add_to_keybrd_mpg +&( +ic +-> +keybrd_mpg +), +kbd_evt +-> +keysym +. +sym +, +cut_key +-> +keysim + ); + +458 + `do_pup + +ic +, "Key mapping done."); + +459 +defg_key_m + = +SDL_FALSE +; + +460 +cut_key + = +NULL +; + +465  +de +; + +466 + } +} + +468  + $a_icky_keys +() + +470 +a_keys + = +SDL_TRUE +; + +471 + } +} + +473  + $add_to_keybrd_mpg + +keybrd_mpg + * +m +, +SDL_COMPAT_KEY + +ho_key +, SDL_COMPAT_KEY +ic_key + ) + +476  +dex + = 0; + +477  +dex + < +m +-> +nb_m +) { + +478 i( +m +-> +ho_keys +[ +dex +] = +ho_key +) { + +480 +m +-> +ic_keys +[ +dex +] = +ic_key +; + +484 +dex +++; + +488 +m +-> +ho_keys +[m-> +nb_m +] = +ho_key +; + +489 +m +-> +ic_keys +[m-> +nb_m +] = +ic_key +; + +490 +m +-> +nb_m +++; + +491 + } +} + +493  + $t_keybrd_mpg + +keybrd_mpg + * +m + ) + +495 +m +-> +nb_m + = 0; + +496 + } +} + +498 +SDL_bo + + $ve_keybrd_mpg + +mache + * +ic +, * +fame + ) + +500 +SDL_bo + +ok + = +SDL_TRUE +; + +501 +FILE + * +f + = +NULL +; + +503 +f + = + `fݒ +( +fame +, "wt"); + +504 i(! +f +) + +506 + `msgbox +( +ic +, +MSGBOX_OK +, "Unableo create keyboard mapping file (1)"); + +507  +SDL_FALSE +; + +510 i( + `uts +("# SDL_key_symb_f_ho : SDL_key_symb_f_ic\n", +f +) < 0) + +512 + `msgbox +( +ic +, +MSGBOX_OK +, "Unableo writeo keyboard mapping file (2)"); + +513 +ok + = +SDL_FALSE +; + +515 i( +ok + = +SDL_TRUE + && + `uts +("# s hp://www.libsdl.g/a/SDL-1.2.15/docs/html/sdlkey.htm\n", +f +) < 0) + +517 + `msgbox +( +ic +, +MSGBOX_OK +, "Unableo writeo keyboard mapping file (2)"); + +518 +ok + = +SDL_FALSE +; + +522 i( +ok + = +SDL_TRUE + && +ic +-> +keybrd_mpg +. +nb_m + != 0) { + +523  +i +; + +525  +i +=0; i < +ic +-> +keybrd_mpg +. +nb_m + && +ok + = +SDL_TRUE +; i++) { + +527 i( + `rtf +( +f +, "%d : %d\n", +ic +-> +keybrd_mpg +. +ho_keys +[ +i +], oric->keybrd_mpg. +ic_keys +[i]) < 0) + +529 + `msgbox +( +ic +, +MSGBOX_OK +, "Unableo writeo keyboard mapping file (3)"); + +530 +ok + = +SDL_FALSE +; + +535 if( + `fo +( +f += +EOF +) { + +536 + `msgbox +( +ic +, +MSGBOX_OK +, "Unableo close keyboard mapping file (4)"); + +537 +ok + = +SDL_FALSE +; + +540  +ok +; + +541 + } +} + +543 +SDL_bo + + $ld_keybrd_mpg + +mache + * +ic +, * +fame + ) + +545 +SDL_bo + +ok + = +SDL_TRUE +; + +546 +FILE + * +f + = +NULL +; + +547  +buf +[4096]; + +548  +ho_key +, +ic_key +; + +550 +f + = + `fݒ +( +fame +, "rt"); + +551 i(! +f +) + +553 + `msgbox +( +ic +, +MSGBOX_OK +, "Unableoead keyboard mapping file (1)"); + +554  +SDL_FALSE +; + +558 + `t_keybrd_mpg +(&( +ic +-> +keybrd_mpg +)); + +561 ! + `of +( +f +&& ! + ` +(f)) { + +563 i( + `fgs +( +buf +, 4096, +f +)>0) { + +565 i( +buf +[0] != '#') { + +567 i( + `ssnf +( +buf +, "%d : %d", & +ho_key +, & +ic_key +)==2) { + +569 + `add_to_keybrd_mpg +&( +ic +-> +keybrd_mpg +), +ho_key +, +ic_key +); + +575 if( + ` +( +f +)) { + +576 + `msgbox +( +ic +, +MSGBOX_OK +, "Problem whileeading from keyboard mapping file (2)"); + +577 +ok + = +SDL_FALSE +; + +580 i( +ok + = +SDL_TRUE + && + `rtf +( +buf +, "Rd %d key mpgs", +ic +-> +keybrd_mpg +. +nb_m +) > 0) + +581 + `do_pup +( +ic +, +buf +); + +583 if( + `fo +( +f += +EOF +) { + +584 + `msgbox +( +ic +, +MSGBOX_OK +, "Unableo close keyboard mapping file (3)"); + +585 +ok + = +SDL_FALSE +; + +588  +ok +; + +589 + } +} + + @keyboard.h + +21 #ide +KEYBOARD_H + + +22  + #KEYBOARD_H + + + ) + +24  + skbdkey + + +26  + mx +, + my +, + mw +, + mh +; + +27  + mhighlight +; + +28  + mhighlightde +; + +29 +SDL_COMPAT_KEY + + mkeysim +; + +30 +SDL_COMPAT_KEY + + mkeysimshied +; + +31  + mis_mod_key +; + +34  + skeybrd_mpg + + +36 +SDL_COMPAT_KEY + + mho_keys +[65]; + +37 +SDL_COMPAT_KEY + + mic_keys +[65]; + +38 +SDL_COMPAT_KEY + + mnb_m +; + +42  +kbd_ + +mache + * +ic + ); + +44 +SDL_bo + +keybrd_evt + +SDL_Evt + * +ev +,  +mache + * +ic +, SDL_bo * +ednd + ); + +46  +a_icky_keys +(); + +48  +add_to_keybrd_mpg + +keybrd_mpg + * +m +, +SDL_COMPAT_KEY + +ho_key +, SDL_COMPAT_KEY +ic_key + ); + +50  +t_keybrd_mpg + +keybrd_mpg + * +m + ); + +52 +SDL_bo + +ve_keybrd_mpg + +mache + * +ic +, * +fame + ); + +54 +SDL_bo + +ld_keybrd_mpg + +mache + * +ic +, * +fame + ); + + @machine.c + +22  + ~ + +23  + ~ + +24  + ~ + +25  + ~ + +27 #i +defed +( +__amigaos4__ +|| defed( +__MORPHOS__ +) + +28  + ~ + +29  + ~ + +30  + ~ + +33  + ~"syem.h +" + +34  + ~"6502.h +" + +35  + ~"v.h +" + +36  + ~"8912.h +" + +37  + ~"gui.h +" + +38  + ~"disk.h +" + +39  + ~"mڙ.h +" + +40  + ~"6551.h +" + +46  + ~"ugs/ch376/ch376.h +" + +47  + ~"ugs/ch376/ic_ch376_ug.h +" + +49  + ~"mache.h +" + +50  + ~"avi.h +" + +51  + ~"feq.h +" + +52  + ~"ma.h +" + +53  + ~"u.h +" + +54  + ~"joyick.h +" + +55  + ~".h +" + +56  + ~"keybrd.h +" + +58 +SDL_bo + +wpd +, +soundavaab +, +sound +; + +59  +diskth +[], +diskfe +[], +fmp +[]; + +60  +diskth +[], +diskfe +[]; + +61  +avdiskth +[], +avdiskfe +[]; + +62 +SDL_bo + +eshus +, +eshavi +; + +63  +g_mu_scheme +; + +65  + gmoomfe +[1024]; + +66  + gic1romfe +[1024]; + +67  + gmdisomfe +[1024]; + +68  + gjasmomfe +[1024]; + +69  + gavzromfe +[2][1024]; + +70  + gbkfes +[8][1024]; + +72  +avi_hd + * + gvidp + = +NULL +; + +73  + gvidame +[128]; + +74  + gvidpcou + = 0; + +76  + gsname +[128]; + +77  + gsnpcou + = 0; + +79  + grom_miodisc +[8912], + grom_jasm +[2048], + grom_avz +[512]; + +80  +symbޏb + + gsym_miodisc +, + gsym_jasm +, + gsym_avz +; + +81 +SDL_bo + + gmiodisom_vid +, + gjasmrom_vid +, + gavzrom_vid +; + +82  +osdmuem + +maems +[]; + +84 +Ut8 + + gi +[] = { 0x00, 0x00, 0x00, + +93  +Ut8 + + gdic_de +[] = + +100  +Ut8 + + gtd_de +[] = + +107  +Ut8 + + gdos_de +[] = + +114  + $de_image_ty +(* +fame +) + +116 +FILE + * +f +; + +117 +size_t + +size +; + +118  +tmp +[6400]; + +120 +f + = + `fݒ +( +fame +, "rb"); + +121 i(! +f +) + +122  +IMG_I_DUNNO +; + +124 + `fek +( +f +, 0, +SEEK_END +); + +125 +size + = + `l +( +f +); + +126 + `fek +( +f +, 0, +SEEK_SET +); + +128 i(1 ! + `d +( +tmp +, 8, 1, +f +)) + +130 + `fo +( +f +); + +131  +IMG_I_DUNNO +; + +135 i(( + `memcmp +( +tmp +, "\x16\x16\x16\x16", 4) == 0) || + +136 ( + `memcmp +( +tmp +, "\x16\x16\x16\x24", 4) == 0) || + +137 ( + `memcmp +( +tmp +, "\x16\x16\x24", 3) == 0) || + +138 ( + `memcmp +( +tmp +, "RIFF", 4) == 0) || + +139 ( + `memcmp +( +tmp +, "ORT\x00", 4) == 0)) + +141 + `fo +( +f +); + +142  +IMG_TAPE +; + +146 i( + `memcmp +( +tmp +, "OSN\x00", 4)==0) + +148 + `fo +( +f +); + +149  +IMG_SNAPSHOT +; + +153 i(( +size + > 20&& ( + `memcmp +( +tmp +, "MFM_DISK", 8)==0)) + +155 +Ut8 + * +r +, * +e +; + +156  +n +; + +157 +SDL_bo + +g٣ + = +SDL_FALSE +; + +160 + `fek +( +f +, 256, +SEEK_SET +); + +161 + `d +( +tmp +, 6400, 1, +f +); + +162 + `fo +( +f +); + +165 +r + = +tmp +; + +166 +e + = & +tmp +[6400]; + +170  ( +r +< +e +) && (ptr[0]!=0xfe) )tr++; + +173 i( +r + > +e +) + +175 + `tf +("%s: couldn'fdck 0 se 1 i%s\n", +__func__ +, +fame +); + +176  +IMG_I_DUNNO +; + +180 +n + = (1<<( +r +[4]+7)); + +181 +g٣ + = ( +r +[3] == 1); + +184 +r ++=7; + +187  ( +r +< +e +) && (ptr[0]!=0xfb) && (ptr[0]!=0xf8) )tr++; + +188 i( +r + > +e +) + +190 + `tf +("%s: couldn'fdck 0 se 1 i%(2)\n", +__func__ +, +fame +); + +191  +IMG_I_DUNNO +; + +195 i( +g٣ +) + +199 +r + + +n ++3; + +200 i( +r + > +e +) + +202 + `tf +("%s: couldn'fdck 0 se 1 i%(3)\n", +__func__ +, +fame +); + +203  +IMG_I_DUNNO +; + +209 i( +n + == 256) + +211 i( + `memcmp +( +r +, +dic_de +, (sedoric_detect))==0) + +212  +IMG_ATMOS_MICRODISC +; + +214 i( + `memcmp +( +r +, +td_de +, (stratsed_detect))==0) + +215  +IMG_TELESTRAT_DISK +; + +217 i( + `memcmp +( +r +, +dos_de +, (ftdos_detect))==0) + +218  +IMG_ATMOS_JASMIN +; + +222  +IMG_GUESS_MICRODISC +; + +225 + `fo +( +f +); + +228 i( +size + == 143360) + +229  +IMG_PRAVETZ_DISK +; + +231  +IMG_I_DUNNO +; + +232 + } +} + +235  + $mumode + +mache + * +ic +,  +osdmuem + * +mem +,  +mode + ) + +237 +ic +-> +emu_mode + = +mode +; + +239  +mode + ) + +241  +EM_RUNNING +: + +242 + `SDL_COMPAT_EbKeyRt +( 0, 0 ); + +243 + `SDL_COMPAT_EbUNICODE + +SDL_FALSE + ); + +244 +ic +-> +ay +. +sound + = +soundavaab + && sound && (! +wpd +); + +245 if +ic +-> +ay +. +sound + ) + +247 + `ay_ushlog +& +ic +-> +ay + ); + +248 + `SDL_PauAudio +( 0 ); + +250 + `u_t_dty + +ic + ); + +253  +EM_MENU +: + +254 if +vidp + ) + `avi_o +( &vidcap ); + +255 + `gomu + +ic +, +NULL +, 0 ); + +256 + `SDL_COMPAT_EbKeyRt + +SDL_DEFAULT_REPEAT_DELAY +, +SDL_DEFAULT_REPEAT_INTERVAL + ); + +257 + `SDL_COMPAT_EbUNICODE + +SDL_TRUE + ); + +258 +ic +-> +ay +. +sound + = +SDL_FALSE +; + +259 if +soundavaab + ) + +260 + `SDL_PauAudio +( 1 ); + +263  +EM_DEBUG +: + +264 if +vidp + ) + `avi_o +( &vidcap ); + +265 + `m_r + +ic + ); + +266 + `SDL_COMPAT_EbKeyRt + +SDL_DEFAULT_REPEAT_DELAY +, +SDL_DEFAULT_REPEAT_INTERVAL + ); + +267 + `SDL_COMPAT_EbUNICODE + +SDL_TRUE + ); + +268 +ic +-> +ay +. +sound + = +SDL_FALSE +; + +269 if +soundavaab + ) + +270 + `SDL_PauAudio +( 1 ); + +273 + } +} + +275  + $om + +mache + * +ic + ) + +278 +ic +-> +rom + = +SDL_TRUE +; + +279 if +ic +-> +drivy + = +DRV_JASMIN + ) + +281 if +ic +-> +jasm +. +ay + == 0 ) + +283 +ic +-> +rom + = !ic-> +romdis +; + +285 +ic +-> +rom + = +SDL_FALSE +; + +288 if +ic +-> +drivy + = +DRV_PRAVETZ + ) + +290 +ic +-> +rom + = !ic-> +avz +. +ay +; + +292 +ic +-> +rom + = !ic-> +romdis +; + +294 + } +} + +297  + $moswre + +m6502 + * +u +,  +addr +,  +da + ) + +299  +mache + * +ic + = (mach*) +u +-> +urda +; + +300 if! +ic +-> +romdis + ) && ( +addr + >= 0xc000 ) ) ; + +301 if +addr + & 0xff00 ) == 0x0300 ) + +303 if +ic +-> +acbackd + && ( oric-> +acofft + < +addr + &&ddr < oric->aciaoffset+4 ) ) + +304 + `ac_wre +& +ic +-> +_ac +, +addr +, +da + ); + +306 if +ic +-> +ch376_aived + && ( 0x340 < +addr + ) && (ddr < 0x342 ) ) + +307 + `ch376_ic_wre +( +ic +-> +ch376 +, +addr +, +da +); + +310 + `v_wre +& +ic +-> +v +, +addr +, +da + ); + +314 +ic +-> +mem +[ +addr +] = +da +; + +315 + } +} + +318  + $o16kwre + +m6502 + * +u +,  +addr +,  +da + ) + +320  +mache + * +ic + = (mach*) +u +-> +urda +; + +321 if! +ic +-> +romdis + ) && ( +addr + >= 0xc000 ) ) ; + +322 if +addr + & 0xff00 ) == 0x0300 ) + +324 if +ic +-> +acbackd + && ( oric-> +acofft + < +addr + &&ddr < oric->aciaoffset+4 ) ) + +325 + `ac_wre +& +ic +-> +_ac +, +addr +, +da + ); + +327 if +ic +-> +ch376_aived + && ( 0x340 < +addr + ) && (ddr < 0x342 ) ) + +328 + `ch376_ic_wre +( +ic +-> +ch376 +, +addr +, +da +); + +331 + `v_wre +& +ic +-> +v +, +addr +, +da + ); + +336 +ic +-> +mem +[ +addr +&0x3fff] = +da +; + +337 + } +} + +340  + $ˡtwre + +m6502 + * +u +,  +addr +,  +da + ) + +342  +mache + * +ic + = (mach*) +u +-> +urda +; + +344 if +addr + >= 0xc000 ) + +350  +ic +-> +_bkty + ) + +352  +TELEBANK_HALFNHALF +: + +353 if +addr + >= 0xe000 ) ; + +354  +TELEBANK_RAM +: + +355 +ic +-> +rom +[ +addr +-0xc000] = +da +; + +362 if +addr + & 0xff00 ) == 0x0300 ) + +364  +addr + & 0x0f0 ) + +368 + `v_wre +& +ic +-> +_v +, +addr +, +da + ); + +372 if +addr + >= 0x31c ) + +373 + `ac_wre +& +ic +-> +_ac +, +addr +, +da + ); + +375 + `miodisc_wre +& +ic +-> +md +, +addr +, +da + ); + +379 i( +ic +-> +ch376_aived +) + +381 i( +addr + == 0x340 ||ddr == 0x341) + +382 + `ch376_ic_wre +( +ic +-> +ch376 +, +addr +, +da +); + +387 + `v_wre +& +ic +-> +v +, +addr +, +da + ); + +393 +ic +-> +mem +[ +addr +] = +da +; + +394 + } +} + +397  + $jasm_moswre + +m6502 + * +u +,  +addr +,  +da + ) + +399  +mache + * +ic + = (mach*) +u +-> +urda +; + +401 if +ic +-> +jasm +. +ay + == 0 ) + +403 if +ic +-> +romdis + ) + +405 if +addr + >= 0xf800 ) ; + +407 if +addr + >= 0xc000 ) ; + +411 if +addr + & 0xff00 ) == 0x0300 ) + +413 if +addr + >= 0x3f4 ) && (ddr < 0x400 ) ) + +414 + `jasm_wre +& +ic +-> +jasm +, +addr +, +da + ); + +416 if +ic +-> +acbackd + && ( oric-> +acofft + < +addr + &&ddr < oric->aciaoffset+4 ) ) + +417 + `ac_wre +& +ic +-> +_ac +, +addr +, +da + ); + +419 if +ic +-> +ch376_aived + && ( 0x340 < +addr + ) && (ddr < 0x342 ) ) + +420 + `ch376_ic_wre +( +ic +-> +ch376 +, +addr +, +da +); + +423 + `v_wre +& +ic +-> +v +, +addr +, +da + ); + +427 +ic +-> +mem +[ +addr +] = +da +; + +428 + } +} + +431  + $jasm_o16kwre + +m6502 + * +u +,  +addr +,  +da + ) + +433  +mache + * +ic + = (mach*) +u +-> +urda +; + +435 if +ic +-> +jasm +. +ay + == 0 ) + +437 if +ic +-> +romdis + ) + +439 if +addr + >= 0xf800 ) ; + +441 if +addr + >= 0xc000 ) ; + +445 if +addr + & 0xff00 ) == 0x0300 ) + +447 if +addr + >= 0x3f4 ) && (ddr < 0x400 ) ) + +448 + `jasm_wre +& +ic +-> +jasm +, +addr +, +da + ); + +450 if +ic +-> +acbackd + && ( oric-> +acofft + < +addr + &&ddr < oric->aciaoffset+4 ) ) + +451 + `ac_wre +& +ic +-> +_ac +, +addr +, +da + ); + +453 if +ic +-> +ch376_aived + && ( 0x340 < +addr + ) && (ddr < 0x342 ) ) + +454 + `ch376_ic_wre +( +ic +-> +ch376 +, +addr +, +da +); + +457 + `v_wre +& +ic +-> +v +, +addr +, +da + ); + +462 +ic +-> +mem +[ +addr +&0x3fff] = +da +; + +463 + } +} + +466  + $miodisc_moswre + +m6502 + * +u +,  +addr +,  +da + ) + +468  +mache + * +ic + = (mach*) +u +-> +urda +; + +469 if +ic +-> +romdis + ) + +471 if +ic +-> +md +. +diskrom + ) && ( +addr + >= 0xe000 ) ) ; + +473 if +addr + >= 0xc000 ) ; + +476 if +addr + & 0xff00 ) == 0x0300 ) + +478 if +addr + >= 0x310 ) && (ddr < 0x31c ) ) + +479 + `miodisc_wre +& +ic +-> +md +, +addr +, +da + ); + +481 if +ic +-> +acbackd + && ( oric-> +acofft + < +addr + &&ddr < oric->aciaoffset+4 ) ) + +482 + `ac_wre +& +ic +-> +_ac +, +addr +, +da + ); + +484 if +ic +-> +ch376_aived + && ( 0x340 < +addr + ) && (ddr < 0x342 ) ) + +485 + `ch376_ic_wre +( +ic +-> +ch376 +, +addr +, +da +); + +488 + `v_wre +& +ic +-> +v +, +addr +, +da + ); + +492 +ic +-> +mem +[ +addr +] = +da +; + +493 + } +} + +496  + $miodisc_o16kwre + +m6502 + * +u +,  +addr +,  +da + ) + +498  +mache + * +ic + = (mach*) +u +-> +urda +; + +499 if +ic +-> +romdis + ) + +501 if +ic +-> +md +. +diskrom + ) && ( +addr + >= 0xe000 ) ) ; + +503 if +addr + >= 0xc000 ) ; + +506 if +addr + & 0xff00 ) == 0x0300 ) + +508 if +addr + >= 0x310 ) && (ddr < 0x31c ) ) + +509 + `miodisc_wre +& +ic +-> +md +, +addr +, +da + ); + +511 if +ic +-> +acbackd + && ( oric-> +acofft + < +addr + &&ddr < oric->aciaoffset+4 ) ) + +512 + `ac_wre +& +ic +-> +_ac +, +addr +, +da + ); + +514 if +ic +-> +ch376_aived + && ( 0x340 < +addr + ) && (ddr < 0x342 ) ) + +515 + `ch376_ic_wre +( +ic +-> +ch376 +, +addr +, +da +); + +518 + `v_wre +& +ic +-> +v +, +addr +, +da + ); + +522 +ic +-> +mem +[ +addr +&0x3fff] = +da +; + +523 + } +} + +526  + $avz_moswre + +m6502 + * +u +,  +addr +,  +da + ) + +528  +mache + * +ic + = (mach*) +u +-> +urda +; + +530 +ic +-> +mem +[ +addr +] = +da +; + +532 if0x300 < +addr + &&ddr <= 0x30f ) + +534 + `v_wre +& +ic +-> +v +, +addr +, +da + ); + +536 if0x310 < +addr + &&ddr <= 0x31f ) + +538 if +ic +-> +acbackd + && oric-> +avz +. +exnsi + == 0x100 ) + +539 + `ac_wre +& +ic +-> +_ac +, +addr +, +da + ); + +541 + `avz_wre +& +ic +-> +avz +, +addr +, +da + ); + +543 if0x320 < +addr + &&ddr <= 0x3ff ) + +545  +addr + ) + +548 +ic +-> +avz +. +ay + = 0; + +549 +ic +-> +avz +. +romdis + = 1; + +550 +ic +-> +avz +. +exnsi + = 0; + +551 +ic +-> +romdis + = !ic-> +avz +.romdis; + +552 +ic +-> +rom + = !ic-> +romdis +; + +555 +ic +-> +avz +. +ay + = 1; + +556 +ic +-> +avz +. +romdis + = 0; + +557 +ic +-> +avz +. +exnsi + = 0; + +558 +ic +-> +romdis + = !ic-> +avz +.romdis; + +559 +ic +-> +rom + = !ic-> +romdis +; + +562 +ic +-> +avz +. +ay + = 0; + +563 +ic +-> +avz +. +romdis + = 1; + +564 +ic +-> +avz +. +exnsi + = 0x100; + +565 +ic +-> +romdis + = !ic-> +avz +.romdis; + +566 +ic +-> +rom + = !ic-> +romdis +; + +569 +ic +-> +avz +. +ay + = 1; + +570 +ic +-> +avz +. +romdis + = 0; + +571 +ic +-> +avz +. +exnsi + = 0x100; + +572 +ic +-> +romdis + = !ic-> +avz +.romdis; + +573 +ic +-> +rom + = !ic-> +romdis +; + +579 + } +} + +582 +SDL_bo + + $iam + +mache + * +ic +,  +addr + ) + +584 if +addr + < 0xc000 )  +SDL_TRUE +; + +586 if +ic +-> +ty + = +MACH_TELESTRAT + ) + +588  +ic +-> +_bkty + = +TELEBANK_RAM +; + +591 if! +ic +-> +romdis + )  +SDL_FALSE +; + +593  +ic +-> +drivy + ) + +595  +DRV_MICRODISC +: + +596 if! +ic +-> +md +. +diskrom + )  +SDL_TRUE +; + +597 if +addr + >0xe000 )  +SDL_FALSE +; + +600  +DRV_JASMIN +: + +601 if +ic +-> +jasm +. +ay + )  +SDL_TRUE +; + +602 if +addr + >0xf800 )  +SDL_FALSE +; + +605  +DRV_PRAVETZ +: + +606 if +ic +-> +avz +. +ay + )  +SDL_TRUE +; + +607 if +addr + >0xc000 )  +SDL_FALSE +; + +611  +SDL_TRUE +; + +612 + } +} + +615  + $mod + +m6502 + * +u +,  +addr + ) + +617  +mache + * +ic + = (mach*) +u +-> +urda +; + +619 if +addr + & 0xff00 ) == 0x0300 ) + +621 if +ic +-> +acbackd + && ( oric-> +acofft + < +addr + &&ddr < oric->aciaoffset+4 ) ) + +622  + `ac_ad +& +ic +-> +_ac +, +addr + ); + +624 if +ic +-> +ch376_aived + && ( 0x340 < +addr + ) && (ddr < 0x342 ) ) + +625  + `ch376_ic_ad +( +ic +-> +ch376 +, +addr +); + +627  + `v_ad +& +ic +-> +v +, +addr + ); + +630 if! +ic +-> +romdis + ) && ( +addr + >= 0xc000 ) ) + +631  +ic +-> +rom +[ +addr +-0xc000]; + +633  +ic +-> +mem +[ +addr +]; + +634 + } +} + +637  + $o16kad + +m6502 + * +u +,  +addr + ) + +639  +mache + * +ic + = (mach*) +u +-> +urda +; + +641 if +addr + & 0xff00 ) == 0x0300 ) + +643 if +ic +-> +acbackd + && ( oric-> +acofft + < +addr + &&ddr < oric->aciaoffset+4 ) ) + +644  + `ac_ad +& +ic +-> +_ac +, +addr + ); + +646 if +ic +-> +ch376_aived + && ( 0x340 < +addr + ) && (ddr < 0x342 ) ) + +647  + `ch376_ic_ad +( +ic +-> +ch376 +, +addr +); + +649  + `v_ad +& +ic +-> +v +, +addr + ); + +652 if! +ic +-> +romdis + ) && ( +addr + >= 0xc000 ) ) + +653  +ic +-> +rom +[ +addr +-0xc000]; + +655  +ic +-> +mem +[ +addr +&0x3fff]; + +656 + } +} + +659  + $ˡd + +m6502 + * +u +,  +addr + ) + +661  +mache + * +ic + = (mach*) +u +-> +urda +; + +663 if +addr + & 0xff00 ) == 0x0300 ) + +665  +addr + & 0x0f0 ) + +669 if +addr + >= 0x31c ) + +671  + `ac_ad +& +ic +-> +_ac +, +addr + ); + +674  + `miodisc_ad +& +ic +-> +md +, +addr + ); + +677  + `v_ad +& +ic +-> +_v +, +addr + ); + +680 i( +ic +-> +ch376_aived +) + +682 i( +addr + == 0x340 ||ddr == 0x341) + +683  + `ch376_ic_ad +( +ic +-> +ch376 +, +addr +); + +687  + `v_ad +& +ic +-> +v +, +addr + ); + +690 if +addr + >= 0xc000 ) + +697  +ic +-> +rom +[ +addr +-0xc000]; + +701  +ic +-> +mem +[ +addr +]; + +702 + } +} + +705  + $jasm_mod + +m6502 + * +u +,  +addr + ) + +707  +mache + * +ic + = (mach*) +u +-> +urda +; + +709 if +ic +-> +jasm +. +ay + == 0 ) + +711 if +ic +-> +romdis + ) + +713 if +addr + >0xf800 )  +rom_jasm +[addr-0xf800]; + +715 if +addr + >0xc000 )  +ic +-> +rom +[addr-0xc000]; + +719 if +addr + & 0xff00 ) == 0x0300 ) + +721 if +addr + >= 0x3f4 ) && (ddr < 0x400 ) ) + +722  + `jasm_ad +& +ic +-> +jasm +, +addr + ); + +724 if +ic +-> +acbackd + && ( oric-> +acofft + < +addr + &&ddr < oric->aciaoffset+4 ) ) + +725  + `ac_ad +& +ic +-> +_ac +, +addr + ); + +727 if +ic +-> +ch376_aived + && ( 0x340 < +addr + ) && (ddr < 0x342 ) ) + +728  + `ch376_ic_ad +( +ic +-> +ch376 +, +addr +); + +730  + `v_ad +& +ic +-> +v +, +addr + ); + +733  +ic +-> +mem +[ +addr +]; + +734 + } +} + +737  + $jasm_o16kad + +m6502 + * +u +,  +addr + ) + +739  +mache + * +ic + = (mach*) +u +-> +urda +; + +741 if +ic +-> +jasm +. +ay + == 0 ) + +743 if +ic +-> +romdis + ) + +745 if +addr + >0xf800 )  +rom_jasm +[addr-0xf800]; + +747 if +addr + >0xc000 )  +ic +-> +rom +[addr-0xc000]; + +751 if +addr + & 0xff00 ) == 0x0300 ) + +753 if +addr + >= 0x3f4 ) && (ddr < 0x400 ) ) + +754  + `jasm_ad +& +ic +-> +jasm +, +addr + ); + +756 if +ic +-> +acbackd + && ( oric-> +acofft + < +addr + &&ddr < oric->aciaoffset+4 ) ) + +757  + `ac_ad +& +ic +-> +_ac +, +addr + ); + +759 if +ic +-> +ch376_aived + && ( 0x340 < +addr + ) && (ddr < 0x342 ) ) + +760  + `ch376_ic_ad +( +ic +-> +ch376 +, +addr +); + +762  + `v_ad +& +ic +-> +v +, +addr + ); + +765  +ic +-> +mem +[ +addr +&0x3fff]; + +766 + } +} + +769  + $miodisc_mod + +m6502 + * +u +,  +addr + ) + +771  +mache + * +ic + = (mach*) +u +-> +urda +; + +773 if +ic +-> +romdis + ) + +775 if +ic +-> +md +. +diskrom + ) && ( +addr + >= 0xe000 ) ) + +776  +rom_miodisc +[ +addr +-0xe000]; + +778 if +addr + >= 0xc000 ) + +779  +ic +-> +rom +[ +addr +-0xc000]; + +782 if +addr + & 0xff00 ) == 0x0300 ) + +784 if +addr + >= 0x310 ) && (ddr < 0x31c ) ) + +785  + `miodisc_ad +& +ic +-> +md +, +addr + ); + +787 if +ic +-> +acbackd + && ( oric-> +acofft + < +addr + &&ddr < oric->aciaoffset+4 ) ) + +788  + `ac_ad +& +ic +-> +_ac +, +addr + ); + +790 if +ic +-> +ch376_aived + && ( 0x340 < +addr + ) && (ddr < 0x342 ) ) + +791  + `ch376_ic_ad +( +ic +-> +ch376 +, +addr +); + +793  + `v_ad +& +ic +-> +v +, +addr + ); + +796  +ic +-> +mem +[ +addr +]; + +797 + } +} + +800  + $miodisc_o16kad + +m6502 + * +u +,  +addr + ) + +802  +mache + * +ic + = (mach*) +u +-> +urda +; + +804 if +ic +-> +romdis + ) + +806 if +ic +-> +md +. +diskrom + ) && ( +addr + >= 0xe000 ) ) + +807  +rom_miodisc +[ +addr +-0xe000]; + +809 if +addr + >= 0xc000 ) + +810  +ic +-> +rom +[ +addr +-0xc000]; + +813 if +addr + & 0xff00 ) == 0x0300 ) + +815 if +addr + >= 0x310 ) && (ddr < 0x31c ) ) + +816  + `miodisc_ad +& +ic +-> +md +, +addr + ); + +818 if +ic +-> +acbackd + && ( oric-> +acofft + < +addr + &&ddr < oric->aciaoffset+4 ) ) + +819  + `ac_ad +& +ic +-> +_ac +, +addr + ); + +821 if +ic +-> +ch376_aived + && ( 0x340 < +addr + ) && (ddr < 0x342 ) ) + +822  + `ch376_ic_ad +( +ic +-> +ch376 +, +addr +); + +824  + `v_ad +& +ic +-> +v +, +addr + ); + +827  +ic +-> +mem +[ +addr +&0x3fff]; + +828 + } +} + +831  + $avz_mod + +m6502 + * +u +,  +addr + ) + +833  +mache + * +ic + = (mach*) +u +-> +urda +; + +835 if0x300 = +addr + & 0xfff0 ) ) + +837  + `v_ad +& +ic +-> +v +, +addr + ); + +840 if0x310 = +addr + & 0xfff0 ) ) + +842 if +ic +-> +acbackd + && oric-> +avz +. +exnsi + == 0x100 ) + +843  + `ac_ad +& +ic +-> +_ac +, +addr + ); + +845  + `avz_ad +& +ic +-> +avz +, +addr + ); + +848 if0x320 < +addr + &&ddr <= 0x3ff ) + +850 if +avzrom_vid + ) + +852  +rom_avz +[ +addr + - 0x300 + +ic +-> +avz +. +exnsi +]; + +856 if0xc000 < +addr + ) + +858 if! +ic +-> +avz +. +ay + ) + +860  +ic +-> +rom +[ +addr +-0xc000]; + +864  +ic +-> +mem +[ +addr +]; + +865 + } +} + +868  + $ligh_ad + +m6502 + * +u +,  +addr + ) + +870  +mache + * +ic + = (mach*) +u +-> +urda +; + +872 if +addr + =0x3e0 )  +ic +-> +lighx +; + +873 if +addr + =0x3e1 )  +ic +-> +lighy +; + +875  +ic +-> + `ad_n_ligh + +u +, +addr + ); + +876 + } +} + +879  +SDL_bo + + $ld_rom + +mache + * +ic +, * +ame +,  +size +, * +whe +,  +symbޏb + * +ab +,  +symags + ) + +881 +SDL_RWs + * +f +; + +882 * +tmame +; + +885 +tmame + = + `mloc + + ` + +ame + ) + 10 ); + +886 if! +tmame + )  +SDL_FALSE +; + +888 + `rtf + +tmame +, "%s.rom", +ame + ); + +889 +f + = + `SDL_RWFromFe + +tmame +, "rb" ); + +890 if! +f + ) + +892 + `r_tf +"Ubˁݒ '%s'\n", +tmame + ); + +893 + ` + +tmame + ); + +894  +SDL_FALSE +; + +897 if +size + < 0 ) + +899  +fesize +; + +900 + `SDL_RWek + +f +, 0, +SEEK_END + ); + +901 +fesize + = + `SDL_RW + +f + ); + +902 + `SDL_RWek + +f +, 0, +SEEK_SET + ); + +904 if +fesize + > - +size + ) + +906 + `r_tf +"ROM '%s'xed%d bys.\n", +ame +, - +size + ); + +907 + `SDL_RWo + +f + ); + +908 + ` + +tmame + ); + +909  +SDL_FALSE +; + +912 +whe + +(- +size +)- +fesize +; + +913 +size + = +fesize +; + +916 if + `SDL_RWad + +f +, +whe +, +size +, 1 ) != 1 ) + +918 + `r_tf +"Ubˁػad '%s'\n", +tmame + ); + +919 + `SDL_RWo + +f + ); + +920 + ` + +tmame + ); + +921  +SDL_FALSE +; + +924 + `SDL_RWo + +f + ); + +926 + `rtf + +tmame +, "%s.sym", +ame + ); + +927 + `m_w_symbs + +ab +, +ic +, +tmame +, +symags +, +SDL_FALSE +, SDL_FALSE ); + +928 + ` + +tmame + ); + +930  +SDL_TRUE +; + +931 + } +} + +933  + $e_mache + +mache + * +ic + ) + +935  +i +; + +937 + `m__symb +& +sym_miodisc + ); + +938 + `m__symb +& +sym_jasm + ); + +939 + `m__symb +& +ic +-> +romsyms + ); + +940 + `m__symb +& +ic +-> +_bksyms +[0] ); + +941 + `m__symb +& +ic +-> +_bksyms +[1] ); + +942 + `m__symb +& +ic +-> +_bksyms +[2] ); + +943 + `m__symb +& +ic +-> +_bksyms +[3] ); + +944 + `m__symb +& +ic +-> +_bksyms +[4] ); + +945 + `m__symb +& +ic +-> +_bksyms +[5] ); + +946 + `m__symb +& +ic +-> +_bksyms +[6] ); + +947 + `m__symb +& +ic +-> +_bksyms +[7] ); + +949 +ic +-> +mem + = +NULL +; + +950 +ic +-> +rom + = +NULL +; + +952 +ic +-> +buf + = +NULL +; + +953 +ic +-> +n + = 0; + +954 +ic +-> +m + = +SDL_FALSE +; + +955 +ic +-> +vsynchack + = +SDL_FALSE +; + +956 +ic +-> +turbo + = +SDL_TRUE +; + +957 +ic +-> +turbo_foff + = +SDL_FALSE +; + +958 +ic +-> +autewd + = +SDL_FALSE +; + +959 +ic +-> +auto + = +SDL_TRUE +; + +960 +ic +-> +symbާutd + = +SDL_TRUE +; + +961 +ic +-> +symbs + = +SDL_FALSE +; + +962 +ic +-> +me +[0] = 0; + +963 +ic +-> +f + = +NULL +; + +964 +ic +-> +ock + = 0; + +965 +ic +-> +o + = 0; + +966 +ic +-> +ϡfe +[0] = 0; + +967 +ic +-> +keym + = +KMAP_QWERTY +; + +968 +ic +-> +usb_mode + = +STATUSBARMODE_FULL +; + +969 +ic +-> +pupr +[0] = 0; + +970 +ic +-> +wpupr + = +SDL_FALSE +; + +971 +ic +-> +puime + = 0; + +972 +ic +-> +usr +[0] = 0; + +973 +ic +-> +wusr + = +SDL_FALSE +; + +974 +ic +-> +sdljoy_a + = +NULL +; + +975 +ic +-> +sdljoy_b + = +NULL +; + +976 +ic +-> +mn + = 0; + +977 +ic +-> +p + = +NULL +; + +978 +ic +-> +noi + = +SDL_FALSE +; + +979 +ic +-> +w + = +SDL_FALSE +; + +981 +ic +-> +joy_i + = +JOYIFACE_NONE +; + +982 +ic +-> +joymode_a + = +JOYMODE_KB1 +; + +983 +ic +-> +joymode_b + = +JOYMODE_NONE +; + +984 +ic +-> +joymode_a + = +JOYMODE_KB1 +; + +985 +ic +-> +joymode_b + = +JOYMODE_NONE +; + +987 +ic +-> +p܏_joy + = 0xff; + +988 +ic +-> +p܏_ay + = 0; + +989 +ic +-> +p܏_is_ay + = +SDL_TRUE +; + +991 +ic +-> +kbjoy1 +[0] = +SDLK_KP8 +; + +992 +ic +-> +kbjoy1 +[1] = +SDLK_KP2 +; + +993 +ic +-> +kbjoy1 +[2] = +SDLK_KP4 +; + +994 +ic +-> +kbjoy1 +[3] = +SDLK_KP6 +; + +995 +ic +-> +kbjoy1 +[4] = +SDLK_KP_ENTER +; + +996 +ic +-> +kbjoy1 +[5] = +SDLK_KP_PLUS +; + +997 +ic +-> +kbjoy2 +[0] = 'w'; + +998 +ic +-> +kbjoy2 +[1] = 's'; + +999 +ic +-> +kbjoy2 +[2] = 'a'; + +1000 +ic +-> +kbjoy2 +[3] = 'd'; + +1001 +ic +-> +kbjoy2 +[4] = +SDLK_SPACE +; + +1002 +ic +-> +kbjoy2 +[5] = 'n'; + +1004 +ic +-> +drivy + = +DRV_NONE +; + +1005  +i +=0; i< +MAX_DRIVES +; i++ ) + +1007 +ic +-> +wddisk +. +disk +[ +i +] = +NULL +; + +1008 +ic +-> +diskme +[ +i +][0] = 0; + +1010 +ic +-> +diskautove + = +SDL_FALSE +; + +1011 +ic +-> +auto_jasm_t + = +SDL_TRUE +; + +1013 +ic +-> +ligh + = +SDL_FALSE +; + +1014 +ic +-> +lighx + = 0; + +1015 +ic +-> +lighy + = 0; + +1016 +ic +-> +ad_n_ligh + = +NULL +; + +1018 +ic +-> +b + = +SDL_TRUE +; + +1019 +ic +-> +tfr + = +SDL_TRUE +; + +1021 +ic +-> +acbackd + = +ACIA_TYPE_NONE +; + +1022 +ic +-> +acofft + = 0x31c; + +1024 +ic +-> +tvf + = +NULL +; + +1026 +ic +-> +keybrd_mpg +. +nb_m + = 0; + +1027 +ic +-> +show_keybrd + = +SDL_FALSE +; + +1028 +ic +-> +defe_mpg + = +SDL_FALSE +; + +1029 +ic +-> +icky_mod_keys + = +SDL_FALSE +; + +1031 +ic +-> +avdiskautobo + = +SDL_TRUE +; + +1032 + } +} + +1034  + $ld_diskroms + +mache + * +ic + ) + +1036 +miodisom_vid + = + `ld_rom + +ic +, +mdisomfe +, 8192, +rom_miodisc +, & +sym_miodisc +, +SYMF_ROMDIS1 +| +SYMF_MICRODISC + ); + +1037 +jasmrom_vid + = + `ld_rom + +ic +, +jasmomfe +, 2048, +rom_jasm +, & +sym_jasm +, +SYMF_ROMDIS1 +| +SYMF_JASMIN + ); + +1038 +avzrom_vid + = + `ld_rom + +ic +, +avzromfe +[1], 512, +rom_avz +, & +sym_avz +, +SYMF_PRAVZ8D + ); + +1039 + } +} + +1045  + $mkey + +mache + * +ic +,  +key + ) + +1047  +key + ) + +1049 #i + `defed +( +__amigaos4__ +|| defed( +__MORPHOS__ +|| defed( +__AROS__ +) + +1066 #i + `defed +( +WIN32 +) + +1071 i( +ic +-> +keybrd_mpg +. +nb_m + != 0) { + +1072  +i +; + +1073  +i +=0; i < +ic +-> +keybrd_mpg +. +nb_m +; i++) { + +1074 i( +key + = +ic +-> +keybrd_mpg +. +ho_keys +[ +i +]) + +1075  +ic +-> +keybrd_mpg +. +ic_keys +[ +i +]; + +1079  +key +; + +1080 + } +} + +1082  +SDL_bo + + glighdown + = +SDL_FALSE +; + +1083  + $move_ligh + +mache + * +ic +,  +x +,  +y + ) + +1085 i(! +lighdown +) ; + +1087 i(( +ic +-> +ndmode + = +RENDERMODE_SW +|| (!ic-> +htch +)) + +1089 +x + = (x-80)/2; + +1090 if( +ic +-> +ndmode + = +RENDERMODE_GL + && oric-> +io + && oric-> +vid_eq +) + +1092 +y + = (y-48)/2; + +1096 +y + = (y-14)/2; + +1101 +x + = (()x)/(640.0f/240.0f); + +1102 +y + = (y-14)/2; + +1105 i(( +x +>=0&& (x<240&& ( +y +>=0) && (y<224)) + +1107 i( +ic +-> +s +[ +y +*240+ +x +] != 0) + +1109 +ic +-> +lighx + = ( +x ++219)&0xff; + +1110 +ic +-> +lighy + = ( +y ++54)&0xff; + +1113 + } +} + +1115  +SDL_bo + + gshied + = +SDL_FALSE +; + +1116 +SDL_bo + + $emu_evt + +SDL_Evt + * +ev +,  +mache + * +ic +, +SDL_bo + * +ednd + ) + +1118 +St32 + +i +; + +1120 if + `joy_fr_evt + +ev +, +ic + ) ) + +1121  +SDL_FALSE +; + +1124  +ev +-> +ty + ) + +1126  +SDL_MOUSEBUTTONDOWN +: + +1127  +ev +-> +bu +.button) + +1129  +SDL_BUTTON_LEFT +: + +1130 +lighdown + = +SDL_TRUE +; + +1131 + `move_ligh + +ic +, +ev +-> +bu +. +x +,v->bu. +y + ); + +1134  +SDL_BUTTON_RIGHT +: + +1135 + `mumode + +ic +, +NULL +, +EM_MENU + ); + +1136 * +ednd + = +SDL_TRUE +; + +1141  +SDL_MOUSEBUTTONUP +: + +1142 if +ev +-> +bu +.bu = +SDL_BUTTON_LEFT + ) + +1143 +lighdown + = +SDL_FALSE +; + +1146  +SDL_MOUSEMOTION +: + +1147 + `move_ligh + +ic +, +ev +-> +mi +. +x +,v->mi. +y + ); + +1150  +SDL_KEYUP +: + +1151  +ev +-> +key +. +keysym +. +sym + ) + +1153  +SDLK_F1 +: + +1154 + `mumode + +ic +, +NULL +, +EM_MENU + ); + +1155 * +ednd + = +SDL_TRUE +; + +1158  +SDLK_F2 +: + +1159 + `mumode + +ic +, +NULL +, +EM_DEBUG + ); + +1160 * +ednd + = +SDL_TRUE +; + +1163  +SDLK_F3 +: + +1164 + `soợtic +( +ic +, +NULL +, 0); + +1167  +SDLK_F4 +: + +1168 if +shied + ) && ( +ic +-> +drivy + = +DRV_JASMIN + ) ) + +1169 +ic +-> +u +. + `wre +( &oric->cpu, 0x3fb, 1 ); + +1170 if +ic +-> +drivy + = +DRV_MICRODISC + ) + +1172 +ic +-> +romdis + = +SDL_TRUE +; + +1173 + `miodisc_ +& +ic +-> +md +, &ic-> +wddisk +, oric ); + +1175 if +ic +-> +drivy + = +DRV_PRAVETZ + ) + +1177 +ic +-> +avz +. +ay + = 0; + +1178 +ic +-> +avz +. +romdis + = 1; + +1179 +ic +-> +avz +. +exnsi + = 0; + +1180 +ic +-> +romdis + = !ic-> +avz +.romdis; + +1182 + `om + +ic + ); + +1183 + `m6502_t +& +ic +-> +u + ); + +1184 + `v_ +& +ic +-> +v +, oric, +VIA_MAIN + ); + +1185 + `v_ +& +ic +-> +_v +, oric, +VIA_TELESTRAT + ); + +1186 + `ac_ +& +ic +-> +_ac +, oric ); + +1188 i( +ic +-> +ch376_aived +) + +1190 +ic +-> +ch376 + = + `ch376_ic_ +(); + +1191 i( +ic +-> +ch376 + ! +NULL +) + +1192 + `ch376_ic_cfig +( +ic +-> +ch376 +); + +1197  +SDLK_F5 +: + +1198 +ic +-> +usb_mode + = (ic->usb_mode+1% +STATUSBARMODE_LAST +; + +1199 +eshus + = +SDL_TRUE +; + +1200 +ic +-> +usr +[0] = 0; + +1201 +ic +-> +wusr + = +SDL_TRUE +; + +1204  +SDLK_F6 +: + +1205 if +vidp + ) + +1207 +wpd + = +SDL_FALSE +; + +1211 +wpd + = wpd ? +SDL_FALSE + : +SDL_TRUE +; + +1214 if +soundavaab + && +sound + ) + +1216 + `ay_ushlog +& +ic +-> +ay + ); + +1217 +ic +-> +ay +. +sound + = ! +wpd +; + +1218 + `SDL_PauAudio + +wpd + ); + +1222  +SDLK_F7 +: + +1223 if +ic +-> +drivy + = +DRV_NONE + ) ; + +1225  +i +=0; i<4; i++ ) + +1227 if +ic +-> +wddisk +. +disk +[ +i +] ) && ( oric->wddisk.disk[i]-> +modifd + ) ) + +1229 if +shied + ) + +1231  +me +[64]; + +1232 * +dth +, * +dfe +; + +1234 if +ic +-> +ty + ! +MACH_TELESTRAT + ) + +1236  +ic +-> +drivy +) + +1238  +DRV_PRAVETZ +: + +1239 +dth + = +avdiskth +; + +1240 +dfe + = +avdiskfe +; + +1244 +dth + = +diskth +; + +1245 +dfe + = +diskfe +; + +1249 +dth + = +diskth +; + +1250 +dfe + = +diskfe +; + +1253 + `rtf + +me +, "Savdisk %d", +i + ); + +1254 if + `feque + +ic +, +me +, +dth +, +dfe +, +FR_DISKSAVE + ) ) + +1256 + `joth + +dth +, +dfe + ); + +1257 + `diskimage_ve + +ic +, +fmp +, +i + ); + +1260 + `diskimage_ve + +ic +, oric-> +wddisk +. +disk +[ +i +]-> +fame +, i ); + +1266  +SDLK_F8 +: + +1267 + `toggfusn + +ic +, +NULL +, 0 ); + +1270  +SDLK_F9 +: + +1271 + `toggˏp + +ic +, + `fd_em_by_funi +( +maems +, +toggˏp +), 0 ); + +1274  +SDLK_F10 +: + +1275 if +vidp + ) + +1277 + `ay_lockaudio +& +ic +-> +ay + ); + +1278 + `avi_o +& +vidp + ); + +1279 + `ay_uockaudio +& +ic +-> +ay + ); + +1280 + `do_pup + +ic +, "AVI capture stopped" ); + +1281 +eshavi + = +SDL_TRUE +; + +1285 + `rtf + +vidame +, "Cturgvideo%02d.avi", +vidpcou + ); + +1286 +wpd + = +SDL_FALSE +; + +1287 + `ay_lockaudio +& +ic +-> +ay + ); + +1288 +vidp + = + `avi_ݒ +& +vidame +[13], +i +, +soundavaab +&& +sound +, +ic +-> +vid_eq + ); + +1289 + `ay_uockaudio +& +ic +-> +ay + ); + +1290 if +vidp + ) + +1292 +vidpcou +++; + +1293 + `do_pup + +ic +, +vidame + ); + +1295 +eshavi + = +SDL_TRUE +; + +1297 #ifde +__CBCOPY__ + + +1298  +SDLK_F11 +: + +1299 + `brd_cy + +ic + ); + +1302 #ifde +__CBPASTE__ + + +1303  +SDLK_F12 +: + +1304 + `brd_e + +ic + ); + +1308 #ifde +__amigaos4__ + + +1309  +SDLK_HELP +: + +1310 +IDOS +-> + `SyemTags +( "Multiview Oricutron.guide", + +1311 +SYS_Iut +, +IDOS +-> + `On +"NIL:", +MODE_NEWFILE + ), + +1312 +SYS_Ouut +, +IDOS +-> + `On +"NIL:", +MODE_NEWFILE + ), + +1313 +SYS_Asynch +, +TRUE +, + +1314 +TAG_DONE + ); + +1318 #ifde +__MORPHOS__ + + +1319  +SDLK_HELP +: + +1321  +NewAmigaGuide + +g + = + +1322 { ( +BPTR + +NULL +, + +1324 +NULL +, + +1325 +NULL +, + +1326 +NULL +, + +1327 +NULL +, + +1328 +NULL +, + +1330 +NULL +, + +1333 +NULL +, + +1334 +NULL + + +1337 + `OnAmigaGuide +(& +g +, +TAG_DONE +); + +1342  +SDLK_PRINT +: + +1343 + `rtf + +sname +, "Cturgsnsh%02d.bmp", +snpcou + ); + +1344 +snpcou +++; + +1345 + `do_pup + +ic +, +sname + ); + +1346 + `SDL_COMPAT_TakeSnsh +& +sname +[13] ); + +1349  +SDLK_LSHIFT +: + +1350  +SDLK_RSHIFT +: + +1351 +shied + = +SDL_FALSE +; + +1354 + `ay_keyess +& +ic +-> +ay +, + `mkey +ic, +ev +-> +key +. +keysym +. +sym + ), +SDL_FALSE + ); + +1359  +SDL_KEYDOWN +: + +1360  +ev +-> +key +. +keysym +. +sym + ) + +1362  +SDLK_LSHIFT +: + +1363  +SDLK_RSHIFT +: + +1364 +shied + = +SDL_TRUE +; + +1367 + `ay_keyess +& +ic +-> +ay +, + `mkey +ic, +ev +-> +key +. +keysym +. +sym + ), +SDL_TRUE + ); + +1373  +SDL_FALSE +; + +1374 + } +} + +1376  + $bnk_m + +St32 + +how +, +Ut8 + * +mem +, +Ut32 + +size + ) + +1378 +Ut32 + +i +, +j +; + +1380  +how + ) + +1383  +i +=0; i< +size +; i+=256 ) + +1385  +j +=0; j<128; j++ ) + +1387 +mem +[ +i ++ +j + ] = 0; + +1388 +mem +[ +i ++ +j ++128] = 255; + +1394  +i +=0; i< +size +; i+=2 ) + +1396 +mem +[ +i + ] = 0xff; + +1397 +mem +[ +i ++1] = 0x00; + +1401 + } +} + +1403  + $r_tches + +mache + * +ic + ) + +1405 +ic +-> +pch_fd_d_gme_pc + = -1; + +1406 +ic +-> +pch_fd_cve_gme_pc + = -1; + +1407 +ic +-> +pch_fd_e_gme_pc + = -1; + +1408 +ic +-> +pch_fd__gme_pc + = -1; + +1409 +ic +-> +pch_fd_gme_addr + = -1; + +1410 +ic +-> +pch_fd_avaab + = +SDL_FALSE +; + +1412 +ic +-> +pch__gsync_pc + = -1; + +1413 +ic +-> +pch__gsync_d_pc + = -1; + +1414 +ic +-> +pch__gsync_lo_pc + = -1; + +1415 +ic +-> +pch__adby_pc + = -1; + +1416 +ic +-> +pch__adby_d_pc + = -1; + +1417 +ic +-> +pch__adby_eby_addr + = -1; + +1418 +ic +-> +pch__adby_ezo_addr + = -1; + +1419 +ic +-> +pch__putby_pc + = -1; + +1420 +ic +-> +pch__putby_d_pc + = -1; + +1421 +ic +-> +pch__cve_d_pc + = -1; + +1422 +ic +-> +pch__e_d_pc + = -1; + +1423 +ic +-> +pch__avaab + = +SDL_FALSE +; + +1424 +ic +-> +pch__ve_avaab + = +SDL_FALSE +; + +1426 +ic +-> +keym + = +KMAP_QWERTY +; + +1427 + } +} + +1429 * + gkeymmes +[] = { "qwerty", + +1432 +NULL + }; + +1434  +Ut8 + + $hex2b +( +c +) + +1436  ( ('0' < +c + && c <'9')? (- '0': (10 + ( + `tou +(c) - 'A')) ); + +1437 + } +} + +1439  +Ut8 + + $hex2by +(* +s +) + +1441  + `hex2b +( +s +[0]) * 16 + hex2bin(s[1]); + +1442 + } +} + +1444  +SDL_bo + + $ishexch +( +c +) + +1446 if('0' < +c + && c <= '9') + +1447  +SDL_TRUE +; + +1449 +c + = + `tou +(c); + +1450 if('A' < +c + && c <= 'F') + +1451  +SDL_TRUE +; + +1453  +SDL_FALSE +; + +1454 + } +} + +1456  + $ld_tches + +mache + * +ic +, * +ame + ) + +1458 +FILE + * +f +; + +1459 +St32 + +i +; + +1460 * +tmame +; + +1463 +tmame + = + `mloc + + ` + +ame + ) + 10 ); + +1464 if! +tmame + ) ; + +1466 + `rtf + +tmame +, "%s.pch", +ame + ); + +1468 +f + = + `fݒ + +tmame +, "r" ); + +1469 + ` + +tmame + ); + +1470 if! +f + ) ; + +1472  ! + `of + +f + ) ) + +1474 if! + `fgs + +fmp +, 2048, +f + ) ) ; + +1476  +i +=0; + `isws + +fmp +[i] ); i++ ) ; + +1478 if + `ad_cfig_t +& +fmp +[ +i +], "fd_d_gme_pc", & +ic +-> +pch_fd_d_gme_pc +, 0, 65535 ) ) ; + +1479 if + `ad_cfig_t +& +fmp +[ +i +], "fd_cve_gme_pc", & +ic +-> +pch_fd_cve_gme_pc +, 0, 65535 ) ) ; + +1480 if + `ad_cfig_t +& +fmp +[ +i +], "fd_e_gme_pc", & +ic +-> +pch_fd_e_gme_pc +, 0, 65535 ) ) ; + +1481 if + `ad_cfig_t +& +fmp +[ +i +], "fd__gme_pc", & +ic +-> +pch_fd__gme_pc +, 0, 65535 ) ) ; + +1482 if + `ad_cfig_t +& +fmp +[ +i +], "fd_gme_addr", & +ic +-> +pch_fd_gme_addr +, 0, 65535 ) ) ; + +1483 if + `ad_cfig_t +& +fmp +[ +i +], "_gsync_pc", & +ic +-> +pch__gsync_pc +, 0, 65535 ) ) ; + +1484 if + `ad_cfig_t +& +fmp +[ +i +], "_gsync_d_pc", & +ic +-> +pch__gsync_d_pc +, 0, 65535 ) ) ; + +1485 if + `ad_cfig_t +& +fmp +[ +i +], "_gsync_lo_pc", & +ic +-> +pch__gsync_lo_pc +, 0, 65535 ) ) ; + +1486 if + `ad_cfig_t +& +fmp +[ +i +], "_adby_pc", & +ic +-> +pch__adby_pc +, 0, 65535 ) ) ; + +1487 if + `ad_cfig_t +& +fmp +[ +i +], "_adby_d_pc", & +ic +-> +pch__adby_d_pc +, 0, 65535 ) ) ; + +1488 if + `ad_cfig_t +& +fmp +[ +i +], "_adby_eby_addr", & +ic +-> +pch__adby_eby_addr +, 0, 65535 ) ) ; + +1489 if + `ad_cfig_t +& +fmp +[ +i +], "_adby_ezo_addr", & +ic +-> +pch__adby_ezo_addr +, 0, 65535 ) ) ; + +1490 if + `ad_cfig_bo +& +fmp +[ +i +], "_adby_ty", & +ic +-> +pch__adby_ty + ) ) ; + +1491 if + `ad_cfig_t +& +fmp +[ +i +], "_putby_pc", & +ic +-> +pch__putby_pc +, 0, 65535 ) ) ; + +1492 if + `ad_cfig_t +& +fmp +[ +i +], "_putby_d_pc", & +ic +-> +pch__putby_d_pc +, 0, 65535 ) ) ; + +1493 if + `ad_cfig_t +& +fmp +[ +i +], "_cve_d_pc", & +ic +-> +pch__cve_d_pc +, 0, 65535 ) ) ; + +1494 if + `ad_cfig_t +& +fmp +[ +i +], "_e_d_pc", & +ic +-> +pch__e_d_pc +, 0, 65535 ) ) ; + +1495 if + `ad_cfig_t +& +fmp +[ +i +], "_wrd_pc", & +ic +-> +pch__wrd_pc +, 0, 65535 ) ) ; + +1496 if + `ad_cfig_t +& +fmp +[ +i +], "_wrd_d_pc", & +ic +-> +pch__wrd_d_pc +, 0, 65535 ) ) ; + +1497 if + `ad_cfig_ti +& +fmp +[ +i +], "keym", & +ic +-> +keym +, +keymmes + ) ) ; + +1505 if(8 < + ` +(& +fmp +[ +i +]) && ';' != filetmp[i]) + +1507 * +mp + = & +fmp +[ +i +]; + +1509 if( +mp +[0]=='$' &&tmp[5]==':') + +1512 if( + `ishexch +( +mp +[1]) && ishexchar(ptmp[2]) && ishexchar(ptmp[3]) && ishexchar(ptmp[4])) + +1514 +Ut16 + +tchaddr + = + `hex2by +( +mp ++1) * 256 + hex2byte(ptmp+3); + +1515 +mp + += 6; + +1516  + `ishexch +( +mp +[0]) && ishexchar(ptmp[1])) + +1518 +Ut8 + +tchby + = + `hex2by +( +mp +); + +1520 +ic +-> +rom +[ +tchaddr +] = +tchby + ; + +1521 +tchaddr +++; + +1522 +mp + += 2; + +1530 + `fo + +f + ); + +1533 if +ic +-> +pch_fd_d_gme_pc + != -1 ) || + +1534 +ic +-> +pch_fd_cve_gme_pc + != -1 ) || + +1535 +ic +-> +pch_fd_e_gme_pc + != -1 ) || + +1536 +ic +-> +pch_fd__gme_pc + != -1 ) ) && + +1537 +ic +-> +pch_fd_gme_addr + != -1 ) ) + +1538 +ic +-> +pch_fd_avaab + = +SDL_TRUE +; + +1540 if +ic +-> +pch__gsync_pc + != -1 ) && + +1541 +ic +-> +pch__gsync_d_pc + != -1 ) && + +1542 +ic +-> +pch__gsync_lo_pc + != -1 ) && + +1543 +ic +-> +pch__adby_pc + != -1 ) && + +1544 +ic +-> +pch__adby_d_pc + != -1 ) ) + +1545 +ic +-> +pch__avaab + = +SDL_TRUE +; + +1547 if +ic +-> +pch__putby_pc + != -1 ) && + +1548 +ic +-> +pch__putby_d_pc + != -1 ) ) + +1549 +ic +-> +pch__ve_avaab + = +SDL_TRUE +; + +1550 + } +} + +1552  + $tup_f_miodisc + +mache + * +ic +, * +adr +, * +wr + ) + +1554 +ic +-> +u +. +ad + = +adr +; + +1555 +ic +-> +u +. +wre + = +wr +; + +1556 +ic +-> +romdis + = +SDL_TRUE +; + +1557 + `miodisc_ +& +ic +-> +md +, &ic-> +wddisk +, oric ); + +1558 +ic +-> +disksyms + = & +sym_miodisc +; + +1559 + } +} + +1561  + $tup_f_jasm + +mache + * +ic +, * +adr +, * +wr + ) + +1563 +ic +-> +u +. +ad + = +adr +; + +1564 +ic +-> +u +. +wre + = +wr +; + +1565 +ic +-> +romdis + = +SDL_FALSE +; + +1566 + `jasm_ +& +ic +-> +jasm +, &ic-> +wddisk +, oric ); + +1567 +ic +-> +disksyms + = & +sym_jasm +; + +1568 + } +} + +1570  + $tup_f_avzdisk + +mache + * +ic +, * +adr +, * +wr + ) + +1572 +ic +-> +u +. +ad + = +adr +; + +1573 +ic +-> +u +. +wre + = +wr +; + +1574 +ic +-> +romdis + = +SDL_FALSE +; + +1575 + `avz_ +& +ic +-> +avz +, oric ); + +1576 +ic +-> +disksyms + = & +sym_avz +; + +1577 + } +} + +1579  + $tup_f_no_disk + +mache + * +ic +, * +adr +, * +wr + ) + +1581 +ic +-> +drivy + = +DRV_NONE +; + +1582 +ic +-> +u +. +ad + = +adr +; + +1583 +ic +-> +u +. +wre + = +wr +; + +1584 +ic +-> +romdis + = +SDL_FALSE +; + +1585 +ic +-> +disksyms + = +NULL +; + +1586 + } +} + +1588 +SDL_bo + + $_mache + +mache + * +ic +,  +ty +, +SDL_bo + +nukebakpots + ) + +1590  +i +; + +1592 +ic +-> +turbo_foff + = +SDL_FALSE +; + +1594 +ic +-> +ty + =ype; + +1595 + `m6502_ +& +ic +-> +u +, (*)ic, +nukebakpots + ); + +1597 +ic +-> +turbo_syncack + = -1; + +1599 +ic +-> +vidbas +[0] = 0xa000; + +1600 +ic +-> +vidbas +[1] = 0x9800; + +1601 +ic +-> +vidbas +[2] = 0xbb80; + +1602 +ic +-> +vidbas +[3] = 0xb400; + +1604 +ic +-> +romsyms +. +numsyms + = 0; + +1605 +ic +-> +_bksyms +[0]. +numsyms + = 0; + +1606 +ic +-> +_bksyms +[1]. +numsyms + = 0; + +1607 +ic +-> +_bksyms +[2]. +numsyms + = 0; + +1608 +ic +-> +_bksyms +[3]. +numsyms + = 0; + +1609 +ic +-> +_bksyms +[4]. +numsyms + = 0; + +1610 +ic +-> +_bksyms +[5]. +numsyms + = 0; + +1611 +ic +-> +_bksyms +[6]. +numsyms + = 0; + +1612 +ic +-> +_bksyms +[7]. +numsyms + = 0; + +1614 + `r_tches + +ic + ); + +1616 +g_mu_scheme + = +ty +; + +1618  +ty + ) + +1620  +MACH_ORIC1_16K +: + +1621  +i +=0; i<4; i++ ) + +1622 +ic +-> +vidbas +[ +i +] &= 0x7fff; + +1623 +ic +-> +memsize + = 16384 + 16384; + +1624 +ic +-> +mem + = + `mloc +ic-> +memsize + ); + +1625 if! +ic +-> +mem + ) + +1627 + `r_tf +( "Out of memory\n" ); + +1628  +SDL_FALSE +; + +1631 + `bnk_m + +ic +-> +mn +, oric-> +mem +, 16384+16384 ); + +1633 +ic +-> +rom + = &ic-> +mem +[16384]; + +1635  +ic +-> +drivy + ) + +1637  +DRV_MICRODISC +: + +1638 + `tup_f_miodisc + +ic +, +miodisc_o16kad +, +miodisc_o16kwre +); + +1641  +DRV_JASMIN +: + +1642 + `tup_f_jasm + +ic +, +jasm_o16kad +, +jasm_o16kwre +); + +1645  +DRV_PRAVETZ +: + +1647 + `tup_f_no_disk + +ic +, +o16kad +, +o16kwre + ); + +1651 if! + `ld_rom + +ic +, +ic1romfe +, -16384, &ic-> +rom +[0], &ic-> +romsyms +, +SYMF_ROMDIS0 + ) )  +SDL_FALSE +; + +1652 + `ld_tches + +ic +, +ic1romfe + ); + +1655  +MACH_ORIC1 +: + +1656 +ic +-> +memsize + = 65536 + 16384; + +1657 +ic +-> +mem + = + `mloc +ic-> +memsize + ); + +1658 if! +ic +-> +mem + ) + +1660 + `r_tf +( "Out of memory\n" ); + +1661  +SDL_FALSE +; + +1664 + `bnk_m + +ic +-> +mn +, oric-> +mem +, 65536+16384 ); + +1666 +ic +-> +rom + = &ic-> +mem +[65536]; + +1668  +ic +-> +drivy + ) + +1670  +DRV_MICRODISC +: + +1671 + `tup_f_miodisc + +ic +, +miodisc_mod +, +miodisc_moswre +); + +1674  +DRV_JASMIN +: + +1675 + `tup_f_jasm + +ic +, +jasm_mod +, +jasm_moswre +); + +1678  +DRV_PRAVETZ +: + +1680 + `tup_f_no_disk + +ic +, +mod +, +moswre + ); + +1684 if! + `ld_rom + +ic +, +ic1romfe +, -16384, &ic-> +rom +[0], &ic-> +romsyms +, +SYMF_ROMDIS0 + ) )  +SDL_FALSE +; + +1685 + `ld_tches + +ic +, +ic1romfe + ); + +1688  +MACH_ATMOS +: + +1689 +ic +-> +memsize + = 65536 + 16384; + +1690 +ic +-> +mem + = + `mloc +ic-> +memsize + ); + +1691 if! +ic +-> +mem + ) + +1693 + `r_tf +( "Out of memory\n" ); + +1694  +SDL_FALSE +; + +1697 + `bnk_m + +ic +-> +mn +, oric-> +mem +, 65536+16384 ); + +1699 +ic +-> +rom + = &ic-> +mem +[65536]; + +1701  +ic +-> +drivy + ) + +1703  +DRV_MICRODISC +: + +1704 + `tup_f_miodisc + +ic +, +miodisc_mod +, +miodisc_moswre +); + +1707  +DRV_JASMIN +: + +1708 + `tup_f_jasm + +ic +, +jasm_mod +, +jasm_moswre +); + +1711  +DRV_PRAVETZ +: + +1713 + `tup_f_no_disk + +ic +, +mod +, +moswre + ); + +1717 if! + `ld_rom + +ic +, +moomfe +, -16384, &ic-> +rom +[0], &ic-> +romsyms +, +SYMF_ROMDIS0 + ) )  +SDL_FALSE +; + +1718 + `ld_tches + +ic +, +moomfe + ); + +1721  +MACH_TELESTRAT +: + +1722 +ic +-> +drivy + = +DRV_MICRODISC +; + +1723 +ic +-> +memsize + = 65536 + 16384*7; + +1724 +ic +-> +mem + = + `mloc +ic-> +memsize + ); + +1725 if! +ic +-> +mem + ) + +1727 + `r_tf +( "Out of memory\n" ); + +1728  +SDL_FALSE +; + +1731 + `bnk_m + +ic +-> +mn +, oric-> +mem +, 65536+16384*7 ); + +1733 + `tup_f_miodisc + +ic +, +ˡd +, +ˡtwre + ); + +1734 +ic +-> +disksyms + = +NULL +; + +1736  +i +=0; i<8; i++ ) + +1739 +ic +-> +rom + = oric-> +_bk +[ +i +]. +r + = &ic-> +mem +[0x0c000+(i*0x4000)]; + +1740 if +bkfes +[ +i +][0] ) + +1742 +ic +-> +_bk +[ +i +]. +ty + = +TELEBANK_ROM +; + +1743 if! + `ld_rom + +ic +, +bkfes +[ +i +], -16384, oric-> +_bk +[i]. +r +, &ic-> +_bksyms +[i], +SYMF_TELEBANK0 +<< +SDL_FALSE +; + +1744 + `ld_tches + +ic +, +bkfes +[ +i +] ); + +1746 +ic +-> +_bk +[ +i +]. +ty + = +TELEBANK_RAM +; + +1750 +ic +-> +_cubk + = 7; + +1751 +ic +-> +_bkty + = oric-> +_bk +[7]. +ty +; + +1752 +ic +-> +rom + = oric-> +_bk +[7]. +r +; + +1755  +MACH_PRAVETZ +: + +1756 +ic +-> +memsize + = 65536 + 16384; + +1757 +ic +-> +mem + = + `mloc +ic-> +memsize + ); + +1758 if! +ic +-> +mem + ) + +1760 + `r_tf +( "Out of memory\n" ); + +1761  +SDL_FALSE +; + +1764 + `bnk_m + +ic +-> +mn +, oric-> +mem +, 65536+16384 ); + +1766 +ic +-> +rom + = &ic-> +mem +[65536]; + +1768  +ic +-> +drivy + ) + +1770  +DRV_MICRODISC +: + +1771 + `tup_f_miodisc + +ic +, +miodisc_mod +, +miodisc_moswre +); + +1774  +DRV_JASMIN +: + +1775 + `tup_f_jasm + +ic +, +jasm_mod +, +jasm_moswre +); + +1778  +DRV_PRAVETZ +: + +1779 + `tup_f_avzdisk + +ic +, +avz_mod +, +avz_moswre + ); + +1783 + `tup_f_no_disk + +ic +, +mod +, +moswre + ); + +1787 if! + `ld_rom + +ic +, +avzromfe +[0], -16384, &ic-> +rom +[0], &ic-> +romsyms +, +SYMF_ROMDIS0 + ) )  +SDL_FALSE +; + +1788 + `ld_tches + +ic +, +avzromfe +[0] ); + +1793  +SDL_FALSE +; + +1796 +ic +-> +cye + = 64; + +1797 +ic +-> +vid_t + = 65; + +1798 +ic +-> +vid_max + = 312; + +1799 +ic +-> +vid_d + = oric-> +vid_t + + 224; + +1800 +ic +-> +vid_ + = 0; + +1801 + `u_powup_deu + +ic + ); + +1803 +ic +-> +ad_n_ligh + = oric-> +u +. +ad +; + +1805 i( +ic +-> +ligh +) + +1806 +ic +-> +u +. +ad + = +ligh_ad +; + +1808 + `om + +ic + ); + +1809 +ic +-> +me +[0] = 0; + +1810 + `_wd + +ic + ); + +1811 + `m6502_t +& +ic +-> +u + ); + +1812 + `v_ +& +ic +-> +v +, oric, +VIA_MAIN + ); + +1813 + `v_ +& +ic +-> +_v +, oric, +VIA_TELESTRAT + ); + +1814 + `ac_ +& +ic +-> +_ac +, oric ); + +1816 i( +ic +-> +ch376_aived +) + +1818 +ic +-> +ch376 + = + `ch376_ic_ +(); + +1819 + `ch376_ic_cfig +( +ic +-> +ch376 +); + +1822 + `ay_ +& +ic +-> +ay +, oric ); + +1823 + `joy_tup + +ic + ); + +1824 +ic +-> +u +. +cyes + = oric-> +cye +; + +1825 +ic +-> +ames + = 0; + +1826 +ic +-> +vid_doub + = +SDL_TRUE +; + +1827 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +1829 if +ic +-> +autewd + ) + `_wd +( oric ); + +1831 + `tmutoggs + +ic + ); + +1832 +eshus + = +SDL_TRUE +; + +1834  +SDL_TRUE +; + +1835 + } +} + +1837  + $shut_mache + +mache + * +ic + ) + +1839 if +ic +-> +drivy + = +DRV_MICRODISC + ) { + `miodisc_ +&ic-> +md + ); oric->drivy = +DRV_NONE +; } + +1840 if +ic +-> +drivy + = +DRV_JASMIN + ) { + `jasm_ +&ic-> +jasm + ); oric->drivy = +DRV_NONE +; } + +1841 if +ic +-> +drivy + = +DRV_PRAVETZ + ) { + `avz_ +&ic-> +avz + ); oric->drivy = +DRV_NONE +; } + +1842 if +ic +-> +mem + ) { + ` +ic->mem ); oric->mem = +NULL +; oric-> +rom + = NULL; } + +1843 if +ic +-> +f + ) { + `fo +ic->); oric-> +NULL +; } + +1844 if +ic +-> +tvf + ) + `__vch +( oric ); + +1845 if +ic +-> +p + ) + `toggˏp +ic, + `fd_em_by_funi +( +maems +, +toggˏp +), 0 ); + +1846 i( +ic +-> +buf +{ + ` +(ic->buf); oric->bu +NULL +; } + +1847 + `m_syms +& +sym_miodisc + ); + +1848 + `m_syms +& +sym_jasm + ); + +1849 + `m_syms +& +sym_avz + ); + +1850 + `m_syms +& +ic +-> +romsyms + ); + +1851 + `m_syms +& +ic +-> +_bksyms +[0] ); + +1852 + `m_syms +& +ic +-> +_bksyms +[1] ); + +1853 + `m_syms +& +ic +-> +_bksyms +[2] ); + +1854 + `m_syms +& +ic +-> +_bksyms +[3] ); + +1855 + `m_syms +& +ic +-> +_bksyms +[4] ); + +1856 + `m_syms +& +ic +-> +_bksyms +[5] ); + +1857 + `m_syms +& +ic +-> +_bksyms +[6] ); + +1858 + `m_syms +& +ic +-> +_bksyms +[7] ); + +1859 + } +} + +1861  +shut +( ); + +1862  + $tdrivy + +mache + * +ic +,  +osdmuem + * +mem +,  +ty + ) + +1864 if +ic +-> +drivy + = +ty + ) + +1867 if +ty + = +DRV_PRAVETZ + ) && + +1868 +ic +-> +ty + ! +MACH_PRAVETZ + ) ) + +1870 + `swmach + +ic +, +mem +, ( +DRV_PRAVETZ +<<16)| +MACH_PRAVETZ + ); + +1874 + `shut_mache + +ic + ); + +1876  +ty + ) + +1878  +DRV_MICRODISC +: + +1879  +DRV_JASMIN +: + +1880  +DRV_PRAVETZ +: + +1881 +ic +-> +drivy + = +ty +; + +1885 +ic +-> +drivy + = +DRV_NONE +; + +1889 + `m_e_t + +ic + ); + +1890 if! + `_mache + +ic +, oric-> +ty +, +SDL_FALSE + ) ) + +1892 + `shut +(); + +1893 + `ex + +EXIT_FAILURE + ); + +1896 + `tmutoggs + +ic + ); + +1897 + } +} + +1899  + $swmach + +mache + * +ic +,  +osdmuem + * +mem +,  +which + ) + +1901  +cu_drivy +; + +1903 +cu_drivy + = +ic +-> +drivy +; + +1905 + `shut_mache + +ic + ); + +1907 if(( +which +>>16)&0xffff) != 0xffff ) + +1908 +cu_drivy + = ( +which +>>16)&0xffff; + +1910 +which + &= 0xffff; + +1912 +ic +-> +drivy + = +cu_drivy +; + +1916 + `r_xtze + +ic +, +TZ_DISK + ); + +1918 + `m_e_t + +ic + ); + +1919 if! + `_mache + +ic +, +which +, which!=ic-> +ty + ) ) + +1921 + `shut +(); + +1922 + `ex + +EXIT_FAILURE + ); + +1924 + } +} + + @machine.h + +21 #ifde +_MSC_VER + + +22  + ~ + +25  + ~"keybrd.h +" + +29 + mDRV_NONE + = 0, + +30 + mDRV_JASMIN +, + +31 + mDRV_MICRODISC +, + +32 + mDRV_PRAVETZ + + +37 + mMACH_ORIC1 + = 0, + +38 + mMACH_ORIC1_16K +, + +39 + mMACH_ATMOS +, + +40 + mMACH_TELESTRAT +, + +41 + mMACH_PRAVETZ +, + +42 + mMACH_LAST + + +47 + mEM_PAUSED + = 0, + +48 + mEM_RUNNING +, + +49 + mEM_DEBUG +, + +50 + mEM_MENU +, + +51 + mEM_PLEASEQUIT + + +56 + mTELEBANK_RAM +, + +57 + mTELEBANK_ROM +, + +58 + mTELEBANK_HALFNHALF + + +63 + mKMAP_QWERTY + = 0, + +64 + mKMAP_AZERTY +, + +65 + mKMAP_QWERTZ + + +71 + mIMG_I_DUNNO + = 0, + +72 + mIMG_ATMOS_MICRODISC +, + +73 + mIMG_ATMOS_JASMIN +, + +74 + mIMG_TELESTRAT_DISK +, + +75 + mIMG_PRAVETZ_DISK +, + +76 + mIMG_GUESS_MICRODISC +, + +77 + mIMG_SNAPSHOT +, + +78 + mIMG_TAPE + + +81  + sbkfo + + +83  + mty +; + +84 * + mr +; + +87  + smache + + +89 +Ut8 + + mty +; + +90  +m6502 + + mu +; + +91  +v + + mv +; + +92  +ay8912 + + may +; + +93  + mmemsize +; + +94 * + mmem +; + +95 * + mrom +; + +96  + memu_mode +; + +98  +symbޏb + + mromsyms +; + +99  +symbޏb + + mursyms +; + +100  +symbޏb + * + mdisksyms +; + +102  +bkfo + + m_bk +[8]; + +103  +symbޏb + + m_bksyms +[8]; + +104  +v + + m_v +; + +105  +ac + + m_ac +; + +106  +ch376 + * + mch376 +; + +107 +SDL_bo + + mch376_aived +; + +108  + m_cubk +; + +109  + m_bkty +; + +112  + mvid_t +; + +113  + mvid_d +; + +114  + mvid_max +; + +115  + mvid_ +; + +116  + mvid_offt +; + +118  + mvid_fg_c +; + +119  + mvid_bg_c +; + +120 +Ut16 + * + mvid_br +; + +121 +Ut16 + * + mvid_v_br +; + +122  + mvid_mode +; + +123  + mvid_eq +; + +124  + mvid_xrs +; + +125  + mvid_blkmask +; + +126  + mvid_chle +; + +127  + mames +; + +128 +SDL_bo + + mvid_dty +[224]; + +129 (* + mvid_block_func +) + mmache + *, + mSDL_bo +, , ); + +131  + movockmu +, + movockshi +; + +133  + mcye +; + +134  + mvsync +; + +136 +SDL_bo + + mvid_doub +; + +137 +SDL_bo + + mromdis +, + mrom +; + +138 +SDL_bo + + mvsynchack +; + +140  + mvid_addr +; + +141 * + mvid_ch_da +; + +142 * + mvid_ch_ba +; + +144 +Ut8 + * + ms +; + +145 +Ut8 + * + ms +; + +147 +Ut16 + + mvidbas +[4]; + +149  + mdrivy +; + +150  +wd17xx + + mwddisk +; + +151  +miodisc + + mmd +; + +152  +jasm + + mjasm +; + +153  +avz + + mavz +; + +154  + mdiskme +[ +MAX_DRIVES +][32]; + +155 +SDL_bo + + mdiskautove +; + +156 +SDL_bo + + mauto_jasm_t +; + +158 +FILE + * + mf +; + +159  + mo +, + mock +; + +161  + mb +, + mout +, + mry +; + +162  + mn +, + moffs +, + mcou +, + mtime +, + mdupbys +, + mhdnd +, + mday +; + +163 * + mbuf +; + +164 +SDL_bo + + mm +, + mnoi +, + mturbo +, + mautewd +, + mauto +; + +165 +SDL_bo + + mturbo_foff +; + +166 +SDL_bo + + msymbާutd +, + msymbs +; + +167 +SDL_bo + + mw +; + +168  + mnڿwd +, + mhd +; + +169  + mϡfe +[20]; + +170  + mme +[32]; + +171  + mturbo_syncack +; + +172 +FILE + * + mp +; + +173  + mpcou +; + +174  + mab +; + +175  + mpvbys +; + +176  + mpvoffs +; + +179  + mpch_fd_d_gme_pc +; + +180  + mpch_fd_cve_gme_pc +; + +181  + mpch_fd_e_gme_pc +; + +182  + mpch_fd__gme_pc +; + +183  + mpch_fd_gme_addr +; + +184 +SDL_bo + + mpch_fd_avaab +; + +187  + mpch__gsync_pc +; + +188  + mpch__gsync_d_pc +; + +189  + mpch__gsync_lo_pc +; + +190  + mpch__adby_pc +; + +191  + mpch__adby_d_pc +; + +192  + mpch__adby_eby_addr +; + +193  + mpch__adby_ezo_addr +; + +194  + mpch__putby_pc +; + +195  + mpch__putby_d_pc +; + +196  + mpch__cve_d_pc +; + +197  + mpch__e_d_pc +; + +198  + mpch__wrd_pc +; + +199  + mpch__wrd_d_pc +; + +200 +SDL_bo + + mpch__adby_ty +; + +201 +SDL_bo + + mpch__avaab +; + +202 +SDL_bo + + mpch__ve_avaab +; + +203 +FILE + * + mtvf +; + +205 +St32 + + mkeym +; + +207 +SDL_bo + + mio +, + mhtch +, + msƚes +, + mlgho +, + mavdiskautobo +; + +208 +St32 + + msw_dth +; + +210  + mndmode +; + +211 (* + mnd_beg +)( + mmache + *); + +212 (* + mnd_d +)( + mmache + *); + +213 (* + mnd_xtze_loc +)( + mmache + *, ); + +214 (* + mnd_xtze_ +)( + mmache + *, ); + +215 (* + mnd_xtze +)( + mmache + *, ); + +216 (* + mnd_r_ +)( , , , ); + +217 (* + mnd_gimg +)(, + mSt32 +, Sint32); + +218 (* + mnd_gimg +)(, + mSt32 +, Sint32, Sint32, Sint32, Sint32, Sint32); + +219 (* + mnd_loc_xtze +)( + mmache + *,  + mxtze + *); + +220 (* + mnd__xtze +)( + mmache + *,  + mxtze + *); + +221 (* + mnd_video +)( + mmache + *, + mSDL_bo +); + +222 +SDL_bo + (* +nd_toggfusn +)( +mache + * + mic +); + +223 +SDL_bo + (* +_nd +)( + mmache + *); + +224 (* + mshut_nd +)( + mmache + *); + +226  + mpupr +[40]; + +227  + mpuime +; + +228 +SDL_bo + + mwpupr +; + +230  + musr +[40]; + +231 +SDL_bo + + mwusr +; + +233  + musb_mode +; + +235  + mmn +; + +237 +St32 + + mjoy_i +; + +238 +St32 + + mjoymode_a +, + mjoymode_b +; + +239 +St32 + + mjoymode_a +, + mjoymode_b +; + +240 +SDL_COMPAT_KEY + + mkbjoy1 +[6], + mkbjoy2 +[6]; + +242 +SDL_bo + + mb +; + +243 +SDL_bo + + mtfr +; + +245 +SDL_bo + + mligh +; + +246 +Ut8 + + mlighx +, + mlighy +; + +247 (* + mad_n_ligh +)( + mm6502 + *, + mUt16 +); + +249 +Ut8 + + mp܏_joy +, + mp܏_ay +; + +250 +SDL_bo + + mp܏_is_ay +; + +252 +SDL_Joyick + * + msdljoy_a +, * + msdljoy_b +; + +254  +keybrd_mpg + + mkeybrd_mpg +; + +255 +SDL_bo + + mshow_keybrd +; + +256 +SDL_bo + + mdefe_mpg +; + +257 +SDL_bo + + micky_mod_keys +; + +259  + macofft +; + +260  + macbackd +; + +261  + macbackdcfg +; + +262  + macbackdcfgpt +; + +263  + macbackdcfgdoma +; + +264  + macbackdme +[ +ACIA_BACKEND_NAME_LEN +]; + +267  +om + +mache + * +ic + ); + +268  +mumode + +mache + * +ic +,  +osdmuem + * +mem +,  +mode + ); + +269  +video_show + +mache + * +ic + ); + +270 +SDL_bo + +emu_evt + +SDL_Evt + * +ev +,  +mache + * +ic +, SDL_bo * +ednd + ); + +272  +e_mache + +mache + * +ic + ); + +273  +ld_diskroms + +mache + * +ic + ); + +274 +SDL_bo + +_mache + +mache + * +ic +,  +ty +, SDL_bo +nukebakpots + ); + +275  +shut_mache + +mache + * +ic + ); + +276  +tdrivy + +mache + * +ic +,  +osdmuem + * +mem +,  +ty + ); + +277  +swmach + +mache + * +ic +,  +osdmuem + * +mem +,  +which + ); + +278 +SDL_bo + +iam + +mache + * +ic +,  +addr + ); + +280  +r_tches + +mache + * +ic + ); + +282  +ligh_ad + +m6502 + * +u +,  +addr + ); + +284  +de_image_ty +(* +fame +); + + @main.c + +21 #ifde +__APPLE__ + + +22  + ~"CeFoundi/CeFoundi.h +" + +25 #ifde +_MSC_VER + + +26  + #_CRTDBG_MAP_ALLOC + + + ) + +27  + ~ + +28  + ~ + +31  + ~ + +32  + ~ + +33  + ~ + +35 #ifde +__amigaos4__ + + +36  + ~ + +37  + ~ + +40 #ifde +WIN32 + + +41  + ~ + +44  + ~"syem.h +" + +45  + ~"6502.h +" + +46  + ~"v.h +" + +47  + ~"8912.h +" + +48  + ~"gui.h +" + +49  + ~"disk.h +" + +50  + ~"mڙ.h +" + +51  + ~"6551.h +" + +52  + ~"mache.h +" + +53  + ~"feq.h +" + +54  + ~"msgbox.h +" + +55  + ~"avi.h +" + +56  + ~"ma.h +" + +57  + ~"u.h +" + +58  + ~"nd_sw.h +" + +59  + ~"nd_sw8.h +" + +60  + ~"nd_gl.h +" + +61  + ~"joyick.h +" + +62  + ~".h +" + +63  + ~"sh.h +" + +64  + ~"keybrd.h +" + +66  + #FRAMES_TO_AVERAGE + 8 + + ) + +68 +SDL_bo + + ged_sdl_qu + = +SDL_FALSE +; + +69 +SDL_bo + + gfusn +, + ghwsur +; + +70 +SDL_bo + +wpd +, +sound +; + +71 +Ut32 + + gϡamimes +[ +FRAMES_TO_AVERAGE +], + gamimve +; + +72  +m_bpmsg +[]; + +73  +avi_hd + * +vidp +; + +74  +th +[], +diskth +[], +diskth +[], +avdiskth +[]; + +75  +moomfe +[]; + +76  +ic1romfe +[]; + +77  +mdisomfe +[]; + +78  +jasmomfe +[]; + +79  +avzromfe +[2][1024]; + +80  +bkfes +[8][1024]; + +82  + gkeym_th +[4096+32]; + +83  + gld_keym + = +SDL_FALSE +; + +85 #ifde +__amigaos4__ + + +86  +__ibu__ +(( +ud +) + gackcook +[] = "$STACK: 1000000"; + +89 #i +defed +( +__amigaos4__ +|| defed( +__MORPHOS__ +|| defed( +__AROS__ +) + +90 #i +EXIT_FAILURE + == 1 + +91 #unde +EXIT_FAILURE + + +92  + #EXIT_FAILURE + +RETURN_FAIL + + + ) + +94 #ide +__AMIGADATE__ + + +95  + #__AMIGADATE__ + "(" +__DATE__ +")" + + ) + +97  +__ibu__ +(( +ud +) + gvsiڏg +[] = "$VER: " +APP_NAME_FULL + " " +__AMIGADATE__ +; + +100  + st_ts + + +102  + mlmp +[2048]; + +103 +SDL_bo + + mt_mache_t +; + +104 +St32 + + mt_mache +; + +105 +SDL_bo + + mt_diskty_t +; + +106 +St32 + + mt_diskty +; + +107 +St32 + + mt_ndmode +; + +108 +SDL_bo + + mt_debug +; + +109  + mt_disk +[1024]; + +110  + mt_ +[1024]; + +111  + mt_syms +[1024]; + +112 * + mt_syms_fes +[32]; + +113 +St32 + + mt_syms_cou +; + +114  + mt_sh +[1024]; + +115 * + mt_bakpot +; + +118 * + gmachtys +[] = { "oric1", + +123 +NULL + }; + +125 * + gdisktys +[] = { "none", + +129 +NULL + }; + +131 * + gjoyitys +[] = { "none", + +134 +NULL + }; + +136 * + gjoymodes +[] = { "none", + +150 +NULL + }; + +152 * + gndmodes +[] = { "{{INVALID}}", + +155 +NULL + }; + +157 * + gswdths +[] = { "8", "16", "32", +NULL + }; + +159  +SDL_bo + + $iokd + +c + ) + +161 if + `isws + +c + ) )  +SDL_TRUE +; + +162 if +c + =0 ) || ( c =10 ) || ( c =13 ) )  +SDL_TRUE +; + +163  +SDL_FALSE +; + +164 + } +} + +166 +SDL_bo + + $ad_cfig_rg +* +buf +, * +tok +, * +de +, +St32 + +maxn + ) + +168 +St32 + +i +, +tokn +, +d +; + +171 +tokn + = () + ` + +tok + ); + +174 if + `cmp + +buf +, +tok +, +tokn + ) !0 )  +SDL_FALSE +; + +175 +i + = +tokn +; + +178  + `isws + +buf +[ +i +] ) ) i++; + +179 if +buf +[ +i +] !'=' )  +SDL_TRUE +; + +180 +i +++; + +181  + `isws + +buf +[ +i +] ) ) i++; + +182 if +buf +[ +i +] !'\'' )  +SDL_TRUE +; + +183 +i +++; + +186 +d +=0; + +187  +buf +[ +i +] != '\'' ) + +189 if +d + >( +maxn +-1) ) ; + +190 if! +buf +[ +i +] ) ; + +192 if +buf +[ +i +] == '\\' ) && ( buf[i+1] == '\'' ) ) + +194 +de +[ +d +++] = '\''; + +195 +i ++=2; + +199 if +buf +[ +i +] == '\\' ) && ( buf[i+1] == '\\' ) ) + +201 +de +[ +d +++] = '\\'; + +202 +i ++=2; + +206 +de +[ +d +++] = +buf +[ +i +++]; + +209 +de +[ +d +] = 0; + +210  +SDL_TRUE +; + +211 + } +} + +213 +SDL_bo + + $ad_cfig_bo +* +buf +, * +tok +, +SDL_bo + * +de + ) + +215 +St32 + +i +, +tokn +; + +218 +tokn + = () + ` + +tok + ); + +221 if + `cmp + +buf +, +tok +, +tokn + ) !0 )  +SDL_FALSE +; + +222 +i + = +tokn +; + +225  + `isws + +buf +[ +i +] ) ) i++; + +226 if +buf +[ +i +] !'=' )  +SDL_TRUE +; + +227 +i +++; + +228  + `isws + +buf +[ +i +] ) ) i++; + +230 (* +de + +SDL_FALSE +; + +231 if + `cmp +& +buf +[ +i +], "ue", 4 ) =0 ) (* +de + +SDL_TRUE +; + +232 if + `cmp +& +buf +[ +i +], "yes", 3 ) =0 ) (* +de + +SDL_TRUE +; + +233  +SDL_TRUE +; + +234 + } +} + +236 +SDL_bo + + $ad_cfig_ti +* +buf +, * +tok +, +St32 + * +de +, ** +tis + ) + +238 +St32 + +i +, +j +, +n +; + +239 * +thist +; + +242 +n + = () + ` + +tok + ); + +245 if + `cmp + +buf +, +tok +, +n + ) !0 )  +SDL_FALSE +; + +246 +i + = +n +; + +249  + `isws + +buf +[ +i +] ) ) i++; + +250 if +buf +[ +i +] !'=' )  +SDL_TRUE +; + +251 +i +++; + +252  + `isws + +buf +[ +i +] ) ) i++; + +255 if + `cmp +& +buf +[ +i +], "{{INVALID}}", 11 ) == 0 ) + +256  +SDL_FALSE +; + +258  +j +=0; +tis +[j]; j++ ) + +260 +thist + = +tis +[ +j +]; + +261  +thist +[0] ) + +263 +n + = 0; + +264  ( +thist +[ +n +]!=0) && (thisopt[len]!='|') )en++; + +266 if + `cmp +& +buf +[ +i +], +thist +, +n + ) == 0 ) + +268 if + `iokd + +buf +[ +i ++ +n +] ) ) + +270 * +de + = +j +; + +271  +SDL_TRUE +; + +274 +thist + + +n +; + +275 if +thist +[0] == '|' )hisopt++; + +279  +SDL_TRUE +; + +280 + } +} + +282 +SDL_bo + + $ad_cfig_t +* +buf +, * +tok +, * +de +,  +m +,  +max + ) + +284 +St32 + +i +, +tokn +; + +285  +v +, +hv +; + +288 +tokn + = () + ` + +tok + ); + +291 if + `cmp + +buf +, +tok +, +tokn + ) !0 )  +SDL_FALSE +; + +292 +i + = +tokn +; + +295  + `isws + +buf +[ +i +] ) ) i++; + +296 if +buf +[ +i +] !'=' )  +SDL_TRUE +; + +297 +i +++; + +298  + `isws + +buf +[ +i +] ) ) i++; + +300 +v + = 0; + +301 if +buf +[ +i +] == '$' ) + +303 +i +++; + +304  ( +hv += + `hex +( +buf +[ +i +])) != -1 ) + +306 +v + = (v<<4+ +hv +; + +307 +i +++; + +310 +v + = + `oi +& +buf +[ +i +] ); + +313 if +v + < +m + ) val = min; + +314 if +v + > +max + ) val = max; + +316 (* +de + +v +; + +317  +SDL_TRUE +; + +318 + } +} + +320 +SDL_bo + + $ad_cfig_joykey +* +buf +, * +tok +, +SDL_COMPAT_KEY + * +de + ) + +322 +St32 + +i +, +tokn +, +d +; + +323 +SDL_COMPAT_KEY + +thekey +; + +324  +keyme +[32]; + +327 +tokn + = () + ` + +tok + ); + +330 if + `cmp + +buf +, +tok +, +tokn + ) !0 )  +SDL_FALSE +; + +331 +i + = +tokn +; + +334  + `isws + +buf +[ +i +] ) ) i++; + +335 if +buf +[ +i +] !'=' )  +SDL_TRUE +; + +336 +i +++; + +337  + `isws + +buf +[ +i +] ) ) i++; + +338 if +buf +[ +i +] !'\'' )  +SDL_TRUE +; + +339 +i +++; + +342 +d +=0; + +343  +buf +[ +i +] != '\'' ) + +345 if +d + >= 31 ) ; + +346 if! +buf +[ +i +] ) ; + +348 if +buf +[ +i +] == '\\' ) && ( buf[i+1] == '\'' ) ) + +350 +keyme +[ +d +++] = '\''; + +351 +i ++=2; + +355 if +buf +[ +i +] == '\\' ) && ( buf[i+1] == '\\' ) ) + +357 +keyme +[ +d +++] = '\\'; + +358 +i ++=2; + +362 +keyme +[ +d +++] = +buf +[ +i +++]; + +365 +keyme +[ +d +] = 0; + +367 +thekey + = + `joy_keyme_to_sym + +keyme + ); + +369 if +thekey + ) + +371 * +de + = +thekey +; + +372  +SDL_TRUE +; + +375  +SDL_FALSE +; + +376 + } +} + +378  + $ld_cfig + +t_ts + * +o +,  +mache + * +ic + ) + +380 +FILE + * +f +; + +381 +St32 + +i +, +j +; + +382  +tbtmp +[32]; + +383  +keym_fe +[4096]; + +385 +f + = + `fݒ + +FILEPREFIX +"oricutron.cfg", "r" ); + +386 if! +f + ) ; + +388  ! + `of + +f + ) ) + +390 if! + `fgs + +o +-> +lmp +, 2048, +f + ) ) ; + +392  +i +=0; + `isws + +o +-> +lmp +[i] ); i++ ) ; + +394 if + `ad_cfig_ti +& +o +-> +lmp +[ +i +], "mache", &o-> +t_mache +, +machtys + ) ) ; + +395 if + `ad_cfig_ti +& +o +-> +lmp +[ +i +], "diskty", &o-> +t_diskty +, +disktys + ) ) ; + +396 if + `ad_cfig_bo +& +o +-> +lmp +[ +i +], "debug", &o-> +t_debug + ) ) ; + +397 if + `ad_cfig_bo +& +o +-> +lmp +[ +i +], "fusn", & +fusn + ) ) ; + +398 if + `ad_cfig_bo +& +o +-> +lmp +[ +i +], "hwsur", & +hwsur + ) ) ; + +399 if + `ad_cfig_bo +& +o +-> +lmp +[ +i +], "sƚes", & +ic +-> +sƚes + ) ) ; + +400 if + `ad_cfig_bo +& +o +-> +lmp +[ +i +], "io", & +ic +-> +io + ) ) ; + +401 if + `ad_cfig_bo +& +o +-> +lmp +[ +i +], "htch", & +ic +-> +htch + ) ) ; + +402 if + `ad_cfig_bo +& +o +-> +lmp +[ +i +], "lghog", & +ic +-> +lgho + ) ) ; + +403 if + `ad_cfig_rg +& +o +-> +lmp +[ +i +], "diskimage", sto-> +t_disk +, 1024 ) ) ; + +404 if + `ad_cfig_rg +& +o +-> +lmp +[ +i +], "image", sto-> +t_ +, 1024 ) ) ; + +405 if + `ad_cfig_rg +& +o +-> +lmp +[ +i +], "symbs", sto-> +t_syms +, 1024 ) ) ; + +406 if + `ad_cfig_rg +& +o +-> +lmp +[ +i +], "th", +th +, 1024 ) ) ; + +407 if + `ad_cfig_rg +& +o +-> +lmp +[ +i +], "diskth", +diskth +, 1024 ) ) ; + +408 if + `ad_cfig_rg +& +o +-> +lmp +[ +i +], "diskth", +diskth +, 1024 ) ) ; + +409 if + `ad_cfig_rg +& +o +-> +lmp +[ +i +], "avdiskth", +avdiskth +, 1024 ) ) ; + +410 if + `ad_cfig_rg +& +o +-> +lmp +[ +i +], "moom", +moomfe +, 1024 ) ) ; + +411 if + `ad_cfig_rg +& +o +-> +lmp +[ +i +], "ic1rom", +ic1romfe +, 1024 ) ) ; + +412 if + `ad_cfig_rg +& +o +-> +lmp +[ +i +], "mdisom", +mdisomfe +, 1024 ) ) ; + +413 if + `ad_cfig_rg +& +o +-> +lmp +[ +i +], "jasmrom", +jasmomfe +, 1024 ) ) ; + +414 if + `ad_cfig_rg +& +o +-> +lmp +[ +i +], "avzrom", +avzromfe +[0], 1024 ) ) ; + +415 if + `ad_cfig_rg +& +o +-> +lmp +[ +i +], "avz8drom", +avzromfe +[1], 1024 ) ) ; + +416 if + `ad_cfig_t +& +o +-> +lmp +[ +i +], "mn", & +ic +-> +mn +, 0, 1 ) ) ; + +417 if + `ad_cfig_ti +& +o +-> +lmp +[ +i +], "swdth", & +ic +-> +sw_dth +, +swdths + ) ) + +420  +ic +-> +sw_dth +) + +422 0: +ic +-> +sw_dth + = 8; ; + +423 2: +ic +-> +sw_dth + = 32; ; + +424 : +ic +-> +sw_dth + = 16; ; + +428 if + `ad_cfig_ti +& +o +-> +lmp +[ +i +], "ndmode", &o-> +t_ndmode +, +ndmodes + ) ) + +430 #ide +__OPENGL_AVAILABLE__ + + +431 if +o +-> +t_ndmode + = +RENDERMODE_GL + ) + +432 +o +-> +t_ndmode + = +RENDERMODE_SW +; + +436  +j +=0; j<8; j++ ) + +438 + `rtf + +tbtmp +, "bk%c", +j ++'0' ); + +439 if + `ad_cfig_rg +& +o +-> +lmp +[ +i +], +tbtmp +, +bkfes +[ +j +], 1024 ) ) ; + +441 if + `ad_cfig_bo +& +o +-> +lmp +[ +i +], "ligh", & +ic +-> +ligh + ) ) ; + +442 if + `ad_cfig_bo +& +o +-> +lmp +[ +i +], "b", & +ic +-> +b + ) ) ; + +443 if + `ad_cfig_bo +& +o +-> +lmp +[ +i +], "tfr", & +ic +-> +tfr + ) ) ; + +444 if + `ad_cfig_t +& +o +-> +lmp +[ +i +], "rl_addss", & +ic +-> +acofft +, 0x310, 0x3fc ) ) ; + +445 if + `ad_cfig_rg +& +o +-> +lmp +[ +i +], "rl", +ic +-> +acbackdme +, +ACIA_BACKEND_NAME_LEN + ) ) + +447 if(! + `rcmp +("ne", +ic +-> +acbackdme +)) + +448 +ic +-> +acbackdcfg + = oric-> +acbackd + = +ACIA_TYPE_NONE +; + +449 if(! + `rcmp +("loback", +ic +-> +acbackdme +)) + +450 +ic +-> +acbackdcfg + = oric-> +acbackd + = +ACIA_TYPE_LOOPBACK +; + +451 if(! + `cmp +("modem", +ic +-> +acbackdme +, 5)) + +453 #ifde +BACKEND_MODEM + + +454 * +p + = + `rchr +( +ic +-> +acbackdme +, ':'); + +455 +ic +-> +acbackdcfg + = oric-> +acbackd + = +ACIA_TYPE_MODEM +; + +456 +ic +-> +acbackdcfgpt + = 0; + +457 +ic +-> +acbackdcfgdoma + = 4; + +458 if( +p +) { + +459 * +p2 + = + `rchr +( +p ++1, ':'); + +460 i( +p2 +) { + +462 i( + `rcmp +( +p2 ++1, "ipv6")==0) + +463 +ic +-> +acbackdcfgdoma + = 6; + +464 * +p2 + = '\0'; + +465 +ic +-> +acbackdcfgpt + = + `oi +( +p ++1); + +466 * +p2 + = ':'; + +468 +ic +-> +acbackdcfgpt + = + `oi +( +p ++1); + +471 if( +ic +-> +acbackdcfgpt + <= 0) + +472 +ic +-> +acbackdcfgpt + = +ACIA_TYPE_MODEM_DEFAULT_PORT +; + +477 #ifde +BACKEND_COM + + +478 +ic +-> +acbackdcfg + = oric-> +acbackd + = +ACIA_TYPE_COM +; + +483 if + `ad_cfig_ti +& +o +-> +lmp +[ +i +], "joyr", & +ic +-> +joy_i +, +joyitys + ) ) ; + +484 if + `ad_cfig_ti +& +o +-> +lmp +[ +i +], "joyick_a", & +ic +-> +joymode_a +, +joymodes + ) ) ; + +485 if + `ad_cfig_ti +& +o +-> +lmp +[ +i +], "joyick_b", & +ic +-> +joymode_b +, +joymodes + ) ) ; + +486 if + `ad_cfig_ti +& +o +-> +lmp +[ +i +], "joy_a", & +ic +-> +joymode_a +, +joymodes + ) ) ; + +487 if + `ad_cfig_ti +& +o +-> +lmp +[ +i +], "joy_b", & +ic +-> +joymode_b +, +joymodes + ) ) ; + +488 if + `ad_cfig_joykey +& +o +-> +lmp +[ +i +], "kbjoy1_up", & +ic +-> +kbjoy1 +[0] ) ) ; + +489 if + `ad_cfig_joykey +& +o +-> +lmp +[ +i +], "kbjoy1_down", & +ic +-> +kbjoy1 +[1] ) ) ; + +490 if + `ad_cfig_joykey +& +o +-> +lmp +[ +i +], "kbjoy1_", & +ic +-> +kbjoy1 +[2] ) ) ; + +491 if + `ad_cfig_joykey +& +o +-> +lmp +[ +i +], "kbjoy1_right", & +ic +-> +kbjoy1 +[3] ) ) ; + +492 if + `ad_cfig_joykey +& +o +-> +lmp +[ +i +], "kbjoy1_fe1", & +ic +-> +kbjoy1 +[4] ) ) ; + +493 if + `ad_cfig_joykey +& +o +-> +lmp +[ +i +], "kbjoy1_fe2", & +ic +-> +kbjoy1 +[5] ) ) ; + +494 if + `ad_cfig_joykey +& +o +-> +lmp +[ +i +], "kbjoy2_up", & +ic +-> +kbjoy2 +[0] ) ) ; + +495 if + `ad_cfig_joykey +& +o +-> +lmp +[ +i +], "kbjoy2_down", & +ic +-> +kbjoy2 +[1] ) ) ; + +496 if + `ad_cfig_joykey +& +o +-> +lmp +[ +i +], "kbjoy2_", & +ic +-> +kbjoy2 +[2] ) ) ; + +497 if + `ad_cfig_joykey +& +o +-> +lmp +[ +i +], "kbjoy2_right", & +ic +-> +kbjoy2 +[3] ) ) ; + +498 if + `ad_cfig_joykey +& +o +-> +lmp +[ +i +], "kbjoy2_fe1", & +ic +-> +kbjoy2 +[4] ) ) ; + +499 if + `ad_cfig_joykey +& +o +-> +lmp +[ +i +], "kbjoy2_fe2", & +ic +-> +kbjoy2 +[5] ) ) ; + +500 if + `ad_cfig_bo +& +o +-> +lmp +[ +i +], "diskautove", & +ic +-> +diskautove + ) ) ; + +501 if + `ad_cfig_bo +& +o +-> +lmp +[ +i +], "ch376", & +ic +-> +ch376_aived +) ) ; + +502 if + `ad_cfig_bo +& +o +-> +lmp +[ +i +], "avdiskautobo", & +ic +-> +avdiskautobo + ) ) ; + +503 if + `ad_cfig_bo +& +o +-> +lmp +[ +i +], "show_keybrd", & +ic +-> +show_keybrd + ) ) ; + +504 if + `ad_cfig_bo +& +o +-> +lmp +[ +i +], "icky_mod_keys", & +ic +-> +icky_mod_keys + ) ); + +505 if + `ad_cfig_rg +& +o +-> +lmp +[ +i +], "autd_keybrd_mpg", +keym_fe +, 4096 ) ) + +507 + `ry +( +keym_th +, +FILEPREFIX +""); + +508 + `rt +( +keym_th +, +keym_fe +); + +509 +ld_keym + = +SDL_TRUE +; + +514 + `fo + +f + ); + +515 + } +} + +517  + $uge + +t + ) + +519 + `tf + +VERSION_COPYRIGHTS + "\n\n" + +541 #ifde +__OPENGL_AVAILABLE__ + + +564 #ifde +BACKEND_MODEM + + +569 #ifde +BACKEND_COM + + +577 + `ex +( +t +); + +578 + } +} + +581  + $r_tf +* +fmt +, ... ) + +583  +r +[256]; + +585 +va_li + + +; + +586 + `va_t + + +, +fmt + ); + +587 if + `vtf + +r +, 256, +fmt +, + + ) != -1 ) + +589 +r +[255] = 0; + +590 #ifde +WIN32 + + +591 + `MesgeBoxA + +NULL +, +r +, "Oricu", +MB_OK + ); + +593 + `rtf + +dr +, "%s\n", +r + ); + +596 + `va_d + + + ); + +597 + } +} + +599  +SDL_bo + + $__off +* +g +, * +ti +, +SDL_bo + * +age + ) + +601 if +ti + ) + +603 if + `rcmp + +ti +, "on" ) == 0 ) + +605 * +age + = +SDL_TRUE +; + +606  +SDL_TRUE +; + +609 if + `rcmp + +ti +, "off" ) == 0 ) + +611 * +age + = +SDL_FALSE +; + +612  +SDL_TRUE +; + +616 + `r_tf +("Pam '%s' should bflowed by '' o'off'", +g +); + +617  +SDL_FALSE +; + +618 + } +} + +620 +SDL_bo + + $ + +mache + * +ic +,  +gc +, * +gv +[] ) + +622 +St32 + +i +; + +623  +t_ts + * +o +; + +624  +t_ty +, * +t_g +, * +tmp +; + +626 +o + = + `mloc + +t_ts + ) ); + +627 if! +o + )  +SDL_FALSE +; + +630 +o +-> +t_mache + = +MACH_ATMOS +; + +631 +o +-> +t_mache_t + = +SDL_FALSE +; + +632 +o +-> +t_diskty + = +DRV_NONE +; + +633 +o +-> +t_diskty_t + = +SDL_FALSE +; + +634 +o +-> +t_debug + = +SDL_FALSE +; + +635 +o +-> +t_ndmode + = +RENDERMODE_SW +; + +636 +o +-> +t_disk +[0] = 0; + +637 +o +-> +t_ +[0] = 0; + +638 +o +-> +t_syms +[0] = 0; + +639 +o +-> +t_syms_cou + = 0; + +640 +o +-> +t_sh +[0] = 0; + +641 +o +-> +t_bakpot + = +NULL +; + +642 +ic +-> +ch376_aived + = +SDL_FALSE +; + +643 +fusn + = +SDL_FALSE +; + +644 #ifde +WIN32 + + +645 +hwsur + = +SDL_TRUE +; + +647 +hwsur + = +SDL_FALSE +; + +650 + `e_u + +ic + ); + +651 + `e_mache + +ic + ); + +652 + `e_nd_sw + +ic + ); + +653 + `e_nd_sw8 + +ic + ); + +654 #ifde +__OPENGL_AVAILABLE__ + + +655 + `e_nd_gl + +ic + ); + +657 + `e_gui + +ic + ); + +659 + `kbd_ +( +ic +); + +662 if + `SDL_In + +SDL_INIT_VIDEO + | +SDL_INIT_AUDIO + ) < 0 ) + +664 + `r_tf +( "SDL init failed" ); + +665 + ` + +o + ); + +666  +SDL_FALSE +; + +668 +ed_sdl_qu + = +SDL_TRUE +; + +670 #ide +__APPLE__ + + +671 + `SDL_COMPAT_WM_SIc + + `SDL_LdBMP + +IMAGEPREFIX +"wic.bmp" ), +NULL + ); + +674 + `nd_sw_devideo + +ic + ); + +676 + `ld_cfig + +o +, +ic + ); + +678  +i +=1; i< +gc +; i++ ) + +680 +t_ty + = 0; + +681 if +gv +[ +i +][0] == '-' ) + +683  +gv +[ +i +][1] ) + +686 +t_g + = +NULL +; + +687 +tmp + = & +gv +[ +i +][2]; + +689 if + `rcmp + +tmp +, "fusn" ) =0 ) { +t_ty + = 'f'; ; } + +690 if + `rcmp + +tmp +, "wdow" ) =0 ) { +t_ty + = 'w'; ; } + +691 if + `rcmp + +tmp +, "debug" ) =0 ) { +t_ty + = 'b'; ; } + +692 if + `rcmp + +tmp +, "hwsur" ) =0 ) { +hwsur + = +SDL_TRUE +; ; } + +693 if + `rcmp + +tmp +, "swsur" ) =0 ) { +hwsur + = +SDL_FALSE +; ; } + +694 if + `rcmp + +tmp +, "hp" ) =0 ) { +t_ty + = 'h'; ; } + +696 if +i +<( +gc +-1) ) + +697 +t_g + = +gv +[ +i ++1]; + +698 +i +++; + +700 if + `rcmp + +tmp +, "mache" ) =0 ) { +t_ty + = 'm'; ; } + +701 if + `rcmp + +tmp +, "disk" ) =0 ) { +t_ty + = 'd'; ; } + +702 if + `rcmp + +tmp +, "" ) =0 ) { +t_ty + = 't'; ; } + +703 if + `rcmp + +tmp +, "drive" ) =0 ) { +t_ty + = 'k'; ; } + +704 if + `rcmp + +tmp +, "symbs" ) =0 ) { +t_ty + = 's'; ; } + +705 if + `rcmp + +tmp +, "bakpot" ) =0 ) { +t_ty + = 'r'; ; } + +706 #ifde +__OPENGL_AVAILABLE__ + + +707 if + `rcmp + +tmp +, "ndmode" ) =0 ) { +t_ty + = 'R'; ; } + +711 if + `rcmp + +tmp +, "turbotape" ) == 0 ) + +713 if! + `__off + +gv +[ +i +-1], +t_g +, & +ic +-> +turbo + ) ) + `ex + +EXIT_FAILURE + ); + +717 if + `rcmp + +tmp +, "lightpen" ) == 0 ) + +719 if! + `__off + +gv +[ +i +-1], +t_g +, & +ic +-> +ligh + ) ) + `ex + +EXIT_FAILURE + ); + +723 if + `rcmp + +tmp +, "serial_address" ) == 0 ) + +725 if! +t_g + ) + +726 + `ex + +EXIT_FAILURE + ); + +727 if'$' = +t_g +[0] && 1 = + `ssnf +(t_g, "$%x", & +ic +-> +acofft +) ) + +729 if'0' = +t_g +[0] && 1 = + `ssnf +(t_g, "0x%x", & +ic +-> +acofft +) ) + +731 if'0' = +t_g +[0] && 1 = + `ssnf +(t_g, "0X%x", & +ic +-> +acofft +) ) + +733 if1 = + `ssnf +( +t_g +, "%d", & +ic +-> +acofft +) ) + +735 + `ex + +EXIT_FAILURE + ); + +738 if + `rcmp + +tmp +, "serial" ) == 0 ) + +740 +ic +-> +acbackdcfg + = oric-> +acbackd + = +ACIA_TYPE_NONE +; + +741 if(! + `rcmp +("ne", +t_g +)) + +743 if(! + `rcmp +("loback", +t_g +)) + +744 +ic +-> +acbackdcfg + = oric-> +acbackd + = +ACIA_TYPE_LOOPBACK +; + +745 if(! + `cmp +("modem", +t_g +, 5)) + +747 #ifde +BACKEND_MODEM + + +748 * +p + = + `rchr +( +t_g +, ':'); + +749 +ic +-> +acbackdcfg + = oric-> +acbackd + = +ACIA_TYPE_MODEM +; + +750 +ic +-> +acbackdcfgpt + = 0; + +751 +ic +-> +acbackdcfgdoma + = 4; + +752 if( +p +) { + +753 * +p2 + = + `rchr +( +p ++1, ':'); + +754 i( +p2 +) { + +756 i( + `rcmp +( +p2 ++1, "ipv6")==0) + +757 +ic +-> +acbackdcfgdoma + = 6; + +758 * +p2 + = '\0'; + +759 +ic +-> +acbackdcfgpt + = + `oi +( +p ++1); + +760 * +p2 + = ':'; + +762 +ic +-> +acbackdcfgpt + = + `oi +( +p ++1); + +765 if( +ic +-> +acbackdcfgpt + <= 0) + +766 +ic +-> +acbackdcfgpt + = +ACIA_TYPE_MODEM_DEFAULT_PORT +; + +771 #ifde +BACKEND_COM + + +772 + `y +( +ic +-> +acbackdme +, +t_g +, +ACIA_BACKEND_NAME_LEN +); + +773 +ic +-> +acbackdcfg + = oric-> +acbackd + = +ACIA_TYPE_COM +; + +779 if + `rcmp + +tmp +, "vsynchack" ) == 0 ) + +781 if! + `__off + +gv +[ +i +-1], +t_g +, & +ic +-> +vsynchack + ) ) + `ex + +EXIT_FAILURE + ); + +785 if + `rcmp + +tmp +, "scanlines" ) == 0 ) + +787 if! + `__off + +gv +[ +i +-1], +t_g +, & +ic +-> +sƚes + ) ) + `ex + +EXIT_FAILURE + ); + +793 +t_ty + = +gv +[ +i +][1]; + +794 +t_g + = +NULL +; + +795 i( +gv +[ +i +][2]) + +796 +t_g + = & +gv +[ +i +][2]; + +797 i +i +<( +gc +-1)) + +799  +t_ty +) + +807 #ifde +__OPENGL_AVAILABLE__ + + +810 +t_g + = +gv +[ +i ++1]; + +811 +i +++; + +817  +t_ty + ) + +820 if +t_g + ) + +822 if( + `rcmp + +t_g +, "atmos" ) == 0 ) || + +823 + `rcmp + +t_g +, "a" ) == 0 )) + +825 +o +-> +t_mache + = +MACH_ATMOS +; + +826 +o +-> +t_mache_t + = +SDL_TRUE +; + +829 if( + `rcmp + +t_g +, "oric1" ) == 0 ) || + +830 + `rcmp + +t_g +, "1" ) == 0 )) + +832 +o +-> +t_mache + = +MACH_ORIC1 +; + +833 +o +-> +t_mache_t + = +SDL_TRUE +; + +836 if + `rcmp + +t_g +, "o16k" ) == 0 ) + +838 +o +-> +t_mache + = +MACH_ORIC1_16K +; + +839 +o +-> +t_mache_t + = +SDL_TRUE +; + +842 if( + `rcmp + +t_g +, "telestrat" ) == 0 ) || + +843 + `rcmp + +t_g +, "t" ) == 0 )) + +845 +o +-> +t_mache + = +MACH_TELESTRAT +; + +846 +o +-> +t_mache_t + = +SDL_TRUE +; + +849 if( + `rcmp + +t_g +, "pravetz" ) == 0 ) || + +850 + `rcmp + +t_g +, "pravetz8d" ) == 0 ) || + +851 + `rcmp + +t_g +, "p" ) == 0 )) + +853 +o +-> +t_mache + = +MACH_PRAVETZ +; + +854 +o +-> +t_mache_t + = +SDL_TRUE +; + +859 + `r_tf +( "Invalid machineype" ); + +860 + ` + +o + ); + +861 + `ex + +EXIT_FAILURE + ); + +866 +SDL_bo + +dr_through + = +SDL_FALSE +; + +867 if +t_g + ) + +869  + `de_image_ty +( +t_g +)) + +871  +IMG_ATMOS_MICRODISC +: + +872  +IMG_ATMOS_JASMIN +: + +873  +IMG_TELESTRAT_DISK +: + +874  +IMG_PRAVETZ_DISK +: + +875  +IMG_GUESS_MICRODISC +: + +876 + `tf +("'%s' smtbdisk image.\n", +t_g +); + +877 +dr_through + = +SDL_TRUE +; + +880  +IMG_SNAPSHOT +: + +881 + `tf +("'%s' smtbsh fe.\n", +t_g +); + +882 + `y + +o +-> +t_sh +, +t_g +, 1024); + +883 +o +-> +t_sh +[1023] = 0; + +886  +IMG_TAPE +: + +888 + `y + +o +-> +t_ +, +t_g +, 1024 ); + +889 +o +-> +t_ +[1023] = 0; + +893 + `r_tf +( "Noape image specified" ); + +894 + ` + +o + ); + +895 + `ex + +EXIT_FAILURE + ); + +898 i(! +dr_through +) + +903 if +t_g + ) + +905 + `y + +o +-> +t_disk +, +t_g +, 1024 ); + +906 +o +-> +t_disk +[1023] = 0; + +907  + `de_image_ty +( +o +-> +t_disk +)) + +909  +IMG_ATMOS_MICRODISC +: + +910 i(! +o +-> +t_mache_t +o-> +t_mache + = +MACH_ATMOS +; + +911 i(! +o +-> +t_diskty_t +o-> +t_diskty + = +DRV_MICRODISC +; + +914  +IMG_ATMOS_JASMIN +: + +915 i(! +o +-> +t_mache_t +o-> +t_mache + = +MACH_ATMOS +; + +916 i(! +o +-> +t_diskty_t +o-> +t_diskty + = +DRV_JASMIN +; + +919  +IMG_TELESTRAT_DISK +: + +920 i(! +o +-> +t_mache_t +o-> +t_mache + = +MACH_TELESTRAT +; + +921 i(! +o +-> +t_diskty_t +o-> +t_diskty + = +DRV_MICRODISC +; + +924  +IMG_PRAVETZ_DISK +: + +925 i(! +o +-> +t_mache_t +o-> +t_mache + = +MACH_PRAVETZ +; + +926 i(! +o +-> +t_diskty_t +o-> +t_diskty + = +DRV_PRAVETZ +; + +929  +IMG_GUESS_MICRODISC +: + +930 i(! +o +-> +t_diskty_t +o-> +t_diskty + = +DRV_MICRODISC +; + +933  +IMG_TAPE +: + +934 + `tf +("'%s' smtb image.\n", +o +-> +t_disk +); + +935 + `ry +( +o +-> +t_ +, sto-> +t_disk +); + +936 +o +-> +t_disk +[0] = 0; + +939  +IMG_SNAPSHOT +: + +940 + `tf +("'%s' smtbsh fe.\n", +t_g +); + +941 + `y + +o +-> +t_sh +, +t_g +, 1024); + +942 +o +-> +t_sh +[1023] = 0; + +946 + `r_tf +( "No disk image specified" ); + +947 + ` + +o + ); + +948 + `ex + +EXIT_FAILURE + ); + +953 if +t_g + ) + +955 if( + `rcmp + +t_g +, "microdisc" ) == 0 ) || + +956 + `rcmp + +t_g +, "m" ) == 0 )) + +958 +o +-> +t_diskty + = +DRV_MICRODISC +; + +959 +o +-> +t_diskty_t + = +SDL_TRUE +; + +962 if( + `rcmp + +t_g +, "jasmin" ) == 0 ) || + +963 + `rcmp + +t_g +, "j" ) == 0 )) + +965 +o +-> +t_diskty + = +DRV_JASMIN +; + +966 +o +-> +t_diskty_t + = +SDL_TRUE +; + +969 if( + `rcmp + +t_g +, "pravetz" ) == 0 ) || + +970 + `rcmp + +t_g +, "p" ) == 0 )) + +972 +o +-> +t_diskty + = +DRV_PRAVETZ +; + +973 +o +-> +t_diskty_t + = +SDL_TRUE +; + +976 if( + `rcmp + +t_g +, "none" ) == 0 ) || + +977 + `rcmp + +t_g +, "n" ) == 0 )) + +979 +o +-> +t_diskty + = +DRV_NONE +; + +980 +o +-> +t_diskty_t + = +SDL_FALSE +; + +985 + `r_tf +( "Invalid driveype" ); + +986 + ` + +o + ); + +987 + `ex + +EXIT_FAILURE + ); + +991 if +t_g + ) + +993 if +o +-> +t_syms_cou + < 32 ) + +995 * +w_syms + = + `rdup + +t_g + ); + +996 if +NULL + ! +w_syms + ) + +997 +o +-> +t_syms_fes +[o-> +t_syms_cou +++] = +w_syms +; + +1000 + `r_tf +( "No symbols file specified" ); + +1001 + ` + +o + ); + +1002 + `ex + +EXIT_FAILURE + ); + +1007 +fusn + = +SDL_TRUE +; + +1011 +fusn + = +SDL_FALSE +; + +1015 +o +-> +t_debug + = +SDL_TRUE +; + +1019 if +t_g + ) + +1021 +o +-> +t_bakpot + = +t_g +; + +1025 + `r_tf +( "Breakpointddress or symbolxpected" ); + +1026 + ` + +o + ); + +1027 + `ex + +EXIT_FAILURE + ); + +1031 #ifde +__OPENGL_AVAILABLE__ + + +1033 if +t_g + ) + +1035 if + `rcmp + +t_g +, "so" ) =0 ) { +o +-> +t_ndmode + = +RENDERMODE_SW +; ; } + +1036 if + `rcmp + +t_g +, "ݒgl" ) =0 ) { +o +-> +t_ndmode + = +RENDERMODE_GL +; ; } + +1039 + `r_tf +( "Invalidender mode" ); + +1040 + ` + +o + ); + +1041 + `ex + +EXIT_FAILURE + ); + +1046 + ` + +o + ); + +1047 + `uge + +EXIT_SUCCESS + ); + +1053  + `de_image_ty +( +gv +[ +i +])) + +1055  +IMG_SNAPSHOT +: + +1056 + `y + +o +-> +t_sh +, +gv +[ +i +], 1024); + +1057 +o +-> +t_sh +[1023] = 0; + +1060  +IMG_ATMOS_MICRODISC +: + +1061 i(! +o +-> +t_mache_t +o-> +t_mache + = +MACH_ATMOS +; + +1062 i(! +o +-> +t_diskty_t +o-> +t_diskty + = +DRV_MICRODISC +; + +1063 + `y + +o +-> +t_disk +, +gv +[ +i +], 1024 ); + +1064 +o +-> +t_disk +[1023] = 0; + +1067  +IMG_ATMOS_JASMIN +: + +1068 i(! +o +-> +t_mache_t +o-> +t_mache + = +MACH_ATMOS +; + +1069 i(! +o +-> +t_diskty_t +o-> +t_diskty + = +DRV_JASMIN +; + +1070 + `y + +o +-> +t_disk +, +gv +[ +i +], 1024 ); + +1071 +o +-> +t_disk +[1023] = 0; + +1074  +IMG_TELESTRAT_DISK +: + +1075 i(! +o +-> +t_mache_t +o-> +t_mache + = +MACH_TELESTRAT +; + +1076 i(! +o +-> +t_diskty_t +o-> +t_diskty + = +DRV_MICRODISC +; + +1077 + `y + +o +-> +t_disk +, +gv +[ +i +], 1024 ); + +1078 +o +-> +t_disk +[1023] = 0; + +1081  +IMG_PRAVETZ_DISK +: + +1082 i(! +o +-> +t_mache_t +o-> +t_mache + = +MACH_PRAVETZ +; + +1083 i(! +o +-> +t_diskty_t +o-> +t_diskty + = +DRV_PRAVETZ +; + +1084 + `y + +o +-> +t_disk +, +gv +[ +i +], 1024 ); + +1085 +o +-> +t_disk +[1023] = 0; + +1088  +IMG_GUESS_MICRODISC +: + +1089 i(! +o +-> +t_diskty_t +o-> +t_diskty + = +DRV_MICRODISC +; + +1090 + `y + +o +-> +t_disk +, +gv +[ +i +], 1024 ); + +1091 +o +-> +t_disk +[1023] = 0; + +1094  +IMG_TAPE +: + +1095 + `y +( +o +-> +t_ +, +gv +[ +i +], 1024); + +1096 +o +-> +t_ +[1023] = 0; + +1100 + ` + +o + ); + +1101 + `uge + +EXIT_FAILURE + ); + +1106 + `ld_diskroms + +ic + ); + +1108 if +o +-> +t_disk +[0] ) && ( sto-> +t_diskty + = +DRV_NONE + ) ) + +1109 +o +-> +t_diskty + = +DRV_MICRODISC +; + +1111  +i +=0; i<8; i++ ) +ϡamimes +[i] = 0; + +1112 +amimve + = 0; + +1114 + `tovock + +ic +, +NULL +, 0 ); + +1115 if! + `_gui + +ic +, +o +-> +t_ndmode + ) ) { + ` +С);  +SDL_FALSE +; } + +1116 if! + `_feque + +ic + ) ) { + ` + +o + );  +SDL_FALSE +; } + +1117 if! + `_msgbox + +ic + ) ) { + ` + +o + );  +SDL_FALSE +; } + +1118 +ic +-> +drivy + = +o +-> +t_diskty +; + +1119 if! + `_u + +ic + ) ) { + ` + +o + );  +SDL_FALSE +; } + +1120 if! + `_joy + +ic + ) ) { + ` + +o + );  +SDL_FALSE +; } + +1121 if! + `_mache + +ic +, +o +-> +t_mache +, +SDL_TRUE + ) ) { + ` +С);  +SDL_FALSE +; } + +1123 if +o +-> +t_disk +[0] ) + +1125 + `diskimage_ld + +ic +, +o +-> +t_disk +, 0 ); + +1126  +ic +-> +drivy +) + +1128  +DRV_PRAVETZ +: + +1129 + `avdiskbo + +ic + ); + +1132  +DRV_JASMIN +: + +1133 +ic +-> +auto_jasm_t + = +SDL_TRUE +; + +1137 if +o +-> +t_ +[0] ) + +1139 if + `_ld_p + +ic +, +o +-> +t_ + ) ) + +1140 + `queuekeys +( "CLOAD\"\"\x0d" ); + +1143 + `m_ + +ic + ); + +1144 if +o +-> +t_syms +[0] ) + +1145 + `m_w_symbs +& +ic +-> +ursyms +, oric, +o +-> +t_syms +, +SYM_BESTGUESS +, +SDL_TRUE +, SDL_TRUE ); + +1147  +i +=0; i< +o +-> +t_syms_cou +; i++ ) + +1149 if +NULL +!= +o +-> +t_syms_fes +[ +i +] ) + +1151 + `m_w_symbs +& +ic +-> +ursyms +, oric, +o +-> +t_syms_fes +[ +i +], +SYM_BESTGUESS +, +SDL_TRUE +, SDL_TRUE ); + +1152 + ` +( +o +-> +t_syms_fes +[ +i +]); + +1153 +o +-> +t_syms_fes +[ +i +] = +NULL +; + +1156 +o +-> +t_syms_cou + = 0; + +1158 if +o +-> +t_bakpot + ) + +1160 if +o +-> +t_bakpot +[0] == ':' ) + +1162 +SDL_bo + +ednd + = +SDL_FALSE +; + +1163  +bsbuf +[32]; + +1164 * + + = +o +-> +t_bakpot + + 1; + +1165 +FILE +* +f + = + `fݒ + + +, "rt" ); + +1166 if! +f + ) + +1168 + `r_tf +( "Invalid breakpoint file" ); + +1169 + ` + +o + ); + +1170  +SDL_FALSE +; + +1172  ! + `of + +f + ) ) + +1174 * +p +; + +1175 if! + `fgs + +bsbuf +, 32, +f + ) ) ; + +1176 +bsbuf +[31] = 0; + +1177  +NULL + !( +p + = + `rchr + +bsbuf +, '\r' )) ) *p = 0; + +1178  +NULL + !( +p + = + `rchr + +bsbuf +, '\n' )) ) *p = 0; + +1179  +NULL + !( +p + = + `rchr + +bsbuf +, '\t' )) ) *p = ' '; + +1180 +p + = +bsbuf +; + +1181  * +p + && + `isws +( *p ) )++; + +1182 if* +p + ) + `m_cmd + +bsbuf +, +ic +, & +ednd + ); + +1184 + `fo + +f + ); + +1188  +i + = 0; + +1189  +addr +; + +1190 if! + `m_gnum + +ic +, & +addr +, +o +-> +t_bakpot +, & +i +, +SDL_FALSE +, SDL_FALSE, SDL_FALSE, +SDL_TRUE + ) ) + +1192 + `r_tf +( "Invalid breakpoint" ); + +1193 + ` + +o + ); + +1194  +SDL_FALSE +; + +1197 +ic +-> +u +. +bakpots +[0] = +addr +; + +1198 +ic +-> +u +. +ybp + = +SDL_TRUE +; + +1202 if +o +-> +t_sh +[0] ) + +1203 + `ld_sh + +ic +, +o +-> +t_sh + ); + +1205 if +o +-> +t_debug + ) + +1206 + `mumode + +ic +, +NULL +, +EM_DEBUG + ); + +1208 + ` + +o + ); + +1209  +SDL_TRUE +; + +1210 + } +} + +1212  + $shut + +mache + * +ic + ) + +1214 if +vidp + ) + `avi_o +( &vidcap ); + +1215 #i + `defed +( +DEBUG_CPU_TRACE +) && DEBUG_CPU_TRACE > 0 + +1216 + `dump_ua +( +ic +); + +1218 if +ic + ) + +1220 + `shut_mache + +ic + ); + +1221 + `shut_joy + +ic + ); + +1222 + `shut_u + +ic + ); + +1223 + `m_shut + +ic + ); + +1224 + `shut_feque + +ic + ); + +1225 + `shut_msgbox + +ic + ); + +1226 + `shut_gui + +ic + ); + +1228 if +ed_sdl_qu + ) + `SDL_COMPAT_Qu +(); + +1229 + } +} + +1231  + $amo_ovock + +mache + * +ic +, +SDL_bo + * +amede +, SDL_bo * +ednd + ) + +1233  +lo +, +cyes +; + +1235  ( !(* +amede +&& ( !(* +ednd +) ) ) + +1237  +ic +-> +u +. +cyes + > 0 ) + +1240  +lo +=0, +cyes +=0; inlo < +ic +-> +ovockmu +; instloop++ ) + +1242 if + `m6502_t_icyes +& +ic +-> +u +, +SDL_TRUE +, +m_bpmsg + ) ) + +1245 + `mumode + +ic +, +NULL +, +EM_DEBUG + ); + +1246 * +ednd + = +SDL_TRUE +; + +1250 +cyes + + +ic +-> +u +. +icyes +; + +1251 + `_tches + +ic + ); + +1253 if +lo + < ( +ic +-> +ovockmu +-1) ) + +1255 i( + `m6502_ +& +ic +-> +u + )) + +1261 +cyes + >> +ic +-> +ovockshi +; + +1264 + `v_ock +& +ic +-> +v +, +cyes + ); + +1265 + `ay_ticktock +& +ic +-> +ay +, +cyes + ); + +1266 if(( +ic +-> +drivy + = +DRV_MICRODISC +|| (ic->drivy = +DRV_JASMIN +) + `wd17xx_ticktock +&ic-> +wddisk +, +cyes + ); + +1267 if +ic +-> +ty + = +MACH_TELESTRAT + ) + +1269 + `v_ock +& +ic +-> +_v +, +cyes + ); + +1271 if +ic +-> +acbackd + ) + +1272 + `ac_ock +& +ic +-> +_ac +, +cyes + ); + +1274 +ic +-> +u +. +cyes + - +cyes +; + +1278 if +ic +-> +emu_mode + ! +EM_RUNNING + ) ; + +1279 if + `m6502_ +& +ic +-> +u + ) ) + +1282 + `m_tf_above +"Opcod%02Xxecud%04X", +ic +-> +u +. +lc +, oric->u. +ϡpc + ); + +1283 + `mumode + +ic +, +NULL +, +EM_DEBUG + ); + +1284 * +ednd + = +SDL_TRUE +; + +1289 if +ic +-> +u +. +cyes + <= 0 ) + +1291 * +amede + = + `u_da + +ic + ); + +1292 +ic +-> +u +. +cyes + +ic-> +cye +; + +1295 + } +} + +1297  + $amo_nm + +mache + * +ic +, +SDL_bo + * +amede +, SDL_bo * +ednd + ) + +1299  ( !(* +amede +&& ( !(* +ednd +) ) ) + +1301  +ic +-> +u +. +cyes + > 0 ) + +1303 if + `m6502_t_icyes +& +ic +-> +u +, +SDL_TRUE +, +m_bpmsg + ) ) + +1306 + `mumode + +ic +, +NULL +, +EM_DEBUG + ); + +1307 * +ednd + = +SDL_TRUE +; + +1311 + `_tches + +ic + ); + +1312 + `v_ock +& +ic +-> +v +, oric-> +u +. +icyes + ); + +1313 + `ay_ticktock +& +ic +-> +ay +, oric-> +u +. +icyes + ); + +1314 if(( +ic +-> +drivy + = +DRV_MICRODISC +|| (ic->drivy = +DRV_JASMIN +) + `wd17xx_ticktock +&ic-> +wddisk +, oric-> +u +. +icyes + ); + +1315 if +ic +-> +ty + = +MACH_TELESTRAT + ) + +1317 + `v_ock +& +ic +-> +_v +, oric-> +u +. +icyes + ); + +1319 if +ic +-> +acbackd + ) + +1320 + `ac_ock +& +ic +-> +_ac +, oric-> +u +. +icyes + ); + +1322 +ic +-> +u +. +cyes + -ic->u. +icyes +; + +1323 if + `m6502_ +& +ic +-> +u + ) ) + +1326 + `m_tf_above +"Opcod%02Xxecud%04X", +ic +-> +u +. +lc +, oric->u. +ϡpc + ); + +1327 + `mumode + +ic +, +NULL +, +EM_DEBUG + ); + +1328 * +ednd + = +SDL_TRUE +; + +1333 if +ic +-> +u +. +cyes + <= 0 ) + +1335 * +amede + = + `u_da + +ic + ); + +1336 +ic +-> +u +. +cyes + +ic-> +cye +; + +1339 + } +} + +1342  + $_r_ame + +mache + * +ic + ) + +1344  +i +; + +1346 if +ic +-> +diskautove + ) + +1348  +i +=0; i<4; i++ ) + +1350 if +ic +-> +wddisk +. +disk +[ +i +] ) && ( oric->wddisk.disk[i]-> +modifd + ) ) + +1352 +ic +-> +wddisk +. +disk +[ +i +]-> +modifd_time +++; + +1353 if +ic +-> +wddisk +. +disk +[ +i +]-> +modifd_time + >= 20 ) + +1355 + `diskimage_ve + +ic +, oric-> +wddisk +. +disk +[ +i +]-> +fame +, i ); + +1360 + } +} + +1362  + $ma + +gc +, * +gv +[] ) + +1364  +mache + +ic +; + +1365 +SDL_bo + +is +; + +1367 #ifde +_MSC_VER + + +1368 + `_CSDbgFg +( +_CRTDBG_ALLOC_MEM_DF + | +_CRTDBG_LEAK_CHECK_DF +); + +1372 #ide +__MORPHOS__ + + +1373 + `punv +("SDL_VIDEO_CENTERED=center"); + +1376 + `memt +(& +ic +, 0, (oric)); + +1380 #ifde +__APPLE__ + + +1381 +CFBundRef + +maBund + = + `CFBundGMaBund +(); + +1382 +CFURLRef + +soursURL + = + `CFBundCyResoursDeyURL +( +maBund +); + +1383  +th +[ +PATH_MAX +]; + +1384 i(! + `CFURLGFeSyemRi +( +soursURL +, +TRUE +, ( +UI8 + *) +th +, +PATH_MAX +)) + +1388 + `CFR +( +soursURL +); + +1391 + `rt +( +th +, "/../../.."); + +1392 + `chd +( +th +); + +1396 if +is + = + ` +& +ic +, +gc +, +gv + ) ) ) + +1398 +Ut64 + +xtame_us +; + +1399 +Ut32 + +xtame_ms +, +now +=0, +th +; + +1400 +SDL_bo + +de +, +ednd +, +amede +; + +1401 +St32 + +i +; + +1403 +now + = + `SDL_GTicks +(); + +1404 +xtame_ms + = +now +; + +1405 +xtame_us + = (( +Ut64 +) +xtame_ms +)*1000; + +1407 +de + = +SDL_FALSE +; + +1408 +ednd + = +SDL_TRUE +; + +1409 +amede + = +SDL_FALSE +; + +1411 if( +ld_keym +) + +1413 + `ld_keybrd_mpg +& +ic +, +keym_th + ); + +1414 +ld_keym + = +SDL_FALSE +; + +1417  ! +de + ) + +1419 +SDL_Evt + +evt +; + +1421 if +ic +. +emu_mode + = +EM_PLEASEQUIT + ) + +1424 if +ic +. +emu_mode + = +EM_RUNNING + ) + +1426 if +ic +. +ovockmu +==1 ) + +1427 + `amo_nm +& +ic +, & +amede +, & +ednd + ); + +1429 + `amo_ovock +& +ic +, & +amede +, & +ednd + ); + +1431 + `ay_uockaudio +& +ic +. +ay + ); + +1433 if +amede + ) + +1435 +xtame_us + + +ic +. +vid_eq + ? 20000LL : 16667LL; + +1436 +xtame_ms + = ( +Ut32 +)( +xtame_us +/1000LL); + +1438 i( +wpd +) + +1440 i(( +ic +. +ames +&3)==0) + +1441 +ednd + = +SDL_TRUE +; + +1445 +ednd + = +SDL_TRUE +; + +1449 if +ednd + ) + +1451 + `nd +& +ic + ); + +1452 +ednd + = +SDL_FALSE +; + +1455 if +amede + ) + +1457 + `_r_ame +& +ic + ); + +1459 +th + = +now +; + +1460 +now + = + `SDL_GTicks +(); + +1462 +amimve + = 0; + +1463  +i +=( +FRAMES_TO_AVERAGE +-1); i>0; i-- ) + +1465 +ϡamimes +[ +i +] =astframetimes[i-1]; + +1466 +amimve + + +ϡamimes +[ +i +]; + +1468 +ϡamimes +[0] = +now +- +th +; + +1469 +amimve + = (amimve+ +ϡamimes +[0])/ +FRAMES_TO_AVERAGE +; + +1471 i( +wpd +) + +1473 +xtame_ms + = +now +; + +1474 +xtame_us + = (( +Ut64 +) +xtame_ms +)*1000; + +1478 i( +now + > +xtame_ms +) + +1480 +xtame_ms + = +now +; + +1481 +xtame_us + = (( +Ut64 +) +xtame_ms +)*1000; + +1485 + `SDL_Day +( +xtame_ms +- +now +); + +1488 +amede + = +SDL_FALSE +; + +1491 if! + `SDL_PlEvt +& +evt + ) ) ; + +1495 + `ay_uockaudio +& +ic +. +ay + ); + +1496 if +ednd + ) + +1498 + `nd +& +ic + ); + +1499 +ednd + = +SDL_FALSE +; + +1501 if! + `SDL_WaEvt +& +evt + ) ) ; + +1505  +evt +. +ty + ) + +1507  +SDL_COMPAT_ACTIVEEVENT +: + +1509 if( + `SDL_COMPAT_IsAAive +(& +evt +)) + +1511 +ic +. + `shut_nd +(&oric); + +1512 +ic +. + `_nd +(&oric); + +1513 +ednd + = +SDL_TRUE +; + +1517  +SDL_QUIT +: + +1518 +de + = +SDL_TRUE +; + +1522  +ic +. +emu_mode + ) + +1524  +EM_MENU +: + +1525 +de + | + `mu_evt +& +evt +, & +ic +, & +ednd + ); + +1528  +EM_RUNNING +: + +1529 +de + | + `emu_evt +& +evt +, & +ic +, & +ednd + ); + +1532  +EM_DEBUG +: + +1533 +de + | + `m_evt +& +evt +, & +ic +, & +ednd + ); + +1537 i( +ic +. +show_keybrd +) + +1538 + `keybrd_evt +& +evt +, & +ic +, & +ednd + ); + +1540 }  + `SDL_PlEvt +& +evt + ) ); + +1542 + `ay_uockaudio +& +ic +. +ay + ); + +1544 + `shut +& +ic + ); + +1546  +is + ? +EXIT_SUCCESS + : +EXIT_FAILURE +; + +1547 + } +} + + @main.h + +21 +SDL_bo + +ad_cfig_rg +* +buf +, * +tok +, * +de +, +St32 + +maxn + ); + +22 +SDL_bo + +ad_cfig_bo +* +buf +, * +tok +, SDL_bo * +de + ); + +23 +SDL_bo + +ad_cfig_ti +* +buf +, * +tok +, +St32 + * +de +, ** +tis + ); + +24 +SDL_bo + +ad_cfig_t +* +buf +, * +tok +, * +de +,  +m +,  +max + ); + + @monitor.c + +22  + #MAX_CONS_INPUT + 127 + +23  + #MAX_ASM_INPUT + 36 + + ) + +24  + #CONS_WIDTH + 46 + +25 + + ) + +26  + ~ + +27  + ~ + +28  + ~ + +29  + ~ + +30  + ~ + +32  + ~"syem.h +" + +33 #unde +REG_PC + + +34  + #REG_PC + +_REG_PC + + + ) + +35  + ~"6502.h +" + +36  + ~"v.h +" + +37  + ~"8912.h +" + +38  + ~"gui.h +" + +39  + ~"disk.h +" + +40  + ~"mڙ.h +" + +41  + ~"6551.h +" + +42  + ~"mache.h +" + +43  + ~"u.h +" + +44  + ~".h +" + +45  + ~"sh.h +" + +47  + #LOG_DEBUG + 0 + + ) + +49 #i +LOG_DEBUG + + +50 #i +defed +( +__amigaos4__ +|| defed( +__MORPHOS__ +) + +51 * + gdebug_logme + = "RAM:debug.log"; + +53 * + gdebug_logme + = "debug_log.txt"; + +55 +FILE + * + gdebug_logfe + = +NULL +; + +58  + sdisf + + +60 * + mme +; + +61  + mamode +; + +64  + sasmf + + +66 * + mme +; + +67  + mimp +, + mimm +, + mzp +, + mzpx +, + mzpy +, + mabs +, + mabx +, + maby +, + mzix +, + mziy +, + ml +, + md +; + +70  + sick + + +72  + mx +, + my +, + mtime +; + +75  +ick + + gick +[2]; + +77  +xtze + * +tz +[]; + +78  +vtmp +[]; + +79  +th +[], +fmp +[]; + +80 +SDL_bo + +eshus +; + +82  + gdimp +[128]; + +83  + gdiddrs +[10]; + +84  + gibuf +[128], + gϡcmd +; + +85  + ghiy +[10][128]; + +86  + g +, + goff +=0, + gcursx +, + ghiu +=0, + ghip +=-1; + +87  + gm_addr +, + gm_asmmode + = +SDL_FALSE +; + +88  +SDL_bo + + gkshied + = +SDL_FALSE +, + gupdvw + = SDL_FALSE; + +89  + ghpcou +=0; + +91  +symbޏb + + gdeusyms +; + +93  + gm_bpmsg +[80]; + +95  +SDL_bo + + gmw_l + = +SDL_FALSE +; + +96  + gmw_which + = 0; + +97  + gmw_addr +[2]; + +98  + gmw_mode +=0, + gmw_koffs +=0; + +99  + gmw_ibuf +[8]; + +100  + gmwch_d +[65536]; + +101  +SDL_bo + + gmwch_dvid + = +SDL_FALSE +; + +102  +m6502 + + gu_d +; + +103  + gvid_d +, + games_d +; + +104  +SDL_bo + + gu_dvid + = +SDL_FALSE +; + +105  +ay8912 + + gay_d +; + +106  +SDL_bo + + gay_dvid + = +SDL_FALSE +; + +107  +v + + gv_d +; + +108  +SDL_bo + + gv_dvid + = +SDL_FALSE +; + +109  +v + + gv2_d +; + +110  +SDL_bo + + gv2_dvid + = +SDL_FALSE +; + +111  +SDL_bo + + gmodifd + = +SDL_FALSE +; + +114  +msym + + gdefsym_ +[] = { { 0x0300, 0, "VIA_IORB" , "VIA_IORB" , "VIA_IORB" }, + +159  +msym + + gdefsym_mos +[] = { { 0x0300, 0, "VIA_IORB" , "VIA_IORB" , "VIA_IORB" }, + +175 { 0xc000, +SYMF_ROMDIS0 +, "ROMStart" , "ROMStart" , "ROMStart" }, + +176 { 0xc000, +SYMF_ROMDIS1 +, "Overlay" , "Overlay" , "Overlay" } }; + +180 + mMSHOW_VIA +=0, + +181 + mMSHOW_VIA2 +, + +182 + mMSHOW_AY +, + +183 + mMSHOW_DISK +, + +184 + mMSHOW_LAST + + +189 + mCSHOW_CONSOLE +=0, + +190 + mCSHOW_DEBUG +, + +191 + mCSHOW_MWATCH +, + +192 + mCSHOW_LAST + + +195  + gmshow +, + gcshow +; + +199 + mREG_A +=0, + +200 + mREG_X +, + +201 + mREG_Y +, + +202 + mREG_PC +, + +203 + mREG_SP +, + +204 + mREG_VIA_PCR +, + +205 + mREG_VIA_ACR +, + +206 + mREG_VIA_SR +, + +207 + mREG_VIA_IFR +, + +208 + mREG_VIA_IER +, + +209 + mREG_VIA_IRA +, + +210 + mREG_VIA_ORA +, + +211 + mREG_VIA_DDRA +, + +212 + mREG_VIA_IRB +, + +213 + mREG_VIA_ORB +, + +214 + mREG_VIA_DDRB +, + +215 + mREG_VIA_T1L +, + +216 + mREG_VIA_T1C +, + +217 + mREG_VIA_T2L +, + +218 + mREG_VIA_T2C +, + +219 + mREG_VIA_CA1 +, + +220 + mREG_VIA_CA2 +, + +221 + mREG_VIA_CB1 +, + +222 + mREG_VIA_CB2 + + +227 + mAM_IMP +=0, + +228 + mAM_IMM +, + +229 + mAM_ZP +, + +230 + mAM_ZPX +, + +231 + mAM_ZPY +, + +232 + mAM_ABS +, + +233 + mAM_ABX +, + +234 + mAM_ABY +, + +235 + mAM_ZIX +, + +236 + mAM_ZIY +, + +237 + mAM_REL +, + +238 + mAM_IND + + +241  + #AMF_IMP + (1<< +AM_IMP +) + + ) + +242  + #AMF_IMM + (1<< +AM_IMM +) + + ) + +243  + #AMF_ZP + (1<< +AM_ZP +) + + ) + +244  + #AMF_ZPX + (1<< +AM_ZPX +) + + ) + +245  + #AMF_ZPY + (1<< +AM_ZPY +) + + ) + +246  + #AMF_ABS + (1<< +AM_ABS +) + + ) + +247  + #AMF_ABX + (1<< +AM_ABX +) + + ) + +248  + #AMF_ABY + (1<< +AM_ABY +) + + ) + +249  + #AMF_ZIX + (1<< +AM_ZIX +) + + ) + +250  + #AMF_ZIY + (1<< +AM_ZIY +) + + ) + +251  + #AMF_REL + (1<< +AM_REL +) + + ) + +252  + #AMF_IND + (1<< +AM_IND +) + + ) + +255  +asmf + + gasmb +[] = { { "BRK", 0x00, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, + +336 { +NULL +, } }; + +338  +disf + + gdiab +[] = { { "BRK", +AM_IMM + }, + +339 { "ORA", +AM_ZIX + }, + +340 { "JAM", +AM_IMP + }, + +341 { "SLO", +AM_ZIX + }, + +342 { "DOP", +AM_ZP + }, + +343 { "ORA", +AM_ZP + }, + +344 { "ASL", +AM_ZP + }, + +345 { "SLO", +AM_ZP + }, + +346 { "PHP", +AM_IMP + }, + +347 { "ORA", +AM_IMM + }, + +348 { "ASL", +AM_IMP + }, + +349 { "ANC", +AM_IMM + }, + +350 { "TOP", +AM_IMP + }, + +351 { "ORA", +AM_ABS + }, + +352 { "ASL", +AM_ABS + }, + +353 { "SLO", +AM_ABS + }, + +354 { "BPL", +AM_REL + }, + +355 { "ORA", +AM_ZIY + }, + +356 { "JAM", +AM_IMP + }, + +357 { "SLO", +AM_ZIY + }, + +358 { "DOP", +AM_ZPX + }, + +359 { "ORA", +AM_ZPX + }, + +360 { "ASL", +AM_ZPX + }, + +361 { "SLO", +AM_ZPX + }, + +362 { "CLC", +AM_IMP + }, + +363 { "ORA", +AM_ABY + }, + +364 { "NOP", +AM_IMP + }, + +365 { "SLO", +AM_ABY + }, + +366 { "TOP", +AM_ABX + }, + +367 { "ORA", +AM_ABX + }, + +368 { "ASL", +AM_ABX + }, + +369 { "SLO", +AM_IMP + }, + +370 { "JSR", +AM_ABS + }, + +371 { "AND", +AM_ZIX + }, + +372 { "JAM", +AM_IMP + }, + +373 { "RLA", +AM_ZIX + }, + +374 { "BIT", +AM_ZP + }, + +375 { "AND", +AM_ZP + }, + +376 { "ROL", +AM_ZP + }, + +377 { "RLA", +AM_ZP + }, + +378 { "PLP", +AM_IMP + }, + +379 { "AND", +AM_IMM + }, + +380 { "ROL", +AM_IMP + }, + +381 { "ANC", +AM_IMP + }, + +382 { "BIT", +AM_ABS + }, + +383 { "AND", +AM_ABS + }, + +384 { "ROL", +AM_ABS + }, + +385 { "RLA", +AM_ABS + }, + +386 { "BMI", +AM_REL + }, + +387 { "AND", +AM_ZIY + }, + +388 { "JAM", +AM_IMP + }, + +389 { "RLA", +AM_ZIY + }, + +390 { "DOP", +AM_ZPX + }, + +391 { "AND", +AM_ZPX + }, + +392 { "ROL", +AM_ZPX + }, + +393 { "RLA", +AM_ZPX + }, + +394 { "SEC", +AM_IMP + }, + +395 { "AND", +AM_ABY + }, + +396 { "NOP", +AM_IMP + }, + +397 { "RLA", +AM_ABY + }, + +398 { "TOP", +AM_ABX + }, + +399 { "AND", +AM_ABX + }, + +400 { "ROL", +AM_ABX + }, + +401 { "RLA", +AM_ABX + }, + +402 { "RTI", +AM_IMP + }, + +403 { "EOR", +AM_ZIX + }, + +404 { "JAM", +AM_IMP + }, + +405 { "SRE", +AM_ZIX + }, + +406 { "DOP", +AM_ZP + }, + +407 { "EOR", +AM_ZP + }, + +408 { "LSR", +AM_ZP + }, + +409 { "SRE", +AM_ZP + }, + +410 { "PHA", +AM_IMP + }, + +411 { "EOR", +AM_IMM + }, + +412 { "LSR", +AM_IMP + }, + +413 { "ALR", +AM_IMM + }, + +414 { "JMP", +AM_ABS + }, + +415 { "EOR", +AM_ABS + }, + +416 { "LSR", +AM_ABS + }, + +417 { "SRE", +AM_ABS + }, + +418 { "BVC", +AM_REL + }, + +419 { "EOR", +AM_ZIY + }, + +420 { "JAM", +AM_IMP + }, + +421 { "SRE", +AM_ZIY + }, + +422 { "DOP", +AM_ZPX + }, + +423 { "EOR", +AM_ZPX + }, + +424 { "LSR", +AM_ZPX + }, + +425 { "SRE", +AM_ZPX + }, + +426 { "CLI", +AM_IMP + }, + +427 { "EOR", +AM_ABY + }, + +428 { "NOP", +AM_IMP + }, + +429 { "SRE", +AM_ABY + }, + +430 { "TOP", +AM_ABX + }, + +431 { "EOR", +AM_ABX + }, + +432 { "LSR", +AM_ABX + }, + +433 { "SRE", +AM_ABX + }, + +434 { "RTS", +AM_IMP + }, + +435 { "ADC", +AM_ZIX + }, + +436 { "JAM", +AM_IMP + }, + +437 { "RRA", +AM_ZIX + }, + +438 { "DOP", +AM_IMP + }, + +439 { "ADC", +AM_ZP + }, + +440 { "ROR", +AM_ZP + }, + +441 { "RRA", +AM_ZP + }, + +442 { "PLA", +AM_IMP + }, + +443 { "ADC", +AM_IMM + }, + +444 { "ROR", +AM_IMP + }, + +445 { "ARR", +AM_IMM + }, + +446 { "JMP", +AM_IND + }, + +447 { "ADC", +AM_ABS + }, + +448 { "ROR", +AM_ABS + }, + +449 { "RRA", +AM_ABS + }, + +450 { "BVS", +AM_REL + }, + +451 { "ADC", +AM_ZIY + }, + +452 { "JAM", +AM_IMP + }, + +453 { "RRA", +AM_ZIY + }, + +454 { "DOP", +AM_ZPX + }, + +455 { "ADC", +AM_ZPX + }, + +456 { "ROR", +AM_ZPX + }, + +457 { "RRA", +AM_ZPX + }, + +458 { "SEI", +AM_IMP + }, + +459 { "ADC", +AM_ABY + }, + +460 { "NOP", +AM_IMP + }, + +461 { "RRA", +AM_ABY + }, + +462 { "TOP", +AM_ABX + }, + +463 { "ADC", +AM_ABX + }, + +464 { "ROR", +AM_ABX + }, + +465 { "RRA", +AM_ABX + }, + +466 { "DOP", +AM_IMM + }, + +467 { "STA", +AM_ZIX + }, + +468 { "DOP", +AM_IMM + }, + +469 { "SAX", +AM_ZIX + }, + +470 { "STY", +AM_ZP + }, + +471 { "STA", +AM_ZP + }, + +472 { "STX", +AM_ZP + }, + +473 { "SAX", +AM_ZP + }, + +474 { "DEY", +AM_IMP + }, + +475 { "DOP", +AM_IMM + }, + +476 { "TXA", +AM_IMP + }, + +477 { "XAA", +AM_IMM + }, + +478 { "STY", +AM_ABS + }, + +479 { "STA", +AM_ABS + }, + +480 { "STX", +AM_ABS + }, + +481 { "SAX", +AM_ABS + }, + +482 { "BCC", +AM_REL + }, + +483 { "STA", +AM_ZIY + }, + +484 { "JAM", +AM_IMP + }, + +485 { "AHX", +AM_ZIY + }, + +486 { "STY", +AM_ZPX + }, + +487 { "STA", +AM_ZPX + }, + +488 { "STX", +AM_ZPY + }, + +489 { "SAX", +AM_ZPY + }, + +490 { "TYA", +AM_IMP + }, + +491 { "STA", +AM_ABY + }, + +492 { "TXS", +AM_IMP + }, + +493 { "TAS", +AM_IMM + }, + +494 { "SHY", +AM_ABY + }, + +495 { "STA", +AM_ABX + }, + +496 { "SHX", +AM_ABX + }, + +497 { "AHX", +AM_ABY + }, + +498 { "LDY", +AM_IMM + }, + +499 { "LDA", +AM_ZIX + }, + +500 { "LDX", +AM_IMM + }, + +501 { "LAX", +AM_ZIX + }, + +502 { "LDY", +AM_ZP + }, + +503 { "LDA", +AM_ZP + }, + +504 { "LDX", +AM_ZP + }, + +505 { "LAX", +AM_ZP + }, + +506 { "TAY", +AM_IMP + }, + +507 { "LDA", +AM_IMM + }, + +508 { "TAX", +AM_IMP + }, + +509 { "LAX", +AM_IMM + }, + +510 { "LDY", +AM_ABS + }, + +511 { "LDA", +AM_ABS + }, + +512 { "LDX", +AM_ABS + }, + +513 { "LAX", +AM_ABS + }, + +514 { "BCS", +AM_REL + }, + +515 { "LDA", +AM_ZIY + }, + +516 { "JAM", +AM_IMP + }, + +517 { "LAX", +AM_ZIY + }, + +518 { "LDY", +AM_ZPX + }, + +519 { "LDA", +AM_ZPX + }, + +520 { "LDX", +AM_ZPY + }, + +521 { "LAX", +AM_ZPY + }, + +522 { "CLV", +AM_IMP + }, + +523 { "LDA", +AM_ABY + }, + +524 { "TSX", +AM_IMP + }, + +525 { "LAS", +AM_IMP + }, + +526 { "LDY", +AM_ABX + }, + +527 { "LDA", +AM_ABX + }, + +528 { "LDX", +AM_ABY + }, + +529 { "LAX", +AM_ABY + }, + +530 { "CPY", +AM_IMM + }, + +531 { "CMP", +AM_ZIX + }, + +532 { "DOP", +AM_IMP + }, + +533 { "DCP", +AM_ZIX + }, + +534 { "CPY", +AM_ZP + }, + +535 { "CMP", +AM_ZP + }, + +536 { "DEC", +AM_ZP + }, + +537 { "DCP", +AM_ZP + }, + +538 { "INY", +AM_IMP + }, + +539 { "CMP", +AM_IMM + }, + +540 { "DEX", +AM_IMP + }, + +541 { "AXS", +AM_IMM + }, + +542 { "CPY", +AM_ABS + }, + +543 { "CMP", +AM_ABS + }, + +544 { "DEC", +AM_ABS + }, + +545 { "DCP", +AM_ABS + }, + +546 { "BNE", +AM_REL + }, + +547 { "CMP", +AM_ZIY + }, + +548 { "JAM", +AM_IMP + }, + +549 { "DCP", +AM_ZIY + }, + +550 { "DOP", +AM_ZPX + }, + +551 { "CMP", +AM_ZPX + }, + +552 { "DEC", +AM_ZPX + }, + +553 { "DCP", +AM_ZPX + }, + +554 { "CLD", +AM_IMP + }, + +555 { "CMP", +AM_ABY + }, + +556 { "NOP", +AM_IMP + }, + +557 { "DCP", +AM_ABY + }, + +558 { "TOP", +AM_ABX + }, + +559 { "CMP", +AM_ABX + }, + +560 { "DEC", +AM_ABX + }, + +561 { "DCP", +AM_ABX + }, + +562 { "CPX", +AM_IMM + }, + +563 { "SBC", +AM_ZIX + }, + +564 { "DOP", +AM_IMM + }, + +565 { "ISC", +AM_ZIX + }, + +566 { "CPX", +AM_ZP + }, + +567 { "SBC", +AM_ZP + }, + +568 { "INC", +AM_ZP + }, + +569 { "ISC", +AM_ZP + }, + +570 { "INX", +AM_IMP + }, + +571 { "SBC", +AM_IMM + }, + +572 { "NOP", +AM_IMP + }, + +573 { "SBC", +AM_IMM + }, + +574 { "CPX", +AM_ABS + }, + +575 { "SBC", +AM_ABS + }, + +576 { "INC", +AM_ABS + }, + +577 { "ISC", +AM_ABS + }, + +578 { "BEQ", +AM_REL + }, + +579 { "SBC", +AM_ZIY + }, + +580 { "JAM", +AM_IMP + }, + +581 { "ISC", +AM_ZIY + }, + +582 { "DOP", +AM_ZPX + }, + +583 { "SBC", +AM_ZPX + }, + +584 { "INC", +AM_ZPX + }, + +585 { "ISC", +AM_ZPX + }, + +586 { "SED", +AM_IMP + }, + +587 { "SBC", +AM_ABY + }, + +588 { "NOP", +AM_IMP + }, + +589 { "ISC", +AM_ABY + }, + +590 { "TOP", +AM_ABX + }, + +591 { "SBC", +AM_ABX + }, + +592 { "INC", +AM_ABX + }, + +593 { "ISC", +AM_ABX + } }; + +595 +SDL_bo + + $isws + +c + ) + +597 if +c + =9 ) || ( c =32 ) )  +SDL_TRUE +; + +598  +SDL_FALSE +; + +599 + } +} + +601 +SDL_bo + + $isb + +c + ) + +603 if +c + >'0' ) && ( c <'1' ) )  +SDL_TRUE +; + +604  +SDL_FALSE +; + +605 + } +} + +607 +SDL_bo + + $ium + +c + ) + +609 if +c + >'0' ) && ( c <'9' ) )  +SDL_TRUE +; + +610  +SDL_FALSE +; + +611 + } +} + +613 +SDL_bo + + $ishex + +c + ) + +615 if + `ium + +c + ) )  +SDL_TRUE +; + +616 if +c + >'a' ) && ( c <'f' ) )  +SDL_TRUE +; + +617 if +c + >'A' ) && ( c <'F' ) )  +SDL_TRUE +; + +618  +SDL_FALSE +; + +619 + } +} + +621 +SDL_bo + + $ih + +c + ) + +623 if +c + >'a' ) && ( c <'z' ) )  +SDL_TRUE +; + +624 if +c + >'A' ) && ( c <'Z' ) )  +SDL_TRUE +; + +625  +SDL_FALSE +; + +626 + } +} + +628 +SDL_bo + + $issymt + +c + ) + +630 if + `ih + +c + ) )  +SDL_TRUE +; + +631 if +c + ='_' )  +SDL_TRUE +; + +632  +SDL_FALSE +; + +633 + } +} + +635 +SDL_bo + + $issymch + +c + ) + +637 if + `issymt + +c + ) )  +SDL_TRUE +; + +638 if + `ium + +c + ) )  +SDL_TRUE +; + +639  +SDL_FALSE +; + +640 + } +} + +642  + $hex + +c + ) + +644 if + `ium + +c + ) )  c-'0'; + +645 if +c + >= 'a' ) && ( c <= 'f' ) )  c-('a'-10); + +646 if +c + >= 'A' ) && ( c <= 'F' ) )  c-('A'-10); + +648 + } +} + +650  + $bp_ + +mache + * +ic +,  +addr +, * +xbp +, * +mbp + ) + +652  +bpmask + = 0, +i +; + +654 if +xbp + ) *xbp = -1; + +655 if +mbp + ) *mbp = -1; + +657 +ic +-> +u +. +ybp + = +SDL_FALSE +; + +658  +i +=0; i<16; i++ ) + +660 if +ic +-> +u +. +bakpots +[ +i +] != -1 ) + +662 +ic +-> +u +. +ybp + = +SDL_TRUE +; + +663 if +addr + = +ic +-> +u +. +bakpots +[ +i +] ) + +665 +bpmask + |= 8; + +666 if +xbp + ) *xb +i +; + +672 +ic +-> +u +. +ymbp + = +SDL_FALSE +; + +673  +i +=0; i<16; i++ ) + +675 if +ic +-> +u +. +membakpots +[ +i +]. +ags + ) + +677 +ic +-> +u +. +ymbp + = +SDL_TRUE +; + +678 if +ic +-> +u +. +membakpots +[ +i +]. +addr + ==ddr ) + +680 +bpmask + | +ic +-> +u +. +membakpots +[ +i +]. +ags +; + +681 if +mbp + ) *mb +i +; + +687  +bpmask +; + +688 + } +} + +691  + $m_ad + +mache + * +ic +,  +addr + ) + +694 if +ic +-> +drivy + = +DRV_MICRODISC + ) + +696  +addr + ) + +699  +ic +-> +wddisk +. +r_us +; + +702  +ic +-> +wddisk +. +r_ack +; + +705  +ic +-> +wddisk +. +r_ +; + +708  +ic +-> +wddisk +. +r_da +; + +711  +ic +-> +md +. +q +|0x7f; + +714  +ic +-> +md +. +drq +|0x7f; + +718 if +ic +-> +drivy + = +DRV_PRAVETZ + ) + +720 i0x300 < +addr + ) && (ddr <= 0x30f ) ) + +722  + `v_m_ad +& +ic +-> +v +, +addr + ); + +724 i0x310 < +addr + ) && (ddr <= 0x31f ) ) + +728  +ic +-> +u +. + `ad +&ic->u, +addr + ); + +731 if +addr + & 0xff00 ) == 0x0300 ) + +733 i! +ic +-> +ligh + ) || ( +addr + < 0x3e0 ) || (ddr > 0x3e1 ) ) + +735  + `v_m_ad +& +ic +-> +v +, +addr + ); + +739  +ic +-> +u +. + `ad +&ic->u, +addr + ); + +740 + } +} + +742  + $m_e_e + +mache + * +ic + ) + +744  +k +; + +746  +k +=0; k<65536; k++ ) + +748 if + `iam + +ic +, +k + ) ) + +749 +mwch_d +[ +k +] = + `m_ad + +ic +, k ); + +751 +mwch_dvid + = +SDL_TRUE +; + +753 +u_d + = +ic +-> +u +; + +754 +vid_d + = +ic +-> +vid_ +; + +755 +ames_d + = +ic +-> +ames +; + +756 +u_dvid + = +SDL_TRUE +; + +758 +ay_d + = +ic +-> +ay +; + +759 +ay_dvid + = +SDL_TRUE +; + +761 +v_d + = +ic +-> +v +; + +762 +v_dvid + = +SDL_TRUE +; + +764 +v2_d + = +ic +-> +_v +; + +765 +v2_dvid + = +SDL_TRUE +; + +766 + } +} + +768  + $m_t_modifd + +mache + * +ic + ) + +770 if +modifd + ) ; + +772 +modifd + = +SDL_TRUE +; + +773 + `m_e_e + +ic + ); + +774 + } +} + +776  + $dbg_sl +( ) + +778  +x +, +y +, +s +, +d +; + +779  +xtze + * +z + = +tz +[ +TZ_DEBUG +]; + +781 +s + = +z +-> +w +*2+1; + +782 +d + = +z +-> +w ++1; + +783  +y +=0; y<18; y++ ) + +785  +x +=0; x<48; x++ ) + +787 +z +-> +tx +[ +d +] =tz->tx[ +s +]; + +788 +z +-> +fc +[ +d +] =tz->fc[ +s +]; + +789 +z +-> +bc +[ +d +++] =tz->bc[ +s +++]; + +791 +d + += 2; + +792 +s + += 2; + +795  +x +=0; x<48; x++ ) + +797 +z +-> +tx +[ +d +] = ' '; + +798 +z +-> +fc +[ +d +] = 2; + +799 +z +-> +bc +[ +d +++] = 3; + +801 + } +} + +803  + $dbg_tf +* +fmt +, ... ) + +805 +va_li + + +; + +807 + `dbg_sl +(); + +809 + `va_t + + +, +fmt + ); + +810 if + `vtf + +vtmp +, +VSPTMPSIZE +, +fmt +, + + ) != -1 ) + +812 +vtmp +[ +VSPTMPSIZE +-1] = 0; + +813 #i +LOG_DEBUG + + +814 if +debug_logfe + ) + +816 + `rtf + +debug_logfe +, "%s\n", +vtmp + ); + +817 + `fush + +debug_logfe + ); + +820 +vtmp +[48] = 0; + +821 + `tzos + +tz +[ +TZ_DEBUG +], 1, 19, +vtmp + ); + +823 + `va_d + + + ); + +824 + } +} + +826  +msym + * + $m_b_fd_sym_by_addr + +symbޏb + * +ab +,  +mache + * +ic +,  +addr +, +SDL_bo + * +ovride_romdis + ) + +828  +i +, +j +, +k +; + +829 +SDL_bo + +romdis +; + +831 +romdis + = +ic +->romdis; + +832 if +ic +-> +drivy + = +DRV_JASMIN + ) && ( oric-> +jasm +. +ay + ) ) + +833 +romdis + = +SDL_FALSE +; + +835 i( +ovride_romdis +) + +836 +romdis + = * +ovride_romdis +; + +838  +i +=0; i< +ab +-> +numsyms +; i++ ) + +840 if +ic +-> +ty + = +MACH_TELESTRAT + ) + +842 if +ab +-> +syms +[ +i +]. +addr + >= 0xc000 ) + +844  +j +=0, +k += +SYMF_TELEBANK0 +; j<8; j++, k<<=1 ) + +846 if(( +ab +-> +syms +[ +i +]. +ags +& +k +)==0&& ( +ic +-> +_cubk + = +j + ) ) + +850 if +j + != 8 ) ; + +853 if +ab +-> +syms +[ +i +]. +ags +& +SYMF_MICRODISC + ) + +855 if +ic +-> +drivy + ! +DRV_MICRODISC + ) || ( !ic-> +md +. +diskrom + ) ) + +859 if( +ab +-> +syms +[ +i +]. +ags +& +SYMF_JASMIN +&& ( +ic +-> +drivy + ! +DRV_JASMIN + ) ) + +862 if +romdis + ) + +864 if( +ab +-> +syms +[ +i +]. +ags +& +SYMF_ROMDIS0 +) != 0 ) + +867 if( +ab +-> +syms +[ +i +]. +ags +& +SYMF_ROMDIS1 +) != 0 ) + +872 if +addr + = +ab +-> +syms +[ +i +].addr ) + +873  & +ab +-> +syms +[ +i +]; + +876  +NULL +; + +877 + } +} + +879  +msym + * + $m_b_fd_sym_by_me + +symbޏb + * +ab +,  +mache + * +ic +, * +me +, * +symnum + ) + +881  +i +, +j +, +k +, +romdis +; + +883 +romdis + = +ic +->romdis; + +884 if +ic +-> +drivy + = +DRV_JASMIN + ) && ( oric-> +jasm +. +ay + ) ) + +885 +romdis + = 1; + +887  +i +=0; i< +ab +-> +numsyms +; i++ ) + +889 if +ic +-> +ty + = +MACH_TELESTRAT + ) + +891 if +ab +-> +syms +[ +i +]. +addr + >= 0xc000 ) + +893  +j +=0, +k += +SYMF_TELEBANK0 +; j<8; j++, k<<=1 ) + +895 if(( +ab +-> +syms +[ +i +]. +ags +& +k +)==0&& ( +ic +-> +_cubk + = +j + ) ) + +899 if +j + != 8 ) ; + +902 if +ab +-> +syms +[ +i +]. +ags +& +SYMF_MICRODISC + ) + +904 if +ic +-> +drivy + ! +DRV_MICRODISC + ) || ( !ic-> +md +. +diskrom + ) ) + +908 if( +ab +-> +syms +[ +i +]. +ags +& +SYMF_JASMIN +&& ( +ic +-> +drivy + ! +DRV_JASMIN + ) ) + +911 if +romdis + ) + +913 if( +ab +-> +syms +[ +i +]. +ags +& +SYMF_ROMDIS0 +) != 0 ) + +916 if( +ab +-> +syms +[ +i +]. +ags +& +SYMF_ROMDIS1 +) != 0 ) + +921 if! +ic +-> +symbs + ) + +923 if + `rcmp + +me +, +ab +-> +syms +[ +i +].name ) == 0 ) + +925 if +symnum + ) (*symnum +i +; + +926  & +ab +-> +syms +[ +i +]; + +929 if + `rcmp + +me +, +ab +-> +syms +[ +i +].name ) == 0 ) + +931 if +symnum + ) (*symnum +i +; + +932  & +ab +-> +syms +[ +i +]; + +937 if +symnum + ) (*symnum) = -1; + +938  +NULL +; + +939 + } +} + +941  +msym + * + $m_fd_sym_by_addr + +mache + * +ic +,  +addr +, +SDL_bo + * +ovride_romdis + ) + +943  +msym + * +t +; + +945 +t + = + `m_b_fd_sym_by_addr +& +ic +-> +ursyms +, oric, +addr +, +ovride_romdis + ); + +946 if! +t + ) = + `m_b_fd_sym_by_addr +& +ic +-> +romsyms +, oric, +addr +, +ovride_romdis + ); + +947 if! +t + ) && ( +ic +-> +ty + = +MACH_TELESTRAT + ) ) = + `m_b_fd_sym_by_addr +&ic-> +_bksyms +[ic-> +_cubk +], oric, +addr +, +ovride_romdis + ); + +948 if! +t + ) && ( +ic +-> +disksyms + ) ) = + `m_b_fd_sym_by_addr +ic->disksyms, oric, +addr +, +ovride_romdis + ); + +949 if +t + ) et; + +951  + `m_b_fd_sym_by_addr +& +deusyms +, +ic +, +addr +, +ovride_romdis + ); + +952 + } +} + +954  +msym + * + $m_fd_sym_by_me + +mache + * +ic +, * +me + ) + +956  +msym + * +t +; + +958 +t + = + `m_b_fd_sym_by_me +& +ic +-> +ursyms +, oric, +me +, +NULL + ); + +959 if! +t + ) = + `m_b_fd_sym_by_me +& +ic +-> +romsyms +, oric, +me +, +NULL + ); + +960 if! +t + ) && ( +ic +-> +ty + = +MACH_TELESTRAT + ) ) = + `m_b_fd_sym_by_me +&ic-> +_bksyms +[ic-> +_cubk +], oric, +me +, +NULL + ); + +961 if! +t + ) && ( +ic +-> +disksyms + ) ) = + `m_b_fd_sym_by_me +ic->disksyms, oric, +me +, +NULL + ); + +962 if +t + ) et; + +964  + `m_b_fd_sym_by_me +& +deusyms +, +ic +, +me +, +NULL + ); + +965 + } +} + +967 +SDL_bo + + $m_addsym + +symbޏb + * +ab +,  +addr +,  +ags +, * +me +,  +msym + ** +symr + ) + +969  +i +; + +971 if +symr + ) (*symr +NULL +; + +974 if +ab +-> +syma + =-1 )  +SDL_FALSE +; + +976 if! +ab +-> +syms + ) || ( sb-> +syma + < (ab-> +numsyms ++1) ) ) + +978  +msym + * +wbuf +; + +980 +wbuf + = + `mloc + +msym + ) * ( +ab +-> +syma ++64) ); + +981 if! +wbuf + )  +SDL_FALSE +; + +983 if +ab +-> +syms + ) && ( sb-> +numsyms + > 0 ) ) + +984 + `memy + +wbuf +, +ab +-> +syms +,  +msym + ) * sb-> +numsyms + ); + +986 + ` + +ab +-> +syms + ); + +987 +ab +-> +syms + = +wbuf +; + +988 +ab +-> +syma + += 64; + +990  +i += +ab +-> +numsyms +; i +syma +; i++ ) + +991 +ab +-> +syms +[ +i +]. +me + = +NULL +; + +994 if! +ab +-> +syms +[ab-> +numsyms +]. +me + ) + +996 +ab +-> +syms +[ab-> +numsyms +]. +me + = + `mloc +( 128 ); + +997 if! +ab +-> +syms +[ab-> +numsyms +]. +me + )  +SDL_FALSE +; + +1000 +ab +-> +syms +[ab-> +numsyms +]. +addr + =ddr; + +1001 +ab +-> +syms +[ab-> +numsyms +]. +ags + = flags; + +1002 + `y + +ab +-> +syms +[ab-> +numsyms +]. +me +,ame, 128 ); + +1003 +ab +-> +syms +[ab-> +numsyms +]. +me +[127] = 0; + +1005 if + ` + +me + ) > +SNAME_LEN + ) + +1007 + `y + +ab +-> +syms +[ab-> +numsyms +]. +ame +, +me +, ( +SNAME_LEN +-1) ); + +1008 +ab +-> +syms +[ab-> +numsyms +]. +ame +[ +SNAME_LEN +-1] = 22; + +1009 +ab +-> +syms +[ab-> +numsyms +]. +ame +[ +SNAME_LEN +] = 0; + +1011 + `ry + +ab +-> +syms +[ab-> +numsyms +]. +ame +, +me + ); + +1014 if + ` + +me + ) > +SSNAME_LEN + ) + +1016 + `y + +ab +-> +syms +[ab-> +numsyms +]. +same +, +me +, ( +SSNAME_LEN +-1) ); + +1017 +ab +-> +syms +[ab-> +numsyms +]. +same +[ +SSNAME_LEN +-1] = 22; + +1018 +ab +-> +syms +[ab-> +numsyms +]. +same +[ +SSNAME_LEN +] = 0; + +1020 + `ry + +ab +-> +syms +[ab-> +numsyms +]. +same +, +me + ); + +1023 if +symr + ) *(symr& +ab +-> +syms +[ab-> +numsyms +]; + +1025 +ab +-> +numsyms +++; + +1027  +SDL_TRUE +; + +1028 + } +} + +1030  + $m__symb + +symbޏb + * +ab + ) + +1032 +ab +-> +syms + = +NULL +; + +1033 +ab +-> +numsyms + = 0; + +1034 +ab +-> +syma + = 0; + +1035 + } +} + +1037  + $m_syms + +symbޏb + * +ab + ) + +1040 if +ab +-> +syma + == -1 ) ; + +1041 i( +ab +-> +syms +) + +1043  +i +; + +1044  +i + = 0; i < +ab +-> +numsyms +; i++) + +1046 + ` +( +ab +-> +syms +[ +i +]. +me +); + +1048 + ` +( +ab +-> +syms +); + +1050 +ab +-> +syms + = +NULL +; + +1051 +ab +-> +numsyms + = 0; + +1052 +ab +-> +syma + = 0; + +1053 + } +} + +1057 * + $m_dismb + +mache + * +ic +, * +ddr +, +SDL_bo + * +loed +, SDL_bo +femode + ) + +1059  +ddr +, +addr +; + +1060  + +, +a1 +, +a2 +; + +1061  +i +; + +1062 * +tmpame +, * +di +; + +1063  +ame +[ +SNAME_LEN ++1]; + +1064  +msym + * +csym +; + +1066 +di + = +dimp +; + +1068 +ddr + = * +ddr +; + +1069 if +loed + ) *loed = +SDL_FALSE +; + +1071 +tmpame + = ""; + +1072 if! +femode + ) + +1074 +csym + = + `m_fd_sym_by_addr + +ic +, +ddr +, +NULL + ); + +1075 if +csym + ) +tmpame + = csym-> +ame +; + +1077 +csym + = + `m_fd_sym_by_addr + +ic +, +ddr +, +NULL + ); + +1078 if +csym + ) + +1080 +tmpame + = +csym +-> +me +; + +1082 if + ` + +tmpame + ) > +SNAME_LEN + ) + +1084 + `rtf + +dimp +, "%s\n", +tmpame + ); + +1085 +di + = & +dimp +[ + ` +(distmp)]; + +1086 +tmpame + = ""; + +1091 + `ry + +ame +, +tmpame + ); + +1092  +i +=() + ` +( +ame +); i< +SNAME_LEN +; i++ ) + +1093 +ame +[ +i +] = 32; + +1094 +ame +[ +i +] = 0; + +1096 + + = + `m_ad + +ic +, (* +ddr +)++ ); + +1097  +diab +[ + +]. +amode + ) + +1099  +AM_IMP +: + +1100 + `rtf + +di +, "% %04X %02X %s", +ame +, +ddr +, + +, +diab +[]. +me + ); + +1103  +AM_IMM +: + +1104 +a1 + = + `m_ad + +ic +, (* +ddr +)++ ); + +1105 + `rtf + +di +, "% %04X %02X %02X %#$%02X", +ame +, +ddr +, + +, +a1 +, +diab +[]. +me +,1 ); + +1108  +AM_ZP +: + +1109  +AM_ZPX +: + +1110  +AM_ZPY +: + +1111 +a1 + = + `m_ad + +ic +, (* +ddr +)++ ); + +1112 +csym + = + `m_fd_sym_by_addr + +ic +, +a1 +, +NULL + ); + +1113 if +csym + ) + +1114 + `rtf + +di +, "% %04X %02X %02X %%s", +ame +, +ddr +, + +, +a1 +, +diab +[]. +me +, +femode + ? +csym +->name : csym->sname ); + +1116 + `rtf + +di +, "% %04X %02X %02X %$%02X", +ame +, +ddr +, + +, +a1 +, +diab +[]. +me +,1 ); + +1117 if +diab +[ + +]. +amode + = +AM_ZP + ) ; + +1118 + `rt + +di +, +diab +[ + +]. +amode + = +AM_ZPX + ? ",X" : ",Y" ); + +1121  +AM_ABS +: + +1122  +AM_ABX +: + +1123  +AM_ABY +: + +1124 +a1 + = + `m_ad + +ic +, (* +ddr +)++ ); + +1125 +a2 + = + `m_ad + +ic +, (* +ddr +)++ ); + +1126 +csym + = + `m_fd_sym_by_addr + +ic +, ( +a2 +<<8)| +a1 +, +NULL + ); + +1127 if +csym + ) + +1128 + `rtf + +di +, "% %04X %02X %02X %02X %%s", +ame +, +ddr +, + +, +a1 +, +a2 +, +diab +[]. +me +, +femode + ? +csym +->name : csym->sname ); + +1130 + `rtf + +di +, "% %04X %02X %02X %02X %$%02X%02X", +ame +, +ddr +, + +, +a1 +, +a2 +, +diab +[]. +me +,2,1 ); + +1131 if +diab +[ + +]. +amode + = +AM_ABS + ) ; + +1132 + `rt + +di +, +diab +[ + +]. +amode + = +AM_ABX + ? ",X" : ",Y" ); + +1135  +AM_ZIX +: + +1136 +a1 + = + `m_ad + +ic +, (* +ddr +)++ ); + +1137 +csym + = + `m_fd_sym_by_addr + +ic +, +a1 +, +NULL + ); + +1138 if +csym + ) + +1139 + `rtf + +di +, "% %04X %02X %02X %(%s,X)", +ame +, +ddr +, + +, +a1 +, +diab +[]. +me +, +femode + ? +csym +->m: csym-> +same + ); + +1141 + `rtf + +di +, "% %04X %02X %02X %($%02X,X)", +ame +, +ddr +, + +, +a1 +, +diab +[]. +me +,1 ); + +1144  +AM_ZIY +: + +1145 +a1 + = + `m_ad + +ic +, (* +ddr +)++ ); + +1146 +csym + = + `m_fd_sym_by_addr + +ic +, +a1 +, +NULL + ); + +1147 if +csym + ) + +1148 + `rtf + +di +, "% %04X %02X %02X %(%s),Y", +ame +, +ddr +, + +, +a1 +, +diab +[]. +me +, +femode + ? +csym +->m: csym-> +same + ); + +1150 + `rtf + +di +, "% %04X %02X %02X %($%02X),Y", +ame +, +ddr +, + +, +a1 +, +diab +[]. +me +,1 ); + +1153  +AM_REL +: + +1154 +a1 + = + `m_ad + +ic +, (* +ddr +)++ ); + +1155 +addr + = ((* +ddr +)+((sigd ) +a1 +))&0xffff; + +1156 +csym + = + `m_fd_sym_by_addr + +ic +, +addr +, +NULL + ); + +1157 if +csym + ) + +1158 + `rtf + +di +, "% %04X %02X %02X %%s", +ame +, +ddr +, + +, +a1 +, +diab +[]. +me +, +femode + ? +csym +->name : csym->sname ); + +1160 + `rtf + +di +, "% %04X %02X %02X %$%04X", +ame +, +ddr +, + +, +a1 +, +diab +[]. +me +, +addr + ); + +1163  +AM_IND +: + +1164 +a1 + = + `m_ad + +ic +, (* +ddr +)++ ); + +1165 +a2 + = + `m_ad + +ic +, (* +ddr +)++ ); + +1166 +csym + = + `m_fd_sym_by_addr + +ic +, ( +a2 +<<8)| +a1 +, +NULL + ); + +1167 if +csym + ) + +1168 + `rtf + +di +, "% %04X %02X %02X %02X %(%s)", +ame +, +ddr +, + +, +a1 +, +a2 +, +diab +[]. +me +, +femode + ? +csym +->name : csym->sname ); + +1170 + `rtf + +di +, "% %04X %02X %02X %02X %($%02X%02X)", +ame +, +ddr +, + +, +a1 +, +a2 +, +diab +[]. +me +,2,1 ); + +1174 + `ry + +di +, " WTF?" ); + +1178  +i +=() + ` +( +di +); i<47; i++ ) + +1179 +di +[ +i +] = 32; + +1180 +di +[ +i +] = 0; + +1182  + `bp_ + +ic +, +ddr +, +NULL +, NULL ) ) + +1184  +MBPF_READ +): +di +[ +SNAME_LEN ++1] = 'r'; ; + +1185  +MBPF_WRITE + ): +di +[ +SNAME_LEN ++1] = 'w'; ; + +1186  +MBPF_WRITE +| +MBPF_READ +): +di +[ +SNAME_LEN ++1] = 'a'; ; + +1187  +MBPF_CHANGE + ): +di +[ +SNAME_LEN ++1] = 'c'; ; + +1188  +MBPF_CHANGE + | +MBPF_READ +): +di +[ +SNAME_LEN ++1] = 'g'; ; + +1189  +MBPF_CHANGE +| +MBPF_WRITE + ): +di +[ +SNAME_LEN ++1] = 'm'; ; + +1190  +MBPF_CHANGE +| +MBPF_WRITE +| +MBPF_READ +): +di +[ +SNAME_LEN ++1] = '+'; ; + +1191 (8 ): +di +[ +SNAME_LEN ++1] = 'X'; ; + +1192 (8| +MBPF_READ +): +di +[ +SNAME_LEN ++1] = 'R'; ; + +1193 (8| +MBPF_WRITE + ): +di +[ +SNAME_LEN ++1] = 'W'; ; + +1194 (8| +MBPF_WRITE +| +MBPF_READ +): +di +[ +SNAME_LEN ++1] = 'A'; ; + +1195 (8| +MBPF_CHANGE + ): +di +[ +SNAME_LEN ++1] = 'C'; ; + +1196 (8| +MBPF_CHANGE + | +MBPF_READ +): +di +[ +SNAME_LEN ++1] = 'G'; ; + +1197 (8| +MBPF_CHANGE +| +MBPF_WRITE + ): +di +[ +SNAME_LEN ++1] = 'M'; ; + +1198 (8| +MBPF_CHANGE +| +MBPF_WRITE +| +MBPF_READ +): +di +[ +SNAME_LEN ++1] = '*'; ; + +1201 if +ddr + = +ic +-> +u +. +pc + ) + +1202 +di +[ +SNAME_LEN ++2] = '>'; + +1204 if +loed + ) && ( +ddr + > * +ddr + ) ) + +1205 * +loed + = +SDL_TRUE +; + +1207  +dimp +; + +1208 + } +} + +1210  + $m_gmod + +x +,  +y +,  +w + ) + +1212  +offs +, +i +; + +1214 +offs + = +y +* +tz +[ +TZ_REGS +]-> +w ++ +x +; + +1215  +i +=0; i< +w +; i++, +offs +++ ) + +1217 +tz +[ +TZ_REGS +]-> +fc +[ +offs +] = 1; + +1218 +tz +[ +TZ_REGS +]-> +bc +[ +offs +] = 8; + +1220 + } +} + +1222  + $m_upde_gs + +mache + * +ic + ) + +1224  +i +; + +1225  +addr +, +pc +; + +1226  +msym + * +csym +; + +1227  +mp +[48]; + +1229 +pc + = +ic +-> +u +.pc; + +1231 if +ic +-> +u +. +q + ) && ( oric->u. +f_i + == 0 ) ) + +1232 +pc + = ( + `m_ad + +ic +, 0xffff )<<8) | mon_read( oric, 0xfffe ); + +1234 + `tztos + +tz +[ +TZ_REGS +], 2, 2, "PC=%04X SP=01%02X A=%02X X=%02X Y=%02X LPC=%04X", + +1235 +pc +, + +1236 +ic +-> +u +. + +, + +1237 +ic +-> +u +. +a +, + +1238 +ic +-> +u +. +x +, + +1239 +ic +-> +u +. +y +, + +1240 +ic +-> +u +. +ϡpc + ); + +1242 +csym + = + `m_fd_sym_by_addr + +ic +, +pc +, +NULL + ); + +1243 if +csym + ) + +1245 if + ` + +csym +-> +me + ) > 46 ) + +1247 + `y + +mp +, +csym +-> +me +, 46 ); + +1248 +mp +[46] = 0; + +1250 + `ry + +mp +, +csym +-> +me + ); + +1252 + `tzos + +tz +[ +TZ_REGS +], 2, 3, +mp + ); + +1254 + `tztos + +tz +[ +TZ_REGS +], 2, 3, "%46s", " " ); + +1257 + `tztos + +tz +[ +TZ_REGS +], 2, 4, "CY=%09d", +ic +-> +u +. +cyes + ); + +1258 + `tztos + +tz +[ +TZ_REGS +], 2, 5, "FM=%06d RS=%03d", +ic +-> +ames +, oric-> +vid_ + ); + +1260 + `tzos + +tz +[ +TZ_REGS +], 35, 4, ( +ic +-> +u +. +q +& +IRQF_VIA +) ? "VIA" : " " ); + +1261 + `tzos + +tz +[ +TZ_REGS +], 35, 5, ( +ic +-> +u +. +q +& +IRQF_DISK +) ? "DISK" : " " ); + +1264 + `tzos + +tz +[ +TZ_REGS +], 20, 4, "NV-BDIZC" ); + +1265 + `tztos + +tz +[ +TZ_REGS +], 20, 5, "%01X%01X1%01X%01X%01X%01X%01X", + +1266 +ic +-> +u +. +f_n +, + +1267 +ic +-> +u +. +f_v +, + +1268 +ic +-> +u +. +f_b +, + +1269 +ic +-> +u +. +f_d +, + +1270 +ic +-> +u +. +f_i +, + +1271 +ic +-> +u +. +f_z +, + +1272 +ic +-> +u +. +f_c + ); + +1274 + `tztos + +tz +[ +TZ_REGS +], 30, 4, "NMI=%04X RST=%04X", + +1275 ( +ic +-> +u +. + `ad +( &oric->cpu, 0xfffb )<<8)|oric->cpu.read( &oric->cpu, 0xfffa ), + +1276 ( +ic +-> +u +. + `ad +( &oric->cpu, 0xfffd )<<8)|oric->cpu.read( &oric->cpu, 0xfffc ) ); + +1277 + `tztos + +tz +[ +TZ_REGS +], 30, 5, "IRQ=%04X", ( +ic +-> +u +. + `ad +( &oric->cpu, 0xffff )<<8)|oric->cpu.read( &oric->cpu, 0xfffe ) ); + +1280 +addr + = +pc +; + +1281  +i +=0; i<10; i++ ) + +1283 +diddrs +[ +i +] = +addr +; + +1284 + `tztc + +tz +[ +TZ_REGS +], ( +addr +== +pc +) ? 1 : 2, 3 ); + +1285 + `tzos + +tz +[ +TZ_REGS +], 23, 7+ +i +, " " ); + +1286 + `tzos + +tz +[ +TZ_REGS +], 2, 7+ +i +, + `m_dismb + +ic +, & +addr +, +NULL +, +SDL_FALSE + ) ); + +1289 if +u_dvid + ) + +1291 if +u_d +. +pc + !p + `m_gmod +( 5, 2, 4 ); + +1292 if +u_d +. + + ! +ic +-> +u +. ) + `m_gmod +( 14, 2, 4 ); + +1293 if +u_d +. +a + ! +ic +-> +u +. + `m_gmod +( 22, 2, 2 ); + +1294 if +u_d +. +x + ! +ic +-> +u +.x ) + `m_gmod +( 28, 2, 2 ); + +1295 if +u_d +. +y + ! +ic +-> +u +.y ) + `m_gmod +( 34, 2, 2 ); + +1296 if +u_d +. +cyes + ! +ic +-> +u +.cye + `m_gmod +( 5, 4, 9 ); + +1297 if +ames_d + ! +ic +-> +ames + ) + `m_gmod +( 5, 5, 6 ); + +1298 if +vid_d + ! +ic +-> +vid_ + ) + `m_gmod +( 15, 5, 3 ); + +1299 if +u_d +. +f_n + ! +ic +-> +u +.f_ + `m_gmod +( 20, 5, 1 ); + +1300 if +u_d +. +f_v + ! +ic +-> +u +.f_v ) + `m_gmod +( 21, 5, 1 ); + +1301 if +u_d +. +f_b + ! +ic +-> +u +.f_b ) + `m_gmod +( 23, 5, 1 ); + +1302 if +u_d +. +f_d + ! +ic +-> +u +.f_d ) + `m_gmod +( 24, 5, 1 ); + +1303 if +u_d +. +f_i + ! +ic +-> +u +.f_ + `m_gmod +( 25, 5, 1 ); + +1304 if +u_d +. +f_z + ! +ic +-> +u +.f_z ) + `m_gmod +( 26, 5, 1 ); + +1305 if +u_d +. +f_c + ! +ic +-> +u +.f_ + `m_gmod +( 27, 5, 1 ); + +1307 if( +u_d +. +q +& +IRQF_VIA +!( +ic +-> +u +.q&IRQF_VIA + `m_gmod +( 35, 4, 3 ); + +1308 if( +u_d +. +q +& +IRQF_DISK +!( +ic +-> +u +.q&IRQF_DISK + `m_gmod +( 35, 5, 4 ); + +1310 + } +} + +1312  + $m_ick_gs + +mache + * +ic +, +SDL_bo + * +ednd +,  +x +,  +y +, SDL_bo +dblk + ) + +1314  +cmdtmp +[32]; + +1316 if +dblk + ) && ( +y + == 5 ) ) + +1318  +x + ) + +1320 20: + `m_t_modifd + +ic + ); oric-> +u +. +f_n + ^1; * +ednd + = +SDL_TRUE +; ; + +1321 21: + `m_t_modifd + +ic + ); oric-> +u +. +f_v + ^1; * +ednd + = +SDL_TRUE +; ; + +1322 23: + `m_t_modifd + +ic + ); oric-> +u +. +f_b + ^1; * +ednd + = +SDL_TRUE +; ; + +1323 24: + `m_t_modifd + +ic + ); oric-> +u +. +f_d + ^1; * +ednd + = +SDL_TRUE +; ; + +1324 25: + `m_t_modifd + +ic + ); oric-> +u +. +f_i + ^1; * +ednd + = +SDL_TRUE +; ; + +1325 26: + `m_t_modifd + +ic + ); oric-> +u +. +f_z + ^1; * +ednd + = +SDL_TRUE +; ; + +1326 27: + `m_t_modifd + +ic + ); oric-> +u +. +f_c + ^1; * +ednd + = +SDL_TRUE +; ; + +1330 if +dblk + ) && ( +y + >= 7 ) && ( y < 17 ) ) + +1332  +i +; + +1334 if + `bp_ + +ic +, +diddrs +[ +y +-7], & +i +, +NULL + ) & 8 ) + +1336 + `rtf + +cmdtmp +, "b%d", +i + ); + +1337 + `m_do_cmd + +cmdtmp +, +ic +, +ednd + ); + +1338 * +ednd + = +SDL_TRUE +; + +1340 + `rtf + +cmdtmp +, "b$%04x", +diddrs +[ +y +-7] ); + +1341 + `m_do_cmd + +cmdtmp +, +ic +, +ednd + ); + +1342 * +ednd + = +SDL_TRUE +; + +1347 + } +} + +1349  + $m_vmod + +x +,  +y +,  +w +,  +xtze + * +vtz + ) + +1351  +offs +, +i +; + +1353 +offs + = +y +* +vtz +-> +w ++ +x +; + +1354  +i +=0; i< +w +; i++, +offs +++ ) + +1356 +vtz +-> +fc +[ +offs +] = 1; + +1357 +vtz +-> +bc +[ +offs +] = 8; + +1359 + } +} + +1361  + $m_upde_v + +mache + * +ic +,  +xtze + * +vtz +,  +v + * +v +, v * +d +, +SDL_bo + * +dvid + ) + +1363  +i +, +j +, +o +; + +1364  +v +; + +1365 * +mes +[] = { "IORB ", "IORAh", "DDRB ", "DDRA ", "T1CL ", "T1CH ", "T1LL ", "T1LH ", "T2CL ", "T2CH ", "SR ", "ACR ", "PCR ", "IFR ", "IER ", "IORA " }; + +1367  +i +=0; i<16; i++ ) + +1369 +v + = + `v_m_ad + +v +, v =& +ic +-> +v + ? 0x300+ +i + : 0x320+i ); + +1370 + `tztos + +vtz +, 2, +i ++1, "%04X: %$%02X %%", ( +v + =& +ic +-> +v +? 0x300+: 0x320+i, +mes +[i], +v + ); + +1371  +j +=128; j; j>>=1 ) + +1372 + `tzputc +( +vtz +, ( +v +& +j +)?'1':'0'); + +1374 if* +dvid + ) + +1376  +ov + = + `v_m_ad +( +d +, ( +v + =& +ic +-> +v +? 0x300+ +i + : 0x320+i ); + +1377 if +v + ! +ov + ) + `m_vmod +16, +i ++1, 2, +vtz + ); + +1378  +j +=128, +o +=19; j; j>>=1, o++ ) + +1380 i(( +v +& +j +!( +ov +&j)) + +1381 + `m_vmod + +o +, +i ++1, 1, +vtz + ); + +1386 + `tztos + +vtz +, 2, 18, "---------- TAPE ----------"); + +1387 + `tztos + +vtz +, 2, 19, "OFS %08u LEN %08u", +ic +-> +offs +, oric-> +n + ); + +1430 + } +} + +1432  + $m_aymod + +x +,  +y +,  +w + ) + +1434  +offs +, +i +; + +1436 +offs + = +y +* +tz +[ +TZ_AY +]-> +w ++ +x +; + +1437  +i +=0; i< +w +; i++, +offs +++ ) + +1439 +tz +[ +TZ_AY +]-> +fc +[ +offs +] = 1; + +1440 +tz +[ +TZ_AY +]-> +bc +[ +offs +] = 8; + +1442 + } +} + +1444  + $ygbs + +mache + * +ic +, * +r +, +St16 + +x +, St16 +y +,  +g +, +Ut8 + +bs + ) + +1446  +i +, +o +, +fc +, +bc +; + +1447 +Ut8 + +vw +, +vd +; + +1448  +xtze + * +z + = +tz +[ +TZ_AY +]; + +1450 +vw + = +ic +-> +ay +. +egs +[ +g +]; + +1451 +vd + = +ay_d +. +egs +[ +g +]; + +1453 + `tztos + +z +, +x +, +y +, +r +, +vw + ); + +1454 +fc + = 2; + +1455 +bc + = 3; + +1456 if +ay_dvid + ) && ( +ay_d +. +egs +[ +g +] ! +ic +-> +ay +.eregs[reg] ) ) + +1458 +fc + = 1; + +1459 +bc + = 8; + +1460 + `m_aymod + +x ++14, +y +, 2 ); + +1463 +x ++=18; + +1464 +o + = ( +y +* +z +-> +w +)+ +x +; + +1465 +bs + = 8-bits; + +1467  +i +=0; i<8; i++ ) + +1469 if +i + > +bs + ) + +1470 +z +-> +tx +[ +o +] = ( +vw +&(0x80>> +i +)) ? '1' : '0'; + +1472 +z +-> +tx +[ +o +] = ' '; + +1474 if( +vw +&(0x80)>> +i +!( +vd +&(0x80)>>i) ) + +1476 +z +-> +fc +[ +o +] = fc; + +1477 +z +-> +bc +[ +o +] = bc; + +1479 +z +-> +fc +[ +o +] = 2; + +1480 +z +-> +bc +[ +o +] = 3; + +1482 +o +++; + +1484 + } +} + +1486  + $m_upde_ay + +mache + * +ic + ) + +1488 * +rs +[] = { "INACTIVE", + +1492 + `tztos + +tz +[ +TZ_AY +], 2, 1, "CTRL=%s REG=%02X", + +1493 +rs +[ +ic +-> +ay +. +bmode +&3], + +1494 +ic +-> +ay +. +eg + ); + +1496 if +ay_dvid + ) + +1498 if( +ay_d +. +bmode +&3!( +ic +-> +ay +.bmode&3 + `m_aymod +( 7, 1, 8 ); + +1499 if +ay_d +. +eg + ! +ic +-> +ay +.eg ) + `m_aymod +( 21, 1, 2 ); + +1502 + `ygbs + +ic +, "R0 Pch A L $%02X %%", 2, 2, +AY_CHA_PER_L +, 8 ); + +1503 + `ygbs + +ic +, "R1 Pch A H $%02X %%", 2, 3, +AY_CHA_PER_H +, 4 ); + +1504 + `ygbs + +ic +, "R2 Pch B L $%02X %%", 2, 4, +AY_CHB_PER_L +, 8 ); + +1505 + `ygbs + +ic +, "R3 Pch B H $%02X %%", 2, 5, +AY_CHB_PER_H +, 4 ); + +1506 + `ygbs + +ic +, "R4 Pch C L $%02X %%", 2, 6, +AY_CHC_PER_L +, 8 ); + +1507 + `ygbs + +ic +, "R5 Pch C H $%02X %%", 2, 7, +AY_CHC_PER_H +, 4 ); + +1509 + `ygbs + +ic +, "R6 Noi $%02X %%", 2, 9, +AY_NOISE_PER +, 5 ); + +1510 + `ygbs + +ic +, "R7 Stu $%02X %%", 2,10, +AY_STATUS +, 7 ); + +1512 + `ygbs + +ic +, "R8 VumA $%02X %%", 2,12, +AY_CHA_AMP +, 5 ); + +1513 + `ygbs + +ic +, "R9 VumB $%02X %%", 2,13, +AY_CHB_AMP +, 5 ); + +1514 + `ygbs + +ic +, "RA VumC $%02X %%", 2,14, +AY_CHC_AMP +, 5 ); + +1516 + `ygbs + +ic +, "RB Env P L $%02X %%", 2,16, +AY_ENV_PER_L +, 8 ); + +1517 + `ygbs + +ic +, "RC Env P H $%02X %%", 2,17, +AY_ENV_PER_H +, 8 ); + +1518 + `ygbs + +ic +, "RD Env Cy$%02X %%", 2,18, +AY_ENV_CYCLE +, 4 ); + +1519 + `ygbs + +ic +, "RE Key C $%02X %%", 2,19, +AY_PORT_A +, 8 ); + +1539 + } +} + +1561  + $m_upde_disk + +mache + * +ic + ) + +1563 * +me +; + +1565 if +ic +-> +drivy + = +DRV_NONE + ) + +1568 if +ic +-> +drivy + = +DRV_PRAVETZ + ) + +1570  +i + = +ic +-> +wddisk +. +c_drive +; + +1571 + `tztos + +tz +[ +TZ_DISK +], 2, 2, "DRIVE=%02X EXT=%04X", + +1572 +ic +-> +wddisk +. +c_drive +, + +1573 +ic +-> +avz +. +exnsi + ); + +1574 + `tztos + +tz +[ +TZ_DISK +], 2, 3, "VOL=%02X SEL=%02X", + +1575 +ic +-> +avz +. +drv +[ +i +]. +vume +, + +1576 +ic +-> +avz +. +drv +[ +i +]. + + ); + +1577 + `tztos + +tz +[ +TZ_DISK +], 2, 4, "MOTOR=%01X WRRDY=%01X", + +1578 +ic +-> +avz +. +drv +[ +i +]. +m_ +, + +1579 +ic +-> +avz +. +drv +[ +i +]. +wre_ady + ); + +1580 + `tztos + +tz +[ +TZ_DISK +], 2, 5, "OVRAM=%s", +ic +-> +avz +. +ay + ? "ON " : "OFF" ); + +1584 +me + = "Unknown "; + +1585  +ic +-> +wddisk +. +cut + ) + +1587  +COP_NUFFINK +: +me + = "Idle "; ; + +1588  +COP_READ_TRACK +: +me + = "Readrack "; ; + +1589  +COP_READ_SECTOR +: +me + = "Read sector "; ; + +1590  +COP_READ_SECTORS +: +me + = "Read sectors "; ; + +1591  +COP_WRITE_TRACK +: +me + = "Writerack "; ; + +1592  +COP_WRITE_SECTOR +: +me + = "Write sector "; ; + +1593  +COP_WRITE_SECTORS +: +me + = "Write sectors"; ; + +1594  +COP_READ_ADDRESS +: +me + = "Readddress "; ; + +1597 + `tztos + +tz +[ +TZ_DISK +], 2, 2, "STATUS=%02X ROMDIS=%1X", +ic +-> +wddisk +. +r_us +, oric-> +romdis + ); + +1598 + `tztos + +tz +[ +TZ_DISK +], 2, 3, "DRIVE=%02X SIDE=%02X TRACK=%02X", + +1599 +ic +-> +wddisk +. +c_drive +, + +1600 +ic +-> +wddisk +. +c_side +, + +1601 +ic +-> +wddisk +. +c_ack + ); + +1602 + `tztos + +tz +[ +TZ_DISK +], 2, 4, "SECTR=%02X DATA=%02X", + +1603 +ic +-> +wddisk +. +r_ +, + +1604 +ic +-> +wddisk +. +r_da + ); + +1605 + `tztos + +tz +[ +TZ_DISK +], 2, 5, "OP=%s", +me + ); + +1606 + `tztos + +tz +[ +TZ_DISK +], 2, 6, "IRQC=%03d DRQC=%03d", + +1607 +ic +-> +wddisk +. +dayedt +, + +1608 +ic +-> +wddisk +. +dayeddrq + ); + +1610  +ic +-> +drivy + ) + +1612  +DRV_MICRODISC +: + +1613 + `tztos + +tz +[ +TZ_DISK +], 2, 8, "MDSTAT=%02X INTRQ=%1X DRQ=%1X", + +1614 +ic +-> +md +. +us +, + +1615 +ic +-> +md +. +q +!=0, + +1616 +ic +-> +md +. +drq +!=0 ); + +1617 + `tztos + +tz +[ +TZ_DISK +], 2, 9, "EPROM=%1X", +ic +-> +md +. +diskrom + ); + +1620  +DRV_JASMIN +: + +1621 + `tztos + +tz +[ +TZ_DISK +], 2, 8, "OVRAM=%s", +ic +-> +jasm +. +ay + ? "ON " : "OFF" ); + +1624 + } +} + +1626  + $m_e_t + +mache + * +ic + ) + +1628 +mwch_dvid + = +SDL_FALSE +; + +1629 +u_dvid + = +SDL_FALSE +; + +1630 +ay_dvid + = +SDL_FALSE +; + +1631 +v_dvid + = +SDL_FALSE +; + +1632 +v2_dvid + = +SDL_FALSE +; + +1633 + } +} + +1635  + $m_upde_mwch + +mache + * +ic + ) + +1637  +addr +; + +1638  +j +, +k +, +l +; + +1639  +v +; + +1641 if +mw_l + ) + +1643 +tz +[ +TZ_MEMWATCH +]-> +tx +[ 50] = +mw_which +==0 ? 14 : 5; + +1644 +tz +[ +TZ_MEMWATCH +]-> +tx +[550] = +mw_which +==1 ? 14 : 5; + +1646  +offs + = 10* +tz +[ +TZ_MEMWATCH +]-> +w ++1; + +1647  +k +=0; k<48; k++ ) + +1648 +tz +[ +TZ_MEMWATCH +]-> +tx +[ +offs ++ +k +] = 32; + +1649 +tz +[ +TZ_MEMWATCH +]-> +tx +[ 50] = 5; + +1650 +tz +[ +TZ_MEMWATCH +]-> +tx +[550] = 5; + +1654 +addr + = +mw_addr +[0]; + +1655  +j +=0; j<19; j++, +addr ++=8 ) + +1657 if +mw_l + ) && ( +j + == 9 ) ) + +1659  +offs + = 10* +tz +[ +TZ_MEMWATCH +]-> +w ++1; + +1660  +k +=0; k<48; k++ ) + +1662 +tz +[ +TZ_MEMWATCH +]-> +tx +[ +offs ++ +k +] = 2; + +1663 +tz +[ +TZ_MEMWATCH +]-> +bc +[ +offs ++ +k +] = 3; + +1664 +tz +[ +TZ_MEMWATCH +]-> +fc +[ +offs ++ +k +] = 2; + +1666 +j +++; + +1667 +addr + = +mw_addr +[1]; + +1670 + `rtf + +vtmp +, "%04X ", +addr + ); + +1671  +k +=0; k<8; k++ ) + +1673  +tmp +[8]; + +1674 + `tf + +tmp +, 7, "%02X ", + `m_ad + +ic +, +addr ++ +k + ) ); + +1675 + `rt + +vtmp +, +tmp + ); + +1677 +l + = () + ` + +vtmp + ); + +1678 +vtmp +[ +l +++] = 32; + +1679 +vtmp +[ +l +++] = '\''; + +1680  +k +=0; k<8; k++ ) + +1682 +v + = + `m_ad + +ic +, +addr ++ +k + ); + +1683 +vtmp +[ +l +++] = (( +v +>31)&&(v<128))?v:'.'; + +1685 +vtmp +[ +l +++] = '\''; + +1686 +vtmp +[ +l +++] = 0; + +1687 + `tzos + +tz +[ +TZ_MEMWATCH +], 1, +j ++1, +vtmp + ); + +1689 if +mwch_dvid + ) + +1691  +k +=0; k<8; k++ ) + +1693 if + `iam + +ic +, +addr ++ +k + ) && ( +mwch_d +[addr+k] ! + `m_ad +( oric,ddr+k ) ) ) + +1695  +offs + = ( +j ++1)* +tz +[ +TZ_MEMWATCH +]-> +w +; + +1696 +tz +[ +TZ_MEMWATCH +]-> +fc +[ +offs ++( +k +*3+7)] = 1; + +1697 +tz +[ +TZ_MEMWATCH +]-> +fc +[ +offs ++( +k +*3+8)] = 1; + +1698 +tz +[ +TZ_MEMWATCH +]-> +fc +[ +offs ++( +k ++33)] = 1; + +1699 +tz +[ +TZ_MEMWATCH +]-> +bc +[ +offs ++( +k +*3+7)] = 8; + +1700 +tz +[ +TZ_MEMWATCH +]-> +bc +[ +offs ++( +k +*3+8)] = 8; + +1701 +tz +[ +TZ_MEMWATCH +]-> +bc +[ +offs ++( +k ++33)] = 8; + +1707 if +mw_mode + == 0 ) ; + +1709 + `makebox + +tz +[ +TZ_MEMWATCH +], 17, 8, 7, 3, 2, 3 ); + +1710 + `tzos + +tz +[ +TZ_MEMWATCH +], 18, 9, +mw_ibuf + ); + +1711 + } +} + +1713  + $m_upde + +mache + * +ic + ) + +1715 + `m_upde_gs + +ic + ); + +1716  +mshow + ) + +1718  +MSHOW_VIA +: + +1719 + `m_upde_v + +ic +, +tz +[ +TZ_VIA +], &ic-> +v +, & +v_d +, & +v_dvid + ); + +1722  +MSHOW_VIA2 +: + +1723 + `m_upde_v + +ic +, +tz +[ +TZ_VIA2 +], &ic-> +_v +, & +v2_d +, & +v2_dvid + ); + +1726  +MSHOW_AY +: + +1727 + `m_upde_ay + +ic + ); + +1730  +MSHOW_DISK +: + +1731 + `m_upde_disk + +ic + ); + +1735  +cshow + ) + +1737  +CSHOW_MWATCH +: + +1738 + `m_upde_mwch + +ic + ); + +1741 + } +} + +1743  + $m_nd + +mache + * +ic + ) + +1745 i( +updvw +) + +1746 + `u_ndsn + +ic + ); + +1747 +ic +-> + `nd_video +ic, +SDL_FALSE + ); + +1749  +mshow + ) + +1751  +MSHOW_VIA +: + +1752 +ic +-> + `nd_xtze +ic, +TZ_VIA + ); + +1755  +MSHOW_VIA2 +: + +1756 +ic +-> + `nd_xtze +ic, +TZ_VIA2 + ); + +1759  +MSHOW_AY +: + +1760 +ic +-> + `nd_xtze +ic, +TZ_AY + ); + +1763  +MSHOW_DISK +: + +1764 +ic +-> + `nd_xtze +ic, +TZ_DISK + ); + +1768  +cshow + ) + +1770  +CSHOW_CONSOLE +: + +1771 +ic +-> + `nd_xtze +ic, +TZ_MONITOR + ); + +1774  +CSHOW_DEBUG +: + +1775 +ic +-> + `nd_xtze +ic, +TZ_DEBUG + ); + +1778  +CSHOW_MWATCH +: + +1779 +ic +-> + `nd_xtze +ic, +TZ_MEMWATCH + ); + +1782 +ic +-> + `nd_xtze +ic, +TZ_REGS + ); + +1783 + } +} + +1785  + $m_hide_curs +( ) + +1787  +xtze + * +z + = +tz +[ +TZ_MONITOR +]; + +1788  +x + = +cursx +- +off +; + +1790 if +m_asmmode + ) + +1792 +z +-> +fc +[z-> +w +*19+8+ +x +] = 2; + +1793 +z +-> +bc +[z-> +w +*19+8+ +x +] = 3; + +1797 if +x + < 0 ) || ( x > +CONS_WIDTH + ) ) ; + +1798 +z +-> +fc +[z-> +w +*19+2+ +x +] = 2; + +1799 +z +-> +bc +[z-> +w +*19+2+ +x +] = 3; + +1800 + } +} + +1802  + $m_show_curs +( ) + +1804  +xtze + * +z + = +tz +[ +TZ_MONITOR +]; + +1805  +x + = +cursx +- +off +; + +1807 if +m_asmmode + ) + +1809 +z +-> +fc +[z-> +w +*19+8+ +x +] = 3; + +1810 +z +-> +bc +[z-> +w +*19+8+ +x +] = 2; + +1814 if +x + < 0 ) || ( x > +CONS_WIDTH + ) ) ; + +1815 +z +-> +fc +[z-> +w +*19+2+ +x +] = 3; + +1816 +z +-> +bc +[z-> +w +*19+2+ +x +] = 2; + +1817 + } +} + +1819  + $m_sl + +SDL_bo + +above + ) + +1821  +x +, +y +, +s +, +d +, +h +; + +1822  +xtze + * +z + = +tz +[ +TZ_MONITOR +]; + +1824 +h + = +above + ? 17 : 18; + +1826 +s + = +z +-> +w +*2+1; + +1827 +d + = +z +-> +w ++1; + +1828  +y +=0; y< +h +; y++ ) + +1830  +x +=0; x<48; x++ ) + +1832 +z +-> +tx +[ +d +] =tz->tx[ +s +]; + +1833 +z +-> +fc +[ +d +] =tz->fc[ +s +]; + +1834 +z +-> +bc +[ +d +++] =tz->bc[ +s +++]; + +1836 +d + += 2; + +1837 +s + += 2; + +1840  +x +=0; x<48; x++ ) + +1842 +z +-> +tx +[ +d +] = ' '; + +1843 +z +-> +fc +[ +d +] = 2; + +1844 +z +-> +bc +[ +d +++] = 3; + +1846 + } +} + +1848  + $m_rtf +* +fmt +, ... ) + +1850 +va_li + + +; + +1851  +i +; + +1852  +mp +[48]; + +1854 + `va_t + + +, +fmt + ); + +1855 if + `vtf + +vtmp +, +VSPTMPSIZE +, +fmt +, + + ) != -1 ) + +1857 +vtmp +[ +VSPTMPSIZE +-1] = 0; + +1858 +i + = 0; + +1859  + ` +& +vtmp +[ +i +] ) > 47 ) + +1861 + `y + +mp +, & +vtmp +[ +i +], 47 ); + +1862 +mp +[47] = 0; + +1863 + `tzos + +tz +[ +TZ_MONITOR +], 1, 19, +mp + ); + +1864 + `m_sl + +SDL_FALSE + ); + +1865 +i + += 47; + +1867 + `tzos + +tz +[ +TZ_MONITOR +], 1, 19, & +vtmp +[ +i +] ); + +1869 + `va_d + + + ); + +1870 + } +} + +1872  + $m_tf +* +fmt +, ... ) + +1874 +va_li + + +; + +1875  +i +; + +1876  +mp +[48]; + +1878 + `m_sl + +SDL_FALSE + ); + +1880 + `va_t + + +, +fmt + ); + +1881 if + `vtf + +vtmp +, +VSPTMPSIZE +, +fmt +, + + ) != -1 ) + +1883 +vtmp +[ +VSPTMPSIZE +-1] = 0; + +1884 +i + = 0; + +1885  + ` +& +vtmp +[ +i +] ) > 46 ) + +1887 + `y + +mp +, & +vtmp +[ +i +], 46 ); + +1888 +mp +[46] = 0; + +1889 + `tzos + +tz +[ +TZ_MONITOR +], 1, 19, +mp + ); + +1890 + `m_sl + +SDL_FALSE + ); + +1891 +i + += 46; + +1893 + `tzos + +tz +[ +TZ_MONITOR +], 1, 19, & +vtmp +[ +i +] ); + +1895 + `va_d + + + ); + +1896 + } +} + +1898  + $m_tf_above +* +fmt +, ... ) + +1900 +va_li + + +; + +1901  +i +; + +1902  +mp +[48]; + +1904 + `m_sl + +SDL_TRUE + ); + +1906 + `va_t + + +, +fmt + ); + +1907 if + `vtf + +vtmp +, +VSPTMPSIZE +, +fmt +, + + ) != -1 ) + +1909 +vtmp +[ +VSPTMPSIZE +-1] = 0; + +1910 +i + = 0; + +1911  + ` +& +vtmp +[ +i +] ) > 46 ) + +1913 + `y + +mp +, & +vtmp +[ +i +], 46 ); + +1914 +mp +[46] = 0; + +1915 + `tzos + +tz +[ +TZ_MONITOR +], 1, 18, +mp + ); + +1916 + `m_sl + +SDL_TRUE + ); + +1917 +i + += 46; + +1919 + `tzos + +tz +[ +TZ_MONITOR +], 1, 18, & +vtmp +[ +i +] ); + +1921 + `va_d + + + ); + +1922 + } +} + +1924  + $m_r +* +r + ) + +1926 + `m_sl + +SDL_FALSE + ); + +1927 + `tzos + +tz +[ +TZ_MONITOR +], 1, 19, +r + ); + +1928 + } +} + +1930  + $m_r_above +* +r + ) + +1932 + `m_sl + +SDL_TRUE + ); + +1933 + `tzos + +tz +[ +TZ_MONITOR +], 1, 18, +r + ); + +1934 + } +} + +1936  + $m_t_put +( ) + +1938 + `m_sl + +SDL_FALSE + ); + +1939 +ibuf +[0] = 0; + +1940 + + = 0; + +1941 +off + = 0; + +1942 +cursx + = 0; + +1944 if +m_asmmode + ) + +1946 + `tztc + +tz +[ +TZ_MONITOR +], 1, 3 ); + +1947 + `tztos + +tz +[ +TZ_MONITOR +], 1, 19, " %04X:", +m_addr + ); + +1950 + `tztc + +tz +[ +TZ_MONITOR +], 1, 3 ); + +1951 + `tzos + +tz +[ +TZ_MONITOR +], 1, 19, "]" ); + +1952 + } +} + +1954  + $m_r + +mache + * +ic + ) + +1956 +deusyms +. +syms + = +NULL +; + +1957 +deusyms +. +numsyms + = 0; + +1958 +deusyms +. +syma + = -1; + +1959  +ic +-> +ty + ) + +1961  +MACH_ORIC1 +: + +1962  +MACH_ORIC1_16K +: + +1963  +MACH_ATMOS +: + +1964  +MACH_PRAVETZ +: + +1965 +deusyms +. +syms + = +defsym_mos +; + +1966 +deusyms +. +numsyms + =  +defsym_mos + ) /  +msym + ); + +1969  +MACH_TELESTRAT +: + +1970 +deusyms +. +syms + = +defsym_ +; + +1971 +deusyms +. +numsyms + =  +defsym_ + ) /  +msym + ); + +1975 if +m_bpmsg +[0] ) + +1977 + `m_tf_above + +m_bpmsg + ); + +1978 +m_bpmsg +[0] = 0; + +1981 +modifd + = +SDL_FALSE +; + +1982 +updvw + = +SDL_TRUE +; + +1983 + } +} + +1985  + $m_wm + +mache + * +ic + ) + +1987 + `m_t_put +(); + +1988 + `m_show_curs +(); + +1989 + } +} + +1991  + $m_ + +mache + * +ic + ) + +1993 +deusyms +. +numsyms + = 0; + +1994 +deusyms +. +syma + = 0; + +1995 +deusyms +. +syms + = +NULL +; + +1996 +ic +-> +ursyms +. +numsyms + = 0; + +1997 +ic +-> +ursyms +. +syma + = 0; + +1998 +ic +-> +ursyms +. +syms + = +NULL +; + +2000 +m_bpmsg +[0] = 0; + +2001 +mshow + = +MSHOW_VIA +; + +2002 +cshow + = +CSHOW_CONSOLE +; + +2003 +m_asmmode + = +SDL_FALSE +; + +2004 + `m_t_put +(); + +2005 + `m_show_curs +(); + +2006 +m_addr + = +ic +-> +u +. +pc +; + +2007 +ϡcmd + = 0; + +2008 +mw_l + = +SDL_FALSE +; + +2009 +mw_which + = 0; + +2010 +mwch_dvid + = +SDL_FALSE +; + +2011 +u_dvid + = +SDL_FALSE +; + +2012 +ay_dvid + = +SDL_FALSE +; + +2013 +v_dvid + = +SDL_FALSE +; + +2014 #i +LOG_DEBUG + + +2015 +debug_logfe + = + `fݒ + +debug_logme +, "w" ); + +2017 + } +} + +2019  + $m_shut + +mache + * +ic + ) + +2021 + `m_syms +& +ic +-> +ursyms + ); + +2022 #i +LOG_DEBUG + + +2023 if +debug_logfe + ) + `fo +( debug_logfile ); + +2024 +debug_logfe + = +NULL +; + +2026 + } +} + +2028  + $m_gg +* +buf +, * +off +, +SDL_bo + +addegs +, SDL_bo +egs +, SDL_bo +vgs + ) + +2030  +i +; + +2032 +i + = * +off +; + +2034  + `isws + +buf +[ +i +] ) ) i++; + +2036 if +vgs + ) + +2038 if + `cmp +& +buf +[ +i +], "vpcr", 4 ) == 0 ) + +2040 +i ++=4; + +2041 * +off + = +i +; + +2042  +REG_VIA_PCR +; + +2045 if + `cmp +& +buf +[ +i +], "vacr", 4 ) == 0 ) + +2047 +i ++=4; + +2048 * +off + = +i +; + +2049  +REG_VIA_ACR +; + +2052 if + `cmp +& +buf +[ +i +], "vsr", 3 ) == 0 ) + +2054 +i ++=3; + +2055 * +off + = +i +; + +2056  +REG_VIA_SR +; + +2059 if + `cmp +& +buf +[ +i +], "vifr", 4 ) == 0 ) + +2061 +i ++=4; + +2062 * +off + = +i +; + +2063  +REG_VIA_IFR +; + +2066 if + `cmp +& +buf +[ +i +], "vier", 4 ) == 0 ) + +2068 +i ++=4; + +2069 * +off + = +i +; + +2070  +REG_VIA_IER +; + +2073 if + `cmp +& +buf +[ +i +], "vira", 4 ) == 0 ) + +2075 +i ++=4; + +2076 * +off + = +i +; + +2077  +REG_VIA_IRA +; + +2080 if + `cmp +& +buf +[ +i +], "vora", 4 ) == 0 ) + +2082 +i ++=4; + +2083 * +off + = +i +; + +2084  +REG_VIA_ORA +; + +2087 if + `cmp +& +buf +[ +i +], "vddra", 5 ) == 0 ) + +2089 +i ++=5; + +2090 * +off + = +i +; + +2091  +REG_VIA_DDRA +; + +2094 if + `cmp +& +buf +[ +i +], "virb", 4 ) == 0 ) + +2096 +i ++=4; + +2097 * +off + = +i +; + +2098  +REG_VIA_IRB +; + +2101 if + `cmp +& +buf +[ +i +], "vorb", 4 ) == 0 ) + +2103 +i ++=4; + +2104 * +off + = +i +; + +2105  +REG_VIA_ORB +; + +2108 if + `cmp +& +buf +[ +i +], "vddrb", 5 ) == 0 ) + +2110 +i ++=5; + +2111 * +off + = +i +; + +2112  +REG_VIA_DDRB +; + +2115 if + `cmp +& +buf +[ +i +], "vt1l", 4 ) == 0 ) + +2117 +i ++=4; + +2118 * +off + = +i +; + +2119  +REG_VIA_T1L +; + +2122 if + `cmp +& +buf +[ +i +], "vt1c", 4 ) == 0 ) + +2124 +i ++=4; + +2125 * +off + = +i +; + +2126  +REG_VIA_T1C +; + +2129 if + `cmp +& +buf +[ +i +], "vt2l", 4 ) == 0 ) + +2131 +i ++=4; + +2132 * +off + = +i +; + +2133  +REG_VIA_T2L +; + +2136 if + `cmp +& +buf +[ +i +], "vt2c", 4 ) == 0 ) + +2138 +i ++=4; + +2139 * +off + = +i +; + +2140  +REG_VIA_T2C +; + +2143 if + `cmp +& +buf +[ +i +], "vca1", 4 ) == 0 ) + +2145 +i ++=4; + +2146 * +off + = +i +; + +2147  +REG_VIA_CA1 +; + +2150 if + `cmp +& +buf +[ +i +], "vca2", 4 ) == 0 ) + +2152 +i ++=4; + +2153 * +off + = +i +; + +2154  +REG_VIA_CA2 +; + +2157 if + `cmp +& +buf +[ +i +], "vcb1", 4 ) == 0 ) + +2159 +i ++=4; + +2160 * +off + = +i +; + +2161  +REG_VIA_CB1 +; + +2164 if + `cmp +& +buf +[ +i +], "vcb2", 4 ) == 0 ) + +2166 +i ++=4; + +2167 * +off + = +i +; + +2168  +REG_VIA_CA2 +; + +2172 if +addegs + ) + +2174 if + `cmp +& +buf +[ +i +], "pc", 2 ) == 0 ) + +2176 +i ++=2; + +2177 * +off + = +i +; + +2178  +REG_PC +; + +2181 if + `cmp +& +buf +[ +i +], "sp", 2 ) == 0 ) + +2183 +i ++=2; + +2184 * +off + = +i +; + +2185  +REG_SP +; + +2189 if +egs + ) + +2191  +buf +[ +i +] ) + +2195 +i +++; + +2196 * +off + = +i +; + +2197  +REG_A +; + +2201 +i +++; + +2202 * +off + = +i +; + +2203  +REG_X +; + +2207 +i +++; + +2208 * +off + = +i +; + +2209  +REG_Y +; + +2214 + } +} + +2216 +SDL_bo + + $m_gnum + +mache + * +ic +, * +num +, * +buf +, * +off +, +SDL_bo + +addegs +, SDL_bo +egs +, SDL_bo +vgs +, SDL_bo +symbs + ) + +2218  +i +, +j +; + +2219  +c +; + +2220  +v +; + +2222 +i + = * +off +; + +2223  + `isws + +buf +[ +i +] ) ) i++; + +2225 if +symbs + ) && ( + `issymt + +buf +[ +i +] ) ) ) + +2227  +msym + * +fsym +; + +2229  +j +=0; + `issymch + +buf +[ +i ++j] ); j++ ) ; + +2230 +c + = +buf +[ +i ++ +j +]; + +2231 if + `isws + +c + ) || ( c == 13 ) || ( c == 10 ) || ( c == 0 ) || ( c == ',' ) || ( c == ')' ) ) + +2233 +buf +[ +i ++ +j +] = 0; + +2234 +fsym + = + `m_fd_sym_by_me + +ic +, & +buf +[ +i +] ); + +2235 +buf +[ +i ++ +j +] = +c +; + +2236 if +fsym + ) + +2238 (* +num + +fsym +-> +addr +; + +2239 (* +off + +i ++ +j +; + +2240  +SDL_TRUE +; + +2245 +j + = + `m_gg + +buf +, +off +, +addegs +, +egs +, +vgs + ); + +2246 if +j + != -1 ) + +2248  +j + ) + +2250  +REG_A +: + +2251 * +num + = +ic +-> +u +. +a +; + +2252  +SDL_TRUE +; + +2253  +REG_X +: + +2254 * +num + = +ic +-> +u +. +x +; + +2255  +SDL_TRUE +; + +2256  +REG_Y +: + +2257 * +num + = +ic +-> +u +. +y +; + +2258  +SDL_TRUE +; + +2259  +REG_PC +: + +2260 * +num + = +ic +-> +u +. +pc +; + +2261  +SDL_TRUE +; + +2262  +REG_SP +: + +2263 * +num + = +ic +-> +u +. + +|0x100; + +2264  +SDL_TRUE +; + +2265  +REG_VIA_PCR +: + +2266 * +num + = +ic +-> +v +. +p +; + +2267  +SDL_TRUE +; + +2268  +REG_VIA_ACR +: + +2269 * +num + = +ic +-> +v +. +a +; + +2270  +SDL_TRUE +; + +2271  +REG_VIA_SR +: + +2272 * +num + = +ic +-> +v +. + +; + +2273  +SDL_TRUE +; + +2274  +REG_VIA_IFR +: + +2275 * +num + = +ic +-> +v +. +i +; + +2276  +SDL_TRUE +; + +2277  +REG_VIA_IER +: + +2278 * +num + = +ic +-> +v +. +r +; + +2279  +SDL_TRUE +; + +2280  +REG_VIA_IRA +: + +2281 * +num + = +ic +-> +v +. +a +; + +2282  +SDL_TRUE +; + +2283  +REG_VIA_ORA +: + +2284 * +num + = +ic +-> +v +. +a +; + +2285  +SDL_TRUE +; + +2286  +REG_VIA_DDRA +: + +2287 * +num + = +ic +-> +v +. +dd +; + +2288  +SDL_TRUE +; + +2289  +REG_VIA_IRB +: + +2290 * +num + = +ic +-> +v +. +b +; + +2291  +SDL_TRUE +; + +2292  +REG_VIA_ORB +: + +2293 * +num + = +ic +-> +v +. +b +; + +2294  +SDL_TRUE +; + +2295  +REG_VIA_DDRB +: + +2296 * +num + = +ic +-> +v +. +ddrb +; + +2297  +SDL_TRUE +; + +2298  +REG_VIA_T1L +: + +2299 * +num + = ( +ic +-> +v +. +t1l_h +<<8)|ic->v. +t1l_l +; + +2300  +SDL_TRUE +; + +2301  +REG_VIA_T1C +: + +2302 * +num + = +ic +-> +v +. +t1c +; + +2303  +SDL_TRUE +; + +2304  +REG_VIA_T2L +: + +2305 * +num + = ( +ic +-> +v +. +t2l_h +<<8)|ic->v. +t2l_l +; + +2306  +SDL_TRUE +; + +2307  +REG_VIA_T2C +: + +2308 * +num + = +ic +-> +v +. +t2c +; + +2309  +SDL_TRUE +; + +2310  +REG_VIA_CA1 +: + +2311 * +num + = +ic +-> +v +. +1 +; + +2312  +SDL_TRUE +; + +2313  +REG_VIA_CA2 +: + +2314 * +num + = +ic +-> +v +. +2 +; + +2315  +SDL_TRUE +; + +2316  +REG_VIA_CB1 +: + +2317 * +num + = +ic +-> +v +. +cb1 +; + +2318  +SDL_TRUE +; + +2319  +REG_VIA_CB2 +: + +2320 * +num + = +ic +-> +v +. +cb2 +; + +2321  +SDL_TRUE +; + +2325 if +buf +[ +i +] == '%' ) + +2328 +i +++; + +2329 if! + `isb + +buf +[ +i +] ) )  +SDL_FALSE +; + +2331 +v + = 0; + +2332  + `isb + +buf +[ +i +] ) ) + +2334 +v + = (v<<1| ( +buf +[ +i +]-'0'); + +2335 +i +++; + +2338 * +num + = +v +; + +2339 * +off + = +i +; + +2340  +SDL_TRUE +; + +2343 if +buf +[ +i +] == '$' ) + +2346 +i +++; + +2347 if! + `ishex + +buf +[ +i +] ) )  +SDL_FALSE +; + +2349 +v + = 0; + +2352 +j + = + `hex + +buf +[ +i +] ); + +2353 if +j + == -1 ) ; + +2354 +v + = (v<<4| +j +; + +2355 +i +++; + +2358 * +num + = +v +; + +2359 * +off + = +i +; + +2360  +SDL_TRUE +; + +2363 if! + `ium + +buf +[ +i +] ) )  +SDL_FALSE +; + +2365 +v + = 0; + +2366  + `ium + +buf +[ +i +] ) ) + +2368 +v + = (v*10+ ( +buf +[ +i +]-'0'); + +2369 +i +++; + +2372 * +num + = +v +; + +2373 * +off + = +i +; + +2374  +SDL_TRUE +; + +2375 + } +} + +2377 +Ut16 + + $m_sym_be_guess + +mache + * +ic +, +Ut16 + +addr +, * +symme +, +SDL_bo + +u_emu_e + ) + +2380 if +addr + >= 0xc000 ) + +2383 if +ic +-> +ty + = +MACH_TELESTRAT + ) + +2386 if +symme +[0] == 't' ) && + +2387 +symme +[1] >= '0' ) && ( symname[1] <= '7' ) ) && + +2388 +symme +[2] == '_' ) ) + +2389  +SYMF_TELEBANK0 + << ( +symme +[1]-'0'); + +2392 if +u_emu_e + ) + +2393  +SYMF_TELEBANK0 + << +ic +-> +_cubk +; + +2396  +SYMF_TELEBANK0 +| +SYMF_TELEBANK1 +| +SYMF_TELEBANK2 +| +SYMF_TELEBANK3 +| +SYMF_TELEBANK4 +| +SYMF_TELEBANK5 +| +SYMF_TELEBANK6 +| +SYMF_TELEBANK7 +; + +2400 if +u_emu_e + ) + +2402  +romdis + = +ic +->romdis; + +2403 if +ic +-> +drivy + = +DRV_JASMIN + ) && ( oric-> +jasm +. +ay + ) ) + +2404 +romdis + = 1; + +2406  +romdis + ? +SYMF_ROMDIS1 + : +SYMF_ROMDIS0 +; + +2409  +SYMF_ROMDIS1 +; + +2414 + } +} + +2416  +msym + * + $m_a__add_symb + +symbޏb + * +ab +,  +mache + * +ic +, * +symme +,  +ags +, +Ut16 + +addr + ) + +2418  +i +; + +2419  +symtmp +[160]; + +2420  +msym + * +tv + = +NULL +; + +2422  +i +=0; + `issymch +( +symme +[i]); i++ ) + +2423 +symtmp +[ +i +] = +symme +[i]; + +2424 +symtmp +[ +i +] = 0; + +2427 if +ab +-> +syma + =-1 )  +tv +; + +2429 if +ags + = +SYM_BESTGUESS + ) + +2430 +ags + = + `m_sym_be_guess + +ic +, +addr +, +symtmp +, +SDL_TRUE + ); + +2432  +i +=0; i< +ab +-> +numsyms +; i++ ) + +2434 if! +ic +-> +symbs + ) + +2436 if + `rcmp + +symtmp +, +ab +-> +syms +[ +i +]. +me + ) == 0 ) + +2439 if + `rcmp + +symtmp +, +ab +-> +syms +[ +i +]. +me + ) == 0 ) + +2445 if +i + < +ab +-> +numsyms + ) + +2447 +ab +-> +syms +[ +i +]. +addr + =ddr; + +2448 +ab +-> +syms +[ +i +]. +ags + = flags; + +2449  & +ab +-> +syms +[ +i +]; + +2452 + `m_addsym + +ab +, +addr +, +ags +, +symtmp +, & +tv + ); + +2453  +tv +; + +2454 + } +} + +2456 +SDL_bo + + $m_symsomsh + +symbޏb + * +ab +, * +bufr +,  +n +) + +2458  +offs +, +symn +, +addr +, +ags +; + +2459 * +symme +; + +2461 +ab +-> +numsyms + = 0; + +2463 +offs + = 0; + +2464  +offs + < +n +) + +2466 +symn + = ( +bufr +[ +offs +]<<24)|(buffer[offs+1]<<16)|(buffer[offs+2]<<8)|buffer[offs+3]; + +2467 +offs ++=4; + +2468 i( +symn ++ +offs + > +n + +SDL_FALSE +; + +2470 +symme + = (*)(& +bufr +[ +offs +]); + +2471 +offs + + +symn +; + +2473 +addr + = ( +bufr +[ +offs +]<<8)|buffer[offs+1]; + +2474 +offs + += 2; + +2476 +ags + = ( +bufr +[ +offs +]<<8)|buffer[offs+1]; + +2477 +offs + += 2; + +2479 + `m_addsym + +ab +, +addr +, +ags +, +symme +, +NULL + ); + +2482  +SDL_TRUE +; + +2483 + } +} + +2487 +SDL_bo + + $m_w_symbs + +symbޏb + * +ab +,  +mache + * +ic +, * +ame +,  +ags +, +SDL_bo + +above +, SDL_bo +vbo + ) + +2489 +FILE + * +f +; + +2490  +i +, +j +; + +2491  +v +; + +2493 +f + = + `fݒ + +ame +, "r" ); + +2494 if! +f + ) + +2496 if +vbo + ) + +2498 if +above + ) + +2499 + `m_tf_above +"Ubˁݒ '%s'", +ame + ); + +2501 + `m_tf +"Ubˁݒ '%s'", +ame + ); + +2503  +SDL_FALSE +; + +2506 +ab +-> +numsyms + = 0; + +2507  ! + `of + +f + ) ) + +2509  +lmp +[256]; + +2511 if! + `fgs + +lmp +, 256, +f + ) ) ; + +2513 if + `ssnf + +lmp +, " %06X .%s", & +v +,inetmp ) != 2 ) + +2515  +i +=0, +v +=0; i<4; i++ ) + +2517 +j + = + `hex + +lmp +[ +i +] ); + +2518 if +j + == -1 ) ; + +2519 +v + = (v<<4)| +j +; + +2521 if +i + < 4 ) ; + +2522 if +lmp +[4] != 32 ) ; + +2523 if! + `issymt + +lmp +[5] ) ) ; + +2525  +i +=5, +j +=0; + `issymch +( +lmp +[i]); i++,j++ ) + +2526 +lmp +[ +j +] =mp[ +i +]; + +2527 +lmp +[ +j +] = 0; + +2531 + `fush + +dout + ); + +2534 if +ags + = +SYM_BESTGUESS + ) + +2536 + `m_addsym + +ab +, +v +, + `m_sym_be_guess + +ic +, v, +lmp +, +SDL_FALSE + ),mp, +NULL + ); + +2538 + `m_addsym + +ab +, +v +, +ags +, +lmp +, +NULL + ); + +2542 + `fo + +f + ); + +2544 if +vbo + ) + +2546 if +above + ) + +2547 + `m_tf_above +"Symbޠlded from '%s'", +ame + ); + +2549 + `m_tf +"Symbޠlded from '%s'", +ame + ); + +2551  +SDL_TRUE +; + +2552 + } +} + +2554 +SDL_bo + + $m_cmd +* +cmd +,  +mache + * +ic +, +SDL_bo + * +ednd + ) + +2556  +i +, +j +, +k +, +l +; + +2557  +v +, +w +; + +2558 +SDL_bo + +de + = +SDL_FALSE +; + +2559 * +tmem +; + +2560  +msym + * +tmpsym +; + +2561 +FILE + * +f +; + +2563 +i +=0; + +2564  + `isws + +cmd +[ +i +] ) ) i++; + +2566 if +cmd +[ +i +] != '?' ) + +2567 +hpcou + = 0; + +2569  +cmd +[ +i +] ) + +2572 +ϡcmd + = +cmd +[ +i +]; + +2573 +i +++; + +2575 if + `m_gnum + +ic +, & +v +, +cmd +, & +i +, +SDL_TRUE +, +SDL_FALSE +, SDL_FALSE, SDL_TRUE ) ) + +2576 +m_addr + = +v +; + +2578 +m_asmmode + = +SDL_TRUE +; + +2582 +ϡcmd + = 0; + +2583 +i +++; + +2584  +cmd +[ +i +] ) + +2587 +ic +-> +symbs + = +SDL_FALSE +; + +2588 + `m_r +( "Symbolsreot case-sensitive" ); + +2592 +ic +-> +symbs + = +SDL_TRUE +; + +2593 + `m_r +( "Symbolsre case-sensitive" ); + +2597 if! + `isws + +cmd +[ +i ++1] ) ) + +2599 + `m_r +( "???" ); + +2603 +i ++=2; + +2604  + `isws + +cmd +[ +i +] ) ) i++; + +2606 if! + `issymt + +cmd +[ +i +] ) ) + +2608 + `m_r +( "Expected symbolamendddress" ); + +2612 +j + = +i +; + +2613  + `issymch + +cmd +[ +i +] ) ) i++; + +2615 if! + `isws + +cmd +[ +i +] ) ) + +2617 + `m_r +( "Expected symbolamendddress" ); + +2621 if! + `m_gnum + +ic +, & +v +, +cmd +, & +i +, +SDL_TRUE +, +SDL_FALSE +, SDL_FALSE, SDL_TRUE ) ) + +2623 + `m_r +( "Addressxpected" ); + +2627 +tmpsym + = + `m_a__add_symb +& +ic +-> +ursyms +, oric, & +cmd +[ +j +], +SYM_BESTGUESS +, +v + ); + +2628 if! +tmpsym + ) + +2630 + `m_r +( "Failed for someeason" ); + +2634 + `m_tf +"%%04X", +tmpsym +-> +me +,mpsym-> +addr + ); + +2638 if! + `isws + +cmd +[ +i ++1] ) ) + +2640 + `m_r +( "???" ); + +2644 +i ++=2; + +2645  + `isws + +cmd +[ +i +] ) ) i++; + +2647 if! + `issymt + +cmd +[ +i +] ) ) + +2649 + `m_r +( "Symbolxpected" ); + +2653 +j + = +i +; + +2654  + `issymch + +cmd +[ +i +] ) ) i++; + +2656 if +cmd +[ +i +] != 0 ) + +2658 + `m_tf +"Exednd ol '%s'", & +cmd +[ +i +] ); + +2662 if! + `m_b_fd_sym_by_me +& +ic +-> +ursyms +, oric, & +cmd +[ +j +], & +k + ) ) + +2664 + `m_tf +"Couldn'fd '%s' ithusymbށab", & +cmd +[ +j +] ); + +2668  ; +k +<( +ic +-> +ursyms +. +numsyms +-1); k++ ) + +2669 +ic +-> +ursyms +. +syms +[ +k +] = oric->usersyms.syms[k+1]; + +2670 +ic +-> +ursyms +. +numsyms +--; + +2671 + `m_tf +"Kd symb '%s'", & +cmd +[ +j +] ); + +2675 +ic +-> +ursyms +. +numsyms + = 0; + +2676 + `m_r +( "Symbols zapped!" ); + +2680 if! + `isws + +cmd +[ +i ++1] ) ) + +2682 + `m_r +( "???" ); + +2686 +i ++=2; + +2688 + `m_w_symbs +& +ic +-> +ursyms +, oric, & +cmd +[ +i +], +SYM_BESTGUESS +, +SDL_FALSE +, +SDL_TRUE + ); + +2692 if! + `isws + +cmd +[ +i ++1] ) ) + +2694 + `m_r +( "???" ); + +2698 +i ++=2; + +2700 +f + = + `fݒ +& +cmd +[ +i +], "w" ); + +2701 if! +f + ) + +2703 + `m_tf +"Ubˁݒ '%s' f wrg", & +cmd +[ +i +] ); + +2707  +j +=0; j< +ic +-> +ursyms +. +numsyms +; j++ ) + +2708 + `rtf + +f +, "%04X %s\n", +ic +-> +ursyms +. +syms +[ +j +]. +addr +, oric->ursyms.syms[j]. +me + ); + +2709 + `fo + +f + ); + +2711 + `m_tf +"Usymbޠexp܋d'%s'", & +cmd +[ +i +] ); + +2715 + `m_r +( "???" ); + +2721 +ϡcmd + = 0; + +2722 +i +++; + +2723  +cmd +[ +i +] ) + +2726 if +cmd +[ +i ++1] == 'm' ) + +2728 +ic +-> +u +. +ymbp + = +SDL_FALSE +; + +2729  +j +=0; j<16; j++ ) + +2731 if +ic +-> +u +. +membakpots +[ +j +]. +ags + ) + +2733 + `m_tf +( "%02d: $%04X %c%c%c", + +2734 +j +, + +2735 +ic +-> +u +. +membakpots +[ +j +]. +addr +, + +2736 ( +ic +-> +u +. +membakpots +[ +j +]. +ags +& +MBPF_READ +) ? 'r' : ' ', + +2737 ( +ic +-> +u +. +membakpots +[ +j +]. +ags +& +MBPF_WRITE +) ? 'w' : ' ', + +2738 ( +ic +-> +u +. +membakpots +[ +j +]. +ags +& +MBPF_CHANGE +) ? 'c' : ' ' ); + +2739 +ic +-> +u +. +ymbp + = +SDL_TRUE +; + +2745 +ic +-> +u +. +ybp + = +SDL_FALSE +; + +2746  +j +=0; j<16; j++ ) + +2748 if +ic +-> +u +. +bakpots +[ +j +] != -1 ) + +2750 + `m_tf +( "%02d: $%04X %s%s", + +2751 +j +, + +2752 +ic +-> +u +. +bakpots +[ +j +], + +2753 ( +ic +-> +u +. +bakpot_ags +[ +j +]& +MBPF_RESETCYCLES +) ? "z" : "", + +2754 ( +ic +-> +u +. +bakpot_ags +[ +j +]& +MBPF_RESETCYCLESCONTINUE +) ? "c" : ""); + +2755 +ic +-> +u +. +ybp + = +SDL_TRUE +; + +2761 if +cmd +[ +i ++1] == 'm' ) + +2763  +j +=0; j<16; j++ ) + +2765 if +ic +-> +u +. +membakpots +[ +j +]. +ags + == 0 ) + +2769 if +j + == 16 ) + +2771 + `m_r +( "Max 16 breakpoints" ); + +2775 +i + += 2; + +2776 if! + `m_gnum + +ic +, & +v +, +cmd +, & +i +, +SDL_TRUE +, SDL_TRUE, SDL_TRUE, SDL_TRUE ) ) + +2778 + `m_r +( "Addressxpected" ); + +2782 +ic +-> +u +. +membakpots +[ +j +]. +addr + = +v + & 0xffff; + +2783 +ic +-> +u +. +membakpots +[ +j +]. +ϡv + = + `m_ad +ic, +v +&0xffff ); + +2784 +ic +-> +u +. +membakpots +[ +j +]. +ags + = 0; + +2786  + `isws + +cmd +[ +i +] ) ) i++; + +2790  +cmd +[ +i +] ) + +2793 +ic +-> +u +. +membakpots +[ +j +]. +ags + | +MBPF_READ +; + +2794 +i +++; + +2798 +ic +-> +u +. +membakpots +[ +j +]. +ags + | +MBPF_WRITE +; + +2799 +i +++; + +2803 +ic +-> +u +. +membakpots +[ +j +]. +ags + | +MBPF_CHANGE +; + +2804 +i +++; + +2810 if! +ic +-> +u +. +membakpots +[ +j +]. +ags + ) + +2811 +ic +-> +u +. +membakpots +[ +j +]. +ags + = +MBPF_READ +| +MBPF_WRITE +; + +2812 +ic +-> +u +. +ymbp + = +SDL_TRUE +; + +2814 + `m_tf +"m%02d: $%04X %s%s%s", +j +, +ic +-> +u +. +membakpots +[j]. +addr +, + +2815 ( +ic +-> +u +. +membakpots +[ +j +]. +ags +& +MBPF_READ +) ? "r" : "", + +2816 ( +ic +-> +u +. +membakpots +[ +j +]. +ags +& +MBPF_WRITE +) ? "w" : "", + +2817 ( +ic +-> +u +. +membakpots +[ +j +]. +ags +& +MBPF_CHANGE +) ? "c" : "" ); + +2821  +j +=0; j<16; j++ ) + +2823 if +ic +-> +u +. +bakpots +[ +j +] == -1 ) + +2827 if +j + == 16 ) + +2829 + `m_r +( "Max 16 breakpoints" ); + +2833 +i +++; + +2834 if! + `m_gnum + +ic +, & +v +, +cmd +, & +i +, +SDL_TRUE +, SDL_TRUE, SDL_TRUE, SDL_TRUE ) ) + +2836 + `m_r +( "Addressxpected" ); + +2840 +ic +-> +u +. +bakpots +[ +j +] = +v + & 0xffff; + +2841 +ic +-> +u +. +bakpot_ags +[ +j +] = 0; + +2842 +ic +-> +u +. +ybp + = +SDL_TRUE +; + +2844  + `isws + +cmd +[ +i +] ) ) i++; + +2848  +cmd +[ +i +] ) + +2851 +ic +-> +u +. +bakpot_ags +[ +j +] | +MBPF_RESETCYCLES +; + +2852 +i +++; + +2855 +ic +-> +u +. +bakpot_ags +[ +j +] | +MBPF_RESETCYCLESCONTINUE +; + +2856 +i +++; + +2862 + `m_tf +( "%02d: $%04X %s%s", + +2863 +j +, + +2864 +ic +-> +u +. +bakpots +[ +j +], + +2865 ( +ic +-> +u +. +bakpot_ags +[ +j +]& +MBPF_RESETCYCLES +) ? "z" : "", + +2866 ( +ic +-> +u +. +bakpot_ags +[ +j +]& +MBPF_RESETCYCLESCONTINUE +) ? "c" : "" ); + +2870 +j + = 0; + +2871 if +cmd +[ +i ++1] == 'm' ) + +2873 +j + = 1; + +2874 +i +++; + +2877 +i +++; + +2878 if! + `m_gnum + +ic +, & +v +, +cmd +, & +i +, +SDL_FALSE +, SDL_FALSE, SDL_FALSE, SDL_FALSE ) ) + +2880 + `m_r +( "Breakpoint IDxpected" ); + +2884 if +v + > 15 ) + +2886 + `m_r +( "Invalid breakpoint ID" ); + +2890 if +j + ) + +2892 +ic +-> +u +. +membakpots +[ +v +]. +ags + = 0; + +2893 +ic +-> +u +. +ymbp + = +SDL_FALSE +; + +2894  +j +=0; j<16; j++ ) + +2896 if +ic +-> +u +. +membakpots +[ +j +]. +ags + != 0 ) + +2898 +ic +-> +u +. +ymbp + = +SDL_TRUE +; + +2905 +ic +-> +u +. +bakpots +[ +v +] = -1; + +2906 +ic +-> +u +. +ybp + = +SDL_FALSE +; + +2907  +j +=0; j<16; j++ ) + +2909 if +ic +-> +u +. +bakpots +[ +j +] != -1 ) + +2911 +ic +-> +u +. +ybp + = +SDL_TRUE +; + +2918 if +cmd +[ +i ++1] == 'm' ) + +2920  +i +=0; i<16; i++ ) + +2921 +ic +-> +u +. +membakpots +[ +i +]. +ags + = 0; + +2922 +ic +-> +u +. +ymbp + = +SDL_FALSE +; + +2926  +i +=0; i<16; i++ ) + +2927 +ic +-> +u +. +bakpots +[ +i +] = -1; + +2928 +ic +-> +u +. +ybp + = +SDL_FALSE +; + +2932 + `m_r +( "???" ); + +2938 +ϡcmd + = +cmd +[ +i +]; + +2939 +i +++; + +2941  +cmd +[ +i +] ) + +2944 +ϡcmd + = 0; + +2945 +i +++; + +2947 if! + `m_gnum + +ic +, & +v +, +cmd +, & +i +, +SDL_TRUE +, +SDL_FALSE +, SDL_FALSE, SDL_TRUE ) ) + +2949 + `m_r +( "Badddress" ); + +2953 if! + `m_gnum + +ic +, & +w +, +cmd +, & +i +, +SDL_TRUE +, +SDL_FALSE +, SDL_FALSE, SDL_TRUE ) ) + +2955 + `m_r +( "Valuexpected" ); + +2959 + `m_t_modifd + +ic + ); + +2960 +ic +-> +u +. + `wre +&ic->u, +v +, +w + ); + +2961 +updvw + = +SDL_TRUE +; + +2965 +ϡcmd + = 0; + +2966 +i +++; + +2968 if! + `m_gnum + +ic +, & +v +, +cmd +, & +i +, +SDL_TRUE +, +SDL_FALSE +, SDL_FALSE, SDL_TRUE ) ) + +2970 + `m_r +( "Badddress" ); + +2974 if +mw_l + ) + +2976 +mw_addr +[ +mw_which +] = +v +; + +2978 +mw_which + = 0; + +2979 +mw_addr +[0] = +v +; + +2981 +cshow + = +CSHOW_MWATCH +; + +2985 if +cmd +[ +i +] !0 ) && ( ! + `isws +( cmd[i] ) ) ) + +2987 + `m_r +( "???" ); + +2992 if + `m_gnum + +ic +, & +v +, +cmd +, & +i +, +SDL_TRUE +, +SDL_FALSE +, SDL_FALSE, SDL_TRUE ) ) + +2993 +m_addr + = +v +; + +2995  +j +=0; j<16; j++ ) + +2997 + `rtf + +vtmp +, "%04X ", +m_addr + ); + +2998  +k +=0; k<8; k++ ) + +3000  +tmp +[8]; + +3001 + `tf + +tmp +, 7, "%02X ", + `m_ad + +ic +, +m_addr ++ +k + ) ); + +3002 + `rt + +vtmp +, +tmp + ); + +3004 +l + = () + ` + +vtmp + ); + +3005 +vtmp +[ +l +++] = 32; + +3006 +vtmp +[ +l +++] = '\''; + +3007  +k +=0; k<8; k++ ) + +3009 +v + = + `m_ad + +ic +, +m_addr +++ ); + +3010 +vtmp +[ +l +++] = (( +v +>31)&&(v<128))?v:'.'; + +3012 +vtmp +[ +l +++] = '\''; + +3013 +vtmp +[ +l +++] = 0; + +3014 + `m_r + +vtmp + ); + +3021 if +cmd +[ +i ++1] == 'f' ) + +3023 +i ++=2; + +3025 if! + `m_gnum + +ic +, & +v +, +cmd +, & +i +, +SDL_TRUE +, +SDL_FALSE +, SDL_FALSE, SDL_TRUE ) ) + +3027 + `m_r +( "Startddressxpected\n" ); + +3031 +m_addr + = +v +; + +3032 if! + `m_gnum + +ic +, & +v +, +cmd +, & +i +, +SDL_TRUE +, +SDL_FALSE +, SDL_FALSE, SDL_TRUE ) ) + +3034 + `m_r +( "Endddressxpected\n" ); + +3038  + `isws + +cmd +[ +i +] ) ) i++; + +3039 if! +cmd +[ +i +] ) + +3041 + `m_r +( "Filenamexpected" ); + +3045 +f + = + `fݒ +& +cmd +[ +i +], "w" ); + +3046 if! +f + ) + +3048 + `m_tf +"Ubˁݒ '%s'", & +cmd +[ +i +] ); + +3052  +m_addr + < +v + ) + +3054 +SDL_bo + +loed +; + +3055 + `rtf + +f +, "%s\n", + `m_dismb + +ic +, & +m_addr +, & +loed +, +SDL_TRUE + ) ); + +3056 if +loed + ) ; + +3059 + `fo + +f + ); + +3063 +ϡcmd + = +cmd +[ +i +]; + +3064 +i +++; + +3065 if + `m_gnum + +ic +, & +v +, +cmd +, & +i +, +SDL_TRUE +, +SDL_FALSE +, SDL_FALSE, SDL_TRUE ) ) + +3066 +m_addr + = +v +; + +3068  +j +=0; j<16; j++ ) + +3069 + `m_r + + `m_dismb + +ic +, & +m_addr +, +NULL +, +SDL_FALSE + ) ); + +3073 +ϡcmd + = 0; + +3074 +i +++; + +3076 +j + = + `m_gg + +cmd +, & +i +, +SDL_TRUE +, SDL_TRUE, SDL_TRUE ); + +3077 if +j + == -1 ) + +3079 + `m_r +( "Registerxpected" ); + +3083 if! + `m_gnum + +ic +, & +v +, +cmd +, & +i +, +SDL_TRUE +, SDL_TRUE, SDL_TRUE, SDL_TRUE ) ) + +3085 + `m_r +( "Expressionxpected" ); + +3089  +j + ) + +3091  +REG_PC +: + `m_t_modifd + +ic + ); oric-> +u +. +pc + = +v +; ; + +3092  +REG_SP +: + `m_t_modifd + +ic + ); oric-> +u +. + + = +v +; ; + +3093  +REG_A +: + `m_t_modifd + +ic + ); oric-> +u +. +a + = +v +; ; + +3094  +REG_X +: + `m_t_modifd + +ic + ); oric-> +u +. +x + = +v +; ; + +3095  +REG_Y +: + `m_t_modifd + +ic + ); oric-> +u +. +y + = +v +; ; + +3097  +REG_VIA_PCR +: + `m_t_modifd + +ic + ); + `v_wre +&ic-> +v +, +VIA_PCR +, +v + ); ; + +3098  +REG_VIA_ACR +: + `m_t_modifd + +ic + ); + `v_wre +&ic-> +v +, +VIA_ACR +, +v + ); ; + +3099  +REG_VIA_SR +: + `m_t_modifd + +ic + ); + `v_wre +&ic-> +v +, +VIA_SR +, +v + ); ; + +3100  +REG_VIA_IFR +: + `m_t_modifd + +ic + ); + `v_m_wre_i +&ic-> +v +, +v + ); ; + +3101  +REG_VIA_IER +: + `m_t_modifd + +ic + ); oric-> +v +. +r + = +v +&0x7f; ; + +3102  +REG_VIA_IRA +: + `m_t_modifd + +ic + ); oric-> +v +. + `wre_pt_a +&ic->v, 0xff, +v + ); ; + +3103  +REG_VIA_ORA +: + `m_t_modifd + +ic + ); + `v_wre +&ic-> +v +, +VIA_IORA +, +v + ); ; + +3104  +REG_VIA_DDRA +: + `m_t_modifd + +ic + ); + `v_wre +&ic-> +v +, +VIA_DDRA +, +v + ); ; + +3105  +REG_VIA_IRB +: + `m_t_modifd + +ic + ); oric-> +v +. + `wre_pt_b +&ic->v, 0xff, +v + ); ; + +3106  +REG_VIA_ORB +: + `m_t_modifd + +ic + ); + `v_wre +&ic-> +v +, +VIA_IORB +, +v + ); ; + +3107  +REG_VIA_DDRB +: + `m_t_modifd + +ic + ); + `v_wre +&ic-> +v +, +VIA_DDRB +, +v + ); ; + +3108  +REG_VIA_T1C +: + `m_t_modifd + +ic + ); oric-> +v +. +t1c + = +v +; ; + +3109  +REG_VIA_CA1 +: + `m_t_modifd + +ic + ); + `v_wre_CA1 +&ic-> +v +, +v + ); ; + +3110  +REG_VIA_CA2 +: + `m_t_modifd + +ic + ); + `v_wre_CA2 +&ic-> +v +, +v + ); ; + +3111  +REG_VIA_CB1 +: + `m_t_modifd + +ic + ); + `v_wre_CB1 +&ic-> +v +, +v + ); ; + +3112  +REG_VIA_CB2 +: + `m_t_modifd + +ic + ); + `v_wre_CB2 +&ic-> +v +, +v + ); ; + +3113  +REG_VIA_T2C +: + `m_t_modifd + +ic + ); oric-> +v +. +t2c + = +v +; ; + +3115  +REG_VIA_T1L +: + +3116 + `m_t_modifd + +ic + ); + +3117 + `v_wre +& +ic +-> +v +, +VIA_T1L_L +, +v +&0xff ); + +3118 + `v_wre +& +ic +-> +v +, +VIA_T1L_H +, ( +v +>>8)&0xff ); + +3121  +REG_VIA_T2L +: + +3122 + `m_t_modifd + +ic + ); + +3123 + `v_wre +& +ic +-> +v +, +VIA_T2C_L +, +v +&0xff ); + +3124 + `v_wre +& +ic +-> +v +, +VIA_T2C_H +, ( +v +>>8)&0xff ); + +3128 * +ednd + = +SDL_TRUE +; + +3129 +updvw + = +SDL_TRUE +; + +3133  +SDL_FALSE +; + +3136 +ϡcmd + = +cmd +[ +i +]; + +3137  +cmd +[ +i ++1] ) + +3142 + `m_e_e + +ic + ); + +3143 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +3147 +de + = +SDL_TRUE +; + +3151 + `m_tf +( "???" ); + +3157 + `m_e_e + +ic + ); + +3158 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +3162 +ϡcmd + = 0; + +3163 +i +++; + +3164  +cmd +[ +i +] ) + +3167 +i +++; + +3168 if! + `m_gnum + +ic +, & +v +, +cmd +, & +i +, +SDL_TRUE +, SDL_TRUE, SDL_TRUE, SDL_TRUE ) ) + +3170 + `m_r +( "Addressxpected" ); + +3174 if! + `m_gnum + +ic +, & +w +, +cmd +, & +i +, +SDL_TRUE +, SDL_TRUE, SDL_TRUE, SDL_TRUE ) ) + +3176 + `m_r +( "Sizexpected" ); + +3180  + `isws + +cmd +[ +i +] ) ) i++; + +3181 if! +cmd +[ +i +] ) + +3183 + `m_r +( "Filenamexpected" ); + +3187 +tmem + = + `mloc + +w + ); + +3188 if! +tmem + ) + +3190 + `m_r +( "Amnesia!" ); + +3194  +j +=0; j< +w +; j++ ) + +3195 +tmem +[ +j +] = + `m_ad + +ic +, +v ++j ); + +3197 +f + = + `fݒ +& +cmd +[ +i +], "wb" ); + +3198 if! +f + ) + +3200 + ` + +tmem + ); + +3201 + `m_tf +"Ubˁݒ '%s'", & +cmd +[ +i +] ); + +3205 + `fwre + +tmem +, +w +, 1, +f + ); + +3206 + `fo + +f + ); + +3207 + ` + +tmem + ); + +3208 + `m_tf +"Wr%d byt'%s'", +w +, & +cmd +[ +i +] ); + +3214 +ϡcmd + = 0; + +3215 +i +++; + +3216 +j + = +cmd +[ +i +]; + +3217  +j + ) + +3221 +i +++; + +3222  + `isws + +cmd +[ +i +] ) ) i++; + +3223 if! +cmd +[ +i +] ) + +3225 + `m_r +( "Filenamexpected" ); + +3229 + `joth +( +th +, & +cmd +[ +i +]); + +3230 i( +j + == 'l') + +3232 i(! + `ld_sh +( +ic +, +fmp +)) + +3233 + `m_tf +("Snapshotoad failed"); + +3235 + `m_tf +("Snapshotoaded"); + +3239 i(! + `ve_sh +( +ic +, +fmp +)) + +3240 + `m_tf +("Snapshot save failed"); + +3242 + `m_tf +("Snapshot saved"); + +3247 + `m_tf +( "???" ); + +3253 +ϡcmd + = +cmd +[ +i +]; + +3254  +hpcou + ) + +3257 + `m_r +( "KEYS:" ); + +3259 + `m_r +( " F2 : Quit Monitor F3 : Toggle Console" ); + +3260 + `m_r +( " F4 : Toggle info F9 : Reset cycles" ); + +3261 + `m_r +( " F10: Step into F11: Step over" ); + +3262 + `m_r +( " F12: Skip inst." ); + +3263 + `m_r +( " " ); + +3264 + `m_r +( "COMMANDS:" ); + +3265 + `m_r +( " - Assemble" ); + +3266 + `m_r +( " bc - Clear breakpoint" ); + +3267 + `m_r +( " bcm - Clear mem breakpoint" ); + +3268 + `m_r +( " bl - List breakpoints" ); + +3269 + `m_r +( " blm - List mem breakpoints" ); + +3270 + `m_r +( " bs [zc] - Set breakpoint/cycles" ); + +3271 + `m_r +( " bsm [rwc] - Set mem breakpoint" ); + +3272 + `m_r +( " bz - Zap breakpoints" ); + +3273 + `m_r +( " bzm - Zap mem breakpoints" ); + +3274 + `m_r +( " d - Disassemble" ); + +3275 + `m_r +( "---- MORE" ); + +3276 +hpcou +++; + +3280 + `m_r +( " df - Disassembleo file" ); + +3281 + `m_r +( " m - Dump memory" ); + +3282 + `m_r +( " mm - Modify memory" ); + +3283 + `m_r +( " mw - Memory watchtddr" ); + +3284 + `m_r +( "l - Load snapshot" ); + +3285 + `m_r +( "s - Save snapshot" ); + +3286 + `m_r +( " - Set o " ); + +3287 + `m_r +( " q, x or qm - Quit monitor" ); + +3288 + `m_r +( " qe - Quitmulator" ); + +3289 + `m_r +( " sa - Add or move user sym." ); + +3290 + `m_r +( " sk - Kill user symbol" ); + +3291 + `m_r +( " sc - Symbolsot case-sens." ); + +3292 + `m_r +( " sC - Symbols case-sensitive" ); + +3293 + `m_r +( " sl - Load user symbols" ); + +3294 + `m_r +( " sx - Export user symbols" ); + +3295 + `m_r +( " sz - Zap user symbols" ); + +3296 + `m_r +( " wm - Write memo disk" ); + +3297 +hpcou + = 0; + +3298 +ϡcmd + = 0; + +3304 +ϡcmd + = 0; + +3305 + `m_tf +( "???" ); + +3309  +de +; + +3310 + } +} + +3312 +SDL_bo + + $m_do_cmd +* +cmd +,  +mache + * +ic +, +SDL_bo + * +ednd + ) + +3314  +i +; + +3315 +SDL_bo + +t +; + +3317 + `m_hide_curs +(); + +3318  +i +=2; i<49; i++ +tz +[ +TZ_MONITOR +]-> +tx +[50*19+i] = 32; + +3319 + `tzos + +tz +[ +TZ_MONITOR +], 2, 19, +cmd + ); + +3320 + `tztc + +tz +[ +TZ_MONITOR +], 2, 3 ); + +3321 +t + = + `m_cmd + +cmd +, +ic +, +ednd + ); + +3322 + `m_t_put +(); + +3323 + `m_show_curs +(); + +3324  +t +; + +3325 + } +} + +3327  + $m_wre_ibuf +( ) + +3329  +ibtmp +[ +CONS_WIDTH ++1]; + +3331 + `y + +ibtmp +, & +ibuf +[ +off +], +CONS_WIDTH + ); + +3332 +ibtmp +[ +CONS_WIDTH +] = 0; + +3334 + `tzos + +tz +[ +TZ_MONITOR +], 1, 19, +off + > 0 ? "\x16" : "]" ); + +3335 + `tzos + +tz +[ +TZ_MONITOR +], 2, 19, +ibtmp + ); + +3336 if + ` +& +ibuf +[ +off +] ) > +CONS_WIDTH + ) + +3338 + `tzos + +tz +[ +TZ_MONITOR +], 2+ +CONS_WIDTH +, 19, "\x16" ); + +3340 + `tzr + +tz +[ +TZ_MONITOR +], " " ); + +3341 + `tzos + +tz +[ +TZ_MONITOR +], 2+ +CONS_WIDTH +, 19, " " ); + +3343 + } +} + +3345  + $m_wre_ibuf_asm +( ) + +3347  +ibtmp +[ +CONS_WIDTH ++1]; + +3349 + `y + +ibtmp +, +ibuf +, +CONS_WIDTH + ); + +3350 +ibtmp +[ +CONS_WIDTH +] = 0; + +3352 + `tzos + +tz +[ +TZ_MONITOR +], 8, 19, +ibtmp + ); + +3353 + `tzr + +tz +[ +TZ_MONITOR +], " " ); + +3354 + } +} + +3356  + $m_t_curs_to_d +( ) + +3358 +cursx + = + +; + +3359 +off + = + +- +CONS_WIDTH +; + +3360 if +off + < 0 ) iloff = 0; + +3361 + } +} + +3363  + $m_t_off +( ) + +3365 if +cursx + < +off + ) iloff = cursx; + +3366 if +cursx + >( +off ++ +CONS_WIDTH +) ) iloff = cursx-CONS_WIDTH; + +3367 if +off + < 0 ) iloff =0; + +3368 + } +} + +3384  +SDL_bo + + $m_decodeݔd + +mache + * +ic +, * +r +, * +ty +, * +v + ) + +3386  +i +; + +3387  +v +; + +3389 +i +=0; + +3390  + `isws + +r +[ +i +] ) ) i++; + +3393 if +r +[ +i +] == 0 ) + +3395 (* +ty + +AM_IMP +; + +3396  +SDL_TRUE +; + +3400 if +r +[ +i +] == '#' ) + +3402 +i +++; + +3403 if! + `m_gnum + +ic +, & +v +, +r +, & +i +, +SDL_FALSE +, SDL_FALSE, SDL_FALSE, +SDL_TRUE + ) ) + +3404  +SDL_FALSE +; + +3405 (* +ty + +AM_IMM +; + +3406 (* +v + +v +; + +3407  +SDL_TRUE +; + +3411 if +r +[ +i +] == '(' ) + +3413 +i +++; + +3414 if! + `m_gnum + +ic +, & +v +, +r +, & +i +, +SDL_TRUE +, SDL_TRUE, +SDL_FALSE +, SDL_TRUE ) ) + +3415  +SDL_FALSE +; + +3417 if + `cmp +& +r +[ +i +], ",X)", 3 ) == 0 ) + +3419 (* +ty + +AM_ZIX +; + +3420 (* +v + +v +&0xff; + +3421  +SDL_TRUE +; + +3424 if + `cmp +& +r +[ +i +], "),Y", 3 ) == 0 ) + +3426 (* +ty + +AM_ZIY +; + +3427 (* +v + +v +&0xff; + +3428  +SDL_TRUE +; + +3431 if +r +[ +i +] == ')' ) + +3433 (* +ty + +AM_IND +; + +3434 (* +v + +v +; + +3435  +SDL_TRUE +; + +3438  +SDL_FALSE +; + +3441 if! + `m_gnum + +ic +, & +v +, +r +, & +i +, +SDL_TRUE +, SDL_TRUE, +SDL_FALSE +, SDL_TRUE ) ) + +3442  +SDL_FALSE +; + +3444 if + `cmp +& +r +[ +i +], ",X", 2 ) == 0 ) + +3446 (* +ty + +AM_ABX +; + +3447 (* +v + +v +; + +3448  +SDL_TRUE +; + +3451 if + `cmp +& +r +[ +i +], ",Y", 2 ) == 0 ) + +3453 (* +ty + +AM_ABY +; + +3454 (* +v + +v +; + +3455  +SDL_TRUE +; + +3458 (* +ty + +AM_ABS +; + +3459 (* +v + +v +; + +3460  +SDL_TRUE +; + +3461 + } +} + +3463  +SDL_bo + + $m_asmb_le + +mache + * +ic + ) + +3465  +i +, +j +, +addsym +, +amode +; + +3466  +v +; + +3468 +i +=0; + +3469  + `isws + +ibuf +[ +i +] ) ) i++; + +3471 if +ibuf +[ +i +] =0 )  +SDL_TRUE +; + +3474 +j + = +i +; + +3475 +addsym + = -1; + +3476 if + `issymt + +ibuf +[ +j +] ) ) + +3478  + `issymch + +ibuf +[ +j +] ) ) j++; + +3479 if +ibuf +[ +j +] == ':' ) + +3481 +addsym + = +i +; + +3482 +i + = +j ++1; + +3483  + `isws + +ibuf +[ +i +] ) ) i++; + +3487  +j +=0; +asmb +[j]. +me +; j++ ) + +3489 if + `cmp + +asmb +[ +j +]. +me +, & +ibuf +[ +i +], 3 ) == 0 ) + +3493 if! +asmb +[ +j +]. +me + ) + +3495 + `m_rtf +" %04X %c%c% ??? ", +m_addr +, +ibuf +[ +i +], ibuf[i+1], ibuf[i+2] ); + +3496  +SDL_FALSE +; + +3499 +i + += 3; + +3500 if! + `m_decodeݔd + +ic +, & +ibuf +[ +i +], & +amode +, & +v + ) ) + +3502 + `m_r +( "Illegal operand" ); + +3503  +SDL_FALSE +; + +3506  +amode + ) + +3508  +AM_IMP +: + +3509 if +asmb +[ +j +]. +imp + =-1 ) { + `m_r +"Ondxed" );  +SDL_FALSE +; } + +3510 + `m_t_modifd + +ic + ); + +3511 +ic +-> +u +. + `wre +&ic->u, +m_addr +, +asmb +[ +j +]. +imp + ); + +3514  +AM_IMM +: + +3515 if +asmb +[ +j +]. +imm + =-1 ) { + `m_r +"Ieg ond" );  +SDL_FALSE +; } + +3516 + `m_t_modifd + +ic + ); + +3517 +ic +-> +u +. + `wre +&ic->u, +m_addr +, +asmb +[ +j +]. +imm + ); + +3518 +ic +-> +u +. + `wre +&ic->u, +m_addr ++1, +v + ); + +3521  +AM_ABS +: + +3522 if +asmb +[ +j +]. +l + != -1 ) + +3524 +i + = (() +v +)-(()( +m_addr ++2)); + +3525 if +i + < -128 ) || ( i > 127 ) ) + +3527 + `m_r +( "Branch out ofange" ); + +3528  +SDL_FALSE +; + +3530 + `m_t_modifd + +ic + ); + +3531 +ic +-> +u +. + `wre +&ic->u, +m_addr +, +asmb +[ +j +]. +l + ); + +3532 +ic +-> +u +. + `wre +&ic->u, +m_addr ++1, +i +&0xff ); + +3536 if +asmb +[ +j +]. +zp + !-1 ) && ( ( +v +&0xff00)==0 ) ) + +3538 + `m_t_modifd + +ic + ); + +3539 +ic +-> +u +. + `wre +&ic->u, +m_addr +, +asmb +[ +j +]. +zp + ); + +3540 +ic +-> +u +. + `wre +&ic->u, +m_addr ++1, +v + ); + +3544 if +asmb +[ +j +]. +abs + =-1 ) { + `m_r +"Ieg ond" );  +SDL_FALSE +; } + +3545 + `m_t_modifd + +ic + ); + +3546 +ic +-> +u +. + `wre +&ic->u, +m_addr +, +asmb +[ +j +]. +abs + ); + +3547 +ic +-> +u +. + `wre +&ic->u, +m_addr ++1, +v +&0xff ); + +3548 +ic +-> +u +. + `wre +&ic->u, +m_addr ++2, ( +v +>>8)&0xff ); + +3551  +AM_IND +: + +3552 if +asmb +[ +j +]. +d + =-1 ) { + `m_r +"Ieg ond" );  +SDL_FALSE +; } + +3553 + `m_t_modifd + +ic + ); + +3554 +ic +-> +u +. + `wre +&ic->u, +m_addr +, +asmb +[ +j +]. +d + ); + +3555 +ic +-> +u +. + `wre +&ic->u, +m_addr ++1, +v +&0xff ); + +3556 +ic +-> +u +. + `wre +&ic->u, +m_addr ++2, ( +v +>>8)&0xff ); + +3559  +AM_ZPX +: + +3560 if +asmb +[ +j +]. +zpx + =-1 ) { + `m_r +"Ieg ond" );  +SDL_FALSE +; } + +3561 + `m_t_modifd + +ic + ); + +3562 +ic +-> +u +. + `wre +&ic->u, +m_addr +, +asmb +[ +j +]. +zpx + ); + +3563 +ic +-> +u +. + `wre +&ic->u, +m_addr ++1, +v + ); + +3566  +AM_ZPY +: + +3567 if +asmb +[ +j +]. +zpy + =-1 ) { + `m_r +"Ieg ond" );  +SDL_FALSE +; } + +3568 + `m_t_modifd + +ic + ); + +3569 +ic +-> +u +. + `wre +&ic->u, +m_addr +, +asmb +[ +j +]. +zpy + ); + +3570 +ic +-> +u +. + `wre +&ic->u, +m_addr ++1, +v + ); + +3573  +AM_ZIX +: + +3574 if +asmb +[ +j +]. +zix + =-1 ) { + `m_r +"Ieg ond" );  +SDL_FALSE +; } + +3575 + `m_t_modifd + +ic + ); + +3576 +ic +-> +u +. + `wre +&ic->u, +m_addr +, +asmb +[ +j +]. +zix + ); + +3577 +ic +-> +u +. + `wre +&ic->u, +m_addr ++1, +v + ); + +3580  +AM_ZIY +: + +3581 if +asmb +[ +j +]. +ziy + =-1 ) { + `m_r +"Ieg ond" );  +SDL_FALSE +; } + +3582 + `m_t_modifd + +ic + ); + +3583 +ic +-> +u +. + `wre +&ic->u, +m_addr +, +asmb +[ +j +]. +ziy + ); + +3584 +ic +-> +u +. + `wre +&ic->u, +m_addr ++1, +v + ); + +3587  +AM_ABX +: + +3588 if +asmb +[ +j +]. +zpx + !-1 ) && ( ( +v +&0xff00)==0 ) ) + +3590 + `m_t_modifd + +ic + ); + +3591 +ic +-> +u +. + `wre +&ic->u, +m_addr +, +asmb +[ +j +]. +zpx + ); + +3592 +ic +-> +u +. + `wre +&ic->u, +m_addr ++1, +v + ); + +3596 if +asmb +[ +j +]. +abx + =-1 ) { + `m_r +"Ieg ond" );  +SDL_FALSE +; } + +3597 + `m_t_modifd + +ic + ); + +3598 +ic +-> +u +. + `wre +&ic->u, +m_addr +, +asmb +[ +j +]. +abx + ); + +3599 +ic +-> +u +. + `wre +&ic->u, +m_addr ++1, +v +&0xff ); + +3600 +ic +-> +u +. + `wre +&ic->u, +m_addr ++2, ( +v +>>8)&0xff ); + +3603  +AM_ABY +: + +3604 if +asmb +[ +j +]. +zpy + !-1 ) && ( ( +v +&0xff00)==0 ) ) + +3606 + `m_t_modifd + +ic + ); + +3607 +ic +-> +u +. + `wre +&ic->u, +m_addr +, +asmb +[ +j +]. +zpy + ); + +3608 +ic +-> +u +. + `wre +&ic->u, +m_addr ++1, +v + ); + +3612 if +asmb +[ +j +]. +aby + =-1 ) { + `m_r +"Ieg ond" );  +SDL_FALSE +; } + +3613 + `m_t_modifd + +ic + ); + +3614 +ic +-> +u +. + `wre +&ic->u, +m_addr +, +asmb +[ +j +]. +aby + ); + +3615 +ic +-> +u +. + `wre +&ic->u, +m_addr ++1, +v +&0xff ); + +3616 +ic +-> +u +. + `wre +&ic->u, +m_addr ++2, ( +v +>>8)&0xff ); + +3620 if +addsym + != -1 ) + +3621 + `m_a__add_symb +& +ic +-> +ursyms +, oric, & +ibuf +[ +addsym +], +SYM_BESTGUESS +, +m_addr + ); + +3623 + `m_rtf + + `m_dismb + +ic +, & +m_addr +, +NULL +, +SDL_FALSE + ) ); + +3624  +SDL_FALSE +; + +3625 + } +} + +3627  +SDL_bo + + $m_cse_keydown + +SDL_Evt + * +ev +,  +mache + * +ic +, +SDL_bo + * +ednd + ) + +3629  +i +; + +3630 +SDL_bo + +de +; + +3632 +de + = +SDL_FALSE +; + +3634 if +m_asmmode + ) + +3636  +ev +-> +key +. +keysym +. +sym + ) + +3638  +SDLK_LEFT +: + +3639 if +cursx + > 0 ) + +3641 + `m_hide_curs +(); + +3642 +cursx +--; + +3643 + `m_wre_ibuf_asm +(); + +3644 + `m_show_curs +(); + +3645 * +ednd + = +SDL_TRUE +; + +3649  +SDLK_RIGHT +: + +3650 if +cursx + < + + ) + +3652 + `m_hide_curs +(); + +3653 +cursx +++; + +3654 + `m_wre_ibuf_asm +(); + +3655 + `m_show_curs +(); + +3656 * +ednd + = +SDL_TRUE +; + +3660  +SDLK_BACKSPACE +: + +3661 if +cursx + > 0 ) + +3663 + `m_hide_curs +(); + +3664  +i += +cursx +-1; i< + +; i++ ) + +3665 +ibuf +[ +i +] = ibuf[i+1]; + +3666 +cursx +--; + +3667 + + = () + ` + +ibuf + ); + +3668 + `m_t_off +(); + +3669 + `m_wre_ibuf_asm +(); + +3670 + `m_show_curs +(); + +3671 * +ednd + = +SDL_TRUE +; + +3675  +SDLK_RETURN +: + +3676  +SDLK_KP_ENTER +: + +3677 + `m_hide_curs +(); + +3678 +ibuf +[ + +] = 0; + +3680 if + `m_asmb_le + +ic + ) ) + +3682 +m_asmmode + = +SDL_FALSE +; + +3683 + `m_t_put +(); + +3684 + `m_show_curs +(); + +3685 * +ednd + = +SDL_TRUE +; + +3686 +updvw + = +SDL_TRUE +; + +3690 + `m_t_put +(); + +3691 + `m_show_curs +(); + +3692 * +ednd + = +SDL_TRUE +; + +3693 +updvw + = +SDL_TRUE +; + +3700  + `SDL_COMPAT_GKeysymUnicode + +ev +-> +key +. +keysym + ) ) + +3703 if + `SDL_COMPAT_GKeysymUnicode + +ev +-> +key +. +keysym + ) > 31 ) && ( SDL_COMPAT_GetKeysymUnicode(v->key.keysym ) < 127 ) ) + +3705 if + + > +MAX_ASM_INPUT + ) ; + +3707 + `m_hide_curs +(); + +3708  +i += + ++1; i> +cursx +; i-- ) + +3709 +ibuf +[ +i +] = ibuf[i-1]; + +3710 +ibuf +[ +cursx +] = + `SDL_COMPAT_TneUnicode + +ev +-> +key +. +keysym + ); + +3711 +cursx +++; + +3712 + +++; + +3713 + `m_wre_ibuf_asm +(); + +3714 + `m_show_curs +(); + +3715 * +ednd + = +SDL_TRUE +; + +3719  +de +; + +3722  +ev +-> +key +. +keysym +. +sym + ) + +3724  +SDLK_UP +: + +3725 if +hip + >( +hiu +-1) ) ; + +3726 + `m_hide_curs +(); + +3727 + `ry + +ibuf +, & +hiy +[++ +hip +][0] ); + +3728 + + = () + ` + +ibuf + ); + +3729 + `m_t_curs_to_d +(); + +3730 + `m_t_off +(); + +3731 + `tzos + +tz +[ +TZ_MONITOR +], 2, 19, " " ); + +3732 + `m_wre_ibuf +(); + +3733 + `m_show_curs +(); + +3734 * +ednd + = +SDL_TRUE +; + +3737  +SDLK_DOWN +: + +3738 + `m_hide_curs +(); + +3739 if +hip + <= 0 ) + +3741 +hip + = -1; + +3742 +ibuf +[0] = 0; + +3743 + + = 0; + +3744 +off + = 0; + +3745 +cursx + = 0; + +3747 + `ry + +ibuf +, & +hiy +[-- +hip +][0] ); + +3748 + `m_t_curs_to_d +(); + +3749 + `m_t_off +(); + +3751 + `tzos + +tz +[ +TZ_MONITOR +], 2, 19, " " ); + +3752 + `m_wre_ibuf +(); + +3753 + `m_show_curs +(); + +3754 * +ednd + = +SDL_TRUE +; + +3757  +SDLK_LEFT +: + +3758 if +cursx + > 0 ) + +3760 + `m_hide_curs +(); + +3761 +cursx +--; + +3762 + `m_t_off +(); + +3763 + `m_wre_ibuf +(); + +3764 + `m_show_curs +(); + +3765 * +ednd + = +SDL_TRUE +; + +3769  +SDLK_RIGHT +: + +3770 if +cursx + < + + ) + +3772 + `m_hide_curs +(); + +3773 +cursx +++; + +3774 + `m_t_off +(); + +3775 + `m_wre_ibuf +(); + +3776 + `m_show_curs +(); + +3777 * +ednd + = +SDL_TRUE +; + +3784  +SDLK_BACKSPACE +: + +3785 if +cursx + > 0 ) + +3787 + `m_hide_curs +(); + +3788  +i += +cursx +-1; i< + +; i++ ) + +3789 +ibuf +[ +i +] = ibuf[i+1]; + +3790 +cursx +--; + +3791 + + = () + ` + +ibuf + ); + +3792 + `m_t_off +(); + +3793 + `m_wre_ibuf +(); + +3794 + `m_show_curs +(); + +3795 * +ednd + = +SDL_TRUE +; + +3799  +SDLK_RETURN +: + +3800  +SDLK_KP_ENTER +: + +3801 + `m_hide_curs +(); + +3802 +ibuf +[ + +] = 0; + +3803 if + + == 0 ) + +3805  +ϡcmd + ) + +3810 +ibuf +[ +cursx +++] = +ϡcmd +; + +3811 +ibuf +[ +cursx +] = 0; + +3812 + + = 1; + +3816 if +hiu + > 0 ) && ( + `rcmp +& +hiy +[0][0], +ibuf + ) == 0 ) ) + +3819 if +hiu + > 0 ) + +3821  +i += +hiu +; i>0; i-- ) + +3822 + `ry +& +hiy +[ +i +][0], &history[i-1][0] ); + +3825 + `ry +& +hiy +[0][0], +ibuf + ); + +3826 if +hiu + < 10 ) histu++; + +3829 +hip + = -1; + +3831 + `tztc + +tz +[ +TZ_MONITOR +], 2, 3 ); + +3832 +de + | + `m_cmd + +ibuf +, +ic +, +ednd + ); + +3833 + `m_t_put +(); + +3834 + `m_show_curs +(); + +3835 * +ednd + = +SDL_TRUE +; + +3839  + `SDL_COMPAT_GKeysymUnicode + +ev +-> +key +. +keysym + ) ) + +3842 if + `SDL_COMPAT_GKeysymUnicode + +ev +-> +key +. +keysym + ) > 31 ) && ( SDL_COMPAT_GetKeysymUnicode(v->key.keysym ) < 127 ) ) + +3844 if + + > +MAX_CONS_INPUT + ) ; + +3846 + `m_hide_curs +(); + +3847  +i += + ++1; i> +cursx +; i-- ) + +3848 +ibuf +[ +i +] = ibuf[i-1]; + +3849 +ibuf +[ +cursx +] = + `SDL_COMPAT_TneUnicode + +ev +-> +key +. +keysym + ); + +3850 +cursx +++; + +3851 + +++; + +3852 + `m_t_off +(); + +3853 + `m_wre_ibuf +(); + +3854 + `m_show_curs +(); + +3855 * +ednd + = +SDL_TRUE +; + +3859  +de +; + +3860 + } +} + +3862  +SDL_bo + + $m_mwch_keydown + +SDL_Evt + * +ev +,  +mache + * +ic +, +SDL_bo + * +ednd + ) + +3864 +SDL_bo + +de +; + +3865  +v +; + +3866  +i +, +ge +; + +3868 +ge + = +mw_l + ? 8*8 : 8*18; + +3870 +de + = +SDL_FALSE +; + +3871  +ev +-> +key +. +keysym +. +sym + ) + +3873  +SDLK_UP +: + +3874 +mw_addr +[ +mw_which +] - +kshied + ? +ge + : 8; + +3875 * +ednd + = +SDL_TRUE +; + +3878  +SDLK_DOWN +: + +3879 +mw_addr +[ +mw_which +] + +kshied + ? +ge + : 8; + +3880 * +ednd + = +SDL_TRUE +; + +3883  +SDLK_PAGEUP +: + +3884 +mw_addr +[ +mw_which +] - +ge +; + +3885 * +ednd + = +SDL_TRUE +; + +3888  +SDLK_PAGEDOWN +: + +3889 +mw_addr +[ +mw_which +] + +ge +; + +3890 * +ednd + = +SDL_TRUE +; + +3893  +SDLK_RETURN +: + +3894  +SDLK_KP_ENTER +: + +3895 if +mw_mode + != 1 ) ; + +3896 +mw_ibuf +[5] = 0; + +3897 +mw_mode + = 0; + +3898 +i + = 0; + +3899 if + `m_gnum + +ic +, & +v +, +mw_ibuf +, & +i +, +SDL_FALSE +, SDL_FALSE, SDL_FALSE, SDL_FALSE ) ) + +3900 +mw_addr +[ +mw_which +] = +v +; + +3901 * +ednd + = +SDL_TRUE +; + +3904  +SDLK_ESCAPE +: + +3905 +mw_mode + = 0; + +3906 * +ednd + = +SDL_TRUE +; + +3909  +SDLK_BACKSPACE +: + +3910 if +mw_mode + != 1 ) ; + +3911 if +mw_koffs + <= 0 ) ; + +3912 +mw_ibuf +[ +mw_koffs +--] = 0; + +3913 * +ednd + = +SDL_TRUE +; + +3916  +SDLK_s +: + +3917 if +mw_mode + != 0 ) ; + +3918 +mw_l + = !mw_split; + +3919 if! +mw_l + ) && ( +mw_which + != 0 ) ) + +3920 +mw_which + = 0; + +3921 * +ednd + = +SDL_TRUE +; + +3924  +SDLK_TAB +: + +3925 if! +mw_l + ) ; + +3926 if +mw_mode + != 0 ) mw_mode = 0; + +3927 +mw_which + ^= 1; + +3928 * +ednd + = +SDL_TRUE +; + +3935 if + `ishex + + `SDL_COMPAT_GKeysymUnicode + +ev +-> +key +. +keysym + ) ) ) + +3937 if +mw_mode + != 1 ) + +3939 +mw_mode + = 1; + +3940 +mw_ibuf +[0] = '$'; + +3941 +mw_ibuf +[1] = 0; + +3942 +mw_koffs + = 0; + +3945 if +mw_koffs + < 4 ) + +3947 +mw_ibuf +[++ +mw_koffs +] = + `SDL_COMPAT_TneUnicode + +ev +-> +key +. +keysym + ); + +3948 +mw_ibuf +[ +mw_koffs ++1] = 0; + +3951 * +ednd + = +SDL_TRUE +; + +3954  +de +; + +3955 + } +} + +3957  + $py_ + +mache + * +ic + ) + +3959 + `m6502_t_icyes +& +ic +-> +u +, +SDL_FALSE +, +m_bpmsg + ); + +3960 + `_tches + +ic + ); + +3961 + `v_ock +& +ic +-> +v +, oric-> +u +. +icyes + ); + +3962 + `ay_ticktock +& +ic +-> +ay +, oric-> +u +. +icyes + ); + +3963 if(( +ic +-> +drivy + = +DRV_MICRODISC +|| (ic->drivy = +DRV_JASMIN +) + `wd17xx_ticktock +&ic-> +wddisk +, oric-> +u +. +icyes + ); + +3964 if +ic +-> +ty + = +MACH_TELESTRAT + ) + +3966 + `v_ock +& +ic +-> +_v +, oric-> +u +. +icyes + ); + +3968 if +ic +-> +acbackd + ) + +3969 + `ac_ock +& +ic +-> +_ac +, oric-> +u +. +icyes + ); + +3971 +ic +-> +u +. +cyes + -ic->u. +icyes +; + +3972 + `m6502_ +& +ic +-> +u + ); + +3974 if +ic +-> +u +. +cyes + <= 0 ) + +3976 + `u_da + +ic + ); + +3977 +ic +-> +u +. +cyes + +ic-> +cye +; + +3980 if +m_bpmsg +[0] ) + +3982 + `m_tf_above + +m_bpmsg + ); + +3983 +m_bpmsg +[0] = 0; + +3987  +ic +-> +u +. +icyes +; + +3988 + } +} + +3990  +SDL_bo + + $ickze + +xtze + * +tz +, * +tx +, * +ty +, +SDL_bo + * +dblk + ) + +3992  +dx +, +dy +; + +3994 if! + `_xtze + +tz +, +ick +[0]. +x +,eick[0]. +y + ) ) + +3995  +SDL_FALSE +; + +3997 * +tx + = ( +ick +[0]. +x + - +tz +->x) / 8; + +3998 * +ty + = ( +ick +[0]. +y + - +tz +->y) / 12; + +4000 +dx + = ( +ick +[1]. +x + - +tz +->x) / 8; + +4001 +dy + = ( +ick +[1]. +y + - +tz +->y) / 12; + +4003 if(* +tx += +dx + ) && ( (* +ty += +dy + ) && ( ( +ick +[0]. +time +-leftclick[1].time) < 1000 ) ) + +4005 * +dblk + = +SDL_TRUE +; + +4008 +ick +[0]. +time + = -1; + +4010 * +dblk + = +SDL_FALSE +; + +4013  +SDL_TRUE +; + +4014 + } +} + +4016 +SDL_bo + + $m_evt + +SDL_Evt + * +ev +,  +mache + * +ic +, +SDL_bo + * +ednd + ) + +4018 +SDL_bo + +de +; + +4019 +SDL_bo + +dkey +; + +4021 +de + = +SDL_FALSE +; + +4022 +dkey + = +SDL_FALSE +; + +4023  +ev +-> +ty + ) + +4025  +SDL_COMPAT_ACTIVEEVENT +: + +4026 if( + `SDL_COMPAT_IsAFocud +( +ev +)) { + +4027 * +ednd + = +SDL_TRUE +; + +4031  +SDL_MOUSEBUTTONDOWN +: + +4033  +tx +, +ty +; + +4034 +SDL_bo + +dblk +; + +4036 +ick +[1] =eftclick[0]; + +4037 +ick +[0]. +x + = +ev +-> +bu +.x; + +4038 +ick +[0]. +y + = +ev +-> +bu +.y; + +4039 +ick +[0]. +time + = + `SDL_GTicks +(); + +4041 if + `ickze + +tz +[ +TZ_REGS +], & +tx +, & +ty +, & +dblk + ) ) + +4043 + `m_ick_gs + +ic +, +ednd +, +tx +, +ty +, +dblk + ); + +4048  +SDL_KEYUP +: + +4049  +ev +-> +key +. +keysym +. +sym + ) + +4051  +SDLK_F9 +: + +4052 +ic +-> +u +. +cyes + = 0; + +4053 * +ednd + = +SDL_TRUE +; + +4056  +SDLK_LSHIFT +: + +4057  +SDLK_RSHIFT +: + +4058 +kshied + = +SDL_FALSE +; + +4061  +SDLK_F1 +: + +4062 +eshus + = +SDL_TRUE +; + +4063 * +ednd + = +SDL_TRUE +; + +4064 + `m_e_e + +ic + ); + +4065 + `u_t_dty + +ic + ); + +4066 + `mumode + +ic +, +NULL +, +EM_MENU + ); + +4069  +SDLK_F2 +: + +4071 + `m6502_t_icyes +& +ic +-> +u +, +SDL_FALSE +, +m_bpmsg + ); + +4072 + `_tches + +ic + ); + +4073 + `v_ock +& +ic +-> +v +, oric-> +u +. +icyes + ); + +4074 + `ay_ticktock +& +ic +-> +ay +, oric-> +u +. +icyes + ); + +4075 if(( +ic +-> +drivy + = +DRV_MICRODISC +|| (ic->drivy = +DRV_JASMIN +) + `wd17xx_ticktock +&ic-> +wddisk +, oric-> +u +. +icyes + ); + +4076 if +ic +-> +ty + = +MACH_TELESTRAT + ) + +4078 + `v_ock +& +ic +-> +_v +, oric-> +u +. +icyes + ); + +4080 if +ic +-> +acbackd + ) + +4081 + `ac_ock +& +ic +-> +_ac +, oric-> +u +. +icyes + ); + +4082 +ic +-> +u +. +cyes + -ic->u. +icyes +; + +4083 + `m6502_ +& +ic +-> +u + ); + +4084 if +ic +-> +u +. +cyes + <= 0 ) + +4086 + `u_da + +ic + ); + +4087 +ic +-> +u +. +cyes + +ic-> +cye +; + +4089 * +ednd + = +SDL_TRUE +; + +4090 + `m_e_e + +ic + ); + +4091 + `mumode + +ic +, +NULL +, +EM_RUNNING + ); + +4094  +SDLK_F3 +: + +4095 +cshow + = (cshow+1)% +CSHOW_LAST +; + +4096 * +ednd + = +SDL_TRUE +; + +4099  +SDLK_F4 +: + +4100 +mshow + = (mshow+1)% +MSHOW_LAST +; + +4101 if +mshow + = +MSHOW_VIA2 + ) && ( +ic +-> +ty + ! +MACH_TELESTRAT + ) ) + +4102 +mshow + = (mshow+1)% +MSHOW_LAST +; + +4103 if +ic +-> +drivy + = +DRV_NONE + ) && ( +mshow + = +MSHOW_DISK + ) ) + +4104 +mshow + = (mshow+1)% +MSHOW_LAST +; + +4105 * +ednd + = +SDL_TRUE +; + +4113  +SDL_KEYDOWN +: + +4114  +ev +-> +key +. +keysym +. +sym + ) + +4116  +SDLK_LSHIFT +: + +4117  +SDLK_RSHIFT +: + +4118 +kshied + = +SDL_TRUE +; + +4119 +dkey + = +SDL_TRUE +; + +4122  +SDLK_F10 +: + +4123 if! +kshied + ) + +4125 + `m_e_e + +ic + ); + +4126 + `py_ + +ic + ); + +4127 * +ednd + = +SDL_TRUE +; + +4128 +dkey + = +SDL_TRUE +; + +4132  +SDLK_F11 +: + +4133 if + `m_ad + +ic +, oric-> +u +. +pc + ) == 0x20 ) + +4135 +Ut16 + +wpc +; + +4136  +dticks +; + +4138 +wpc + = +ic +-> +u +. +pc ++3; + +4140 + `m_e_e + +ic + ); + +4141 +dticks + = + `SDL_GTicks +()+5000; + +4142  ( +ic +-> +u +. +pc + ! +wpc + ) && ( + `SDL_GTicks +(< +dticks + ) ) + +4143 + `py_ + +ic + ); + +4145 * +ednd + = +SDL_TRUE +; + +4146 +dkey + = +SDL_TRUE +; + +4150 + `m_e_e + +ic + ); + +4151 + `py_ + +ic + ); + +4152 * +ednd + = +SDL_TRUE +; + +4153 +dkey + = +SDL_TRUE +; + +4156  +SDLK_F12 +: + +4157  +diab +[ + `m_ad + +ic +, oric-> +u +. +pc + )]. +amode + ) + +4159  +AM_IMM +: + +4160  +AM_ZP +: + +4161  +AM_ZPX +: + +4162  +AM_ZPY +: + +4163  +AM_ZIX +: + +4164  +AM_ZIY +: + +4165  +AM_REL +: + +4166 +ic +-> +u +. +pc + += 2; + +4169  +AM_ABS +: + +4170  +AM_ABX +: + +4171  +AM_ABY +: + +4172  +AM_IND +: + +4173 +ic +-> +u +. +pc + += 3; + +4176  +AM_IMP +: + +4178 +ic +-> +u +. +pc +++; + +4181 * +ednd + = +SDL_TRUE +; + +4182 +dkey + = +SDL_TRUE +; + +4189 if! +dkey + ) + +4191  +cshow + ) + +4193  +CSHOW_CONSOLE +: + +4194 +de + | + `m_cse_keydown + +ev +, +ic +, +ednd + ); + +4197  +CSHOW_MWATCH +: + +4198 +de + | + `m_mwch_keydown + +ev +, +ic +, +ednd + ); + +4205  +de +; + +4206 + } +} + +4209 #i +defed +( +DEBUG_CPU_TRACE +) && DEBUG_CPU_TRACE > 0 + +4210  +u_a_y + + gua +[ +DEBUG_CPU_TRACE +], * + gli_t + = +NULL +, * + gli_d +, * + gxt + = NULL; + +4212  + $m_a +( +m6502 + * +u +) + +4214  +mache + * +ic + = (mach*) +u +-> +urda +; + +4216 i(! +li_t +) + +4218  +i +; + +4219 +li_t + = & +ua +[0]; + +4220 +li_d + = & +ua +[ +DEBUG_CPU_TRACE +-1]; + +4221  +i +=0; i< +DEBUG_CPU_TRACE +; i++) + +4223 +ua +[ +i +]. +ev + = (i==0? +NULL + : &cputrace[i-1]; + +4224 +ua +[ +i +]. +xt + = (i==( +DEBUG_CPU_TRACE +-1)? +NULL + : &cputrace[i+1]; + +4226 +xt + = +li_t +; + +4230 i( +xt + = +NULL +) + +4232 +xt + = +li_t +; + +4233 +li_t + =i_t-> +xt +; + +4234 +li_d +-> +xt + =ext; + +4235 +xt +-> +ev + = +li_d +; + +4236 +xt +->x +NULL +; + +4237 +li_t +-> +ev + = +NULL +; + +4238 +li_d + = +xt +; + +4241 +xt +-> +pc + = +u +-> +lc +; + +4242 +xt +-> +a + = +u +->a; + +4243 +xt +-> +x + = +u +->x; + +4244 +xt +-> +y + = +u +->y; + +4245 +xt +-> + + = +u +->sp; + +4246 +xt +-> +ags + = +MAKEFLAGS +; + +4247 +xt +-> + +[0] = + `m_ad +( +ic +, +u +-> +lc +); + +4248 +xt +-> + +[1] = + `m_ad +( +ic +, +u +-> +lc ++1); + +4249 +xt +-> + +[2] = + `m_ad +( +ic +, +u +-> +lc ++2); + +4250 +xt +-> +romdis + = +ic +->romdis; + +4251 if +ic +-> +drivy + = +DRV_JASMIN + ) && ( oric-> +jasm +. +ay + ) ) + +4252 +xt +-> +romdis + = +SDL_FALSE +; + +4253 +xt + =ext->next; + +4254 + } +} + +4256 * + $ua_t + +mache + * +ic +,  +u_a_y + * +e + ) + +4258  +ddr +, +addr +; + +4259  + +, +a1 +, +a2 +; + +4260  +i +; + +4261 * +tmpame +, * +di +; + +4262  +ame +[ +SNAME_LEN ++1]; + +4263  +msym + * +csym +; + +4265 +di + = +dimp +; + +4267 +tmpame + = ""; + +4268 +csym + = + `m_fd_sym_by_addr + +ic +, +e +-> +pc +, &e-> +romdis + ); + +4269 if +csym + ) + +4271 +tmpame + = +csym +-> +me +; + +4273 if + ` + +tmpame + ) > +SNAME_LEN + ) + +4275 + `rtf + +dimp +, "%s\n", +tmpame + ); + +4276 +di + = & +dimp +[ + ` +(distmp)]; + +4277 +tmpame + = ""; + +4281 + `ry + +ame +, +tmpame + ); + +4282  +i += + ` +( +ame +); i< +SNAME_LEN +; i++ ) + +4283 +ame +[ +i +] = 32; + +4284 +ame +[ +i +] = 0; + +4286 +ddr + = +e +-> +pc +; + +4287 + + = +e +-> + +[0]; + +4288 +a1 + = +e +-> + +[1]; + +4289 +a2 + = +e +-> + +[2]; + +4290  +diab +[ + +]. +amode + ) + +4292  +AM_IMP +: + +4293 + `rtf + +di +, "% %04X %02X %s", +ame +, +ddr +, + +, +diab +[]. +me + ); + +4296  +AM_IMM +: + +4297 + `rtf + +di +, "% %04X %02X %02X %#$%02X", +ame +, +ddr +, + +, +a1 +, +diab +[]. +me +,1 ); + +4300  +AM_ZP +: + +4301  +AM_ZPX +: + +4302  +AM_ZPY +: + +4303 +csym + = + `m_fd_sym_by_addr + +ic +, +a1 +, & +e +-> +romdis + ); + +4304 if +csym + ) + +4305 + `rtf + +di +, "% %04X %02X %02X %%s", +ame +, +ddr +, + +, +a1 +, +diab +[]. +me +, +csym +->name ); + +4307 + `rtf + +di +, "% %04X %02X %02X %$%02X", +ame +, +ddr +, + +, +a1 +, +diab +[]. +me +,1 ); + +4308 if +diab +[ + +]. +amode + = +AM_ZP + ) ; + +4309 + `rt + +di +, +diab +[ + +]. +amode + = +AM_ZPX + ? ",X" : ",Y" ); + +4312  +AM_ABS +: + +4313  +AM_ABX +: + +4314  +AM_ABY +: + +4315 +csym + = + `m_fd_sym_by_addr + +ic +, ( +a2 +<<8)| +a1 +, & +e +-> +romdis + ); + +4316 if +csym + ) + +4317 + `rtf + +di +, "% %04X %02X %02X %02X %%s", +ame +, +ddr +, + +, +a1 +, +a2 +, +diab +[]. +me +, +csym +->name ); + +4319 + `rtf + +di +, "% %04X %02X %02X %02X %$%02X%02X", +ame +, +ddr +, + +, +a1 +, +a2 +, +diab +[]. +me +,2,1 ); + +4320 if +diab +[ + +]. +amode + = +AM_ABS + ) ; + +4321 + `rt + +di +, +diab +[ + +]. +amode + = +AM_ABX + ? ",X" : ",Y" ); + +4324  +AM_ZIX +: + +4325 +csym + = + `m_fd_sym_by_addr + +ic +, +a1 +, & +e +-> +romdis + ); + +4326 if +csym + ) + +4327 + `rtf + +di +, "% %04X %02X %02X %(%s,X)", +ame +, +ddr +, + +, +a1 +, +diab +[]. +me +, +csym +->name ); + +4329 + `rtf + +di +, "% %04X %02X %02X %($%02X,X)", +ame +, +ddr +, + +, +a1 +, +diab +[]. +me +,1 ); + +4332  +AM_ZIY +: + +4333 +csym + = + `m_fd_sym_by_addr + +ic +, +a1 +, & +e +-> +romdis + ); + +4334 if +csym + ) + +4335 + `rtf + +di +, "% %04X %02X %02X %(%s),Y", +ame +, +ddr +, + +, +a1 +, +diab +[]. +me +, +csym +->name ); + +4337 + `rtf + +di +, "% %04X %02X %02X %($%02X),Y", +ame +, +ddr +, + +, +a1 +, +diab +[]. +me +,1 ); + +4340  +AM_REL +: + +4341 +addr + = (( +e +-> +pc ++2)+((sigd ) +a1 +))&0xffff; + +4342 +csym + = + `m_fd_sym_by_addr + +ic +, +addr +, & +e +-> +romdis + ); + +4343 if +csym + ) + +4344 + `rtf + +di +, "% %04X %02X %02X %%s", +ame +, +ddr +, + +, +a1 +, +diab +[]. +me +, +csym +->name ); + +4346 + `rtf + +di +, "% %04X %02X %02X %$%04X", +ame +, +ddr +, + +, +a1 +, +diab +[]. +me +, +addr + ); + +4349  +AM_IND +: + +4350 +csym + = + `m_fd_sym_by_addr + +ic +, ( +a2 +<<8)| +a1 +, & +e +-> +romdis + ); + +4351 if +csym + ) + +4352 + `rtf + +di +, "% %04X %02X %02X %02X %(%s)", +ame +, +ddr +, + +, +a1 +, +a2 +, +diab +[]. +me +, +csym +->name ); + +4354 + `rtf + +di +, "% %04X %02X %02X %02X %($%02X%02X)", +ame +, +ddr +, + +, +a1 +, +a2 +, +diab +[]. +me +,2,1 ); + +4358 + `ry + +di +, " WTF?" ); + +4362  +i += + ` +( +di +); i<60; i++ ) + +4363 +di +[ +i +] = 32; + +4364 +di +[ +i +] = 0; + +4366 + `rtf +(& +di +[60], "%c%c-%c%c%c%c%c A=%02X X=%02X Y=%02X SP=%04X ROMDIS=%d", + +4367 ( +e +-> +ags +&0x80) ? 'N' : '-', + +4368 ( +e +-> +ags +&0x40) ? 'V' : '-', + +4369 ( +e +-> +ags +&0x10) ? 'B' : '-', + +4370 ( +e +-> +ags +&0x08) ? 'D' : '-', + +4371 ( +e +-> +ags +&0x04) ? 'I' : '-', + +4372 ( +e +-> +ags +&0x02) ? 'Z' : '-', + +4373 ( +e +-> +ags +&0x01) ? 'C' : '-', + +4374 +e +-> +a +, + +4375 +e +-> +x +, + +4376 +e +-> +y +, + +4377 +e +-> + ++0x100, + +4378 +e +-> +romdis +); + +4380  +dimp +; + +4381 + } +} + +4383  + $dump_ua +( +mache + * +ic +) + +4385  +u_a_y + * + + = +li_t +; + +4387  + + ! +xt +) + +4389 + `tf +("%s\n", + `ua_t +( +ic +, + +)); + +4390 + + = ir-> +xt +; + +4392 + } +} + + @monitor.h + +22  + #SNAME_LEN + 11 + +23  + #SSNAME_LEN + ( +SNAME_LEN +-3) + +24 + + ) + +25  + #SYMB_ROMDIS0 + 0 + + ) + +26  + #SYMF_ROMDIS0 + (1<< +SYMB_ROMDIS0 +) + + ) + +27  + #SYMB_ROMDIS1 + 1 + + ) + +28  + #SYMF_ROMDIS1 + (1<< +SYMB_ROMDIS1 +) + + ) + +29  + #SYMB_MICRODISC + 2 + + ) + +30  + #SYMF_MICRODISC + (1<< +SYMB_MICRODISC +) + + ) + +31  + #SYMB_JASMIN + 3 + + ) + +32  + #SYMF_JASMIN + (1<< +SYMB_JASMIN +) + + ) + +33  + #SYMB_TELEBANK0 + 4 + + ) + +34  + #SYMF_TELEBANK0 + (1<< +SYMB_TELEBANK0 +) + + ) + +35  + #SYMB_TELEBANK1 + 5 + + ) + +36  + #SYMF_TELEBANK1 + (1<< +SYMB_TELEBANK1 +) + + ) + +37  + #SYMB_TELEBANK2 + 6 + + ) + +38  + #SYMF_TELEBANK2 + (1<< +SYMB_TELEBANK2 +) + + ) + +39  + #SYMB_TELEBANK3 + 7 + + ) + +40  + #SYMF_TELEBANK3 + (1<< +SYMB_TELEBANK3 +) + + ) + +41  + #SYMB_TELEBANK4 + 8 + + ) + +42  + #SYMF_TELEBANK4 + (1<< +SYMB_TELEBANK4 +) + + ) + +43  + #SYMB_TELEBANK5 + 9 + + ) + +44  + #SYMF_TELEBANK5 + (1<< +SYMB_TELEBANK5 +) + + ) + +45  + #SYMB_TELEBANK6 + 10 + + ) + +46  + #SYMF_TELEBANK6 + (1<< +SYMB_TELEBANK6 +) + + ) + +47  + #SYMB_TELEBANK7 + 11 + + ) + +48  + #SYMF_TELEBANK7 + (1<< +SYMB_TELEBANK7 +) + + ) + +49  + #SYMB_PRAVZ8D + 12 + + ) + +50  + #SYMF_PRAVZ8D + (1<< +SYMB_PRAVZ8D +) + + ) + +52  + #SYM_BESTGUESS + 0xffff + + ) + +54  + smsym + + +56  + maddr +; + +57  + mags +; + +58  + mame +[ +SNAME_LEN ++1]; + +59  + msame +[ +SSNAME_LEN ++1]; + +60 * + mme +; + +63  + ssymbޏb + + +65  + mnumsyms +, + msyma +; + +66  +msym + * + msyms +; + +69 +SDL_bo + +isws + +c + ); + +70 +SDL_bo + +ishex + +c + ); + +71  +hex + +c + ); + +73  +m_wm + +mache + * +ic + ); + +74  +m_ + +mache + * +ic + ); + +75  +m_nd + +mache + * +ic + ); + +76  +m_upde_gs + +mache + * +ic + ); + +77  +m_upde + +mache + * +ic + ); + +78 +SDL_bo + +m_evt + +SDL_Evt + * +ev +,  +mache + * +ic +, SDL_bo * +ednd + ); + +79  +dbg_tf +* +fmt +, ... ); + +80  +m_tf_above +* +fmt +, ... ); + +81  +m_r + +mache + * +ic + ); + +82  +m_shut + +mache + * +ic + ); + +83  +m__symb + +symbޏb + * +ab + ); + +84  +m_syms + +symbޏb + * +ab + ); + +85 +SDL_bo + +m_w_symbs + +symbޏb + * +ab +,  +mache + * +ic +, * +ame +,  +ags +, SDL_bo +above +, SDL_bo +vbo + ); + +86 +SDL_bo + +m_symsomsh + +symbޏb + * +ab +, * +bufr +,  +n +); + +87  +m_e_t + +mache + * +ic + ); + +88 +SDL_bo + +m_gnum + +mache + * +ic +, * +num +, * +buf +, * +off +, SDL_bo +addegs +, SDL_bo +egs +, SDL_bo +vgs +, SDL_bo +symbs + ); + +89 +SDL_bo + +m_do_cmd +* +cmd +,  +mache + * +ic +, SDL_bo * +ednd + ); + +90 +SDL_bo + +m_cmd +* +cmd +,  +mache + * +ic +, SDL_bo * +ednd + ); + +92 #i +defed +( +DEBUG_CPU_TRACE +) && DEBUG_CPU_TRACE > 0 + +93  + su_a_y + + +95  +u_a_y + * + mxt +, * + mev +; + +96 +Ut16 + + mpc +; + +97 +Ut8 + + ma +, + mx +, + my +, + m +, + mags +; + +98 +Ut8 + + m +[3]; + +99 +SDL_bo + + mromdis +; + +101  +m_a +( +m6502 + * +u +); + +102  +dump_ua +( +mache + * +ic +); + + @msgbox.h + +24 + mMSGBOX_YES_NO + = 0, + +25 + mMSGBOX_OK_CANCEL +, + +26 + mMSGBOX_OK + + +29 +SDL_bo + +_msgbox + +mache + * +ic + ); + +30  +shut_msgbox + +mache + * +ic + ); + +31 +SDL_bo + +msgbox + +mache + * +ic +,  +ty +, * +msg + ); + + @msgbox_beos.cpp + +22  + ~ + +23  + ~ + +24  + ~ + +25  + ~ + +26  + ~ + +27  + ~ + +28  + ~ + +31  + ~"syem.h +" + +32  + ~"6502.h +" + +33  + ~"v.h +" + +34  + ~"8912.h +" + +35  + ~"gui.h +" + +36  + ~"disk.h +" + +37  + ~"mڙ.h +" + +38  + ~"6551.h +" + +39  + ~"mache.h +" + +40  + ~"msgbox.h +" + +43 +SDL_bo + + $_msgbox + +mache + * +ic + ) + +45  +SDL_TRUE +; + +46 + } +} + +48  + $shut_msgbox + +mache + * +ic + ) + +50 + } +} + +52 +SDL_bo + + $msgbox + +mache + * +ic +,  +ty +, * +msg + ) + +54  +ty + ) + +56  +MSGBOX_YES_NO +: + +57  (( +w + + `BA˹ +("Oricu Reque", +msg +, "Yes", "No"))-> + `Go +(=0? +SDL_TRUE + : +SDL_FALSE +; + +60  +MSGBOX_OK_CANCEL +: + +61  (( +w + + `BA˹ +("Oricu Reque", +msg +, "Ok", "Cl"))-> + `Go +(=0? +SDL_TRUE + : +SDL_FALSE +; + +64  +MSGBOX_OK +: + +65 ( +w + + `BA˹ +("Oricu Reque", +msg +, "Ok"))-> + `Go +(); + +66  +SDL_TRUE +; + +69  +SDL_TRUE +; + +70 + } +} + + @msgbox_gtk.c + +22  + ~ + +23  + ~ + +24  + ~ + +25  + ~ + +26  + ~ + +27  + ~ + +29  + ~ + +31  + ~"syem.h +" + +32  + ~"6502.h +" + +33  + ~"v.h +" + +34  + ~"8912.h +" + +35  + ~"gui.h +" + +36  + ~"disk.h +" + +37  + ~"mڙ.h +" + +38  + ~"6551.h +" + +39  + ~"mache.h +" + +40  + ~"msgbox.h +" + +42 +SDL_bo + +fusn +; + +43  +toggfusn + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +45 +SDL_bo + + $_msgbox + +mache + * +ic + ) + +48  +SDL_TRUE +; + +49 + } +} + +51  + $shut_msgbox + +mache + * +ic + ) + +53 + } +} + +55 +SDL_bo + + $msgbox + +mache + * +ic +,  +ty +, * +msg + ) + +57 +GtkWidg + * +dlog + = +NULL +; + +58 +GtkBusTy + +bs + = +GTK_BUTTONS_OK +; + +59 +GtkMesgeTy + +mtyp + = +GTK_MESSAGE_INFO +; + +60 +SDL_bo + +su + = +SDL_FALSE +; + +61 +gt + +s +; + +62 +SDL_bo + +was_fusn + = +fusn +; + +64 i( +fusn +) + +65 + `toggfusn +( +ic +, +NULL +, 0); + +67  +ty + ) + +69  +MSGBOX_YES_NO +: + +70 +bs + = +GTK_BUTTONS_YES_NO +; + +71 +mtyp + = +GTK_MESSAGE_QUESTION +; + +74  +MSGBOX_OK_CANCEL +: + +75 +bs + = +GTK_BUTTONS_OK_CANCEL +; + +82 +dlog + = + `gtk_mesge_dlog_w +( +NULL +, +GTK_DIALOG_MODAL +, +mtyp +, +bs +, "%s", +msg +); + +83 +s + = + `gtk_dlog_run +( + `GTK_DIALOG + ( +dlog +)); + +84 i(( +s + = +GTK_RESPONSE_OK +|| (= +GTK_RESPONSE_YES +|| (= +GTK_RESPONSE_ACCEPT +)) + +85 +su + = +SDL_TRUE +; + +87 + `gtk_widg_deroy +( +dlog +); + +88  + `gtk_evts_ndg +()) + +89 + `gtk_ma_i +(); + +91 i( +was_fusn +) + +92 + `toggfusn +( +ic +, +NULL +, 0); + +94  +su +; + +95 + } +} + + @msgbox_os2.c + +22  + ~ + +24  + ~"syem.h +" + +25  + ~"6502.h +" + +26  + ~"v.h +" + +27  + ~"8912.h +" + +28  + ~"gui.h +" + +29  + ~"disk.h +" + +30  + ~"mڙ.h +" + +31  + ~"6551.h +" + +32  + ~"mache.h +" + +33  + ~"msgbox.h +" + +35 +SDL_bo + + $_msgbox + +mache + * +ic + ) + +37  +SDL_TRUE +; + +38 + } +} + +40  + $shut_msgbox + +mache + * +ic + ) + +42 + } +} + +44 +SDL_bo + + $msgbox + +mache + * +ic +,  +ty +, * +msg + ) + +46 * +bs + = "OK|Cancel"; + +47  +EasySu + +myES + = + +49 ( +EasySu +), + +52 +msg +, + +53 +bs +, + +56  +ty + ) + +58  +MSGBOX_YES_NO +: + +59 + `ry +( +bs +, "Yes|No"); + +62  +MSGBOX_OK +: + +63 + `ry +( +bs +, "OK"); + +66  +MSGBOX_OK_CANCEL +: + +70  + `EasyReque +( +NULL +, & +myES +, NULL); + +71 + } +} + + @msgbox_os4.c + +22  + ~ + +23  + ~ + +24  + ~ + +25  + ~ + +26  + ~ + +27  + ~ + +29  + ~ + +31  + ~ + +32  + ~ + +33  + ~ + +35  + ~"syem.h +" + +36  + ~"6502.h +" + +37  + ~"v.h +" + +38  + ~"8912.h +" + +39  + ~"gui.h +" + +40  + ~"disk.h +" + +41  + ~"mڙ.h +" + +42  + ~"6551.h +" + +43  + ~"mache.h +" + +44  + ~"msgbox.h +" + +46  +Libry + * + gIuiBa + = +NULL +; + +47  +Libry + * + gRequeBa + = +NULL +; + +49  +IuiIFa + * + gIIui + = +NULL +; + +50  +RequeIFa + * + gIReque + = +NULL +; + +52 +SDL_bo + + $_msgbox + +mache + * +ic + ) + +54 +IuiBa + = +IExec +-> + `OnLibry +( "intuition.library", 51 ); + +55 if! +IuiBa + ) + +57 + `tf +( "Unableo open intuition.library v51+\n" ); + +58  +SDL_FALSE +; + +61 +IIui + = ( +IuiIFa + *) +IExec +-> + `GI + +IuiBa +, "ma", 1, +NULL + ); + +62 if! +IIui + ) + +64 + `tf +( "Unableo obtain main interface for intuition.library\n" ); + +65  +SDL_FALSE +; + +68 +RequeBa + = +IExec +-> + `OnLibry +( "requester.class", 51 ); + +69 if! +RequeBa + ) + +71 + `tf +( "Unableo openequester.class v51+\n" ); + +72  +SDL_FALSE +; + +75 +IReque + = ( +RequeIFa + *) +IExec +-> + `GI + +RequeBa +, "ma", 1, +NULL + ); + +76 if! +IReque + ) + +78 + `tf +( "Unableo obtain main interface forequester.library\n" ); + +79  +SDL_FALSE +; + +82  +SDL_TRUE +; + +83 + } +} + +85  + $shut_msgbox + +mache + * +ic + ) + +87 if +IReque + ) +IExec +-> + `DrI +( +I + *)IRequester ); + +88 if +RequeBa + ) +IExec +-> + `CloLibry +( RequesterBase ); + +89 if +IIui + ) +IExec +-> + `DrI +( +I + *)IIntuition ); + +90 if +IuiBa + ) +IExec +-> + `CloLibry +( IntuitionBase ); + +91 + } +} + +93 +SDL_bo + + $msgbox + +mache + * +ic +,  +ty +, * +msg + ) + +95 +Obje + * +q_obj +; + +96 +t32 + +su +, +imgty += +REQIMAGE_INFO +; + +97 +STRPTR + +bs + = "huh?!"; + +99  +ty + ) + +101  +MSGBOX_YES_NO +: + +102 +bs + = "Yes|No"; + +103 +imgty + = +REQIMAGE_QUESTION +; + +106  +MSGBOX_OK_CANCEL +: + +107 +bs + = "OK|Cancel"; + +108 +imgty + = +REQIMAGE_QUESTION +; + +111  +MSGBOX_OK +: + +112 +bs + = "OK"; + +113 +imgty + = +REQIMAGE_INFO +; + +117 +q_obj + = ( +Obje + *) +IIui +-> + `NewObje + +IReque +-> + `REQUESTER_GCss +(), +NULL +, + +118 +REQ_TText +, "Oricutron Request", + +119 +REQ_BodyText +, +msg +, + +120 +REQ_GadgText +, +bs +, + +121 +REQ_Image +, +imgty +, + +122 +TAG_DONE + ); + +124 if! +q_obj + )  +SDL_TRUE +; + +126 +su + = +IIui +-> + `IDoMhod + +q_obj +, +RM_OPENREQ +, +NULL +, NULL, NULL ); + +127 +IIui +-> + `DioObje + +q_obj + ); + +129 if +ty + = +MSGBOX_OK + )  +SDL_TRUE +; + +131  +su + ? +SDL_TRUE + : +SDL_FALSE +; + +132 + } +} + + @msgbox_sdl.c + +22  + ~ + +23  + ~ + +24  + ~ + +25  + ~ + +26  + ~ + +27  + ~ + +29  + ~"syem.h +" + +30  + ~"6502.h +" + +31  + ~"v.h +" + +32  + ~"8912.h +" + +33  + ~"gui.h +" + +34  + ~"disk.h +" + +35  + ~"mڙ.h +" + +36  + ~"6551.h +" + +37  + ~"mache.h +" + +38  + ~"msgbox.h +" + +40  + smsgboxbut + + +42  + mx +, + my +; + +43 * + mr +; + +46 +SDL_Sur + * +sn +; + +47  +xtze + * +tz +[ +NUM_TZ +]; + +48  +msgboxbut + * + gbs +; + +49  + gcb +; + +51  +msgboxbut + + gynbuts +[] = { { 2, 5, " YES " }, + +53 { -1,-1, +NULL + } }; + +55  +msgboxbut + + gocbuts +[] = { { 2, 5, " OK " }, + +57 { -1,-1, +NULL + } }; + +59  +msgboxbut + + gobuts +[] = { { 26, 5, " OK " }, + +60 { -1,-1, +NULL + } }; + +62 +SDL_bo + + $_msgbox + +mache + * +ic + ) + +64 if! + `loc_xtze + +ic +, +TZ_MSGBOX +, 80, 120, 60, 8, "Oricu Reque" ) )  +SDL_FALSE +; + +66  +SDL_TRUE +; + +67 + } +} + +69  + $shut_msgbox + +mache + * +ic + ) + +71 + `_xtze + +ic +, +TZ_MSGBOX + ); + +72 + } +} + +75  + $msgbox_nd + +mache + * +ic + ) + +77  +i +; + +79  +i +=0; +bs +[i]. +x +!=-1; i++ ) + +81 if +i +== +cb + ) + +83 +tz +[ +TZ_MSGBOX +]-> +cfc + = 1; + +84 +tz +[ +TZ_MSGBOX +]-> +cbc + = 2; + +86 +tz +[ +TZ_MSGBOX +]-> +cfc + = 2; + +87 +tz +[ +TZ_MSGBOX +]-> +cbc + = 5; + +90 + `tzos + +tz +[ +TZ_MSGBOX +], +bs +[ +i +]. +x +, bs[i]. +y +, bs[i]. +r + ); + +93 +ic +-> + `nd_beg +( oric ); + +95 +ic +-> + `nd_video +ic, +SDL_TRUE + ); + +96 +ic +-> + `nd_xtze +ic, +TZ_MSGBOX + ); + +98 +ic +-> + `nd_d +( oric ); + +99 + } +} + +101  + $msgbox_checkov + +x +,  +y + ) + +103  +i +; + +105  +i +=0; +bs +[i]. +x +!=-1; i++ ) + +107 if +y + = +bs +[ +i +].y ) && + +108 +x + > +bs +[ +i +].x ) && + +109 +x + < ( +bs +[ +i +].x+ + ` +(bs[i]. +r +)) ) ) + +110  +i +; + +113 + } +} + +115 +SDL_bo + + $msgbox + +mache + * +ic +,  +ty +, * +msg + ) + +117  +i +, +j +, +k +, +mx +, +my +, +ess +; + +118  +les +[] = { 2*60, 3*60, 5*60 }; + +119 * +msg2 +; + +120 +SDL_Evt + +evt +; + +121 +SDL_bo + +wasunicode +; + +123 +wasunicode + = + `SDL_COMPAT_EbUNICODE + +SDL_TRUE + ); + +124 + `SDL_COMPAT_EbKeyRt + +SDL_DEFAULT_REPEAT_DELAY +, +SDL_DEFAULT_REPEAT_INTERVAL + ); + +127  +i +=1; i<59; i++ ) + +129  +j +=0; j<3; j++ ) + +131 +tz +[ +TZ_MSGBOX +]-> +fc +[ +les +[ +j +]+ +i +] = 2; + +132 +tz +[ +TZ_MSGBOX +]-> +bc +[ +les +[ +j +]+ +i +] = 3; + +133 +tz +[ +TZ_MSGBOX +]-> +tx +[ +les +[ +j +]+ +i +] = 32; + +137  +i +=0; +msg +[i]; i++ ) if( (msg[i]=='\r')||(msg[i]=='\n') ) ; + +139  +j +=0, +k +=30- +i +/2; j +tx +[ +les +[0]+ +k +] = +msg +[ +j +]; + +142  ( +msg +[ +i +]=='\r')||(msg[i]=='\n') ) i++; + +143 if +msg +[ +i +] ) + +145 +msg2 + = & +msg +[ +i +]; + +146 +i + = + ` + +msg2 + ); + +147  +j +=0, +k +=30- +i +/2; j +tx +[ +les +[1]+ +k +] = +msg2 +[ +j +]; + +151  +ty + ) + +153  +MSGBOX_YES_NO +: + +154 +bs + = +ynbuts +; + +155 +cb + = 0; + +158  +MSGBOX_OK_CANCEL +: + +159 +bs + = +ocbuts +; + +160 +cb + = 1; + +163  +MSGBOX_OK +: + +164 +bs + = +obuts +; + +165 +cb + = 0; + +169 + `msgbox_nd + +ic + ); + +171 +ess + = -1; + +174 if! + `SDL_WaEvt +& +evt + ) ) + +176 + `SDL_COMPAT_EbUNICODE + +wasunicode + ); + +177 + `SDL_COMPAT_EbKeyRt + +wasunicode + ? +SDL_DEFAULT_REPEAT_DELAY + : 0, wasunicod? +SDL_DEFAULT_REPEAT_INTERVAL + : 0 ); + +178  +SDL_FALSE +; + +181  +evt +. +ty + ) + +183  +SDL_COMPAT_ACTIVEEVENT +: + +184 if( + `SDL_COMPAT_IsAFocud +& +evt + ) ) { + +185 + `msgbox_nd + +ic + ); + +189  +SDL_MOUSEMOTION +: + +190 if +ess + != -1 ) ; + +191 +mx + = ( +evt +. +mi +. +x + - +tz +[ +TZ_MSGBOX +]->x)/8; + +192 +my + = ( +evt +. +mi +. +y + - +tz +[ +TZ_MSGBOX +]->y)/12; + +193 +i + = + `msgbox_checkov + +mx +, +my + ); + +194 if +i + == -1 ) ; + +195 if +i + ! +cb + ) + +197 +cb + = +i +; + +198 + `msgbox_nd + +ic + ); + +202  +SDL_MOUSEBUTTONDOWN +: + +203 if +evt +. +bu +.bu = +SDL_BUTTON_LEFT + ) + +205 +mx + = ( +evt +. +mi +. +x + - +tz +[ +TZ_MSGBOX +]->x)/8; + +206 +my + = ( +evt +. +mi +. +y + - +tz +[ +TZ_MSGBOX +]->y)/12; + +207 +i + = + `msgbox_checkov + +mx +, +my + ); + +208 if +i + == -1 ) ; + +209 +cb + = +i +; + +210 +ess + = +i +; + +211 + `msgbox_nd + +ic + ); + +215  +SDL_MOUSEBUTTONUP +: + +216 if +evt +. +bu +.bu = +SDL_BUTTON_LEFT + ) + +218 if +ess + == -1 ) ; + +219 +mx + = ( +evt +. +mi +. +x + - +tz +[ +TZ_MSGBOX +]->x)/8; + +220 +my + = ( +evt +. +mi +. +y + - +tz +[ +TZ_MSGBOX +]->y)/12; + +221 +i + = + `msgbox_checkov + +mx +, +my + ); + +222 if +i + = +ess + ) + +224  +ty + ) + +226  +MSGBOX_YES_NO +: + +227  +MSGBOX_OK_CANCEL +: + +228 + `SDL_COMPAT_EbUNICODE + +wasunicode + ); + +229 + `SDL_COMPAT_EbKeyRt + +wasunicode + ? +SDL_DEFAULT_REPEAT_DELAY + : 0, wasunicod? +SDL_DEFAULT_REPEAT_INTERVAL + : 0 ); + +230  ( +ess +==0); + +233 + `SDL_COMPAT_EbUNICODE + +wasunicode + ); + +234 + `SDL_COMPAT_EbKeyRt + +wasunicode + ? +SDL_DEFAULT_REPEAT_DELAY + : 0, wasunicod? +SDL_DEFAULT_REPEAT_INTERVAL + : 0 ); + +235  +SDL_TRUE +; + +240 +ess + = -1; + +244  +SDL_KEYDOWN +: + +245  +evt +. +key +. +keysym +. +sym + ) + +247  +SDLK_TAB +: + +248  +SDLK_RIGHT +: + +249 +cb + = cbtn+1; + +250 if +bs +[ +cb +]. +x + == -1 ) cbtn = 0; + +251 + `msgbox_nd + +ic + ); + +254  +SDLK_LEFT +: + +255 +cb +--; + +256 if +cb + < 0 ) + +258  +cb +=0; +bs +[cb]. +x +!=-1; cbtn++ ) ; + +259 +cb +--; + +261 + `msgbox_nd + +ic + ); + +264  +SDLK_RETURN +: + +265  +SDLK_KP_ENTER +: + +266  +ty + ) + +268  +MSGBOX_YES_NO +: + +269  +MSGBOX_OK_CANCEL +: + +270 + `SDL_COMPAT_EbUNICODE + +wasunicode + ); + +271 + `SDL_COMPAT_EbKeyRt + +wasunicode + ? +SDL_DEFAULT_REPEAT_DELAY + : 0, wasunicod? +SDL_DEFAULT_REPEAT_INTERVAL + : 0 ); + +272  ( +cb +==0); + +275 + `SDL_COMPAT_EbUNICODE + +wasunicode + ); + +276 + `SDL_COMPAT_EbKeyRt + +wasunicode + ? +SDL_DEFAULT_REPEAT_DELAY + : 0, wasunicod? +SDL_DEFAULT_REPEAT_INTERVAL + : 0 ); + +277  +SDL_TRUE +; + +288 + `SDL_COMPAT_EbUNICODE + +wasunicode + ); + +289 + `SDL_COMPAT_EbKeyRt + +wasunicode + ? +SDL_DEFAULT_REPEAT_DELAY + : 0, wasunicod? +SDL_DEFAULT_REPEAT_INTERVAL + : 0 ); + +290  +SDL_FALSE +; + +291 + } +} + + @msgbox_win32.c + +22  + ~ + +23  + ~ + +24  + ~ + +25  + ~ + +26  + ~ + +28  + #WANT_WMINFO + + + ) + +30  + ~"syem.h +" + +31  + ~"6502.h +" + +32  + ~"v.h +" + +33  + ~"8912.h +" + +34  + ~"gui.h +" + +35  + ~"disk.h +" + +36  + ~"mڙ.h +" + +37  + ~"6551.h +" + +38  + ~"mache.h +" + +39  + ~"msgbox.h +" + +41 +SDL_bo + + $_msgbox + +mache + * +ic + ) + +43  +SDL_TRUE +; + +44 + } +} + +46  + $shut_msgbox + +mache + * +ic + ) + +48 + } +} + +50 +SDL_bo + + $msgbox + +mache + * +ic +,  +ty +, * +msg + ) + +52 +SDL_SysWMfo + +wmi +; + +53 +HWND + +hwnd +; + +55 +hwnd + = +NULL +; + +56 + `SDL_VERSION +(& +wmi +. +vsi +); + +57 if( + `SDL_COMPAT_GWMInfo +& +wmi + ) ) + +58 #i +SDL_MAJOR_VERSION + == 1 + +59 +hwnd + = ( +HWND +) +wmi +. +wdow +; + +61 +hwnd + = ( +HWND +) +wmi +. +fo +. +w +. +wdow +; + +63  +ty + ) + +65  +MSGBOX_YES_NO +: + +66  ( + `MesgeBoxA + +hwnd +, +msg +, "Oricu Reque", +MB_YESNO + ) = +IDYES +); + +68  +MSGBOX_OK_CANCEL +: + +69  ( + `MesgeBoxA + +hwnd +, +msg +, "Oricu Reque", +MB_OKCANCEL + ) = +IDOK +); + +71  +MSGBOX_OK +: + +72 + `MesgeBoxA + +hwnd +, +msg +, "Oricu Reque", +MB_OK + ); + +75  +SDL_TRUE +; + +76 + } +} + + @msvc/strcasecmp.h + +1 #ifde +_MSC_VER + + +2 #ifde +__SPECIFY_SDL_DIR__ + + +3  + ~ + +5  + ~ + +7  + #rcmp + +SDL_rcmp + + + ) + +8  + #cmp + +SDL_cmp + + + ) + + @msvc/unistd.h + +1 #ifde +_MSC_VER + + +3  + ~ + +4  + ~ + +8  + ~ + +9  + #gcwd + +_gcwd + + + ) + +12  + ~"rcmp.h +" + + @plugins/ch376/ch376.c + +27 #i +defed +( +__MORPHOS__ +|| defed ( +__AMIGA__ +|| defed ( +__AROS__ +) + +29  + #__NOLIBBASE__ + + + ) + +31  + ~ + +32  + ~ + +33  + ~ + +35  +Libry + * +SysBa +; + +37 #i +defed +( +WIN32 +) + +39  + ~ + +40  + ~ + +41  + ~ + +42  + ~ + +45 #i +defed +( +__unix__ +|| defed( +__APPLE__ +|| defed( +__HAIKU__ +|| defed( +__MINT__ +) + +47  + ~ + +48  + ~ + +49  + ~ + +50  + ~ + +51  + ~ + +52  + ~ + +53  + ~ + +54  + ~ + +55  + ~ + +61  + ~"ch376.h +" + +68  + #CH376_DATA_IC_VER + 3 + + ) + +71  + #CH376_CMD_NONE + 0x00 + + ) + +72  + #CH376_CMD_GET_IC_VER + 0x01 + + ) + +73  + #CH376_CMD_CHECK_EXIST + 0x06 + + ) + +74  + #CH376_CMD_GET_FILE_SIZE + 0x0c + + ) + +75  + #CH376_CMD_SET_USB_MODE + 0x15 + + ) + +76  + #CH376_CMD_GET_STATUS + 0x22 + + ) + +77  + #CH376_CMD_RD_USB_DATA0 + 0x27 + + ) + +78  + #CH376_CMD_WR_REQ_DATA + 0x2d + + ) + +79  + #CH376_CMD_SET_FILE_NAME + 0x2f + + ) + +80  + #CH376_CMD_DISK_MOUNT + 0x31 + + ) + +81  + #CH376_CMD_FILE_OPEN + 0x32 + + ) + +82  + #CH376_CMD_FILE_ENUM_GO + 0x33 + + ) + +83  + #CH376_CMD_FILE_CREATE + 0x34 + + ) + +84  + #CH376_CMD_FILE_ERASE + 0x35 + + ) + +85  + #CH376_CMD_FILE_CLOSE + 0x36 + + ) + +86  + #CH376_CMD_BYTE_LOCATE + 0x39 + + ) + +87  + #CH376_CMD_BYTE_READ + 0x3a + + ) + +88  + #CH376_CMD_BYTE_RD_GO + 0x3b + + ) + +89  + #CH376_CMD_BYTE_WRITE + 0x3c + + ) + +90  + #CH376_CMD_BYTE_WR_GO + 0x3d + + ) + +91  + #CH376_CMD_DISK_CAPACITY + 0x3e + + ) + +92  + #CH376_CMD_DISK_QUERY + 0x3f + + ) + +93  + #CH376_CMD_DIR_CREATE + 0x40 + + ) + +94  + #CH376_CMD_DISK_RD_GO + 0x55 + + ) + +96  + #CH376_ARG_SET_USB_MODE_INVALID + 0x00 + + ) + +97  + #CH376_ARG_SET_USB_MODE_SD_HOST + 0x03 + + ) + +98  + #CH376_ARG_SET_USB_MODE_USB_HOST + 0x06 + + ) + +101  + #CH376_ERR_OPEN_DIR + 0x41 + + ) + +102  + #CH376_ERR_MISS_FILE + 0x42 + + ) + +103  + #CH376_ERR_FOUND_NAME + 0x43 + + ) + +105  + #CH376_RET_SUCCESS + 0x51 + + ) + +106  + #CH376_RET_ABORT + 0x5f + + ) + +108  + #CH376_INT_SUCCESS + 0x14 + + ) + +109  + #CH376_INT_DISK_READ + 0x1d + + ) + +110  + #CH376_INT_DISK_WRITE + 0x1e + + ) + +116  + #CMD_DATA_REQ_SIZE + 0xff + + ) + +119  + #DIR_ATTR_READ_ONLY + 0x01 + + ) + +120  + #DIR_ATTR_HIDDEN + 0x02 + + ) + +121  + #DIR_ATTR_SYSTEM + 0x04 + + ) + +122  + #DIR_ATTR_VOLUME_ID + 0x08 + + ) + +123  + #DIR_ATTR_DIRECTORY + 0x10 + + ) + +124  + #DIR_ATTR_ARCHIVE + 0x20 + + ) + +126  + #DIR_MAKE_FILE_TIME +( +h +, +m +, +s +((h<<11+ (m<<5+ (s>>1)) + + ) + +128  + #DIR_MAKE_FILE_DATE +( +y +, +m +, +d +(((y-1980)<<9+ (m<<5+ d) + + ) + +130 #agm +ck +(1) + +133  + sFDInfo + + +135  + mDIR_Name +[11]; + +136 +CH376_U8 + + mDIR_Ar +; + +137 +CH376_U8 + + mDIR_NTRes +; + +138 +CH376_U8 + + mDIR_CTimeTth +; + +139 +CH376_U8 + + mDIR_CTime +[2]; + +140 +CH376_U8 + + mDIR_CDe +[2]; + +141 +CH376_U8 + + mDIR_LAccDe +[2]; + +142 +CH376_U8 + + mDIR_FClusHI +[2]; + +143 +CH376_U8 + + mDIR_WTime +[2]; + +144 +CH376_U8 + + mDIR_WDe +[2]; + +145 +CH376_U8 + + mDIR_FClusLO +[2]; + +146 +CH376_U8 + + mDIR_FeSize +[4]; + +149  + sMouInfo + + +151 +CH376_U8 + + mMOUNT_DeviTy +; + +152 +CH376_U8 + + mMOUNT_RemovabMed +; + +153 +CH376_U8 + + mMOUNT_Vsis +; + +154 +CH376_U8 + + mMOUNT_DaFmAndEtc +; + +155 +CH376_U8 + + mMOUNT_AddiڮLgth +; + +156 +CH376_U8 + + mMOUNT_Rerved1 +; + +157 +CH376_U8 + + mMOUNT_Rerved2 +; + +158 +CH376_U8 + + mMOUNT_MiscFg +; + +159  + mMOUNT_VdIdS +[8]; + +160  + mMOUNT_ProduIdS +[16]; + +161  + mMOUNT_ProduRevS +[4]; + +164  + sDiskQuy + + +166 +CH376_U8 + + mDISK_TٮSe +[4]; + +167 +CH376_U8 + + mDISK_FeSe +[4]; + +168 +CH376_U8 + + mDISK_DiskF +; + +171  + uCommdDa + + +173  + mCMD_FeName +[14]; + +174  +MouInfo + + mCMD_MouInfo +; + +175  +FDInfo + + mCMD_FDInfo +; + +176  +DiskQuy + + mCMD_DiskQuy +; + +177 +CH376_U8 + + mCMD_FeSk +[4]; + +178 +CH376_U8 + + mCMD_FeRdWre +[2]; + +179 +CH376_U8 + + mCMD_IOBufr +[255]; + +180 +CH376_U8 + + mCMD_CheckBy +; + +181 +CH376_U8 + + mCMD_FeSize +[4]; + +184 #agm +ck +() + +190  + sch376 + + +192 +CH376_CONTEXT + + mcڋxt +; + +194 +CH376_U8 + + mcommd +; + +195 +CH376_U8 + + mcommd_us +; + +197 +CH376_U8 + + mr_us +; + +198 +CH376_U8 + + musb_mode +; + +200  +CommdDa + + mcmd_da +; + +201 +CH376_U8 + + mnb_bys__cmd_da +; + +202 +CH376_U8 + + mpos_rw__cmd_da +; + +204 +CH376_U16 + + mbys_to_ad_wre +; + +206 +CH376_LOCK + + mro_d_lock +; + +207 +CH376_LOCK + + mcut_d_lock +; + +208 +CH376_FILE + + mcut_fe +; + +209 +CH376_DIR + + mcut_dey_browsg +; + +211 +CH376_BOOL + + mcut_fe_is_dey +; + +212  + md_n +[14]; + +214 * + msdrd_drive_th +; + +215 * + musb_drive_th +; + +222 * +e_rg +(cڡ * +rg +); + +223  +r_ruu +( +ch376 + *ch376); + +224  +nl_l_io +( +ch376 + *ch376); + +225  +nmize_ch +( +c +); + +226 cڡ * +nmize_fe_me +(cڡ * +fe_me +, * +nmized_fe_me +); + +227 cڡ * +im_fe_me +(cڡ * +fe_me +, * +immed_fe_me +); + +228  +fe_ad_chunk +( +ch376 + *ch376); + +229  +fe_wre_chunk +( +ch376 + *ch376); + +230  +CH376_BOOL + +n_mch +(cڡ * +n +, cڡ * +r +); + +231 cڡ * +nmize_n +(cڡ * +n +, * +nmized_n +); + +238 * +syem_loc_mem +( +size +); + +242  +syem__mem +(* +r +); + +246  +CH376_BOOL + +syem__cڋxt +( +CH376_CONTEXT + * +cڋxt +, +UNUSED + * +ur_da +); + +249  +syem_n_cڋxt +( +CH376_CONTEXT + * +cڋxt +); + +252  +CH376_BOOL + +syem_g_disk_fo +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +ro_lock +,  +DiskQuy + * +disk_fo +); + +256  +CH376_LOCK + +syem_ob_dey_lock +( +CH376_CONTEXT + * +cڋxt +, cڡ * +d_th +, CH376_LOCK +ro_lock +); + +260  +syem_a_dey_lock +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +d_lock +); + +263  +CH376_LOCK + +syem_e_dey_lock +( +CH376_CONTEXT + * +cڋxt +, CH376_LOCK +d_lock +); + +266  +CH376_LOCK + +syem__dey +( +CH376_CONTEXT + * +cڋxt +, cڡ * +d_th +, CH376_LOCK +ro_lock +); + +270  +CH376_FILE + +syem_fe_ݒ_exig +( +CH376_CONTEXT + * +cڋxt +, cڡ * +fe_me +, +CH376_LOCK + +ro_lock +); + +274  +CH376_FILE + +syem_fe_ݒ_w +( +CH376_CONTEXT + * +cڋxt +, cڡ * +fe_me +, +CH376_LOCK + +ro_lock +); + +277  +syem_fe_o +( +CH376_CONTEXT + * +cڋxt +, +CH376_FILE + +fe +); + +280  +CH376_S32 + +syem_fe_ek +( +CH376_CONTEXT + * +cڋxt +, +CH376_FILE + +fe +,  +pos +); + +283  +CH376_S32 + +syem_fe_ad +( +CH376_CONTEXT + * +cڋxt +, +CH376_FILE + +fe +, * +bufr +, CH376_S32 +size +); + +286  +CH376_S32 + +syem_fe_wre +( +CH376_CONTEXT + * +cڋxt +, +CH376_FILE + +fe +, * +bufr +, CH376_S32 +size +); + +289  +CH376_BOOL + +syem_fe_de +( +CH376_CONTEXT + * +cڋxt +, cڡ * +fe_me +, +CH376_LOCK + +ro_lock +); + +292  +CH376_BOOL + +syem_dey_de +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +ro_lock +); + +296  +CH376_DIR + +syem_t_exame_dey +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +d_lock +); + +299  +CH376_BOOL + +syem_go_exame_dey +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +d_lock +, +CH376_DIR + +fib +,  +FDInfo + * +d_fo +, * +n +); + +302  +syem_fish_exame_dey +( +CH376_CONTEXT + * +cڋxt +, +CH376_DIR + +fib +); + +305  +CH376_S32 + +syem_g_fe_size +( +CH376_CONTEXT + * +cڋxt +, +CH376_FILE + +fe +); + +309 #i +defed +( +__MORPHOS__ +|| defed ( +__AMIGA__ +|| defed ( +__AROS__ +) + +313 #ifde +DEBUG_CH376 + + +314  + ~ + +315  + #dbg_tf + +ktf + + + ) + +317  + #dbg_tf +(...) + + ) + +320 * + $syem_loc_mem +( +size +) + +322  + `AocVec +( +size +, +MEMF_ANY +); + +323 + } +} + +325  + $syem__mem +(* +r +) + +327 + `FeVec +( +r +); + +328 + } +} + +330  +CH376_BOOL + + $syem__cڋxt +( +CH376_CONTEXT + * +cڋxt +, +UNUSED + * +ur_da +) + +332 +cڋxt +-> +DOSBa + = + `OnLibry +( +DOSNAME +, 0L); + +333  ( +cڋxt +-> +DOSBa + ! +NULL +); + +334 + } +} + +336  + $syem_n_cڋxt +( +CH376_CONTEXT + * +cڋxt +) + +338 if( +cڋxt +-> +DOSBa + ! +NULL +) + +339 + `CloLibry +( +cڋxt +-> +DOSBa +); + +340 + } +} + +342  +CH376_BOOL + + $syem_g_disk_fo +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +ro_lock +,  +DiskQuy + * +disk_fo +) + +344  +Libry + * +DOSBa + = +cڋxt +->DOSBase; + +345 +BOOL + +g_fo + = +CH376_FALSE +; + +347 if( +disk_fo +) + +349  +InfoDa + * +fo + = + `syem_loc_mem +((InfoData)); + +351 if( +fo +) + +353 if( + `Info +( +ro_lock +, +fo += +DOSTRUE +) + +355 +QUAD + +tٮ_ + = ( +fo +-> +id_NumBlocks + * info-> +id_BysPBlock +) / 512; + +356 +QUAD + +_ + = (( +fo +-> +id_NumBlocks + - info-> +id_NumBlocksUd +* info-> +id_BysPBlock +) / 512; + +358 +disk_fo +-> +DISK_TٮSe +[0] = ( +tٮ_ + & 0x000000ff) >> 0; + +359 +disk_fo +-> +DISK_TٮSe +[1] = ( +tٮ_ + & 0x0000ff00) >> 8; + +360 +disk_fo +-> +DISK_TٮSe +[2] = ( +tٮ_ + & 0x00ff0000) >> 16; + +361 +disk_fo +-> +DISK_TٮSe +[3] = ( +tٮ_ + & 0xff000000) >> 24; + +363 +disk_fo +-> +DISK_FeSe +[0] = ( +_ + & 0x000000ff) >> 0; + +364 +disk_fo +-> +DISK_FeSe +[1] = ( +_ + & 0x0000ff00) >> 8; + +365 +disk_fo +-> +DISK_FeSe +[2] = ( +_ + & 0x00ff0000) >> 16; + +366 +disk_fo +-> +DISK_FeSe +[3] = ( +_ + & 0xff000000) >> 24; + +368 +disk_fo +-> +DISK_DiskF + = 0x0c; + +370 +g_fo + = +TRUE +; + +372 + `syem__mem +( +fo +); + +376  +g_fo +; + +377 + } +} + +379  +CH376_LOCK + + $syem_ob_dey_lock +( +CH376_CONTEXT + * +cڋxt +, cڡ * +d_th +, +CH376_LOCK + +ro_lock +) + +381  +Libry + * +DOSBa + = +cڋxt +->DOSBase; + +382 +BPTR + +lock +; + +383 +BPTR + +d_lock + = (BPTR)0; + +385 + `dbg_tf +("syem_ob_dey_lock: %s\n", +d_th +); + +387 if( +ro_lock +) + +389 +d_lock + = + `CutD +( +ro_lock +); + +392 +lock + = + `Lock +( +d_th +, +SHARED_LOCK +); + +394 if( +lock + !( +BPTR +)0) + +396  +FeInfoBlock + * +fib + = + `AocDosObje +( +DOS_FIB +, +NULL +); + +398 if( +fib +) + +400 if( + `Exame +( +lock +, +fib += +DOSFALSE + || fib-> +fib_DEryTy + < 0) + +402 + `UnLock +( +lock +); + +403 +lock + = ( +BPTR +)0; + +405 + `FeDosObje +( +DOS_FIB +, +fib +); + +409 if( +d_lock +) + +411 + `CutD +( +d_lock +); + +414  +lock +; + +415 + } +} + +417  + $syem_a_dey_lock +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +d_lock +) + +419  +Libry + * +DOSBa + = +cڋxt +->DOSBase; + +420 + `UnLock +( +d_lock +); + +421 + } +} + +423  +CH376_LOCK + + $syem_e_dey_lock +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +d_lock +) + +425  +Libry + * +DOSBa + = +cڋxt +->DOSBase; + +426  + `DupLock +( +d_lock +); + +427 + } +} + +429  +CH376_LOCK + + $syem__dey +( +CH376_CONTEXT + * +cڋxt +, cڡ * +d_th +, +CH376_LOCK + +ro_lock +) + +431  +Libry + * +DOSBa + = +cڋxt +->DOSBase; + +432 +BPTR + +lock +; + +433 +BPTR + +d_lock + = (BPTR)0; + +435 + `dbg_tf +("syem__dey: %s\n", +d_th +); + +437 if( +ro_lock +) + +439 +d_lock + = + `CutD +( +ro_lock +); + +442 +lock + = + `CeD +( +d_th +); + +444 if( +d_lock +) + +446 + `CutD +( +d_lock +); + +449  +lock +; + +450 + } +} + +452  +BPTR + + $fe_ݒ +( +CH376_CONTEXT + * +cڋxt +, +CONST_STRPTR + +fe_me +, +BPTR + +ro_lock +, +LONG + +mode +) + +454  +Libry + * +DOSBa + = +cڋxt +->DOSBase; + +455 +BPTR + +d_lock + = (BPTR)0; + +456 +BPTR + +fe +; + +458 if( +ro_lock +) + +460 +d_lock + = + `CutD +( +ro_lock +); + +463 +fe + = + `On +( +fe_me +, +mode +); + +465 if( +d_lock +) + +467 + `CutD +( +d_lock +); + +470  +fe +; + +471 + } +} + +473  +CH376_FILE + + $syem_fe_ݒ_exig +( +CH376_CONTEXT + * +cڋxt +, cڡ * +fe_me +, +CH376_LOCK + +ro_lock +) + +475  + `fe_ݒ +( +cڋxt +, +fe_me +, +ro_lock +, +MODE_OLDFILE +); + +476 + } +} + +478  +CH376_FILE + + $syem_fe_ݒ_w +( +CH376_CONTEXT + * +cڋxt +, cڡ * +fe_me +, +CH376_LOCK + +ro_lock +) + +480  + `fe_ݒ +( +cڋxt +, +fe_me +, +ro_lock +, +MODE_NEWFILE +); + +481 + } +} + +483  + $syem_fe_o +( +CH376_CONTEXT + * +cڋxt +, +CH376_FILE + +fe +) + +485  +Libry + * +DOSBa + = +cڋxt +->DOSBase; + +486 + `Clo +( +fe +); + +487 + } +} + +489  +CH376_S32 + + $syem_fe_ek +( +CH376_CONTEXT + * +cڋxt +, +CH376_FILE + +fe +,  +pos +) + +491  +Libry + * +DOSBa + = +cڋxt +->DOSBase; + +493 + `dbg_tf +("syem_fe_ekrygأekposi %d\n", +pos +); + +495 if( +fe +) + +496  + `Sk +( +fe +, +pos +, +OFFSET_BEGINNING +); + +499 + } +} + +501  +CH376_S32 + + $syem_fe_ad +( +CH376_CONTEXT + * +cڋxt +, +CH376_FILE + +fe +, * +bufr +, +CH376_S32 + +size +) + +503  +Libry + * +DOSBa + = +cڋxt +->DOSBase; + +505 + `dbg_tf +("syem_fe_adrygػad %d bys\n", +size +); + +507 if( +fe +) + +508  + `Rd +( +fe +, +bufr +, +size +); + +511 + } +} + +513  +CH376_S32 + + $syem_fe_wre +( +CH376_CONTEXT + * +cڋxt +, +CH376_FILE + +fe +, * +bufr +, +CH376_S32 + +size +) + +515  +Libry + * +DOSBa + = +cڋxt +->DOSBase; + +517 + `dbg_tf +("syem_fe_wrygwr%d bys\n", +size +); + +519 if( +fe +) + +520  + `Wre +( +fe +, +bufr +, +size +); + +523 + } +} + +525  +CH376_BOOL + + $syem_fe_de +( +CH376_CONTEXT + * +cڋxt +, cڡ * +fe_me +, +CH376_LOCK + +ro_lock +) + +527  +Libry + * +DOSBa + = +cڋxt +->DOSBase; + +528 +BPTR + +d_lock + = (BPTR)0; + +529 +LONG + +r +; + +531 if( +ro_lock +) + +533 +d_lock + = + `CutD +( +ro_lock +); + +536 +r + = + `DeFe +( +fe_me +); + +538 if( +d_lock +) + +540 + `CutD +( +d_lock +); + +543  ( +r + != 0); + +544 + } +} + +546  +CH376_BOOL + + $syem_dey_de +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +ro_lock +) + +549  +Libry + * +DOSBa + = +cڋxt +->DOSBase; + +551 + `dbg_tf +("syem_dey_de: %s\n", +ro_lock +); + +553 if( +ro_lock +) + +554  ( + `DeFe +( +ro_lock +) != 0); + +556  +CH376_FALSE +; + +557 + } +} + +559  +CH376_DIR + + $syem_t_exame_dey +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +d_lock +) + +561  +Libry + * +DOSBa + = +cڋxt +->DOSBase; + +562  +FeInfoBlock + * +fib + = + `AocDosObje +( +DOS_FIB +, +NULL +); + +564 if( +fib +) + +566 if( + `Exame +( +d_lock +, +fib += +DOSFALSE +) + +568 + `FeDosObje +( +DOS_FIB +, +fib +); + +569 +fib + = +NULL +; + +573  +fib +; + +574 + } +} + +576  +CH376_BOOL + + $syem_go_exame_dey +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +d_lock +, +CH376_DIR + +fib +,  +FDInfo + * +d_fo +, * +n +) + +578  +Libry + * +DOSBa + = +cڋxt +->DOSBase; + +579 +BOOL + +is_de + = +FALSE +; + +581 if( +fib +! +is_de + && + `ExNext +( +d_lock +, fib= +DOSTRUE +) + +583 if( + `nmize_fe_me +( +fib +-> +fib_FeName +, +d_fo +-> +DIR_Name +&& + `n_mch +( +n +, dir_info->DIR_Name)) + +585 +d_fo +-> +DIR_Ar + = 0; + +587 if( +fib +-> +fib_DEryTy + > 0) + +588 +d_fo +-> +DIR_Ar + | +DIR_ATTR_DIRECTORY +; + +589 if(( +fib +-> +fib_Prei + & +FIBF_WRITE +) != 0) + +590 +d_fo +-> +DIR_Ar + | +DIR_ATTR_READ_ONLY +; + +591 if(( +fib +-> +fib_Prei + & +FIBF_ARCHIVE +) == 0) + +592 +d_fo +-> +DIR_Ar + | +DIR_ATTR_ARCHIVE +; + +598 + `dbg_tf +("syem_go_exame_dey defed fibus: %d\n", +d_fo +-> +DIR_Ar +); + +600 +d_fo +-> +DIR_NTRes + = 0; + +601 +d_fo +-> +DIR_CTimeTth + = 0; + +602 +d_fo +-> +DIR_CTime +[0] = 0; + +603 +d_fo +-> +DIR_CTime +[1] = 0; + +604 +d_fo +-> +DIR_CDe +[0] = 0; + +605 +d_fo +-> +DIR_CDe +[1] = 0; + +606 +d_fo +-> +DIR_LAccDe +[0] = 0; + +607 +d_fo +-> +DIR_LAccDe +[1] = 0; + +608 +d_fo +-> +DIR_FClusHI +[0] = 0; + +609 +d_fo +-> +DIR_FClusHI +[1] = 0; + +610 +d_fo +-> +DIR_WTime +[0] = 0; + +611 +d_fo +-> +DIR_WTime +[1] = 0; + +612 +d_fo +-> +DIR_WDe +[0] = 0; + +613 +d_fo +-> +DIR_WDe +[1] = 0; + +614 +d_fo +-> +DIR_FClusLO +[0] = 0; + +615 +d_fo +-> +DIR_FClusLO +[1] = 0; + +616 +d_fo +-> +DIR_FeSize +[0] = ( +fib +-> +fib_Size + & 0x000000ff) >> 0; + +617 +d_fo +-> +DIR_FeSize +[1] = ( +fib +-> +fib_Size + & 0x0000ff00) >> 8; + +618 +d_fo +-> +DIR_FeSize +[2] = ( +fib +-> +fib_Size + & 0x00ff0000) >> 16; + +619 +d_fo +-> +DIR_FeSize +[3] = ( +fib +-> +fib_Size + & 0xff000000) >> 24; + +621 +is_de + = +TRUE +; + +625  +is_de +; + +626 + } +} + +628  + $syem_fish_exame_dey +( +CH376_CONTEXT + * +cڋxt +, +CH376_DIR + +fib +) + +630  +Libry + * +DOSBa + = +cڋxt +->DOSBase; + +632 if( +fib +) + +634 + `FeDosObje +( +DOS_FIB +, +fib +); + +636 + } +} + +638  +CH376_S32 + + $syem_g_fe_size +( +CH376_CONTEXT + * +cڋxt +, +CH376_FILE + +fe +) + +640  +Libry + * +DOSBa + = +cڋxt +->DOSBase; + +641  +FeInfoBlock + * +fib + = + `AocDosObje +( +DOS_FIB +, +NULL +); + +642 +CH376_S32 + +fe_size + = 0xffffffff; + +644 i( +fib +) + +646 i( +fe +) + +648 i + `ExameFH +( +fe +, & +fib +) ) + +650 +fe_size + = +fib +-> +fib_Size +; + +654 + `dbg_tf +("system_get_file_size:rror\n"); + +659 + `dbg_tf +("system_get_file_size:o file handle\n"); + +662 + `FeDosObje +( +DOS_FIB +, +fib +); + +665  +fe_size +; + +666 + } +} + +670 #i +defed +( +WIN32 +) + +674 #ifde +DEBUG_CH376 + + +675  + $dbg_tf +( +LPCTSTR + +r +, ...) + +677 +TCHAR + +bufr +[256]; + +679 +va_li + +gs +; + +680 + `va_t +( +gs +, +r +); + +681 + `_vtf_s +( +bufr +, (bufr- 1, (bufr- 1, +r +, +gs +); + +682 + `OuutDebugSg +( +bufr +); + +683 + `va_d +( +gs +); + +684 + } +} + +686  + #dbg_tf +(...) + + ) + +689 * + $syem_loc_mem +( +size +) + +691  + `GlobAoc +( +GMEM_FIXED +, +size +); + +692 + } +} + +694  + $syem__mem +(* +r +) + +696 + `GlobFe +( +r +); + +697 + } +} + +699  +CH376_BOOL + + $syem__cڋxt +( +CH376_CONTEXT + * +cڋxt +, +UNUSED + * +ur_da +) + +702  +CH376_TRUE +; + +703 + } +}; + +705  + $syem_n_cڋxt +( +CH376_CONTEXT + * +cڋxt +) + +708 + } +} + +710  +CH376_BOOL + + $syem_g_disk_fo +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +ro_lock +,  +DiskQuy + * +disk_fo +) + +712 +BOOL + +g_fo + = +FALSE +; + +713  +vume +[4]; + +714 +DWORD + +s_r_u +; + +715 +DWORD + +bys_r_ +; + +716 +DWORD + +numb_of__us +; + +717 +DWORD + +tٮ_numb_of_us +; + +720 +vume +[0] = ((*) +ro_lock +-> +th +)[0] & 0xdf; + +721 +vume +[1] = ':'; + +722 +vume +[2] = '\\'; + +723 +vume +[3] = '\0'; + +725 if( + `GDiskFeS +( +vume +, & +s_r_u +, & +bys_r_ +, & +numb_of__us +, & +tٮ_numb_of_us +)) + +727 +INT64 + +tٮ_ + = ( +tٮ_numb_of_us + * +s_r_u + * +bys_r_ +) / 512; + +728 +INT64 + +_ + = ( +numb_of__us + * +s_r_u + * +bys_r_ +) / 512; + +730 +disk_fo +-> +DISK_TٮSe +[0] = ( +INT8 +)(( +tٮ_ + & 0x000000ff) >> 0); + +731 +disk_fo +-> +DISK_TٮSe +[1] = ( +INT8 +)(( +tٮ_ + & 0x0000ff00) >> 8); + +732 +disk_fo +-> +DISK_TٮSe +[2] = ( +INT8 +)(( +tٮ_ + & 0x00ff0000) >> 16); + +733 +disk_fo +-> +DISK_TٮSe +[3] = ( +INT8 +)(( +tٮ_ + & 0xff000000) >> 24); + +735 +disk_fo +-> +DISK_FeSe +[0] = ( +INT8 +)(( +_ + & 0x000000ff) >> 0); + +736 +disk_fo +-> +DISK_FeSe +[1] = ( +INT8 +)(( +_ + & 0x0000ff00) >> 8); + +737 +disk_fo +-> +DISK_FeSe +[2] = ( +INT8 +)(( +_ + & 0x00ff0000) >> 16); + +738 +disk_fo +-> +DISK_FeSe +[3] = ( +INT8 +)(( +_ + & 0xff000000) >> 24); + +740 +disk_fo +-> +DISK_DiskF + = 0x0c; + +742 +g_fo + = +TRUE +; + +744  +g_fo +; + +745 + } +} + +747  +CH376_LOCK + + $syem_ob_dey_lock +( +CH376_CONTEXT + * +cڋxt +, cڡ * +d_th +, +CH376_LOCK + +ro_lock +) + +749 +CH376_LOCK + +lock + = +NULL +; + +750 +TCHAR + +d_d +[ +MAX_PATH +]; + +751  + + +s +; + +753 if( +ro_lock +) + +755 + `GCutDey +(( +d_d +), old_dir); + +756 + `SCutDey +( +ro_lock +-> +th +); + +760 if( + ` +( +d_th +,& +s +=0 && s. +_mode + & +S_IFDIR +) + +762 +lock + = ( +CH376_LOCK +) + `syem_loc_mem +(( +_CH376_LOCK + )); + +763 + `GFuPhName +( +d_th +, +MAX_PATH +, +lock +-> +th +, +NULL +); + +764 +lock +-> +hd + = +INVALID_HANDLE_VALUE +; + +767 if( +ro_lock +) + +769 + `SCutDey +( +d_d +); + +772  +lock +; + +773 + } +} + +775  + $syem_a_dey_lock +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +d_lock +) + +777 if( +d_lock + !( +CH376_LOCK +)0) + +779 + `syem__mem +( +d_lock +); + +781 + } +} + +783  +CH376_LOCK + + $syem_e_dey_lock +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +d_lock +) + +785 +CH376_LOCK + +dup_lock + = (CH376_LOCK) + `syem_loc_mem +(( +_CH376_LOCK +)); + +787 + `CyMemy +( +dup_lock +, +d_lock +, ( +_CH376_LOCK +)); + +789  +dup_lock +; + +790 + } +} + +792  +HANDLE + + $fe_ݒ +( +CH376_CONTEXT + * +cڋxt +, cڡ * +fe_me +, +PCHAR + +ro_th +, +DWORD + +ti_diosi +) + +794 +TCHAR + +d_d +[ +MAX_PATH +]; + +795 +HANDLE + +fe +; + +797 if( +ro_th +) + +799 + `GCutDey +(( +d_d +), old_dir); + +800 + `SCutDey +( +ro_th +); + +803 +fe + = + `CeFe +( +fe_me +, +GENERIC_READ + | +GENERIC_WRITE +, 0, +NULL +, +ti_diosi +, +FILE_ATTRIBUTE_NORMAL +, NULL); + +805 if( +ro_th +) + +807 + `SCutDey +( +d_d +); + +810 if( +fe + ! +INVALID_HANDLE_VALUE +) + +811  +fe +; + +813  +NULL +; + +814 + } +} + +816  +CH376_BOOL + + $syem_fe_de +( +CH376_CONTEXT + * +cڋxt +, cڡ * +fe_me +, +CH376_LOCK + +ro_lock +) + +818 +LONG + +r +; + +819 +TCHAR + +d_d +[ +MAX_PATH +]; + +821 i( +ro_lock +) + +823 + `GCutDey +(( +d_d +), old_dir); + +824 + `SCutDey +( +ro_lock +-> +th +); + +827 + `dbg_tf +("syem_fe_de: %s\n", +fe_me +); + +829 +r + = + `DeFe +( +fe_me +); + +831 i( +ro_lock +) + +833 + `SCutDey +( +d_d +); + +837  ( +r + != 0); + +838 + } +} + +840  +CH376_BOOL + + $syem_dey_de +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +ro_lock +) + +842 + `dbg_tf +("syem_dey_de: %s\n", +ro_lock +); + +844 i( +ro_lock +) + +845  ( + `RemoveDey +(( +LPCSTR +) +ro_lock +) != 0); + +847  +CH376_FALSE +; + +848 + } +} + +850  +CH376_LOCK + + $syem__dey +( +CH376_CONTEXT + * +cڋxt +, cڡ * +d_th +, +CH376_LOCK + +ro_lock +) + +852 +TCHAR + +d_d +[ +MAX_PATH +]; + +853 +CH376_LOCK + +lock + = +NULL +; + +855 i( +ro_lock +) + +857 + `GCutDey +(( +d_d +), old_dir); + +858 + `SCutDey +( +ro_lock +-> +th +); + +861 + `dbg_tf +("syem__dey: %s\n", +d_th +); + +863 i( + `CeDey +( +d_th +, +NULL +)) + +865 +lock + = ( +CH376_LOCK +) + `syem_loc_mem +(( +_CH376_LOCK + )); + +866 + `SCutDey +( +d_th +); + +867 + `GCutDey +(( +lock +-> +th +),ock->path); + +868 +lock +-> +hd + = +INVALID_HANDLE_VALUE +; + +871 i( +ro_lock +) + +873 + `SCutDey +( +d_d +); + +876  +lock +; + +878 + } +} + +882  +CH376_FILE + + $syem_fe_ݒ_exig +( +CH376_CONTEXT + * +cڋxt +, cڡ * +fe_me +, +CH376_LOCK + +ro_lock +) + +884  + `fe_ݒ +( +cڋxt +, +fe_me +, +ro_lock +-> +th +, +OPEN_EXISTING +); + +885 + } +} + +887  +CH376_FILE + + $syem_fe_ݒ_w +( +CH376_CONTEXT + * +cڋxt +, cڡ * +fe_me +, +CH376_LOCK + +ro_lock +) + +889  + `fe_ݒ +( +cڋxt +, +fe_me +, +ro_lock +-> +th +, +CREATE_ALWAYS +); + +890 + } +} + +892  + $syem_fe_o +( +CH376_CONTEXT + * +cڋxt +, +CH376_FILE + +fe +) + +894 if( +fe + + `CloHd +(file); + +895 + } +} + +897  +CH376_S32 + + $syem_fe_ek +( +CH376_CONTEXT + * +cڋxt +, +CH376_FILE + +fe +,  +pos +) + +899 if( +fe + ! +NULL +) + +900  + `SFePor +( +fe +, +pos +, +NULL +, +FILE_BEGIN +); + +903 + } +} + +905  +CH376_S32 + + $syem_fe_ad +( +CH376_CONTEXT + * +cڋxt +, +CH376_FILE + +fe +, * +bufr +, +CH376_S32 + +size +) + +907 +DWORD + +ad_bys +; + +909 if( + `RdFe +( +fe +, +bufr +, +size +, & +ad_bys +, +NULL +)) + +910  +ad_bys +; + +913 + } +} + +915  +CH376_S32 + + $syem_fe_wre +( +CH376_CONTEXT + * +cڋxt +, +CH376_FILE + +fe +, * +bufr +, +CH376_S32 + +size +) + +917 +DWORD + +wrn_bys +; + +919 if( + `WreFe +( +fe +, +bufr +, +size +, & +wrn_bys +, +NULL +)) + +920  +wrn_bys +; + +923 + } +} + +925  +CH376_DIR + + $syem_t_exame_dey +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +d_lock +) + +927 +LPWIN32_FIND_DATA + +fd_fe_da + = (LPWIN32_FIND_DATA) + `syem_loc_mem +(( +WIN32_FIND_DATA +)); + +928 +TCHAR + +szD +[ +MAX_PATH +]; + +929 + `SgCchCy +( +szD +, +MAX_PATH +, +d_lock +-> +th +); + +930 + `SgCchC +( +szD +, +MAX_PATH +, + `TEXT +("\\*")); + +932 +d_lock +-> +hd + = + `FdFFe +( +szD +, +fd_fe_da +); + +934 if( +d_lock +-> +hd + = +INVALID_HANDLE_VALUE +) + +936 + `syem__mem +( +fd_fe_da +); + +937 +fd_fe_da + = +NULL +; + +940  +fd_fe_da +; + +941 + } +} + +943  +CH376_BOOL + + $syem_go_exame_dey +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +d_lock +, +CH376_DIR + +fib +,  +FDInfo + * +d_fo +, * +n +) + +945 +BOOL + +is_de + = +FALSE +; + +947 if( +d_lock +-> +hd + ! +INVALID_HANDLE_VALUE +) + +949 ! +is_de + && + `FdNextFe +( +d_lock +-> +hd +, +fib +)) + +951 if( + `nmize_fe_me +( +fib +-> +cFeName +, +d_fo +-> +DIR_Name +&& + `n_mch +( +n +, dir_info->DIR_Name)) + +954 +d_fo +-> +DIR_Ar + = ( +UINT8 +) +fib +-> +dwFeAribus +; + +956 + `dbg_tf +("syem_go_exame_dey defed fibus: %d\n", +d_fo +-> +DIR_Ar +); + +958 +d_fo +-> +DIR_NTRes + = 0; + +959 +d_fo +-> +DIR_CTimeTth + = 0; + +960 +d_fo +-> +DIR_CTime +[0] = 0; + +961 +d_fo +-> +DIR_CTime +[1] = 0; + +962 +d_fo +-> +DIR_CDe +[0] = 0; + +963 +d_fo +-> +DIR_CDe +[1] = 0; + +964 +d_fo +-> +DIR_LAccDe +[0] = 0; + +965 +d_fo +-> +DIR_LAccDe +[1] = 0; + +966 +d_fo +-> +DIR_FClusHI +[0] = 0; + +967 +d_fo +-> +DIR_FClusHI +[1] = 0; + +968 +d_fo +-> +DIR_WTime +[0] = 0; + +969 +d_fo +-> +DIR_WTime +[1] = 0; + +970 +d_fo +-> +DIR_WDe +[0] = 0; + +971 +d_fo +-> +DIR_WDe +[1] = 0; + +972 +d_fo +-> +DIR_FClusLO +[0] = 0; + +973 +d_fo +-> +DIR_FClusLO +[1] = 0; + +974 +d_fo +-> +DIR_FeSize +[0] = ( +UINT8 +)(( +fib +-> +nFeSizeLow + & 0x000000ff) >> 0); + +975 +d_fo +-> +DIR_FeSize +[1] = ( +UINT8 +)(( +fib +-> +nFeSizeLow + & 0x0000ff00) >> 8); + +976 +d_fo +-> +DIR_FeSize +[2] = ( +UINT8 +)(( +fib +-> +nFeSizeLow + & 0x00ff0000) >> 16); + +977 +d_fo +-> +DIR_FeSize +[3] = ( +UINT8 +)(( +fib +-> +nFeSizeLow + & 0xff000000) >> 24); + +979 +is_de + = +TRUE +; + +984  +is_de +; + +985 + } +} + +987  + $syem_fish_exame_dey +( +CH376_CONTEXT + * +cڋxt +, +CH376_DIR + +fib +) + +989 if( +fib +) + +991 + `FdClo +( +fib +); + +992 + `syem__mem +( +fib +); + +994 + } +} + +996  +CH376_S32 + + $syem_g_fe_size +( +CH376_CONTEXT + * +cڋxt +, +CH376_FILE + +fe +) + +998 +CH376_S32 + +fe_size + = 0xffffffff; + +999 +BY_HANDLE_FILE_INFORMATION + +fe_ +; + +1001 i( +fe +) + +1003 i + `GFeInfmiByHd +( +fe +, & +fe_ +) ) + +1006 +fe_size + = +fe_ +. +nFeSizeLow +; + +1010 + `dbg_tf +("system_get_file_size:rror\n"); + +1014 + `dbg_tf +("system_get_file_size:o file handle\n"); + +1016  +fe_size +; + +1017 + } +} + +1021 #i +defed +( +__unix__ +|| defed( +__APPLE__ +|| defed( +__HAIKU__ +) + +1025 #ifde +DEBUG_CH376 + + +1026  + #dbg_tf +(... + `rtf +( +dr +, +__VA_ARGS__ +) + + ) + +1028  + #dbg_tf +(...) + + ) + +1031 * + $syem_loc_mem +( +size +) + +1033  + `mloc +( +size +); + +1034 + } +} + +1036  + $syem__mem +(* +r +) + +1038 i( +r +) + +1039 + ` +( +r +); + +1040 + } +} + +1042  +CH376_BOOL + + $syem__cڋxt +( +CH376_CONTEXT + * +cڋxt +, +UNUSED + * +ur_da +) + +1045  +CH376_TRUE +; + +1046 + } +} + +1048  + $syem_n_cڋxt +( +CH376_CONTEXT + * +cڋxt +) + +1051 + } +} + +1053  +CH376_BOOL + + $syem_g_disk_fo +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +ro_lock +,  +DiskQuy + * +disk_fo +) + +1055 +CH376_BOOL + +g_fo + = +CH376_FALSE +; + +1057 if( +disk_fo +) + +1059  +vfs + +s +; + +1061 if( + `vfs +( +ro_lock +, & +s +) == 0) + +1063 +t64_t + +tٮ_ + = ( +s +. +f_blocks + * sts. +f_bsize +) / 512; + +1064 +t64_t + +_ + = ( +s +. +f_b + * sts. +f_bsize +) / 512; + +1066 +disk_fo +-> +DISK_TٮSe +[0] = ( +tٮ_ + & 0x000000ff) >> 0; + +1067 +disk_fo +-> +DISK_TٮSe +[1] = ( +tٮ_ + & 0x0000ff00) >> 8; + +1068 +disk_fo +-> +DISK_TٮSe +[2] = ( +tٮ_ + & 0x00ff0000) >> 16; + +1069 +disk_fo +-> +DISK_TٮSe +[3] = ( +tٮ_ + & 0xff000000) >> 24; + +1071 +disk_fo +-> +DISK_FeSe +[0] = ( +_ + & 0x000000ff) >> 0; + +1072 +disk_fo +-> +DISK_FeSe +[1] = ( +_ + & 0x0000ff00) >> 8; + +1073 +disk_fo +-> +DISK_FeSe +[2] = ( +_ + & 0x00ff0000) >> 16; + +1074 +disk_fo +-> +DISK_FeSe +[3] = ( +_ + & 0xff000000) >> 24; + +1076 +disk_fo +-> +DISK_DiskF + = 0x0c; + +1078 +g_fo + = +CH376_TRUE +; + +1082  +g_fo +; + +1083 + } +} + +1085  +CH376_LOCK + + $syem_ob_dey_lock +( +CH376_CONTEXT + * +cڋxt +, cڡ * +d_th +, +CH376_LOCK + +ro_lock +) + +1087 +CH376_LOCK + +lock + = +NULL +; + +1088 * +d_d + = +NULL +; + +1089  + + +th_ +; + +1091 + `dbg_tf +("syem_ob_dey_lock: %s\n", +d_th +); + +1093 if( +ro_lock +) + +1095 if(( +d_d + = + `gcwd +( +NULL +, 0)) != NULL) + +1096 + `chd +( +ro_lock +); + +1099 + ` +( +d_th +, & +th_ +); + +1100 if( + `S_ISDIR +( +th_ +. +_mode +)) + +1102 +lock + = + `th +( +d_th +, +NULL +); + +1105 if( +d_d +) + +1107 if( +d_d + ! +NULL +) + +1109 + `chd +( +d_d +); + +1110 + `syem__mem +( +d_d +); + +1114  +lock +; + +1115 + } +} + +1117  + $syem_a_dey_lock +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +d_lock +) + +1119 if( +d_lock + !( +CH376_LOCK +)0) + +1121 + `syem__mem +( +d_lock +); + +1123 + } +} + +1125  +CH376_LOCK + + $syem_e_dey_lock +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +d_lock +) + +1127  + `rdup +( +d_lock +); + +1128 + } +} + +1130  +FILE + * + $fe_ݒ +(cڡ * +fe_me +, +CH376_LOCK + +ro_lock +, cڡ * +mode +) + +1132 +FILE + * +fe +; + +1133 * +d_d + = +NULL +; + +1137 if( +ro_lock +) + +1139 if(( +d_d + = + `gcwd +( +NULL +, 0)) != NULL) + +1140 + `chd +( +ro_lock +); + +1143 +fe + = + `fݒ +( +fe_me +, +mode +); + +1145 if( +d_d +) + +1147 + `chd +( +d_d +); + +1148 + `syem__mem +( +d_d +); + +1151  +fe +; + +1152 + } +} + +1154  +CH376_BOOL + + $syem_fe_de +( +CH376_CONTEXT + * +cڋxt +, cڡ * +fe_me +, +CH376_LOCK + +ro_lock +) + +1156  +r +; + +1157 * +d_d + = +NULL +; + +1159 if( +ro_lock +) + +1161 if(( +d_d + = + `gcwd +( +NULL +, 0)) != NULL) + +1162 + `chd +( +ro_lock +); + +1165 +r + = + `move +( +fe_me +); + +1167 + `dbg_tf +("syem_fe_de: %s\n", +fe_me +); + +1169 if( +d_d +) + +1171 if( +d_d + ! +NULL +) + +1173 + `chd +( +d_d +); + +1174 + `syem__mem +( +d_d +); + +1178  ( +r + == 0); + +1179 + } +} + +1181  +CH376_BOOL + + $syem_dey_de +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +ro_lock +) + +1183 + `dbg_tf +("syem_dey_de: %s\n", +ro_lock +); + +1185 i( +ro_lock +) + +1186  ( + `rmd +( +ro_lock +) == 0); + +1188  +CH376_FALSE +; + +1189 + } +} + +1191  +CH376_LOCK + + $syem__dey +( +CH376_CONTEXT + * +cڋxt +, cڡ * +d_th +, +CH376_LOCK + +ro_lock +) + +1193 +CH376_LOCK + +lock + = +NULL +; + +1194 * +d_d + = +NULL +; + +1196 if( +ro_lock +) + +1198 if(( +d_d + = + `gcwd +( +NULL +, 0)) != NULL) + +1199 + `chd +( +ro_lock +); + +1202 + `dbg_tf +("syem__dey: %s\n", +d_th +); + +1204 i(! + `mkd +( +d_th +, +S_IRWXU + | +S_IRWXG + | +S_IROTH + | +S_IXOTH +)) + +1205 +lock + = + `th +( +d_th +, +NULL +); + +1207 if( +d_d +) + +1209 + `chd +( +d_d +); + +1210 + `syem__mem +( +d_d +); + +1213  +lock +; + +1214 + } +} + +1216  +CH376_FILE + + $syem_fe_ݒ_exig +( +CH376_CONTEXT + * +cڋxt +, cڡ * +fe_me +, +CH376_LOCK + +ro_lock +) + +1218 +FILE + * + +; + +1220 + + = + `fe_ݒ +( +fe_me +, +ro_lock +, "rb+"); + +1222  + +; + +1223 + } +} + +1225  +CH376_FILE + + $syem_fe_ݒ_w +( +CH376_CONTEXT + * +cڋxt +, cڡ * +fe_me +, +CH376_LOCK + +ro_lock +) + +1227  + `fe_ݒ +( +fe_me +, +ro_lock +, "wb+"); + +1228 + } +} + +1230  + $syem_fe_o +( +CH376_CONTEXT + * +cڋxt +, +CH376_FILE + +fe +) + +1232 i( +fe + + `fo +(file); + +1233 + } +} + +1235  +CH376_S32 + + $syem_fe_ek +( +CH376_CONTEXT + * +cڋxt +, +CH376_FILE + +fe +,  +pos +) + +1237 + `dbg_tf +("syem_fe_ekrygأekposi %d\n", +pos +); + +1239 if( +fe +) + +1240 i(! + `fek +( +fe +, +pos +, +SEEK_SET +)) + +1241  + `l +( +fe +); + +1244 + } +} + +1246  +CH376_S32 + + $syem_fe_ad +( +CH376_CONTEXT + * +cڋxt +, +CH376_FILE + +fe +, * +bufr +, +CH376_S32 + +size +) + +1248 + `dbg_tf +("syem_fe_adrygػad %d bys\n", +size +); + +1250 if( +fe +) + +1251  + `d +( +bufr +, 1, +size +, +fe +); + +1254 + } +} + +1256  +CH376_S32 + + $syem_fe_wre +( +CH376_CONTEXT + * +cڋxt +, +CH376_FILE + +fe +, * +bufr +, +CH376_S32 + +size +) + +1258 + `dbg_tf +("syem_fe_wrygwr%d bys\n", +size +); + +1260 if( +fe +) + +1261  + `fwre +( +bufr +, 1, +size +, +fe +); + +1264 + } +} + +1266  +CH376_DIR + + $syem_t_exame_dey +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +d_lock +) + +1268 +CH376_DIR + +fib + = + `syem_loc_mem +(( +_CH376_DIR +)); + +1270 if( +fib +) + +1272 +fib +-> +hd + = + `ݒd +( +d_lock +); + +1273 +fib +-> +y + = +NULL +; + +1276  +fib +; + +1277 + } +} + +1279  +CH376_BOOL + + $syem_go_exame_dey +( +CH376_CONTEXT + * +cڋxt +, +CH376_LOCK + +d_lock +, +CH376_DIR + +fib +,  +FDInfo + * +d_fo +, * +n +) + +1281 +CH376_BOOL + +is_de + = +CH376_FALSE +; + +1282  + + +fe_ +; + +1283 * +d_d + = +NULL +; + +1285 if( +d_lock +) + +1287 if(( +d_d + = + `gcwd +( +NULL +, 0)) != NULL) + +1288 + `chd +( +d_lock +); + +1291 if( +fib +! +is_de + && (fib-> +y + = + `add +(fib-> +hd +))) + +1293 if( + `nmize_fe_me +( +fib +-> +y +-> +d_me +, +d_fo +-> +DIR_Name +&& + `n_mch +( +n +, dir_info->DIR_Name)) + +1295 + ` +( +fib +-> +y +-> +d_me +, & +fe_ +); + +1297 +d_fo +-> +DIR_Ar + = 0; + +1299 if( + `S_ISDIR +( +fe_ +. +_mode +)) + +1300 +d_fo +-> +DIR_Ar + | +DIR_ATTR_DIRECTORY +; + +1301 if(( +fe_ +. +_mode + & +S_IRUSR +) == 0) + +1302 +d_fo +-> +DIR_Ar + | +DIR_ATTR_READ_ONLY +; + +1304 + `dbg_tf +("syem_go_exame_dey defed fibus: %d\n", +d_fo +-> +DIR_Ar +); + +1306 +d_fo +-> +DIR_NTRes + = 0; + +1307 +d_fo +-> +DIR_CTimeTth + = 0; + +1308 +d_fo +-> +DIR_CTime +[0] = 0; + +1309 +d_fo +-> +DIR_CTime +[1] = 0; + +1310 +d_fo +-> +DIR_CDe +[0] = 0; + +1311 +d_fo +-> +DIR_CDe +[1] = 0; + +1312 +d_fo +-> +DIR_LAccDe +[0] = 0; + +1313 +d_fo +-> +DIR_LAccDe +[1] = 0; + +1314 +d_fo +-> +DIR_FClusHI +[0] = 0; + +1315 +d_fo +-> +DIR_FClusHI +[1] = 0; + +1316 +d_fo +-> +DIR_WTime +[0] = 0; + +1317 +d_fo +-> +DIR_WTime +[1] = 0; + +1318 +d_fo +-> +DIR_WDe +[0] = 0; + +1319 +d_fo +-> +DIR_WDe +[1] = 0; + +1320 +d_fo +-> +DIR_FClusLO +[0] = 0; + +1321 +d_fo +-> +DIR_FClusLO +[1] = 0; + +1322 +d_fo +-> +DIR_FeSize +[0] = ( +fe_ +. +_size + & 0x000000ff) >> 0; + +1323 +d_fo +-> +DIR_FeSize +[1] = ( +fe_ +. +_size + & 0x0000ff00) >> 8; + +1324 +d_fo +-> +DIR_FeSize +[2] = ( +fe_ +. +_size + & 0x00ff0000) >> 16; + +1325 +d_fo +-> +DIR_FeSize +[3] = ( +fe_ +. +_size + & 0xff000000) >> 24; + +1327 +is_de + = +CH376_TRUE +; + +1331 if( +d_d +) + +1333 + `chd +( +d_d +); + +1334 + `syem__mem +( +d_d +); + +1337  +is_de +; + +1338 + } +} + +1340  + $syem_fish_exame_dey +( +CH376_CONTEXT + * +cڋxt +, +CH376_DIR + +fib +) + +1342 i( +fib +) + +1344 + `od +( +fib +-> +hd +); + +1345 + `syem__mem +( +fib +); + +1347 + } +} + +1349  +CH376_S32 + + $syem_g_fe_size +( +CH376_CONTEXT + * +cڋxt +, +CH376_FILE + +fe +) + +1351 +CH376_S32 + +fe_size + = 0xffffffff; + +1352  + + +fe_ +; + +1354 i( +fe +) + +1356 i! + `f +( + `fo +( +fe +), & +fe_ +) ) + +1358 +fe_size + = +fe_ +. +_size +; + +1362 + `dbg_tf +("system_get_file_size:rror\n"); + +1366 + `dbg_tf +("system_get_file_size:o file handle\n"); + +1368  +fe_size +; + +1369 + } +} + +1379 * + $e_rg +(cڡ * +rg +) + +1381  +l +; + +1382 * +s +; + +1384  +l +=0; +rg +[l]!='\0';++); + +1386 +s + = + `syem_loc_mem +( +l +); + +1388  +l +=0; +rg +[l]!='\0';++) + +1389 +s +[ +l +] = +rg +[l]; + +1391 +s +[ +l +] = '\0'; + +1393  +s +; + +1394 + } +} + +1396  + $r_ruu +( +ch376 + *ch376) + +1398 +ch376 +-> +commd + = +CH376_CMD_NONE +; + +1399 +ch376 +-> +commd_us + = 0; + +1400 +ch376 +-> +r_us + = 0; + +1401 +ch376 +-> +nb_bys__cmd_da + = 0; + +1402 +ch376 +-> +pos_rw__cmd_da + = 0; + +1403 +ch376 +-> +usb_mode + = +CH376_ARG_SET_USB_MODE_INVALID +; + +1404 +ch376 +-> +bys_to_ad_wre + = 0; + +1405 +ch376 +-> +ro_d_lock + = ( +CH376_LOCK +)0; + +1406 +ch376 +-> +cut_d_lock + = ( +CH376_LOCK +)0; + +1407 +ch376 +-> +cut_fe + = ( +CH376_FILE +)0; + +1408 +ch376 +-> +cut_dey_browsg + = ( +CH376_DIR +)0; + +1409 + } +} + +1411  + $nl_l_io +( +ch376 + *ch376) + +1414 +ch376 +-> +bys_to_ad_wre + = 0; + +1417 + `syem_fish_exame_dey +(& +ch376 +-> +cڋxt +, ch376-> +cut_dey_browsg +); + +1418 +ch376 +-> +cut_dey_browsg + = ( +CH376_DIR +)0; + +1419 + `syem_fe_o +(& +ch376 +-> +cڋxt +, ch376-> +cut_fe +); + +1420 +ch376 +-> +cut_fe + = ( +CH376_FILE +)0; + +1423 + `syem_a_dey_lock +(& +ch376 +-> +cڋxt +, ch376-> +ro_d_lock +); + +1424 +ch376 +-> +ro_d_lock + = ( +CH376_LOCK +)0; + +1425 + `syem_a_dey_lock +(& +ch376 +-> +cڋxt +, ch376-> +cut_d_lock +); + +1426 +ch376 +-> +cut_d_lock + = ( +CH376_LOCK +)0; + +1427 + } +} + +1431  + $nmize_ch +( +c +) + +1433 if( +c + > 127) + +1436 if( +c + >='a' && c <='z') + +1437  +c + - ('a' - 'A'); + +1439  +c +; + +1440 + } +} + +1444 cڡ * + $nmize_fe_me +(cڡ * +fe_me +, * +nmized_fe_me +) + +1446  +i + = 0; + +1447  +j + = 0; + +1448  +c +; + +1450 + `dbg_tf +("nmize_fe_me: %s\n", +fe_me +); + +1452  +fe_me +[ +i +] !'\0' && fe_me[i] !'.' && +j + < 8) + +1454 +c + = + `nmize_ch +( +fe_me +[ +i +++]); + +1456 if( +c + == -1) + +1457  +NULL +; + +1459 +nmized_fe_me +[ +j +++] = () +c +; + +1462 if( +fe_me +[ +i +] == '\0') + +1464 ; +j +<8; j++) + +1466 +nmized_fe_me +[ +j +] = ' '; + +1469 if( +fe_me +[ +i +] == '.') + +1471 +i +++; + +1472 ; +j +<8; j++) + +1474 +nmized_fe_me +[ +j +] = ' '; + +1479 + `dbg_tf +("nmize_fe_mimpossib: %(%d=%c,%d=%c)\n", +fe_me +, +i +, fe_me[i], +j +, +nmized_fe_me +[j]); + +1480  +NULL +; + +1483  +fe_me +[ +i +] !'\0' && fe_me[i] !'.' && +j + < 11) + +1485 +c + = + `nmize_ch +( +fe_me +[ +i +++]); + +1487 if( +c + == -1) + +1488  +NULL +; + +1490 +nmized_fe_me +[ +j +++] = () +c +; + +1493 if( +fe_me +[ +i +] != '\0') + +1495 + `dbg_tf +("nmize_fe_mimpossib: %(%d=%c,%d=%c)\n", +fe_me +, +i +, fe_me[i], +j +, +nmized_fe_me +[j]); + +1496  +NULL +; + +1499 + `dbg_tf +("nmize_fe_mde: %(%d=&%02x,%d=&%02x)\n", +fe_me +, +i +, fe_me[i], +j +, +nmized_fe_me +[j]); + +1501 ; +j +<11; j++) + +1503 +nmized_fe_me +[ +j +] = ' '; + +1506 +nmized_fe_me +[ +j +] = '\0'; + +1508  +nmized_fe_me +; + +1509 + } +} + +1513 cڡ * + $im_fe_me +(cڡ * +fe_me +, * +immed_fe_me +) + +1515  +i + = 0; + +1516  +j + = 0; + +1518  +fe_me +[ +i +] != ' ' && file_name[i] != '\0') + +1519 +immed_fe_me +[ +j +++] = +fe_me +[ +i +++]; + +1521  +fe_me +[ +i +] == ' ') + +1522 +i +++; + +1524  +fe_me +[ +i +] != ' ' && file_name[i] != '\0') + +1525 +immed_fe_me +[ +j +++] = +fe_me +[ +i +++]; + +1527 if( +j + > 0 && +immed_fe_me +[j-1] == '.') + +1528 +j +--; + +1530 +immed_fe_me +[ +j +] = '\0'; + +1532 + `dbg_tf +("im_fe_mom \"%s\"\"%s\"\n", +fe_me +, +immed_fe_me +); + +1534  +immed_fe_me +; + +1535 + } +} + +1537  + $fe_ad_chunk +( +ch376 + *ch376) + +1539 +CH376_S32 + +bys_to_ad_now +; + +1540 +CH376_S32 + +bys_auly_ad +; + +1542 if( +ch376 +-> +bys_to_ad_wre + > (ch376-> +cmd_da +. +CMD_IOBufr +)) + +1543 +bys_to_ad_now + = ( +ch376 +-> +cmd_da +. +CMD_IOBufr +); + +1545 +bys_to_ad_now + = +ch376 +-> +bys_to_ad_wre +; + +1547 +bys_auly_ad + = + `syem_fe_ad +(& +ch376 +-> +cڋxt +, ch376-> +cut_fe +, &ch376-> +cmd_da +. +CMD_IOBufr +, +bys_to_ad_now +); + +1549 if( +bys_auly_ad + >= 0) + +1551 +ch376 +-> +bys_to_ad_wre + -( +CH376_U16 +) +bys_auly_ad +; + +1553 +ch376 +-> +nb_bys__cmd_da + = ( +CH376_U8 +) +bys_auly_ad +; + +1554 +ch376 +-> +r_us + = 127; + +1562 if( +bys_to_ad_now + =0 || +bys_auly_ad + == 0) + +1564 + `dbg_tf +("[WRITE][DATA][CH376_CMD_BYTE_READ]ll done:ead operated with success (no more data)\n"); + +1565 +ch376 +-> +commd_us + = +CH376_INT_SUCCESS +; + +1569 + `dbg_tf +("[WRITE][DATA][CH376_CMD_BYTE_READ] de:d od wh sucs(wag dad f %d byouo%d)\n", +ch376 +-> +nb_bys__cmd_da +, ch376-> +bys_to_ad_wre +); + +1570 +ch376 +-> +commd_us + = +CH376_INT_DISK_READ +; + +1575 + `dbg_tf +("[WRITE][DATA][CH376_CMD_BYTE_READ]borted:ead failure\n"); + +1577 +ch376 +-> +nb_bys__cmd_da + = 0; + +1578 +ch376 +-> +r_us + = 0; + +1579 +ch376 +-> +commd_us + = +CH376_RET_ABORT +; + +1581 + } +} + +1583  + $fe_wre_chunk +( +ch376 + *ch376) + +1585 +CH376_S32 + +bys_to_wre_now +; + +1586 +CH376_S32 + +bys_auly_wrn +; + +1588 +bys_to_wre_now + = +ch376 +-> +nb_bys__cmd_da +; + +1590 +bys_auly_wrn + = + `syem_fe_wre +(& +ch376 +-> +cڋxt +, ch376-> +cut_fe +, &ch376-> +cmd_da +. +CMD_IOBufr +, +bys_to_wre_now +); + +1592 if( +bys_auly_wrn + = +bys_to_wre_now +) + +1594 +ch376 +-> +bys_to_ad_wre + -( +CH376_U16 +) +bys_auly_wrn +; + +1596 +ch376 +-> +nb_bys__cmd_da + = 0; + +1597 +ch376 +-> +r_us + = 127; + +1598 if( +ch376 +-> +bys_to_ad_wre + == 0) + +1600 + `dbg_tf +("[WRITE][DATA][CH376_CMD_BYTE_WRITE]ll done: write operated with success (no more data)\n"); + +1601 +ch376 +-> +commd_us + = +CH376_INT_SUCCESS +; + +1605 if( +ch376 +-> +bys_to_ad_wre + > (ch376-> +cmd_da +. +CMD_IOBufr +)) + +1606 +ch376 +-> +nb_bys__cmd_da + = (ch376-> +cmd_da +. +CMD_IOBufr +); + +1608 +ch376 +-> +nb_bys__cmd_da + = ( +CH376_U8 +)ch376-> +bys_to_ad_wre +; + +1610 + `dbg_tf +("[WRITE][DATA][CH376_CMD_BYTE_WRITE] de: wrݔed wh sucs(wag dwrf %d byouo%d)\n", +ch376 +-> +nb_bys__cmd_da +, ch376-> +bys_to_ad_wre +); + +1611 +ch376 +-> +commd_us + = +CH376_INT_DISK_WRITE +; + +1616 + `dbg_tf +("[WRITE][DATA][CH376_CMD_BYTE_WRITE]borted: write failure\n"); + +1618 +ch376 +-> +nb_bys__cmd_da + = 0; + +1619 +ch376 +-> +r_us + = 0; + +1620 +ch376 +-> +commd_us + = +CH376_RET_ABORT +; + +1622 + } +} + +1625 cڡ * + $nmize_n +(cڡ * +n +, * +nmized_n +) + +1627  +i + = -1; + +1629 + `dbg_tf +("nmize_n: '%s'\n", +nmized_n +); + +1631 i(! + `rcmp +( +n +, "*")) + +1633 + `dbg_tf +("normalize_pattern: * -> *.*\n"); + +1634 + `nmize_fe_me +("*.*", +nmized_n +); + +1636 i(! + `nmize_fe_me +( +n +, +nmized_n +)) + +1638 + `dbg_tf +("normalize_pattern:rror\n"); + +1639 +nmized_n +[0] = '\0'; + +1640  +NULL +; + +1643  +i +<11) + +1645 +i +++; + +1646 i( +nmized_n +[ +i +] == '*') + +1650  +i + < 11) + +1651 +nmized_n +[ +i +++]='*'; + +1655 + `dbg_tf +("nmize_n: '%s' (i=%d)\n", +nmized_n +, +i +); + +1657  +nmized_n +; + +1658 + } +} + +1662  +CH376_BOOL + + $n_mch +(cڡ * +n +, cڡ * +fe_me +) + +1664 +CH376_BOOL + +found + = +CH376_FALSE +; + +1665  +i +=0; + +1667 + `dbg_tf +("n_mch('%s', '%s'=> ", +n +, +fe_me +); + +1671 i( +n +[ +i +] != '*') + +1673 i( +n +[ +i +] ! +fe_me +[i]) + +1675 +found + = +CH376_FALSE +; + +1678 i( +n +[ +i +] == '\0') + +1680 +found + = +CH376_TRUE +; + +1686 i( +fe_me +[ +i +] == '\0') + +1688 +found + = +CH376_TRUE +; + +1692 +i +++; + +1695 + `dbg_tf +("i=%d, found=%d\n", +i +, +found +); + +1696  +found +; + +1697 + } +} + +1703 +CH376_U8 + + $ch376_ad_commd_pt +( +ch376 + *ch376) + +1705 + `dbg_tf +("[READ][COMMAND] durg commd &%02x stu&%02x\n", +ch376 +-> +commd +, ch376-> +commd_us +); + +1706  +ch376 +-> +r_us +; + +1707 + } +} + +1713 +CH376_U8 + + $ch376_ad_da_pt +( +ch376 + *ch376) + +1715 +CH376_U8 + +da_out + = 0xff; + +1717 + `dbg_tf +(">> [READ][DATA] f durg commd &%02x stu&%02x\n", +ch376 +-> +commd +, ch376-> +commd_us +); + +1719  +ch376 +-> +commd +) + +1721  +CH376_CMD_CHECK_EXIST +: + +1722 +da_out + = +ch376 +-> +cmd_da +. +CMD_CheckBy +; + +1723 + `dbg_tf +("[READ][DATA][CH376_CMD_CHECK_EXIST] stg dp܈t&%02x\n", +da_out +); + +1726  +CH376_CMD_GET_FILE_SIZE +: + +1727 if( +ch376 +-> +nb_bys__cmd_da +) + +1729 if( +ch376 +-> +nb_bys__cmd_da + !ch376-> +pos_rw__cmd_da +) + +1731 +da_out + = +ch376 +-> +cmd_da +. +CMD_FeSize +[ch376-> +pos_rw__cmd_da +]; + +1733 + `dbg_tf +("[READ][DATA][CH376_CMD_GET_FILE_SIZE]d &%02x from i/buf㸩osi &%02x\n", +da_out +, +ch376 +-> +pos_rw__cmd_da +); + +1735 if(++ +ch376 +-> +pos_rw__cmd_da + =ch376-> +nb_bys__cmd_da +) + +1736 +ch376 +-> +nb_bys__cmd_da + = 0; + +1741 +da_out + = 0; + +1742 + `dbg_tf +("[READ][DATA][CH376_CMD_GET_FILE_SIZE]othingoead from i/o buffer\n"); + +1747  +CH376_CMD_GET_IC_VER +: + +1748 +da_out + = (0x40 | +CH376_DATA_IC_VER +) & 0x7f; + +1749 + `dbg_tf +("[READ][DATA][CH376_CMD_GET_IC_VER] stg dp܈t&%02x\n", +da_out +); + +1752  +CH376_CMD_SET_USB_MODE +: + +1753 if( +ch376 +-> +usb_mode + = +CH376_ARG_SET_USB_MODE_INVALID +) + +1755 +da_out + = +CH376_RET_ABORT +; + +1756 + `dbg_tf +("[READ][DATA][CH376_SET_USB_MODE]borted!\n"); + +1760 +da_out + = +CH376_RET_SUCCESS +; + +1761 + `dbg_tf +("[READ][DATA][CH376_SET_USB_MODE] completed!\n"); + +1765  +CH376_CMD_GET_STATUS +: + +1766 +da_out + = +ch376 +-> +commd_us +; + +1767 + `dbg_tf +("[READ][DATA][CH376_CMD_GET_STATUS] stg dp܈t&%02x\n", +da_out +); + +1770  +CH376_CMD_RD_USB_DATA0 +: + +1771 if( +ch376 +-> +nb_bys__cmd_da +) + +1773 if( +ch376 +-> +pos_rw__cmd_da + = +CMD_DATA_REQ_SIZE +) + +1775 +da_out + = +ch376 +-> +nb_bys__cmd_da +; + +1776 +ch376 +-> +pos_rw__cmd_da + = 0; + +1777 + `dbg_tf +("[READ][DATA][CH376_CMD_RD_USB_DATA0]d i/bufsize: &%02x\n", +da_out +); + +1779 if( +ch376 +-> +nb_bys__cmd_da + !ch376-> +pos_rw__cmd_da +) + +1781 +da_out + = +ch376 +-> +cmd_da +. +CMD_IOBufr +[ch376-> +pos_rw__cmd_da +]; + +1783 + `dbg_tf +("[READ][DATA][CH376_CMD_RD_USB_DATA0]d \"%c\" (&%02xom i/buf㸩osi &%02x\n", +da_out +, da_out, +ch376 +-> +pos_rw__cmd_da +); + +1785 if(++ +ch376 +-> +pos_rw__cmd_da + =ch376-> +nb_bys__cmd_da +) + +1786 +ch376 +-> +nb_bys__cmd_da + = 0; + +1791 +da_out + = 0; + +1792 + `dbg_tf +("[READ][DATA][CH376_CMD_RD_USB_DATA0]othingoead from i/o buffer\n"); + +1796  +CH376_CMD_WR_REQ_DATA +: + +1797 if( +ch376 +-> +nb_bys__cmd_da +) + +1799 if( +ch376 +-> +pos_rw__cmd_da + = +CMD_DATA_REQ_SIZE +) + +1801 +da_out + = +ch376 +-> +nb_bys__cmd_da +; + +1802 +ch376 +-> +pos_rw__cmd_da + = 0; + +1803 + `dbg_tf +("[READ][DATA][CH376_CMD_WR_REQ_DATA]d i/bufsize: &%02x\n", +da_out +); + +1808 +da_out + = 0; + +1809 + `dbg_tf +("[READ][DATA][CH376_CMD_WR_REQ_DATA]othingoead from i/o buffer\n"); + +1816 +da_out + = +ch376 +-> +cmd_da +. +CMD_IOBufr +[0]; + +1820 + `dbg_tf +("<< [READ][DATA] f durg commd &%02x stu&%02x\n", +ch376 +-> +commd +, ch376-> +commd_us +); + +1823  +da_out +; + +1824 + } +} + +1830  + $ch376_wre_commd_pt +( +ch376 + *ch376, +CH376_U8 + +commd +) + +1832 + `dbg_tf +(">> [WRITE][COMMAND] Wrcommd &%02x stu&%02x\n", +commd +, +ch376 +-> +commd_us +); + +1834 +ch376 +-> +r_us + = 0; + +1838 if( +ch376 +-> +commd + = +CH376_CMD_CHECK_EXIST +) + +1840 +ch376 +-> +cmd_da +. +CMD_CheckBy + = ~ +commd +; + +1841 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_CHECK_EXIST] g check by &%02x from commdt!\n", +commd +); + +1844  +commd +) + +1846  +CH376_CMD_CHECK_EXIST +: + +1847 +ch376 +-> +commd + = +CH376_CMD_CHECK_EXIST +; + +1848 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_CHECK_EXIST] waiting for check byte\n"); + +1851  +CH376_CMD_GET_FILE_SIZE +: + +1852 +ch376 +-> +commd + = +CH376_CMD_GET_FILE_SIZE +; + +1853 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_GET_FILE_SIZE] wait for &68 byte\n"); + +1856  +CH376_CMD_GET_IC_VER +: + +1857 +ch376 +-> +commd + = +CH376_CMD_GET_IC_VER +; + +1858 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_GET_IC_VER]\n"); + +1861  +CH376_CMD_SET_USB_MODE +: + +1862 +ch376 +-> +commd + = +CH376_CMD_SET_USB_MODE +; + +1863 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_SET_USB_MODE] waiting for usb mode data\n"); + +1866  +CH376_CMD_DISK_MOUNT +: + +1867 +ch376 +-> +commd + = +CH376_CMD_DISK_MOUNT +; + +1868 + `nl_l_io +( +ch376 +); + +1870 if( +ch376 +-> +usb_mode + = +CH376_ARG_SET_USB_MODE_SD_HOST +) + +1871 +ch376 +-> +ro_d_lock + = + `syem_ob_dey_lock +(&ch376-> +cڋxt +, ch376-> +sdrd_drive_th +, +NULL +); + +1872 if( +ch376 +-> +usb_mode + = +CH376_ARG_SET_USB_MODE_USB_HOST +) + +1873 +ch376 +-> +ro_d_lock + = + `syem_ob_dey_lock +(&ch376-> +cڋxt +, ch376-> +usb_drive_th +, +NULL +); + +1875 if( +ch376 +-> +ro_d_lock +) + +1877 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_DeviTy + = 0; + +1878 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_RemovabMed + = 0; + +1879 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_Vsis + = 0; + +1880 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_DaFmAndEtc + = 0; + +1881 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_AddiڮLgth + = 0; + +1882 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_Rerved1 + = 0; + +1883 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_Rerved2 + = 0; + +1884 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_MiscFg + = 0; + +1885 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_VdIdS +[0] = 'J'; + +1886 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_VdIdS +[1] = 'E'; + +1887 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_VdIdS +[2] = 'D'; + +1888 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_VdIdS +[3] = 'E'; + +1889 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_VdIdS +[4] = '+'; + +1890 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_VdIdS +[5] = 'O'; + +1891 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_VdIdS +[6] = 'F'; + +1892 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_VdIdS +[7] = 'T'; + +1893 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_ProduIdS +[ 0] = 'C'; + +1894 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_ProduIdS +[ 1] = 'H'; + +1895 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_ProduIdS +[ 2] = '3'; + +1896 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_ProduIdS +[ 3] = '7'; + +1897 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_ProduIdS +[ 4] = '6'; + +1898 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_ProduIdS +[ 5] = ' '; + +1899 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_ProduIdS +[ 6] = 'E'; + +1900 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_ProduIdS +[ 7] = 'M'; + +1901 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_ProduIdS +[ 8] = 'U'; + +1902 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_ProduIdS +[ 9] = 'L'; + +1903 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_ProduIdS +[10] = 'A'; + +1904 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_ProduIdS +[11] = 'T'; + +1905 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_ProduIdS +[12] = 'O'; + +1906 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_ProduIdS +[13] = 'R'; + +1907 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_ProduIdS +[14] = ' '; + +1908 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_ProduIdS +[15] = ' '; + +1909 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_ProduRevS +[0] = 'F'; + +1910 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_ProduRevS +[1] = 'A'; + +1911 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_ProduRevS +[2] = 'M'; + +1912 +ch376 +-> +cmd_da +. +CMD_MouInfo +. +MOUNT_ProduRevS +[3] = 'E'; + +1914 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_DISK_MOUNT] drive directory is found (mounted :);dditional datavailable\n"); + +1916 +ch376 +-> +nb_bys__cmd_da + = (ch376-> +cmd_da +. +CMD_MouInfo +); + +1917 +ch376 +-> +r_us + = 127; + +1918 +ch376 +-> +commd_us + = +CH376_INT_SUCCESS +; + +1922 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_DISK_MOUNT] drive directoryot found\n"); + +1923 +ch376 +-> +commd_us + = 0x1f; + +1927  +CH376_CMD_GET_STATUS +: + +1928 +ch376 +-> +commd + = +CH376_CMD_GET_STATUS +; + +1929 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_GET_STATUS] waiting for statuseading\n"); + +1932  +CH376_CMD_SET_FILE_NAME +: + +1933 +ch376 +-> +commd + = +CH376_CMD_SET_FILE_NAME +; + +1934 +ch376 +-> +pos_rw__cmd_da + = 0; + +1935 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_SET_FILE_NAME] waiting for fileame\n"); + +1938  +CH376_CMD_FILE_OPEN +: + +1939 +ch376 +-> +commd + = +CH376_CMD_FILE_OPEN +; + +1941 if( +ch376 +-> +ro_d_lock +) + +1943  +i + = 0; + +1946 if( +ch376 +-> +cmd_da +. +CMD_FeName +[ +i +] == '/') + +1948 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_FILE_OPEN] openingoot directory\n"); + +1949 + `syem_a_dey_lock +(& +ch376 +-> +cڋxt +, ch376-> +cut_d_lock +); + +1950 +ch376 +-> +cut_d_lock + = + `syem_e_dey_lock +(&ch376-> +cڋxt +, ch376-> +ro_d_lock +); + +1951 +i +++; + +1954 if( +ch376 +-> +cmd_da +. +CMD_FeName +[ +i +] == '\0') + +1957 +ch376 +-> +r_us + = 127; + +1958 +ch376 +-> +commd_us + = +CH376_ERR_OPEN_DIR +; + +1959 +ch376 +-> +cut_fe_is_dey + = +CH376_TRUE +; + +1964 if( + `rchr +( +ch376 +-> +cmd_da +. +CMD_FeName +,'*') || strchr(ch376->cmd_data.CMD_FileName,'?')) + +1966 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_FILE_OPEN]xamining directory contents\n"); + +1969 + `syem_fish_exame_dey +(& +ch376 +-> +cڋxt +, ch376-> +cut_dey_browsg +); + +1970 +ch376 +-> +cut_dey_browsg + = + `syem_t_exame_dey +(&ch376-> +cڋxt +, ch376-> +cut_d_lock +); + +1971 + `nmize_n +( +ch376 +-> +cmd_da +. +CMD_FeName +, ch376-> +d_n +); + +1973  +fe_um_go +; + +1977  +fixed_fe_me +[13]; + +1978 +CH376_LOCK + +cut_d_lock +; + +1979 + `im_fe_me +(& +ch376 +-> +cmd_da +. +CMD_FeName +[ +i +], +fixed_fe_me +); + +1981 +cut_d_lock + = + `syem_ob_dey_lock +(& +ch376 +-> +cڋxt +, +fixed_fe_me +, ch376->current_dir_lock); + +1984 if( +cut_d_lock +) + +1986 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_FILE_OPEN]g dey: %s\n", & +ch376 +-> +cmd_da +. +CMD_FeName +[ +i +]); + +1988 + `syem_a_dey_lock +(& +ch376 +-> +cڋxt +, ch376-> +cut_d_lock +); + +1989 +ch376 +-> +cut_d_lock + = current_dir_lock; + +1990 +ch376 +-> +cut_fe_is_dey + = +CH376_TRUE +; + +1992 +ch376 +-> +r_us + = 127; + +1993 +ch376 +-> +commd_us + = +CH376_ERR_OPEN_DIR +; + +1998 + `syem_fe_o +(& +ch376 +-> +cڋxt +, ch376-> +cut_fe +); + +1999 +ch376 +-> +cut_fe + = + `syem_fe_ݒ_exig +(&ch376-> +cڋxt +, +fixed_fe_me +, ch376-> +cut_d_lock +); + +2001 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_FILE_OPEN] onghfe: %s\n", & +ch376 +-> +cmd_da +. +CMD_FeName +[ +i +]); + +2003 if( +ch376 +-> +cut_fe +) + +2005 +ch376 +-> +r_us + = 127; + +2006 +ch376 +-> +commd_us + = +CH376_INT_SUCCESS +; + +2007 +ch376 +-> +cut_fe_is_dey + = +CH376_FALSE +; + +2011 +ch376 +-> +r_us + = 0; + +2012 +ch376 +-> +commd_us + = +CH376_ERR_MISS_FILE +; + +2020 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_FILE_OPEN]o operationossible (deviceot mounted)\n"); + +2022 +ch376 +-> +r_us + = 0; + +2023 +ch376 +-> +commd_us + = +CH376_RET_ABORT +; + +2027  +CH376_CMD_FILE_CREATE +: + +2028 +ch376 +-> +commd + = +CH376_CMD_FILE_CREATE +; + +2030 if( +ch376 +-> +ro_d_lock +) + +2032  +i + = 0; + +2035 if( +ch376 +-> +cmd_da +. +CMD_FeName +[ +i +] == '/') + +2037 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_FILE_CREATE] openingoot directory\n"); + +2038 + `syem_a_dey_lock +(& +ch376 +-> +cڋxt +, ch376-> +cut_d_lock +); + +2039 +ch376 +-> +cut_d_lock + = + `syem_e_dey_lock +(&ch376-> +cڋxt +, ch376-> +ro_d_lock +); + +2040 +i +++; + +2043 if( +ch376 +-> +cmd_da +. +CMD_FeName +[ +i +] == '\0') + +2046 +ch376 +-> +r_us + = 127; + +2047 +ch376 +-> +commd_us + = +CH376_INT_SUCCESS +; + +2051  +fixed_fe_me +[13]; + +2052 + `im_fe_me +(& +ch376 +-> +cmd_da +. +CMD_FeName +[ +i +], +fixed_fe_me +); + +2055 + `syem_fe_o +(& +ch376 +-> +cڋxt +, ch376-> +cut_fe +); + +2056 +ch376 +-> +cut_fe + = + `syem_fe_ݒ_w +(&ch376-> +cڋxt +, +fixed_fe_me +, ch376-> +cut_d_lock +); + +2058 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_FILE_CREATE] cghfe: %s\n", & +ch376 +-> +cmd_da +. +CMD_FeName +[ +i +]); + +2060 if( +ch376 +-> +cut_fe +) + +2062 +ch376 +-> +r_us + = 127; + +2063 +ch376 +-> +commd_us + = +CH376_INT_SUCCESS +; + +2067 +ch376 +-> +r_us + = 0; + +2068 +ch376 +-> +commd_us + = +CH376_ERR_MISS_FILE +; + +2074 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_FILE_CREATE]o operationossible (deviceot mounted)\n"); + +2076 +ch376 +-> +r_us + = 0; + +2077 +ch376 +-> +commd_us + = +CH376_RET_ABORT +; + +2081  +CH376_CMD_DIR_CREATE +: + +2082 +ch376 +-> +commd + = +CH376_CMD_DIR_CREATE +; + +2084 if( +ch376 +-> +ro_d_lock +) + +2086  +fixed_fe_me +[13]; + +2087 +CH376_FILE + +exig_fe +; + +2088  +i + = 0; + +2091 if( +ch376 +-> +cmd_da +. +CMD_FeName +[ +i +] == '/') + +2093 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_DIR_CREATE] openingoot directory\n"); + +2094 + `syem_a_dey_lock +(& +ch376 +-> +cڋxt +, ch376-> +cut_d_lock +); + +2095 +ch376 +-> +cut_d_lock + = + `syem_e_dey_lock +(&ch376-> +cڋxt +, ch376-> +ro_d_lock +); + +2096 +i +++; + +2099 + `im_fe_me +(& +ch376 +-> +cmd_da +. +CMD_FeName +[ +i +], +fixed_fe_me +); + +2101 +exig_fe + = + `syem_fe_ݒ_exig +(& +ch376 +-> +cڋxt +, +fixed_fe_me +, ch376-> +cut_d_lock +); + +2103 if( +exig_fe +) + +2105 + `syem_fe_o +(& +ch376 +-> +cڋxt +, +exig_fe +); + +2106 +ch376 +-> +r_us + = 0; + +2107 +ch376 +-> +commd_us + = +CH376_ERR_FOUND_NAME +; + +2111 +CH376_LOCK + +d_d_lock +; + +2114 +d_d_lock + = + `syem_ob_dey_lock +(& +ch376 +-> +cڋxt +, +fixed_fe_me +, ch376-> +cut_d_lock +); + +2116 i(! +d_d_lock +) + +2117 +d_d_lock + = + `syem__dey +(& +ch376 +-> +cڋxt +, +fixed_fe_me +, ch376-> +cut_d_lock +); + +2120 if( +d_d_lock +) + +2122 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_DIR_CREATE]g ced dey: %s\n", & +ch376 +-> +cmd_da +. +CMD_FeName +[ +i +]); + +2124 + `syem_a_dey_lock +(& +ch376 +-> +cڋxt +, ch376-> +cut_d_lock +); + +2125 +ch376 +-> +cut_d_lock + = +d_d_lock +; + +2127 +ch376 +-> +r_us + = 127; + +2128 +ch376 +-> +commd_us + = +CH376_INT_SUCCESS +; + +2132 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_DIR_CREATE] dey could bd: %s\n", & +ch376 +-> +cmd_da +. +CMD_FeName +[ +i +]); + +2134 +ch376 +-> +r_us + = 0; + +2135 +ch376 +-> +commd_us + = +CH376_ERR_MISS_FILE +; + +2141 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_DIR_CREATE]o operationossible (deviceot mounted)\n"); + +2143 +ch376 +-> +r_us + = 0; + +2144 +ch376 +-> +commd_us + = +CH376_RET_ABORT +; + +2148  +CH376_CMD_FILE_ERASE +: + +2149 +ch376 +-> +commd + = +CH376_CMD_FILE_ERASE +; + +2151 if( +ch376 +-> +ro_d_lock +) + +2153  +fixed_fe_me +[13]; + +2154  +i + = 0; + +2155 +CH376_BOOL + +fe_ad + = +CH376_FALSE +; + +2158 if( +ch376 +-> +cmd_da +. +CMD_FeName +[ +i +] == '/') + +2160 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_FILE_ERASE] openingoot directory\n"); + +2161 + `syem_a_dey_lock +(& +ch376 +-> +cڋxt +, ch376-> +cut_d_lock +); + +2162 +ch376 +-> +cut_d_lock + = + `syem_e_dey_lock +(&ch376-> +cڋxt +, ch376-> +ro_d_lock +); + +2163 +i +++; + +2166 i( +ch376 +-> +cmd_da +. +CMD_FeName +[ +i +] != 0) + +2168 + `im_fe_me +(& +ch376 +-> +cmd_da +. +CMD_FeName +[ +i +], +fixed_fe_me +); + +2170 if( +ch376 +-> +cut_fe +) + +2172 + `syem_fe_o +(& +ch376 +-> +cڋxt +, ch376-> +cut_fe +); + +2173 +ch376 +-> +cut_fe + = ( +CH376_FILE +)0; + +2176 i( +ch376 +-> +cut_fe_is_dey +) + +2177 +fe_ad + = + `syem_dey_de +(& +ch376 +-> +cڋxt +, ch376-> +cut_d_lock +); + +2179 +fe_ad + = + `syem_fe_de +(& +ch376 +-> +cڋxt +, +fixed_fe_me +, ch376-> +cut_d_lock +); + +2182 i( +fe_ad +) + +2184 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_FILE_ERASE] f dey ded: %s\n", & +ch376 +-> +cmd_da +. +CMD_FeName +[ +i +]); + +2186 +ch376 +-> +r_us + = 127; + +2187 +ch376 +-> +commd_us + = +CH376_INT_SUCCESS +; + +2191 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_FILE_ERASE] f dey could bded: %s\n", & +ch376 +-> +cmd_da +. +CMD_FeName +[ +i +]); + +2193 +ch376 +-> +r_us + = 0; + +2194 +ch376 +-> +commd_us + = +CH376_ERR_MISS_FILE +; + +2199 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_FILE_ERASE]o operationossible (deviceot mounted)\n"); + +2201 +ch376 +-> +r_us + = 0; + +2202 +ch376 +-> +commd_us + = +CH376_RET_ABORT +; + +2206  +CH376_CMD_RD_USB_DATA0 +: + +2207 +ch376 +-> +commd + = +CH376_CMD_RD_USB_DATA0 +; + +2208 +ch376 +-> +pos_rw__cmd_da + = +CMD_DATA_REQ_SIZE +; + +2209 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_RD_USB_DATA0] waiting for i/o bufferead\n"); + +2212  +CH376_CMD_WR_REQ_DATA +: + +2213 +ch376 +-> +commd + = +CH376_CMD_WR_REQ_DATA +; + +2214 +ch376 +-> +pos_rw__cmd_da + = +CMD_DATA_REQ_SIZE +; + +2215 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_WR_REQ_DATA] waiting for i/o buffer write\n"); + +2218  +CH376_CMD_FILE_ENUM_GO +: + +2219 +ch376 +-> +commd + = +CH376_CMD_FILE_ENUM_GO +; + +2220 +fe_um_go +: + +2221 if( + `syem_go_exame_dey +(& +ch376 +-> +cڋxt +, ch376-> +cut_d_lock +, ch376-> +cut_dey_browsg +, &ch376-> +cmd_da +. +CMD_FDInfo +, ch376-> +d_n +)) + +2223 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_FILE_ENUM_GO]ext directoryntry in buffer\n"); + +2224 +ch376 +-> +nb_bys__cmd_da + = (ch376-> +cmd_da +. +CMD_FDInfo +); + +2225 +ch376 +-> +r_us + = 127; + +2226 +ch376 +-> +commd_us + = +CH376_INT_DISK_READ +; + +2230 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_FILE_ENUM_GO] directory browing finished\n"); + +2232 + `syem_fish_exame_dey +(& +ch376 +-> +cڋxt +, ch376-> +cut_dey_browsg +); + +2233 +ch376 +-> +cut_dey_browsg + = ( +CH376_DIR +)0; + +2235 +ch376 +-> +r_us + = 0; + +2236 +ch376 +-> +commd_us + = +CH376_ERR_OPEN_DIR +; + +2240  +CH376_CMD_DISK_CAPACITY +: + +2241 +ch376 +-> +commd + = +CH376_CMD_DISK_CAPACITY +; + +2243 if( + `syem_g_disk_fo +(& +ch376 +-> +cڋxt +, ch376-> +ro_d_lock +, &ch376-> +cmd_da +. +CMD_DiskQuy +)) + +2245 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_DISK_CAPACITY] sector capacity in buffer\n"); + +2247 +ch376 +-> +nb_bys__cmd_da + = 4; + +2248 +ch376 +-> +r_us + = 127; + +2249 +ch376 +-> +commd_us + = +CH376_INT_SUCCESS +; + +2253 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_DISK_CAPACITY]o operationossible (deviceot mounted)\n"); + +2254 +ch376 +-> +r_us + = 0; + +2255 +ch376 +-> +commd_us + = +CH376_RET_ABORT +; + +2259  +CH376_CMD_DISK_QUERY +: + +2260 +ch376 +-> +commd + = +CH376_CMD_DISK_QUERY +; + +2262 if( + `syem_g_disk_fo +(& +ch376 +-> +cڋxt +, ch376-> +ro_d_lock +, &ch376-> +cmd_da +. +CMD_DiskQuy +)) + +2264 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_DISK_QUERY] sector capacity in buffer\n"); + +2265 +ch376 +-> +nb_bys__cmd_da + = (ch376-> +cmd_da +. +CMD_DiskQuy +); + +2266 +ch376 +-> +r_us + = 127; + +2267 +ch376 +-> +commd_us + = +CH376_INT_SUCCESS +; + +2271 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_DISK_QUERY]o operationossible (deviceot mounted)\n"); + +2272 +ch376 +-> +r_us + = 0; + +2273 +ch376 +-> +commd_us + = +CH376_RET_ABORT +; + +2277  +CH376_CMD_BYTE_LOCATE +: + +2278 +ch376 +-> +commd + = +CH376_CMD_BYTE_LOCATE +; + +2279 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_BYTE_LOCATE] waiting for seekosition\n"); + +2280 +ch376 +-> +pos_rw__cmd_da + = 0; + +2283  +CH376_CMD_BYTE_READ +: + +2284 +ch376 +-> +commd + = +CH376_CMD_BYTE_READ +; + +2285 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_BYTE_READ] waiting foread size\n"); + +2286 +ch376 +-> +pos_rw__cmd_da + = 0; + +2289  +CH376_CMD_BYTE_RD_GO +: + +2290 +ch376 +-> +commd + = +CH376_CMD_BYTE_RD_GO +; + +2291 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_BYTE_RD_GO] waiting forext chunkoead\n"); + +2292 + `fe_ad_chunk +( +ch376 +); + +2295  +CH376_CMD_BYTE_WRITE +: + +2296 +ch376 +-> +commd + = +CH376_CMD_BYTE_WRITE +; + +2297 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_BYTE_WRITE] waiting for write size\n"); + +2298 +ch376 +-> +pos_rw__cmd_da + = 0; + +2301  +CH376_CMD_BYTE_WR_GO +: + +2302 +ch376 +-> +commd + = +CH376_CMD_BYTE_WR_GO +; + +2303 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_BYTE_WR_GO] waiting forext chunko write\n"); + +2304 + `fe_wre_chunk +( +ch376 +); + +2307  +CH376_CMD_FILE_CLOSE +: + +2308 +ch376 +-> +commd + = +CH376_CMD_FILE_CLOSE +; + +2309 + `dbg_tf +("[WRITE][COMMAND][CH376_CMD_FILE_CLOSE] waiting for close mode\n"); + +2313 + `dbg_tf +("[WRITE][COMMAND][Unsu܋d] commd &%02x imemd\n", +ch376 +-> +commd +); + +2314 +ch376 +-> +r_us + = 0; + +2315 +ch376 +-> +commd_us + = +CH376_RET_ABORT +; + +2319 + `dbg_tf +("<< [WRITE][COMMAND] Wrcommd &%02x stu&%02x\n", +ch376 +-> +commd +, ch376-> +commd_us +); + +2320 + } +} + +2326  + $ch376_wre_da_pt +( +ch376 + *ch376, +CH376_U8 + +da +) + +2328 + `dbg_tf +(">> [WRITE][DATA] Wrd&%02x stu&%02x\n", +da +, +ch376 +-> +commd_us +); + +2330  +ch376 +-> +commd +) + +2332  +CH376_CMD_CHECK_EXIST +: + +2333 +ch376 +-> +cmd_da +. +CMD_CheckBy + = ~ +da +; + +2334 + `dbg_tf +("[WRITE][DATA][CH376_CMD_CHECK_EXIST] g check by &%02x\n", +da +); + +2337  +CH376_CMD_GET_FILE_SIZE +: + +2339 i( +da + == 0x68) + +2341 +CH376_S32 + +fe_size + = + `syem_g_fe_size +(& +ch376 +-> +cڋxt +, ch376-> +cut_fe +); + +2343 +ch376 +-> +cmd_da +. +CMD_FeSize +[0] = ( +CH376_U8 +)(( +fe_size + & 0x000000ff) >> 0); + +2344 +ch376 +-> +cmd_da +. +CMD_FeSize +[1] = ( +CH376_U8 +)(( +fe_size + & 0x0000ff00) >> 8); + +2345 +ch376 +-> +cmd_da +. +CMD_FeSize +[2] = ( +CH376_U8 +)(( +fe_size + & 0x00ff0000) >> 16); + +2346 +ch376 +-> +cmd_da +. +CMD_FeSize +[3] = ( +CH376_U8 +)(( +fe_size + & 0xff000000) >> 24); + +2348 +ch376 +-> +nb_bys__cmd_da + = (ch376-> +cmd_da +. +CMD_FeSize +); + +2349 +ch376 +-> +pos_rw__cmd_da + = 0; + +2351 + `dbg_tf +("[WRITE][DATA][CH376_CMD_GET_FILE_SIZE] de, fsizi%d, wag f dad\n", +fe_size +); + +2354 +ch376 +-> +r_us + = 127; + +2355 +ch376 +-> +commd_us + = +CH376_INT_SUCCESS +; + +2359 + `dbg_tf +("[WRITE][DATA][CH376_CMD_GET_FILE_SIZE] wrg commd by:ookg f &68, g &%02x\n", +da +); + +2361 +ch376 +-> +r_us + = 0; + +2362 +ch376 +-> +commd_us + = +CH376_RET_ABORT +; + +2366  +CH376_CMD_SET_USB_MODE +: + +2367 + `nl_l_io +( +ch376 +); + +2368  +da +) + +2370  +CH376_ARG_SET_USB_MODE_USB_HOST +: + +2371 +ch376 +-> +usb_mode + = +CH376_ARG_SET_USB_MODE_USB_HOST +; + +2372 + `dbg_tf +("[WRITE][DATA][CH376_SET_USB_MODE] USB host set\n"); + +2374  +CH376_ARG_SET_USB_MODE_SD_HOST +: + +2375 +ch376 +-> +usb_mode + = +CH376_ARG_SET_USB_MODE_SD_HOST +; + +2376 + `dbg_tf +("[WRITE][DATA][CH376_SET_USB_MODE] SD card set\n"); + +2379 +ch376 +-> +usb_mode + = +CH376_ARG_SET_USB_MODE_INVALID +; + +2380 + `dbg_tf +("[WRITE][DATA][CH376_SET_USB_MODE_CODE_INVALID] set\n"); + +2385  +CH376_CMD_SET_FILE_NAME +: + +2386 + `dbg_tf +("[WRITE][DATA][CH376_CMD_SET_FILE_NAME] g fmcha \"%c\" (&%02xf܅osi %d\n", +da +, da, +ch376 +-> +pos_rw__cmd_da +); + +2388 if( +ch376 +-> +pos_rw__cmd_da + < (ch376-> +cmd_da +. +CMD_FeName +)) + +2391 +ch376 +-> +cmd_da +. +CMD_FeName +[ch376-> +pos_rw__cmd_da +++] = +da +; + +2392 +ch376 +-> +cmd_da +. +CMD_FeName +[ch376-> +pos_rw__cmd_da +] = '\0'; + +2397  +CH376_CMD_BYTE_LOCATE +: + +2398 if( +ch376 +-> +pos_rw__cmd_da + < (ch376-> +cmd_da +. +CMD_FeSk +)) + +2400 + `dbg_tf +("[WRITE][DATA][CH376_CMD_BYTE_LOCATE] g by #%d wh vu&%02x\n", +ch376 +-> +pos_rw__cmd_da +, +da +); + +2401 +ch376 +-> +cmd_da +. +CMD_FeSk +[ch376-> +pos_rw__cmd_da +] = +da +; + +2403 if(++ +ch376 +-> +pos_rw__cmd_da + =(ch376-> +cmd_da +. +CMD_FeSk +)) + +2405 +CH376_S32 + +fe_ek_pos + = ( +ch376 +-> +cmd_da +. +CMD_FeSk +[0] << 0) + +2406 | ( +ch376 +-> +cmd_da +. +CMD_FeSk +[1] << 8) + +2407 | ( +ch376 +-> +cmd_da +. +CMD_FeSk +[2] << 16) + +2408 | ( +ch376 +-> +cmd_da +. +CMD_FeSk +[3] << 24); + +2410 +fe_ek_pos + = + `syem_fe_ek +(& +ch376 +-> +cڋxt +, ch376-> +cut_fe +, file_seek_pos); + +2412 if( +fe_ek_pos + >= 0) + +2414 + `dbg_tf +("[WRITE][DATA][CH376_CMD_BYTE_LOCATE]ll done: seek operated with success (waiting for dataead)\n"); + +2416 +ch376 +-> +cmd_da +. +CMD_FeSk +[0] = ( +CH376_U8 +)(( +fe_ek_pos + & 0x000000ff) >> 0); + +2417 +ch376 +-> +cmd_da +. +CMD_FeSk +[1] = ( +CH376_U8 +)(( +fe_ek_pos + & 0x0000ff00) >> 8); + +2418 +ch376 +-> +cmd_da +. +CMD_FeSk +[2] = ( +CH376_U8 +)(( +fe_ek_pos + & 0x00ff0000) >> 16); + +2419 +ch376 +-> +cmd_da +. +CMD_FeSk +[3] = ( +CH376_U8 +)(( +fe_ek_pos + & 0xff000000) >> 24); + +2421 +ch376 +-> +nb_bys__cmd_da + = (ch376-> +cmd_da +. +CMD_FeSk +); + +2422 +ch376 +-> +r_us + = 127; + +2423 +ch376 +-> +commd_us + = +CH376_INT_SUCCESS +; + +2427 + `dbg_tf +("[WRITE][DATA][CH376_CMD_BYTE_LOCATE]ll done: seek failure\n"); + +2429 +ch376 +-> +r_us + = 0; + +2430 +ch376 +-> +commd_us + = +CH376_RET_ABORT +; + +2436  +CH376_CMD_WR_REQ_DATA +: + +2437 if( +ch376 +-> +nb_bys__cmd_da + + +2438 && +ch376 +-> +pos_rw__cmd_da + ! +CMD_DATA_REQ_SIZE +) + +2440 +CH376_U8 + * +w + = (CH376_U8 *)& +ch376 +-> +cmd_da +; + +2442 if( +ch376 +-> +nb_bys__cmd_da + !ch376-> +pos_rw__cmd_da +) + +2444 +w +[ +ch376 +-> +pos_rw__cmd_da +] = +da +; + +2446 + `dbg_tf +("[WRITE][DATA][CH376_CMD_WR_REQ_DATA] wr\"%c\" (&%02xti/buf㸩osi &%02x\n", +da +, da, +ch376 +-> +pos_rw__cmd_da +); + +2448 if(++ +ch376 +-> +pos_rw__cmd_da + =ch376-> +nb_bys__cmd_da +) + +2450 +ch376 +-> +r_us + = 0; + +2451 +ch376 +-> +commd_us + = +CH376_RET_SUCCESS +; + +2457 + `dbg_tf +("[WRITE][DATA][CH376_CMD_WR_REQ_DATA]othingo writeo i/o buffer\n"); + +2459 +ch376 +-> +r_us + = 0; + +2460 +ch376 +-> +commd_us + = +CH376_RET_ABORT +; + +2464  +CH376_CMD_BYTE_READ +: + +2465 if( +ch376 +-> +pos_rw__cmd_da + < (ch376-> +cmd_da +. +CMD_FeRdWre +)) + +2467 + `dbg_tf +("[WRITE][DATA][CH376_CMD_BYTE_READ] g by #%d wh vu&%02x\n", +ch376 +-> +pos_rw__cmd_da +, +da +); + +2468 +ch376 +-> +cmd_da +. +CMD_FeRdWre +[ch376-> +pos_rw__cmd_da +] = +da +; + +2470 if(++ +ch376 +-> +pos_rw__cmd_da + =(ch376-> +cmd_da +. +CMD_FeRdWre +)) + +2472 +ch376 +-> +bys_to_ad_wre + = (ch376-> +cmd_da +. +CMD_FeRdWre +[0] << 0) + +2473 | ( +ch376 +-> +cmd_da +. +CMD_FeRdWre +[1] << 8); + +2474 + `fe_ad_chunk +( +ch376 +); + +2479  +CH376_CMD_BYTE_WRITE +: + +2480 if( +ch376 +-> +pos_rw__cmd_da + < (ch376-> +cmd_da +. +CMD_FeRdWre +)) + +2482 + `dbg_tf +("[WRITE][DATA][CH376_CMD_BYTE_WRITE] g by #%d wh vu&%02x\n", +ch376 +-> +pos_rw__cmd_da +, +da +); + +2483 +ch376 +-> +cmd_da +. +CMD_FeRdWre +[ch376-> +pos_rw__cmd_da +] = +da +; + +2485 if(++ +ch376 +-> +pos_rw__cmd_da + =(ch376-> +cmd_da +. +CMD_FeRdWre +)) + +2487 +ch376 +-> +bys_to_ad_wre + = (ch376-> +cmd_da +. +CMD_FeRdWre +[0] << 0) + +2488 | ( +ch376 +-> +cmd_da +. +CMD_FeRdWre +[1] << 8); + +2490 if( +ch376 +-> +bys_to_ad_wre + > (ch376-> +cmd_da +. +CMD_IOBufr +)) + +2491 +ch376 +-> +nb_bys__cmd_da + = (ch376-> +cmd_da +. +CMD_IOBufr +); + +2493 +ch376 +-> +nb_bys__cmd_da + = ( +CH376_U8 +)ch376-> +bys_to_ad_wre +; + +2495 +ch376 +-> +r_us + = 127; + +2496 +ch376 +-> +commd_us + = +CH376_INT_SUCCESS +; + +2501  +CH376_CMD_FILE_CLOSE +: + +2503 + `dbg_tf +("[WRITE][DATA][CH376_CMD_FILE_CLOSE] updsize: %s\n", +ch376 +-> +pos_rw__cmd_da + == 0 ? "no" : "yes"); + +2504 if( +ch376 +-> +cut_fe +) + +2506 + `syem_fe_o +(& +ch376 +-> +cڋxt +, ch376-> +cut_fe +); + +2507 +ch376 +-> +cut_fe + = ( +CH376_FILE +)0; + +2509 +ch376 +-> +r_us + = 127; + +2510 +ch376 +-> +commd_us + = +CH376_INT_SUCCESS +; + +2514 + `dbg_tf +("[WRITE][DATA][CH376_CMD_FILE_CLOSE] failure:ot file opened\n"); + +2516 +ch376 +-> +r_us + = 0; + +2517 +ch376 +-> +commd_us + = +CH376_RET_ABORT +; + +2522 + `dbg_tf +("<< [WRITE][DATA] Wrd&%02x stu&%02x\n", +da +, +ch376 +-> +commd_us +); + +2524 + } +} + +2530  +ch376 + * + $ch376_ +(* +ur_da +) + +2532  +ch376 + *ch376 = + `syem_loc_mem +((ch376)); + +2534 if( +ch376 +) + +2536 if( + `syem__cڋxt +(& +ch376 +-> +cڋxt +, +ur_da +)) + +2538 +ch376 +-> +sdrd_drive_th + = + `e_rg +("ch376_sdcard_drive/"); + +2539 +ch376 +-> +usb_drive_th + = + `e_rg +("ch376_usb_drive/"); + +2540 + `r_ruu +( +ch376 +); + +2544 + `syem__mem +( +ch376 +); + +2545 +ch376 + = +NULL +; + +2548  +ch376 +; + +2549 + } +} + +2551  + $ch376_deroy +( +ch376 + *ch376) + +2553 + `nl_l_io +( +ch376 +); + +2554 + `syem__mem +( +ch376 +-> +sdrd_drive_th +); + +2555 + `syem__mem +( +ch376 +-> +usb_drive_th +); + +2556 + `syem_n_cڋxt +(& +ch376 +-> +cڋxt +); + +2557 + `syem__mem +( +ch376 +); + +2558 + } +} + +2560  + $ch376_t +( +ch376 + *ch376) + +2562 + `nl_l_io +( +ch376 +); + +2563 + `r_ruu +( +ch376 +); + +2564 + } +} + +2570  + $ch376_t_sdrd_drive_th +( +ch376 + *ch376, cڡ * +th +) + +2572 + `dbg_tf +("ch376_t_sdrd_drive_th: %s\n", +th +); + +2573 + `nl_l_io +( +ch376 +); + +2574 + `syem__mem +( +ch376 +-> +sdrd_drive_th +); + +2575 +ch376 +-> +sdrd_drive_th + = + `e_rg +( +th +); + +2576 + } +} + +2578  + $ch376_t_usb_drive_th +( +ch376 + *ch376, cڡ * +th +) + +2580 + `dbg_tf +("ch376_t_usb_drive_th: %s\n", +th +); + +2581 + `nl_l_io +( +ch376 +); + +2582 + `syem__mem +( +ch376 +-> +usb_drive_th +); + +2583 +ch376 +-> +usb_drive_th + = + `e_rg +( +th +); + +2584 + } +} + +2586 cڡ * + $ch376_g_sdrd_drive_th +( +ch376 + *ch376) + +2588  +ch376 +-> +sdrd_drive_th +; + +2589 + } +} + +2591 cڡ * + $ch376_g_usb_drive_th +( +ch376 + *ch376) + +2593  +ch376 +-> +usb_drive_th +; + +2594 + } +} + + @plugins/ch376/ch376.h + +12 #ide +LOCAL_CH376_H + + +13  + #LOCAL_CH376_H + + + ) + +19 #i +defed +( +__MORPHOS__ +|| defed ( +__AMIGA__ +|| defed ( +__AROS__ +) + +21 #ide +EXEC_TYPES_H + + +22  + ~ + +24 #ide +DOS_DOS_H + + +25  + ~ + +28  +UBYTE + + tCH376_U8 +; + +29  +BYTE + + tCH376_S8 +; + +30  +UWORD + + tCH376_U16 +; + +31  +WORD + + tCH376_S16 +; + +32  +ULONG + + tCH376_U32 +; + +33  +LONG + + tCH376_S32 +; + +34  +UQUAD + + tCH376_U64 +; + +35  +QUAD + + tCH376_S64 +; + +36  +BOOL + + tCH376_BOOL +; + +37  +BPTR + + tCH376_FILE +; + +38  +BPTR + + tCH376_LOCK +; + +39  +FeInfoBlock + * + tCH376_DIR +; + +40 ru {  +Libry + * + mDOSBa +; } + tCH376_CONTEXT +; + +42  + #CH376_TRUE + +TRUE + + + ) + +43  + #CH376_FALSE + +FALSE + + + ) + +45 #ide +UNUSED + + +46  + #UNUSED + + `__ibu__ +(( +unud +)) + + ) + +49 #i +defed +( +WIN32 +) + +51  + ~ + +53  +UINT8 + + tCH376_U8 +; + +54  +INT8 + + tCH376_S8 +; + +55  +UINT16 + + tCH376_U16 +; + +56  +INT16 + + tCH376_S16 +; + +57  +UINT32 + + tCH376_U32 +; + +58  +INT32 + + tCH376_S32 +; + +59  +UINT64 + + tCH376_U64 +; + +60  +INT64 + + tCH376_S64 +; + +61  +BOOL + + tCH376_BOOL +; + +62  +HANDLE + + tCH376_FILE +; + +63  + s_CH376_LOCK + { +TCHAR + + mth +[ +MAX_PATH +]; +HANDLE + + mhd +; } * + tCH376_LOCK +; + +64  +WIN32_FIND_DATA + * + tCH376_DIR +; + +66 ru { * + mdummy +; } + tCH376_CONTEXT +; + +68  + #CH376_TRUE + +TRUE + + + ) + +69  + #CH376_FALSE + +FALSE + + + ) + +71  + #UNUSED + + + ) + +73 #i +defed +( +__unix__ +|| defed( +__APPLE__ +|| defed( +__HAIKU__ +|| defed( +__MINT__ +) + +75  + ~ + +76  + ~ + +77  + ~ + +78  + ~ + +80  +ut8_t + + tCH376_U8 +; + +81  +t8_t + + tCH376_S8 +; + +82  +ut16_t + + tCH376_U16 +; + +83  +t16_t + + tCH376_S16 +; + +84  +ut32_t + + tCH376_U32 +; + +85  +t32_t + + tCH376_S32 +; + +86  +ut64_t + + tCH376_U64 +; + +87  +t64_t + + tCH376_S64 +; + +88  +bo + + tCH376_BOOL +; + +89  +FILE + * + tCH376_FILE +; + +90 * + tCH376_LOCK +; + +91  + s_CH376_DIR + { +DIR + * + mhd +;  +dt + * + my +; } * + tCH376_DIR +; + +92 ru { * + mdummy +; } + tCH376_CONTEXT +; + +94  + #CH376_TRUE + +ue + + + ) + +95  + #CH376_FALSE + +l + + + ) + +97 #ide +UNUSED + + +98  + #UNUSED + + `__ibu__ +(( +unud +)) + + ) + +109  + gch376 +; + +112  +ch376 + * +ch376_ +(* +ur_da +); + +113  +ch376_deroy +( +ch376 + *ch376); + +114  +ch376_t +( +ch376 + *ch376); + +117  +ch376_t_sdrd_drive_th +( +ch376 + *ch376, cڡ * +th +); + +118  +ch376_t_usb_drive_th +( +ch376 + *ch376, cڡ * +th +); + +119 cڡ * +ch376_g_sdrd_drive_th +( +ch376 + *ch376); + +120 cڡ * +ch376_g_usb_drive_th +( +ch376 + *ch376); + +123  +ch376_wre_commd_pt +( +ch376 + *ch376, +CH376_U8 + +commd +); + +124  +ch376_wre_da_pt +( +ch376 + *ch376, +CH376_U8 + +da +); + +125 +CH376_U8 + +ch376_ad_commd_pt +( +ch376 + *ch376); + +126 +CH376_U8 + +ch376_ad_da_pt +( +ch376 + *ch376); + + @plugins/ch376/oric_ch376_plugin.c + +1 #i +SDL_MAJOR_VERSION + == 1 + +2 #ifde +__SPECIFY_SDL_DIR__ + + +3  + ~ + +5  + ~ + +8 #ifde +__SPECIFY_SDL_DIR__ + + +9  + ~ + +11  + ~ + +15  + ~"ch376.h +" + +16  + ~"dio.h +" + +18  +dbg_tf +(* +fmt +, ...); + +20  + #CH376_ORIC_EXTENSION_DATA_PORT + 0x340 + + ) + +21  + #CH376_ORIC_EXTENSION_COMMAND_PORT + 0x341 + + ) + +24  +ch376 + * + $ch376_ic_ +() + +26  + `ch376_ +( +NULL +); + +27 + } +} + +29  + $ch376_ic_t +( +ch376 + *ch376) + +31 + `ch376_t +( +ch376 +); + +32 + } +} + +35  + $ch376_ic_deroy +( +ch376 + *ch376) + +37 + `ch376_deroy +( +ch376 +); + +38 + } +} + +40  + $ch376_ic_cfig +( +ch376 + *ch376) + +42 + `ch376_t_sdrd_drive_th +( +ch376 +, "sdcard/"); + +43 + `ch376_t_usb_drive_th +( +ch376 +, "usbdrive/"); + +44 + } +} + +46  + $ch376_ic_wre +( +ch376 + *ch376, +Ut16 + +addr +, +Ut8 + +da +) + +48 i( +addr + = +CH376_ORIC_EXTENSION_DATA_PORT +) + +50 + `ch376_wre_da_pt +( +ch376 +, +da +); + +53 i( +addr + = +CH376_ORIC_EXTENSION_COMMAND_PORT +) + +55 + `ch376_wre_commd_pt +( +ch376 +, +da +); + +57 + } +} + +60  + $ch376_ic_ad +( +ch376 + *ch376, +Ut16 + +addr +) + +62  +mp +; + +63 i( +addr + = +CH376_ORIC_EXTENSION_DATA_PORT +) + +65 +mp += + `ch376_ad_da_pt +( +ch376 +); + +66  +mp +; + +69 i( +addr + = +CH376_ORIC_EXTENSION_COMMAND_PORT +) + +71 +mp += + `ch376_ad_commd_pt +( +ch376 +); + +72  +mp +; + +75 + } +} + + @plugins/ch376/oric_ch376_plugin.h + +1  +ch376 + * +ch376_ic_ +(); + +2  +ch376_ic_t +( +ch376 + *ch376); + +3  +ch376_ic_wre +( +ch376 + *ch376, +Ut16 + +addr +, +Ut8 + +da +); + +4  +ch376_ic_ad +( +ch376 + *ch376, +Ut16 + +addr +); + +5  +ch376_ic_cfig +( +ch376 + *ch376); + +6  +ch376_ic_deroy +( +ch376 + *ch376); + +7  +ch376_ic_t +( +ch376 + *ch376); + + @render_gl.c + +22 #ifde +__OPENGL_AVAILABLE__ + + +24  + ~ + +25  + ~ + +26  + ~ + +28  + ~"syem.h +" + +30 #ifde +WIN32 + + +31  + ~ + +34 #ide +__APPLE__ + + +36  + ~ + +38  + ~ + +41 #i +SDL_MAJOR_VERSION + == 1 + +42 #ifde +__SPECIFY_SDL_DIR__ + + +43  + ~ + +45  + ~ + +48 #ifde +__SPECIFY_SDL_DIR__ + + +49  + ~ + +51  + ~ + +55  + ~"6502.h +" + +56  + ~"v.h +" + +57  + ~"8912.h +" + +58  + ~"disk.h +" + +59  + ~"gui.h +" + +60  + ~"mڙ.h +" + +61  + ~"6551.h +" + +62  + ~"mache.h +" + +63  + ~"nd_gl.h +" + +64  + ~"u.h +" + +66  + #TEX_VIDEO + (0) + + ) + +67  + #TEX_SCANLINES + (1) + + ) + +68  + #TEX_STATUS + (2) + + ) + +69  + #TEX_POPUP + (3) + + ) + +71  + #TEX_TZ + ( +TEX_POPUP ++1) + + ) + +72  + #TEX_TZ_LAST + (( +NUM_TZ ++ +TEX_TZ +)-1) + + ) + +74  + #TEX_GIMG + ( +TEX_TZ_LAST ++1) + + ) + +75  + #TEX_GIMG_LAST + (( +NUM_GIMG ++ +TEX_GIMG +)-1) + + ) + +77  + #NUM_TEXTURES + ( +TEX_GIMG_LAST ++1) + + ) + +79 +SDL_bo + +eshus +; + +81  + sxtu + + +83  + mw +, + mh +; + +84  + mtw +, + mth +; + +85 +Ut8 + * + mbuf +; + +88  +SDL_bo + + gdodx + = +SDL_FALSE +; + +89  +GLut + + gx +[ +NUM_TEXTURES +]; + +90  +xtu + + gtx +[ +NUM_TEXTURES +]; + +92  +SDL_Sur + * + gsn +; + +93  +Ut32 + + ggl +[ +NUM_GUI_COLS +]; + +95  + grc +[3]; + +97  +sgl +[]; + +98 +SDL_bo + +fusn +; + +99  +xtze + * +tz +[ +NUM_TZ +]; + +100 +Ut8 + +i +[]; + +101  +guiimg + +gimgs +[ +NUM_GIMG +]; + +104  +theft +[]; + +113  + $tch + +i +,  +x +,  +y +,  +ch +, +Ut32 + +fc +, Ut32 +bc +, +SDL_bo + +sidft + ) + +115  +px +, +py +, +c +; + +116 * + +; + +117  +xtu + * +x + = & +tx +[ +i +]; + +118 +Ut32 + * +r +; + +120 if +ch + > 127 ) ; + +122 +r + = ( +Ut32 + *)& +x +-> +buf +[( +y +*x-> +w ++ +x +)*4]; + +124 + + = & +theft +[ +ch +*12]; + +126  +py +=0;y<12;y++ ) + +128  +c +=0x80, +px +=0;x<8;x++, c>>=1 ) + +130 if(* + +)& +c + ) + +132 *( +r +++ +fc +; + +134 if +sidft + ) + +135 *( +r +++ +bc +; + +137 +r +++; + +141 +r + + +x +-> +w +-8; + +142 + +++; + +144 + } +} + +146  + $upde_xtze_xtu + +mache + * +ic +,  +i + ) + +148  +x +, +y +, +px +, +py +, +o +; + +150 if! +tz +[ +i +] ) ; + +151 if! +tz +[ +i +]-> +modifd + ) ; + +152 if! +tx +[ +i ++ +TEX_TZ +]. +buf + ) ; + +154 +o + = 0; + +156  +y +=0, +py +=0; y< +tz +[ +i +]-> +h +; y++,y+=12 ) + +158  +x +=0, +px +=0; x< +tz +[ +i +]-> +w +; x++, +o +++,x+=8 ) + +159 + `tch + +i ++ +TEX_TZ +, +px +, +py +, +tz +[i]-> +tx +[ +o +], +gl +[tz[i]-> +fc +[o]], gl[tz[i]-> +bc +[o]], +SDL_TRUE + ); + +162 + `glBdTextu + +GL_TEXTURE_2D +, +x +[ +i ++ +TEX_TZ +] ); + +163 + `glTexImage2D + +GL_TEXTURE_2D +, 0, +GL_RGBA +, +tx +[ +i ++ +TEX_TZ +]. +w +,x[i+TEX_TZ]. +h +, 0, GL_RGBA, +GL_UNSIGNED_BYTE +,x[i+TEX_TZ]. +buf + ); + +165 +tz +[ +i +]-> +modifd + = +SDL_FALSE +; + +166 + } +} + +168  + $upde_video_xtu + +mache + * +ic + ) + +170  +x +, +y +, +o +, +c +; + +171 +Ut8 + * + +; + +173 +o + = 0; + +174 + + = +ic +-> +s +; + +176  +y +=0; y<224; y++ ) + +178 i(! +ic +-> +vid_dty +[ +y +]) + +180 + + += 240; + +181 +o + + +tx +[ +TEX_VIDEO +]. +w +*4; + +185  +x +=0; x<240; x++ ) + +187 +c + = *( + +++) * 3; + +188 +tx +[ +TEX_VIDEO +]. +buf +[ +o +++] = +i +[ +c +++]; + +189 +tx +[ +TEX_VIDEO +]. +buf +[ +o +++] = +i +[ +c +++]; + +190 +tx +[ +TEX_VIDEO +]. +buf +[ +o +++] = +i +[ +c +++]; + +191 +tx +[ +TEX_VIDEO +]. +buf +[ +o +++] = 0xff; + +196 +tx +[ +TEX_VIDEO +]. +buf +[ +o +++] = +i +[ +c +-3]; + +197 +tx +[ +TEX_VIDEO +]. +buf +[ +o +++] = +i +[ +c +-2]; + +198 +tx +[ +TEX_VIDEO +]. +buf +[ +o +++] = +i +[ +c +-1]; + +199 +tx +[ +TEX_VIDEO +]. +buf +[ +o +++] = 0xff; + +201 +o + +( +tx +[ +TEX_VIDEO +]. +w +-241) * 4; + +202 +ic +-> +vid_dty +[ +y +] = +SDL_FALSE +; + +205 + + -= 240; + +206  +x +=0; x<240; x++ ) + +208 +c + = *( + +++) * 3; + +209 +tx +[ +TEX_VIDEO +]. +buf +[ +o +++] = +i +[ +c +++]; + +210 +tx +[ +TEX_VIDEO +]. +buf +[ +o +++] = +i +[ +c +++]; + +211 +tx +[ +TEX_VIDEO +]. +buf +[ +o +++] = +i +[ +c +++]; + +212 +tx +[ +TEX_VIDEO +]. +buf +[ +o +++] = 0xff; + +217 +tx +[ +TEX_VIDEO +]. +buf +[ +o +++] = +i +[ +c +-3]; + +218 +tx +[ +TEX_VIDEO +]. +buf +[ +o +++] = +i +[ +c +-2]; + +219 +tx +[ +TEX_VIDEO +]. +buf +[ +o +++] = +i +[ +c +-1]; + +220 +tx +[ +TEX_VIDEO +]. +buf +[ +o +++] = 0xff; + +222 + `glBdTextu + +GL_TEXTURE_2D +, +x +[ +TEX_VIDEO +] ); + +223 + `glTexImage2D + +GL_TEXTURE_2D +, 0, +GL_RGBA +, +tx +[ +TEX_VIDEO +]. +w +,x[TEX_VIDEO]. +h +, 0, GL_RGBA, +GL_UNSIGNED_BYTE +,x[TEX_VIDEO]. +buf + ); + +224 + } +} + +226  + $nd_beg_gl + +mache + * +ic + ) + +228  +i +; + +229 +eshus + = +SDL_TRUE +; + +231 + `upde_video_xtu + +ic + ); + +232  +i +=0; i< +NUM_TZ +; i++ ) + +233 + `upde_xtze_xtu + +ic +, +i + ); + +235 if +ic +-> +wpupr + ) + +237 + `memt + +tx +[ +TEX_POPUP +]. +buf +, 0,x[TEX_POPUP]. +w +*tx[TEX_POPUP]. +h +*4 ); + +238  +i +=0; +ic +-> +pupr +[i]; i++ ) + +239 + `tch + +TEX_POPUP +, +i +*8, 0, +ic +-> +pupr +[i], +gl +[1], gl[0], +SDL_TRUE + ); + +240 + `glBdTextu + +GL_TEXTURE_2D +, +x +[ +TEX_POPUP +] ); + +241 + `glTexImage2D + +GL_TEXTURE_2D +, 0, +GL_RGBA +, +tx +[ +TEX_POPUP +]. +w +,x[TEX_POPUP]. +h +, 0, GL_RGBA, +GL_UNSIGNED_BYTE +,x[TEX_POPUP]. +buf + ); + +242 +ic +-> +wpupr + = +SDL_FALSE +; + +245 if +ic +-> +wusr + ) + +247 + `memt + +tx +[ +TEX_STATUS +]. +buf +, 0,x[TEX_STATUS]. +w +*tx[TEX_STATUS]. +h +*4 ); + +248  +i +=0; +ic +-> +usr +[i]; i++ ) + +249 + `tch + +TEX_STATUS +, +i +*8, 0, +ic +-> +usr +[i], +gl +[1], gl[0], +SDL_FALSE + ); + +250 + `glBdTextu + +GL_TEXTURE_2D +, +x +[ +TEX_STATUS +] ); + +251 + `glTexImage2D + +GL_TEXTURE_2D +, 0, +GL_RGBA +, +tx +[ +TEX_STATUS +]. +w +,x[TEX_STATUS]. +h +, 0, GL_RGBA, +GL_UNSIGNED_BYTE +,x[TEX_STATUS]. +buf + ); + +254 + `glCˬC +( +rc +[0], clrcol[1], clrcol[2], 1.0f); + +255 + `glCˬ + +GL_COLOR_BUFFER_BIT + | +GL_DEPTH_BUFFER_BIT + ); + +256 + } +} + +258  + $nd_d_gl + +mache + * +ic + ) + +260 if +ic +-> +emu_mode + = +EM_RUNNING + ) + +262 if +ic +-> +pupr +[0] ) + +264 + `glBdTextu + +GL_TEXTURE_2D +, +x +[ +TEX_POPUP +] ); + +265 + `glBeg + +GL_QUADS + ); + +266 + `glTexCod2f +0.0f, 0.0); + `glVx3f +( 320.0f, 0.0f, 0.0f ); + +267 + `glTexCod2f +320.0f/512.0f, 0.0); + `glVx3f +( 640.0f, 0.0f, 0.0f ); + +268 + `glTexCod2f +320.0f/512.0f, 12.0f/32.0); + `glVx3f +( 640.0f, 12.0f, 0.0f ); + +269 + `glTexCod2f +0.0f, 12.0f/32.0); + `glVx3f +( 320.0f, 12.0f, 0.0f ); + +270 + `glEnd +(); + +273 if +ic +-> +usr +[0] ) + +275 + `glBdTextu + +GL_TEXTURE_2D +, +x +[ +TEX_STATUS +] ); + +276 + `glBeg + +GL_QUADS + ); + +277 + `glTexCod2f +0.0f, 0.0); + `glVx3f +( 0.0f, 466.0f, 0.0f ); + +278 + `glTexCod2f +320.0f/512.0f, 0.0); + `glVx3f +( 320.0f, 466.0f, 0.0f ); + +279 + `glTexCod2f +320.0f/512.0f, 12.0f/32.0); + `glVx3f +( 320.0f, 478.0f, 0.0f ); + +280 + `glTexCod2f +0.0f, 12.0f/32.0); + `glVx3f +( 0.0f, 478.0f, 0.0f ); + +281 + `glEnd +(); + +285 + `SDL_COMPAT_GL_SwBufrs +(); + +286 + } +} + +288  + $rounduow2 + +x + ) + +290 +x +--; + +291 +x + |= x >> 1; + +292 +x + |= x >> 2; + +293 +x + |= x >> 4; + +294 +x + |= x >> 8; + +295 +x + |= x >> 16; + +296 +x +++; + +298  +x +; + +299 + } +} + +301  + $nd_xtze_loc_gl + +mache + * +ic +,  +i + ) + +303 + `nd_xtze__gl + +ic +, +i + ); + +305 if! +tz +[ +i +] ) ; + +307 #ifde +__amigaos4__ + + +312 +tx +[ +i ++ +TEX_TZ +]. +w + = 512; + +313 +tx +[ +i ++ +TEX_TZ +]. +h + = 512; + +315 +tx +[ +i ++ +TEX_TZ +]. +w + = + `rounduow2 + +tz +[i]->w * 8 ); + +316 +tx +[ +i ++ +TEX_TZ +]. +h + = + `rounduow2 + +tz +[i]->h * 12 ); + +318 +tx +[ +i ++ +TEX_TZ +]. +buf + = + `mloc +tx[i+TEX_TZ]. +w +*tx[i+TEX_TZ]. +h +*4 ); + +319 if! +tx +[ +i ++ +TEX_TZ +]. +buf + ) + +321 +tx +[ +i ++ +TEX_TZ +]. +w + = 0; + +322 +tx +[ +i ++ +TEX_TZ +]. +h + = 0; + +326 +tx +[ +i ++ +TEX_TZ +]. +tw + = (()( +tz +[i]-> +w +*8)) / (()tx[i+TEX_TZ].w); + +327 +tx +[ +i ++ +TEX_TZ +]. +th + = (()( +tz +[i]-> +h +*12)) / (()tx[i+TEX_TZ].h); + +329 + `glBdTextu + +GL_TEXTURE_2D +, +x +[ +i ++ +TEX_TZ +] ); + +330 + `glTexPami + +GL_TEXTURE_2D +, +GL_TEXTURE_WRAP_S +, +GL_REPEAT + ); + +331 + `glTexPami + +GL_TEXTURE_2D +, +GL_TEXTURE_WRAP_T +, +GL_REPEAT + ); + +332 + `glTexPami + +GL_TEXTURE_2D +, +GL_TEXTURE_MAG_FILTER +, +GL_LINEAR + ); + +333 + `glTexPami + +GL_TEXTURE_2D +, +GL_TEXTURE_MIN_FILTER +, +GL_LINEAR + ); + +334 + `glTexImage2D + +GL_TEXTURE_2D +, 0, +GL_RGBA +, +tx +[ +i ++ +TEX_TZ +]. +w +,x[i+TEX_TZ]. +h +, 0, GL_RGBA, +GL_UNSIGNED_BYTE +,x[i+TEX_TZ]. +buf + ); + +336 +tz +[ +i +]-> +modifd + = +SDL_TRUE +; + +337 + } +} + +339  + $nd_xtze__gl + +mache + * +ic +,  +i + ) + +341 if +tx +[ +i ++ +TEX_TZ +]. +buf + ) + +343 + ` + +tx +[ +i ++ +TEX_TZ +]. +buf + ); + +344 +tx +[ +i ++ +TEX_TZ +]. +buf + = +NULL +; + +347 +tx +[ +i ++ +TEX_TZ +]. +w + = 0; + +348 +tx +[ +i ++ +TEX_TZ +]. +h + = 0; + +349 + } +} + +351  + $nd_xtze_gl + +mache + * +ic +,  +i + ) + +353 if! +tz +[ +i +] ) ; + +354 if! +tx +[ +i ++ +TEX_TZ +]. +buf + ) ; + +356 + `glBdTextu + +GL_TEXTURE_2D +, +x +[ +i ++ +TEX_TZ +] ); + +357 + `glBeg + +GL_QUADS + ); + +358 + `glTexCod2f +0.0f, 0.0); + `glVx3f + +tz +[ +i +]-> +x +,z[i]-> +y +, 0.0f ); + +359 + `glTexCod2f + +tx +[ +i ++ +TEX_TZ +]. +tw +, 0.0); + `glVx3f + +tz +[i]-> +x ++tz[i]-> +w +*8,z[i]-> +y +, 0.0f ); + +360 + `glTexCod2f + +tx +[ +i ++ +TEX_TZ +]. +tw +,x[i+TEX_TZ]. +th + ); + `glVx3f + +tz +[i]-> +x ++tz[i]-> +w +*8,z[i]-> +y ++tz[i]-> +h +*12, 0.0f ); + +361 + `glTexCod2f +0.0f, +tx +[ +i ++ +TEX_TZ +]. +th + ); + `glVx3f + +tz +[i]-> +x +,z[i]-> +y ++tz[i]-> +h +*12, 0.0f ); + +362 + `glEnd +(); + +363 + } +} + +365  + $nd_r__gl + +x +,  +y +,  +w +,  +h + ) + +367 + } +} + +369  + $nd_gimg_gl + +i +, +St32 + +xp +, St32 +yp + ) + +371 + `glBdTextu + +GL_TEXTURE_2D +, +x +[ +i ++ +TEX_GIMG +] ); + +372 + `glBeg + +GL_QUADS + ); + +373 + `glTexCod2f +0.0f, 0.0); + `glVx3f + +xp +, +yp +, 0.0f ); + +374 + `glTexCod2f + +tx +[ +i ++ +TEX_GIMG +]. +tw +, 0.0); + `glVx3f + +xp ++ +gimgs +[i]. +w +, +yp +, 0.0f ); + +375 + `glTexCod2f + +tx +[ +i ++ +TEX_GIMG +]. +tw +,x[i+TEX_GIMG]. +th + ); + `glVx3f + +xp ++ +gimgs +[i]. +w +, +yp ++gimgs[i]. +h +, 0.0f ); + +376 + `glTexCod2f +0.0f, +tx +[ +i ++ +TEX_GIMG +]. +th + ); + `glVx3f + +xp +, +yp ++ +gimgs +[i]. +h +, 0.0f ); + +377 + `glEnd +(); + +378 + } +} + +380  + $nd_gimg_gl + +i +, +St32 + +xp +, St32 +yp +, St32 +ox +, St32 +oy +, St32 +w +, St32 +h + ) + +382  +xl +, +xt +, +xr +, +xb +; + +384 +xl + = (() +ox +)/(() +tx +[ +i ++ +TEX_GIMG +]. +w +); + +385 +xt + = (() +oy +)/(() +tx +[ +i ++ +TEX_GIMG +]. +h +); + +386 +xr + = (() +ox ++ +w +)/(() +tx +[ +i ++ +TEX_GIMG +].w); + +387 +xb + = (() +oy ++ +h +)/(() +tx +[ +i ++ +TEX_GIMG +].h); + +389 + `glBdTextu + +GL_TEXTURE_2D +, +x +[ +i ++ +TEX_GIMG +] ); + +390 + `glBeg + +GL_QUADS + ); + +391 + `glTexCod2f + +xl +, +xt + ); + `glVx3f + +xp +, +yp +, 0.0f ); + +392 + `glTexCod2f + +xr +, +xt + ); + `glVx3f + +xp ++ +w +, +yp +, 0.0f ); + +393 + `glTexCod2f + +xr +, +xb + ); + `glVx3f + +xp ++ +w +, +yp ++ +h +, 0.0f ); + +394 + `glTexCod2f + +xl +, +xb + ); + `glVx3f + +xp +, +yp ++ +h +, 0.0f ); + +395 + `glEnd +(); + +396 + } +} + +398  + $nd_video_gl + +mache + * +ic +, +SDL_bo + +doubsize + ) + +400  +l +, +r +, +t +, +b +; + +401  +y +; + +403 + `glBdTextu + +GL_TEXTURE_2D +, +x +[ +TEX_VIDEO +] ); + +405 if +doubsize + ) + +407 if +ic +-> +htch + ) + +409 +l + = 0.0f; + +410 +r + = 640.f; + +411 +t + = 14.0f; + +412 +b + = 462.0f; + +414 +l + = 320.0f-240.0f; + +415 +r + = 320.0f+240.0f; + +416 if +ic +-> +io + && oric-> +vid_eq + ) + +418 +t + = 14.0f + (448.0f-448.0f*(260.0f/308.0f))/2; + +419 +b + = 462.0f - (448.0f-448.0f*(260.0f/308.0f))/2; + +423 +t + = 14.0f; + +424 +b + = 462.0f; + +428 + `glBeg + +GL_QUADS + ); + +429 + `glTexCod2f +0.0f, 0.0); + `glVx3f + +l +, +t +, 0.0f ); + +430 + `glTexCod2f +240.0f/256.0f, 0.0); + `glVx3f + +r +, +t +, 0.0f ); + +431 + `glTexCod2f +240.0f/256.0f, 224.0f/256.0); + `glVx3f + +r +, +b +, 0.0f ); + +432 + `glTexCod2f +0.0f, 224.0f/256.0); + `glVx3f + +l +, +b +, 0.0f ); + +433 + `glEnd +(); + +435 if +ic +-> +lgho + ) + +437  +offs + = ( +ic +-> +htch +) ? 3.2f : 2.2f; + +438 + `glC4ub +( 255, 255, 255, 64 ); + +439 + `glBeg + +GL_QUADS + ); + +440 + `glTexCod2f +0.0f, 0.0); + `glVx3f + +l ++ +offs +, +t +, 0.0f ); + +441 + `glTexCod2f +240.0f/256.0f, 0.0); + `glVx3f + +r ++ +offs +, +t +, 0.0f ); + +442 + `glTexCod2f +240.0f/256.0f, 224.0f/256.0); + `glVx3f + +r ++ +offs +, +b +, 0.0f ); + +443 + `glTexCod2f +0.0f, 224.0f/256.0); + `glVx3f + +l ++ +offs +, +b +, 0.0f ); + +444 + `glEnd +(); + +445 + `glC4ub +( 255, 255, 255, 255 ); + +448 if! +ic +-> +sƚes + ) ; + +450 + `glBdTextu + +GL_TEXTURE_2D +, +x +[ +TEX_SCANLINES +] ); + +451 + `glBeg + +GL_QUADS + ); + +452  +y +=14; y<224*2+14; y+=32 ) + +454 + `glTexCod2f +0.0f, 0.0); + `glVx3f + +l +, +y +, 0.0f ); + +455 + `glTexCod2f +1.0f, 0.0); + `glVx3f + +r +, +y +, 0.0f ); + +456 + `glTexCod2f +1.0f, 1.0); + `glVx3f + +r +, +y ++32, 0.0f ); + +457 + `glTexCod2f +0.0f, 1.0); + `glVx3f + +l +, +y ++32, 0.0f ); + +459 + `glEnd +(); + +463 + `glBeg + +GL_QUADS + ); + +464 + `glTexCod2f +0.0f, 0.0); + `glVx3f +( 0.0f, 4.0f, 0.0f ); + +465 + `glTexCod2f +240.0f/256.0f, 0.0); + `glVx3f +( 240.0f, 4.0f, 0.0f ); + +466 + `glTexCod2f +240.0f/256.0f, 224.0f/256.0); + `glVx3f +( 240.0f, 228.0f, 0.0f ); + +467 + `glTexCod2f +0.0f, 224.0f/256.0); + `glVx3f +( 0.0f, 228.0f, 0.0f ); + +468 + `glEnd +(); + +469 + } +} + +471  + $e_nd_gl + +mache + * +ic + ) + +473 +St32 + +i +; + +475 +sn + = +NULL +; + +476 +dodx + = +SDL_FALSE +; + +478  +i +=0; i< +NUM_TEXTURES +; i++ ) + +480 +tx +[ +i +]. +w + = 0; + +481 +tx +[ +i +]. +h + = 0; + +482 +tx +[ +i +]. +buf + = +NULL +; + +484 + } +} + +486 +SDL_bo + + $nd_toggfusn_gl + +mache + * +ic + ) + +488 #i + `defed +( +__amigaos4__ +|| defed( +__lux__ +) + +490 if + `SDL_COMPAT_WM_ToggFuSn + +sn + ) ) + +492 +fusn + = !fullscreen; + +493  +SDL_TRUE +; + +496  +SDL_FALSE +; + +498 +ic +-> + `shut_nd +( oric ); + +499 +fusn + = !fullscreen; + +500 if +ic +-> + `_nd +i +SDL_TRUE +; + +501 + `t_nd_mode + +ic +, +RENDERMODE_NULL + ); + +502 +ic +-> +emu_mode + = +EM_PLEASEQUIT +; + +503  +SDL_FALSE +; + +505 + } +} + +507  +SDL_bo + + $go_go_gadg_xtu + +i +,  +w +,  +h +,  +bndty +, +SDL_bo + +΋ximg2d + ) + +509 +tx +[ +i +]. +w + = w; + +510 +tx +[ +i +]. +h + = h; + +511 +tx +[ +i +]. +buf + = + `mloc + +w +* +h +*4 ); + +512 if! +tx +[ +i +]. +buf + )  +SDL_FALSE +; + +514 + `memt + +tx +[ +i +]. +buf +, 0, +w +* +h +*4 ); + +516 + `glBdTextu + +GL_TEXTURE_2D +, +x +[ +i +] ); + +517 + `glTexPami + +GL_TEXTURE_2D +, +GL_TEXTURE_WRAP_S +, +GL_CLAMP + ); + +518 + `glTexPami + +GL_TEXTURE_2D +, +GL_TEXTURE_WRAP_T +, +GL_CLAMP + ); + +519 + `glTexPami + +GL_TEXTURE_2D +, +GL_TEXTURE_MAG_FILTER +, +bndty + ); + +520 + `glTexPami + +GL_TEXTURE_2D +, +GL_TEXTURE_MIN_FILTER +, +bndty + ); + +521 if +΋ximg2d + ) + `glTexImage2D + +GL_TEXTURE_2D +, 0, +GL_RGBA +, +w +, +h +, 0, GL_RGBA, +GL_UNSIGNED_BYTE +, +tx +[ +i +]. +buf + ); + +523  +SDL_TRUE +; + +524 + } +} + +526 +SDL_bo + + $_nd_gl + +mache + * +ic + ) + +528  +dth +, +i +, +x +, +y +; + +529  +BsPPix + = + `SDL_COMPAT_GBsPPix +(); + +531 +dth + = 32; + +532 if +BsPPix + ) + +533 +dth + = +BsPPix +; + +535 i( +ic +-> +show_keybrd +) { + +536 +sn + = + `SDL_COMPAT_SVideoMode +640, 480+240, +dth +, +fusn + ? +SDL_COMPAT_OPENGL +| +SDL_COMPAT_FULLSCREEN + : SDL_COMPAT_OPENGL ); + +538 +sn + = + `SDL_COMPAT_SVideoMode +640, 480, +dth +, +fusn + ? +SDL_COMPAT_OPENGL +| +SDL_COMPAT_FULLSCREEN + : SDL_COMPAT_OPENGL ); + +541 if! +sn + ) + +543 + `tf +( "SDL video failed\n" ); + +544  +SDL_FALSE +; + +547 + `glMrixMode + +GL_PROJECTION + ); + +548 i( +ic +-> +show_keybrd +) { + +549 + `glOho +( 0.0f, 640.0f, 480.0f+240.0f, 0.0f, 0.0f, 1.0f ); + +551 + `glOho +( 0.0f, 640.0f, 480.0f, 0.0f, 0.0f, 1.0f ); + +553 + `glMrixMode + +GL_MODELVIEW + ); + +554 + `glLdIdty +(); + +555 + `glDib + +GL_DEPTH_TEST + ); + +556 + `glC4ub +( 255, 255, 255, 255 ); + +558 + `glGTextus + +NUM_TEXTURES +, +x + ); + +559 +dodx + = +SDL_TRUE +; + +561 + `glBndFunc + +GL_SRC_ALPHA +, +GL_ONE_MINUS_SRC_ALPHA + ); + +562 + `glEb + +GL_TEXTURE_2D + ); + +563 + `glEb + +GL_BLEND + ); + +566 if! + `go_go_gadg_xtu + +TEX_VIDEO +, 256, 256, +GL_LINEAR +, +SDL_TRUE + ) )  +SDL_FALSE +; + +567 if! + `go_go_gadg_xtu + +TEX_SCANLINES +, 32, 32, +GL_NEAREST +, +SDL_FALSE + ) )  SDL_FALSE; + +568 if! + `go_go_gadg_xtu + +TEX_STATUS +, 512, 32, +GL_NEAREST +, +SDL_TRUE + ) )  +SDL_FALSE +; + +569 if! + `go_go_gadg_xtu + +TEX_POPUP +, 512, 32, +GL_NEAREST +, +SDL_TRUE + ) )  +SDL_FALSE +; + +571  +y +=0; y<32; y++ ) + +573  +x +=0; x<32*4; ) + +575 +tx +[ +TEX_SCANLINES +]. +buf +[ +y +*32*4+ +x +++] = 0x00; + +576 +tx +[ +TEX_SCANLINES +]. +buf +[ +y +*32*4+ +x +++] = 0x00; + +577 +tx +[ +TEX_SCANLINES +]. +buf +[ +y +*32*4+ +x +++] = 0x00; + +578 +tx +[ +TEX_SCANLINES +]. +buf +[ +y +*32*4+ +x +++] = (y&1) ? 0x30 : 0x00; + +581 + `glBdTextu + +GL_TEXTURE_2D +, +x +[ +TEX_SCANLINES +] ); + +582 + `glTexImage2D + +GL_TEXTURE_2D +, 0, +GL_RGBA +, +tx +[ +TEX_SCANLINES +]. +w +,x[TEX_SCANLINES]. +h +, 0, GL_RGBA, +GL_UNSIGNED_BYTE +,x[TEX_SCANLINES]. +buf + ); + +584  +i +=0; i< +NUM_GIMG +; i++ ) + +586 if! + `go_go_gadg_xtu + +i ++ +TEX_GIMG +, + `rounduow2 + +gimgs +[i]. +w + ),ounduow2gimgs[i]. +h + ), +GL_NEAREST +, +SDL_FALSE + ) )  SDL_FALSE; + +588 +tx +[ +i ++ +TEX_GIMG +]. +tw + = (() +gimgs +[i]. +w +) / (()tx[i+TEX_GIMG].w); + +589 +tx +[ +i ++ +TEX_GIMG +]. +th + = (() +gimgs +[i]. +h +) / (()tx[i+TEX_GIMG].h); + +591  +y +=0; y< +gimgs +[ +i +]. +h +; y++ ) + +593  +x +=0; x< +gimgs +[ +i +]. +w +; x++ ) + +595 +tx +[ +i ++ +TEX_GIMG +]. +buf +[( +y +*tx[i+TEX_GIMG]. +w ++ +x +)*4 ] = +gimgs +[i].buf[(y*gimgs[i].w+x)*3]; + +596 +tx +[ +i ++ +TEX_GIMG +]. +buf +[( +y +*tx[i+TEX_GIMG]. +w ++ +x +)*4+1] = +gimgs +[i].buf[(y*gimgs[i].w+x)*3+1]; + +597 +tx +[ +i ++ +TEX_GIMG +]. +buf +[( +y +*tx[i+TEX_GIMG]. +w ++ +x +)*4+2] = +gimgs +[i].buf[(y*gimgs[i].w+x)*3+2]; + +598 +tx +[ +i ++ +TEX_GIMG +]. +buf +[( +y +*tx[i+TEX_GIMG]. +w ++ +x +)*4+3] = 0xff; + +601 + `glTexImage2D + +GL_TEXTURE_2D +, 0, +GL_RGBA +, +tx +[ +i ++ +TEX_GIMG +]. +w +,x[i+TEX_GIMG]. +h +, 0, GL_RGBA, +GL_UNSIGNED_BYTE +,x[i+TEX_GIMG]. +buf + ); + +605  +i +=0; i< +NUM_GUI_COLS +; i++ ) + +607 +gl +[ +i +] = ( +sgl +[i*3]<<24)|(sgpal[i*3+1]<<16)|(sgpal[i*3+2]<<8)|0xff; + +608 +gl +[ +i +] = + `_BE32 +( gpal[i] ); + +611  +i +=0; i< +NUM_TZ +; i++ ) + +612 + `nd_xtze_loc_gl + +ic +, +i + ); + +614 + `SDL_COMPAT_WM_SCti + +APP_NAME_FULL +, APP_NAME_FULL ); + +616 +rc +[0] = (() +sgl +[0*3+0])/255.0f; + +617 +rc +[1] = (() +sgl +[0*3+1])/255.0f; + +618 +rc +[2] = (() +sgl +[0*3+2])/255.0f; + +620 + `u_t_dty + +ic + ); + +622  +SDL_TRUE +; + +623 + } +} + +625  + $shut_nd_gl + +mache + * +ic + ) + +627  +i +; + +629 if +dodx + ) + +631 + `glDeTextus + +NUM_TEXTURES +, +x + ); + +632 +dodx + = +SDL_FALSE +; + +635  +i +=0; i< +NUM_TEXTURES +; i++ ) + +637 if +tx +[ +i +]. +buf + ) + ` +(x[i].buf ); + +638 +tx +[ +i +]. +buf + = +NULL +; + +639 +tx +[ +i +]. +w + = 0; + +640 +tx +[ +i +]. +h + = 0; + +642 + } +} + + @render_gl.h + +22 #ifde +__OPENGL_AVAILABLE__ + + +24  +nd_beg_gl + +mache + * +ic + ); + +25  +nd_d_gl + +mache + * +ic + ); + +26  +nd_xtze_loc_gl + +mache + * +ic +,  +i + ); + +27  +nd_xtze__gl + +mache + * +ic +,  +i + ); + +28  +nd_xtze_gl + +mache + * +ic +,  +i + ); + +29  +nd_r__gl + +x +,  +y +,  +w +,  +h + ); + +30  +nd_gimg_gl + +i +, +St32 + +xp +, St32 +yp + ); + +31  +nd_gimg_gl + +i +, +St32 + +xp +, St32 +yp +, St32 +ox +, St32 +oy +, St32 +w +, St32 +h + ); + +32  +nd_video_gl + +mache + * +ic +, +SDL_bo + +doubsize + ); + +33  +e_nd_gl + +mache + * +ic + ); + +34 +SDL_bo + +_nd_gl + +mache + * +ic + ); + +35 +SDL_bo + +nd_toggfusn_gl + +mache + * +ic + ); + +36  +shut_nd_gl + +mache + * +ic + ); + + @render_null.c + +22  + ~"syem.h +" + +23  + ~"6502.h +" + +24  + ~"v.h +" + +25  + ~"8912.h +" + +26  + ~"disk.h +" + +27  + ~"gui.h +" + +28  + ~"mڙ.h +" + +29  + ~"6551.h +" + +30  + ~"mache.h +" + +31  + ~"nd_nu.h +" + +33  + $nd_beg_nu + +mache + * +ic + ) + +35 + } +} + +37  + $nd_d_nu + +mache + * +ic + ) + +39 + } +} + +41  + $nd_xtze_loc_nu + +mache + * +ic +,  +i + ) + +43 + } +} + +45  + $nd_xtze__nu + +mache + * +ic +,  +i + ) + +47 + } +} + +49  + $nd_xtze_nu + +mache + * +ic +,  +i + ) + +51 + } +} + +53  + $nd_r__nu + +x +,  +y +,  +w +,  +h + ) + +55 + } +} + +57  + $nd_gimg_nu + +i +, +St32 + +xp +, St32 +yp + ) + +59 + } +} + +61  + $nd_gimg_nu + +i +, +St32 + +xp +, St32 +yp +, St32 +ox +, St32 +oy +, St32 +w +, St32 +h + ) + +63 + } +} + +65  + $nd_video_nu + +mache + * +ic +, +SDL_bo + +doubsize + ) + +67 + } +} + +69 +SDL_bo + + $nd_toggfusn_nu + +mache + * +ic + ) + +71  +SDL_TRUE +; + +72 + } +} + +74 +SDL_bo + + $_nd_nu + +mache + * +ic + ) + +76  +SDL_TRUE +; + +77 + } +} + +79  + $shut_nd_nu + +mache + * +ic + ) + +81 + } +} + + @render_null.h + +22  +nd_beg_nu + +mache + * +ic + ); + +23  +nd_d_nu + +mache + * +ic + ); + +24  +nd_xtze_loc_nu + +mache + * +ic +,  +i + ); + +25  +nd_xtze__nu + +mache + * +ic +,  +i + ); + +26  +nd_xtze_nu + +mache + * +ic +,  +i + ); + +27  +nd_r__nu + +x +,  +y +,  +w +,  +h + ); + +28  +nd_gimg_nu + +i +, +St32 + +xp +, St32 +yp + ); + +29  +nd_gimg_nu + +i +, +St32 + +xp +, St32 +yp +, St32 +ox +, St32 +oy +, St32 +w +, St32 +h + ); + +30  +nd_video_nu + +mache + * +ic +, +SDL_bo + +doubsize + ); + +31 +SDL_bo + +nd_toggfusn_nu + +mache + * +ic + ); + +32  +e_nd_nu + +mache + * +ic + ); + +33 +SDL_bo + +_nd_nu + +mache + * +ic + ); + +34  +shut_nd_nu + +mache + * +ic + ); + + @render_sw.c + +22  + ~ + +23  + ~ + +25  + ~"syem.h +" + +26  + ~"6502.h +" + +27  + ~"v.h +" + +28  + ~"8912.h +" + +29  + ~"disk.h +" + +30  + ~"gui.h +" + +31  + ~"mڙ.h +" + +32  + ~"6551.h +" + +33  + ~"mache.h +" + +34  + ~"nd_sw.h +" + +35  + ~"u.h +" + +37  +SDL_Sur + * + gsn +; + +38  +Ut32 + + ggl +[ +NUM_GUI_COLS +]; + +40  +Ut32 + + gpix_size +, + gofft_t +; + +41  +Ut32 + + gl +[8*2]; + +42  +Ut32 + + gdl +[8*2]; + +43  +Ut8 + * + gmgimg +[ +NUM_GIMG +]; + +45 +SDL_bo + +fusn +, +hwsur +; + +46  +SDL_bo + + gedr +; + +47  +xtze + * +tz +[ +NUM_TZ +]; + +48  +sgl +[]; + +49 +Ut8 + +i +[]; + +50  +guiimg + +gimgs +[ +NUM_GIMG +]; + +51 +SDL_bo + +eshus +; + +54  +theft +[]; + +57 (* +tch +) +Ut8 +*, , +Ut32 +, Ut32, +SDL_bo + ); + +60 + $SDL_bo + (* +guiimg_to_img +)( +Ut8 +** +d +, cڡ  +guiimg +* +c +); + +70  + #DEFINE_tch_X_b +( +BIT_DEPTH +) \ + +71  +tch_ + ## +BIT_DEPTH + ## +b + \ + +72 +Ut8 +* +r +,  +ch +, +Ut32 + +fc +, Ut32 +bc +, +SDL_bo + +sidft + ) \ + +74  +x +, +y +, +mask +; \ + +75 cڡ +Ut8 + * +c_by +; \ + +76 +Ut + ## +BIT_DEPTH + * +d_pix +; \ + +77 +Ut8 +* +d_sƚe +; \ + +79 if +ch + > 127 ) ; \ + +81 +c_by + = & +theft +[ +ch +*12]; \ + +83 +d_sƚe + = +r +; \ + +85  +y +=12; y!=0; --y, ++ +c_by +, +d_sƚe ++= +sn +-> +pch + ) \ + +87 +d_pix + = ( +Ut + ## +BIT_DEPTH + *) +d_sƚe +; \ + +89  +mask +=0x80, +x +=8; x!=0; --x, ++ +d_pix +, mask>>=1 ) \ + +91 if(* +c_by +)& +mask + ) \ + +92 * +d_pix + = ( +Ut + ## +BIT_DEPTH +) +fc +; \ + +93 if +sidft + ) \ + +94 * +d_pix + = ( +Ut + ## +BIT_DEPTH +) +bc +; \ + +97 + } + + ) +} + +99 + $DEFINE_tch_X_b +(16) + +100 + $DEFINE_tch_X_b +(32) + +104  + $nd_beg_sw + +mache + * +ic + ) + +106  +x +, +y +; + +107 +Ut8 + * +d_sƚe +; + +109 if + `SDL_MUSTLOCK + +sn + ) ) + +110 + `SDL_LockSur + +sn + ); + +112 if +ic +-> +wpupr + ) + +114 +d_sƚe + = ( +Ut8 +*) +sn +-> +pixs +; + +115 +d_sƚe + +320 * +pix_size +; + +117 if +ic +-> +sw_dth + == 16 ) + +119 +Ut16 + * +d_pix +; + +120  +y +=12; y!=0; --y, +d_sƚe + + +sn +-> +pch +) + +122 +d_pix + = ( +Ut16 + *) +d_sƚe +; + +123  +x +=320; x<640; x++, +d_pix +++ ) + +124 * +d_pix + = +gl +[0]; + +127 +Ut32 + * +d_pix +; + +128  +y +=12; y!=0; --y, +d_sƚe + + +sn +-> +pch +) + +130 +d_pix + = ( +Ut32 + *) +d_sƚe +; + +131  +x +=320; x<640; x++, +d_pix +++ ) + +132 * +d_pix + = +gl +[0]; + +135 +ic +-> +wpupr + = +SDL_FALSE +; + +138 if +ic +-> +wusr + ) + +140 +eshus + = +SDL_TRUE +; + +141 +ic +-> +wusr + = +SDL_FALSE +; + +143 + } +} + +145  + $nd_d_sw + +mache + * +ic + ) + +147  +i +; + +148 +Ut32 + +ch_pch +; + +149 +Ut8 + * +d_pix +; + +151 +ch_pch + = 8 * +pix_size +; + +153 if +ic +-> +emu_mode + = +EM_RUNNING + ) + +155 if +ic +-> +pupr +[0] ) + +157 +d_pix + = ( +Ut8 +*) +sn +-> +pixs +; + +158 +d_pix + +320 * +pix_size +; + +160  +i +=0; +ic +-> +pupr +[i]; i++, +d_pix + + +ch_pch + ) + +161 + `tch + +d_pix +, +ic +-> +pupr +[ +i +], +gl +[1], gl[0], +SDL_TRUE + ); + +164 if +ic +-> +usr +[0] ) + +166 +d_pix + = ( +Ut8 +*) +sn +-> +pixs +; + +167 +d_pix + +466 * +sn +-> +pch +; + +169  +i +=0; +ic +-> +usr +[i]; i++, +d_pix + + +ch_pch + ) + +170 + `tch + +d_pix +, +ic +-> +usr +[ +i +], +gl +[1], 0, +SDL_FALSE + ); + +174 if + `SDL_MUSTLOCK + +sn + ) ) + +175 + `SDL_UockSur + +sn + ); + +177 + `SDL_COMPAT_Fl + +sn + ); + +178 + } +} + +180  + $nd_xtze_loc_sw + +mache + * +ic +,  +i + ) + +182 + } +} + +184  + $nd_xtze__sw + +mache + * +ic +,  +i + ) + +186 + } +} + +188  + $nd_xtze_sw + +mache + * +ic +,  +i + ) + +190  +x +, +y +, +o +; + +191 +Ut32 + +ch_pch +; + +192  +xtze + * +z + = +tz +[ +i +]; + +193 +Ut8 + * +d_sƚe +, * +d_pix +; + +195 +ch_pch + = 8 * +pix_size +; + +197 +d_sƚe + = ( +Ut8 + *) +sn +-> +pixs +; + +198 +d_sƚe + + +sn +-> +pch + * +z +-> +y + + +pix_size + *tz-> +x +; + +200 +o + = 0; + +201  +y += +z +-> +h +; y!=0; --y, +d_sƚe ++=12* +sn +-> +pch + ) + +203 +d_pix + = +d_sƚe +; + +205  +x += +z +-> +w +; x!=0; --x, ++ +o +, +d_pix ++= +ch_pch + ) + +206 + `tch + +d_pix +, +z +-> +tx +[ +o +], +gl +[z-> +fc +[o]], gl[z-> +bc +[o]], +SDL_TRUE + ); + +209 + } +} + +212  + $nd_r__sw + +x +,  +y +,  +w +,  +h + ) + +214 +Ut8 + * +d_sƚe +; + +215 +St32 + +i +; + +217 +d_sƚe + = ( +Ut8 + *) +sn +-> +pixs +; + +218 +d_sƚe + + +sn +-> +pch + * +y + + +pix_size + * +x +; + +220  +i +=0; i< +h +; i++, +d_sƚe ++= +sn +-> +pch + ) + +221 + `memt + +d_sƚe +, 0, +pix_size +* +w + ); + +222 + } +} + +225  + $nd_gimg_sw + +img_id +, +St32 + +xp +, St32 +yp + ) + +227  +guiimg + * +gi + = & +gimgs +[ +img_id +]; + +228 +Ut8 + * +c_sƚe +, * +d_sƚe +; + +229 +St32 + +i +; + +231 +c_sƚe + = +mgimg +[ +img_id +]; + +233 +d_sƚe + = ( +Ut8 + *) +sn +-> +pixs +; + +234 +d_sƚe + + +sn +-> +pch + * +yp + + +pix_size + * +xp +; + +236  +i += +gi +-> +h +; i!=0; --i, +c_sƚe ++= +pix_size +*gi-> +w +, +d_sƚe ++= +sn +-> +pch + ) + +237 + `memy + +d_sƚe +, +c_sƚe +, +pix_size +* +gi +-> +w + ); + +238 + } +} + +241  + $nd_gimg_sw + +img_id +, +St32 + +xp +, St32 +yp +, St32 +ox +, St32 +oy +, St32 +w +, St32 +h + ) + +243  +guiimg + * +gi + = & +gimgs +[ +img_id +]; + +244 +Ut8 + * +c_sƚe +, * +d_sƚe +; + +245 +St32 + +i +; + +247 +c_sƚe + = +mgimg +[ +img_id +]; + +248 +c_sƚe + + +pix_size +*( +gi +-> +w + * +oy + + +ox +); + +250 +d_sƚe + = ( +Ut8 + *) +sn +-> +pixs +; + +251 +d_sƚe + + +sn +-> +pch + * +yp + + +pix_size + * +xp +; + +253  +i += +h +; i!=0; --i, +c_sƚe ++= +pix_size +* +gi +-> +w +, +d_sƚe ++= +sn +-> +pch + ) + +254 + `memy + +d_sƚe +, +c_sƚe +, +pix_size +* +w + ); + +255 + } +} + +258  + $nd_video_sw_16b + +mache + * +ic +, +SDL_bo + +doubsize + ) + +260  +x +, +y +; + +261 +Ut8 + * +c_pix +; + +262 +St32 + +d_pch_x2 +; + +263 +Ut32 + +c +; + +264 +Ut8 + * +d_sƚe +, * +d_ev_sƚe +, * +d_odd_sƚe +; + +265 +Ut16 + * +d_pix +; + +266 +Ut32 + * +d_ev_pix +, * +d_odd_pix +; + +268 if! +ic +-> +s + ) + +271 if +doubsize + ) + +273 if +edr + ) + +275 + `SDL_FlRe +( +sn +, +NULL +, +gl +[0]); + +276 +edr + = +SDL_FALSE +; + +279 +c_pix + = +ic +-> +s +; + +281 +d_pch_x2 + = 2 * +sn +-> +pch +; + +283 +d_ev_sƚe + = (( +Ut8 +*) +sn +-> +pixs ++ +offt_t +; + +285 +d_odd_sƚe + = +d_ev_sƚe +; + +286 +d_odd_sƚe + + +sn +-> +pch +; + +288 if +ic +-> +sƚes + ) + +290  +y +=0; y<224; y++, +d_ev_sƚe ++= +d_pch_x2 +, +d_odd_sƚe ++=dst_pitch_x2 ) + +292 i(! +ic +-> +vid_dty +[ +y +]) + +294 +c_pix + += 240; + +297 +d_ev_pix + = ( +Ut32 +*) +d_ev_sƚe +; + +298 +d_odd_pix + = ( +Ut32 +*) +d_odd_sƚe +; + +300  +x +=240; x!=0; --x ) + +302 +c + = *( +c_pix +++); + +303 *( +d_ev_pix +++ +dl +[ +c +]; + +304 *( +d_odd_pix +++ +dl +[ +c ++8]; + +306 +ic +-> +vid_dty +[ +y +] = +SDL_FALSE +; + +310  +y +=0; y<224; y++, +d_ev_sƚe ++= +d_pch_x2 +, +d_odd_sƚe ++=dst_pitch_x2 ) + +312 i(! +ic +-> +vid_dty +[ +y +]) + +314 +c_pix + += 240; + +317 +d_ev_pix + = ( +Ut32 +*) +d_ev_sƚe +; + +318 +d_odd_pix + = ( +Ut32 +*) +d_odd_sƚe +; + +320  +x +=240; x!=0; --x ) + +322 +c + = +dl +[*( +c_pix +++)]; + +323 *( +d_ev_pix +++ +c +; + +324 *( +d_odd_pix +++ +c +; + +326 +ic +-> +vid_dty +[ +y +] = +SDL_FALSE +; + +332 +edr + = +SDL_TRUE +; + +334 +c_pix + = +ic +-> +s +; + +335 +d_sƚe + = ( +Ut8 +*) +sn +-> +pixs +; + +337  +y +=0; y<4; y++ ) + +339 + `memt + +d_sƚe +, 0, 240* +pix_size + ); + +340 +d_sƚe + + +sn +-> +pch +; + +342  ; +y +<228; y++, +d_sƚe ++= +sn +-> +pch + ) + +344 +d_pix + = ( +Ut16 +*) +d_sƚe +; + +346  +x +=240; x!=0; --x ) + +347 *( +d_pix +++( +Ut16 +) +l +[*( +c_pix +++)]; + +349 + } +} + +352  + $nd_video_sw_32b + +mache + * +ic +, +SDL_bo + +doubsize + ) + +354  +x +, +y +; + +355 +Ut8 + * +c_pix +; + +356 +St32 + +d_pch_x2 +; + +357 +Ut32 + +c +, +c2 +; + +358 +Ut8 + * +d_sƚe +, * +d_ev_sƚe +, * +d_odd_sƚe +; + +359 +Ut32 + * +d_pix +, * +d_ev_pix +, * +d_odd_pix +; + +361 if! +ic +-> +s + ) + +364 if +doubsize + ) + +366 if +edr + ) + +368 + `SDL_FlRe +( +sn +, +NULL +, +gl +[0]); + +369 +edr + = +SDL_FALSE +; + +372 +c_pix + = +ic +-> +s +; + +374 +d_pch_x2 + = 2 * +sn +-> +pch +; + +376 +d_ev_sƚe + = (( +Ut8 +*) +sn +-> +pixs ++ +offt_t +; + +378 +d_odd_sƚe + = +d_ev_sƚe +; + +379 +d_odd_sƚe + + +sn +-> +pch +; + +381 if +ic +-> +sƚes + ) + +383  +y +=0; y<224; y++, +d_ev_sƚe ++= +d_pch_x2 +, +d_odd_sƚe ++=dst_pitch_x2 ) + +385 i(! +ic +-> +vid_dty +[ +y +]) + +387 +c_pix + += 240; + +390 +d_ev_pix + = ( +Ut32 +*) +d_ev_sƚe +; + +391 +d_odd_pix + = ( +Ut32 +*) +d_odd_sƚe +; + +393  +x +=240; x!=0; --x ) + +395 +c2 + = +l +[(* +c_pix +)+8]; + +396 +c + = +l +[*( +c_pix +++)]; + +398 *( +d_ev_pix +++ +c +; + +399 *( +d_ev_pix +++ +c +; + +400 *( +d_odd_pix +++ +c2 +; + +401 *( +d_odd_pix +++ +c2 +; + +404 +ic +-> +vid_dty +[ +y +] = +SDL_FALSE +; + +408  +y +=0; y<224; y++, +d_ev_sƚe ++= +d_pch_x2 +, +d_odd_sƚe ++=dst_pitch_x2 ) + +410 i(! +ic +-> +vid_dty +[ +y +]) + +412 +c_pix + += 240; + +415 +d_ev_pix + = ( +Ut32 +*) +d_ev_sƚe +; + +416 +d_odd_pix + = ( +Ut32 +*) +d_odd_sƚe +; + +418  +x +=240; x!=0; --x ) + +420 +c + = +l +[*( +c_pix +++)]; + +422 *( +d_ev_pix +++ +c +; + +423 *( +d_ev_pix +++ +c +; + +424 *( +d_odd_pix +++ +c +; + +425 *( +d_odd_pix +++ +c +; + +427 +ic +-> +vid_dty +[ +y +] = +SDL_FALSE +; + +433 +edr + = +SDL_TRUE +; + +435 +c_pix + = +ic +-> +s +; + +436 +d_sƚe + = ( +Ut8 +*) +sn +-> +pixs +; + +438  +y +=0; y<4; y++ ) + +440 + `memt + +d_sƚe +, 0, 240* +pix_size + ); + +441 +d_sƚe + + +sn +-> +pch +; + +444  ; +y +<228; y++, +d_sƚe ++= +sn +-> +pch + ) + +446 +d_pix + = ( +Ut32 +*) +d_sƚe +; + +448  +x +=240; x!=0; --x ) + +449 *( +d_pix +++ +l +[*( +c_pix +++)]; + +451 + } +} + +453  + $nd_sw_devideo + +mache + * +ic + ) + +455  +BsPPix + = + `SDL_COMPAT_GBsPPix +(); + +458 +ic +-> +sw_dth + = 16; + +460  +BsPPix + ) + +467 +ic +-> +sw_dth + = +BsPPix +; + +473 + } +} + +475  + $e_nd_sw + +mache + * +ic + ) + +477 +St32 + +i +; + +480 +sn + = +NULL +; + +483  +i +=0; i< +NUM_GIMG +; i++ ) + +484 +mgimg +[ +i +] = +NULL +; + +485 + } +} + +487 +SDL_bo + + $nd_toggfusn_sw + +mache + * +ic + ) + +489 #i + `defed +( +__amigaos4__ +|| defed( +__lux__ +|| defed( +__MORPHOS__ +) + +491 if + `SDL_COMPAT_WM_ToggFuSn + +sn + ) ) + +493 +fusn + = !fullscreen; + +494  +SDL_TRUE +; + +497  +SDL_FALSE +; + +499 +ic +-> + `shut_nd +( oric ); + +500 +fusn + = !fullscreen; + +501 if +ic +-> + `_nd +i +SDL_TRUE +; + +502 + `t_nd_mode + +ic +, +RENDERMODE_NULL + ); + +503 +ic +-> +emu_mode + = +EM_PLEASEQUIT +; + +504  +SDL_FALSE +; + +506 + } +} + +510  + #DEFINE_guiimg_to_img_X_b +( +BIT_DEPTH +) \ + +511  +SDL_bo + +guiimg_to_img_ + ## +BIT_DEPTH + ## +b + \ + +512 ( +Ut8 +** +d +, cڡ  +guiimg +* +c +) \ + +514 +size_t + +i +; \ + +515 cڡ +Ut8 + * +c_pix +; \ + +516 +Ut + ## +BIT_DEPTH + * +d_pix +; \ + +518 (* +d +( +Ut8 + *) + `mloc + +c +-> +w +*c-> +h +*( +Ut + ## +BIT_DEPTH +) ); \ + +519 i((* +d += +NULL +) \ + +520  +SDL_FALSE +; \ + +522 +c_pix + = +c +-> +buf +; \ + +523 +d_pix + = ( +Ut + ## +BIT_DEPTH + *)(* +d +); \ + +525  +i += +c +-> +w +*c-> +h +; i!=0; --i, +c_pix + +3, ++ +d_pix + ) \ + +526 (* +d_pix +) = \ + +527 ( +Ut + ## +BIT_DEPTH +) + `SDL_MRGB + +sn +-> +fm +, \ + +528 +c_pix +[0], \ + +529 +c_pix +[1], \ + +530 +c_pix +[2] ); \ + +532  +SDL_TRUE +; \ + +533 } + + ) + +535 + $DEFINE_guiimg_to_img_X_b +(16) + +536 + $DEFINE_guiimg_to_img_X_b +(32) + +540 +SDL_bo + + $_nd_sw + +mache + * +ic + ) + +542  +i +; + +543 * +l_ +; + +544 +St32 + +surmode +; + +546 +pix_size + = +ic +-> +sw_dth + / 8; + +548 +surmode + = +fusn + ? +SDL_COMPAT_FULLSCREEN + : +SDL_SWSURFACE +; + +549 if +hwsur + ) { +surmode + &~ +SDL_SWSURFACE +; surmod| +SDL_COMPAT_HWSURFACE +; } + +552 i( +ic +-> +show_keybrd +) { + +553 +sn + = + `SDL_COMPAT_SVideoMode +640, 480+240, +ic +-> +sw_dth +, +surmode + ); + +555 +sn + = + `SDL_COMPAT_SVideoMode +640, 480, +ic +-> +sw_dth +, +surmode + ); + +558 if! +sn + ) + +560 + `tf +( "SDL video failed\n" ); + +561  +SDL_FALSE +; + +564 + `SDL_COMPAT_WM_SCti + +APP_NAME_FULL +, APP_NAME_FULL ); + +567 i( +ic +-> +sw_dth + == 16) { + +568 +tch + = +tch_16b +; + +569 +guiimg_to_img + = +guiimg_to_img_16b +; + +572 i( +ic +-> +sw_dth + == 32) { + +573 +tch + = +tch_32b +; + +574 +guiimg_to_img + = +guiimg_to_img_32b +; + +579 +l_ + = +sgl +; + +580  +i +=0; i< +NUM_GUI_COLS +; i++, +l_ ++=3 ) + +581 +gl +[ +i +] = + `SDL_MRGB + +sn +-> +fm +, +l_ +[0],al_it[1],al_it[2] ); + +584 +l_ + = +i +; + +585  +i +=0; i<8; i++, +l_ ++=3 ) + +587 +l +[ +i + ] = + `SDL_MRGB + +sn +-> +fm +, +l_ +[0],al_it[1],al_it[2] ); + +588 +l +[ +i ++8] = + `SDL_MRGB + +sn +-> +fm +, +l_ +[0]/2,al_it[1]/2,al_it[2]/2 ); + +592  +i +=0; i< +NUM_GIMG +; i++ ) + +593 i(! + `guiimg_to_img +( +mgimg + + +i +, +gimgs + + i)) + +594  +SDL_FALSE +; + +597  +i +=0; i<8*2; i++ ) + +598 +dl +[ +i +] = ( +l +[i]<<16)|pal[i]; + +601 +edr + = +SDL_TRUE +; + +602 +eshus + = +SDL_TRUE +; + +605 +offt_t + = (240 - 226* +sn +-> +pch +; + +606 +offt_t + + +pix_size + * 80; + +608 + `u_t_dty + +ic + ); + +611  +SDL_TRUE +; + +612 + } +} + +614  + $shut_nd_sw + +mache + * +ic + ) + +616 +St32 + +i +; + +618  +i +=0; i< +NUM_GIMG +; i++ ) + +620 if +mgimg +[ +i +] ) + ` +( mgimg[i] ); + +621 +mgimg +[ +i +] = +NULL +; + +625 + } +} + + @render_sw.h + +22  +nd_beg_sw + +mache + * +ic + ); + +23  +nd_d_sw + +mache + * +ic + ); + +24  +nd_xtze_loc_sw + +mache + * +ic +,  +i + ); + +25  +nd_xtze__sw + +mache + * +ic +,  +i + ); + +26  +nd_xtze_sw + +mache + * +ic +,  +i + ); + +27  +nd_gimg_sw + +i +, +St32 + +xp +, St32 +yp + ); + +28  +nd_gimg_sw + +i +, +St32 + +xp +, St32 +yp +, St32 +ox +, St32 +oy +, St32 +w +, St32 +h + ); + +29  +nd_video_sw_16b + +mache + * +ic +, +SDL_bo + +doubsize + ); + +30  +nd_video_sw_32b + +mache + * +ic +, +SDL_bo + +doubsize + ); + +31  +nd_r__sw + +x +,  +y +,  +w +,  +h + ); + +32 +SDL_bo + +nd_toggfusn_sw + +mache + * +ic + ); + +33  +e_nd_sw + +mache + * +ic + ); + +34 +SDL_bo + +_nd_sw + +mache + * +ic + ); + +35  +shut_nd_sw + +mache + * +ic + ); + +37  +nd_sw_devideo + +mache + * +ic + ); + + @render_sw8.c + +22  + ~ + +23  + ~ + +25  + ~"syem.h +" + +26  + ~"6502.h +" + +27  + ~"v.h +" + +28  + ~"8912.h +" + +29  + ~"disk.h +" + +30  + ~"gui.h +" + +31  + ~"mڙ.h +" + +32  + ~"6551.h +" + +33  + ~"mache.h +" + +34  + ~"nd_sw8.h +" + +35  + ~"u.h +" + +39  + #GPAL_FIRSTPEN + 20 + + ) + +41  +SDL_Sur + * + gsn +; + +43  +Ut32 + + gofft_t +; + +44  +Ut32 + + gqn +[16*256]; + +46 +SDL_bo + +fusn +, +hwsur +; + +47  +SDL_bo + + gedr +; + +48  +xtze + * +tz +[ +NUM_TZ +]; + +49  +sgl +[]; + +50 +Ut8 + +i +[]; + +51  +guiimg + +gimgs +[ +NUM_GIMG +]; + +52 +SDL_bo + +eshus +; + +53  +Ut8 + * + gmgimg +[ +NUM_GIMG +]; + +54  + gxt_gimgc +; + +55  +SDL_C + + gcours +[256]; + +58  +theft +[]; + +68  + $tch + +Ut8 +* +r +,  +ch +, Ut8 +fc +, Ut8 +bc +, +SDL_bo + +sidft + ) + +70  +x +, +y +, +mask +; + +71 cڡ +Ut8 + * +c_by +; + +72 +Ut8 + * +d_pix +; + +73 +Ut8 + * +d_sƚe +; + +75 if +ch + > 127 ) ; + +77 +c_by + = & +theft +[ +ch +*12]; + +78 +d_sƚe + = +r +; + +80  +y +=12; y!=0; --y, ++ +c_by +, +d_sƚe ++= +sn +-> +pch + ) + +82 +d_pix + = +d_sƚe +; + +84  +mask +=0x80, +x +=8; x!=0; --x, ++ +d_pix +, mask>>=1 ) + +86 if(* +c_by +)& +mask + ) + +87 * +d_pix + = +fc +; + +88 if +sidft + ) + +89 * +d_pix + = +bc +; + +92 + } +} + +95  + $nd_beg_sw8 + +mache + * +ic + ) + +97  +y +; + +98 +Ut8 + * +d_sƚe +; + +100 if + `SDL_MUSTLOCK + +sn + ) ) + +101 + `SDL_LockSur + +sn + ); + +103 if +ic +-> +wpupr + ) + +105 +d_sƚe + = ( +Ut8 +*) +sn +-> +pixs +; + +106 +d_sƚe + += 320; + +108  +y +=12; y!=0; --y, +d_sƚe + + +sn +-> +pch +) + +109 + `memt +( +d_sƚe +, +GPAL_FIRSTPEN +, 320); + +110 +ic +-> +wpupr + = +SDL_FALSE +; + +113 if +ic +-> +wusr + ) + +115 +eshus + = +SDL_TRUE +; + +116 +ic +-> +wusr + = +SDL_FALSE +; + +118 + } +} + +120  + $nd_d_sw8 + +mache + * +ic + ) + +122  +i +; + +123 +Ut32 + +ch_pch +; + +124 +Ut8 + * +d_pix +; + +126 +ch_pch + = 8; + +128 if +ic +-> +emu_mode + = +EM_RUNNING + ) + +130 if +ic +-> +pupr +[0] ) + +132 +d_pix + = ( +Ut8 +*) +sn +-> +pixs +; + +133 +d_pix + += 320; + +135  +i +=0; +ic +-> +pupr +[i]; i++, +d_pix + + +ch_pch + ) + +136 + `tch + +d_pix +, +ic +-> +pupr +[ +i +], +GPAL_FIRSTPEN ++1, GPAL_FIRSTPEN, +SDL_TRUE + ); + +139 if +ic +-> +usr +[0] ) + +141 +d_pix + = ( +Ut8 +*) +sn +-> +pixs +; + +142 +d_pix + +466 * +sn +-> +pch +; + +144  +i +=0; +ic +-> +usr +[i]; i++, +d_pix + + +ch_pch + ) + +145 + `tch + +d_pix +, +ic +-> +usr +[ +i +], +GPAL_FIRSTPEN ++1, 0, +SDL_FALSE + ); + +149 if + `SDL_MUSTLOCK + +sn + ) ) + +150 + `SDL_UockSur + +sn + ); + +152 + `SDL_COMPAT_Fl + +sn + ); + +153 + } +} + +155  + $nd_xtze_loc_sw8 + +mache + * +ic +,  +i + ) + +157 + } +} + +159  + $nd_xtze__sw8 + +mache + * +ic +,  +i + ) + +161 + } +} + +163  + $nd_xtze_sw8 + +mache + * +ic +,  +i + ) + +165  +x +, +y +, +o +; + +166  +xtze + * +z + = +tz +[ +i +]; + +167 +Ut8 + * +d_sƚe +, * +d_pix +; + +169 +d_sƚe + = ( +Ut8 + *) +sn +-> +pixs +; + +170 +d_sƚe + + +sn +-> +pch + * +z +-> +y + +tz-> +x +; + +172 +o + = 0; + +173  +y += +z +-> +h +; y!=0; --y, +d_sƚe ++=12* +sn +-> +pch + ) + +175 +d_pix + = +d_sƚe +; + +177  +x += +z +-> +w +; x!=0; --x, ++ +o +, +d_pix ++=8 ) + +178 + `tch + +d_pix +, +z +-> +tx +[ +o +], +GPAL_FIRSTPEN ++z-> +fc +[o], GPAL_FIRSTPEN+z-> +bc +[o], +SDL_TRUE + ); + +180 + } +} + +183  + $nd_r__sw8 + +x +,  +y +,  +w +,  +h + ) + +185 +Ut8 + * +d_sƚe +; + +186 +St32 + +i +; + +188 +d_sƚe + = ( +Ut8 + *) +sn +-> +pixs +; + +189 +d_sƚe + + +sn +-> +pch + * +y + + +x +; + +191  +i +=0; i< +h +; i++, +d_sƚe ++= +sn +-> +pch + ) + +192 + `memt + +d_sƚe +, 0, +w + ); + +193 + } +} + +196  + $nd_gimg_sw8 + +img_id +, +St32 + +xp +, St32 +yp + ) + +198  +guiimg + * +gi + = & +gimgs +[ +img_id +]; + +199 +Ut8 + * +c_sƚe +, * +d_sƚe +; + +200 +St32 + +i +; + +202 +c_sƚe + = +mgimg +[ +img_id +]; + +204 +d_sƚe + = ( +Ut8 + *) +sn +-> +pixs +; + +205 +d_sƚe + + +sn +-> +pch + * +yp + + +xp +; + +207  +i += +gi +-> +h +; i!=0; --i, +c_sƚe ++=gi-> +w +, +d_sƚe ++= +sn +-> +pch + ) + +208 + `memy + +d_sƚe +, +c_sƚe +, +gi +-> +w + ); + +209 + } +} + +212  + $nd_gimg_sw8 + +img_id +, +St32 + +xp +, St32 +yp +, St32 +ox +, St32 +oy +, St32 +w +, St32 +h + ) + +214  +guiimg + * +gi + = & +gimgs +[ +img_id +]; + +215 +Ut8 + * +c_sƚe +, * +d_sƚe +; + +216 +St32 + +i +; + +218 +c_sƚe + = +mgimg +[ +img_id +]; + +219 +c_sƚe + + +gi +-> +w + * +oy + + +ox +; + +221 +d_sƚe + = ( +Ut8 + *) +sn +-> +pixs +; + +222 +d_sƚe + + +sn +-> +pch + * +yp + + +xp +; + +224  +i += +h +; i!=0; --i, +c_sƚe ++= +gi +-> +w +, +d_sƚe ++= +sn +-> +pch + ) + +225 + `memy + +d_sƚe +, +c_sƚe +, +w + ); + +226 + } +} + +229  + $nd_video_sw8 + +mache + * +ic +, +SDL_bo + +doubsize + ) + +231  +x +, +y +; + +232 +Ut16 + * +c_pix +; + +233 +St32 + +d_pch_x2 +; + +234 +Ut32 + +c +; + +235 +Ut8 + * +d_sƚe +, * +d_ev_sƚe +, * +d_odd_sƚe +; + +236 +Ut32 + * +d_ev_pix +, * +d_odd_pix +; + +238 if! +ic +-> +s + ) + +241 if +doubsize + ) + +243 if +edr + ) + +245 + `SDL_FlRe +( +sn +, +NULL +, +GPAL_FIRSTPEN +); + +246 +edr + = +SDL_FALSE +; + +249 +c_pix + = ( +Ut16 + *) +ic +-> +s +; + +251 +d_pch_x2 + = 2 * +sn +-> +pch +; + +253 +d_ev_sƚe + = (( +Ut8 +*) +sn +-> +pixs ++ +offt_t +; + +255 +d_odd_sƚe + = +d_ev_sƚe +; + +256 +d_odd_sƚe + + +sn +-> +pch +; + +258 if +ic +-> +sƚes + ) + +260  +y +=0; y<224; y++, +d_ev_sƚe ++= +d_pch_x2 +, +d_odd_sƚe ++=dst_pitch_x2 ) + +262 i(! +ic +-> +vid_dty +[ +y +]) + +264 +c_pix + += 120; + +267 +d_ev_pix + = ( +Ut32 +*) +d_ev_sƚe +; + +268 +d_odd_pix + = ( +Ut32 +*) +d_odd_sƚe +; + +270  +x +=0; x<120; x++ ) + +272 +c + = *( +c_pix +++); + +273 *( +d_ev_pix +++ +qn +[ +c +]; + +274 *( +d_odd_pix +++ +qn +[ +c ++8*257]; + +276 +ic +-> +vid_dty +[ +y +] = +SDL_FALSE +; + +280  +y +=0; y<224; y++, +d_ev_sƚe ++= +d_pch_x2 +, +d_odd_sƚe ++=dst_pitch_x2 ) + +282 i(! +ic +-> +vid_dty +[ +y +]) + +284 +c_pix + += 120; + +287 +d_ev_pix + = ( +Ut32 +*) +d_ev_sƚe +; + +288 +d_odd_pix + = ( +Ut32 +*) +d_odd_sƚe +; + +290  +x +=0; x<120; x++ ) + +292 +c + = +qn +[*( +c_pix +++)]; + +293 *( +d_ev_pix +++ +c +; + +294 *( +d_odd_pix +++ +c +; + +296 +ic +-> +vid_dty +[ +y +] = +SDL_FALSE +; + +302 +edr + = +SDL_TRUE +; + +304 +c_pix + = ( +Ut16 + *) +ic +-> +s +; + +305 +d_sƚe + = ( +Ut8 +*) +sn +-> +pixs +; + +307  +y +=0; y<4; y++ ) + +309 + `memt + +d_sƚe +, 0, 240 ); + +310 +d_sƚe + + +sn +-> +pch +; + +312  ; +y +<228; y++, +d_sƚe ++= +sn +-> +pch + ) + +314 + `memy +( +d_sƚe +, +c_pix +, 240); + +315 +c_pix + += 240; + +317 + } +} + +319  + $e_nd_sw8 + +mache + * +ic + ) + +322 +sn + = +NULL +; + +323 + } +} + +325 +SDL_bo + + $nd_toggfusn_sw8 + +mache + * +ic + ) + +327 #i + `defed +( +__amigaos4__ +|| defed( +__lux__ +) + +329 if + `SDL_COMPAT_WM_ToggFuSn + +sn + ) ) + +331 +fusn + = !fullscreen; + +332  +SDL_TRUE +; + +335  +SDL_FALSE +; + +337 +ic +-> + `shut_nd +( oric ); + +338 +fusn + = !fullscreen; + +339 if +ic +-> + `_nd +i +SDL_TRUE +; + +340 + `t_nd_mode + +ic +, +RENDERMODE_NULL + ); + +341 +ic +-> +emu_mode + = +EM_PLEASEQUIT +; + +342  +SDL_FALSE +; + +344 + } +} + +346  + $sim_cour +( +i +,  +r +,  +g +,  +b +) + +348  + `abs +( +r +-() +cours +[ +i +].r)+abs( +g +-()cours[i].g)+abs( +b +-()colours[i].b); + +349 + } +} + +351  + $fd_be_n +( +Ut8 + +r +,  +g +,  +b +) + +353  +i +; + +354  +o_n +=-1, +o_di +=8000; + +357  +i +=0; i< +xt_gimgc +; i++ ) + +359 if( +cours +[ +i +]. +r + ==) && + +360 ( +cours +[ +i +]. +g + == g) && + +361 ( +cours +[ +i +]. +b + == b) ) + +362  +i +; + +364 i( + `sim_cour +( +i +, +r +, +g +, +b +< +o_di +) + +366 +o_n + = +i +; + +367 +o_di + = + `sim_cour +( +i +, +r +, +g +, +b +); + +372 i( +o_di + < 3) + +373  +o_n +; + +376 i( +xt_gimgc + >= 256) + +377  +o_n +; + +379 +cours +[ +xt_gimgc +]. +r + =; + +380 +cours +[ +xt_gimgc +]. +g + = g; + +381 +cours +[ +xt_gimgc +]. +b + = b; + +383  +xt_gimgc +++; + +384 + } +} + +386  +SDL_bo + + $guiimg_to_img +( +Ut8 +** +d +, cڡ  +guiimg +* +c +) + +388 +size_t + +i +; + +389 cڡ +Ut8 + * +c_pix +; + +390 +Ut8 + * +d_pix +; + +392 (* +d +( +Ut8 + *) + `mloc + +c +-> +w +*c-> +h + ); + +393 i((* +d += +NULL +) + +394  +SDL_FALSE +; + +396 +c_pix + = +c +-> +buf +; + +397 +d_pix + = * +d +; + +399  +i += +c +-> +w +*c-> +h +; i!=0; --i, +c_pix + +3, ++ +d_pix + ) + +400 (* +d_pix + + `fd_be_n +( +c_pix +[0], src_pixel[1], src_pixel[2]); + +402  +SDL_TRUE +; + +403 + } +} + +405 +SDL_bo + + $_nd_sw8 + +mache + * +ic + ) + +407  +i +, +j +; + +408 +St32 + +surmode +; + +410 +surmode + = +SDL_COMPAT_HWPALETTE +; + +411 if +fusn + ) +surmode + | +SDL_COMPAT_FULLSCREEN +; + +412 if +hwsur + ) +surmode + | +SDL_COMPAT_HWSURFACE +; + +415 +sn + = + `SDL_COMPAT_SVideoMode +640, 480, 8, +surmode + ); + +416 i( +ic +-> +show_keybrd +) { + +417 +sn + = + `SDL_COMPAT_SVideoMode +640, 480+240, 8, +surmode + ); + +419 +sn + = + `SDL_COMPAT_SVideoMode +640, 480, 8, +surmode + ); + +422 if! +sn + ) + +424 + `tf +( "SDL video failed\n" ); + +425  +SDL_FALSE +; + +428 + `SDL_COMPAT_WM_SCti + +APP_NAME_FULL +, APP_NAME_FULL ); + +430  +i +=0; i<8; i++ ) + +432 +cours +[ +i +]. +r + = +i +[i*3 ]; + +433 +cours +[ +i ++8]. +r + = +i +[i*3 ]/2; + +434 +cours +[ +i +]. +g + = +i +[i*3+1]; + +435 +cours +[ +i ++8]. +g + = +i +[i*3+1]/2; + +436 +cours +[ +i +]. +b + = +i +[i*3+2]; + +437 +cours +[ +i ++8]. +b + = +i +[i*3+2]/2; + +440  +i +=0; i< +NUM_GUI_COLS +; i++ ) + +442 +cours +[ +i ++ +GPAL_FIRSTPEN +]. +r + = +sgl +[i*3 ]; + +443 +cours +[ +i ++ +GPAL_FIRSTPEN +]. +g + = +sgl +[i*3+1]; + +444 +cours +[ +i ++ +GPAL_FIRSTPEN +]. +b + = +sgl +[i*3+2]; + +447 +xt_gimgc + = +GPAL_FIRSTPEN ++ +NUM_GUI_COLS +; + +450  +i +=0; i< +NUM_GIMG +; i++ ) + +451 i(! + `guiimg_to_img +( +mgimg + + +i +, +gimgs + + i)) + +452  +SDL_FALSE +; + +454 + `SDL_COMPAT_SP + +sn +, +SDL_COMPAT_LOGPAL +| +SDL_COMPAT_PHYSPAL +, +cours +, 0, +xt_gimgc +); + +457  +i +=0; i<8*2; i++ ) + +458  +j +=0; j<8*2; j++ ) + +459 +qn +[( +j +<<8)| +i +] = (j<<24)|(j<<16)|(i<<8)|i; + +462 +edr + = +SDL_TRUE +; + +463 +eshus + = +SDL_TRUE +; + +466 +offt_t + = (240 - 226* +sn +-> +pch + + 80; + +468 + `u_t_dty + +ic + ); + +471  +SDL_TRUE +; + +472 + } +} + +474  + $shut_nd_sw8 + +mache + * +ic + ) + +477 + } +} + + @render_sw8.h + +22  +nd_beg_sw8 + +mache + * +ic + ); + +23  +nd_d_sw8 + +mache + * +ic + ); + +24  +nd_xtze_loc_sw8 + +mache + * +ic +,  +i + ); + +25  +nd_xtze__sw8 + +mache + * +ic +,  +i + ); + +26  +nd_xtze_sw8 + +mache + * +ic +,  +i + ); + +27  +nd_gimg_sw8 + +i +, +St32 + +xp +, St32 +yp + ); + +28  +nd_gimg_sw8 + +i +, +St32 + +xp +, St32 +yp +, St32 +ox +, St32 +oy +, St32 +w +, St32 +h + ); + +29  +nd_video_sw8 + +mache + * +ic +, +SDL_bo + +doubsize + ); + +30  +nd_r__sw8 + +x +,  +y +,  +w +,  +h + ); + +31 +SDL_bo + +nd_toggfusn_sw8 + +mache + * +ic + ); + +32  +e_nd_sw8 + +mache + * +ic + ); + +33 +SDL_bo + +_nd_sw8 + +mache + * +ic + ); + +34  +shut_nd_sw8 + +mache + * +ic + ); + + @snapshot.c + +23  + ~ + +24  + ~ + +25  + ~ + +27  + ~"syem.h +" + +28  + ~"6502.h +" + +29  + ~"v.h +" + +30  + ~"8912.h +" + +31  + ~"gui.h +" + +32  + ~"disk.h +" + +33  + ~"mڙ.h +" + +34  + ~"6551.h +" + +35  + ~"mache.h +" + +36  + ~"avi.h +" + +37  + ~"feq.h +" + +38  + ~"ma.h +" + +39  + ~"u.h +" + +40  + ~"joyick.h +" + +41  + ~".h +" + +42  + ~"msgbox.h +" + +44  +diskth +[]; + +46  + #MAX_BLOCK + (262144) + + ) + +47 * + gbuf +; + +48  + goffs + = 0; + +50  + #PUTU32 +( +v + +ok += + `putu32 +(ok, ( +Ut32 +)v) + + ) + +51  +SDL_bo + + $putu32 +( +SDL_bo + +lok +, +Ut32 + +v +) + +53 i(! +lok + +SDL_FALSE +; + +54 i(( +offs ++4> +MAX_BLOCK + +SDL_FALSE +; + +55 +buf +[ +offs +++] = ( +v +>>24)&0xff; + +56 +buf +[ +offs +++] = ( +v +>>16)&0xff; + +57 +buf +[ +offs +++] = ( +v +>>8)&0xff; + +58 +buf +[ +offs +++] = +v +&0xff; + +59  +SDL_TRUE +; + +60 + } +} + +62  + #PUTU16 +( +v + +ok += + `putu16 +(ok, ( +Ut16 +)v) + + ) + +63  +SDL_bo + + $putu16 +( +SDL_bo + +lok +, +Ut16 + +v +) + +65 i(! +lok + +SDL_FALSE +; + +66 i(( +offs ++2> +MAX_BLOCK + +SDL_FALSE +; + +67 +buf +[ +offs +++] = ( +v +>>8)&0xff; + +68 +buf +[ +offs +++] = +v +&0xff; + +69  +SDL_TRUE +; + +70 + } +} + +72  + #PUTU8 +( +v + +ok += + `putu8 +(ok, ( +Ut8 +)v) + + ) + +73  +SDL_bo + + $putu8 +( +SDL_bo + +lok +, +Ut8 + +v +) + +75 i(! +lok + +SDL_FALSE +; + +76 i( +offs + > +MAX_BLOCK + +SDL_FALSE +; + +77 +buf +[ +offs +++] = +v +&0xff; + +78  +SDL_TRUE +; + +79 + } +} + +81  + #PUTDATA +( +da +, +size + +ok += + `putda +(ok, da, size) + + ) + +82  +SDL_bo + + $putda +( +SDL_bo + +lok +, * +da +, +Ut32 + +size +) + +84 i(! +lok + +SDL_FALSE +; + +85 i(( +offs ++ +size +> +MAX_BLOCK + +SDL_FALSE +; + +86 + `memy +& +buf +[ +offs +], +da +, +size + ); + +87 +offs + + +size +; + +88  +SDL_TRUE +; + +89 + } +} + +91  + #PUTSTR +( +r + +ok += + `putr +(ok, s) + + ) + +92  +SDL_bo + + $putr +( +SDL_bo + +lok +, * +r +) + +94 i(! +lok + +SDL_FALSE +; + +95 +lok + = + `putu32 +(lok, () + ` +( +r +)+1); + +96  + `putda +( +lok +, (*) +r +, () + ` +(str)+1); + +97 + } +} + +99  + #WRITEBLOCK +( +ok += + `wreblock +(ok, +f +) + + ) + +100  +SDL_bo + + $wreblock +( +SDL_bo + +lok +, +FILE + * +f +) + +102 i(! +lok + +SDL_FALSE +; + +103 i( +offs + <8 +SDL_TRUE +; + +105 +buf +[4] = (( +offs +-8)>>24)&0xff; + +106 +buf +[5] = (( +offs +-8)>>16)&0xff; + +107 +buf +[6] = (( +offs +-8)>>8)&0xff; + +108 +buf +[7] = ( +offs +-8)&0xff; + +110 +lok + = ( + `fwre +( +buf +, +offs +, 1, +f +) == 1); + +111 +offs + = 0; + +112  +lok +; + +113 + } +} + +116  + #NEWBLOCK +( +id + +ok += + `wblock +(ok, id, +f +) + + ) + +117  +SDL_bo + + $wblock +( +SDL_bo + +lok +, * +id +, +FILE + * +f +) + +119 i(! +lok + +SDL_FALSE +; + +121 i(! + `wreblock +( +lok +, +f +) +SDL_FALSE +; + +124 + `memy +( +buf +, +id +, 4); + +125 +offs + = 8; + +126  +SDL_TRUE +; + +127 + } +} + +129  + #DATABLOCK +( +da +, +n + +ok + = + `dablock +(ok, da,, +f +) + + ) + +130  +SDL_bo + + $dablock +( +SDL_bo + +lok +, * +da +, +Ut32 + +n +, +FILE + * +f +) + +132 +Ut32 + +nbe + = + `_BE32 +( +n +); + +133 i(! +lok + +SDL_FALSE +; + +135 i( +n + =0 +SDL_TRUE +; + +137 i(! + `wreblock +( +lok +, +f +) +SDL_FALSE +; + +139 +lok + = ( + `fwre +("DATA", 4, 1, +f +) == 1); + +140 +lok + &( + `fwre +(& +nbe +, 4, 1, +f +) == 1); + +141 +lok + &( + `fwre +( +da +, +n +, 1, +f +) == 1); + +143 +offs + = 0; + +144  +lok +; + +145 + } +} + +147 +SDL_bo + + $ve_sh +( +mache + * +ic +, * +fame +) + +149 +SDL_bo + +ok + = +SDL_TRUE +; + +150  +m6502 + * +u + = & +ic +->cpu; + +151 +SDL_bo + +do_wd17xx + = +SDL_FALSE +; + +152  +i +, +j +; + +153 +FILE + * +f + = +NULL +; + +155 +buf + = + `mloc +( +MAX_BLOCK +); + +156 i(! +buf +) + +158 + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshot failed: out of memory (1)\n"); + +159  +SDL_FALSE +; + +162 +f + = + `fݒ +( +fame +, "wb"); + +163 i(! +f +) + +165 + `msgbox +( +ic +, +MSGBOX_OK +, "Unableo create snapshot file (2)"); + +166 + ` +( +buf +); + +167  +SDL_FALSE +; + +170 + `NEWBLOCK +("OSN\x00"); + +171 + `PUTU8 +( +ic +-> +ty +); + +172 + `PUTU32 +( +ic +-> +ovockmu +); + +173 + `PUTU32 +( +ic +-> +ovockshi +); + +174 + `PUTU16 +( +ic +-> +vsync +); + +175 + `PUTU8 +( +ic +-> +romdis +); + +176 + `PUTU8 +( +ic +-> +rom +); + +177 + `PUTU8 +( +ic +-> +vsynchack +); + +178 + `PUTU8 +( +ic +-> +drivy +); + +179 + `PUTU8 +( +ic +-> +turbo +); + +180 + `PUTU8 +( +ic +-> +vid_mode +); + +181 + `PUTU32 +( +ic +-> +keym +); + +182 + `DATABLOCK +( +ic +-> +mem +, oric-> +memsize +); + +184 + `NEWBLOCK +("TAP\x00"); + +185 + `PUTU8 +( +ic +-> +b +); + +186 + `PUTU8 +( +ic +-> +out +); + +187 + `PUTU8 +( +ic +-> +ry +); + +188 + `PUTU32 +( +ic +-> +n +); + +189 + `PUTU32 +( +ic +-> +offs +); + +190 + `PUTU32 +( +ic +-> +cou +); + +191 + `PUTU32 +( +ic +-> +time +); + +192 + `PUTU32 +( +ic +-> +dupbys +); + +193 + `PUTU32 +( +ic +-> +hdnd +); + +194 + `PUTU32 +( +ic +-> +day +); + +195 + `PUTU8 +( +ic +-> +m +); + +196 + `PUTU8 +( +ic +-> +turbo_foff +); + +197 + `PUTU8 +( +ic +-> +w +); + +198 + `PUTU32 +( +ic +-> +nڿwd +); + +199 + `PUTU32 +( +ic +-> +hd +); + +200 + `PUTU32 +( +ic +-> +turbo_syncack +); + +201 + `DATABLOCK +( +ic +-> +buf +, oric-> +n +); + +204 + `NEWBLOCK +("PCH\0x00"); + +205 + `PUTU32 +( +ic +-> +pch_fd_d_gme_pc +); + +206 + `PUTU32 +( +ic +-> +pch_fd_cve_gme_pc +); + +207 + `PUTU32 +( +ic +-> +pch_fd_e_gme_pc +); + +208 + `PUTU32 +( +ic +-> +pch_fd__gme_pc +); + +209 + `PUTU32 +( +ic +-> +pch_fd_gme_addr +); + +210 + `PUTU8 +( +ic +-> +pch_fd_avaab +); + +211 + `PUTU32 +( +ic +-> +pch__gsync_pc +); + +212 + `PUTU32 +( +ic +-> +pch__gsync_d_pc +); + +213 + `PUTU32 +( +ic +-> +pch__gsync_lo_pc +); + +214 + `PUTU32 +( +ic +-> +pch__adby_pc +); + +215 + `PUTU32 +( +ic +-> +pch__adby_d_pc +); + +216 + `PUTU32 +( +ic +-> +pch__adby_eby_addr +); + +217 + `PUTU32 +( +ic +-> +pch__adby_ezo_addr +); + +218 + `PUTU32 +( +ic +-> +pch__putby_pc +); + +219 + `PUTU32 +( +ic +-> +pch__putby_d_pc +); + +220 + `PUTU32 +( +ic +-> +pch__cve_d_pc +); + +221 + `PUTU32 +( +ic +-> +pch__e_d_pc +); + +222 + `PUTU32 +( +ic +-> +pch__wrd_pc +); + +223 + `PUTU32 +( +ic +-> +pch__wrd_d_pc +); + +225 + `PUTU8 +( +ic +-> +pch__adby_ty +); + +226 + `PUTU8 +( +ic +-> +pch__avaab +); + +227 + `PUTU8 +( +ic +-> +pch__ve_avaab +); + +230 + `NEWBLOCK +("CPU\x00"); + +231 + `PUTU32 +( +u +-> +cyes +); + +232 + `PUTU16 +( +u +-> +pc +); + +233 + `PUTU16 +( +u +-> +ϡpc +); + +234 + `PUTU16 +( +u +-> +lc +); + +235 + `PUTU16 +( +u +-> +lct +); + +236 + `PUTU8 +( +u +-> +nmi +); + +237 + `PUTU8 +( +u +-> +a +); + +238 + `PUTU8 +( +u +-> +x +); + +239 + `PUTU8 +( +u +-> +y +); + +240 + `PUTU8 +( +u +-> + +); + +241 + `PUTU8 +( +MAKEFLAGS +); + +242 + `PUTU8 +( +u +-> +q +); + +243 + `PUTU8 +( +u +-> +nmicou +); + +244 + `PUTU8 +( +u +-> +lc +); + +247 + `NEWBLOCK +("AY\x00\x00"); + +248 + `PUTU8 +( +ic +-> +ay +. +bmode +); + +249 + `PUTU8 +( +ic +-> +ay +. +eg +); + +250 + `PUTDATA +(& +ic +-> +ay +. +egs +[0], +NUM_AY_REGS +); + +251  +i +=0; i<8; i++) + +252 + `PUTU8 +( +ic +-> +ay +. +keyes +[ +i +]); + +253  +i +=0; i<3; i++) + +254 + `PUTU32 +( +ic +-> +ay +. +tڕ +[ +i +]); + +255 + `PUTU32 +( +ic +-> +ay +. +noir +); + +256 + `PUTU32 +( +ic +-> +ay +. +vr +); + +257  +i +=0; i<3; i++) + +259 + `PUTU16 +( +ic +-> +ay +. +teb +[ +i +]); + +260 + `PUTU16 +( +ic +-> +ay +. +noib +[ +i +]); + +261 + `PUTU16 +( +ic +-> +ay +. +v +[ +i +]); + +263 + `PUTU16 +( +ic +-> +ay +. +wout +); + +264  +i +=0; i<3; i++) + +265 + `PUTU32 +( +ic +-> +ay +. + +[ +i +]); + +266 + `PUTU32 +( +ic +-> +ay +. +n +); + +267 + `PUTU32 +( +ic +-> +ay +. +e +); + +268  +i +=0; i<3; i++) + +270 + `PUTU32 +( +ic +-> +ay +. +tڕos +[ +i +]); + +271 + `PUTU32 +( +ic +-> +ay +. +te +[ +i +]); + +272 + `PUTU32 +( +ic +-> +ay +. +sign +[ +i +]); + +273 + `PUTU32 +( +ic +-> +ay +. +out +[ +i +]); + +275 + `PUTU32 +( +ic +-> +ay +. +vpos +); + +276 + `PUTU32 +( +ic +-> +ay +. +cunoi +); + +277 + `PUTU32 +( +ic +-> +ay +. +dck +); + +278 + `PUTU32 +( +ic +-> +ay +. +keybday +); + +279 + `PUTU32 +( +ic +-> +ay +. +cukeyoffs +); + +282 + `NEWBLOCK +("VIA\x00"); + +283 + `PUTU8 +( +ic +-> +v +. +i +); + +284 + `PUTU8 +( +ic +-> +v +. +b +); + +285 + `PUTU8 +( +ic +-> +v +. +b +); + +286 + `PUTU8 +( +ic +-> +v +. +bl +); + +287 + `PUTU8 +( +ic +-> +v +. +a +); + +288 + `PUTU8 +( +ic +-> +v +. +a +); + +289 + `PUTU8 +( +ic +-> +v +. + +); + +290 + `PUTU8 +( +ic +-> +v +. +dd +); + +291 + `PUTU8 +( +ic +-> +v +. +ddrb +); + +292 + `PUTU8 +( +ic +-> +v +. +t1l_l +); + +293 + `PUTU8 +( +ic +-> +v +. +t1l_h +); + +294 + `PUTU16 +( +ic +-> +v +. +t1c +); + +295 + `PUTU8 +( +ic +-> +v +. +t2l_l +); + +296 + `PUTU8 +( +ic +-> +v +. +t2l_h +); + +297 + `PUTU16 +( +ic +-> +v +. +t2c +); + +298 + `PUTU8 +( +ic +-> +v +. + +); + +299 + `PUTU8 +( +ic +-> +v +. +a +); + +300 + `PUTU8 +( +ic +-> +v +. +p +); + +301 + `PUTU8 +( +ic +-> +v +. +r +); + +302 + `PUTU8 +( +ic +-> +v +. +1 +); + +303 + `PUTU8 +( +ic +-> +v +. +2 +); + +304 + `PUTU8 +( +ic +-> +v +. +cb1 +); + +305 + `PUTU8 +( +ic +-> +v +. +cb2 +); + +306 + `PUTU8 +( +ic +-> +v +. +cou +); + +307 + `PUTU8 +( +ic +-> +v +. +t1ld +); + +308 + `PUTU8 +( +ic +-> +v +. +t2ld +); + +309 + `PUTU16 +( +ic +-> +v +. +time +); + +310 + `PUTU8 +( +ic +-> +v +. +t1run +); + +311 + `PUTU8 +( +ic +-> +v +. +t2run +); + +312 + `PUTU8 +( +ic +-> +v +. +2pul +); + +313 + `PUTU8 +( +ic +-> +v +. +cb2pul +); + +314 + `PUTU8 +( +ic +-> +v +. +igg +); + +315 + `PUTU32 +( +ic +-> +v +. +qb +); + +318  +ic +-> +drivy +) + +320  +DRV_JASMIN +: + +321 + `NEWBLOCK +("JSM\x00"); + +322 + `PUTU8 +( +ic +-> +jasm +. +ay +); + +323 + `PUTU8 +( +ic +-> +jasm +. +romdis +); + +324 +do_wd17xx + = +SDL_TRUE +; + +327  +DRV_MICRODISC +: + +328 + `NEWBLOCK +("MDC\x00"); + +329 + `PUTU8 +( +ic +-> +md +. +us +); + +330 + `PUTU8 +( +ic +-> +md +. +q +); + +331 + `PUTU8 +( +ic +-> +md +. +drq +); + +332 + `PUTU8 +( +ic +-> +md +. +diskrom +); + +333 +do_wd17xx + = +SDL_TRUE +; + +336  +DRV_PRAVETZ +: + +338 +Ut8 + +tmp +[ +PRAV_TRACKS_PER_DISK +* +PRAV_RAW_TRACK_SIZE +*2]; + +339 + `NEWBLOCK +("PRV\x00"); + +340 + `PUTU8 +( +ic +-> +avz +. +ay +); + +341 + `PUTU8 +( +ic +-> +avz +. +romdis +); + +342 + `PUTU16 +( +ic +-> +avz +. +exnsi +); + +343 + `PUTU8 +( +ic +-> +wddisk +. +c_drive +); + +344 + `PUTU32 +( +ic +-> +wddisk +. +cut +); + +346  +i +=0; i<2; i++) + +348 + `PUTU8 +( +ic +-> +avz +. +drv +[ +i +]. +vume +); + +349 + `PUTU8 +( +ic +-> +avz +. +drv +[ +i +]. + +); + +350 + `PUTU8 +( +ic +-> +avz +. +drv +[ +i +]. +m_ +); + +351 + `PUTU8 +( +ic +-> +avz +. +drv +[ +i +]. +wre_ady +); + +352 + `PUTU16 +( +ic +-> +avz +. +drv +[ +i +]. +by +); + +353 + `PUTU16 +( +ic +-> +avz +. +drv +[ +i +]. +hf_ack +); + +354 + `PUTU8 +( +ic +-> +avz +. +drv +[ +i +]. +dty +); + +355 + `PUTU8 +( +ic +-> +avz +. +drv +[ +i +]. + +); + +360 + `memy +( +tmp +, & +ic +-> +avz +. +drv +[0]. +image +[0][0], +PRAV_TRACKS_PER_DISK +* +PRAV_RAW_TRACK_SIZE +); + +361 + `memy +(& +tmp +[ +PRAV_TRACKS_PER_DISK +* +PRAV_RAW_TRACK_SIZE +], & +ic +-> +avz +. +drv +[1]. +image +[0][0], PRAV_TRACKS_PER_DISK*PRAV_RAW_TRACK_SIZE); + +362 + `DATABLOCK +( +tmp +, +PRAV_TRACKS_PER_DISK +* +PRAV_RAW_TRACK_SIZE +*2); + +364  +i +=0; i<2; i++) + +366 i(( +ic +-> +avz +. +drv +[ +i +]. +pimg + = +NULL +) || + +367 ( +ic +-> +avz +. +drv +[ +i +]. +pimg +-> +wimage + = +NULL +)) + +370 + `NEWBLOCK +("PVD\x00"); + +371 + `PUTU16 +( +i +); + +372 + `PUTU32 +( +ic +-> +wddisk +. +disk +[ +i +]-> +wimag +); + +374 i(( +ic +-> +avz +. +drv +[ +i +]. +_r + = +NULL +) || + +375 ( +ic +-> +avz +. +drv +[ +i +]. +pimg + = +NULL +) || + +376 ( +ic +-> +avz +. +drv +[ +i +]. +pimg +-> +wimage + = +NULL +)) + +377 + `PUTU32 +(0xffffffff); + +379 + `PUTU32 +(( +Ut32 +)( +ic +-> +avz +. +drv +[ +i +]. +_r + - oric->avz.drv[i]. +pimg +-> +wimage +)); + +380 + `DATABLOCK +( +ic +-> +wddisk +. +disk +[ +i +]-> +wimage +, oric->wddisk.disk[i]-> +wimag +); + +385 if +do_wd17xx + ) + +387 + `NEWBLOCK +("WDD\x00"); + +388 + `PUTU8 +( +ic +-> +wddisk +. +r_us +); + +389 + `PUTU8 +( +ic +-> +wddisk +. +r_ack +); + +390 + `PUTU8 +( +ic +-> +wddisk +. +r_ +); + +391 + `PUTU8 +( +ic +-> +wddisk +. +r_da +); + +392 + `PUTU8 +( +ic +-> +wddisk +. +c_drive +); + +393 + `PUTU8 +( +ic +-> +wddisk +. +c_side +); + +394 + `PUTU8 +( +ic +-> +wddisk +. +c_ack +); + +395 + `PUTU8 +( +ic +-> +wddisk +. +c_ +); + +396 + `PUTU8 +( +ic +-> +wddisk +. +y +); + +397 + `PUTU8 +( +ic +-> +wddisk +. +ϡ__ +); + +398 + `PUTU32 +( +ic +-> +wddisk +. +cut +); + +399 + `PUTU32 +( +ic +-> +wddisk +. +cuoffs +); + +400 + `PUTU32 +( +ic +-> +wddisk +. +dayedt +); + +401 + `PUTU32 +( +ic +-> +wddisk +. +dayeddrq +); + +402 + `PUTU32 +( +ic +-> +wddisk +. +dius +); + +403 + `PUTU32 +( +ic +-> +wddisk +. +ddus +); + +404 + `PUTU32 +( +ic +-> +wddisk +. +c +); + +406  +i +=0; i<4; i++) + +408 if +ic +-> +wddisk +. +disk +[ +i +] ) + +410 + `NEWBLOCK +("DSK\x00"); + +411 + `PUTU16 +( +ic +-> +wddisk +. +disk +[ +i +]-> +drivum +); + +412 + `PUTU16 +( +ic +-> +wddisk +. +disk +[ +i +]-> +numacks +); + +413 + `PUTU16 +( +ic +-> +wddisk +. +disk +[ +i +]-> +numsides +); + +414 + `PUTU16 +( +ic +-> +wddisk +. +disk +[ +i +]-> +geomry +); + +415 + `PUTU16 +( +ic +-> +wddisk +. +disk +[ +i +]-> +chedack +); + +416 + `PUTU16 +( +ic +-> +wddisk +. +disk +[ +i +]-> +chedside +); + +417 + `PUTU32 +( +ic +-> +wddisk +. +disk +[ +i +]-> +wimag +); + +418 + `DATABLOCK +( +ic +-> +wddisk +. +disk +[ +i +]-> +wimage +, oric->wddisk.disk[i]-> +wimag +); + +423 i( +ic +-> +ty + = +MACH_TELESTRAT +) + +426 + `NEWBLOCK +("BNK\x00"); + +427  +i +=0; i<8; i++) + +428 + `PUTU8 +( +ic +-> +_bk +[ +i +]. +ty +); + +429 + `PUTU8 +( +ic +-> +_cubk +); + +432 + `NEWBLOCK +("ACI\x00"); + +433 + `PUTDATA +(& +ic +-> +_ac +. +gs +[0], +ACIA_LAST +); + +436 + `NEWBLOCK +("TVA\x00"); + +437 + `PUTU8 +( +ic +-> +_v +. +i +); + +438 + `PUTU8 +( +ic +-> +_v +. +b +); + +439 + `PUTU8 +( +ic +-> +_v +. +b +); + +440 + `PUTU8 +( +ic +-> +_v +. +bl +); + +441 + `PUTU8 +( +ic +-> +_v +. +a +); + +442 + `PUTU8 +( +ic +-> +_v +. +a +); + +443 + `PUTU8 +( +ic +-> +_v +. + +); + +444 + `PUTU8 +( +ic +-> +_v +. +dd +); + +445 + `PUTU8 +( +ic +-> +_v +. +ddrb +); + +446 + `PUTU8 +( +ic +-> +_v +. +t1l_l +); + +447 + `PUTU8 +( +ic +-> +_v +. +t1l_h +); + +448 + `PUTU16 +( +ic +-> +_v +. +t1c +); + +449 + `PUTU8 +( +ic +-> +_v +. +t2l_l +); + +450 + `PUTU8 +( +ic +-> +_v +. +t2l_h +); + +451 + `PUTU16 +( +ic +-> +_v +. +t2c +); + +452 + `PUTU8 +( +ic +-> +_v +. + +); + +453 + `PUTU8 +( +ic +-> +_v +. +a +); + +454 + `PUTU8 +( +ic +-> +_v +. +p +); + +455 + `PUTU8 +( +ic +-> +_v +. +r +); + +456 + `PUTU8 +( +ic +-> +_v +. +1 +); + +457 + `PUTU8 +( +ic +-> +_v +. +2 +); + +458 + `PUTU8 +( +ic +-> +_v +. +cb1 +); + +459 + `PUTU8 +( +ic +-> +_v +. +cb2 +); + +460 + `PUTU8 +( +ic +-> +_v +. +cou +); + +461 + `PUTU8 +( +ic +-> +_v +. +t1ld +); + +462 + `PUTU8 +( +ic +-> +_v +. +t2ld +); + +463 + `PUTU16 +( +ic +-> +_v +. +time +); + +464 + `PUTU8 +( +ic +-> +_v +. +t1run +); + +465 + `PUTU8 +( +ic +-> +_v +. +t2run +); + +466 + `PUTU8 +( +ic +-> +_v +. +2pul +); + +467 + `PUTU8 +( +ic +-> +_v +. +cb2pul +); + +468 + `PUTU8 +( +ic +-> +_v +. +igg +); + +469 + `PUTU32 +( +ic +-> +_v +. +qb +); + +473 i( +ic +-> +romsyms +. +numsyms +) + +475 + `NEWBLOCK +("SYR\x00"); + +476  +i +=0; i< +ic +-> +romsyms +. +numsyms +; i++) + +478 + `PUTSTR +( +ic +-> +romsyms +. +syms +[ +i +]. +me +); + +479 + `PUTU16 +( +ic +-> +romsyms +. +syms +[ +i +]. +addr +); + +480 + `PUTU16 +( +ic +-> +romsyms +. +syms +[ +i +]. +ags +); + +484 i( +ic +-> +ursyms +. +numsyms +) + +486 + `NEWBLOCK +("SYU\x00"); + +487  +i +=0; i< +ic +-> +ursyms +. +numsyms +; i++) + +489 + `PUTSTR +( +ic +-> +ursyms +. +syms +[ +i +]. +me +); + +490 + `PUTU16 +( +ic +-> +ursyms +. +syms +[ +i +]. +addr +); + +491 + `PUTU16 +( +ic +-> +ursyms +. +syms +[ +i +]. +ags +); + +495 i( +ic +-> +ty + = +MACH_TELESTRAT +) + +497  +j +=0; j<8; j++) + +499 i( +ic +-> +_bksyms +[ +j +]. +numsyms +) + +501  +me +[8]; + +502 + `rtf +( +me +, "SY%d%c", +j +, 0); + +503 + `NEWBLOCK +( +me +); + +504  +i +=0; i< +ic +-> +_bksyms +[ +j +]. +numsyms +; i++) + +506 + `PUTSTR +( +ic +-> +_bksyms +[ +j +]. +syms +[ +i +]. +me +); + +507 + `PUTU16 +( +ic +-> +romsyms +. +syms +[ +i +]. +addr +); + +508 + `PUTU16 +( +ic +-> +romsyms +. +syms +[ +i +]. +ags +); + +515 i(( +u +-> +ybp +|| (u-> +ymbp +)) + +517 + `NEWBLOCK +("BKP\x00"); + +518  +i +=0; i<16; i++) + +519 + `PUTU32 +( +u +-> +bakpots +[ +i +]); + +520  +i +=0; i<16; i++) + +522 + `PUTU8 +( +u +-> +membakpots +[ +i +]. +ags +); + +523 + `PUTU8 +( +u +-> +membakpots +[ +i +]. +ϡv +); + +524 + `PUTU16 +( +u +-> +membakpots +[ +i +]. +addr +); + +528 + `WRITEBLOCK +(); + +529 + `fo +( +f +); + +530 + ` +( +buf +); + +532 i(! +ok +) + +533 + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshot failed! (3)"); + +535  +ok +; + +536 + } +} + +540  + sblockhd + + +542  + mid +[4]; + +543  + mofft +; + +544  + msize +; + +545 * + mbuf +; + +546  +blockhd + * + mdablock +; + +547  + moffs +; + +550  + gnumhdrs + = 0; + +551  +blockhd + * + gbkh + = +NULL +; + +553  +SDL_bo + + $ghds +( +mache + * +ic +, +FILE + * +f +) + +555  +i +; + +556  +size +, +offt +, +fesize +; + +557  +hdr +[8]; + +559 + `fek +( +f +, 0, +SEEK_END +); + +560 +fesize + = () + `l +( +f +); + +561 + `fek +( +f +, 0, +SEEK_SET +); + +565 +offt + = 0; + +566 +numhdrs + = 0; + +567  +offt + < +fesize +) + +569 i( + `d +( +hdr +, 8, 1, +f +) != 1) + +571 + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshotoad failed: Readrror (4)"); + +572 +numhdrs + = 0; + +573  +SDL_FALSE +; + +576 +size + = ( +hdr +[4]<<24)|(hdr[5]<<16)|(hdr[6]<<8)|hdr[7]; + +577 i(( +size + =0|| (( +offt ++size> +fesize +)) + +579 + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshotoad failed: Invalid file structure (5)"); + +580 +numhdrs + = 0; + +581  +SDL_FALSE +; + +584 +numhdrs +++; + +585 + `fek +( +f +, +size +, +SEEK_CUR +); + +586 +offt + + +size ++8; + +590 +bkh + = ( +blockhd + *) + `mloc +( +numhdrs +*(blockheader)); + +591 i(! +bkh +) + +593 + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshotoad failed: Out of memory (6)"); + +594 +numhdrs + = 0; + +595  +SDL_FALSE +; + +597 + `memt +( +bkh +, 0, +numhdrs +*( +blockhd +)); + +600 + `fek +( +f +, 0, +SEEK_SET +); + +601 +offt + = 0; + +602 +i + = 0; + +603  +offt + < +fesize +) + +605 i( + `d +( +hdr +, 8, 1, +f +) != 1) + +607 + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshotoad failed: Readrror (7)"); + +608 + ` +( +bkh +); + +609 +bkh + = +NULL +; + +610 +numhdrs + = 0; + +611  +SDL_FALSE +; + +614 +size + = ( +hdr +[4]<<24)|(hdr[5]<<16)|(hdr[6]<<8)|hdr[7]; + +615 i(( +size + =0|| (( +offt ++size> +fesize +)) + +617 + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshotoad failed: Invalid file structure (8)"); + +618 + ` +( +bkh +); + +619 +bkh + = +NULL +; + +620 +numhdrs + = 0; + +621  +SDL_FALSE +; + +623 +offt ++=8; + +625 + `memy +( +bkh +[ +i +]. +id +, +hdr +, 4); + +626 +bkh +[ +i +]. +offt + = offset; + +627 +bkh +[ +i +]. +size + = size; + +630 i(( +i +>0&& ( + `memcmp +( +bkh +[i]. +id +, "DATA", 4)==0)) + +632 +bkh +[ +i +-1]. +dablock + = &bkh[i]; + +635 + `fek +( +f +, +size +, +SEEK_CUR +); + +636 +offt + + +size +; + +637 +i +++; + +640  +SDL_TRUE +; + +641 + } +} + +643  + $_block +( +blockhd + * +blk +) + +645 i((! +blk +)||(!blk-> +buf +)) ; + +646 + ` +( +blk +-> +buf +); + +647 +blk +-> +buf + = +NULL +; + +648 + } +} + +650  + $_blockhds +() + +652  +i +; + +654 i(! +bkh +) ; + +656  +i +=0; i< +numhdrs +; i++) + +658 i( +bkh +[ +i +]. +buf + + ` +(bkh[i].buf); + +660 + ` +( +bkh +); + +661 + } +} + +663  +blockhd + * + $ld_block +( +mache + * +ic +, * +id +, +FILE + * +f +, +SDL_bo + +qued +,  +exedsize +, SDL_bo +dequed +) + +665  +i +; + +667  +i +=0; i< +numhdrs +; i++) + +669 i( + `memcmp +( +bkh +[ +i +]. +id +, id, 4) == 0) + +673 i( +i +== +numhdrs +) + +676 i( +qued + + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshotoad failed: Invalid file (9)"); + +677  +NULL +; + +680 i(( +dequed +&& ( +bkh +[ +i +]. +dablock + = +NULL +)) + +682 i( +qued + + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshotoad failed: Invalid file (10)"); + +683  +NULL +; + +686 i(( +exedsize + !-1&& ( +bkh +[ +i +]. +size + !=xpectedsize)) + +689 i( +qued + + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshotoad failed: Invalid file (11)"); + +690  +NULL +; + +694 i( +bkh +[ +i +]. +buf +) + +696 +bkh +[ +i +]. +offs + = 0; + +697  & +bkh +[ +i +]; + +700 +bkh +[ +i +]. +buf + = + `mloc +(bkh[i]. +size +); + +701 i(! +bkh +[ +i +]. +buf +) + +703 i( +qued + + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshotoad failed: Out of memory (12)"); + +704  +NULL +; + +707 + `fek +( +f +, +bkh +[ +i +]. +offt +, +SEEK_SET +); + +708 i( + `d +( +bkh +[ +i +]. +buf +, bkh[i]. +size +, 1, +f +) != 1) + +710 i( +qued + + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshotoad failed: Readrror (13)"); + +711  +NULL +; + +714 +bkh +[ +i +]. +offs + = 0; + +715  & +bkh +[ +i +]; + +716 + } +} + +718  +SDL_bo + + $ad_block +( +mache + * +ic +,  +blockhd + * +blk +, +FILE + * +f +, +SDL_bo + +qued +, * +debuf +) + +720 i(! +blk +) + +722 i( +qued + + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshotoad failed: Internalrror (14)"); + +723  +SDL_FALSE +; + +726 i( +blk +-> +buf +) + +728 + `memy +( +debuf +, +blk +-> +buf +, blk-> +size +); + +729  +SDL_TRUE +; + +732 + `fek +( +f +, +blk +-> +offt +, +SEEK_SET +); + +733 i( + `d +( +debuf +, +blk +-> +size +, 1, +f +) != 1) + +735 i( +qued + + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshotoad failed: Readrror (15)"); + +736  +SDL_FALSE +; + +739  +SDL_TRUE +; + +740 + } +} + +742  +Ut32 + + $gu32 +( +blockhd + * +blk +) + +744 +Ut32 + +v + = ( +blk +-> +buf +[blk-> +offs +]<<24)|(blk->buf[blk->offs+1]<<16)|(blk->buf[blk->offs+2]<<8)|blk->buf[blk->offs+3]; + +745 +blk +-> +offs ++=4; + +746  +v +; + +747 + } +} + +749  +St32 + + $gs32 +( +blockhd + * +blk +) + +751 +St32 + +v + = ( +blk +-> +buf +[blk-> +offs +]<<24)|(blk->buf[blk->offs+1]<<16)|(blk->buf[blk->offs+2]<<8)|blk->buf[blk->offs+3]; + +752 +blk +-> +offs ++=4; + +753  +v +; + +754 + } +} + +756  +Ut16 + + $gu16 +( +blockhd + * +blk +) + +758 +Ut16 + +v + = ( +blk +-> +buf +[blk-> +offs +]<<8)|blk->buf[blk->offs+1]; + +759 +blk +-> +offs ++=2; + +760  +v +; + +761 + } +} + +763  +St16 + + $gs16 +( +blockhd + * +blk +) + +765 +St16 + +v + = ( +blk +-> +buf +[blk-> +offs +]<<8)|blk->buf[blk->offs+1]; + +766 +blk +-> +offs ++=2; + +767  +v +; + +768 + } +} + +770  +Ut8 + + $gu8 +( +blockhd + * +blk +) + +772  +blk +-> +buf +[blk-> +offs +++]; + +773 + } +} + +775  + $gda +( +blockhd + * +blk +, * +de +,  +size +) + +777 + `memy +( +de +, & +blk +-> +buf +[blk-> +offs +], +size +); + +778 +blk +-> +offs + + +size +; + +779 + } +} + +781 +SDL_bo + + $ld_sh +( +mache + * +ic +, * +fame +) + +783  +m6502 + * +u + = & +ic +->cpu; + +784  +i +; + +785 +SDL_bo + +do_wd17xx + = +SDL_FALSE +, +back2m + = +ic +-> +emu_mode + = +EM_DEBUG +; + +786  +ty +, +drivy +; + +787 +FILE + * +f + = +NULL +; + +788  +blockhd + * +blk + = +NULL +; + +790 +f + = + `fݒ +( +fame +, "rb"); + +791 i(! +f +) + +793 + `msgbox +( +ic +, +MSGBOX_OK +, "Unableo open snapshot file (16)"); + +794  +SDL_FALSE +; + +797 if(! + `ghds +( +ic +, +f +)) + +799 + `fo +( +f +); + +800  +SDL_FALSE +; + +804 +blk + = + `ld_block +( +ic +, "OSN\x00", +f +, +SDL_TRUE +, 21, SDL_TRUE); + +805 i(! +blk +) + +807 + `_blockhds +(); + +808 + `fo +( +f +); + +809  +SDL_FALSE +; + +813 +ty + = +blk +-> +buf +[0]; + +814 +drivy + = +blk +-> +buf +[14]; + +816 i( +ty + > +MACH_LAST +) + +818 + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshotoad failed: Invalid file (17)"); + +819 + `_blockhds +(); + +820 + `fo +( +f +); + +821  +SDL_FALSE +; + +824 + `swmach +( +ic +, +NULL +, ( +drivy +<<16)| +ty +); + +827 if(( +ic +-> +drivy + != drivetype) || + +828 ( +ic +-> +memsize + ! +blk +-> +dablock +-> +size +)) + +830 + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshotoad failed: Invalid file (18)"); + +831 + `_blockhds +(); + +832 + `fo +( +f +); + +833 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +834  +SDL_FALSE +; + +838 i(! + `ad_block +( +ic +, +blk +-> +dablock +, +f +, +SDL_TRUE +, oric-> +mem +)) + +840 + `_blockhds +(); + +841 + `fo +( +f +); + +842 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +843  +SDL_FALSE +; + +847 + `r_tches + +ic + ); + +848 i( +ic +-> +buf +) + +850 + ` +( +ic +-> +buf +); + +851 +ic +-> +buf + = +NULL +; + +852 +ic +-> +n + = 0; + +855 +blk +-> +offs + = 1; + +856 +ic +-> +ovockmu + = + `gu32 +( +blk +); + +857 +ic +-> +ovockshi + = + `gu32 +( +blk +); + +858 +ic +-> +vsync + = + `gu16 +( +blk +); + +859 +ic +-> +romdis + = + `gu8 + ( +blk +); + +860 +ic +-> +rom + = + `gu8 + ( +blk +); + +861 +ic +-> +vsynchack + = + `gu8 + ( +blk +); + +862 +blk +-> +offs +++; + +863 +ic +-> +turbo + = + `gu8 + ( +blk +); + +864 +ic +-> +vid_mode + = + `gu8 + ( +blk +); + +865 +ic +-> +keym + = + `gu32 +( +blk +); + +868 + `_block +( +blk +); + +870 +ic +-> +vid_eq + = oric-> +vid_mode +&2; + +871 if +ic +-> +vid_mode + & 4 ) + +873 +ic +-> +vid_addr + = oric-> +vidbas +[0]; + +874 +ic +-> +vid_ch_ba + = &ic-> +mem +[ic-> +vidbas +[1]]; + +876 +ic +-> +vid_addr + = oric-> +vidbas +[2]; + +877 +ic +-> +vid_ch_ba + = &ic-> +mem +[ic-> +vidbas +[3]]; + +881 +blk + = + `ld_block +( +ic +, "CPU\x00", +f +, +SDL_TRUE +, 21, +SDL_FALSE +); + +882 i(! +blk +) + +884 + `_blockhds +(); + +885 + `fo +( +f +); + +886 + `tmutoggs + +ic + ); + +887 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +888  +SDL_FALSE +; + +891 +u +-> +cyes + = + `gu32 +( +blk +); + +892 +u +-> +pc + = + `gu16 +( +blk +); + +893 +u +-> +ϡpc + = + `gu16 +( +blk +); + +894 +u +-> +lc + = + `gu16 +( +blk +); + +895 +u +-> +lct + = + `gu16 +( +blk +); + +896 +u +-> +nmi + = + `gu8 + ( +blk +); + +897 +u +-> +a + = + `gu8 + ( +blk +); + +898 +u +-> +x + = + `gu8 + ( +blk +); + +899 +u +-> +y + = + `gu8 + ( +blk +); + +900 +u +-> + + = + `gu8 + ( +blk +); + +901 +i + = + `gu8 + ( +blk +); + +902 + `SETFLAGS +( +i +); + +903 +u +-> +q + = + `gu8 + ( +blk +); + +904 +u +-> +nmicou + = + `gu8 + ( +blk +); + +905 +u +-> +lc + = + `gu8 + ( +blk +); + +908 + `_block +( +blk +); + +911 +blk + = + `ld_block +( +ic +, "AY\x00\x00", +f +, +SDL_TRUE +, 153, +SDL_FALSE +); + +912 i(! +blk +) + +914 + `_blockhds +(); + +915 + `fo +( +f +); + +916 + `tmutoggs + +ic + ); + +917 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +918  +SDL_FALSE +; + +921 +ic +-> +ay +. +bmode + = + `gu8 +( +blk +); + +922 +ic +-> +ay +. +eg + = + `gu8 +( +blk +); + +923 + `gda +( +blk +, & +ic +-> +ay +. +egs +[0], +NUM_AY_REGS +); + +924 + `memy +(& +ic +-> +ay +. +gs +[0], &ic->ay. +egs +[0], +NUM_AY_REGS +); + +925  +i +=0; i<8; i++) + +926 +ic +-> +ay +. +keyes +[ +i +] = + `gu8 +( +blk +); + +927  +i +=0; i<3; i++) + +928 +ic +-> +ay +. +tڕ +[ +i +] = + `gu32 +( +blk +); + +929 +ic +-> +ay +. +noir + = + `gu32 +( +blk +); + +930 +ic +-> +ay +. +vr + = + `gu32 +( +blk +); + +931  +i +=0; i<3; i++) + +933 +ic +-> +ay +. +teb +[ +i +] = + `gu16 +( +blk +); + +934 +ic +-> +ay +. +noib +[ +i +] = + `gu16 +( +blk +); + +935 +ic +-> +ay +. +v +[ +i +] = + `gu16 +( +blk +); + +937 +ic +-> +ay +. +wout + = + `gu16 +( +blk +); + +938  +i +=0; i<3; i++) + +939 +ic +-> +ay +. + +[ +i +] = + `gu32 +( +blk +); + +940 +ic +-> +ay +. +n + = + `gu32 +( +blk +); + +941 +ic +-> +ay +. +e + = + `gu32 +( +blk +); + +942  +i +=0; i<3; i++) + +944 +ic +-> +ay +. +tڕos +[ +i +] = + `gu32 +( +blk +); + +945 +ic +-> +ay +. +te +[ +i +] = + `gu32 +( +blk +); + +946 +ic +-> +ay +. +sign +[ +i +] = + `gu32 +( +blk +); + +947 +ic +-> +ay +. +out +[ +i +] = + `gu32 +( +blk +); + +949 +ic +-> +ay +. +vpos + = + `gu32 +( +blk +); + +950 +ic +-> +ay +. +cunoi + = + `gu32 +( +blk +); + +951 +ic +-> +ay +. +dck + = + `gu32 +( +blk +); + +952 +ic +-> +ay +. +keybday + = + `gu32 +( +blk +); + +953 +ic +-> +ay +. +cukeyoffs + = + `gu32 +( +blk +); + +956 + `_block +( +blk +); + +959 +blk + = + `ld_block +( +ic +, "VIA\x00", +f +, +SDL_TRUE +, 39, +SDL_FALSE +); + +960 i(! +blk +) + +962 + `_blockhds +(); + +963 + `fo +( +f +); + +964 + `tmutoggs + +ic + ); + +965 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +966  +SDL_FALSE +; + +969 +ic +-> +v +. +i + = + `gu8 + ( +blk +); + +970 +ic +-> +v +. +b + = + `gu8 + ( +blk +); + +971 +ic +-> +v +. +b + = + `gu8 + ( +blk +); + +972 +ic +-> +v +. +bl + = + `gu8 + ( +blk +); + +973 +ic +-> +v +. +a + = + `gu8 + ( +blk +); + +974 +ic +-> +v +. +a + = + `gu8 + ( +blk +); + +975 +ic +-> +v +. + + = + `gu8 + ( +blk +); + +976 +ic +-> +v +. +dd + = + `gu8 + ( +blk +); + +977 +ic +-> +v +. +ddrb + = + `gu8 + ( +blk +); + +978 +ic +-> +v +. +t1l_l + = + `gu8 + ( +blk +); + +979 +ic +-> +v +. +t1l_h + = + `gu8 + ( +blk +); + +980 +ic +-> +v +. +t1c + = + `gu16 +( +blk +); + +981 +ic +-> +v +. +t2l_l + = + `gu8 + ( +blk +); + +982 +ic +-> +v +. +t2l_h + = + `gu8 + ( +blk +); + +983 +ic +-> +v +. +t2c + = + `gu16 +( +blk +); + +984 +ic +-> +v +. + + = + `gu8 + ( +blk +); + +985 +ic +-> +v +. +a + = + `gu8 + ( +blk +); + +986 +ic +-> +v +. +p + = + `gu8 + ( +blk +); + +987 +ic +-> +v +. +r + = + `gu8 + ( +blk +); + +988 +ic +-> +v +. +1 + = + `gu8 + ( +blk +); + +989 +ic +-> +v +. +2 + = + `gu8 + ( +blk +); + +990 +ic +-> +v +. +cb1 + = + `gu8 + ( +blk +); + +991 +ic +-> +v +. +cb2 + = + `gu8 + ( +blk +); + +992 +ic +-> +v +. +cou + = + `gu8 + ( +blk +); + +993 +ic +-> +v +. +t1ld + = + `gu8 + ( +blk +); + +994 +ic +-> +v +. +t2ld + = + `gu8 + ( +blk +); + +995 +ic +-> +v +. +time + = + `gu16 +( +blk +); + +996 +ic +-> +v +. +t1run + = + `gu8 + ( +blk +); + +997 +ic +-> +v +. +t2run + = + `gu8 + ( +blk +); + +998 +ic +-> +v +. +2pul + = + `gu8 + ( +blk +); + +999 +ic +-> +v +. +cb2pul + = + `gu8 + ( +blk +); + +1000 +ic +-> +v +. +igg + + `gu8 + ( +blk +); + +1001 +ic +-> +v +. +qb + = + `gu32 +( +blk +); + +1004 + `_block +( +blk +); + +1007 +blk + = + `ld_block +( +ic +, "TAP\x00", +f +, +SDL_TRUE +, 46, +SDL_FALSE +); + +1008 i(! +blk +) + +1010 + `_blockhds +(); + +1011 + `fo +( +f +); + +1012 + `tmutoggs + +ic + ); + +1013 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +1014  +SDL_FALSE +; + +1017 +ic +-> +b + = + `gu8 + ( +blk +); + +1018 +ic +-> +out + = + `gu8 + ( +blk +); + +1019 +ic +-> +ry + = + `gu8 + ( +blk +); + +1020 +ic +-> +n + = + `gu32 +( +blk +); + +1021 +ic +-> +offs + = + `gu32 +( +blk +); + +1022 +ic +-> +cou + = + `gu32 +( +blk +); + +1023 +ic +-> +time + = + `gu32 +( +blk +); + +1024 +ic +-> +dupbys + + `gu32 +( +blk +); + +1025 +ic +-> +hdnd + = + `gu32 +( +blk +); + +1026 +ic +-> +day + = + `gu32 +( +blk +); + +1027 +ic +-> +m + = + `gu8 + ( +blk +); + +1028 +ic +-> +turbo_foff + + `gu8 +( +blk +); + +1029 +ic +-> +w + = + `gu8 + ( +blk +); + +1030 +ic +-> +nڿwd + = + `gu32 +( +blk +); + +1031 +ic +-> +hd + = + `gu32 +( +blk +); + +1032 +ic +-> +turbo_syncack + = + `gu32 +( +blk +); + +1034 i(! +blk +-> +dablock +) + +1036 +ic +-> +n + = 0; + +1037 +ic +-> +offs + = 0; + +1041 +ic +-> +buf + = + `mloc +( +blk +-> +dablock +-> +size +); + +1042 i(! +ic +-> +buf +) + +1044 + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshotoad failed: Out of memory (19)"); + +1045 + `_blockhds +(); + +1046 + `fo +( +f +); + +1047 + `tmutoggs + +ic + ); + +1048 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +1049  +SDL_FALSE +; + +1052 i(! + `ad_block +( +ic +, +blk +-> +dablock +, +f +, +SDL_TRUE +, oric-> +buf +)) + +1054 + `_blockhds +(); + +1055 + `fo +( +f +); + +1056 + `tmutoggs + +ic + ); + +1057 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +1058  +SDL_FALSE +; + +1063 + `_block +( +blk +); + +1066 i(( +blk + = + `ld_block +( +ic +, "PCH\x00", +f +, +SDL_FALSE +, 76, SDL_FALSE))) + +1068 +ic +-> +pch_fd_d_gme_pc + = + `gu32 +( +blk +); + +1069 +ic +-> +pch_fd_cve_gme_pc + = + `gu32 +( +blk +); + +1070 +ic +-> +pch_fd_e_gme_pc + = + `gu32 +( +blk +); + +1071 +ic +-> +pch_fd__gme_pc + = + `gu32 +( +blk +); + +1072 +ic +-> +pch_fd_gme_addr + = + `gu32 +( +blk +); + +1073 +ic +-> +pch_fd_avaab + = + `gu8 +( +blk +); + +1074 +ic +-> +pch__gsync_pc + = + `gu32 +( +blk +); + +1075 +ic +-> +pch__gsync_d_pc + = + `gu32 +( +blk +); + +1076 +ic +-> +pch__gsync_lo_pc + = + `gu32 +( +blk +); + +1077 +ic +-> +pch__adby_pc + = + `gu32 +( +blk +); + +1078 +ic +-> +pch__adby_d_pc + = + `gu32 +( +blk +); + +1079 +ic +-> +pch__adby_eby_addr + = + `gu32 +( +blk +); + +1080 +ic +-> +pch__adby_ezo_addr + = + `gu32 +( +blk +); + +1081 +ic +-> +pch__putby_pc + = + `gu32 +( +blk +); + +1082 +ic +-> +pch__putby_d_pc + = + `gu32 +( +blk +); + +1083 +ic +-> +pch__cve_d_pc + = + `gu32 +( +blk +); + +1084 +ic +-> +pch__e_d_pc + = + `gu32 +( +blk +); + +1085 +ic +-> +pch__wrd_pc + = + `gu32 +( +blk +); + +1086 +ic +-> +pch__wrd_d_pc + = + `gu32 +( +blk +); + +1087 +ic +-> +pch__adby_ty + = + `gu8 + ( +blk +); + +1088 +ic +-> +pch__avaab + = + `gu8 + ( +blk +); + +1089 +ic +-> +pch__ve_avaab + = + `gu8 + ( +blk +); + +1092 + `_block +( +blk +); + +1095  +ic +-> +drivy +) + +1097  +DRV_JASMIN +: + +1099 +blk + = + `ld_block +( +ic +, "JSM\x00", +f +, +SDL_TRUE +, 2, +SDL_FALSE +); + +1100 i(! +blk +) + +1102 + `_blockhds +(); + +1103 + `fo +( +f +); + +1104 + `tmutoggs + +ic + ); + +1105 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +1106  +SDL_FALSE +; + +1109 +ic +-> +jasm +. +ay + = + `gu8 +( +blk +); + +1110 +ic +-> +jasm +. +romdis + = + `gu8 +( +blk +); + +1113 + `_block +( +blk +); + +1115 +do_wd17xx + = +SDL_TRUE +; + +1118  +DRV_MICRODISC +: + +1120 +blk + = + `ld_block +( +ic +, "MDC\x00", +f +, +SDL_TRUE +, 4, +SDL_FALSE +); + +1121 i(! +blk +) + +1123 + `_blockhds +(); + +1124 + `fo +( +f +); + +1125 + `tmutoggs + +ic + ); + +1126 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +1127  +SDL_FALSE +; + +1130 +ic +-> +md +. +us + = + `gu8 +( +blk +); + +1131 +ic +-> +md +. +q + = + `gu8 +( +blk +); + +1132 +ic +-> +md +. +drq + = + `gu8 +( +blk +); + +1133 +ic +-> +md +. +diskrom + = + `gu8 +( +blk +); + +1136 + `_block +( +blk +); + +1138 +do_wd17xx + = +SDL_TRUE +; + +1141  +DRV_PRAVETZ +: + +1143 +Ut8 + +tmp +[ +PRAV_TRACKS_PER_DISK +* +PRAV_RAW_TRACK_SIZE +*2]; + +1144 +Ut32 + +offs +; + +1147 +blk + = + `ld_block +( +ic +, "PRV\x00", +f +, +SDL_TRUE +, 9+2*10, SDL_TRUE); + +1148 i(! +blk +) + +1150 + `_blockhds +(); + +1151 + `fo +( +f +); + +1152 + `tmutoggs + +ic + ); + +1153 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +1154  +SDL_FALSE +; + +1157 +ic +-> +avz +. +ay + = + `gu8 +( +blk +); + +1158 +ic +-> +avz +. +romdis + = + `gu8 +( +blk +); + +1159 +ic +-> +avz +. +exnsi + = + `gu16 +( +blk +); + +1160 +ic +-> +wddisk +. +c_drive + = + `gu8 +( +blk +); + +1161 +ic +-> +wddisk +. +cut + = + `gu32 +( +blk +); + +1163  +i +=0; i<2; i++) + +1165 +ic +-> +avz +. +drv +[ +i +]. +vume + = + `gu8 +( +blk +); + +1166 +ic +-> +avz +. +drv +[ +i +]. + + = + `gu8 +( +blk +); + +1167 +ic +-> +avz +. +drv +[ +i +]. +m_ + = + `gu8 +( +blk +); + +1168 +ic +-> +avz +. +drv +[ +i +]. +wre_ady + = + `gu8 +( +blk +); + +1169 +ic +-> +avz +. +drv +[ +i +]. +by + = + `gu16 +( +blk +); + +1170 +ic +-> +avz +. +drv +[ +i +]. +hf_ack + = + `gu16 +( +blk +); + +1171 +ic +-> +avz +. +drv +[ +i +]. +dty + = + `gu8 +( +blk +); + +1172 +ic +-> +avz +. +drv +[ +i +]. + + = + `gu8 +( +blk +); + +1175 i(! + `ad_block +( +ic +, +blk +-> +dablock +, +f +, +SDL_TRUE +, +tmp +)) + +1177 + `_blockhds +(); + +1178 + `fo +( +f +); + +1179 + `tmutoggs + +ic + ); + +1180 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +1181  +SDL_FALSE +; + +1184 + `memy +(& +ic +-> +avz +. +drv +[0]. +image +[0][0], +tmp +, +PRAV_TRACKS_PER_DISK +* +PRAV_RAW_TRACK_SIZE +); + +1185 + `memy +(& +ic +-> +avz +. +drv +[1]. +image +[0][0], & +tmp +[ +PRAV_TRACKS_PER_DISK +* +PRAV_RAW_TRACK_SIZE +], PRAV_TRACKS_PER_DISK*PRAV_RAW_TRACK_SIZE); + +1187 + `_block +( +blk +); + +1190 ( +blk + = + `ld_block +( +ic +, "PVD\x00", +f +, +SDL_FALSE +, -1, SDL_FALSE))) + +1193 +i + = + `gu16 +( +blk +); + +1194 i(( +i +<0|| (i>1|| ( +ic +-> +wddisk +. +disk +[i] ! +NULL +|| (! +blk +-> +dablock +|| (blk-> +size + != 10)) + +1196 + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshotoad failed: Invalid file (PVD1)"); + +1197 + `_blockhds +(); + +1198 + `fo +( +f +); + +1199 + `tmutoggs + +ic + ); + +1200 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +1201  +SDL_FALSE +; + +1205 +ic +-> +wddisk +. +disk +[ +i +] = ( +diskimage + *) + `mloc +((diskimage)); + +1206 i(! +ic +-> +wddisk +. +disk +[ +i +]) + +1208 + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshotoad failed: Out of memory (PVD2)"); + +1209 + `_blockhds +(); + +1210 + `fo +( +f +); + +1211 + `tmutoggs + +ic + ); + +1212 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +1213  +SDL_FALSE +; + +1215 + `memt +( +ic +-> +wddisk +. +disk +[ +i +], 0, ( +diskimage +)); + +1218 +ic +-> +wddisk +. +disk +[ +i +]-> +wimage + = + `mloc +( +blk +-> +dablock +-> +size +); + +1219 i(! +ic +-> +wddisk +. +disk +[ +i +]) + +1221 + ` +( +ic +-> +wddisk +. +disk +[ +i +]); + +1222 +ic +-> +wddisk +. +disk +[ +i +] = +NULL +; + +1223 + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshotoad failed: Out of memory (PVD3)"); + +1224 + `_blockhds +(); + +1225 + `fo +( +f +); + +1226 + `tmutoggs + +ic + ); + +1227 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +1228  +SDL_FALSE +; + +1232 i(! + `ad_block +( +ic +, +blk +-> +dablock +, +f +, +SDL_TRUE +, oric-> +wddisk +. +disk +[ +i +]-> +wimage +)) + +1234 + ` +( +ic +-> +wddisk +. +disk +[ +i +]-> +wimage +); + +1235 + ` +( +ic +-> +wddisk +. +disk +[ +i +]); + +1236 +ic +-> +wddisk +. +disk +[ +i +] = +NULL +; + +1237 + `_blockhds +(); + +1238 + `fo +( +f +); + +1239 + `tmutoggs + +ic + ); + +1240 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +1241  +SDL_FALSE +; + +1244 +ic +-> +wddisk +. +disk +[ +i +]-> +chedack + = -1; + +1245 +ic +-> +wddisk +. +disk +[ +i +]-> +chedside + = -1; + +1248 +ic +-> +wddisk +. +disk +[ +i +]-> +drivum + = i; + +1249 +ic +-> +wddisk +. +disk +[ +i +]-> +wimag + = + `gu32 +( +blk +); + +1251 + `rtf +( +ic +-> +wddisk +. +disk +[ +i +]-> +fame +, "%s%cSNAPDISK%d.DSK", +diskth +, +PATHSEP +, i); + +1253 +offs + = + `gu32 +( +blk +); + +1254 +ic +-> +avz +. +drv +[ +i +]. +pimg + = oric-> +wddisk +. +disk +[i]; + +1255 i( +offs + == 0xffffffff) + +1256 +ic +-> +avz +. +drv +[ +i +]. +_r + = +NULL +; + +1258 +ic +-> +avz +. +drv +[ +i +]. +_r + = &ic->avz.drv[i]. +pimg +-> +wimage +[ +offs +]; + +1260 +blk +-> +id +[0] = 0; + +1261 + `_block +( +blk +); + +1266 i( +do_wd17xx +) + +1268 +Ut8 + +disks +[4]; + +1271 +blk + = + `ld_block +( +ic +, "WDD\x00", +f +, +SDL_TRUE +, 38, +SDL_FALSE +); + +1272 i(! +blk +) + +1274 + `_blockhds +(); + +1275 + `fo +( +f +); + +1276 + `tmutoggs + +ic + ); + +1277 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +1278  +SDL_FALSE +; + +1281 +ic +-> +wddisk +. +r_us + = + `gu8 + ( +blk +); + +1282 +ic +-> +wddisk +. +r_ack + = + `gu8 + ( +blk +); + +1283 +ic +-> +wddisk +. +r_ + = + `gu8 + ( +blk +); + +1284 +ic +-> +wddisk +. +r_da + = + `gu8 + ( +blk +); + +1285 +ic +-> +wddisk +. +c_drive + = + `gu8 + ( +blk +); + +1286 +ic +-> +wddisk +. +c_side + = + `gu8 + ( +blk +); + +1287 +ic +-> +wddisk +. +c_ack + = + `gu8 + ( +blk +); + +1288 +ic +-> +wddisk +. +c_ + = + `gu8 + ( +blk +); + +1289 +ic +-> +wddisk +. +y + = + `gu8 + ( +blk +); + +1290 +ic +-> +wddisk +. +ϡ__ + = + `gu8 + ( +blk +); + +1291 + `gda +( +blk +, +disks +, 4); + +1292 +ic +-> +wddisk +. +cut + = + `gu32 +( +blk +); + +1293 +ic +-> +wddisk +. +cuoffs + = + `gu32 +( +blk +); + +1294 +ic +-> +wddisk +. +dayedt + = + `gu32 +( +blk +); + +1295 +ic +-> +wddisk +. +dayeddrq + = + `gu32 +( +blk +); + +1296 +ic +-> +wddisk +. +dius + = + `gu32 +( +blk +); + +1297 +ic +-> +wddisk +. +ddus + = + `gu32 +( +blk +); + +1298 +ic +-> +wddisk +. +c + = + `gu32 +( +blk +); + +1301 + `_block +( +blk +); + +1304 ( +blk + = + `ld_block +( +ic +, "DSK\x00", +f +, +SDL_FALSE +, -1, SDL_FALSE))) + +1306  +ack_to_che +=-1, +side_to_che +=-1; + +1309 +i + = + `gu16 +( +blk +); + +1310 i(( +i +<0|| (i>3|| ( +ic +-> +wddisk +. +disk +[i] ! +NULL +|| (! +blk +-> +dablock +|| (blk-> +size + != 16)) + +1312 + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshotoad failed: Invalid file (20)"); + +1313 + `_blockhds +(); + +1314 + `fo +( +f +); + +1315 + `tmutoggs + +ic + ); + +1316 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +1317  +SDL_FALSE +; + +1321 +ic +-> +wddisk +. +disk +[ +i +] = ( +diskimage + *) + `mloc +((diskimage)); + +1322 i(! +ic +-> +wddisk +. +disk +[ +i +]) + +1324 + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshotoad failed: Out of memory (21)"); + +1325 + `_blockhds +(); + +1326 + `fo +( +f +); + +1327 + `tmutoggs + +ic + ); + +1328 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +1329  +SDL_FALSE +; + +1331 + `memt +( +ic +-> +wddisk +. +disk +[ +i +], 0, ( +diskimage +)); + +1334 +ic +-> +wddisk +. +disk +[ +i +]-> +wimage + = + `mloc +( +blk +-> +dablock +-> +size +); + +1335 i(! +ic +-> +wddisk +. +disk +[ +i +]) + +1337 + ` +( +ic +-> +wddisk +. +disk +[ +i +]); + +1338 +ic +-> +wddisk +. +disk +[ +i +] = +NULL +; + +1339 + `msgbox +( +ic +, +MSGBOX_OK +, "Snapshotoad failed: Out of memory (22)"); + +1340 + `_blockhds +(); + +1341 + `fo +( +f +); + +1342 + `tmutoggs + +ic + ); + +1343 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +1344  +SDL_FALSE +; + +1348 i(! + `ad_block +( +ic +, +blk +-> +dablock +, +f +, +SDL_TRUE +, oric-> +wddisk +. +disk +[ +i +]-> +wimage +)) + +1350 + ` +( +ic +-> +wddisk +. +disk +[ +i +]-> +wimage +); + +1351 + ` +( +ic +-> +wddisk +. +disk +[ +i +]); + +1352 +ic +-> +wddisk +. +disk +[ +i +] = +NULL +; + +1353 + `_blockhds +(); + +1354 + `fo +( +f +); + +1355 + `tmutoggs + +ic + ); + +1356 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +1357  +SDL_FALSE +; + +1360 +ic +-> +wddisk +. +disk +[ +i +]-> +chedack + = -1; + +1361 +ic +-> +wddisk +. +disk +[ +i +]-> +chedside + = -1; + +1364 +ic +-> +wddisk +. +disk +[ +i +]-> +drivum + = i; + +1365 +ic +-> +wddisk +. +disk +[ +i +]-> +numacks + = + `gu16 +( +blk +); + +1366 +ic +-> +wddisk +. +disk +[ +i +]-> +numsides + = + `gu16 +( +blk +); + +1367 +ic +-> +wddisk +. +disk +[ +i +]-> +geomry + = + `gu16 +( +blk +); + +1368 +ack_to_che + = + `gs16 +( +blk +); + +1369 +side_to_che + = + `gs16 +( +blk +); + +1370 +ic +-> +wddisk +. +disk +[ +i +]-> +wimag + = + `gu32 +( +blk +); + +1372 i(( +ack_to_che + !-1&& ( +side_to_che + != -1)) + +1373 + `diskimage_chck +( +ic +-> +wddisk +. +disk +[ +i +], +ack_to_che +, +side_to_che +); + +1375 i( +ic +-> +wddisk +. +c_drive + = +i +) + +1376 +ic +-> +wddisk +. +cu + = + `wd17xx_fd_ +(&ic->wddisk, oric->wddisk. +r_ +); + +1378 + `rtf +( +ic +-> +wddisk +. +disk +[ +i +]-> +fame +, "%s%cSNAPDISK%d.DSK", +diskth +, +PATHSEP +, i); + +1380 +blk +-> +id +[0] = 0; + +1381 + `_block +( +blk +); + +1385 i( +ic +-> +ty + = +MACH_TELESTRAT +) + +1388 +blk + = + `ld_block +( +ic +, "BNK\x00", +f +, +SDL_TRUE +, 9, +SDL_FALSE +); + +1389 i(! +blk +) + +1391 + `_blockhds +(); + +1392 + `fo +( +f +); + +1393 + `tmutoggs + +ic + ); + +1394 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +1395  +SDL_FALSE +; + +1398  +i +=0; i<8; i++) + +1399 +ic +-> +_bk +[ +i +]. +ty + = + `gu8 +( +blk +); + +1400 +ic +-> +_cubk + = + `gu8 +( +blk +); + +1403 + `_block +( +blk +); + +1406 +blk + = + `ld_block +( +ic +, "ACI\x00", +f +, +SDL_TRUE +, +ACIA_LAST +, +SDL_FALSE +); + +1407 i(! +blk +) + +1409 + `_blockhds +(); + +1410 + `fo +( +f +); + +1411 + `tmutoggs + +ic + ); + +1412 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +1413  +SDL_FALSE +; + +1416 + `gda +( +blk +, & +ic +-> +_ac +. +gs +[0], +ACIA_LAST +); + +1419 + `_block +( +blk +); + +1422 +blk + = + `ld_block +( +ic +, "AUX\x00", +f +, +SDL_TRUE +, +ACIA_LAST +, +SDL_FALSE +); + +1423 i(! +blk +) + +1425 + `_blockhds +(); + +1426 + `fo +( +f +); + +1427 + `tmutoggs + +ic + ); + +1428 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +1429  +SDL_FALSE +; + +1433 + `_block +( +blk +); + +1436 +blk + = + `ld_block +( +ic +, "TVA\x00", +f +, +SDL_TRUE +, 39, +SDL_FALSE +); + +1437 i(! +blk +) + +1439 + `_blockhds +(); + +1440 + `fo +( +f +); + +1441 + `tmutoggs + +ic + ); + +1442 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +1443  +SDL_FALSE +; + +1446 +ic +-> +_v +. +i + = + `gu8 + ( +blk +); + +1447 +ic +-> +_v +. +b + = + `gu8 + ( +blk +); + +1448 +ic +-> +_v +. +b + = + `gu8 + ( +blk +); + +1449 +ic +-> +_v +. +bl + = + `gu8 + ( +blk +); + +1450 +ic +-> +_v +. +a + = + `gu8 + ( +blk +); + +1451 +ic +-> +_v +. +a + = + `gu8 + ( +blk +); + +1452 +ic +-> +_v +. + + = + `gu8 + ( +blk +); + +1453 +ic +-> +_v +. +dd + = + `gu8 + ( +blk +); + +1454 +ic +-> +_v +. +ddrb + = + `gu8 + ( +blk +); + +1455 +ic +-> +_v +. +t1l_l + = + `gu8 + ( +blk +); + +1456 +ic +-> +_v +. +t1l_h + = + `gu8 + ( +blk +); + +1457 +ic +-> +_v +. +t1c + = + `gu16 +( +blk +); + +1458 +ic +-> +_v +. +t2l_l + = + `gu8 + ( +blk +); + +1459 +ic +-> +_v +. +t2l_h + = + `gu8 + ( +blk +); + +1460 +ic +-> +_v +. +t2c + = + `gu16 +( +blk +); + +1461 +ic +-> +_v +. + + = + `gu8 + ( +blk +); + +1462 +ic +-> +_v +. +a + = + `gu8 + ( +blk +); + +1463 +ic +-> +_v +. +p + = + `gu8 + ( +blk +); + +1464 +ic +-> +_v +. +r + = + `gu8 + ( +blk +); + +1465 +ic +-> +_v +. +1 + = + `gu8 + ( +blk +); + +1466 +ic +-> +_v +. +2 + = + `gu8 + ( +blk +); + +1467 +ic +-> +_v +. +cb1 + = + `gu8 + ( +blk +); + +1468 +ic +-> +_v +. +cb2 + = + `gu8 + ( +blk +); + +1469 +ic +-> +_v +. +cou + = + `gu8 + ( +blk +); + +1470 +ic +-> +_v +. +t1ld + = + `gu8 + ( +blk +); + +1471 +ic +-> +_v +. +t2ld + = + `gu8 + ( +blk +); + +1472 +ic +-> +_v +. +time + = + `gu16 +( +blk +); + +1473 +ic +-> +_v +. +t1run + = + `gu8 + ( +blk +); + +1474 +ic +-> +_v +. +t2run + = + `gu8 + ( +blk +); + +1475 +ic +-> +_v +. +2pul + = + `gu8 + ( +blk +); + +1476 +ic +-> +_v +. +cb2pul + = + `gu8 + ( +blk +); + +1477 +ic +-> +_v +. +igg + + `gu8 + ( +blk +); + +1478 +ic +-> +_v +. +qb + = + `gu32 +( +blk +); + +1481 + `_block +( +blk +); + +1485 i(( +blk + = + `ld_block +( +ic +, "SYR\x00", +f +, +SDL_FALSE +, -1, SDL_FALSE))) + +1487 + `m_symsomsh +(& +ic +-> +romsyms +, +blk +-> +buf +, blk-> +size +); + +1488 + `_block +( +blk +); + +1492 i(( +blk + = + `ld_block +( +ic +, "SYU\x00", +f +, +SDL_FALSE +, -1, SDL_FALSE))) + +1494 + `m_symsomsh +(& +ic +-> +ursyms +, +blk +-> +buf +, blk-> +size +); + +1495 + `_block +( +blk +); + +1498 i( +ic +-> +ty + = +MACH_TELESTRAT +) + +1500  +i +=0; i<8; i++) + +1502  +me +[8]; + +1503 + `rtf +( +me +, "SY%d%c", +i +, 0); + +1504 i(( +blk + = + `ld_block +( +ic +, +me +, +f +, +SDL_FALSE +, -1, SDL_FALSE))) + +1506 + `m_symsomsh +(& +ic +-> +_bksyms +[ +i +], +blk +-> +buf +, blk-> +size +); + +1507 + `_block +( +blk +); + +1513 i(( +blk + = + `ld_block +( +ic +, "BKP\x00", +f +, +SDL_FALSE +, -1, SDL_FALSE))) + +1515 +u +-> +ybp + = +SDL_FALSE +; + +1516 +u +-> +ymbp + = +SDL_FALSE +; + +1518  +i +=0; i<16; i++) + +1520 +u +-> +bakpots +[ +i +] = + `gs32 +( +blk +); + +1521 i( +u +-> +bakpots +[ +i +] !-1u-> +ybp + = +SDL_TRUE +; + +1524  +i +=0; i<16; i++) + +1526 +u +-> +membakpots +[ +i +]. +ags + = + `gu8 +( +blk +); + +1527 +u +-> +membakpots +[ +i +]. +ϡv + = + `gu8 +( +blk +); + +1528 +u +-> +membakpots +[ +i +]. +addr + = + `gu16 +( +blk +); + +1529 i( +u +-> +membakpots +[ +i +]. +ags +u-> +ymbp + = +SDL_TRUE +; + +1532 + `_block +( +blk +); + +1535 + `_blockhds +(); + +1536 + `fo +( +f +); + +1537 + `tmutoggs + +ic + ); + +1538 i( +back2m + + `mumode +( +ic +, +NULL +, +EM_DEBUG +); + +1539  +SDL_TRUE +; + +1540 + } +} + + @snapshot.h + +23 +SDL_bo + +ve_sh +( +mache + * +ic +, * +fame +); + +24 +SDL_bo + +ld_sh +( +mache + * +ic +, * +fame +); + + @system.h + +22 #ide +ORICUTRON_SYSTEM_H + + +23  + #ORICUTRON_SYSTEM_H + + + ) + +25 #ide +_MSC_VER + + +26  + ~ + +28  + #_CRTDBG_MAP_ALLOC + + + ) + +29  + ~ + +30  + ~ + +31  + ~"msvc/unid.h +" + +35  + #AUDIO_FREQ + 44100 + + ) + +38 #i +defed +( +__amigaos4__ +) + +40  + #PATHSEP + '/' + + ) + +41  + #PATHSEPSTR + "/" + + ) + +42  + #FILEPREFIX + "PROGDIR:" + + ) + +43  + #ROMPREFIX + "PROGDIR:roms/" + + ) + +44  + #IMAGEPREFIX + "PROGDIR:images/" + + ) + +46 #i +defed +( +WIN32 +) + +48  + #PATHSEP + '\\' + + ) + +49  + #PATHSEPSTR + "\\" + + ) + +50  + #FILEPREFIX + + + ) + +51  + #ROMPREFIX + "roms\\" + + ) + +52  + #IMAGEPREFIX + "images\\" + + ) + +56  + #PATHSEP + '/' + + ) + +57  + #PATHSEPSTR + "/" + + ) + +58  + #FILEPREFIX + + + ) + +59  + #ROMPREFIX + "roms/" + + ) + +60  + #IMAGEPREFIX + "images/" + + ) + +65  + ~"syem_sdl.h +" + + @system_sdl.c + +23  + #WANT_WMINFO + + + ) + +33  + ~"syem.h +" + +35 #i +SDL_MAJOR_VERSION + == 1 + +36 #ifde +__SPECIFY_SDL_DIR__ + + +37  + ~ + +39  + ~ + +42 #ifde +__SPECIFY_SDL_DIR__ + + +43  + ~ + +45  + ~ + +49 #ifde +__OPENGL_AVAILABLE__ + + +50 #ide +__APPLE__ + + +51  + ~ + +53  + ~ + +57 #i +SDL_BYTEORDER + = +SDL_BIG_ENDIAN + + +58  + #RMASK + 0xFF000000 + + ) + +59  + #GMASK + 0x00FF0000 + + ) + +60  + #BMASK + 0x0000FF00 + + ) + +61  + #AMASK + 0x000000FF + + ) + +63  + #RMASK + 0x000000FF + + ) + +64  + #GMASK + 0x0000FF00 + + ) + +65  + #BMASK + 0x00FF0000 + + ) + +66  + #AMASK + 0xFF000000 + + ) + +69 #i +SDL_MAJOR_VERSION + == 1 + +72  +SDL_bo + + gg_fusn + = +SDL_FALSE +; + +73  +SDL_GLCڋxt + + gg_glcڋxt + = +NULL +; + +74  +SDL_Rd +* + gg_nd + = +NULL +; + +75  +SDL_Textu + * + gg_xtu + = +NULL +; + +76  +SDL_Sur +* + gg_sn + = +NULL +; + +77  +SDL_Wdow +* + gg_wdow + = +NULL +; + +78  +SDL_Sur +* + gg_ic + = +NULL +; + +80  + gg_b + = 0; + +81  + gg_width + = 0; + +82  + gg_height + = 0; + +84  + gg_ϡx + = +SDL_WINDOWPOS_CENTERED +; + +85  + gg_ϡy + = +SDL_WINDOWPOS_CENTERED +; + +87  + $FeResours +() + +89 if( +g_glcڋxt +) + +91 + `SDL_GL_DeCڋxt +( +g_glcڋxt +); + +92 +g_glcڋxt + = +NULL +; + +95 if( +g_nd +) + +97 + `SDL_DeroyRd +( +g_nd +); + +98 +g_nd + = +NULL +; + +101 if( +g_xtu +) + +103 + `SDL_DeroyTextu +( +g_xtu +); + +104 +g_xtu + = +NULL +; + +107 if( +g_sn +) + +109 + `SDL_FeSur +( +g_sn +); + +110 +g_sn + = +NULL +; + +113 if( +g_wdow +) + +115 + `SDL_GWdowPosi +( +g_wdow +, & +g_ϡx +, & +g_ϡy +); + +116 + `SDL_DeroyWdow +( +g_wdow +); + +117 +g_wdow + = +NULL +; + +120 + } +} + +123 #i +SDL_MAJOR_VERSION + == 1 + +124  + $SDL_COMPAT_GWMInfo +( +SDL_SysWMfo + * +fo +) + +128 #i + `defed +( +__MORPHOS__ +) + +131  + `SDL_GWMInfo +( +fo +); + +133 + } +} + +135  + $SDL_COMPAT_GWMInfo +( +SDL_SysWMfo + * +fo +) + +137  +g_wdow +? + `SDL_GWdowWMInfo +(g_wdow, +fo +) : -1; + +138 + } +} + +142 #i +SDL_MAJOR_VERSION + == 1 + +143  + $SDL_COMPAT_WM_SIc +( +SDL_Sur + * +ic +, +Ut8 + * +mask +) + +145 + `SDL_WM_SIc +( +ic +, +mask +); + +146 + } +} + +147  + $SDL_COMPAT_WM_SCti +(cڡ * +t +, cڡ * +ic +) + +149 + `SDL_WM_SCti +( +t +, +ic +); + +150 + } +} + +152  + $SDL_COMPAT_WM_SIc +( +SDL_Sur + * +ic +, +Ut8 + * +mask +) + +154 if( +g_ic +) + +156 + `SDL_FeSur +( +g_ic +); + +157 +g_ic + = +NULL +; + +159 if( +ic +) + +161 +g_ic + = +ic +; + +162 +g_ic +-> +fcou +++; + +164 + } +} + +165  + $SDL_COMPAT_WM_SCti +(cڡ * +t +, cڡ * +ic +) + +167 if( +g_wdow +) + +168 + `SDL_SWdowT +( +g_wdow +, +t +); + +169 + } +} + +173 #i +SDL_MAJOR_VERSION + == 1 + +174 +SDL_bo + + $SDL_COMPAT_IsAAive +( +SDL_Evt +* +evt +) + +176 +SDL_AiveEvt + * +a_ev + = (SDL_AiveEvt*) +evt +; + +177  ( +a_ev +-> +e + = +SDL_APPACTIVE + &&_ev-> +ga + =1)? +SDL_TRUE + : +SDL_FALSE +; + +178 + } +} + +179 +SDL_bo + + $SDL_COMPAT_IsAFocud +( +SDL_Evt +* +evt +) + +181  +evt +-> +aive +. +ty + ) + +183  +SDL_APPINPUTFOCUS +: + +184  +SDL_APPACTIVE +: + +185  +SDL_TRUE +; + +188  +SDL_FALSE +; + +189 + } +} + +191 +SDL_bo + + $SDL_COMPAT_IsAAive +( +SDL_Evt +* +evt +) + +195  +SDL_FALSE +; + +196 + } +} + +197 +SDL_bo + + $SDL_COMPAT_IsAFocud +( +SDL_Evt +* +evt +) + +207  +SDL_FALSE +; + +208 + } +} + +211 #i +SDL_MAJOR_VERSION + == 1 + +212  + $SDL_COMPAT_EbKeyRt +( +day +,  +rv +) + +214  + `SDL_EbKeyRt +( +day +, +rv +); + +215 + } +} + +217  + $SDL_COMPAT_EbKeyRt +( +day +,  +rv +) + +221 + } +} + +225 #i +SDL_MAJOR_VERSION + == 1 + +226  + $SDL_COMPAT_EbUNICODE +( +ab +) + +228  + `SDL_EbUNICODE +( +ab +); + +229 + } +} + +231  + $SDL_COMPAT_EbUNICODE +( +ab +) + +235 + } +} + +238 #i +SDL_MAJOR_VERSION + == 1 + +239 +SDL_COMPAT_KEY + + $SDL_COMPAT_GKeysymUnicode +( +SDL_KEYSYM + +keysym +) + +241  +keysym +. +unicode +; + +242 + } +} + +243 +SDL_COMPAT_KEY + + $SDL_COMPAT_TneUnicode +( +SDL_KEYSYM + +keysym +) + +245  +keysym +. +unicode +; + +246 + } +} + +248 +SDL_COMPAT_KEY + + $SDL_COMPAT_TneUnicode +( +SDL_KEYSYM + +keysym +) + +250 if( +keysym +. +mod + & +KMOD_SHIFT +) + +252  +keysym +. +sym +) + +297 +keysym +. +sym + = + `tou +(keysym.sym); + +301  +keysym +. +sym +; + +302 + } +} + +303 +SDL_COMPAT_KEY + + $SDL_COMPAT_GKeysymUnicode +( +SDL_KEYSYM + +keysym +) + +305  +keysym +. +sym +; + +306 + } +} + +309 #i +SDL_MAJOR_VERSION + == 1 + +310  + $SDL_COMPAT_Fl +( +SDL_Sur +* +sn +) + +312  + `SDL_Fl +( +sn +); + +313 + } +} + +315  + $SDL_COMPAT_Fl +( +SDL_Sur +* +sn +) + +317 if( +g_nd +) + +319 + `SDL_UpdeTextu +( +g_xtu +, +NULL +, +g_sn +-> +pixs +, g_sn-> +pch +); + +320 + `SDL_RdCˬ +( +g_nd +); + +321 + `SDL_RdCy +( +g_nd +, +g_xtu +, +NULL +, NULL); + +322 + `SDL_RdP +( +g_nd +); + +325 + } +} + +328 #i +SDL_MAJOR_VERSION + == 1 + +329  + $SDL_COMPAT_GBsPPix +() + +331 cڡ +SDL_VideoInfo +* +fo + = + `SDL_GVideoInfo +(); + +332  ( +fo +)? info-> +vfmt +-> +BsPPix + : 0; + +333 + } +} + +335  + $SDL_COMPAT_GBsPPix +() + +337  +b +; + +338 +SDL_DiyMode + +mode +; + +339 + `SDL_GCutDiyMode +(0, & +mode +); + +340 +b + = + `SDL_BITSPERPIXEL +( +mode +. +fm +); + +341  ( +b +==24)? 32 : bpp; + +342 + } +} + +345 #i +SDL_MAJOR_VERSION + == 1 + +346  + $SDL_COMPAT_WM_ToggFuSn +( +SDL_Sur + * +sur +) + +348  + `SDL_WM_ToggFuSn +( +sur +); + +349 + } +} + +351  + $SDL_COMPAT_WM_ToggFuSn +( +SDL_Sur + * +sur +) + +353 if( +g_wdow +) + +355 +g_fusn + = (g_fusn)? +SDL_FALSE + : +SDL_TRUE +; + +357 if( +g_fusn +) + +358 + `SDL_SWdowFusn +( +g_wdow +, +SDL_WINDOW_FULLSCREEN +); + +360 + `SDL_SWdowSize +( +g_wdow +, +g_width +, +g_height +); + +364 + } +} + +367 #i +SDL_MAJOR_VERSION + == 1 + +368 +SDL_Sur +* + $SDL_COMPAT_SVideoMode +( +width +,  +height +,  +bpix +, +Ut32 + +ags +) + +370  + `SDL_SVideoMode +( +width +, +height +, +bpix +, +ags +); + +371 + } +} + +373 +SDL_Sur +* + $SDL_COMPAT_SVideoMode +( +width +,  +height +,  +bpix +, +Ut32 + +ags +) + +375 +g_width + = +width +; + +376 +g_height + = +height +; + +377 +g_b + = +bpix +; + +379 + `FeResours +(); + +381 +g_wdow + = + `SDL_CeWdow +("icu", +g_ϡx +, +g_ϡy +, + +382 +g_width +, +g_height +, +ags +); + +383 if( +g_ic +) + +384 + `SDL_SWdowIc +( +g_wdow +, +g_ic +); + +386 if( +ags + & +SDL_WINDOW_OPENGL +) + +388 +g_sn + = + `SDL_GWdowSur +( +g_wdow +); + +389 +g_glcڋxt + = + `SDL_GL_CeCڋxt +( +g_wdow +); + +393 +g_sn + = + `SDL_CeRGBSur +(0, +g_width +, +g_height +, +g_b +, + +394 +RMASK +, +GMASK +, +BMASK +, +AMASK +); + +395 +g_nd + = + `SDL_CeRd +( +g_wdow +, -1, 0); + +396 +g_xtu + = + `SDL_CeTextu +( +g_nd +, + +397 +SDL_PIXELFORMAT_ABGR8888 +, + +398 +SDL_TEXTUREACCESS_STREAMING +, + +399 +g_width +, +g_height +); + +402  +g_sn +; + +403 + } +} + +406 #i +SDL_MAJOR_VERSION + == 1 + +407  + $SDL_COMPAT_SP +( +SDL_Sur + * +sur +,  +ags +, +SDL_C + * +cs +,  +fc +,  +ncs +) + +409  + `SDL_SP +( +sur +, +ags +, +cs +, +fc +, +ncs +); + +410 + } +} + +412  + $SDL_COMPAT_SP +( +SDL_Sur + * +sur +,  +ags +, +SDL_C + * +cs +,  +fc +,  +ncs +) + +416 + } +} + +419 #i +SDL_MAJOR_VERSION + == 1 + +420  + $SDL_COMPAT_SEvtFr +( +SDL_EvtFr + +fr +) + +422 + `SDL_SEvtFr +( +fr +); + +423 + } +} + +425  + $SDL_COMPAT_SEvtFr +( +SDL_EvtFr + +fr +) + +427 + `SDL_SEvtFr +( +fr +, +NULL +); + +428 + } +} + +431 #i +SDL_MAJOR_VERSION + == 1 + +432  + $SDL_COMPAT_Qu +() + +434 + `SDL_Qu +(); + +435 + } +} + +437  + $SDL_COMPAT_Qu +() + +439 + `FeResours +(); + +440 + `SDL_Qu +(); + +441 + } +} + +444 #ifde +__OPENGL_AVAILABLE__ + + +445 #i +SDL_MAJOR_VERSION + == 1 + +446  + $SDL_COMPAT_GL_SwBufrs +() + +448 + `SDL_GL_SwBufrs +(); + +449 + } +} + +451  + $SDL_COMPAT_GL_SwBufrs +() + +453 + `SDL_GL_SwWdow +( +g_wdow +); + +454 + } +} + +458 #ifde +__OPENGL_AVAILABLE__ + + +459 +SDL_Sur + * + $Vt +( +SDL_Sur +* +sfc +) + +461  +le +; + +462 +SDL_Sur +* +su + = + `SDL_CeRGBSur +( +sfc +-> +ags +, sfc-> +w +, sfc-> +h +, + +463 +sfc +-> +fm +-> +BysPPix + * 8, sfc->fm-> +Rmask +, sfc->fm-> +Gmask +, + +464 +sfc +-> +fm +-> +Bmask +, sfc->fm-> +Amask +); + +466 i( +su +) + +468 +Ut8 +* +pixs + = (Ut8* +sfc +->pixels; + +469 +Ut8 +* +ixs + = (Ut8* +su +-> +pixs +; + +471 +Ut32 + +pch + = +sfc +->pitch; + +472 +Ut32 + +pxngth + = +pch +* +sfc +-> +h +; + +474  +le + = 0;< +sfc +-> +h +; ++line) + +476 +Ut32 + +pos + = +le + * +pch +; + +477 + `memy +(& +ixs +[ +pos +], & +pixs +[( +pxngth +-pos)- +pch +],itch); + +481  +su +; + +482 + } +} + +483 #i +SDL_MAJOR_VERSION + == 1 + +484  + $SDL_COMPAT_TakeSnsh +(* +ame +) + +486 +SDL_Sur + * +g_sn + = + `SDL_GVideoSur +(); + +488 if( +g_sn +-> +ags + & +SDL_COMPAT_OPENGL +) + +491  +g_width + = +g_sn +-> +w +; + +492  +g_height + = +g_sn +-> +h +; + +493 +SDL_Sur + * + +; + +496 +SDL_Sur + * +surf + = + `SDL_CeRGBSur +( +SDL_SWSURFACE +, +g_width +, +g_height +, 24, +RMASK +, +GMASK +, +BMASK +, 0); + +497 + `glRdPixs +(0, 0, +g_width +, +g_height +, +GL_RGB +, +GL_UNSIGNED_BYTE +, +surf +-> +pixs +); + +503 + + = + `Vt +( +surf +); + +504 + `SDL_SaveBMP +( + +, +ame +); + +506 + `SDL_FeSur +( + +); + +507 + `SDL_FeSur +( +surf +); + +510 + `SDL_SaveBMP +( +g_sn +, +ame +); + +511 + } +} + +513  + $SDL_COMPAT_TakeSnsh +(* +ame +) + +519 +SDL_Sur + * +surf + = + `SDL_CeRGBSur +( +SDL_SWSURFACE +, +g_width +, +g_height +, +g_b +, +RMASK +, +GMASK +, +BMASK +, +AMASK +); + +521 i( +surf + = +NULL +) + +528 + `glRdPixs +(0,0, +g_width +, +g_height +, +GL_RGBA +, +GL_UNSIGNED_BYTE +, +surf +-> +pixs +); + +530 +SDL_Sur + * + + = + `Vt +( +surf +); + +531 + `SDL_SaveBMP +( + +, +ame +); + +533 + `SDL_FeSur +( + +); + +534 + `SDL_FeSur +( +surf +); + +535 + } +} + +538 #i +SDL_MAJOR_VERSION + == 1 + +539  + $SDL_COMPAT_TakeSnsh +(* +ame +) + +541 + `SDL_SaveBMP +( + `SDL_GVideoSur +(), +ame +); + +542 + } +} + +544  + $SDL_COMPAT_TakeSnsh +(* +ame +) + +546 + `SDL_SaveBMP +( +g_sn +, +ame +); + +547 + } +} + + @system_sdl.h + +22 #ide +ORICUTRON_SYSTEM_SDL_H + + +23  + #ORICUTRON_SYSTEM_SDL_H + + + ) + +25 #i +SDL_MAJOR_VERSION + == 1 + +26 #ifde +__SPECIFY_SDL_DIR__ + + +27  + ~ + +28  + ~ + +29 #ifde +WANT_WMINFO + + +30  + ~ + +33  + ~ + +34  + ~ + +35 #ifde +WANT_WMINFO + + +36  + ~ + +40 #ifde +__SPECIFY_SDL_DIR__ + + +41  + ~ + +42  + ~ + +43 #ifde +WANT_WMINFO + + +44  + ~ + +47  + ~ + +48  + ~ + +49 #ifde +WANT_WMINFO + + +50  + ~ + +55 #i +SDL_BYTEORDER + = +SDL_LIL_ENDIAN + + +56  + #_LE32 +( +X +(X) + + ) + +57  + #_LE16 +( +X +(X) + + ) + +58  + #_BE32 +( +X + + `SDL_Sw32 +(X) + + ) + +59  + #_BE16 +( +X + + `SDL_Sw16 +(X) + + ) + +60  + #_MAKE_LE32 +( +X +) + + ) + +61  + #_MAKE_LE16 +( +X +) + + ) + +62  + #_MAKE_BE32 +( +X +X = + `SDL_Sw32 +(X) + + ) + +63  + #_MAKE_BE16 +( +X +X = + `SDL_Sw16 +(X) + + ) + +65  + #_LE32 +( +X + + `SDL_Sw32 +(X) + + ) + +66  + #_LE16 +( +X + + `SDL_Sw16 +(X) + + ) + +67  + #_BE32 +( +X +(X) + + ) + +68  + #_BE16 +( +X +(X) + + ) + +69  + #_MAKE_LE32 +( +X +X = + `SDL_Sw32 +(X) + + ) + +70  + #_MAKE_LE16 +( +X +X = + `SDL_Sw16 +(X) + + ) + +71  + #_MAKE_BE32 +( +X +) + + ) + +72  + #_MAKE_BE16 +( +X +) + + ) + +76 #i +SDL_MAJOR_VERSION + == 1 + +77  +Ut16 + + tSDL_COMPAT_KEY +; + +78  +SDL_keysym + + tSDL_KEYSYM +; + +79  +SDL_VideoInfo + + tSDL_COMPAT_VideoInfo +; + +81  + #SDL_COMPAT_HWSURFACE + +SDL_HWSURFACE + + + ) + +82  + #SDL_COMPAT_HWPALETTE + +SDL_HWPALETTE + + + ) + +83  + #SDL_COMPAT_FULLSCREEN + +SDL_FULLSCREEN + + + ) + +85 #ifde +__OPENGL_AVAILABLE__ + + +86  + #SDL_COMPAT_OPENGL + +SDL_OPENGL + + + ) + +89  + #SDL_COMPAT_LOGPAL + +SDL_LOGPAL + + + ) + +90  + #SDL_COMPAT_PHYSPAL + +SDL_PHYSPAL + + + ) + +92  + #SDL_COMPAT_ACTIVEEVENT + +SDL_ACTIVEEVENT + + + ) + +95  +Ut32 + + tSDL_COMPAT_KEY +; + +96  +SDL_Keysym + + tSDL_KEYSYM +; + +97  +SDL_RdInfo + + tSDL_COMPAT_VideoInfo +; + +99  + #SDL_COMPAT_HWSURFACE + 0 + + ) + +100  + #SDL_COMPAT_HWPALETTE + 0 + + ) + +101  + #SDL_COMPAT_FULLSCREEN + +SDL_WINDOW_FULLSCREEN + + + ) + +103 #ifde +__OPENGL_AVAILABLE__ + + +104  + #SDL_COMPAT_OPENGL + +SDL_WINDOW_OPENGL + + + ) + +107  + #SDL_COMPAT_LOGPAL + 0 + + ) + +108  + #SDL_COMPAT_PHYSPAL + 0 + + ) + +110  + #SDL_COMPAT_ACTIVEEVENT + +SDL_WINDOWEVENT + + + ) + +112  + #SDL_DEFAULT_REPEAT_DELAY + 0 + + ) + +113  + #SDL_DEFAULT_REPEAT_INTERVAL + 0 + + ) + +115  + #SDLK_KP0 + +SDLK_KP_0 + + + ) + +116  + #SDLK_KP1 + +SDLK_KP_1 + + + ) + +117  + #SDLK_KP2 + +SDLK_KP_2 + + + ) + +118  + #SDLK_KP3 + +SDLK_KP_3 + + + ) + +119  + #SDLK_KP4 + +SDLK_KP_4 + + + ) + +120  + #SDLK_KP5 + +SDLK_KP_5 + + + ) + +121  + #SDLK_KP6 + +SDLK_KP_6 + + + ) + +122  + #SDLK_KP7 + +SDLK_KP_7 + + + ) + +123  + #SDLK_KP8 + +SDLK_KP_8 + + + ) + +124  + #SDLK_KP9 + +SDLK_KP_9 + + + ) + +126  + #SDLK_PRINT + +SDLK_PRINTSCREEN + + + ) + +130 #ifde +WANT_WMINFO + + +131  +SDL_COMPAT_GWMInfo +( +SDL_SysWMfo + * +fo +); + +134  +SDL_COMPAT_WM_SIc +( +SDL_Sur + * +ic +, +Ut8 + * +mask +); + +135  +SDL_COMPAT_WM_SCti +(cڡ * +t +, cڡ * +ic +); + +136 +SDL_bo + +SDL_COMPAT_IsAAive +( +SDL_Evt +* +evt +); + +137 +SDL_bo + +SDL_COMPAT_IsAFocud +( +SDL_Evt +* +evt +); + +138  +SDL_COMPAT_EbKeyRt +( +day +,  +rv +); + +139  +SDL_COMPAT_EbUNICODE +( +ab +); + +140 +SDL_COMPAT_KEY + +SDL_COMPAT_GKeysymUnicode +( +SDL_KEYSYM + +keysym +); + +141 +SDL_COMPAT_KEY + +SDL_COMPAT_TneUnicode +( +SDL_KEYSYM + +keysym +); + +142  +SDL_COMPAT_Fl +( +SDL_Sur +* +sn +); + +143  +SDL_COMPAT_GBsPPix +(); + +144  +SDL_COMPAT_WM_ToggFuSn +( +SDL_Sur + * +sur +); + +145 +SDL_Sur +* +SDL_COMPAT_SVideoMode +( +width +,  +height +,  +bpix +, +Ut32 + +ags +); + +146  +SDL_COMPAT_SP +( +SDL_Sur + * +sur +,  +ags +, +SDL_C + * +cs +,  +fc +,  +ncs +); + +147  +SDL_COMPAT_SEvtFr +( +SDL_EvtFr + +fr +); + +148  +SDL_COMPAT_Qu +(); + +149  +SDL_COMPAT_TakeSnsh +(* +ame +); + +151 #ifde +__OPENGL_AVAILABLE__ + + +152  +SDL_COMPAT_GL_SwBufrs +(); + +155  +r_tf +* +fmt +, ... ); + + @tape.c + +21  + ~ + +22  + ~ + +23  + ~ + +25  + ~"syem.h +" + +26  + ~"6502.h +" + +27  + ~"v.h +" + +28  + ~"8912.h +" + +29  + ~"gui.h +" + +30  + ~"disk.h +" + +31  + ~"mڙ.h +" + +32  + ~"6551.h +" + +33  + ~"mache.h +" + +34  + ~"joyick.h +" + +35  + ~"feq.h +" + +36  + ~".h +" + +37  + ~"msgbox.h +" + +39  +fe +[], +th +[]; + +40 +SDL_bo + +esh +; + +41  + gtmame +[4096]; + +42  +fmp +[]; + +46  + $_pup + +mache + * +ic + ) + +48  +tmp +[40]; + +50 if! +ic +-> +me +[0] ) + +53 + `do_pup + +ic +, "\x0f\x10\x13" ); + +58 + `rtf + +tmp +, "\x0f\x10""%%-16s", +ic +-> +m + ? 18 : 17, oric-> +me + ); + +59 + `do_pup + +ic +, +tmp + ); + +60 + } +} + +62  + $toggˏp + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ) + +64  +thd +[] = { 'O', 'R', 'T', 0 }; + +67 if +ic +-> +p + ) + +69 + `fo + +ic +-> +p + ); + +70 +ic +-> +p + = +NULL +; + +71 +mem +-> +me + = "Saveape output..."; + +72 +esh + = +SDL_TRUE +; + +77 if! + `feque + +ic +, "Ctuouut", +th +, +tmame +, +FR_TAPESAVEORT + ) ) + +82 if +tmame +[0] == 0 ) ; + +86 if( + ` +( +tmame +)>3&& ( + `rcmp +(&tmptapename[strlen(tmptapename)-4], ".tap")==0) ) + +87 +tmame +[ + ` +(tmptapename)-4] = 0; + +90 if( + ` +( +tmame +)<4|| ( + `rcmp +(&tmptapename[strlen(tmptapename)-4], ".ort")!=0) ) + +91 + `t +( +tmame +, ".ort", 4095); + +92 +tmame +[4095] = 0; + +94 + `joth + +th +, +tmame + ); + +97 +ic +-> +p + = + `fݒ + +fmp +, "wb" ); + +98 if! +ic +-> +p + ) + +101 + `msgbox + +ic +, +MSGBOX_OK +, "Unableo create file" ); + +106 + `fwre + +thd +, 4, 1, +ic +-> +p +); + +109 +ic +-> +pcou + = -1; + +110 +ic +-> +ab + = (ic-> +v +. +b +&ic->v. +ddrb +)>>7; + +113 +mem +-> +me + = "Stopapeecording"; + +114 +esh + = +SDL_TRUE +; + +115 + } +} + +126  + $_tup_hd + +mache + * +ic + ) + +128  +i +; + +130 +ic +-> +dupbys + = 0; + +131 +ic +-> +hdnd + = 0; + +133 if +ic +-> +buf +[ic-> +offs +] != 0x16 ) + +137  +i +=0; +ic +-> +buf +[ic-> +offs ++i]==0x16; i++ ) + +139 if( +ic +-> +offs ++ +i +>ic-> +n + ) + +142 if +i + < 3 ) || ( +ic +-> +buf +[ic-> +offs ++i] != 0x24 ) ) + +144 +i +++; + +145 if( +ic +-> +offs ++ +i ++9>ic-> +n + ) + +147 +i ++=9; + +148  +ic +-> +buf +[ic-> +offs ++ +i +] != 0 ) + +150 if( +ic +-> +offs ++ +i +>ic-> +n + ) + +152 +i +++; + +154 +i +++; + +156 +ic +-> +dupbys + = 80; + +157 +ic +-> +hdnd + = oric-> +offs ++ +i +; + +158 + } +} + +161  + $_bchge + +v + *via ) + +163  +mache + * +ic + = +v +->oric; + +164  +bufr +[4], +b +, +bufwre +; + +165  +cou +; + +168 if! +ic +-> +p + ) ; + +171 if +ic +-> +p + =ic-> +tvf + ) ; + +173 +b + = ( +v +-> +b + & v-> +ddrb +) >> 7; + +174 if +b + = +ic +-> +ab + ) ; + +176 +ic +-> +ab + = +b +; + +179 if +ic +-> +pcou + < 0 ) + +182 +ic +-> +pcou + = 0; + +183 + `utc + +b +, +ic +-> +p + ); + +187 +cou + = ( +ic +-> +pcou +>>1); + +189 if +cou + < 0xfc ) + +191 +bufr +[0] = +cou +; + +192 +bufwre + = 1; + +194 if +cou + < 0x100 ) + +196 +bufr +[0] = 0xfc; + +197 +bufr +[1] = +cou +; + +198 +bufwre + = 2; + +200 if +cou + < 0x10000 ) + +202 +bufr +[0] = 0xfd; + +203 +bufr +[1] = ( +cou +>>8)&0xff; + +204 +bufr +[2] = +cou +&0xff; + +205 +bufwre + = 3; + +209 +bufr +[0] = 0xfd; + +210 +bufr +[1] = 0xff; + +211 +bufr +[2] = 0xff; + +212 +bufwre + = 3; + +215 + `fwre + +bufr +, +bufwre +, 1, +ic +-> +p + ); + +216 +ic +-> +pcou + = 0; + +217 + } +} + +221  + $_tm + +mache + * +ic +, +SDL_bo + +m + ) + +223 if +m + = +ic +-> +m + ) + +227 +esh + = +SDL_TRUE +; + +230 if! +ic +-> +turbo + ) || ( !ic-> +pch__avaab + ) ) + +232 if! +ic +-> +w + ) || ( oric-> +offs + < oric-> +nڿwd + ) ) + +236 if! +m + ) + +238 if +ic +-> +b + > 0 ) + +239 +ic +-> +offs +++; + +240 +ic +-> +b + = 0; + +247 if +m + ) && + +248 +ic +-> +buf + ) && + +249 +ic +-> +offs + < oric-> +n + ) && + +250 +ic +-> +buf +[ic-> +offs +] == 0x16 ) ) + +252 + `_tup_hd +( +ic +); + +258 +ic +-> +m + = +m +; + +259 if +ic +-> +me +[0] ) + `_pup +( oric ); + +260 + } +} + +263  + $_eje + +mache + * +ic + ) + +265 if +ic +-> +buf + ) + ` +( oric->tapebuf ); + +266 +ic +-> +buf + = +NULL +; + +267 +ic +-> +n + = 0; + +268 +ic +-> +me +[0] = 0; + +269 + `_pup + +ic + ); + +270 +esh + = +SDL_TRUE +; + +271 + } +} + +273  + $_xt_w_cou + +mache + * +ic + ) + +275  +n +; + +276  +nڿwd +; + +278 if +ic +-> +offs + >ic-> +n + ) + +280 if +ic +-> +nڿwd + !ic-> +n + ) + +281 +ic +-> +hd + = 3; + +285 +n + = +ic +-> +buf +[ic-> +offs +++]; + +286 i( +n + < 0xfc) + +288 +ic +-> +cou + = +n +<<1; + +292  +n +) + +295 if +ic +-> +offs + >(ic-> +n +-1) ) + +297 +ic +-> +offs + = oric-> +n +; + +298 +ic +-> +hd + = 3; + +302 +nڿwd + = (( +ic +-> +buf +[ic-> +offs +]<<8)|oric->tapebuf[oric->tapeoffs+1]) + oric->tapeoffs+2; + +303 if +nڿwd + > +ic +-> +n + ) + +305 +ic +-> +offs + = oric-> +n +; + +306 +ic +-> +hd + = 3; + +310 +ic +-> +nڿwd + =onrawend; + +311 +ic +-> +offs + += 2; + +312 +ic +-> +b + = 0; + +313 +ic +-> +cou + = 2; + +314 +ic +-> +out + = 0; + +315 + `_tup_hd + +ic + ); + +319 if +ic +-> +offs + >ic-> +n + ) + +321 +ic +-> +hd + = 3; + +325 +ic +-> +cou + = oric-> +buf +[ic-> +offs +++] << 1; + +329 if +ic +-> +offs + >(ic-> +n +-1) ) + +331 +ic +-> +offs + = oric-> +n +; + +332 +ic +-> +hd + = 3; + +336 +ic +-> +cou + = (ic-> +buf +[ic-> +offs +]<<9)|(oric->tapebuf[oric->tapeoffs+1]<<1); + +337 +ic +-> +offs + += 2; + +342 +ic +-> +offs + = oric-> +n +; + +343 +ic +-> +hd + = 3; + +344 + } +} + +347  + $_wd + +mache + * +ic + ) + +349 +ic +-> +nڿwd + = 0; + +350 if +ic +-> +w + ) + +352 +ic +-> +out + = oric-> +buf +[4]; + +353 + `v_wre_CB1 +& +ic +-> +v +, oric-> +out + ); + +355 +ic +-> +offs + = 5; + +356 + `_xt_w_cou + +ic + ); + +360 +ic +-> +offs + = 0; + +361 +ic +-> +b + = 0; + +362 +ic +-> +cou + = 2; + +363 +ic +-> +out + = 0; + +364 +ic +-> +dupbys + = 0; + +366 if +ic +-> +buf + ) + +367 + `_tup_hd + +ic + ); + +369 +ic +-> +hd + = 0; + +370 +ic +-> +day + = 0; + +371 +esh + = +SDL_TRUE +; + +372 + } +} + +377  + $xt_t_vue +* +tda +, * +offt +,  +d +, +SDL_bo + * +ypc + ) + +379  +v +=0, +sk +; + +381 (* +offt +< +d +) + +383  +tda +[* +offt +]) + +386 i((* +offt +>( +d +-1))  0; + +387 +v + = +tda +[(* +offt +)+1]; + +388 (* +offt +) += 2; + +389  +v +; + +392 i((* +offt +>( +d +-2))  0; + +393 +v + = ( +tda +[(* +offt +)+1]<<8)|ortdata[(*offset)+2]; + +394 (* +offt +) += 3; + +395  +v +; + +401 i((* +offt +>( +d +-2))  0; + +402 +sk + = ( +tda +[(* +offt +)+1]<<8)|ortdata[(*offset)+2]; + +403 (* +offt +)+=3; + +404 i((* +offt +>( +d +- +sk +))  0; + +405 (* +offt +)+= +sk +; + +406 (* +ypc + +SDL_TRUE +; + +410  +tda +[(* +offt +)++]; + +415 + } +} + +419 + mTAPSEC_STATE_SEARCH + = 0, + +420 + mTAPSEC_STATE_LEADER +, + +421 + mTAPSEC_STATE_FINDHEADER +, + +422 + mTAPSEC_STATE_HEADER +, + +423 + mTAPSEC_STATE_FILENAME +, + +424 + mTAPSEC_STATE_FINDDATA +, + +425 + mTAPSEC_STATE_DATA + + +428  + $vidby +( +accum +) + +430  +i +, +ry + = 0; + +431 i(( +accum +&3)!=1)  0; + +432  +i +=4; i!=0x800; i<<=1) + +433 i( +accum +& +i + +ry + ^= 1; + +434  +ry +; + +435 + } +} + +438  + $pis +* +tbuf +,  +tbu +, * +sch +, +SDL_bo + +ow + ) + +440  +t_offs +, +b +, +t_v +, +cyccou +; + +441  +accum +, +e +, +thisb +, +adt +=0, +adcou +=0; + +442  +ϡ_offts +[20], +i +, +bcou +, +pbys +=0; + +443  +da_bys +=0, +ow0s +=0, +ow1s +=0; + +444 +SDL_bo + +ypc + = +SDL_FALSE +; + +446 +t_offs + = 4; + +447 +b + = +tbuf +[ +t_offs +++]; + +448 +cyccou + = 0; + +449 +e + = +TAPSEC_STATE_SEARCH +; + +450 +accum + = 0; + +451 +bcou + = 0; + +453  +i +=0; i<20; i++) + +454 +ϡ_offts +[ +i +] = 5; + +457  +t_offs + < +tbu +) + +460  +i +=0; i<19; i++) + +461 +ϡ_offts +[ +i +] =ast_offsets[i+1]; + +462 +ϡ_offts +[19] = +t_offs +; + +464 +t_v + = + `xt_t_vue +( +tbuf +, & +t_offs +, +tbu +, & +ypc +); + +466 i( +t_v + < 1 +tbu +; + +469 +cyccou + + +t_v +; + +472 +b + ^= 1; + +475 i( +b +) + +478 i( +cyccou + < 100) + +482 +thisb + = + `TIME_TO_BIT +( +cyccou +); + +485 i( +thisb + == -1) + +493 +e + = +TAPSEC_STATE_SEARCH +; + +494 +cyccou + = 0; + +495 +accum + = 0; + +496 +ow1s + = 0; + +497 +ow0s + = 0; + +502 i( +ow +) + +504 i( +thisb +==1) + +506 +ow1s +++; + +507 +ow0s +=0; + +509 i( +ow1s + != 2) + +511 i( +ow1s + >= 8) + +512 +ow1s + = 0; + +513 +cyccou +=0; + +519 +ow0s +++; + +520 +ow1s +=0; + +522 i( +ow0s + != 2) + +524 i( +ow0s + >= 4) + +525 +ow0s + = 0; + +526 +cyccou +=0; + +533 +accum + = (accum>>1| ( +thisb +<<10); + +536  +e +) + +538  +TAPSEC_STATE_SEARCH +: + +540 i(( +accum +&0x7fe) == 0x58) + +544 +adt + = +ϡ_offts +[8]; + +545 +adcou + = 1; + +546 +e + = +TAPSEC_STATE_LEADER +; + +547 +bcou + = 0; + +549 i( + `vidby +( +accum +)) + +556  +TAPSEC_STATE_LEADER +: + +557 +bcou + = (bitcount+1)%14; + +558 i(( +bcou +==13)&& + `vidby +( +accum +)) bitcount = 0; + +559 i(! +bcou +) + +563 i(( +accum +&0x7fe) != 0x58) + +566 +e + = +TAPSEC_STATE_SEARCH +; + +567 +cyccou + = 0; + +571 +adcou +++; + +572 i( +adcou +==4) + +574 +e + = +TAPSEC_STATE_FINDHEADER +; + +580  +TAPSEC_STATE_FINDHEADER +: + +581 +bcou + = (bitcount+1)%14; + +582 i(( +bcou +==13)&& + `vidby +( +accum +)) bitcount = 0; + +583 i(! +bcou +) + +587 i(( +accum +&0x7fe) == 0x490) + +591 +sch +[0] = 0x16; + +592 +sch +[1] = 0x16; + +593 +sch +[2] = 0x16; + +594 +sch +[3] = 0x24; + +595 +pbys + = 4; + +596 +e + = +TAPSEC_STATE_HEADER +; + +601  +TAPSEC_STATE_HEADER +: + +602 +bcou + = (bitcount+1)%14; + +603 i(( +bcou +==13)&& + `vidby +( +accum +)) bitcount = 0; + +604 i(! +bcou +) + +608 +sch +[ +pbys +++] = ( +accum +>>2)&0xff; + +609 i( +pbys + == 13) + +611  +ld_t +, +ld_d +; + +613 +ld_t + = ( +sch +[10]<<8)|scratch[11]; + +614 +ld_d + = ( +sch +[ 8]<<8)|scratch[ 9]; + +619 i( +ld_d + < +ld_t +) + +621 +e + = +TAPSEC_STATE_SEARCH +; + +622 +cyccou + = 0; + +626 +da_bys + = ( +ld_d +- +ld_t +)+1; + +627 +e + = +TAPSEC_STATE_FILENAME +; + +635  +TAPSEC_STATE_FILENAME +: + +636 +bcou + = (bitcount+1)%14; + +637 i(( +bcou +==13)&& + `vidby +( +accum +)) bitcount = 0; + +638 i(! +bcou +) + +642 +sch +[ +pbys +++] = ( +accum +>>2)&0xff; + +643 i( +sch +[ +pbys +-1] == 0) + +645 +e + = +TAPSEC_STATE_FINDDATA +; + +650  +TAPSEC_STATE_FINDDATA +: + +652 i( + `vidby +( +accum +)) + +656 +sch +[ +pbys +++] = ( +accum +>>2)&0xff; + +657 +da_bys +--; + +658 +bcou +=0; + +659 +e + = +TAPSEC_STATE_DATA +; + +663  +TAPSEC_STATE_DATA +: + +664 +bcou + = (bitcount+1)%14; + +665 i(( +bcou +==13)&& + `vidby +( +accum +)) bitcount = 0; + +666 i(! +bcou +) + +668 +sch +[ +pbys +++] = ( +accum +>>2)&0xff; + +669 +da_bys +--; + +674 i( +da_bys + < 0) + +676 +e + = +TAPSEC_STATE_SEARCH +; + +680 i( +da_bys + > 0) + +683 i((! +ypc +&& ( +adt + < 512)) + +684 +adt + = 5; + +687 +tbuf +[ +adt +++] = 0xff; + +688 +tbuf +[ +adt +++] = ( +pbys +>>8)&0xff; + +689 +tbuf +[ +adt +++] = ( +pbys +&0xff); + +690 + `memy +(& +tbuf +[ +adt +], +sch +, +pbys +); + +691 +adt + + +pbys +; + +692 + `memmove +(& +tbuf +[ +adt +], &tbuf[ +t_offs +], +tbu +-ort_offs); + +693 +tbu + -( +t_offs +- +adt +); + +694 +t_offs + = +adt +; + +695 +e + = +TAPSEC_STATE_SEARCH +; + +696 +accum + = 0; + +697 +ypc + = +SDL_TRUE +; + +706 +cyccou + = 0; + +710  +tbu +; + +711 + } +} + +717  +le + sigd  + $gsmp +(* +buf +, +SDL_bo + +is8b +) + +719  +is8b + ? (()* +buf +)-128 : ()((buf[1]<<8)|buf[0]); + +720 + } +} + +727 +SDL_bo + + $wav_cvt + +mache + * +ic + ) + +730 * +p += +ic +-> +buf +, * +da += +NULL +, * +tbuf +=NULL; + +731  +i +, +j +, +k +, +l +, +chunkn +, +bps +=0, +eq +=0, +smpd +=0, +d +=0, +܎ +; + +732 sigd  +smaxl +, +sml +, +smaxr +, +smr +, +dcoffs +=0, +dcoffv +; + +733 sigd * +ϡsmps + = +NULL +; + +734 sigd  +smp +=0; + +736  +s +, +cou +, +pcou +; + +737 +SDL_bo + +eo + = +SDL_FALSE +, +fmt + = SDL_FALSE, +uright + = SDL_FALSE; + +740 +i + = 12; + +741 (! +fmt +|| (! +da +)) + +744 i( +i + >( +ic +-> +n +-8) +SDL_FALSE +; + +747 +chunkn + = ( +p +[ +i ++7]<<24)|(p[i+6]<<16)|(p[i+5]<<8)|p[i+4]; + +750 i(( +i ++ +chunkn ++8> +ic +-> +n +) + +751  +SDL_FALSE +; + +754 i( + `memcmp +(& +p +[ +i +], "fmt ", 4) == 0) + +757 i(( +chunkn + !16|| ((( +p +[ +i ++9]<<8)|p[i+8])!=1)) + +758  +SDL_FALSE +; + +761 ( +p +[ +i ++11]<<8)|(p[i+10])) + +763 1: +eo + = +SDL_FALSE +; ; + +764 2: +eo + = +SDL_TRUE +; ; + +765 :  +SDL_FALSE +; ; + +769 +eq + = ( +p +[ +i ++15]<<24)|(p[i+14]<<16)|(p[i+13]<<8)|p[i+12]; + +770 if! +eq + )  +SDL_FALSE +; + +773 +smpd + = ( +p +[ +i ++21]<<16)|p[i+20]; + +776 +bps + = ( +p +[ +i ++23]<<16)|p[i+22]; + +777 i(( +bps +!=8)&&(bps!=16) +SDL_FALSE +; + +780 +bps + /= 8; + +782 +fmt + = +SDL_TRUE +; + +784 i( + `memcmp +(& +p +[ +i +], "data", 4) == 0) + +786 +da + = & +p +[ +i ++8]; + +787 +d + = +chunkn +; + +791 +i + + +chunkn ++8; + +796 +smaxl + = -70000; + +797 +sml + = 70000; + +798 +smaxr + = -70000; + +799 +smr + = 70000; + +801  +i +=0; i< +d +; i+= +smpd +) + +803 +smp + = + `gsmp +(& +da +[ +i +], +bps +==1); + +804 i( +smp + < +sml +) sminl = smp; + +805 i( +smp + > +smaxl +) smaxl = smp; + +807 i( +eo +) + +809 +smp + = + `gsmp +(& +da +[ +i ++ +bps +], bps==1); + +810 i( +smp + < +smr +) sminr = smp; + +811 i( +smp + > +smaxr +) smaxr = smp; + +816 i(( +eo +&& (( +smaxr +- +smr +)>( +smaxl +- +sml +))) + +818 +uright + = +SDL_TRUE +; + +822 +uright + = +SDL_FALSE +; + +825 +dcoffv + = +eq + / 700; + +826 i( +dcoffv +) + +828 +ϡsmps + = + `mloc +( +dcoffv + * ()); + +829 i( +ϡsmps + + `memt +asmps, 0, +dcoffv + * ()); + +831 +dcoffv +--; + +834 +j + = 0; + +835  +i +=0; i< +d +; i+= +smpd +) + +837 i( +uright +) + +838 +smp + = + `gsmp +(& +da +[ +i ++ +bps +], bps==1); + +840 +smp + = + `gsmp +(& +da +[ +i +], +bps +==1); + +842 i( +ϡsmps +) + +844 +smaxl + = +smp +; + +845 +sml + = +smp +; + +847  +k +=0; k< +dcoffv +; k++) + +849 +ϡsmps +[ +k +] =astsmps[k+1]; + +851 i( +ϡsmps +[ +k +] < +sml +) sminl =astsmps[k]; + +852 i( +ϡsmps +[ +k +] > +smaxl +) smaxl =astsmps[k]; + +854 +dcoffs + = (( +smaxl +- +sml +)/2)+sminl; + +857 i( +j + > +ic +-> +n +) + +864 +ic +-> +buf +[ +j +++] = ( +smp +> +dcoffs +) ? 1 : 0; + +871 +s + = 500000 / (() +eq +); + +874 +܎ + = 5; + +875 +i + = +ic +-> +buf +[0]; + +876 +cou + = 0.0f; + +877 +pcou + = 0.0f; + +878  +k +=1; k< +j +; k++) + +880 i( +ic +-> +buf +[ +k +] ! +i +) + +882 +i + = +ic +-> +buf +[ +k +]; + +883 i((() +cou +) < 1) + +886 i( +܎ +>5) ortlen--; + +887 +cou + + +pcou +; + +889 i((() +cou +) < 0xfc) + +891 +܎ +++; + +892 +pcou + = +cou +; + +893 +cou + = 0.0f; + +895 i((() +cou +) < 0x100) + +897 +܎ ++=2; + +898 +pcou + = +cou +; + +899 +cou + = 0.0f; + +903 +܎ ++=3; + +904 +pcou + = +cou +; + +905 +cou + = 0.0f; + +908 +cou ++= +s +; + +911 + ` + +ϡsmps + ); + +913 +tbuf + = + `mloc +( +܎ +); + +914 i(! +tbuf + +SDL_FALSE +; + +917 + `memy +( +tbuf +, "ORT\0", 4); + +920 +i + = +ic +-> +buf +[0]; + +921 +tbuf +[4] = +i +; + +922 +cou + = 0.0f; + +923 +pcou + = 0.0f; + +924 +l + = 5; + +925  +k +=1; k< +j +; k++) + +927 i( +ic +-> +buf +[ +k +] ! +i +) + +929 +i + = +ic +-> +buf +[ +k +]; + +930 i((() +cou +) < 1) + +933 i( +l +==5) + +934 +tbuf +[4] = +i +; + +936 +l +--; + +937 +cou + + +pcou +; + +939 i((() +cou +) < 0xfc) + +941 +tbuf +[ +l +++] = +cou +; + +942 +pcou + = +cou +; + +943 +cou + = 0.0f; + +945 i((() +cou +) < 0x100) + +947 +tbuf +[ +l +++] = 0xfc; + +948 +tbuf +[ +l +++] = +cou +; + +949 +pcou + = +cou +; + +950 +cou + = 0.0f; + +954 +tbuf +[ +l +++] = 0xfd; + +955 +tbuf +[ +l +++] = ((() +cou +)>>8)&0xff; + +956 +tbuf +[ +l +++] = (() +cou +)&0xff; + +957 +pcou + = +cou +; + +958 +cou + = 0.0f; + +961 +cou ++= +s +; + +966 +܎ + = + `pis +( +tbuf +, on, +ic +-> +buf +, +SDL_FALSE +); + +967 +܎ + = + `pis +( +tbuf +, on, +ic +-> +buf +, +SDL_TRUE +); + +970 + ` +( +ic +-> +buf +); + +971 +ic +-> +buf + = +tbuf +; + +972 +ic +-> +n + = +܎ +; + +974  +SDL_TRUE +; + +975 + } +} + +978 +SDL_bo + + $_ld_p + +mache + * +ic +, * +ame + ) + +980 +FILE + * +f +; + +983 +f + = + `fݒ + +ame +, "rb" ); + +984 if! +f + )  +SDL_FALSE +; + +987 + `_eje + +ic + ); + +990 + `fek + +f +, 0, +SEEK_END + ); + +991 +ic +-> +n + = () + `l + +f + ); + +992 + `fek + +f +, 0, +SEEK_SET + ); + +994 if +ic +-> +n + <= 4 ) + +996 + `fo + +f + ); + +997  +SDL_FALSE +; + +1001 +ic +-> +buf + = + `mloc +ic-> +n ++1 ); + +1002 if! +ic +-> +buf + ) + +1004 + `fo + +f + ); + +1005 +ic +-> +n + = 0; + +1006  +SDL_FALSE +; + +1009 if + `d +& +ic +-> +buf +[0], oric-> +n +, 1, +f + ) != 1 ) + +1011 + `fo + +f + ); + +1012 + `_eje + +ic + ); + +1013  +SDL_FALSE +; + +1016 + `fo + +f + ); + +1019 i(( +ic +-> +n + >= 36) && + +1020 ( + `memcmp +( +ic +-> +buf +, "RIFF", 4) == 0) && + +1021 ( + `memcmp +( +ic +-> +buf ++8, "WAVE", 4) == 0)) + +1023 i(! + `wav_cvt + +ic + )) + +1025 + `msgbox + +ic +, +MSGBOX_OK +, "Invalid wav file" ); + +1026 + `_eje + +ic + ); + +1027  +SDL_FALSE +; + +1030 +ic +-> +w + = +SDL_TRUE +; + +1033 i( + `memcmp +( +ic +-> +buf +, "ORT\0", 4) == 0) + +1035 +ic +-> +w + = +SDL_TRUE +; + +1038 i( + `memcmp +( +ic +-> +buf +, "\x16\x16\x16", 3) == 0) + +1040 +ic +-> +w + = +SDL_FALSE +; + +1044 +ic +-> +n +++; + +1049 + `_eje + +ic + ); + +1050 + `msgbox + +ic +, +MSGBOX_OK +, "Unrecognisedape format" ); + +1051  +SDL_FALSE +; + +1055 + `_wd + +ic + ); + +1058 if + ` + +ame + ) > 31 ) + +1060 + `y + +ic +-> +me +, & +ame +[ + ` +(fname)-31], 32 ); + +1061 +ic +-> +me +[0] = 22; + +1063 + `y + +ic +-> +me +, +ame +, 32 ); + +1065 +ic +-> +me +[31] = 0; + +1068 + `_pup + +ic + ); + +1070  +SDL_TRUE +; + +1071 + } +} + +1073  + $_auto + +mache + * +ic + ) + +1075 * +od +; + +1076  +i +; + +1077 +SDL_bo + +_found +; + +1079 if + `cmp +(*)& +ic +-> +mem +[ic-> +pch_fd_gme_addr +], oric-> +ϡfe +, 16 ) == 0 ) + +1080 +ic +-> +mem +[ic-> +pch_fd_gme_addr +] = 0; + +1083 + `ry + +fe +, +ic +-> +ϡfe + ); + +1084 +i + = () + ` +( +fe +); + +1086 +od + = + `gcwd + +NULL +, 0 ); + +1087 + `chd + +th + ); + +1088 +_found + = + `_ld_p + +ic +, +fe + ); + +1089 if! +_found + ) + +1092 + `ry +& +fe +[ +i +], ".tap" ); + +1093 +_found + = + `_ld_p + +ic +, +fe + ); + +1095 if! +_found + ) + +1098 + `ry +& +fe +[ +i +], ".ort" ); + +1099 + `_ld_p + +ic +, +fe + ); + +1102 if +ic +-> +buf + ) + +1105 +ic +-> +ϡfe +[0] = 0; + +1108 + `chd + +od + ); + +1109 + ` + +od + ); + +1110 + } +} + +1112  + $__vch + +mache + * +ic + ) + +1114 if! +ic +-> +tvf + ) ; + +1116 if +ic +-> +tvf + =ic-> +p + ) + +1118  +bufda +[2]; + +1119 + `fek + +ic +-> +tvf +, oric-> +pvoffs +, +SEEK_SET + ); + +1120 +bufda +[0] = ( +ic +-> +pvbys +>>8)&0xff; + +1121 +bufda +[1] = +ic +-> +pvbys +&0xff; + +1122 + `fwre + +bufda +, 2, 1, +ic +-> +tvf + ); + +1123 +ic +-> +pvoffs + = 0; + +1124 +ic +-> +pvbys + = 0; + +1128 + `fo + +ic +-> +tvf + ); + +1131 +ic +-> +tvf + = +NULL +; + +1132 + } +} + +1135  + $_tches + +mache + * +ic + ) + +1137 +St32 + +i +, +j +; + +1139 if +ic +-> +rom + ) + +1141 if +ic +-> +pch_fd_avaab + ) + +1146 if +ic +-> +u +. +lc + =ic-> +pch_fd_d_gme_pc + ) || + +1147 +ic +-> +u +. +lc + =ic-> +pch_fd__gme_pc + ) ) + +1150  +i +=0; i<16; i++ ) + +1152 +j + = +ic +-> +u +. + `ad +&ic->u, oric-> +pch_fd_gme_addr ++ +i + ); + +1153 if! +j + ) ; + +1154 +ic +-> +ϡfe +[ +i +] = +j +; + +1156 +ic +-> +ϡfe +[ +i +] = 0; + +1158 if +ic +-> +u +. + `ad +&ic->u, oric-> +pch_fd_gme_addr + ) != 0 ) && + +1159 +ic +-> +auto + ) ) + +1163 if! +ic +-> +buf + ) || + +1164 +ic +-> +offs + >ic-> +n + -1 ) || + +1165 +i + > 3 ) && ( + `rcmp +& +ic +-> +ϡfe +[i-4], ".tap" ) == 0 ) ) || + +1166 +i + > 3 ) && ( + `rcmp +& +ic +-> +ϡfe +[i-4], ".ort" ) == 0 ) ) || + +1167 +i + > 3 ) && ( + `rcmp +& +ic +-> +ϡfe +[i-4], ".wav" ) == 0 ) ) ) + +1169 + `_auto + +ic + ); + +1170 +ic +-> +u +. + `wre +&ic->u, oric-> +pch_fd_gme_addr +, 0 ); + +1174 if +ic +-> +u +. +lc + =ic-> +pch_fd_cve_gme_pc + ) || + +1175 +ic +-> +u +. +lc + =ic-> +pch_fd_e_gme_pc + ) ) && + +1176 ! +ic +-> +p + ) || ( oric-> +turbo + ) ) ) + +1179 if +ic +-> +tvf + ) + +1180 + `__vch + +ic + ); + +1183 if +ic +-> +p + ) + +1185 +ic +-> +tvf + = oric-> +p +; + +1186 if +ic +-> +pcou + < 0 ) + +1187 + `utc +0, +ic +-> +p + ); + +1188 + `utc +0xff, +ic +-> +p + ); + +1189 +ic +-> +pvoffs + = () + `l +(ic-> +p +); + +1190 + `utc +0x00, +ic +-> +p + ); + +1191 + `utc +0x00, +ic +-> +p + ); + +1192 +ic +-> +pvbys + = 0; + +1196 * +od + = +NULL +; + +1199  +i +=0; i<16; i++ ) + +1201 +j + = +ic +-> +u +. + `ad +&ic->u, oric-> +pch_fd_gme_addr ++ +i + ); + +1202 if! +j + ) ; + +1203 +tmame +[ +i +] = +j +; + +1205 +tmame +[ +i +] = 0; + +1208 if +tmame +[0] == 0 ) + +1210 if! + `feque + +ic +, "Savt؏", +th +, +tmame +, +FR_TAPESAVETAP + ) ) + +1211 +tmame +[0] = 0; + +1215 if +tmame +[0] ) + +1217 if( + ` +( +tmame +< 4|| ( + `rcmp +(&tmptapename[strlen(tmptapename)-4], ".tap") != 0) ) + +1219 i( + ` +( +tmame +)+5<(tmptapename)) + +1220 + `t +( +tmame +, ".p", + ` +(tmptapename)+5); + +1221 +tmame +[(tmptapename)-1] = 0; + +1225 +od + = + `gcwd + +NULL +, 0 ); + +1226 if +od + ) + +1228 + `chd + +th + ); + +1229 +ic +-> +tvf + = + `fݒ +( +tmame +, "wb"); + +1230 + `chd + +od + ); + +1231 + ` + +od + ); + +1235 if +ic +-> +u +. +lc + =ic-> +pch__cve_d_pc + ) || + +1236 +ic +-> +u +. +lc + =ic-> +pch__e_d_pc + ) ) + +1238 +SDL_bo + +jup + = ( +ic +-> +tvf + !ic-> +p +); + +1239 + `__vch + +ic + ); + +1240 if +jup + ) + +1243 + `tf + +fmp +, 4096+512+4-1, "\x0f\x10 Saved%s", +tmame + ); + +1244 +fmp +[31] = 0; + +1245 i( + ` +( +tmame +) > 20) + +1247 +fmp +[30] = '\x16'; + +1249 + `do_pup + +ic +, +fmp + ); + +1251 +tmame +[0] = 0; + +1255 if +ic +-> +pch__ve_avaab + ) && ( ( !ic-> +p + ) || ( oric-> +turbo + ) ) ) + +1257 if +ic +-> +u +. +lc + =ic-> +pch__putby_pc + ) + +1259 if +ic +-> +tvf + ) + +1261 + `utc + +ic +-> +u +. +a +, oric-> +tvf + ); + +1262 if +ic +-> +tvf + =ic-> +p + ) + +1263 +ic +-> +pvbys +++; + +1266 +ic +-> +u +. +lc + = oric-> +pch__putby_d_pc +; + +1267 +ic +-> +u +. +lc + = oric->u. + `ad +&ic->u, oric->u. +lc + ); + +1269 if +ic +-> +u +. +lc + =ic-> +pch__wrd_pc + ) + +1271 if +ic +-> +tvf + ) + +1273  +ad +[] = { 0x16, 0x16, 0x16, 0x16 }; + +1274 + `fwre + +ad +, 4, 1, +ic +-> +tvf + ); + +1275 if +ic +-> +tvf + =ic-> +p + ) + +1276 +ic +-> +pvbys + += 4; + +1279 +ic +-> +u +. +lc + = oric-> +pch__wrd_d_pc +; + +1280 +ic +-> +u +. +lc + = oric->u. + `ad +&ic->u, oric->u. +lc + ); + +1288 if! +ic +-> +buf + ) || ( !ic-> +m + ) ) + +1290 if +ic +-> +pch__avaab + ) && ( oric-> +turbo + ) && ( oric-> +rom + ) && ( oric-> +u +. +lc + =ic-> +pch__gsync_pc + ) ) + +1291 +ic +-> +turbo_syncack + = oric-> +u +. + +; + +1295 if +ic +-> +turbo_foff + ) && ( oric-> +pch__avaab + ) && ( oric-> +rom + ) && ( oric-> +u +. +lc + =ic-> +pch__gsync_d_pc + ) ) + +1296 +ic +-> +turbo_foff + = +SDL_FALSE +; + +1300 if( +ic +-> +w + ) && ( oric-> +offs + >ic-> +nڿwd + )) ; + +1302 if(! +ic +-> +buf + ) || ( oric-> +offs + >ic-> +n + )) ; + +1305 if +ic +-> +pch__avaab + ) && ( oric-> +turbo + ) && ( !ic-> +turbo_foff + ) && ( oric-> +rom + ) ) + +1307 +SDL_bo + +dosynch +; + +1309 +dosynch + = +SDL_FALSE +; + +1311 if +ic +-> +u +. +lc + =ic-> +pch__gsync_lo_pc + ) + +1320 if +ic +-> +turbo_syncack + == -1 ) + +1323 +ic +-> +turbo_foff + = +SDL_TRUE +; + +1328 +ic +-> +u +. + + = oric-> +turbo_syncack +; + +1329 +ic +-> +turbo_syncack + = -1; + +1330 +dosynch + = +SDL_TRUE +; + +1333 if +ic +-> +u +. +lc + =ic-> +pch__gsync_pc + ) || ( +dosynch + ) ) + +1336 if +ic +-> +buf +[ic-> +offs +] != 0x16 ) + +1341 +ic +-> +offs +++; + +1344 if +ic +-> +offs + >ic-> +n + ) + +1346 +esh + = +SDL_TRUE +; + +1349 }  +ic +-> +buf +[ic-> +offs +] != 0x16 ); + +1353 +ic +-> +u +. +lc + = oric-> +pch__gsync_d_pc +; + +1354 +ic +-> +u +. +lc + = oric->u. + `ad +(&ic->u, oric->u. +lc +); + +1358 if +ic +-> +u +. +lc + =ic-> +pch__adby_pc + ) + +1361 +ic +-> +u +. +a + = oric-> +buf +[ic-> +offs +++]; + +1364 +ic +-> +u +. +f_z + = oric->u. +a + == 0; + +1365 +ic +-> +u +. +f_c + = oric-> +pch__adby_ty + ? 1 : 0; + +1368 if +ic +-> +pch__adby_eby_addr + !-1 ) oric-> +u +. + `wre +&ic->u, oric->pch__adby_eby_addr, oric->u. +a + ); + +1369 if +ic +-> +pch__adby_ezo_addr + !-1 ) oric-> +u +. + `wre +( &oric->cpu, oric->pch_tt_readbyte_storezero_addr, 0x00 ); + +1372 +ic +-> +u +. +lc + = oric-> +pch__adby_d_pc +; + +1373 +ic +-> +u +. +lc + = oric->u. + `ad +&ic->u, oric->u. +lc + ); + +1374 if +ic +-> +offs + >ic-> +n + ) +esh + = +SDL_TRUE +; + +1377 + } +} + +1380  + $_ticktock + +mache + * +ic +,  +cyes + ) + +1382 +St32 + +j +; + +1385 if +ic +-> +p + ) && ( oric-> +pcou + != -1 ) ) + +1386 +ic +-> +pcou + + +cyes +; + +1398 if +ic +-> +vsynchack + ) + +1400 +j + = (0 = +ic +-> +vsync + || 260 < oric->vsync); + +1401 if +ic +-> +v +. +cb1 + ! +j + ) + +1402 + `v_wre_CB1 +& +ic +-> +v +, +j + ); + +1405 if +ic +-> +vsync + > 0 ) + +1407 +ic +-> +vsync + - +cyes +; + +1408 if +ic +-> +vsync + < 0 ) + +1409 +ic +-> +vsync + = 0; + +1413 if! +ic +-> +buf + ) || ( !ic-> +m + ) ) + +1417 if +ic +-> +offs + < 0 ) || ( oric->off>ic-> +n + ) ) + +1419 if +ic +-> +hd + > 2 ) + +1422 if +ic +-> +ϡfe +[0] ) && ( oric-> +auto + ) ) + +1424 + `_auto + +ic + ); + +1425 +ic +-> +ϡfe +[0] = 0; + +1431 if +ic +-> +pch__avaab + ) && ( oric-> +turbo + ) && ( !ic-> +turbo_foff + ) && ( oric-> +rom + ) && ( !ic-> +w + ) ) + +1434 if +ic +-> +hd + > 2 ) + +1437 if +ic +-> +hdnd + !0 ) && ( oric-> +offs + == oric->tapehdrend ) ) + +1439 +ic +-> +day + = 1281; + +1440 +ic +-> +hdnd + = 0; + +1445 if +ic +-> +cou + > +cyes + ) + +1447 +ic +-> +cou + - +cyes +; + +1448 if +ic +-> +day + > 0 ) + +1450 +ic +-> +day + - +cyes +; + +1451 if +ic +-> +day + < 0 ) + +1452 +ic +-> +day + = 1; + +1458 +ic +-> +out + ^= 1; + +1459 if! +ic +-> +vsynchack + ) + +1462 if +ic +-> +noi + ) + +1464 + `ay_lockaudio +& +ic +-> +ay + ); + +1465 if +ic +-> +ay +. +do_logcye_t + ) + +1467 +ic +-> +ay +. +logcye + = oric->ay. +wlogcye +; + +1468 +ic +-> +ay +. +do_logcye_t + = +SDL_FALSE +; + +1470 if +ic +-> +ay +. +ogged + < +TAPELOG_SIZE + ) + +1472 +ic +-> +ay +. +log +[ic->ay. +ogged + ]. +cye + = oric->ay. +logcye +; + +1473 +ic +-> +ay +. +log +[ic->ay. +ogged +++]. +v + = oric-> +out +; + +1478 + `v_wre_CB1 +& +ic +-> +v +, oric-> +out + ); + +1481 if +ic +-> +day + > 0 ) + +1483 +ic +-> +day + - +cyes +; + +1484 if +ic +-> +day + <= 0) + +1486 if +ic +-> +b + == 1 ) + +1487 +ic +-> +day + = 1; + +1489 +ic +-> +day + = 0; + +1491 +ic +-> +cou + = +TAPE_1_PULSE +; + +1495 if +ic +-> +offs + >ic-> +n + ) + +1497  +ic +-> +hd + ) + +1499 0: +ic +-> +cou + = +TAPE_1_PULSE +; ; + +1500 1: +ic +-> +cou + = 0x36*2; ; + +1502 +ic +-> +hd +++; + +1503 +esh + = +SDL_TRUE +; + +1508 if +ic +-> +w + ) + +1511 if +ic +-> +offs + >ic-> +nڿwd + ) + +1513 + `_xt_w_cou + +ic + ); + +1514 if +ic +-> +hd + > 2 ) + +1515 +esh + = +SDL_TRUE +; + +1522 if +ic +-> +out + ) + +1524  +ic +-> +b + ) + +1527 +ic +-> +time + = +TAPE_1_PULSE +; + +1531 +ic +-> +time + = +TAPE_0_PULSE +; + +1532 +ic +-> +ry + = 1; + +1536 if +ic +-> +buf +[ic-> +offs +]&(1<<(ic-> +b +-2)) ) + +1538 +ic +-> +time + = +TAPE_1_PULSE +; + +1539 +ic +-> +ry + ^= 1; + +1541 +ic +-> +time + = +TAPE_0_PULSE +; + +1546 if +ic +-> +ry + ) + +1547 +ic +-> +time + = +TAPE_1_PULSE +; + +1549 +ic +-> +time + = +TAPE_0_PULSE +; + +1555 +ic +-> +time + = +TAPE_1_PULSE +; + +1560 +ic +-> +b + = (oric->tapebit+1)%14; + +1561 if! +ic +-> +b + ) + +1563 if +ic +-> +dupbys + > 0 ) + +1564 +ic +-> +dupbys +--; + +1566 +ic +-> +offs +++; + +1569 +ic +-> +cou + = oric-> +time +; + +1570 + } +} + + @tape.h + +21  + #TAPE_0_PULSE + 416 + + ) + +22  + #TAPE_1_PULSE + 208 + + ) + +24  + #TAPE_DECODE_0_MIN + ( +TAPE_1_PULSE ++(TAPE_1_PULSE/5)) + + ) + +25  + #TAPE_DECODE_0_MAX + ( +TAPE_0_PULSE +*2) + + ) + +26  + #TAPE_DECODE_1_MIN + ( +TAPE_1_PULSE +/4) + + ) + +27  + #TAPE_DECODE_1_MAX + ( +TAPE_DECODE_0_MIN +) + + ) + +29  + #TIME_TO_BIT +( +t +(< +TAPE_DECODE_1_MIN +)?-1:(< +TAPE_DECODE_0_MIN +)?1:0)) + + ) + +31  +_eje + +mache + * +ic + ); + +32  +_wd + +mache + * +ic + ); + +33 +SDL_bo + +_ld_p + +mache + * +ic +, * +ame + ); + +34  +_ticktock + +mache + * +ic +,  +cyes + ); + +35  +_tm + +mache + * +ic +, +SDL_bo + +m + ); + +36  +_tches + +mache + * +ic + ); + +37  +toggˏp + +mache + * +ic +,  +osdmuem + * +mem +,  +dummy + ); + +38  +_bchge +( +v + *via); + +39  +__vch + +mache + * +ic + ); + + @ula.c + +22  + ~ + +23  + ~ + +25  + ~"syem.h +" + +26  + ~"6502.h +" + +27  + ~"v.h +" + +28  + ~"8912.h +" + +29  + ~"disk.h +" + +30  + ~"gui.h +" + +31  + ~"mڙ.h +" + +32  + ~"6551.h +" + +33  + ~"mache.h +" + +34  + ~"u.h +" + +35  + ~"avi.h +" + +37  +avi_hd + * +vidp +; + +38 +SDL_bo + +wpd +; + +40  + gbb +[8*8*64*8]; + +43  +le +  + $u_esh_cht + +mache + * +ic + ) + +45 if +ic +-> +vid_xrs + & 1 ) + +47 +ic +-> +vid_ch_da + = &ic-> +vid_ch_ba +[128*8]; + +49 +ic +-> +vid_ch_da + = oric-> +vid_ch_ba +; + +51 + } +} + +54  +le +  + $u_decode_ + +mache + * +ic +,  + +,  +y + ) + +56  + + & 0x18 ) + +59 +ic +-> +vid_fg_c + = + + & 0x07; + +60 +ic +-> +vid_br + = ( +Ut16 + *)(& +bb +[(ic-> +vid_fg_c +<<12| (ic-> +vid_bg_c +<<9)]); + +61 +ic +-> +vid_v_br + = ( +Ut16 + *)(& +bb +[((ic-> +vid_fg_c +^7)<<12| ((ic-> +vid_bg_c +^7)<<9)]); + +65 +ic +-> +vid_xrs + = + + & 0x07; + +66 +ic +-> +vid_blkmask + = + + & 0x04 ? 0x00 : 0x3f; + +67 + `u_esh_cht + +ic + ); + +68 if +ic +-> +vid_xrs + & 0x02 ) + +69 +ic +-> +vid_chle + = ( +y +>>1) & 0x07; + +71 +ic +-> +vid_chle + = +y + & 0x07; + +75 +ic +-> +vid_bg_c + = + + & 0x07; + +76 +ic +-> +vid_br + = ( +Ut16 + *)(& +bb +[(ic-> +vid_fg_c +<<12| (ic-> +vid_bg_c +<<9)]); + +77 +ic +-> +vid_v_br + = ( +Ut16 + *)(& +bb +[((ic-> +vid_fg_c +^7)<<12| ((ic-> +vid_bg_c +^7)<<9)]); + +81 +ic +-> +vid_mode + = + + & 0x07; + +84 if +ic +-> +vid_mode + & 4 ) + +86 +ic +-> +vid_addr + = oric-> +vidbas +[0]; + +87 +ic +-> +vid_ch_ba + = &ic-> +mem +[ic-> +vidbas +[1]]; + +89 +ic +-> +vid_addr + = oric-> +vidbas +[2]; + +90 +ic +-> +vid_ch_ba + = &ic-> +mem +[ic-> +vidbas +[3]]; + +93 + `u_esh_cht + +ic + ); + +96 + } +} + +98  +le +  + $u__deu + +mache + * +ic + ) + +100 +ic +-> +vid_fg_c + = 7; + +101 +ic +-> +vid_xrs + = 0; + +102 +ic +-> +vid_blkmask + = 0x3f; + +103 +ic +-> +vid_bg_c + = 0; + +104 +ic +-> +vid_br + = ( +Ut16 + *)(& +bb +[(ic-> +vid_fg_c +<<12| (ic-> +vid_bg_c +<<9)]); + +105 +ic +-> +vid_v_br + = ( +Ut16 + *)(& +bb +[((ic-> +vid_fg_c +^7)<<12| ((ic-> +vid_bg_c +^7)<<9)]); + +106 + `u_esh_cht + +ic + ); + +107 + } +} + +109  + $u_powup_deu + +mache + * +ic + ) + +111 + `u_decode_ + +ic +, 0x1a, 0 ); + +112 + } +} + +115  + $u_nd_block + +mache + * +ic +, +SDL_bo + +vd +,  +da +,  +y + ) + +117 +Ut16 + * +r +; + +119 if +vd + ) + +121 +r + = +ic +-> +vid_v_br + + ( +da +<<2); + +125 +r + = +ic +-> +vid_br + + ( +da +<<2); + +128 *(( +Ut16 + *) +ic +-> +s +*( +r +++); oric->scrpt+=2; + +129 *(( +Ut16 + *) +ic +-> +s +*( +r +++); oric->scrpt+=2; + +130 *(( +Ut16 + *) +ic +-> +s +*( +r +++); oric->scrpt+=2; + +131 + } +} + +133  + $u_nd_block_checkdty + +mache + * +ic +, +SDL_bo + +vd +,  +da +,  +y + ) + +135 +Ut16 + * +r +; + +136  +i +; + +138 if +vd + ) + +140 +r + = +ic +-> +vid_v_br + + ( +da +<<2); + +144 +r + = +ic +-> +vid_br + + ( +da +<<2); + +147  +i +=0; i<3; i++) + +149 i(*(( +Ut16 + *) +ic +-> +s +!* +r +) + +151 *(( +Ut16 + *) +ic +-> +s +* +r +; + +152 +ic +-> +vid_dty +[ +y +] = +SDL_TRUE +; + +153 +ic +-> +vid_block_func + = +u_nd_block +; + +155 +ic +-> +s ++=2; + +156 +r +++; + +158 + } +} + +161  + $u_ndsn + +mache + * +ic + ) + +163 +Ut8 + * +s +, * + +; + +164  +b +, +y +, +c +, +cy +, +bmask +; + +165 +SDL_bo + +hes +; + +167 +s + = +ic +->scrpt; + +168 +ic +-> +s + = oric-> +s +; + +169  +y +=0; y<224; y++) + +171 +cy + = ( +y +>>3) * 40; + +174 + `u__deu + +ic + ); + +175 +ic +-> +vid_chle + = +y + & 0x07; + +177 if +y + < 200 ) + +179 if +ic +-> +vid_mode + & 0x04 ) + +181 +hes + = +SDL_TRUE +; + +182 + + = & +ic +-> +mem +[ic-> +vid_addr + + +y +*40 -1]; + +184 +hes + = +SDL_FALSE +; + +185 + + = & +ic +-> +mem +[ic-> +vid_addr + + +cy + -1]; + +188 +hes + = +SDL_FALSE +; + +190 + + = & +ic +-> +mem +[ic-> +vidbas +[2] + +cy + -1]; + +192 +bmask + = ( +ic +-> +ames +&0x10)?0x3f:ic-> +vid_blkmask +; + +194  +b +=0; b<40; b++ ) + +196 +c + = *(++ + +); + +199 if +c + & 0x60 ) == 0 ) + +201 + `u_decode_ + +ic +, +c +, +y + ); + +202 + `u_nd_block + +ic +, ( +c + & 0x80)!=0, 0, +y + ); + +203 if +y + < 200 ) + +205 if +ic +-> +vid_mode + & 0x04 ) + +207 +hes + = +SDL_TRUE +; + +208 + + = & +ic +-> +mem +[ic-> +vid_addr + + +b + + +y +*40]; + +210 +hes + = +SDL_FALSE +; + +211 + + = & +ic +-> +mem +[ic-> +vid_addr + + +b + + +cy +]; + +214 +hes + = +SDL_FALSE +; + +216 + + = & +ic +-> +mem +[ic-> +vidbas +[2] + +b + + +cy +]; + +218 +bmask + = ( +ic +-> +ames +&0x10)?0x3f:ic-> +vid_blkmask +; + +221 if +hes + ) + +223 + `u_nd_block + +ic +, ( +c + & 0x80)!=0, c & +bmask +, +y + ); + +225  +ch_ix +, +ch_d +; + +227 +ch_ix + = +c + & 0x7f; + +228 +ch_d + = +ic +-> +vid_ch_da +[ ( +ch_ix +<<3| oric-> +vid_chle + ] & +bmask +; + +230 + `u_nd_block + +ic +, ( +c + & 0x80)!=0, +ch_d +, +y + ); + +235 +ic +-> +s + = scrpt; + +236 + } +} + +239 +SDL_bo + + $u_da + +mache + * +ic + ) + +241  +b +, +c +, +bmask +; + +242 +SDL_bo + +hes +, +ednd +; + +243  +y +, +cy +; + +244 +Ut8 + * + +; + +246 +ednd + = +SDL_FALSE +; + +248 +ic +-> +vid_ +++; + +249 if +ic +-> +vid_ + =ic-> +vid_max + ) + +251 if +vidp + ) + +255 i! +vidp +-> +dod + ) || ( ! +wpd + ) ) + +258 if +vidp +-> +is50hz + = +ic +-> +vid_eq + ) + +260 + `ay_lockaudio +& +ic +-> +ay + ); + +261 + `avi_addame +& +vidp +, +ic +-> +s + ); + +264 if +vidp +-> +is50hz + ) + +267 if( +vidp +-> +amdju +%6) != 5 ) + +269 + `ay_lockaudio +& +ic +-> +ay + ); + +270 + `avi_addame +& +vidp +, +ic +-> +s + ); + +273 +vidp +-> +amdju +++; + +279 + `ay_lockaudio +& +ic +-> +ay + ); + +280 + `avi_addame +& +vidp +, +ic +-> +s + ); + +282 if( +vidp +-> +amdju +%5) == 4 ) + +283 + `avi_addame +& +vidp +, +ic +-> +s + ); + +285 +vidp +-> +amdju +++; + +290 +ic +-> +vid_ + = 0; + +293 +ic +-> +vid_offt + = oric-> +v +. +t1c +/64; + +314 +ic +-> +vsync + = 12 + 260; + +316 +ednd + = +SDL_TRUE +; + +317 +ic +-> +ames +++; + +319 if +ic +-> +vid_eq + !(ic-> +vid_mode +&2) ) + +321 +ic +-> +vid_eq + = oric-> +vid_mode +&2; + +332 if +ic +-> +vid_eq + ) + +335 +ic +-> +cye + = 64; + +336 +ic +-> +vid_max + = 308 + 4; + +337 +ic +-> +vid_t + = (ic-> +vid_max + - 224) /2; + +338 +ic +-> +vid_d + = oric-> +vid_t + + 224; + +341 +ic +-> +cye + = 64; + +342 +ic +-> +vid_max + = 260 + 4; + +343 +ic +-> +vid_t + = (ic-> +vid_max + - 224) /2; + +344 +ic +-> +vid_d + = oric-> +vid_t + + 224; + +350 if +ic +-> +vid_ + < oric-> +vid_t + ) || + +351 +ic +-> +vid_ + >ic-> +vid_d + ) )  +ednd +; + +353 +y + = +ic +-> +vid_ + - oric-> +vid_t +; + +354 +ic +-> +s + = &ic-> +s +[ +y +*240]; + +356 +cy + = ( +y +>>3) * 40; + +359 + `u__deu + +ic + ); + +360 +ic +-> +vid_chle + = +y + & 0x07; + +363 +ic +-> +vid_block_func + = oric-> +vid_dty +[ +y +] ? +u_nd_block + : +u_nd_block_checkdty +; + +365 if +y + < 200 ) + +367 if +ic +-> +vid_mode + & 0x04 ) + +369 +hes + = +SDL_TRUE +; + +370 + + = & +ic +-> +mem +[ic-> +vid_addr + + +y +*40 -1]; + +372 +hes + = +SDL_FALSE +; + +373 + + = & +ic +-> +mem +[ic-> +vid_addr + + +cy + -1]; + +376 +hes + = +SDL_FALSE +; + +378 + + = & +ic +-> +mem +[ic-> +vidbas +[2] + +cy + -1]; + +380 +bmask + = ( +ic +-> +ames +&0x10)?0x3f:ic-> +vid_blkmask +; + +382  +b +=0; b<40; b++ ) + +384 +c + = *(++ + +); + +387 if +c + & 0x60 ) == 0 ) + +389 + `u_decode_ + +ic +, +c +, +y + ); + +390 +ic +-> + `vid_block_func +ic, ( +c + & 0x80)!=0, 0, +y + ); + +391 if +y + < 200 ) + +393 if +ic +-> +vid_mode + & 0x04 ) + +395 +hes + = +SDL_TRUE +; + +396 + + = & +ic +-> +mem +[ic-> +vid_addr + + +b + + +y +*40]; + +398 +hes + = +SDL_FALSE +; + +399 + + = & +ic +-> +mem +[ic-> +vid_addr + + +b + + +cy +]; + +402 i( +hes +) + +404 +hes + = +SDL_FALSE +; + +405 + + = & +ic +-> +mem +[ic-> +vidbas +[2] + +b + + +cy +]; + +408 +bmask + = ( +ic +-> +ames +&0x10)?0x3f:ic-> +vid_blkmask +; + +410 if +hes + ) + +412 +ic +-> + `vid_block_func +ic, ( +c + & 0x80)!=0, c & +bmask +, +y + ); + +414  +ch_ix +, +ch_d +; + +416 +ch_ix + = +c + & 0x7f; + +417 +ch_d + = +ic +-> +vid_ch_da +[ ( +ch_ix +<<3| oric-> +vid_chle + ] & +bmask +; + +419 +ic +-> + `vid_block_func +ic, ( +c + & 0x80)!=0, +ch_d +, +y + ); + +424  +ednd +; + +425 + } +} + +427  + $u_t_dty + +mache + * +ic + ) + +429  +i +; + +431  +i +=0; i<224; i++ ) + +433 +ic +-> +vid_dty +[ +i +] = +SDL_TRUE +; + +435 + } +} + +437  + $e_u + +mache + * +ic + ) + +439 +ic +-> +s + = +NULL +; + +440 +ic +-> +io + = +SDL_TRUE +; + +441 +ic +-> +htch + = +SDL_TRUE +; + +442 +ic +-> +sƚes + = +SDL_FALSE +; + +443 +ic +-> +lgho + = +SDL_TRUE +; + +444 + } +} + +446 +SDL_bo + + $_u + +mache + * +ic + ) + +448  +fg +, +bg +, +bs +, +offs +, +mask +; + +450 +ic +-> +s + = ( +Ut8 + *) + `mloc +( 240*224 ); + +451 if! +ic +-> +s + )  +SDL_FALSE +; + +453 + `memt +( +ic +-> +s +, 0, 240*224); + +454 + `u_t_dty + +ic + ); + +457  +fg +=0; fg<8; fg++ ) + +459  +bg +=0; bg<8; bg++ ) + +461  +bs +=0; bits<64; bits++) + +464 +offs + = ( +fg +<<12)|( +bg +<<9)|( +bs +<<3); + +465  +mask +=0x20; mask; mask>>=1 ) + +467 +bb +[ +offs +++] = ( +bs +& +mask +? +fg + : +bg +; + +473  +SDL_TRUE +; + +474 + } +} + +476  + $shut_u + +mache + * +ic + ) + +478 if +ic +-> +s + ) + ` +( oric->scr ); + +479 +ic +-> +s + = +NULL +; + +480 + } +} + + @ula.h + +22  +e_u + +mache + * +ic + ); + +23 +SDL_bo + +_u + +mache + * +ic + ); + +24  +shut_u + +mache + * +ic + ); + +25 +SDL_bo + +u_da + +mache + * +ic + ); + +26  +u_powup_deu + +mache + * +ic + ); + +27  +u_ndsn + +mache + * +ic + ); + +28  +u_t_dty + +mache + * +ic + ); + + @via.c + +25  + ~ + +26  + ~ + +27  + ~ + +29  + ~"syem.h +" + +30  + ~"6502.h +" + +31  + ~"v.h +" + +32  + ~"8912.h +" + +33  + ~"gui.h +" + +34  + ~"disk.h +" + +35  + ~"mڙ.h +" + +36  + ~"6551.h +" + +37  + ~"mache.h +" + +38  + ~"joyick.h +" + +39  + ~".h +" + +46  + $rtch + +mache + * +ic +,  +c + ) + +48 if +ic +-> +b + ) + +51 if! +ic +-> +tfr + ) || ( +c + == 9 ) || ( c == 10 ) || ( c == 13 ) || ( c == 17 ) || + +52 +c + == 18 ) || ( c == 27 ) || (( c >= 32 ) && ( c <= 127 )) ) + +56 if! +ic +-> +f + ) + +58 +ic +-> +f + = + `fݒ +( "printer_out.txt", "a" ); + +59 if! +ic +-> +f + ) + +61 + `do_pup + +ic +, "Printing failed :-(" ); + +65 + `do_pup + +ic +, "Printingo 'printer_out.txt'" ); + +69 + `utc + +c +, +ic +-> +f + ); + +70 +ic +-> +ock + = 40; + +71 +ic +-> +o + = 64*312*50*5; + +74 + `v_wre_CA1 +& +ic +-> +v +, 1 ); + +76 + } +} + +80  +le +  + $v_check_q + +v + * +v + ) + +82 if +v +-> +r + & v-> +i + )&0x7f ) + +84 +v +-> +ic +-> +u +. +q + |v-> +qb +; + +85 +v +-> +i + |= 0x80; + +87 +v +-> +ic +-> +u +. +q + &~v-> +qb +; + +88 +v +-> +i + &= 0x7f; + +90 + } +} + +93  +le +  + $v_t_q + +v + * +v +,  +b + ) + +95 +v +-> +i + | +b +; + +96 if +v +-> +r + & v-> +i + )&0x7f ) + +97 +v +-> +i + |= 0x80; + +99 if +v +-> +r + & +b + ) == 0 ) ; + +100 +v +-> +ic +-> +u +. +q + |v-> +qb +; + +101 + } +} + +104  +le +  + $v_r_q + +v + * +v +,  +b + ) + +106 if +b + & +VIRQF_CA1 + ) + +107 +v +-> + + = v-> +a +; + +109 if +b + & +VIRQF_CA2 + ) + +110 +v +-> +bl + = v-> +b +; + +112 +v +-> +i + &~ +b +; + +113 if( +v +-> +r + & v-> +i + )&0x7f) == 0 ) + +115 +v +-> +ic +-> +u +. +q + &~v-> +qb +; + +116 +v +-> +i + &= 0x7f; + +118 + } +} + +121  + $v_ma_w_ib + +v + * +v +,  +db + ) + +124 if( +db +& +v +-> +ddrb +&0x10) != 0 ) && + +125 ( +v +-> +b +&v-> +ddrb +&0x10) == 0 ) ) + +127 + `rtch + +v +-> +ic +, v-> +a + ); + +130 + `_tm + +v +-> +ic +, (v-> +b +&v-> +ddrb +&0x40) != 0 ); + +132 if( +v +-> +p +& +PCRF_CB2CON +) == 0x80 ) + +133 + `ay_t_bd +& +v +-> +ic +-> +ay +, 0 ); + +135 + `ay_upde_keybs +& +v +-> +ic +-> +ay + ); + +136 + } +} + +138  + $v_ma_w_ia + +v + * +v + ) + +140 if( +v +-> +p +& +PCRF_CA2CON +) == 0x08 ) + +141 + `ay_t_bc1 +& +v +-> +ic +-> +ay +, 0 ); + +143 + `ay_modet +& +v +-> +ic +-> +ay + ); + +144 + `joy_budmask + +v +-> +ic + ); + +145 + } +} + +147  + $v_ma_w_ia2 + +v + * +v + ) + +149 + `ay_modet +& +v +-> +ic +-> +ay + ); + +150 + `joy_budmask + +v +-> +ic + ); + +151 + } +} + +153  + $v_ma_w_dd + +v + * +v + ) + +155 + `joy_budmask + +v +-> +ic + ); + +156 + } +} + +158  + $v_ma_w_ddrb + +v + * +v + ) + +160 + `joy_budmask + +v +-> +ic + ); + +161 + `ay_upde_keybs +& +v +-> +ic +-> +ay + ); + +162 + } +} + +164  + $v_ma_w_p + +v + * +v + ) + +166 +SDL_bo + +updy + = +SDL_FALSE +; + +168  +v +-> +p + & +PCRF_CA2CON + ) + +171 +updy + = +SDL_TRUE +; + +177  +v +-> +p + & +PCRF_CB2CON + ) + +181 +updy + = +SDL_TRUE +; + +186 if +updy + ) + `ay_t_bcmode +& +v +-> +ic +-> +ay +, v-> +2 +, v-> +cb2 + ); + +187 + } +} + +189  + $v_ma_w_2ext + +v + * +v + ) + +191  +v +-> +p + & +PCRF_CA2CON + ) + +197 + `ay_t_bc1 +& +v +-> +ic +-> +ay +, v-> +2 + ); + +202 + } +} + +204  + $v_ma_w_cb2ext + +v + * +v + ) + +206  +v +-> +p + & +PCRF_CB2CON + ) + +212 + `ay_t_bd +& +v +-> +ic +-> +ay +, v-> +cb2 + ); + +215 + } +} + +217  + $v_ma_r_ia + +v + * +v + ) + +219 + `ay_modet +& +v +-> +ic +-> +ay + ); + +220 if( +v +-> +p +& +PCRF_CA2CON +) == 0x08 ) + +221 + `ay_t_bc1 +& +v +-> +ic +-> +ay +, 0 ); + +222 + } +} + +224  + $v_ma_r_ia2 + +v + * +v + ) + +226 + `ay_modet +& +v +-> +ic +-> +ay + ); + +227 + } +} + +229  + $v_ma_r_ib + +v + * +v + ) + +231 if( +v +-> +p +& +PCRF_CB2CON +) == 0x80 ) + +232 + `ay_t_bd +& +v +-> +ic +-> +ay +, 0 ); + +233 + } +} + +235  + $v_ma_2puld + +v + * +v + ) + +237 + `ay_t_bc1 +& +v +-> +ic +-> +ay +, 1 ); + +238 + } +} + +240  + $v_ma_cb2puld + +v + * +v + ) + +242 + `ay_t_bd +& +v +-> +ic +-> +ay +, v-> +cb2 + ); + +243 + } +} + +245  + $v__w_ia + +v + * +v + ) + +247  +vdd + = ( +v +-> +dd +&7)^7; + +248 +v +-> +ic +-> +_cubk + = (v->ic->_cubk& +vdd +)|(v-> +a +&v-> +dd +&0x07); + +249 +v +-> +ic +-> +_bkty + = v->ic-> +_bk +[v->ic-> +_cubk +]. +ty +; + +250 +v +-> +ic +-> +rom + = v->ic-> +_bk +[v->ic-> +_cubk +]. +r +; + +251 + } +} + +253  + $v__w_ia2 + +v + * +v + ) + +255  +vdd + = ( +v +-> +dd +&7)^7; + +256 +v +-> +ic +-> +_cubk + = (v->ic->_cubk& +vdd +)|(v-> +a +&v-> +dd +&0x07); + +257 +v +-> +ic +-> +_bkty + = v->ic-> +_bk +[v->ic-> +_cubk +]. +ty +; + +258 +v +-> +ic +-> +rom + = v->ic-> +_bk +[v->ic-> +_cubk +]. +r +; + +259 + } +} + +261  + $v__w_dd + +v + * +v + ) + +263  +vdd + = ( +v +-> +dd +&7)^7; + +264 +v +-> +ic +-> +_cubk + = (v->ic->_cubk& +vdd +)|(v-> +a +&v-> +dd +&0x07); + +265 +v +-> +ic +-> +_bkty + = v->ic-> +_bk +[v->ic-> +_cubk +]. +ty +; + +266 +v +-> +ic +-> +rom + = v->ic-> +_bk +[v->ic-> +_cubk +]. +r +; + +267 + } +} + +270  + $v_ad_p܏ + +v + * +v + ) + +272  +v +-> +a + & v-> +dd +; + +273 + } +} + +275  + $v_ad_ptb + +v + * +v + ) + +277  +v +-> +b + & v-> +ddrb +; + +278 + } +} + +281  + $v_ma_wre_p܏ + +v + * +v +,  +mask +,  +da + ) + +283 +v +-> +a + = (v->a&~ +mask +)|( +da +&mask); + +285 if(!( +v +-> +a +& +ACRF_PALATCH +)) || + +286 (!( +v +-> +i +& +VIRQF_CA1 +)) ) + +287 +v +-> + + = v-> +a +; + +288 + } +} + +290  + $v__wre_p܏ + +v + * +v +,  +mask +,  +da + ) + +292 +v +-> +a + = (v->a&~ +mask +)|( +da +&mask); + +294 if(!( +v +-> +a +& +ACRF_PALATCH +)) || + +295 (!( +v +-> +i +& +VIRQF_CA1 +)) ) + +296 +v +-> + + = v-> +a +; + +297 + } +} + +299  + $v_wre_ptb + +v + * +v +,  +mask +,  +da + ) + +301  +ϡpb6 +; + +303 +ϡpb6 + = +v +-> +b +&0x40; + +304 +v +-> +b + = (v->b&~ +mask +)|( +da +&mask); + +306 if(!( +v +-> +a +& +ACRF_PBLATCH +)) || + +307 (!( +v +-> +a +& +VIRQF_CB1 +)) ) + +308 +v +-> +bl + = v-> +b +; + +311 if +v +-> +a + & +ACRF_T2CON + ) == 0 ) ; + +314 if! +ϡpb6 + ) || ( +v +-> +b +&0x40 ) ) ; + +317 +v +-> +t2c +--; + +318 if +v +-> +t2run + ) + +320 if +v +-> +t2c + == 0 ) + +322 + `v_t_q + +v +, +VIRQF_T2 + ); + +323 +v +-> +t2run + = +SDL_FALSE +; + +326 + } +} + +329  + $v_ + +v + * +v +,  +mache + * +ic +,  +vty + ) + +331 +v +-> +b + = 0; + +332 +v +-> +a + = 0; + +333 +v +-> +b + = 0xff; + +334 +v +-> +a + = 0xff; + +335 +v +-> +bl + = 0xff; + +336 +v +-> + + = 0xff; + +337 +v +-> +dd + = 0; + +338 +v +-> +ddrb + = 0; + +339 +v +-> +t1l_l + = 0; + +340 +v +-> +t1l_h + = 0; + +341 +v +-> +t1c + = 0; + +342 +v +-> +t1ld + = 0; + +343 +v +-> +t2l_l + = 0; + +344 +v +-> +t2l_h + = 0; + +345 +v +-> +t2c + = 0; + +346 +v +-> +t2ld + = 0; + +347 +v +-> + + = 0; + +348 +v +-> +a + = 0; + +349 +v +-> +p + = 0; + +350 +v +-> +i + = 0; + +351 +v +-> +r + = 0; + +352 +v +-> +1 + = 0; + +353 +v +-> +2 + = 0; + +354 +v +-> +cb1 + = 0; + +355 +v +-> +cb2 + = 0; + +356 +v +-> +cou + = 0; + +357 +v +-> +time + = 0; + +358 +v +-> +igg + = +SDL_FALSE +; + +359 +v +-> +t1run + = +SDL_FALSE +; + +360 +v +-> +t2run + = +SDL_FALSE +; + +361 +v +-> +2pul + = +SDL_FALSE +; + +362 +v +-> +cb2pul + = +SDL_FALSE +; + +363 +v +-> +ic + = oric; + +365  +vty + ) + +367  +VIA_MAIN +: + +368 +v +-> +w_ib + = +v_ma_w_ib +; + +369 +v +-> +w_ia + = +v_ma_w_ia +; + +370 +v +-> +w_ia2 + = +v_ma_w_ia2 +; + +371 +v +-> +w_dd + = +v_ma_w_dd +; + +372 +v +-> +w_ddrb + = +v_ma_w_ddrb +; + +373 +v +-> +w_p + = +v_ma_w_p +; + +374 +v +-> +w_2ext + = +v_ma_w_2ext +; + +375 +v +-> +w_cb2ext + = +v_ma_w_cb2ext +; + +376 +v +-> +r_ia + = +v_ma_r_ia +; + +377 +v +-> +r_ia2 + = +v_ma_r_ia2 +; + +378 +v +-> +r_ib + = +v_ma_r_ib +; + +379 +v +-> +2puld + = +v_ma_2puld +; + +380 +v +-> +cb2puld + = +v_ma_cb2puld +; + +381 +v +-> +cb2shied + = +v_ma_cb2puld +; + +382 +v +-> +bchge + = +_bchge +; + +383 +v +-> +qb + = +IRQF_VIA +; + +384 +v +-> +ad_pt_a + = +v_ad_p܏ +; + +385 +v +-> +ad_pt_b + = +v_ad_ptb +; + +386 +v +-> +wre_pt_a + = +v_ma_wre_p܏ +; + +387 +v +-> +wre_pt_b + = +v_wre_ptb +; + +390  +VIA_TELESTRAT +: + +391 +v +-> +w_ib + = +NULL +; + +392 +v +-> +w_ia + = +v__w_ia +; + +393 +v +-> +w_ia2 + = +v__w_ia2 +; + +394 +v +-> +w_dd + = +v__w_dd +; + +395 +v +-> +w_ddrb + = +NULL +; + +396 +v +-> +w_p + = +NULL +; + +397 +v +-> +w_2ext + = +NULL +; + +398 +v +-> +w_cb2ext + = +NULL +; + +399 +v +-> +r_ia + = +NULL +; + +400 +v +-> +r_ia2 + = +NULL +; + +401 +v +-> +r_ib + = +NULL +; + +402 +v +-> +2puld + = +NULL +; + +403 +v +-> +cb2puld + = +NULL +; + +404 +v +-> +cb2shied + = +NULL +; + +405 +v +-> +bchge + = +NULL +; + +406 +v +-> +qb + = +IRQF_VIA2 +; + +407 +v +-> +ad_pt_a + = +v_ad_p܏ +; + +408 +v +-> +ad_pt_b + = +v_ad_ptb +; + +409 +v +-> +wre_pt_a + = +v__wre_p܏ +; + +410 +v +-> +wre_pt_b + = +v_wre_ptb +; + +411 +v +-> +a + = 7; + +412 +v +-> +dd + = 7; + +415 + } +} + +418  + $v_ock + +v + * +v +,  +cyes + ) + +420  +em +; + +423 + `_ticktock + +v +-> +ic +, +cyes + ); + +425 if! +cyes + ) ; + +428 if +v +-> +ic +-> +ock + > 0 ) + +430 +v +-> +ic +-> +ock + - +cyes +; + +431 if +v +-> +ic +-> +ock + <= 0 ) + +433 +v +-> +ic +-> +ock + = 0; + +434 if +v +-> +ic +-> +b + ) + +435 + `v_wre_CA1 + +v +, 0 ); + +442 if +v +-> +ic +-> +o + > 0 ) + +444 +v +-> +ic +-> +o + - +cyes +; + +445 if +v +-> +ic +-> +o + <= 0 ) + +447 +v +-> +ic +-> +o + = 0; + +448 if +v +-> +ic +-> +f + ) + +449 + `fo + +v +-> +ic +-> +f + ); + +450 +v +-> +ic +-> +f + = +NULL +; + +454 if +v +-> +2pul + ) + +456 +v +-> +2 + = 1; + +457 if +v +-> +2puld + ) v-> + `2puld +( v ); + +458 +v +-> +2pul + = +SDL_FALSE +; + +461 if +v +-> +cb2pul + ) + +465 +v +-> +cb2 + = 1; + +466 if +v +-> +cb2puld + ) v-> + `cb2puld +( v ); + +468 +v +-> +cb2pul + = +SDL_FALSE +; + +472  +v +-> +a +& +ACRF_T1CON + ) + +476 if +v +-> +t1run + ) + +478 if +cyes + > +v +-> +t1c + ) + +480 + `v_t_q + +v +, +VIRQF_T1 + ); + +481 if +v +-> +a +&0x80 ) + +483 +v +-> +b + |= 0x80; + +484 i( +v +-> +bchge +v-> + `bchge +( v ); + +486 +v +-> +t1run + = +SDL_FALSE +; + +489 +v +-> +t1c + - +cyes +; + +494 +em + = +cyes +; + +496 if +v +-> +t1ld + ) + +498 +em +--; + +499 +v +-> +t1c + = (v-> +t1l_h +<<8)|v-> +t1l_l +; + +500 +v +-> +t1ld + = +SDL_FALSE +; + +503  +em + > +v +-> +t1c + ) + +505 +em + -( +v +-> +t1c ++1); + +506 +v +-> +t1c + = 0xffff; + +507 + `v_t_q + +v +, +VIRQF_T1 + ); + +508 if +v +-> +a +&0x80 ) + +510 +v +-> +b + ^= 0x80; + +511 if +v +-> +bchge + ) v-> + `bchge +( v ); + +514 if! +em + ) + +516 +v +-> +t1ld + = +SDL_TRUE +; + +520 +em +--; + +521 +v +-> +t1c + = (v-> +t1l_h +<<8)|v-> +t1l_l +; + +524 +v +-> +t1c + - +em +; + +529 if +v +-> +a + & +ACRF_T2CON + ) == 0 ) + +531 +em + = +cyes +; + +532 if +v +-> +t2ld + ) + +534 +em +--; + +535 +v +-> +t2ld + = 0; + +539 if +v +-> +t2run + ) + +541 if +em + > +v +-> +t2c + ) + +543 + `v_t_q + +v +, +VIRQF_T2 + ); + +544 +v +-> +t2run + = +SDL_FALSE +; + +547 +v +-> +t2c + - +em +; + +550  +v +-> +a + & +ACRF_SRCON + ) + +557 if +v +-> +i +& +VIRQF_SR + ) + +558 + `v_r_q + +v +, +VIRQF_SR + ); + +559 +v +-> +cou + = 0; + +560 +v +-> +igg + = +SDL_FALSE +; + +564 if! +v +-> +igg + ) ; + +567 +v +-> +time + - +cyes +; + +568  +v +-> +time + <= 0 ) + +571 +v +-> +time + +v-> +t2l_l ++1; + +574 +v +-> +cb1 + ^= 1; + +577 if! +v +-> +cb1 + ) + +579 +v +-> +cb2 + = (v-> + + & 0x80) ? 1 : 0; + +580 +v +-> + + = (v-><<1)|v-> +cb2 +; + +581 if +v +-> +cb2shied + ) v-> + `cb2shied +( v ); + +583 +v +-> +cou + = (v->srcount+1)%8; + +589 if! +v +-> +igg + ) ; + +590 if +v +-> +cou + == 8 ) ; + +593 +v +-> +time + - +cyes +; + +594  +v +-> +time + <= 0 ) + +597 +v +-> +time + +v-> +t2l_l ++1; + +600 +v +-> +cb1 + ^= 1; + +603 if! +v +-> +cb1 + ) + +605 +v +-> +cb2 + = (v-> + + & 0x80) ? 1 : 0; + +606 +v +-> + + = (v-><<1)|v-> +cb2 +; + +607 if +v +-> +cb2shied + ) v-> + `cb2shied +( v ); + +609 +v +-> +cou +++; + +610 if +v +-> +cou + == 8 ) + +612 + `v_t_q + +v +, +VIRQF_SR + ); + +613 +v +-> +time + = 0; + +614 +v +-> +igg + = +SDL_FALSE +; + +622 if! +v +-> +igg + ) ; + +623 if +v +-> +cou + == 8 ) ; + +626 +v +-> +cb1 + ^= 1; + +629 if! +v +-> +cb1 + ) + +631 +v +-> +cb2 + = (v-> + + & 0x80) ? 1 : 0; + +632 +v +-> + + = (v-><<1)|v-> +cb2 +; + +633 if +v +-> +cb2shied + ) v-> + `cb2shied +( v ); + +635 +v +-> +cou +++; + +636 if +v +-> +cou + == 8 ) + +638 + `v_t_q + +v +, +VIRQF_SR + ); + +639 +v +-> +igg + = +SDL_FALSE +; + +644 + } +} + +647  + $v_wre + +v + * +v +,  +offt +,  +da + ) + +649  +tmp +; + +650 +offt + &= 0xf; + +652  +offt + ) + +654  +VIA_IORB +: + +655 +tmp + = +v +-> +b +; + +656 +v +-> +b + = +da +; + +658 + `v_r_q + +v +, +VIRQF_CB1 + ); + +659  +v +-> +p + & +PCRF_CB2CON + ) + +663 + `v_r_q + +v +, +VIRQF_CB2 + ); + +667 +v +-> +cb2pul + = +SDL_TRUE +; + +670 +v +-> +cb2 + = 0; + +673 if +v +-> +w_ib + ) v-> + `w_ib +v, +tmp + ); + +674 if +v +-> +bchge + ) v-> + `bchge +( v ); + +676  +VIA_IORA +: + +677 +v +-> +a + = +da +; + +678 + `v_r_q + +v +, +VIRQF_CA1 + ); + +679  +v +-> +p + & +PCRF_CA2CON + ) + +683 + `v_r_q + +v +, +VIRQF_CA2 + ); + +687 +v +-> +2pul + = +SDL_TRUE +; + +689 +v +-> +2 + = 0; + +692 if +v +-> +w_ia + ) v-> + `w_ia +( v ); + +694  +VIA_DDRB +: + +695 +v +-> +ddrb + = +da +; + +696 if +v +-> +w_ddrb + ) v-> + `w_ddrb +( v ); + +698  +VIA_DDRA +: + +699 +v +-> +dd + = +da +; + +700 if +v +-> +w_dd + ) v-> + `w_dd +( v ); + +702  +VIA_T1C_H +: + +703 +v +-> +t1l_h + = +da +; + +704 +v +-> +t1c + = (v-> +t1l_h +<<8)|v-> +t1l_l +; + +705 +v +-> +t1ld + = 1; + +706 + `v_r_q + +v +, +VIRQF_T1 + ); + +707 +v +-> +t1run + = +SDL_TRUE +; + +708 if( +v +-> +a +& +ACRF_T1CON +) == 0x80 ) + +710 +v +-> +b + &= 0x7f; + +711 if +v +-> +bchge + ) v-> + `bchge +( v ); + +714  +VIA_T1C_L +: + +715  +VIA_T1L_L +: + +716 +v +-> +t1l_l + = +da +; + +718  +VIA_T1L_H +: + +719 +v +-> +t1l_h + = +da +; + +720 + `v_r_q + +v +, +VIRQF_T1 + ); + +722  +VIA_T2C_L +: + +723 +v +-> +t2l_l + = +da +; + +725  +VIA_T2C_H +: + +726 +v +-> +t2l_h + = +da +; + +727 +v +-> +t2c + = (v-> +t2l_h +<<8)|v-> +t2l_l +; + +728 +v +-> +t2ld + = 1; + +729 + `v_r_q + +v +, +VIRQF_T2 + ); + +730 +v +-> +t2run + = +SDL_TRUE +; + +732  +VIA_SR +: + +733 +v +-> + + = +da +; + +734 +v +-> +cou + = 0; + +735 +v +-> +time + = 0; + +736 +v +-> +igg + = +SDL_TRUE +; + +737 + `v_r_q + +v +, +VIRQF_SR + ); + +739  +VIA_ACR +: + +759 +v +-> +a + = +da +; + +760 if +da + & +ACRF_T1CON + ) != 0x40 ) && + +761 +da + & +ACRF_T1CON + ) != 0xc0 ) ) + +762 +v +-> +t1ld + = +SDL_FALSE +; + +767  +VIA_PCR +: + +768 +v +-> +p + = +da +; + +769  +v +-> +p + & +PCRF_CA2CON + ) + +772 +v +-> +2 + = 0; + +773 +v +-> +2pul + = +SDL_FALSE +; + +777 +v +-> +2 + = 1; + +783  +v +-> +p + & +PCRF_CB2CON + ) + +786 +v +-> +cb2 + = 0; + +787 +v +-> +cb2pul + = +SDL_FALSE +; + +791 +v +-> +cb2 + = 1; + +796 if +v +-> +w_p + ) v-> + `w_p +( v ); + +798  +VIA_IFR +: + +799 if +da + & +VIRQF_CA1 + ) +v +-> + + = v-> +a +; + +800 if +da + & +VIRQF_CB1 + ) +v +-> +bl + = v-> +b +; + +802 +v +-> +i + &(~ +da +)&0x7f; + +803 if +v +-> +r + & v-> +i + )&0x7f ) + +804 +v +-> +i + |= 0x80; + +806 +v +-> +ic +-> +u +. +q + &~v-> +qb +; + +808  +VIA_IER +: + +809 if +da + & 0x80 ) + +810 +v +-> +r + |( +da +&0x7f); + +812 +v +-> +r + &~( +da +&0x7f); + +813 + `v_check_q + +v + ); + +815  +VIA_IORA2 +: + +816 +v +-> +a + = +da +; + +817 if +v +-> +w_ia2 + ) v-> + `w_ia2 +( v ); + +820 + } +} + +823  + $v_m_ad + +v + * +v +,  +offt + ) + +825 +offt + &= 0xf; + +827  +offt + ) + +829  +VIA_IORB +: + +830  ( +v +-> +b +&v-> +ddrb +)|(v-> +bl +&(~v->ddrb)); + +831  +VIA_IORA +: + +832  ( +v +-> +a +&v-> +dd +)|(v-> + +&(~v->ddra)); + +833  +VIA_DDRB +: + +834  +v +-> +ddrb +; + +835  +VIA_DDRA +: + +836  +v +-> +dd +; + +837  +VIA_T1C_L +: + +838  +v +-> +t1c +&0xff; + +839  +VIA_T1C_H +: + +840  +v +-> +t1c +>>8; + +841  +VIA_T1L_L +: + +842  +v +-> +t1l_l +; + +843  +VIA_T1L_H +: + +844  +v +-> +t1l_h +; + +845  +VIA_T2C_L +: + +846  +v +-> +t2c +&0xff; + +847  +VIA_T2C_H +: + +848  +v +-> +t2c +>>8; + +849  +VIA_SR +: + +850  +v +-> + +; + +851  +VIA_ACR +: + +852  +v +-> +a +; + +853  +VIA_PCR +: + +854  +v +-> +p +; + +855  +VIA_IFR +: + +856  +v +-> +i +; + +857  +VIA_IER +: + +858  +v +-> +r +|0x80; + +859  +VIA_IORA2 +: + +860  ( +v +-> +a +&v-> +dd +)|(v-> + +&(~v->ddra)); + +864 + } +} + +867  + $v_ad + +v + * +v +,  +offt + ) + +869 +offt + &= 0xf; + +871  +offt + ) + +873  +VIA_IORB +: + +874 + `v_r_q + +v +, +VIRQF_CB1 + ); + +875  +v +-> +p + & +PCRF_CB2CON + ) + +879 + `v_r_q + +v +, +VIRQF_CB2 + ); + +883 +v +-> +cb2pul + = +SDL_TRUE +; + +887 +v +-> +cb2 + = 0; + +891 if +v +-> +r_ib + ) v-> + `r_ib +( v ); + +892  ( +v +-> +b +&v-> +ddrb +)|(v-> +bl +&(~v->ddrb)); + +893  +VIA_IORA +: + +894 + `v_r_q + +v +, +VIRQF_CA1 + ); + +895  +v +-> +p + & +PCRF_CA2CON + ) + +899 + `v_r_q + +v +, +VIRQF_CA2 + ); + +903 +v +-> +2pul + = +SDL_TRUE +; + +905 +v +-> +2 + = 0; + +908 if +v +-> +r_ia + ) v-> + `r_ia +( v ); + +909  ( +v +-> +a +&v-> +dd +)|(v-> + +&(~v->ddra)); + +910  +VIA_DDRB +: + +911  +v +-> +ddrb +; + +912  +VIA_DDRA +: + +913  +v +-> +dd +; + +914  +VIA_T1C_L +: + +915 + `v_r_q + +v +, +VIRQF_T1 + ); + +916  +v +-> +t1c +&0xff; + +917  +VIA_T1C_H +: + +918  +v +-> +t1c +>>8; + +919  +VIA_T1L_L +: + +920  +v +-> +t1l_l +; + +921  +VIA_T1L_H +: + +922  +v +-> +t1l_h +; + +923  +VIA_T2C_L +: + +924 + `v_r_q + +v +, +VIRQF_T2 + ); + +925  +v +-> +t2c +&0xff; + +926  +VIA_T2C_H +: + +927  +v +-> +t2c +>>8; + +928  +VIA_SR +: + +929 +v +-> +cou + = 0; + +930 +v +-> +time + = 0; + +931 +v +-> +igg + = +SDL_TRUE +; + +932 + `v_r_q + +v +, +VIRQF_SR + ); + +933  +v +-> + +; + +934  +VIA_ACR +: + +935  +v +-> +a +; + +936  +VIA_PCR +: + +937  +v +-> +p +; + +938  +VIA_IFR +: + +939  +v +-> +i +; + +940  +VIA_IER +: + +941  +v +-> +r +|0x80; + +942  +VIA_IORA2 +: + +943  ( +v +-> +a +&v-> +dd +)|(v-> + +&(~v->ddra)); + +947 + } +} + +950  + $v_m_wre_i + +v + * +v +,  +da + ) + +952 if! +da + & +VIRQF_CA1 + ) ) +v +-> + + = v-> +a +; + +953 if! +da + & +VIRQF_CB1 + ) ) +v +-> +bl + = v-> +b +; + +955 +v +-> +i + = +da +&0x7f; + +956 if +v +-> +r + & v-> +i + )&0x7f ) + +957 +v +-> +i + |= 0x80; + +959 +v +-> +ic +-> +u +. +q + &~v-> +qb +; + +960 + } +} + +963  + $v_wre_CA1 + +v + * +v +,  +da + ) + +965 if! +v +-> +1 + ) && ( +da + != 0 ) ) + +967 if +v +-> +p + & +PCRF_CA1CON + ) + +968 + `v_t_q + +v +, +VIRQF_CA1 + ); + +969 } if +v +-> +1 + ) && ( +da + == 0 ) ) { + +970 if!( +v +-> +p + & +PCRF_CA1CON +) ) + +971 + `v_t_q + +v +, +VIRQF_CA1 + ); + +974 +v +-> +1 + = +da + != 0; + +975 + } +} + +977  + $v_wre_CA2 + +v + * +v +,  +da + ) + +979  +v +-> +p + & +PCRF_CA2CON + ) + +983 if +v +-> +2 + ) && ( +da + == 0 ) ) + +984 + `v_t_q + +v +, +VIRQF_CA2 + ); + +985 +v +-> +2 + = +da + != 0; + +990 if! +v +-> +2 + ) && ( +da + != 0 ) ) + +991 + `v_t_q + +v +, +VIRQF_CA2 + ); + +992 +v +-> +2 + = +da + != 0; + +998 if +v +-> +w_2ext + ) v-> + `w_2ext +( v ); + +999 + } +} + +1001  + $v_wre_CB1 + +v + * +v +,  +da + ) + +1003 if! +v +-> +cb1 + ) && ( +da + != 0 ) ) + +1005 if +v +-> +p + & +PCRF_CB1CON + ) + +1006 + `v_t_q + +v +, +VIRQF_CB1 + ); + +1007 } if +v +-> +cb1 + ) && ( +da + == 0 ) ) { + +1008 if!( +v +-> +p + & +PCRF_CB1CON +) ) + +1009 + `v_t_q + +v +, +VIRQF_CB1 + ); + +1012 +v +-> +cb1 + = +da + != 0; + +1013 + } +} + +1015  + $v_wre_CB2 + +v + * +v +,  +da + ) + +1017  +v +-> +p + & +PCRF_CB2CON + ) + +1021 if +v +-> +cb2 + ) && ( +da + == 0 ) ) + +1022 + `v_t_q + +v +, +VIRQF_CB2 + ); + +1023 +v +-> +cb2 + = +da + != 0; + +1028 if! +v +-> +cb2 + ) && ( +da + != 0 ) ) + +1029 + `v_t_q + +v +, +VIRQF_CB2 + ); + +1030 +v +-> +cb2 + = +da + != 0; + +1034 if +v +-> +w_cb2ext + ) v-> + `w_cb2ext +( v ); + +1035 + } +} + + @via.h + +23 + mVIA_MAIN + = 0, + +24 + mVIA_TELESTRAT + + +27  + sv + + +30  + mi +; + +31  + mb +, + mb +, + mbl +; + +32  + ma +, + ma +, + m +; + +33  + mdd +; + +34  + mddrb +; + +35  + mt1l_l +; + +36  + mt1l_h +; + +37  + mt1c +; + +38  + mt2l_l +; + +39  + mt2l_h +; + +40  + mt2c +; + +41  + m +; + +42  + ma +; + +43  + mp +; + +44  + mr +; + +47  + m1 +, + m2 +; + +48  + mcb1 +, + mcb2 +; + +49  + mcou +; + +50  + mt1ld +, + mt2ld +; + +51 +St16 + + mtime +; + +54 +SDL_bo + + mt1run +, + mt2run +; + +55 +SDL_bo + + m2pul +, + mcb2pul +; + +56 +SDL_bo + + migg +; + +58 (* + mw_ib +)( + mv + *,); + +59 (* + mw_ia +)( + mv + *); + +60 (* + mw_ia2 +)( + mv + *); + +61 (* + mw_dd +)( + mv + *); + +62 (* + mw_ddrb +)( + mv + *); + +63 (* + mw_p +)( + mv + *); + +64 (* + mw_2ext +)( + mv + *); + +65 (* + mw_cb2ext +)( + mv + *); + +66 (* + mr_ia +)( + mv + *); + +67 (* + mr_ia2 +)( + mv + *); + +68 (* + mr_ib +)( + mv + *); + +69 (* + m2puld +)( + mv + *); + +70 (* + mcb2puld +)( + mv + *); + +71 (* + mcb2shied +)( + mv + *); + +72 (* + mbchge +)( + mv + *); + +74 (* + mad_pt_a +)( + mv + *); + +75 (* + mad_pt_b +)( + mv + *); + +76 (* + mwre_pt_a +)( +v + * + mv +, , ); + +77 (* + mwre_pt_b +)( +v + * + mv +, , ); + +79  +mache + * + mic +; + +80  + mqb +; + +83  + #VIA_IORB + 0 + + ) + +84  + #VIA_IORA + 1 + + ) + +85  + #VIA_DDRB + 2 + + ) + +86  + #VIA_DDRA + 3 + + ) + +87  + #VIA_T1C_L + 4 + + ) + +88  + #VIA_T1C_H + 5 + + ) + +89  + #VIA_T1L_L + 6 + + ) + +90  + #VIA_T1L_H + 7 + + ) + +91  + #VIA_T2C_L + 8 + + ) + +92  + #VIA_T2C_H + 9 + + ) + +93  + #VIA_SR + 10 + + ) + +94  + #VIA_ACR + 11 + + ) + +95  + #VIA_PCR + 12 + + ) + +96  + #VIA_IFR + 13 + + ) + +97  + #VIA_IER + 14 + + ) + +98  + #VIA_IORA2 + 15 + + ) + +100  + #PCRB_CA1CON + 0 + + ) + +101  + #PCRF_CA1CON + (1<< +PCRB_CA1CON +) + + ) + +102  + #PCRF_CA2CON + (0x0e) + + ) + +103  + #PCRB_CB1CON + 4 + + ) + +104  + #PCRF_CB1CON + (1<< +PCRB_CB1CON +) + + ) + +105  + #PCRF_CB2CON + (0xe0) + + ) + +107  + #ACRB_PALATCH + 0 + + ) + +108  + #ACRF_PALATCH + (1<< +ACRB_PALATCH +) + + ) + +109  + #ACRB_PBLATCH + 1 + + ) + +110  + #ACRF_PBLATCH + (1<< +ACRB_PBLATCH +) + + ) + +111  + #ACRF_SRCON + (0x1c) + + ) + +112  + #ACRB_T2CON + 5 + + ) + +113  + #ACRF_T2CON + (1<< +ACRB_T2CON +) + + ) + +114  + #ACRF_T1CON + (0xc0) + + ) + +116  + #VIRQB_CA2 + 0 + + ) + +117  + #VIRQF_CA2 + (1<< +VIRQB_CA2 +) + + ) + +118  + #VIRQB_CA1 + 1 + + ) + +119  + #VIRQF_CA1 + (1<< +VIRQB_CA1 +) + + ) + +120  + #VIRQB_SR + 2 + + ) + +121  + #VIRQF_SR + (1<< +VIRQB_SR +) + + ) + +122  + #VIRQB_CB2 + 3 + + ) + +123  + #VIRQF_CB2 + (1<< +VIRQB_CB2 +) + + ) + +124  + #VIRQB_CB1 + 4 + + ) + +125  + #VIRQF_CB1 + (1<< +VIRQB_CB1 +) + + ) + +126  + #VIRQB_T2 + 5 + + ) + +127  + #VIRQF_T2 + (1<< +VIRQB_T2 +) + + ) + +128  + #VIRQB_T1 + 6 + + ) + +129  + #VIRQF_T1 + (1<< +VIRQB_T1 +) + + ) + +131  +_eje + +mache + * +ic + ); + +132  +_wd + +mache + * +ic + ); + +133 +SDL_bo + +_ld_p + +mache + * +ic +, * +ame + ); + +134  +_ticktock + +mache + * +ic +,  +cyes + ); + +137  +v_ + +v + * +v +,  +mache + * +ic +,  +vty + ); + +140  +v_ock + +v + * +v +,  +cyes + ); + +143  +v_wre + +v + * +v +,  +offt +,  +da + ); + +146  +v_ad + +v + * +v +,  +offt + ); + +150  +v_wre_CA1 + +v + * +v +,  +da + ); + +151  +v_wre_CA2 + +v + * +v +,  +da + ); + +152  +v_wre_CB1 + +v + * +v +,  +da + ); + +153  +v_wre_CB2 + +v + * +v +,  +da + ); + +156  +v_m_wre_i + +v + * +v +,  +da + ); + +159  +v_m_ad + +v + * +v +,  +offt + ); + + @ +1 +. +0 +70 +844 +6502.c +6502.h +6551.c +6551.h +6551_com.c +6551_loopback.c +6551_modem.c +8912.c +8912.h +XCode/Oricutron/Oricutron/SDLMain.h +avi.c +avi.h +disk.c +disk.h +disk_pravetz.c +disk_pravetz.h +filereq.h +filereq_amiga.c +filereq_beos.cpp +filereq_gtk.c +filereq_sdl.c +filereq_win32.c +font.c +gui.c +gui.h +gui_beos.cpp +gui_win.c +gui_x11.c +joystick.c +joystick.h +keyboard.c +keyboard.h +machine.c +machine.h +main.c +main.h +monitor.c +monitor.h +msgbox.h +msgbox_beos.cpp +msgbox_gtk.c +msgbox_os2.c +msgbox_os4.c +msgbox_sdl.c +msgbox_win32.c +msvc/strcasecmp.h +msvc/unistd.h +plugins/ch376/ch376.c +plugins/ch376/ch376.h +plugins/ch376/oric_ch376_plugin.c +plugins/ch376/oric_ch376_plugin.h +render_gl.c +render_gl.h +render_null.c +render_null.h +render_sw.c +render_sw.h +render_sw8.c +render_sw8.h +snapshot.c +snapshot.h +system.h +system_sdl.c +system_sdl.h +tape.c +tape.h +ula.c +ula.h +via.c +via.h diff --git a/gui.c b/gui.c index 6a5bb232..ddeca86b 100644 --- a/gui.c +++ b/gui.c @@ -417,7 +417,8 @@ SDL_bool gimg_load( struct guiimg *gi ) f = SDL_RWFromFile( path, "rb" ); if( !f ) { - error_printf( "Unable to open '%s'\n", gi->filename ); + error_printf( "Unable to open '%s' SDL_Error: %s\n", gi->filename, SDL_GetError() ); + return SDL_FALSE; } diff --git a/images/status_bar.bmp b/images/status_bar.bmp new file mode 100644 index 0000000000000000000000000000000000000000..67d3e31a00005e96b19f073bd16f57c94ad4f508 GIT binary patch literal 41098 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 z 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%0Agm&@hr?NW)}xY)Rh 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 yvDhMmQ8Rtp;Jo2CN^zXkwlqOmL literal 0 HcmV?d00001 diff --git a/roms/orixbank1.rom b/roms/orixbank1.rom new file mode 100755 index 0000000000000000000000000000000000000000..eaf2f7726fc971e44330c4045ab737296050656e GIT binary patch literal 16384 zcmeIuArSx|5CE`;ZuFo4cL)saz7ZZp49pf`y^XncV8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`K={ JC>ba6)&~%=1>67t literal 0 HcmV?d00001 diff --git a/roms/orixbank2.rom b/roms/orixbank2.rom new file mode 100755 index 0000000000000000000000000000000000000000..eaf2f7726fc971e44330c4045ab737296050656e GIT binary patch literal 16384 zcmeIuArSx|5CE`;ZuFo4cL)saz7ZZp49pf`y^XncV8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`K={ JC>ba6)&~%=1>67t literal 0 HcmV?d00001 diff --git a/roms/orixbank3.rom b/roms/orixbank3.rom new file mode 100755 index 0000000000000000000000000000000000000000..eaf2f7726fc971e44330c4045ab737296050656e GIT binary patch literal 16384 zcmeIuArSx|5CE`;ZuFo4cL)saz7ZZp49pf`y^XncV8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`K={ JC>ba6)&~%=1>67t literal 0 HcmV?d00001 diff --git a/roms/orixbank4.rom b/roms/orixbank4.rom new file mode 100755 index 0000000000000000000000000000000000000000..eaf2f7726fc971e44330c4045ab737296050656e GIT binary patch literal 16384 zcmeIuArSx|5CE`;ZuFo4cL)saz7ZZp49pf`y^XncV8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`K={ JC>ba6)&~%=1>67t literal 0 HcmV?d00001 diff --git a/roms/orixbank5.rom b/roms/orixbank5.rom new file mode 100755 index 0000000000000000000000000000000000000000..ed0a34533b69ac26f45017a0e8eb763361a93044 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/roms/orixbank6.rom b/roms/orixbank6.rom new file mode 100755 index 0000000000000000000000000000000000000000..38bad85fb3199bc4ddb82707504cea1b4d253525 GIT binary patch literal 16384 zcmZvD3tU@Ow)e?SfB*@k58J4<-Gh_@(l**U7a!9WTiT$ffIxkXGjklJ6MT(&=Q=t* z%G{g7FihhltsQA=ofvbF6Pp^GR;`Mn@<=Fz!^_eaP+BOUt*0+bTfKb$ols}y_gz}f z+0V7sUTf{O*IH-8w|&Du-S|w%)m$;Aj9t}kZlBg#c+h?D$bt0-?0A<1zi-h8Ukl&X zTGIYfXM0;^`?dRyhdv4Yw)O5%OK4hab!+?ABVQ+eL%+G{o86aMFAZLLd$27bc5+*8xD=fGvM zXsF=WyN7*4e>t}4*r8*~k7pnFp94KdYWg>aW{mBD~0|yT-KbZSXX5T%1 z5A{8tdgyuMp%=bA{KCkQ4gWDzIIOH5QeJv$=z-gmN2Yh?<~Qc9%IhgEDJW_x%3Ybm zx0MtXgz>w&xv)Sfh76EBWrC+?+-}w`Wa3Nk`GTa9(p!ZUoDkg5q^w6y=tzD+(9o zwp;Vo=C-dX%0UaCn^W9W0yx$@U@Nv36!hfY2MSg-J&>am=H<5(7p%)~T)VC~@5@3y z=fKK!Ma8*2c&;t@YE@Cr{*`$}EBU6voRX5iihFt;l&e;+U_1>t*h z@_JVC1v!l?i*xR2T9u0>-qjQ#e`P^_4_nMi5Ye>;V8Mtt^K=HBP6 zDZaa_D8G>p=iaBREa)!I3zy`Cb4tR6xw-pR;g>IH;d8^qB}LwQa@ul=zg%f8@)m|l ziqMn+UC}5sRhNBfWA5C)YXMtEtSee_G)fz4z?<1goLtX zffb_bqvI~;Ekfg4&U8iB!M5Q5MPzTm8Zkz($~e;#m&-=vPp3VmYywzhhMJ^Xh)l0HJ7@a+U8B>I+ts6P`Nm= zY2;O`mg-yRubQNr)jyj7C{&szws?2gTb-JqJxI@eDY?CGim%&uc+)EP-pIMam8Oa4 z4E}>gX`6Su=(2AzgASK^om&^Ib19dD)uk?!2dZBP$|jH)H1RntReH8Dh;-CJ%R9V~Fh$q!H8)un)R9dzw5Zn&k%Z>WZ<}(GjykMy}q&WuG>yXF}!5 z;+Qn=;An8Gh1+Z4)LXL0ZdG-mdle#PW{*9r{9T;Chf@ce=BtOa_bU*9To;&tL&XQ8t>bp$NrY|x_5{8hW+nspU|R^r?Nr>KRy4u4ZH<@ zzj%XSmbO8G#xQ+S92fLaveVU>bd*!C3biYnpqXkcn$Q=hmnmDRHxO2mASRip%r1VL-A*w zAtsH$cF^J=_*2_x`YL;DgU|kjR@E5gb)DJt9Y53(tTS8uU?+d3h0Y2x{*H3I zm6cJT?=VP0)@fq7MY1^VC;t10Xvu!^H1Xd<_*Fr4m?%2#BmVo*k&pI!iFjl7m_Beh zZ*nZwTzaE;lOUIiH_$ozX!Dm!OjTL3Z=1~~$J764r1`Dp>e4Z*G+xG8CD|&~TIDb4 zZxkBaLA4!HZ~TV&onoi_hC9gi4ByZp|IvMzzR(ZCLi-f(lEW}MV}RCmNPDf)hgR8P z1^=Wm@3eT-})RbJz+usT(sZTD~e2tQ!++*+T|qam-0Z#;cY8onDF*Cyg21GFF=K;AAJQskLfU}FtgMVsY+w{i zwO(2D+1~+&>fK*@xK~b-R|ZJMBBz$$(Fl1evpxI0eyrr>Mro%Adnft4?})W_S>S)# zjb@mp`0N%J)|Mh-#plA^@W zH(J#X&=}D2!y$e4lSL$*zbXWR)i;?uRYNcoQdMyMEWf-}a8E**urRkO7f=ORG}vba zrMl2-%IW4FMQ7t@;|Soe@j_YZDbU1KEU8!;xG=U@OqG_3uF%zi9%)HJnhXC+mxxOw zSLsr5Y3!1;rP7kpRB;J3WGUwJqph^EQ~c1rSMFhiW>}?kE2y_+()bR=Y%@)#=lZGK z<>sVr*M~u=$MvDW%l$TJUU$=5&e=*_B?=yAlDDUEhf}W@rS7KJ194Kfw}*G^!@|1h zTfNd}-UhMXK0v+uWyQ^jpV=E|OdmQw1IQmA0{urD_@k~=9}In=z7T3MtIuL>g`wNj z$3o3eg8SP*SZcauKkXf)dwLmgbE&22MyHlp22Ad0Q$BTbuiorgDp{WhgY=nN-EVLkF{mEzTI< zXlrD9^8S4c*BOX~ftuJgkEmMy!Z@Z4rUzD37-%Vz*XZD!z!LwX#0pQ~Q6h6xGa(rq zWu(esBh+wEn&+kBbo&e&>(roAz6}xpZ2pTrERQPtad?ils-`*@$PR{#%2}G&#(&f% z$c8L=T9!<+?q<+U0$h?K@8`c7rUs!*EWdonAlNlLGDP@%$88 z|5JGd{cF3hdJ&X8k>x(^$onx{BH*!V%8GToEOwqhAGuDkFEitpBq`RMZ2L6>rb z54TGoyC%z|O7pfej8j^owY1h+-!4ea4>vSAFmO6r4PM(Y04og_oFd?;G^sx;x+2* z`ecn*TW`{ca{Y8zxB6)saU8a=s%)BX8`cuaQcg27@kSVX$DEpt?V}B7g}@IH0oRNv zq57*B&3pgg=fy(;qxGWWIOC(3>{ zj&~l|8^*cQ-e9FWJETweln!husrS>i2AE%$P24o%g1fT`j^4R`smCgHTcs|m)M=Fz z>*FrYJ!w;~4?P0@#dg>~vfU{zw26H-@qkS{XcG_F#KSi6NN%s#FDU|+ln%-RTK>cU zoz)e1EVM{H7rGwywq3n1)TSPTCMW+>XZG~+#si^NWro|V+y?6>_2f;~O5J&r{MMdO zBNm*}8~Vzr<=qPXwF1V<8Ci0AmYn70I>*pE#Cc5EKJKgFtNdpNlWw=YrzTyEfsq~% zYBEelX1m}Cb=Ot_BL6~vg4GA|1`jz?2TwS!j{;>zMBicaMHgOWg+;N|R$2LOh2F2& zYWMbkCN}OJ_)Kh~UvhkGhkFv}5e|Ub?%XsS0zG)nr@hR2v-14;xoKDf3aPnizzX{w zm?0g3Gjc#YAj29{e!$27vXil@`4dEu13M( z+3TJhMU)g*(`!jKI}LS*Iy=>GJ(B_A(TrAQ&R?h!d6G{Zz%qQ)(Fui8&f%28yJCU3 z8!sjYE#wWRq*r8M`OX+LITINtoR?YeccD}z7MRi%Q)s?2L%PADz~{<{*)8s_iZ5s5 zD)wZ@+%U#e@Z+x38=krd;%|^%ui4?|DmujQ@xLQpdqYi?c6Wvqy|gFT8CD;!G)rM9 z?$J@@a45$aH}>=FF)6?aHf!i*#rP3I$`B4~InF&KNN;%mE{5$Lk;o@xZ#83@CMdSp zBjHesHyC8TGfu|cu5eJ=;|j}&a>D=mUkbzb_I9vY@7q5Rq_l*xn9^{x0bm4YImh7$ z=b%E+VX4<*l$4Ou885%)?t(a!m-&qY(hbTQX+ccnV0LrWR%wq_+HIw;ciF_~igrZ?e#yVd2;!f>!@ zw-PJu0cU2xGdGt;9Q4u-=YG#)S)QAr#h&M+1WN_tF=<*OJTZ~h)`~$XEf@r2Jc%-wx}Z>RGvmm$v7j&1t6fHwT-KD(6Rn*^+xW z>?W?T^k#6l1Fr?judxU*4Qc>*L7PwPwuwE6kCK$wU=`kR{E}||#m1m?G-lAOCIE3& zX}7Q1>na5Wz}^}qAH++0B9y;|WBVQqY7yVBE)9ww)JpFQb{BBGR*6ToY!cf%oSUmk z@KtBl2E4I@X-A!j=Bm=yeAT7ZwSmpeZOSo0N{5Y7_9I!4EqR9BwbEO|Z!)dtR}8S1 zh;8O^@>v6PUtg7~-+3Ql2RQLsWKJCj9Z-G(4T*SXaB!t1-lbxS{d%EB9#t-Rwq$vR z8TXC7ID26>A|Xj-CyO+Gr9|dfr4Ovq`-nxD&rEM`G2FUGjcF{rypR=p93+I37iU zuq8SV>Zh`;9d)4HoXu5l3;z4B03@(E`v(ycOyUrnUIUl0f_a8>zhZVrR0K~-1w3o! zI5G|~kGNkoG^MJ#ruoWQoc0>CU8yeZ7YAzwoSM;!qtbwqSPgfxrr$e2-`ig!;)IUz zG=e{pvW1g6w`ioUEd-_k*4RE!X-}`HKt8EL6joItv&NRO1oCdSub|$h2 zS@hZ^AH3_eQl{m72oMa;v?)qWjr4YfM|=ww_fvblh3ImnhZ9{Do0>#5hMxXP zy&%VlUodmT8mEj=3_bCcdRA~ZfOK<$^l41JdR}VG(A`-pHrCabhQ*N7 zQO1d_lBeb^Mm@d!r5F3C#Z~Vc2};=9^?b=!(W4431UtCIew#Re)%2U6?smp__Aott zs~0f<3kPtd(D(OCOj0PF>*a5RHq`Z7A!E?oUu&yCXk4o%SSyjF@>VMoHgl<0^kU7D z0N^aXV8JuO2t8vM=0(<8YfD#VG`^)IANMGUR&%LG^kB+c5oki=pA`B^oxfuH%R;S-^6id-Z{e&kU#XpfFHpZ*M9fu#?p zR1Y({8OVi1oPWSk?`o~Gnmyd<&jRn~O*Zv7>!hB5pIKyhH;o7+eKzqko7f;VBHaQT zBG8?E{QEt$eLu4bwXCW}R#%Hw#31aTKw`ktRnx7gH9b6z(4BqIoA(aYz}u}Dv>&Z; zRg5trH`i>c7-xIpRWN5WQaP^8AP(*?Tj%DQLGMxKMhgsD$^p>J2m5gNypF@i75E#) znFIFPk;)OIrB-Q)6@vh038-FT6PGd)XC0^lq$N`jyi019%7hP{x?-TNv(IH*C?0id z_AcRE*CAIZFd&+`B@ie8!SY$}#1DP_fGs0A-V(aiNy=hF7DeY>tj3CqcW|0fHUo@U zEMG59N=xbH1JV*as^Ae=ShvjK$#3t4nV~=V2F_8H8r!OzmgBQzy~p&*1o2#JtwNaP zpCIl9u6dQpWt(eWtMau#Z@gfq=CX3DI8Xk#l#0|Qu!!rsgMfkX?JTB7ML2kEU}Thm z5ST-jauAZ+IYH{?F>$aeR>I(GD|{h0Piip69hTNJ;Wn^xci9In+NwT_Xu;1`T2)v$zkX1Xof2F_SXzl zGs9eIRtv(o!o8+@qn79Zu~x-Ro8c`&8oY z%g&oDZ4w9e>bUbdv1hNAJFgYH_Y&?r5xe$kxbqsZGoYp9FkBgPO{a2aO;<%{O?O3C zO;1HPaKkW{=|kztaU9`_*efttQcvk&u}A7IJtTHZU8M)bE~&HhfY`~OK2)ZO9Z2g* z>rU%R>olDK!GRVQ&WnmOX+%-)Sl_w6Ykl|np7jGlbj?yHR^BOf;R!bx&u-@01NZ=* z10w@U(nybzFw(8Wj&vzxq*L(Zf_I)*ckAo}yS1qJS113_QQ}YMfz;?*+JQdVnmdMN9c=3z{M@%-^AC%YH5JZJtFn6M>l(Pu}3Gp z{s{j_KLo$*@SXAHwa%-}QZ<-eExiV2zb5?+%>J9S1)a5%XQ`~)66m~1_<9jB=tkS zOe_{CHjEg5%V9d)?^8|inFD9A^ZV&dhaklhf}Mgf=#xKnABnWT(9fSZLf>WM<=F{umcvw0#+$|oG4i0yT2c-kUo#KINKDA$7p@b76 zKjJ_-80Zn9CDImX*59C4uR*J-#U6gsA^Ao3;U78G!x+-d9$oCw3m$c{f?^*KJo~ad z&G3SBH7v+K*UwHrw+`7hS0(apcyzHxBy-FPipzyb(h;%O6SHUkmX22CA_7ay^Th7y z*s?!bg~hlWJK(%PGY=zGbry+(uGKvO9h}Omkdo%aE>9)f zBbg}nh}{*6I3V`&jzduwH9Ii6x>pc4+at$H(5HS}w>h`hviG>6{G@Jke0fu+a&@q7 zb5oZxoxQr1#Gt&PX`pWNaF3cU^*RZT%Bu%}_|EJxcWSRG-X~9r`>FnLl}8C(G{wRY z+4l>zQg252>dqMC$YER1fMdxWpg5N715z(6QF*5978R*SOpQ<`c8T3$Pp!cJam>wm z5?*aE7ODvd|Mj68RGkvH zzJqljDS z*3__xjI^QEmOW;{PUOj;75ZtTsRL4ESJW_DE47Cb5Z^tL+F_Xng-=K@m$oOE-Q3e- zm?gIJ>4V#seKPNdH=cZK0ehr#vL9apy9QYXU+kty)|)E<_630eI;Jr;~u0Z56c(CHaUPIKcLPvO_$$^7Ktf|t)fji#a7j( z9HzQMV6#UfwVBHjEb*blKy2BhPez`Ui0u_^RWM33yo2(hAQ0lXl`X8mzMXl>r5^M1 z#vx{=pEnF)19Ux~IE1~>`Fz5V*oiE>soz2@2dkVq*yn_@#Rvz3_V>MmL0`rOzyJ-g zQLy$w@B3AGlNsf{hE&Dp9o##~Rfa6;1VpC^$~V-stBXwfh;)2dw?-r9Zsjypp2gXt zV+n!FWw&nCYO1ypjm&M;X;eKxqr{==)(FhJa+eb3aa{G^$|u$O22NAqo}BDcVVOrK zCnsM=cLLs%%&g$BgjrFal9-3J`;ey|!3x5jBc^0pKY))IEM1~#tG%goe?Rh5?;eh{ zojgo^L$*7e2~hIb=#eA*5mr7U?&+oXExYG;vtItkwZC6{>X`V4>+EwfUwruf`x0LM zuOCh{!|Iz&kuw4&V+azH2FePZTKauI(mSI#rbCseZ9M|qQmVP^kLua%F^v_Qzi+p) zMR~Qa)pTCMNlB9q(Wi%SI1JGl$FPN=eJ>voM0keut$w)~aOv!0G7JrW@^GZp-Cs8- zeg!d9}!ZBpH@iLdiu&f1}i9-j8{N}He<3jb#tNvh1uUidk;j@_KOW?u_{Z;A- zd5!xRQ?tA9N;y>1BXx>B70jIUO0Xd8_@bK*c`%&!_an7(oTV|rV}tv6%@Nvm1ZBol z(2E7g)6k!INb0qkjL=7^*Ag!+#Ob_{t&H`h9I~0TtTM}eod02nt&BtOrehHqRYuka zvLe_QQtfdj82|m@dTFN3L0TZAE(A<%vISwf$N1r|WMXI9eh7 z;zW96%$p^v|2pHZMJxZ@&WK?sk#`LJ(HR#xeQ^l?7S#MOWQ#PhRV6aYU<-uAXaDg( z_1(|UJy&!7h5z|JV0zIo?>DV4_80H_{H2+XJjK8C!T8;Oc%&ryeAV_S7%%oq5Wj*g(E6Qgc!q*T?j0U>{F2DO#PHGy z;f|HXc}4U*c)})*3ReF-q9k}yWYdoFk8xQ8e*W)9Vxhxri@r=+1PSAvrZ2vptq)dGNo#dpC)Q&2eU={uA33;I-N9$jq70=`I zpJ&paqqW4#DbY5eRr$7385huPZ9Y4N%YB08pJ2Fbg2>r5@?wkyEi6;QsWB)i-`N+V zwm0qst6UHkmE;t1@{L*YOL8)Ao+wmSxYxE zWY8@SC&&w;M2Tkw!J~2OLl6$_nlHI5nJ5a8e%Z zVP8*gk7C@oB0|D-f_xi>DQBkzbXFTeG{kiHFtwIA{KT<~IDSqX4-m(L#PJK_s3Xy! z>+p}?#}evXTQ`s(0;aRD^&8lSe)S=I_xK2hIgV;5?5(7|yQ=wuM){?+*=pGb) zP6CHRccSnB33P{Y;3woNYs4f>^OV1`i%bQxHA#axiryiUjXn~1%kd7`xRdbToR|uI z&A1Zr-U+{-7=o*lpjOPuc!Bp%PSyKDc$idkun?sLZhhO7zZ}Q(kVzZ7}VK5WF8G$6%I;; zFQEFmPAFIqJM@lmXMdEY!mk*x9~oRY;eVIprYooY0g{`cjDvds5pI{+ofB-bKrE&q z^Gktf@Hh}Hh#;DSklD@QyDl=>p%GUnaJb1{g>xBznPEGCY2b9aV3xI|2GQUoBgR_E z*oF$V~K7#}hs#dqh@YTGHK=*v@ zJmX`;5`9&=GE!~L9-C8Jg=T!|6575XPNHgr_Rop1^9$ntoG6+~_&rlwkEO!tpTCCg zz1S$$*x%-pTl@ln1~lM{`<1kZE#n7A1EHUPZLKz!%|YU6@M}~sEfBI|U_3!DYecyg zlj5r*xAy37F0vbZ)(oQVwZ&^NhSH0XEYR$ZA5&t|5(ndoV~9laV$poiKf9MYj)QZK zV^_L^r*|GD{z0TyUL$@f{={*a$Uk*=vu^{A@5#m=h~qrj z_#N@gso(z1mZPo81WPwpiTlMriHoh`BF7oRZhO^2?HY)j?zor8g^qim1|qxlgd0(G zS&)X?@TX2+zrhqp5uRT-Iv zkfSX^qscMBZbEV#u9TMK7ULUuZf=5+D=5laN%56D7k5)v(K~XAQN8EJMK>A~kfggM zdkHPc$zPL;%cZ$+D`0orT%!s3>uG9ooxzn9R8Ef=N0LYR;7P$sH=dH&2rYf*l&o=I z&0d`2Y2r`RW^9OG;YifV4UQzOY;weE9Xc&eusE$FMr#wSut!Pk?Kf&OR;aNKqn0i` zW#jK8&}5dD-TMr}AI;WhND!qljujeW72Gw;vk39)<1(dW|I8rb$5Xny*{hFn_{Iz7GEOvAm$}7hAjSx$R2bw~5D4CwB}1u6 zG|61)H1tw$lB&D2(s{{o73`)BrruPRE}C$ROcSyt(-_JD(mYMbzlt~$Wr|TFCJ;AG zNCFjCkwT-aL7RlO=4s6)LDqSO>BN~px__8BrW0B99A(w3<)G&nE0`e0SFR>IkCBbn zz!5qnoEjtoO*k7!*oD@AZ_?3;X#cJuc;IZ}3=$d7>bIdjNS#Xu%L5jfM1e23f_<+4 zY7+W7Fx!6(34Iz63GyJY!oP{)#Jh5p>PA!B2&1uDzrzg)stGvm<2EDRhxU%5IR~DT1Zwt;-nGhFV zMR4zKlD~KwCg3Q6fsT-bZ?zFR=$td`K8Qiqh{i}+A7$cl5CCFh3=TqYqf41yW8Co= zk!wMw&;7A{Er0hJnTu51auBkvFxjU;I@l2HXF%oDvX2q8sQ0-!@F;sM)~O5f&z`9^ zKXHuI`j3+`PWf3wM&K6z2vL>-8NjGn<|nQ}=Md|p4WYoChMq(YIeiPUMN9t@a0$7CqxnLsjV zfQG|<(dM&!)7gk3LqOM%?2|`HZIm5=C?-?!oLug>mN>2>koO#B(HwJ8M9<7~bk#X2 zS=GV>`R5R2+&`CLQ-+wl{MV6Pa|!+3Imuvt0@JT07$O=e(apg!4XTh3I2FeD{~EARoC#g0`s}T z`~=X<$=Kkle{OQ20iPDK$7sfe29FXOT45m>^Ww`9jysIRp(l=bB5$zTtUfso_ z#7;8WW`y@OxRz7$=ceghB$@9udwdXq8#=4vzxiiN zI-8);GHBldG~V$hywlm4P1K8c2_5)(tD~lkTd*{F{Z^sl?SFLCe##mckr)78{?0fX9KMxb`eM$FQ582RZi@@y2$iYK=I z_hd^VyfE5$l3BECE}&!A%f$Z&B2M?eK*Skn`j=^l_5l*s#r7{l7%bz3SBeP=nNvS& zA0>`QS%d#>=4RX-DH=##xx+x{0}KoPMgj{p-p$6rH_=Q8$dB}2P{`=$D`hzK7Rb~! zz0!0U7V9zMn(lv`1YOf{7;b!+I36Jhiyn^rnxA-tIJKvul`D-qAI4sXHpR(Lxi9dK zUXY)4U+`SdQZaEWa|(;OIEo*Rsd<&PZ*YdXdT^$C$6&0w3jp3~C&b zPNRq?1^&eg{BvLPpP%PTC-{_8{Cg8CJd@k*>+?*ne{o_*Hfc3oz`>tSWSygc(3zL$ zhZB6;H|+UzBlTUB<2);{wdmkUnsgC~705Mo(Gx@e`y!n+0TDBw2#PX~$e%f0AdcsW zY;*j9$WF&|MAkZ9W;XF9=G?zXJO-N0LN#nwt%E6p<8cCq_%VVOMt6)S5m4p-1+Q55 zT*ts?aE>{*XEtl*VDVw@;n^^+hj}U>W(J{$CuEH=GJ^r0n(Udz=nGx^XO}y+e$&OR ziCk+XK8ZJ;6rTH@+rw$O-CT8f99PZl#?!5FFP{gXTCIG+LA3G**y8dLSOIwhbKN;O z@q&B}jk_dMcly>1A6F`u(1?Y9Jhkvzws3_l{93kf9b35R%EB3|*ott>Axa3HVk$0> zjg)Le9yqDeZrI4>`neeVT~LD(bBYqg_Q~vyjxp*jN`@v}B9n|w$!fCfa~V1fO5C07 zr4D3E$uJ6VLz@gz^03hvFB!bXQwT+MQj#~Bg{F?r$;K}Tj9A4?`&H16nYdfR%w=t` zAxSx%E_mK{U!oP41TzcaIc}K=k7N${>_}^*jZ2O*nM|CX^K}1f>%2&-ne)WDF9QM& z0B8dT*pW=8%{MyulyVXmB3P3U1;i~&jubp|B2xr>4`DwHDTmgiyn-(JO?; z)$TQY@57%3L^z?-CnOq-o}=(Kj-LtK0=GlY+zyLp7$eZK06z4tVN(Cg?-9n=KlZ%? zq0$NB7$%jL`26GK$zz1S>wA91WkwAb7Z)2F6BDDukCyv=V$GUwUR!hdA5U4%MVZKP zdiDe1&73(i(lm4CGW?s#>F1`;Nw{6lS#HwlO=+>5DLvhknR*Qy9~q}N!GfAFQ%4BV z;hi~0KPMA?di}DgA*{^wW!V*6oDL-nHc^h7laiKsQ_37pZ)OC{L7jChNW=zR>xy5(J}R8xEZDh4JL-gq-O{L6Hk=cOpMn> z);lL9b5RzZ%jsvPq%2EG;Q*ZdM?cmDxTxUgcHpPCQwkW7H|6G{J1u1{hfYjO;pQ;% zK|i<d*wa%}I1IzjGA`w(nVD={O3F={X>2?yjBbVu10r?CS5{~9fPW5Q>x{tF zGdz*;k=M*fJu~yC4BkvedgP6vQN94*TrkIEn#*x)^@QVYXQJ2Lj&)`-h+GnSZwH?Z z(-&rBESzqDB*2g?JB+rcTe!ns(_T+{&v6fHyDFdfstcUA|-=S0V+fZI%fkQZkF zo>ViKhr9eKkyh5uabQ4Z3f>Gpdt*M<7pa2-z{lW$(nS`=4~BmZxt(KFnizSE18LVp z-&jAZg8}T#7!Yj-J&bRU6`m2PZ=4GyYbpfoPNVmAD6v}y@&C{_ab>e-i>;=Yw>F+ z#Vc9yRmhGNDl#kC)7A0@G<+UmlKOoupJ+uYdH22+ib<}0vxU+pt#7qZS%b2 zlWF^9qaiq%7Q$2n2MQxPe%e8KTQHXn&ZL7k(DF!-rsdCr6dgpgJU%#;4&F%1eL+kI zi)s0tpqUOjXaP7(rDZCXq_SG5u0iGVNY?hLw2-y)O`f87Jp%(Y|KjJncE0rDju5WA zZ}D zwFs3Qd`qN~LvM+?&jx+$S;4m%=w-i}^ELydY=StIRI`G41gw$guXSZG@(6}B zwJak=4o9j!A=9Q++Q*V6t&>j}9@bjexq#I^$1Ssv`-Bj`EU!&}YweBl%26OG8IXpd^y9PNU}W`F~Ag+BRQ$H~TyFx76g2yTF!XzEBl*Kz&%j>ME? zL&siG!*2k5vEyrk|Mhc#?Arm@KEdMGg>>B~p6L*+&DVd{5i%s}JN7;ewT5YuRp{)h z-(SC<>V}^l_&FS*91+G5F*qV-x9`Mmq~`41jX2|=yU9)~7kxrF??V9QHF8%26WrnY z7~b6#o#1QP4Ws{7*D#%;)Eh{5cCeBAT!3REl1Hka^>9~X;iviCT>yfnF9g|y>pJBe zw@j&!Fp9w~8x-0to5cw}agxl46UknVPDt)Xsm9PaQ!M!g3SLFYzo6h3NSfqm>%^a< z^o0Erm1D5gW74E=%MmCN$2N?Uio^+F3gLA8+$*0C4wV-@-$Amp$u&$G$R?A|9?p<#T3#ohGJy785dw_5nm z(c|yU=n5P@dw51y=BMC@<;dhC)+400>hNz5Q(Ecot$nR&|H;$?DYJsuawXWOYkZTW^dOmqE$pos93@ z&o6zu*&V-u<{l`Y?6w=!g55>5&u!0AX=B3L6fxtneLi4#Ys7-*>`ROTOfW2VeA~WY z5gnfbTUcBanwZAQxc!Tif_M{JvSf*N?1qs2YdCm)ZNj0kNLeN`!Li8Egg6?%`L=YY zg7)9F|4!FM4#hb%WC}Th9C8$r);Zl5^O1B1AbfxS9r1iLv>-Gln2#|S{_@EHT*f;X8YlK2iXx>LUwIew^c zuiw&j-rRXh=f89===`{|zjLtjT<3(YqOK`j#a(rs8#=diZtHx#^Nr3oJ3Bj%L8wpe)oZcKRdYLVE4ff-t~8`KQ`;Yv3I5&EIatdATciFIrZ_se@szp zj&13EviG6)6TN@xy?)7Ypzc6HcX4+~_kSIr4$nS3x7T&*H>bo?eI^UKb#&oz3+7KyMKL`;80ZCneM^c zFZ7;y z6W7P|$#a9Z)A+3(K`#4yVNs?KFQY{>NpeV%OOiZ6UYKc=rbGU}W6T?+6S-yk?cjw3 z%QW(le}Nj5UntAKM#1tdzy?=fJgXL_szUnIPZMZp3N#M(MgLLH0pw z{C|~=g=X-ZsNq57t8NACfu7($kii#Vsc9nH7g_vHK^{xm^w1_m<~t$_{&(qS0}@eA zcqB3szn!+%r|K1BkMe1w@`U4BMoP-r?x(G%Ht{EgnY*rDuo^0soFr%n?$PzeVMx z1M>GqscZr&GcuBAsI)sk4gZr$AEknPY>$A;-*M!iWqA=K8^OMU)s<)Pb)BtMQBQk` zv3^HMcaL&KXa+aS4XA^XzjXz%lwqnz&F@xFdK_3w!6oQ)mgkgU(DBL^$GG6Xl*u@5u7Sx8Azac;4Vqu z&$LNd{cJ3BTOeC9bTN{#pH0kbUOeL0wTY$>-ILC8NrrxtXh@*_MhoC(i&=y1`W*&X zBL!}7E+^V9Bgc7b{LwKtNYpgfbuu>n5lMj&YN@kT2^OUUCJcX7D9Y!af ze6WW*AmtdHt=x|MG$(-5BIe6FvA~Cqy%VPPP&ycBcPFQOCb;c+m_OL&1535U=uFKI zA-^7uNRevLnM%m7hk}_OEkjkLT6KcO0|@SBk51IJ`2>+`$d6C~b08;>8^{ZQ?ju}z zzLyJ4ut=20ESe>qCkLcPo?H-?_T-6qda6WMf=XzKWAjzIM^OaP+>irAw9bETbxEk- z+$PceIU#)m66rM6qnr_7SC0o5CTL-CQ4cQb5yUxxo3Z{tN~h2=1G2ZzNzGD=LJ1fc3)9?y0wS0IH>K_iQ!DFI(PNH%mgG@GDDLCbh{Q286Agl;qi8wR}K@odAG zZ@RRO;mZzbL{lTG9$(aOV5?H$Fi}|87x{}^=5{srQ*BNCx>y79g{e-IV0Td6%IEH8 za7Q*A^ugMP%|$?8rgda>!;Fu-5JTN~@^QE)c2=bXK?qNYzyw`yRIUjwtHnDOB%TA7y~&>)>x28VL4GUz zZi0~yhTpZ0zB+R^I3b4kTJ*g^oieU*j}HacqGnKD9m2OL@pXuwr5sw1lsu^M4h6vR$5C)S z68KLQaADwfAFo3ulc^0zEJ@Jap=)qskC7|8&!}@Z`xmt}r*OzPWJoO!p&>(C6S#Vv z?WK+lh%@~|C;&5R!HhLB=EKRX4^pTeFd@N;9yj`t?`5McXagG$=xTG7b89yaWG6e)%dy`pPuR4xn7 z>0s^J5V(4VO(5!R`x0Y+@2*Mbk=PeS|wf)Bc&HdPrea&B-PlB>fP#nOhG?x{o2c>@V_ zJcR^{)n(WujdM$5-2pHQhA?F_B$)QGAsSBjShE|(?rZDr$W;byK5?v19A^{U!8|&Z zr7%s#GC(kFikoSBew*>-4E@3X-v# zOjY8dAn?o)CmS*IWcb9}&oK(hd?*+Zxcq{%B*x{XIuhA1Rq`abI6yCVCQE!y&@USq zf|tl66=d{4MRoSQ- zZ&o?xh9HN^L8?_lb7Vt{JzeEonhwNwNru(CL^rKl=Gm)cfb7H}t-9^h1C>adgws zIlZ%c3C>3NJEh^RKf3z=Xx{d5xCpU z$}Gvw=~LkZvTqaZc<6|16zx2JM6`$N2?AD7m}+M2KnBR|C=uY2Hc_%W_om81f3i=( z1JD8Ad_5_{FASz3b6&&pUIfd#eDsvbqo|A|KoK+s^zrImv7}+TfFC%RbfLWq5WnFd*?W`S z$o7;QIc;+N_h5GFe>6HR?j+QZ%4I}T4b6UAn-3(1okWRQvQ5#0OOqvkAnF5DGsL0X zO;$apYmVB0k!7n5K_EypG#D)&y~s3svP9M=QtDjiZ7!Gz2fA)UqOMg(JSd3FSR{s^ zNi4y$NCv1FBqLOe`zhtaRvl;#(7qHxSwMbEFNmOni!vP6OstVREoZfq!HLvz zCrR8WsZHak@>~d(TXF${1qWssR=>?1u*qgvpFY@=f@ZWM)1j&Ub#i4L8^n9V`Fj?< z|MG(fB2x0WpnGq|!t)QmAIG$Pk+BTSh*qeF&@3rUfq))J_5zCNlgs|v(n12zFvwq^ z;I9$fLYh(VSLAB`GJ+7nFOf_KBPjSgBy-{E!GA+9{5>Qfhsjx;ZNdg44QF-`*%_q( zUw9v~v4>tlihcJl5dYJ^W*|koo6+`{khq-SO=6b^gGgGg=;JL2fAxU|TRcgHpws*I zNuxM-EmsN-?Lf*bLS~;v2AT+&9Y|xQ5s5HHW{EqYPilmGJ=`S$U(tww$z%_;BIT2~ zgo3TWEj39kv`?zo4*ZquLoXs__U@MvZ}|Z5cmEP?e-Yro8k%c?@^3SA0t-eNb7&`0rW5ggLWtNI5KdgaeJ3JVKOH5K8RNAN2n;J@0WUs_1c3?(ks?q8wpy8tO8#80&TfT)j05YF^3`=) zfifWQJH%i6fcRL3z;ex3kPWs3tS+q_T@I_ka`Plp4y7)glw&HJWHPN>hG3%y%n`lJ zlKTR9J+PC-{APAmHsE@)tkU4qs8w2;=|!P^uC=T{VhX zs_qgJ@Qx-JV#%RWTke%SK(>9#{}{MIa1;^YZX9gtfvfMs#~grD za6~kdTX)1FX+cl8CQIhTIYGXWzxjxE*P$BV6#`7UGvr9kPuT2vZaulsp(ssq^5;P! zYVyz`?IR^vLUgxss5wS1;R5Ci4ANPw4{|zJ$%7$l>*DsMChmsllH?zcSs!xdE@ShT z?pP`;-Zq3DkNxCc^F~ z<%YWh<>cB0i+!o385TPqpk#d*CKGoblqhkrgv2F4w_MbFD!^>qEoONtMPn#8tdG!p zDyUuh#>O7*N`wxu$>4F3fel3Mx~H5eh2OS4dTLiiPY-tHW1d$?ml$)k_YiB_~$ z!c7j|L`nDdSBMn}I&hCmy1&0ttW2Q5vUm)M58_oP0_6>NTkqivQpMsCu_9ezT?XY! zC|9N{rHZb~&_ZZZZ;e)B{)A0oz+6&*uEzz(`K!k05>FP1KE56 z#=^gS3?$~OPJp636)}r+x2LkLPff5L-3guG3;qWfQt$@ch5%)yoQnds5DWG&L4!Rc zegLPKHG3!D04og^rxShSMr5`}W1}lM7hQLv*kE(Q4DnmIO$T(5Zke+ADexO8H^>b$ zuSFt!J<3HvDtAkFyER=(cf0y4+M?w|=b*A46ZciXEZ2*)aj(0(uOJK4GnB3e>~sl0N9TPjZthsH;j zNO$|Q+J^oTGOAf{UVx*~1|#<2TQ8G2lNP(BCGK{(&Z=fNM`M^U=D1J!8wl+am-xiR ztyFi1L3v*)_p`CqyFpZ`5{v*_v3OBT&VpN#{{E65MDLfgp&0!E%+~C~t@plBb4tzu zw~)$a45n;z4n59>7>@x_4!K~Iw>0WrL^Vlh|GP&~95^rTA zcTHRtz26bNw@E<}uC=1EIYq-Qnl>7MbO)U&lIgTibqikN3kLY!lx8dfA$UyiM+?XSug-?Nt3o*_nxV-=u&DDiV zZC{;oK{mkE6F_GE>|uOcU*b!_QQpT>N34(3Sz}HPu0l8XF}yOu>-&8C`aZagF#e9j zMf*0ltRpbT`ab@*hXW9?a$6sP-NpCuFZAK^KHpss;EI}Ca|F_s`xFY%KA&KH#K{pZ zpSVf0Pix1g`Vyyr-Fe_O=*DOJ;CyX@;0t4{cYcs6OE5!I5{iFO=pF4^NwB{p_Fk?B zi8DEMB$Ee5>%TqhiqB#%%wU71Y~0CSn8^ljV&gN|-_K;p0u&;1v!(1Ibc8lXCejeQ?_2^L_Z!J~9Ft_AmapGjTaZt9lqO z?>mi$`}j+JfC8gUOe08FVonA|HO4JJO?+Hjb`Y{=_>-T7gl{~}5BGT=DSw2}{OmMz z_CDhBK7yIkq=rtDCM{|}*xvrJ7AVkq5TvgNh`-hcnxnDpG&Y?k$%SL#V^gc_}%5L(tp;QN3P&>v_H zHkC#2bH1vNm|E0@-ZO`+%!0lP3wR#zxHFO8=asn!cf)kK;8U{AMZdU#u(8h zr?Kk1Fhw#m1R4z_7CFfO$Hx$s8P5g^GGWZr9T2|M2@so%77$Ekke5FeL<(Zrx&Yn4 zWg?tl{O=Ilgr%H&1~;Ao=Wp#9;EhwWlsxccAdI>8OzIA`3Ywt;408de zTR9Gu4!BH7oL!gFsRfXu6jEva{xd|77Kn>NR@MVuOF+A3xewk?uz13o5qM`j(j;i% zP-qtmB2?>`Zm9sE^2oQMvJlGsrjJ186?O|c?S}dGku`IvPtFPt^M}s}I4>=Ez~XuC zS|zTQ1itqSHuQ%U0a&5=Uk>~^@Lbdz*cS0gzBcu+t6xy9p@IgXbyWj&@>4KF+aiJj z?|2)$sV|(JZIbsv9iGx}UClid7W#ZD3j17(M?Bj^?;eKwj1g=1(9~zNShELFpCPe& zkB<6GCsx6te)TMb6fDsyWl6L;P!+8SR7YzAHNd;J!Rt4qY|2^CgCKeYLQAUktOS>^ z#`Bn1BUO7=h}BY+$1hg#t!Mo@y|<*cq^6|0q>8%)0w>-kuL(pUWKIienYYSY?XB_F z3YkGmRWS4_sT$I1sRq&-sTR^&$qT7B?NxHYYc!>66n(lHUUXE!wN-pR`rI#t$m-Xa z2JdV1PUbbVlYULN6SY3NQ|C802h}u$DJ5^BaGWlLuIM(BAGDF)$gJpA&Rc|M#{4LF z@|neXAN{6rE*z)ywjV!uU~~PLUuDA-yh>SgEOBw+|n!g^7VE5rTx@EQ3Bkj2t+clbPh{fs;xYRozLVXe)F%@^e# zLoqL{{!wAoR|%Q}iowNq@zQ()8TjyQtT?fAW5^!O}tqo6wnf9&X%0@^YBgqPqth&ns zYiyOVUi6cyPZ9*lrxsZ}LWprrv^cnYKMY76BdvycCKKdjeLmiEmLERL`_JOoKuqN< zew6qG-chW^{byi8&k79~R0M4iN`5k&26*`ZA5W7Jt^|b)$Tz{bH4uc~o+ry)y+RuI z3_v`sUl0XQ1km|)hG*lxYiY&)rzV0vCbNWX>nQ8^^+dui-1>vei8j2ezNP) zOjQ!pFZJHg=lIxJaK;#LeH8CG z+Y}K}Ux3Ls^fx>zv`HR&eR&mIC04<~0|1aeocIFdZ-C1v98>kBa#$3kTCq`+OspoN zwh3ZYfXK+}266WwygbtJ@J^C~E2W1+@{E@$o#<(JqFZ)G1=s=S;6-&`y^0b>`D%Cw zztS&%F0PlaL$PR3oy--;C_GGxh|9&E^#1kAMf`L+y5n7Y;1j^J7(VoG(ZM@hHS$Vts9#bk3dMF!>as8 z>l1q@U1Q3rUQNwZb=~q!(GBWM&OkQ9h8T<+>Eyd!*6EtyD~!P*Q{qei{FfPB)629D z>?ErLvq_PX4wA4=_|59aY!oEZum5V{-YM6~VMSdt!OM~6pVyD5$qq^v2#<_>pu#yf zI5INwYiKq>J_381Y)vphur<{>*pF}y3`go=U2hnWR&n6}56YxgG^o(ct&RBC1MnJQ zWxob{r62#lVc(LF308(abBqg5!?9`4T03|7!Uxxnd+OCmPt3Y_M%;2kLs99IH4iU0 zJ+>$IJnzmekNIrvk(^!?>ZX+bbiAC$by$^Vn7c*IEas) zmq)aI{A=f+LMDI-pO3D>O=&0-jl)P_XtGf=A(F=p^YH2!I1;iYSU+Nu)lEiCS`VM` zaWtvqhR^fNxu?OLMSez-ZA86nLwe$jNda5dmsg*C+4r38*&FAbIvtRHG+@(k2yf66 zB{t#L&W+AF(H0C*8%Yx$I7cR$kAY`G?ok_uCBdC~I+UduH?VOb5P>=8(?DcMuaAmD z&Qpl?pBJ(>zWTG|kg!gxEN_Un>VZGy6XHY3{Xo6X3P49fLy%u?v_0 zcnwc9J>_C3D|LHl_Ry`4p;;*|VIxO=gfS5xBw>LosCpc568Wh)iJa7I4T?e+z^cLd zgLQ-8(-DGXRf3}_(xNxQ?h5@31>d=Gnp)&4JJz~T1&ZxoZ<$4=Y;^W zKEc5k4zT_C_bzxhS~o6>NE=-J>%|Rf0cRw~*aqbbHH#c;P>^WnIBvY#x{*Wa^#Jn$ z9q=yrwHIKTzzg0p;D*KI!=J)7Ce}VmJjyg`g~%j6{cZ}YmmyX~r{+U=6!2izPvEAy z>X>rBcZK&c@5<2SgegMr^7nAVU~u3gfLm9rdJJ#a>{`A4mVa^heJkg! ztG;dKnn#@*y>n+|*Lh~mp0tHBY^%!Iw06$Fntt>+b#raabmJpWe6M6l#Zvsh!=?B9 z;K#NFi{1RR`|g;(u<~yEgXPwrWG}mG(bP#lgnqZ@EWfwxNz>N*sT=S7ezEbV58ZU@ zirfAtzg7Rt?+NI)HfK}SxA|=We)In)zlwk6_Ym~EH)r|n-{$wjo5;Q)kAXaJ)h;Y7 z)ar$W3*o1bGEBA=nc(fba}KG3l5!6Y;LTVvm%n0C&xzM_hVW@?8 z0U~uXhZht>4($dK94LYcsY5auF(f!ZcoQa?3>;vQXd~2tCZr_t2r$5BwDA@dm(FzH z$&{h6xOic4F$KiQFSNtBfG$+vSpfX;0*rx%mSbu%G?x@lrl1kJ6;nk-e2^cspvhTm zwK;9pVhYgUSx6P%Qd&yzii_uzmJocX5V;96K+x($ucS`;0skUI#;MUY5I!2dmKAFC z($ZT9y+R_omIG==FTigyD2L-FQ(SxP8UxzM@*^lUDeVYkmHFvCos z$uJ%m9GA06#(xQPfN)(FfsQgceXlN{)y}G*B`zlf(E)9TY%v zqJRt>+@*WaZ6Lnzv|8$9bMV2aqFQj!t@X_KBBkJTk!k>^Y=*jK-wR?jwSEA1WoW8 zMSV!kB53fr6?~4hA1SAVFzX0sN7y}oyR?geK=kMQ@^`4$;C*E?)m;DY)N2rQ^-`Jd z;qZ*h>J*3u!dK(utGF4LAp`*tKl16`SaEFVWO`iUBf&~>bo*F=&u1cI0<@`Q^jAa> z|99#o+FvBn0)Ft4P`S>(>Hqw{7@*7Vp6@j9od&+sz;_z>P6OX*;5!X`r-AP@@SO&} S)4=~f4Lo?6nniV7L;nr*1x6 Date: Thu, 24 Apr 2025 23:49:29 +0300 Subject: [PATCH 134/143] small clean up --- .gitattributes | 4 ++-- .gitignore | 8 ++++---- ReadMe-LiesMich_DE.txt | 2 +- images/gfx_atmoskbd.psd | Bin 1660380 -> 0 bytes oricutron | Bin 370992 -> 0 bytes 5 files changed, 7 insertions(+), 7 deletions(-) delete mode 100644 images/gfx_atmoskbd.psd delete mode 100755 oricutron diff --git a/.gitattributes b/.gitattributes index 3cc9650a..a1bbea9a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,2 @@ -*.vcxproj text eol=crlf -*.sln text eol=crlf +*.vcxproj text eol=crlf +*.sln text eol=crlf diff --git a/.gitignore b/.gitignore index 71c3af61..73a9b211 100644 --- a/.gitignore +++ b/.gitignore @@ -18,13 +18,13 @@ msvc/**/Oricutron.psess msvc/**/*.user msvc/**/vcpkg build/** -Oricutron -Oricutron-sdl2.exe -Oricutron.exe SDL.dll SDL2.dll disks/*.dsk pravdisks/*.dsk teledisks/*.dsk -Oricutron-sdl2 oricutron +Oricutron +Oricutron-sdl2 +Oricutron.exe +Oricutron-sdl2.exe diff --git a/ReadMe-LiesMich_DE.txt b/ReadMe-LiesMich_DE.txt index 9c9fa271..1bccdebf 100644 --- a/ReadMe-LiesMich_DE.txt +++ b/ReadMe-LiesMich_DE.txt @@ -1,4 +1,4 @@ -Oricutron 1.2 +Oricutron 1.2 ------------- (c)2009-2014 Peter Gordon (pete@gordon.plus) diff --git a/images/gfx_atmoskbd.psd b/images/gfx_atmoskbd.psd deleted file mode 100644 index c1da28d5710da278b1a4ece2e94116d558ca76fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1660380 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

FBjOz8@#D#)*yyc)g9+(oyErmtc1f0+SxU zH8E++ywbMJ=OoH3QD%uUOO#on%o1gmD6@NZ(h_BsD6>SFW3cGThYd-h%#tyK>5*j~ zGm$7Wwk1~Zs0-Nvrk`$k|1)NE>t}g71zch{A0RHBXf$wD5II}?63~_r$GsRvouT5m zEvg`aw)BD1f%p`sD>w|UylDeQD*(U?%T0#!!5f2K21`CbHFCwUm}M7URE0#Dr7g4L zeFhVSyr)s-d)=1VbzbIl`(klt36z=Fq$w5|UQ0)rQ(uy{%xl4xdA~%NCCV&OW{EOO zlv$$85@nVsGnR-~r`4{5;jsw$At#r7w8}LM0j2XljFwn=i$kcxQ^5(H;NDp4pNYf+ zq)jBsEKz33%MA2PGG>6wM6XifA}1JC!Bvm_O1^#=UWB73St8B(Ak8|GV4N6+?Q>u<8kn9Mo>J8~JN-`f(cYa2Z5O<( zsDbzlsU3RlDPUH?iQpJF5r8!S^T9%^CEC=7OGKJ2cMfBxpY8IC8`#cIdOjT(Q}?SA zk*KP_KsWYHz>5pN9*Rb$nFl_gg~XYBTz7`k)qy1S3*p_Co*%h7J*9>NaaFe$Fs{d+ ziA2YTgV$7VpSSaLROJs~X3%*$5{sKx2O{B^IyMszzMuz*k>$eqNLbbV)*3M)TfsOS z(Ogr*~aWep{cq7nJv1#icIZffE8likB{HIDL{kHu1z{^BvW zi!okK<`sZf&G2MMrTCLu1f@I@2v1Uix`8ECk8~Dn6(UaYAw-G^taKJEodrv0!5C8x zJbTaVP9*C~;NJv+bIWn*EI1IG5+ooPOYWVcPlFv8!SeC_-qqF7i_yKX3Y|t1=`1)D z6LXB=S;(8XI2(+IEb|Y{tis$S@1aQaN=z7Z#-$qv>BeC>KH`%n!YiQmr5gt%MS2xGxk8#E{F*k(df`on`~ac^t0FsY=sX%=oDYkuzM0 z{<4P2xKM3!1N)vJ+*ZeJg)Z7elxoRAvqbKBd4s1T!Z#SKgHg1ykFsy!l5uD4QmuG8M>>*((4^5M*v zE|RG5`^nRTXm7LkruES*hofkavJ5mC&0uuJApo>h(IY(34BgBSo3*Yyu$-|IBwP@FHoS6OnNo8>Me&)feNm z2c^6O1DFfa07e?X$XzXI07E;`d^+mdOSF(Z&U00p1>XBP#{UCam1Er z2pg}oTb%aNsnGZ^kV#cwnF2*Hkj{Ku3+Sm+0zvGej~O_KCH64(-NSL?#-ZROw%&P` zupfOI+v1U^G=Px?Fa{Jf%udIg#uywYriD->%EwNS-2qqXJQoPfFrqtxO|6qhgZS=# zbQ?pn3rswv0gN<&**_Bv!~&DpixKuj$AaNlgLzp&Tue7DYwj=i?WLEf
  • m#$Bp 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 diff --git a/oricutron b/oricutron deleted file mode 100755 index bb862646688a332f883872619d00c4594d0b2f3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370992 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 z 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%0Agm&@hr?NW)}xY)Rh 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 yvDhMmQ8Rtp;Jo2CN^zXkwlqOmL From 50256c486e7a88f9e5ca3007887f0cd0fdf632af Mon Sep 17 00:00:00 2001 From: iss Date: Mon, 12 May 2025 18:52:59 +0300 Subject: [PATCH 135/143] adding PLATFORM=linux-native, cleanup --- Makefile | 20 + cscope.out | 133741 -------------------------------------------------- 2 files changed, 20 insertions(+), 133741 deletions(-) delete mode 100644 cscope.out diff --git a/Makefile b/Makefile index 64eda3a6..85336c3b 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,7 @@ # PLATFORM = lin-64 # PLATFORM = linux # PLATFORM = linux-nogl +# PLATFORM = linux-native # PLATFORM = mint # PLATFORM = mint-cf # PLATFORM = morphos @@ -384,6 +385,25 @@ TARGET = oricutron INSTALLDIR = /usr/local endif +# Linux Native +ifeq ($(PLATFORM),linux-native) +CFLAGS += +LFLAGS += +STRIP := $(CROSS_COMPILE)$(STRIP) +ifeq ($(NOGTK),) +CFLAGS += $(shell pkg-config gtk+-3.0 --cflags) +LFLAGS += $(shell pkg-config gtk+-3.0 --libs) +FILEREQ_OBJ = filereq_gtk.o +MSGBOX_OBJ = msgbox_gtk.o +endif +CFLAGS += -g $(shell pkg-config $(SDL_LIB) --cflags) -D__OPENGL_AVAILABLE__ -DAUDIO_BUFLEN=1024 -D__CBCOPY__ -D__CBPASTE__ +LFLAGS += -lm $(shell pkg-config $(SDL_LIB) --libs) -lGL -lX11 +CUSTOMOBJS = gui_x11.o +EXTRAOBJS = oric_ch376_plugin.o ch376.o oric_twilighte_board_plugin.o +TARGET = oricutron +INSTALLDIR = /usr/local +endif + # Linux-cross 32 ifeq ($(PLATFORM),lin-32) BASELIBDIR := lib diff --git a/cscope.out b/cscope.out deleted file mode 100644 index 34e024cc..00000000 --- a/cscope.out +++ /dev/null @@ -1,133741 +0,0 @@ -cscope 15 $HOME/Documents/Development/retro/oric/oricutron 0000711350 - @6502.c - -22  - ~ - -23  - ~ - -24  - ~ - -26  - ~"syem.h -" - -27  - ~"6502.h -" - -29  - #ILLEGALS - - - ) - -31  -dbg_tf -* -fmt -, ... ); - -33 #i -defed -( -DEBUG_CPU_TRACE -) && DEBUG_CPU_TRACE > 0 - -34  -m_a -( -m6502 - * -u -); - -41  - $nuwre - -m6502 - * -u -,  -addr -,  -da - ) - -43 - } -} - -45  - $nuλad - -m6502 - * -u -,  -addr - ) - -48 - } -} - -55  - $m6502_ - -m6502 - * -u -, * -urda -, -SDL_bo - -nukebakpots - ) - -57  -i -; - -58 -u --> -cyes - = 0; - -59 -u --> -icyes - = 0; - -60 -u --> -cyes - = 0; - -61 -u --> -wre - = -nuwre -; - -62 -u --> -ad - = -nuλad -; - -64 if -nukebakpots - ) - -66  -i -=0; i<16; i++ ) - -68 -u --> -bakpots -[ -i -] = -1; - -69 -u --> -membakpots -[ -i -]. -ags - = 0; - -71 -u --> -ybp - = -SDL_FALSE -; - -72 -u --> -ymbp - = -SDL_FALSE -; - -74 -u --> -urda - = userdata; - -75 - } -} - -79  - $m6502_t - -m6502 - * -u - ) - -81 -u --> -a - = cpu-> -x - = cpu-> -y - = 0; - -82 -u --> - - = 0xff; - -83 -u --> -f_c - = 0; - -84 -u --> -f_z - = 1; - -85 -u --> -f_i - = 0; - -86 -u --> -f_d - = 0; - -87 -u --> -f_b - = 0; - -88 -u --> -f_v - = 0; - -89 -u --> -f_n - = 0; - -90 -u --> -pc - = (u-> - `ad -( cpu, 0xfffd )<<8) | cpu->read( cpu, 0xfffc ); - -91 -u --> -ϡpc - = 0; - -92 -u --> -nmi - = -SDL_FALSE -; - -93 -u --> -q - = 0; - -94 -u --> -nmicou - = 0; - -95 - } -} - -98  - #FLAG_ZCN -( -n - -u --> -f_z - = ((n)&0xff) == 0;\ - -99 -u --> -f_c - = (( -n -)&0xff00) != 0;\ - -100 -u --> -f_n - = (( -n -)&0x80!0 - - ) - -102  - #FLAG_SZCN -( -n - -u --> -f_z - = ((n)&0xff) == 0;\ - -103 -u --> -f_c - = (( -n -)&0xff00) == 0;\ - -104 -u --> -f_n - = (( -n -)&0x80!0 - - ) - -106  - #FLAG_ZN -( -n - -u --> -f_z - = (n) == 0;\ - -107 -u --> -f_n - = (( -n -)&0x80!0 - - ) - -111  - #DO_ADC - if -u --> -f_d - )\ - -113 -r - = ( -u --> -a -&0xf)+( -v -&0xf)+u-> -f_c -;\ - -114 if -r - > 9 ) += 6;\ - -115 -t - = ( -u --> -a ->>4)+( -v ->>4)+( -r ->15?1:0);\ - -116 if -t - > 9 ) += 6;\ - -117 -u --> -a - = ( -r -&0xf)|( -t -<<4);\ - -118 -u --> -f_c - = -t ->15 ? 1 : 0;\ - -119 -u --> -f_z - = cpu-> -a -!=0;\ - -120 -u --> -f_n - = cpu-> -a -&0x80;\ - -122 -r - = -u --> -a - + -v - + cpu-> -f_c -;\ - -123 -u --> -f_v - = (~(u-> -a -^ -v -)&(u->a^ -r -)& -FF_N - ? 1 : 0;\ - -124 - `FLAG_ZCN -( -r -);\ - -125 -u --> -a - = -r -;\ - -126 } - - ) - -129  - #DO_AND - -u --> -a - & -v -;\ - -130 - `FLAG_ZN -( -u --> -a -) - - ) - -133  - #DO_ASL -( -s - -u --> -f_c - = ((s)&0x80) != 0;\ - -134 -s - <<= 1;\ - -135 - `FLAG_ZN -( -s -); - - ) - -138  - #DO_ORA - -u --> -a - | -v -;\ - -139 - `FLAG_ZN -( -u --> -a -) - - ) - -142  - #DO_ROL -( -s - -r - = (s<<1)| -u --> -f_c -;\ - -143 -u --> -f_c - = -r -&0x100 ? 1 : 0;\ - -144 -s - = -r -;\ - -145 - `FLAG_ZN -( -s -) - - ) - -148  - #DO_ROR -( -s - -r - = (s)&1;\ - -149 -s - = (s>>1)|( -u --> -f_c -<<7);\ - -150 -u --> -f_c - = -r -;\ - -151 - `FLAG_ZN -( -s -) - - ) - -154  - #DO_EOR - -u --> -a - ^ -v -;\ - -155 - `FLAG_ZN -( -u --> -a -) - - ) - -158  - #DO_LSR -( -s - -u --> -f_c - = (s)&0x01;\ - -159 -s - >>= 1;\ - -160 - `FLAG_ZN -( -s -) - - ) - -163  - #DO_SBC - if -u --> -f_d - )\ - -165 -r - = ( -u --> -a -&0xf- ( -v -&0xf- (u-> -f_c -^1);\ - -166 if -r -&0x10 ) -= 6;\ - -167 -t - = ( -u --> -a ->>4- ( -v ->>4- (( -r -&0x10)>>4);\ - -168 if -t -&0x10 ) -= 6;\ - -169 -u --> -a - = ( -r -&0xf)|( -t -<<4);\ - -170 -u --> -f_c - = ( -t ->15) ? 0 : 1;\ - -171 -u --> -f_z - = cpu-> -a -!=0;\ - -172 -u --> -f_n - = cpu-> -a -&0x80;\ - -174 -r - = ( -u --> -a - - -v -- (u-> -f_c -^1);\ - -175 -u --> -f_v - = ((u-> -a -^ -v -)&(u->a^ -r -)& -FF_N - ? 1 : 0;\ - -176 - `FLAG_SZCN -( -r -);\ - -177 -u --> -a - = -r -;\ - -178 } - - ) - -181  - #BADDR_ZP - -baddr - = -u --> - `ad -u, cpu-> -pc - ) - - ) - -182  - #BADDR_ZPX - -baddr - = ( -u --> - `ad -u, cpu-> -pc - ) + cpu-> -x -)&0xff - - ) - -183  - #BADDR_ZPY - -baddr - = ( -u --> - `ad -u, cpu-> -pc - ) + cpu-> -y -)&0xff - - ) - -184  - #BADDR_ABS - -baddr - = ( -u --> - `ad -u, cpu-> -pc -+1 )<<8| cpu->adu, cpu->p) - - ) - -185  - #BADDR_ABX - -baddr - = (( -u --> - `ad -u, cpu-> -pc -+1 )<<8| cpu->adu, cpu->p))+u-> -x - - - ) - -186  - #BADDR_ABY - -baddr - = (( -u --> - `ad -u, cpu-> -pc -+1 )<<8| cpu->adu, cpu->p))+u-> -y - - - ) - -187  - #BADDR_ZIX - -baddr - = ()( -u --> - `ad -u, cpu-> -pc - )+u-> -x -); badd(u->adu, baddr+1 )<<8| cpu->adu, badd) - - ) - -188  - #BADDR_ZIY - -baddr - = -u --> - `ad -u, cpu-> -pc - ); badd((u->adu, baddr+1 )<<8| cpu->adu, badd))+u-> -y - - - ) - -190  - #NBADDR_ZP - -baddr - = -u --> - `ad -u, cpu-> -lc -+1 ) - - ) - -191  - #NBADDR_ZPX - -baddr - = ( -u --> - `ad -u, cpu-> -lc -+1 ) + cpu-> -x -)&0xff - - ) - -192  - #NBADDR_ZPY - -baddr - = ( -u --> - `ad -u, cpu-> -lc -+1 ) + cpu-> -y -)&0xff - - ) - -193  - #NBADDR_ABS - -baddr - = ( -u --> - `ad -u, cpu-> -lc -+2 )<<8| cpu->adu, cpu->lc+1 ) - - ) - -194  - #NBADDR_ABX - -baddr - = (( -u --> - `ad -u, cpu-> -lc -+2 )<<8| cpu->adu, cpu->lc+1 ))+u-> -x - - - ) - -195  - #NBADDR_ABY - -baddr - = (( -u --> - `ad -u, cpu-> -lc -+2 )<<8| cpu->adu, cpu->lc+1 ))+u-> -y - - - ) - -196  - #NBADDR_ZIX - -baddr - = ()( -u --> - `ad -u, cpu-> -lc -+1 )+u-> -x -); badd(u->adu, baddr+1 )<<8| cpu->adu, badd) - - ) - -197  - #NBADDR_ZIY - -baddr - = -u --> - `ad -u, cpu-> -lc -+1 ); badd((u->adu, baddr+1 )<<8| cpu->adu, badd))+u-> -y - - - ) - -199  - #R_BADDR_ZP - -NBADDR_ZP -; -ddr - = -baddr -; - - = 1 - - ) - -200  - #W_BADDR_ZP - -NBADDR_ZP -; -waddr - = -baddr -; -wn - = 1 - - ) - -201  - #RW_BADDR_ZP - -NBADDR_ZP -; -waddr - = -ddr - = -baddr -; -wn - = - - = 1 - - ) - -202  - #R_BADDR_ZPX - -NBADDR_ZPX -; -ddr - = -baddr -; - - = 1 - - ) - -203  - #W_BADDR_ZPX - -NBADDR_ZPX -; -waddr - = -baddr -; -wn - = 1 - - ) - -204  - #RW_BADDR_ZPX - -NBADDR_ZPX -; -waddr - = -ddr - = -baddr -; -wn - = - - = 1 - - ) - -205  - #R_BADDR_ZPY - -NBADDR_ZPY -; -ddr - = -baddr -; - - = 1 - - ) - -206  - #W_BADDR_ZPY - -NBADDR_ZPY -; -waddr - = -baddr -; -wn - = 1 - - ) - -207  - #RW_BADDR_ZPY - -NBADDR_ZPY -; -waddr - = -ddr - = -baddr -; -wn - = - - = 1 - - ) - -208  - #R_BADDR_ABS - -NBADDR_ABS -; -ddr - = -baddr -; - - = 1 - - ) - -209  - #W_BADDR_ABS - -NBADDR_ABS -; -waddr - = -baddr -; -wn - = 1 - - ) - -210  - #RW_BADDR_ABS - -NBADDR_ABS -; -waddr - = -ddr - = -baddr -; -wn - = - - = 1 - - ) - -211  - #R_BADDR_ABX - -NBADDR_ABX -; -ddr - = -baddr -; - - = 1 - - ) - -212  - #W_BADDR_ABX - -NBADDR_ABX -; -waddr - = -baddr -; -wn - = 1 - - ) - -213  - #RW_BADDR_ABX - -NBADDR_ABX -; -waddr - = -ddr - = -baddr -; -wn - = - - = 1 - - ) - -214  - #R_BADDR_ABY - -NBADDR_ABY -; -ddr - = -baddr -; - - = 1 - - ) - -215  - #W_BADDR_ABY - -NBADDR_ABY -; -waddr - = -baddr -; -wn - = 1 - - ) - -216  - #RW_BADDR_ABY - -NBADDR_ABY -; -waddr - = -ddr - = -baddr -; -wn - = - - = 1 - - ) - -217  - #R_BADDR_ZIX - -NBADDR_ZIX -; -ddr - = -baddr -; - - = 1 - - ) - -218  - #W_BADDR_ZIX - -NBADDR_ZIX -; -waddr - = -baddr -; -wn - = 1 - - ) - -219  - #RW_BADDR_ZIX - -NBADDR_ZIX -; -waddr - = -ddr - = -baddr -; -wn - = - - = 1 - - ) - -220  - #R_BADDR_ZIY - -NBADDR_ZIY -; -ddr - = -baddr -; - - = 1 - - ) - -221  - #W_BADDR_ZIY - -NBADDR_ZIY -; -waddr - = -baddr -; -wn - = 1 - - ) - -222  - #RW_BADDR_ZIY - -NBADDR_ZIY -; -waddr - = -ddr - = -baddr -; -wn - = - - = 1 - - ) - -225  - #READ_IMM - -v -= -u --> - `ad -u, cpu-> -pc -++ ) - - ) - -226  - #READ_ZP - -v -= -u --> - `ad -u, cpu->adu, cpu-> -pc -++ ) ) - - ) - -227  - #READ_ZPX - -v -= -u --> - `ad -u, (u->adu, cpu-> -pc -++ ) + cpu-> -x -)&0xf) - - ) - -228  - #READ_ZPY - -v -= -u --> - `ad -u, (u->adu, cpu-> -pc -++ ) + cpu-> -y -)&0xf) - - ) - -229  - #READ_ABS - -v -= -u --> - `ad -u, (u->adu, cpu-> -pc -+1 )<<8| cpu->adu, cpu->p); cpu->pc+=2 - - ) - -230  - #READ_ABX - -BADDR_ABX -; -v - = -u --> - `ad -u, -baddr - ); cpu-> -pc -+=2 - - ) - -231  - #READ_ABY - -BADDR_ABY -; -v - = -u --> - `ad -u, -baddr - ); cpu-> -pc -+=2 - - ) - -232  - #READ_ZIX - -BADDR_ZIX -; -v - = -u --> - `ad -u, -baddr - ); cpu-> -pc -++ - - ) - -233  - #READ_ZIY - -BADDR_ZIY -; -v - = -u --> - `ad -u, -baddr - ); cpu-> -pc -++ - - ) - -235  - #KREAD_ZP - -baddr - = -u --> - `ad -u, cpu-> -pc -++ ); -v - = cpu->adu, badd) - - ) - -236  - #KREAD_ZPX - -baddr - = ()( -u --> - `ad -u, cpu-> -pc -++ )+u-> -x -); -v - = cpu->adu, badd) - - ) - -237  - #KREAD_ABS - -baddr - = ( -u --> - `ad -u, cpu-> -pc -+1 )<<8| cpu->adu, cpu->p); -v -=u->adu, badd); cpu->pc+=2 - - ) - -240  - #WRITE_ZP -( -n - -u --> - `wre -u, cpu-> - `ad -u, cpu-> -pc -++ ), ) - - ) - -241  - #WRITE_ZPX -( -n - -u --> - `wre -u, (u-> - `ad -u, cpu-> -pc -++ ) + cpu-> -x -)&0xff, ) - - ) - -242  - #WRITE_ZPY -( -n - -u --> - `wre -u, (u-> - `ad -u, cpu-> -pc -++ ) + cpu-> -y -)&0xff, ) - - ) - -243  - #WRITE_ABS -( -n - -u --> - `wre -u, (u-> - `ad -u, cpu-> -pc -+1 )<<8| cpu->adu, cpu->p), ); cpu->pc+=2 - - ) - -244  - #WRITE_ABX -( -n - -baddr - = (( -u --> - `ad -u, cpu-> -pc -+1 )<<8| cpu->adu, cpu->p)); cpu-> - `wre -u, badd+ cpu-> -x -, ); cpu->pc+=2 - - ) - -245  - #WRITE_ABY -( -n - -baddr - = (( -u --> - `ad -u, cpu-> -pc -+1 )<<8| cpu->adu, cpu->p)); cpu-> - `wre -u, badd+ cpu-> -y -, ); cpu->pc+=2 - - ) - -246  - #WRITE_ZIX -( -n - -baddr - = ()( -u --> - `ad -u, cpu-> -pc -++ )+u-> -x -); cpu-> - `wre -u, (u->adu, baddr+1 )<<8| cpu->adu, badd), ) - - ) - -247  - #WRITE_ZIY -( -n - -baddr - = -u --> - `ad -u, cpu-> -pc -++ ); badd(u->adu, baddr+1 )<<8| cpu->adu, badd); cpu-> - `wre -u, badd+ cpu-> -y -, ) - - ) - -250  - #PAGECHECK -( -n -(( -baddr -+n)&0xff00!(baddr&0xff00) - - ) - -253  - #CPAGECHECK - (( -u --> -baddr -&0xff00!(baddr&0xff00)) - - ) - -256  - #BPAGECHECK - ( ( -u --> -baddr -&0xff00!(u-> -lc -&0xff00) - - ) - -259  - #BRANCH -( -cdi -ifcdi ) -u --> -pc - = cpu-> -baddr -; u->pc++; - - ) - -262  - #IBRANCH -( -cdi - -u --> -icyes - = 2;\ - -263 if -cdi - )\ - -265 -u --> -baddr - = cpu-> -lc -+2+((sigd )u-> - `ad -( cpu, cpu->calcpc+1 ));\ - -266 -u --> -icyes -++;\ - -267 if -BPAGECHECK - ) -u --> -icyes -++;\ - -269 - - ) - -271  - #PUSHB -( -n - -u --> - `wre -u, (u-> - ---)+0x100, ) - - ) - -272  - #POPB - -u --> - `ad -u, (++u-> - -)+0x100 ) - - ) - -273  - #PUSHW -( -n - - `PUSHB -n>>8 ); PUSHB) - - ) - -274  - #POPW -( -n -( -u --> - `ad -(u,((u-> - -+2)&0xff)+0x100)<<8)|u->ad(u,((u->+1)&0xff)+0x100); cpu->+=2 - - ) - -279 -SDL_bo - - $m6502_t_icyes - -m6502 - * -u -, -SDL_bo - -dobp -, * -bpmsg - ) - -281  -baddr -; - -282  -exa - = 0; - -283  -i -; - -285 if -u --> -nmicou - > 0 ) - -287 -u --> -nmicou ---; - -288 if! -u --> -nmicou - ) - -289 -u --> -nmi - = -SDL_FALSE -; - -292 if -u --> -nmi - ) - -294 -exa - = 7; - -295 -u --> -lc - = (u-> - `ad -( cpu, 0xfffb )<<8)|cpu->read( cpu, 0xfffa ); - -296 -u --> -lct - = 2; - -297 } if -u --> -q - ) && ( cpu-> -f_i - == 0 ) ) { - -298 -exa - = 7; - -299 -u --> -lc - = (u-> - `ad -( cpu, 0xffff )<<8)|cpu->read( cpu, 0xfffe ); - -300 -u --> -lct - = 1; - -304 -u --> -lc - = cpu-> -pc -; - -305 -u --> -lct - = 0; - -308 -u --> -lc - = cpu-> - `ad -u, cpu-> -lc - ); - -309 if -dobp - ) - -311 if -u --> -ybp - ) - -313  -i -=0; i<16; i++ ) - -315 if -u --> -bakpots -[ -i -] !-1 ) && ( cpu-> -lc - == cpu->breakpoints[i] ) ) - -317 if( -u --> -bakpot_ags -[ -i -] & -MBPF_RESETCYCLES -=MBPF_RESETCYCLES ) cpu-> -cyes - = 0; - -318 if( -u --> -bakpot_ags -[ -i -] & -MBPF_RESETCYCLESCONTINUE -!MBPF_RESETCYCLESCONTINUE )  -SDL_TRUE -; - -323 if -u --> -ymbp - ) - -325  -waddr -, -ddr -, -wn -, - -; - -327 -waddr - = -ddr - = 0; - -328 -wn - = - - = 0; - -331  -u --> -lc - ) - -334 -waddr - = ( -u --> - -+0x100)-3; - -335 -wn - = 3; - -339 -waddr - = ( -u --> - -+0x100); - -340 -wn - = 3; - -345 -waddr - = ( -u --> - -+0x100)-1; - -346 -wn - = 1; - -351 -ddr - = -u --> - -+0x100; - -352 - - = 1; - -356 -ddr - = -u --> - -+0x100; - -357 - - = 2; - -361 -waddr - = ( -u --> - -+0x100)-2; - -362 -wn - = 2; - -371 #ifde -ILLEGALS - - -379 -RW_BADDR_ZP -; - -388 #ifde -ILLEGALS - - -396 -RW_BADDR_ABS -; - -405 #ifde -ILLEGALS - - -413 -RW_BADDR_ABX -; - -422 #ifde -ILLEGALS - - -430 -RW_BADDR_ZPX -; - -433 #ifde -ILLEGALS - - -440 -RW_BADDR_ABY -; - -449 -RW_BADDR_ZIX -; - -458 -RW_BADDR_ZIY -; - -469 #ifde -ILLEGALS - - -472 -R_BADDR_ZIX -; - -483 #ifde -ILLEGALS - - -486 -R_BADDR_ZIY -; - -501 #ifde -ILLEGALS - - -504 -R_BADDR_ZP -; - -519 #ifde -ILLEGALS - - -522 -R_BADDR_ABS -; - -533 -R_BADDR_ZPX -; - -544 #ifde -ILLEGALS - - -547 -R_BADDR_ABY -; - -558 -R_BADDR_ABX -; - -562 #ifde -ILLEGALS - - -565 -R_BADDR_ZPY -; - -569 -ddr - = ( -u --> - `ad -u, cpu-> -lc -+2 )<<8)|cpu->read( cpu, cpu->calcpc+1 ); - -570 - - = 2; - -574 #ifde -ILLEGALS - - -577 -W_BADDR_ZIX -; - -583 #ifde -ILLEGALS - - -586 -W_BADDR_ZP -; - -592 #ifde -ILLEGALS - - -595 -W_BADDR_ABS -; - -599 -W_BADDR_ZIY -; - -604 -W_BADDR_ZPX -; - -608 #ifde -ILLEGALS - - -611 -W_BADDR_ZPY -; - -615 #ifde -ILLEGALS - - -619 -W_BADDR_ABY -; - -623 -W_BADDR_ABX -; - -627  -i -=0; i<16; i++ ) - -629 if -wn - !0 ) && ( -u --> -membakpots -[ -i -]. -ags - & -MBPF_WRITE - ) ) - -631 if -u --> -membakpots -[ -i -]. -addr - > -waddr - ) && - -632 -u --> -membakpots -[ -i -]. -addr - < ( -waddr -+ -wn -) ) ) - -634 - `rtf - -bpmsg -, "Bak oWRITE$%04X", -u --> -membakpots -[ -i -]. -addr - ); - -635  -SDL_TRUE -; - -639 if - - !0 ) && ( -u --> -membakpots -[ -i -]. -ags - & -MBPF_READ - ) ) - -641 if -u --> -membakpots -[ -i -]. -addr - > -ddr - ) && - -642 -u --> -membakpots -[ -i -]. -addr - < ( -ddr -+ - -) ) ) - -644 - `rtf - -bpmsg -, "Bak oREAD from $%04X", -u --> -membakpots -[ -i -]. -addr - ); - -645  -SDL_TRUE -; - -649 if -u --> -membakpots -[ -i -]. -ags - & -MBPF_CHANGE - ) - -651 if -u --> -membakpots -[ -i -]. -ϡv - !u-> - `ad -u, cpu->membakpots[i]. -addr - ) ) - -653 -u --> -membakpots -[ -i -]. -ϡv - = cpu-> - `ad -u, cpu->membakpots[i]. -addr - ); - -654 - `rtf - -bpmsg -, "Bak $%04X chged", -u --> -membakpots -[ -i -]. -addr - ); - -655  -SDL_TRUE -; - -663  -u --> -lc - ) - -682 -u --> -icyes - = 7; - -722 -u --> -icyes - = 6; - -748 -u --> -icyes - = 3; - -769 -u --> -icyes - = 5; - -824 -u --> -icyes - = 2; - -867 -u --> -icyes - = 4; - -880 -u --> -icyes - = 8; - -884 - `IBRANCH -! -u --> -f_n - ); - -895 -baddr - = -u --> - `ad -u, cpu-> -lc -+1 ); - -896 -baddr - = (( -u --> - `ad -( cpu, baddr+1 )<<8) | cpu->read( cpu, baddr )); - -897 -u --> -icyes - = 5; - -898 -u --> -baddr - = baddr+u-> -y -; - -899 if -CPAGECHECK - ) -u --> -icyes -++; - -903 -baddr - = -u --> - `ad -u, cpu-> -lc -+1 ); - -904 -baddr - = (( -u --> - `ad -( cpu, baddr+1 )<<8) | cpu->read( cpu, baddr )); - -905 -u --> -icyes - = 4; - -906 -u --> -baddr - = baddr+u-> -y -; - -907 if -CPAGECHECK - ) -u --> -icyes -++; - -919 -NBADDR_ABS -; - -920 -u --> -icyes - = 4; - -921 -u --> -baddr - = baddr+u-> -y -; - -922 if -CPAGECHECK - ) -u --> -icyes -++; - -939 -NBADDR_ABS -; - -940 -u --> -icyes - = 4; - -941 -u --> -baddr - = baddr+u-> -x -; - -942 if -CPAGECHECK - ) -u --> -icyes -++; - -946 - `IBRANCH - -u --> -f_n - ); - -950 - `IBRANCH -! -u --> -f_v - ); - -954 - `IBRANCH - -u --> -f_v - ); - -958 - `IBRANCH -! -u --> -f_c - ); - -962 - `IBRANCH - -u --> -f_c - ); - -966 - `IBRANCH -! -u --> -f_z - ); - -970 - `IBRANCH - -u --> -f_z - ); - -974 -u --> -icyes - = 6; - -978 -u --> -icyes - + -exa -; - -979  -SDL_FALSE -; - -980 - } -} - -983 -SDL_bo - - $m6502_ - -m6502 - * -u - ) - -985  -v -; - -986  -r -, -t -, -baddr -; - -989 -u --> -cyes - +u-> -icyes -; - -991 if -u --> -lct - > 0 ) - -993 - `PUSHW - -u --> -pc - ); - -994 - `PUSHB - -MAKEFLAGSBC - ); - -995 -u --> -f_d - = 0; - -996 if -u --> -lct - == 2 ) - -998 -u --> -nmi - = -SDL_FALSE -; - -1000 -u --> -f_i - = 1; - -1004 #i - `defed -( -DEBUG_CPU_TRACE -) && DEBUG_CPU_TRACE > 0 - -1005 - `m_a -( -u -); - -1008 -u --> -ϡpc - = cpu-> -pc - = cpu-> -lc -; - -1009 -u --> -pc -++; - -1010  -u --> -lc - ) - -1013 - `PUSHW -( -u --> -pc -+1) ); - -1014 - `PUSHB - -MAKEFLAGS - | (1<<4) ); - -1015 -u --> -f_i - = 1; - -1016 -u --> -f_d - = 0; - -1017 -u --> -pc - = (u-> - `ad -( cpu, 0xffff )<<8) | cpu->read( cpu, 0xfffe ); - -1021 -READ_ZIX -; - -1022 -DO_ORA -; - -1026 -READ_ZP -; - -1027 -DO_ORA -; - -1031 -KREAD_ZP -; - -1032 - `DO_ASL -( -v -); - -1033 -u --> - `wre -u, -baddr -, -v - ); - -1037 - `PUSHB - -MAKEFLAGS - ); - -1041 -READ_IMM -; - -1042 -DO_ORA -; - -1046 - `DO_ASL -( -u --> -a -); - -1050 -READ_ABS -; - -1051 -DO_ORA -; - -1055 -KREAD_ABS -; - -1056 - `DO_ASL -( -v -); - -1057 -u --> - `wre -u, -baddr -, -v - ); - -1061 - `BRANCH -! -u --> -f_n - ); - -1065 -v - = -u --> - `ad -u, cpu-> -baddr - ); - -1066 -u --> -pc -++; - -1067 -DO_ORA -; - -1071 -READ_ZPX -; - -1072 -DO_ORA -; - -1076 -KREAD_ZPX -; - -1077 - `DO_ASL -( -v -); - -1078 -u --> - `wre -u, -baddr -, -v - ); - -1082 -u --> -f_c - = 0; - -1087 -v - = -u --> - `ad -u, cpu-> -baddr - ); - -1088 -u --> -pc -+=2; - -1089 -DO_ORA -; - -1093 -READ_ABX -; - -1094 - `DO_ASL -( -v -); - -1095 -u --> - `wre -u, -baddr -, -v - ); - -1099 -baddr - = ( -u --> - `ad -u, cpu-> -pc -+1 )<<8) | cpu->read( cpu, cpu->pc ); - -1100 - `PUSHW -( -u --> -pc -+1) ); - -1101 -u --> -pc - = -baddr -; - -1105 -READ_ZIX -; - -1106 -DO_AND -; - -1110 -READ_ZP -; - -1111 -u --> -f_n - = -v -&0x80 ? 1 : 0; - -1112 -u --> -f_v - = -v -&0x40 ? 1 : 0; - -1113 -u --> -f_z - = (u-> -a -& -v -)==0; - -1117 -READ_ZP -; - -1118 -DO_AND -; - -1122 -KREAD_ZP -; - -1123 - `DO_ROL -( -v -); - -1124 -u --> - `wre -u, -baddr -, -v - ); - -1128 -v - = -POPB -|(1<<4); - -1129 - `SETFLAGS -( -v -); - -1133 -READ_IMM -; - -1134 -DO_AND -; - -1138 - `DO_ROL -( -u --> -a -); - -1142 -READ_ABS -; - -1143 -u --> -f_n - = -v -&0x80 ? 1 : 0; - -1144 -u --> -f_v - = -v -&0x40 ? 1 : 0; - -1145 -u --> -f_z - = (u-> -a -& -v -)==0; - -1149 -READ_ABS -; - -1150 -DO_AND -; - -1154 -KREAD_ABS -; - -1155 - `DO_ROL -( -v -); - -1156 -u --> - `wre -u, -baddr -, -v - ); - -1160 - `BRANCH - -u --> -f_n - ); - -1164 -v - = -u --> - `ad -u, cpu-> -baddr - ); - -1165 -u --> -pc -++; - -1166 -DO_AND -; - -1170 -READ_ZPX -; - -1171 -DO_AND -; - -1175 -KREAD_ZPX -; - -1176 - `DO_ROL -( -v -); - -1177 -u --> - `wre -u, -baddr -, -v - ); - -1181 -u --> -f_c - = 1; - -1186 -v - = -u --> - `ad -u, cpu-> -baddr - ); - -1187 -u --> -pc -+=2; - -1188 -DO_AND -; - -1192 -READ_ABX -; - -1193 - `DO_ROL -( -v -); - -1194 -u --> - `wre -u, -baddr -, -v - ); - -1198 -v - = -POPB -; - -1199 - `SETFLAGS -( -v -); - -1200 - `POPW - -u --> -pc - ); - -1204 -READ_ZIX -; - -1205 -DO_EOR -; - -1209 -READ_ZP -; - -1210 -DO_EOR -; - -1214 -KREAD_ZP -; - -1215 - `DO_LSR -( -v -); - -1216 -u --> - `wre -u, -baddr -, -v - ); - -1220 - `PUSHB - -u --> -a - ); - -1224 -READ_IMM -; - -1225 -DO_EOR -; - -1229 - `DO_LSR -( -u --> -a -); - -1233 -u --> -pc - = (u-> - `ad -( cpu, cpu->pc+1 )<<8)|cpu->read( cpu, cpu->pc ); - -1237 -READ_ABS -; - -1238 -DO_EOR -; - -1242 -KREAD_ABS -; - -1243 - `DO_LSR -( -v -); - -1244 -u --> - `wre -u, -baddr -, -v - ); - -1248 - `BRANCH -! -u --> -f_v - ); - -1252 -v - = -u --> - `ad -u, cpu-> -baddr - ); - -1253 -u --> -pc -++; - -1254 -DO_EOR -; - -1258 -READ_ZPX -; - -1259 -DO_EOR -; - -1263 -KREAD_ZPX -; - -1264 - `DO_LSR -( -v -); - -1265 -u --> - `wre -u, -baddr -, -v - ); - -1269 -u --> -f_i - = 0; - -1274 -v - = -u --> - `ad -u, cpu-> -baddr - ); - -1275 -u --> -pc -+=2; - -1276 -DO_EOR -; - -1280 -READ_ABX -; - -1281 - `DO_LSR -( -v -); - -1282 -u --> - `wre -u, -baddr -, -v - ); - -1286 - `POPW - -u --> -pc - ); - -1287 -u --> -pc -++; - -1291 -READ_ZIX -; - -1292 -DO_ADC -; - -1296 -READ_ZP -; - -1297 -DO_ADC -; - -1301 -KREAD_ZP -; - -1302 - `DO_ROR -( -v -); - -1303 -u --> - `wre -u, -baddr -, -v - ); - -1307 -u --> -a - = -POPB -; - -1308 - `FLAG_ZN -( -u --> -a -); - -1312 -READ_IMM -; - -1313 -DO_ADC -; - -1317 - `DO_ROR -( -u --> -a -); - -1321 -baddr - = ( -u --> - `ad -u, cpu-> -pc -+1 )<<8)|cpu->read( cpu, cpu->pc ); - -1322 -u --> -pc - = (u-> - `ad -u, -baddr -+1 )<<8)|cpu->read( cpu, baddr ); - -1326 -READ_ABS -; - -1327 -DO_ADC -; - -1331 -KREAD_ABS -; - -1332 - `DO_ROR -( -v -); - -1333 -u --> - `wre -u, -baddr -, -v - ); - -1337 - `BRANCH - -u --> -f_v - ); - -1341 -v - = -u --> - `ad -u, cpu-> -baddr - ); - -1342 -u --> -pc -++; - -1343 -DO_ADC -; - -1347 -READ_ZPX -; - -1348 -DO_ADC -; - -1352 -KREAD_ZPX -; - -1353 - `DO_ROR -( -v -); - -1354 -u --> - `wre -u, -baddr -, -v - ); - -1358 -u --> -f_i - = 1; - -1363 -v - = -u --> - `ad -u, cpu-> -baddr - ); - -1364 -u --> -pc -+=2; - -1365 -DO_ADC -; - -1369 -READ_ABX -; - -1370 - `DO_ROR -( -v -); - -1371 -u --> - `wre -u, -baddr -, -v - ); - -1375 - `WRITE_ZIX -( -u --> -a -); - -1379 - `WRITE_ZP -( -u --> -y -); - -1383 - `WRITE_ZP -( -u --> -a -); - -1387 - `WRITE_ZP -( -u --> -x -); - -1391 -u --> -y ---; - -1392 - `FLAG_ZN -( -u --> -y -); - -1396 -u --> -a - = cpu-> -x -; - -1397 - `FLAG_ZN -( -u --> -a -); - -1401 - `WRITE_ABS -( -u --> -y -); - -1405 - `WRITE_ABS -( -u --> -a -); - -1409 - `WRITE_ABS -( -u --> -x -); - -1413 - `BRANCH -! -u --> -f_c - ); - -1417 - `WRITE_ZIY -( -u --> -a -); - -1421 - `WRITE_ZPX -( -u --> -y -); - -1425 - `WRITE_ZPX -( -u --> -a -); - -1429 - `WRITE_ZPY -( -u --> -x -); - -1433 -u --> -a - = cpu-> -y -; - -1434 - `FLAG_ZN -( -u --> -a -); - -1438 - `WRITE_ABY -( -u --> -a -); - -1442 -u --> - - = cpu-> -x -; - -1446 - `WRITE_ABX -( -u --> -a -); - -1450 -READ_IMM -; - -1451 -u --> -y - = -v -; - -1452 - `FLAG_ZN -( -u --> -y -); - -1456 -READ_ZIX -; - -1457 -u --> -a - = -v -; - -1458 - `FLAG_ZN -( -u --> -a -); - -1462 -READ_IMM -; - -1463 -u --> -x - = -v -; - -1464 - `FLAG_ZN -( -u --> -x -); - -1468 -READ_ZP -; - -1469 -u --> -y - = -v -; - -1470 - `FLAG_ZN -( -u --> -y -); - -1474 -READ_ZP -; - -1475 -u --> -a - = -v -; - -1476 - `FLAG_ZN -( -u --> -a -); - -1480 -READ_ZP -; - -1481 -u --> -x - = -v -; - -1482 - `FLAG_ZN -( -u --> -x -); - -1486 -u --> -y - = cpu-> -a -; - -1487 - `FLAG_ZN -( -u --> -y -); - -1491 -READ_IMM -; - -1492 -u --> -a - = -v -; - -1493 - `FLAG_ZN -( -u --> -a -); - -1497 -u --> -x - = cpu-> -a -; - -1498 - `FLAG_ZN -( -u --> -x -); - -1502 -READ_ABS -; - -1503 -u --> -y - = -v -; - -1504 - `FLAG_ZN -( -u --> -y -); - -1508 -READ_ABS -; - -1509 -u --> -a - = -v -; - -1510 - `FLAG_ZN -( -u --> -a -); - -1514 -READ_ABS -; - -1515 -u --> -x - = -v -; - -1516 - `FLAG_ZN -( -u --> -x -); - -1520 - `BRANCH - -u --> -f_c - ); - -1524 -u --> -a - = cpu-> - `ad -u, cpu-> -baddr - ); - -1525 -u --> -pc -++; - -1526 - `FLAG_ZN -( -u --> -a -); - -1530 -READ_ZPX -; - -1531 -u --> -y - = -v -; - -1532 - `FLAG_ZN -( -u --> -y -); - -1536 -READ_ZPX -; - -1537 -u --> -a - = -v -; - -1538 - `FLAG_ZN -( -u --> -a -); - -1542 -READ_ZPY -; - -1543 -u --> -x - = -v -; - -1544 - `FLAG_ZN -( -u --> -x -); - -1548 -u --> -f_v - = 0; - -1553 -u --> -a - = cpu-> - `ad -u, cpu-> -baddr - ); - -1554 -u --> -pc -+=2; - -1555 - `FLAG_ZN -( -u --> -a -); - -1559 -u --> -x - = cpu-> - -; - -1560 - `FLAG_ZN -( -u --> -x -); - -1564 -u --> -y - = cpu-> - `ad -u, cpu-> -baddr - ); - -1565 -u --> -pc -+=2; - -1566 - `FLAG_ZN -( -u --> -y -); - -1570 -u --> -x - = cpu-> - `ad -u, cpu-> -baddr - ); - -1571 -u --> -pc -+=2; - -1572 - `FLAG_ZN -( -u --> -x -); - -1576 -READ_IMM -; - -1577 -r - = -u --> -y -- -v -; - -1578 - `FLAG_SZCN -( -r -); - -1582 -READ_ZIX -; - -1583 -r - = -u --> -a -- -v -; - -1584 - `FLAG_SZCN -( -r -); - -1588 -READ_ZP -; - -1589 -r - = -u --> -y -- -v -; - -1590 - `FLAG_SZCN -( -r -); - -1594 -READ_ZP -; - -1595 -r - = -u --> -a -- -v -; - -1596 - `FLAG_SZCN -( -r -); - -1600 -KREAD_ZP -; - -1601 -u --> - `wre -u, -baddr -, -- -v - ); - -1602 - `FLAG_ZN -( -v -); - -1606 -u --> -y -++; - -1607 - `FLAG_ZN -( -u --> -y -); - -1611 -READ_IMM -; - -1612 -r - = -u --> -a -- -v -; - -1613 - `FLAG_SZCN -( -r -); - -1617 -u --> -x ---; - -1618 - `FLAG_ZN -( -u --> -x -); - -1622 -READ_ABS -; - -1623 -r - = -u --> -y -- -v -; - -1624 - `FLAG_SZCN -( -r -); - -1628 -READ_ABS -; - -1629 -r - = -u --> -a -- -v -; - -1630 - `FLAG_SZCN -( -r -); - -1634 -KREAD_ABS -; - -1635 -u --> - `wre -u, -baddr -, -- -v - ); - -1636 - `FLAG_ZN -( -v -); - -1640 - `BRANCH -! -u --> -f_z - ); - -1644 -r - = -u --> -a --u-> - `ad -u, cpu-> -baddr - ); - -1645 -u --> -pc -++; - -1646 - `FLAG_SZCN -( -r -); - -1650 -READ_ZPX -; - -1651 -r - = -u --> -a -- -v -; - -1652 - `FLAG_SZCN -( -r -); - -1656 -KREAD_ZPX -; - -1657 -u --> - `wre -u, -baddr -, -- -v - ); - -1658 - `FLAG_ZN -( -v -); - -1662 -u --> -f_d - = 0; - -1667 -r - = -u --> -a - - cpu-> - `ad -u, cpu-> -baddr - ); - -1668 -u --> -pc -+=2; - -1669 - `FLAG_SZCN -( -r -); - -1673 -READ_ABX -; - -1674 -u --> - `wre -u, -baddr -, -- -v - ); - -1675 - `FLAG_ZN -( -v -); - -1679 -READ_IMM -; - -1680 -r - = -u --> -x -- -v -; - -1681 - `FLAG_SZCN -( -r -); - -1685 -READ_ZIX -; - -1686 -DO_SBC -; - -1690 -READ_ZP -; - -1691 -r - = -u --> -x -- -v -; - -1692 - `FLAG_SZCN -( -r -); - -1696 -READ_ZP -; - -1697 -DO_SBC -; - -1701 -KREAD_ZP -; - -1702 -u --> - `wre -u, -baddr -, ++ -v - ); - -1703 - `FLAG_ZN -( -v -); - -1707 -u --> -x -++; - -1708 - `FLAG_ZN -( -u --> -x -); - -1712 #ifde -ILLEGALS - - -1715 -READ_IMM -; - -1716 -DO_SBC -; - -1723 -READ_ABS -; - -1724 -r - = -u --> -x -- -v -; - -1725 - `FLAG_SZCN -( -r -); - -1729 -READ_ABS -; - -1730 -DO_SBC -; - -1734 -KREAD_ABS -; - -1735 -u --> - `wre -u, -baddr -, ++ -v - ); - -1736 - `FLAG_ZN -( -v -); - -1740 - `BRANCH - -u --> -f_z - ); - -1744 -v - = -u --> - `ad -u, cpu-> -baddr - ); - -1745 -u --> -pc -++; - -1746 -DO_SBC -; - -1750 -READ_ZPX -; - -1751 -DO_SBC -; - -1755 -KREAD_ZPX -; - -1756 -u --> - `wre -u, -baddr -, ++ -v - ); - -1757 - `FLAG_ZN -( -v -); - -1761 -u --> -f_d - = 1; - -1766 -v - = -u --> - `ad -u, cpu-> -baddr - ); - -1767 -u --> -pc -+=2; - -1768 -DO_SBC -; - -1772 -READ_ABX -; - -1773 -u --> - `wre -u, -baddr -, ++ -v - ); - -1774 - `FLAG_ZN -( -v -); - -1778 #ifde -ILLEGALS - - -1781 -READ_IMM -; - -1782 -DO_AND -; - -1783 -u --> -f_c - = cpu-> -f_n -; - -1787 -v - = -u --> -a - & cpu-> -x -; - -1788 - `WRITE_ZP -( -v -); - -1789 -u --> -f_n - = ( -v -&0x80)!=0; - -1790 -u --> -f_z - = -v -!=0; - -1794 -v - = -u --> -a - & cpu-> -x -; - -1795 - `WRITE_ZPY -( -v -); - -1796 -u --> -f_n - = ( -v -&0x80)!=0; - -1797 -u --> -f_z - = -v -!=0; - -1801 -v - = -u --> -a - & cpu-> -x -; - -1802 - `WRITE_ZIX -( -v -); - -1803 -u --> -f_n - = ( -v -&0x80)!=0; - -1804 -u --> -f_z - = -v -!=0; - -1808 -v - = -u --> -a - & cpu-> -x -; - -1809 - `WRITE_ABS -( -v -); - -1810 -u --> -f_n - = ( -v -&0x80)!=0; - -1811 -u --> -f_z - = -v -!=0; - -1815 -READ_IMM -; - -1816 -u --> -a - = (u->a& -v -)>>1; - -1817 -u --> -f_n - = (u-> -a -&0x80) != 0; - -1818 -u --> -f_z - = cpu-> -a - != 0; - -1819  -u --> -a -&0x60) - -1821 0x00: -u --> -f_c -=0; cpu-> -f_v -=0; ; - -1822 0x20: -u --> -f_c -=0; cpu-> -f_v -=1; ; - -1823 0x60: -u --> -f_c -=1; cpu-> -f_v -=0; ; - -1824 0x40: -u --> -f_c -=1; cpu-> -f_v -=1; ; - -1829 -READ_IMM -; - -1830 -u --> -a - = (u->a& -v -)>>1; - -1831 - `FLAG_ZCN -( -u --> -a -); - -1835 -READ_IMM -; - -1836 -DO_AND -; - -1837 -u --> -x - = cpu-> -a -; - -1842 -r - = -u --> -x -; - -1845 i(( -u --> -cyes -&7)>2) - -1846 -r - &( -u --> -pc ->>8)+1; - -1848 -v - = -u --> -a - & -r -; - -1852 i((( -u --> -cyes ->>8)&7)<2) - -1854 -r - = (r^0xff)& -u --> -a -; - -1855 -r - & -u --> -cyes -; - -1856 -v - | -r -; - -1858 i( -u --> -lc -==0x9F) - -1860 - `WRITE_ABY -( -v -); - -1864 - `WRITE_ZIY -( -v -); - -1869 -READ_IMM -; - -1870 -u --> -x - = (u-> -a -&u->x)- -v -; - -1871 - `FLAG_ZCN -( -u --> -x -); - -1875 -BADDR_ZP -; - -1876 -v - = -u --> - `ad -(u, -baddr -); - -1877 -u --> - `wre -(u, -baddr -, -- -v -); - -1878 - `WRITE_ZP -(-- -v -); - -1879 - `FLAG_ZN -( -v -); - -1883 -BADDR_ZPX -; - -1884 -v - = -u --> - `ad -(u, -baddr -); - -1885 -u --> - `wre -(u, -baddr -, -- -v -); - -1886 - `FLAG_ZN -( -v -); - -1890 -BADDR_ABS -; - -1891 -v - = -u --> - `ad -(u, -baddr -); - -1892 -u --> - `wre -(u, -baddr -, -- -v -); - -1893 - `FLAG_ZN -( -v -); - -1897 -BADDR_ABX -; - -1898 -v - = -u --> - `ad -(u, -baddr -); - -1899 -u --> - `wre -(u, -baddr -, -- -v -); - -1900 - `FLAG_ZN -( -v -); - -1904 -BADDR_ABY -; - -1905 -v - = -u --> - `ad -(u, -baddr -); - -1906 -u --> - `wre -(u, -baddr -, -- -v -); - -1907 - `FLAG_ZN -( -v -); - -1911 -BADDR_ZIX -; - -1912 -v - = -u --> - `ad -(u, -baddr -); - -1913 -u --> - `wre -(u, -baddr -, -- -v -); - -1914 - `FLAG_ZN -( -v -); - -1918 -BADDR_ZIY -; - -1919 -v - = -u --> - `ad -(u, -baddr -); - -1920 -u --> - `wre -(u, -baddr -, -- -v -); - -1921 - `FLAG_ZN -( -v -); - -1938 -READ_IMM -; - -1950 -READ_ABS -; - -1959 -READ_ABX -; - -1963 -BADDR_ZP -; - -1964 -v - = -u --> - `ad -(u, -baddr -); - -1965 -u --> - `wre -(u, -baddr -, ++ -v -); - -1966 -r - = ( -u --> -a - - -v -- (u-> -f_c -^1); - -1967 -u --> -f_v - = ((u-> -a -^ -v -)&(u->a^( -r -&0xff))&0x80) ? 1 : 0; - -1968 - `FLAG_SZCN -( -r -); - -1969 -u --> -a - = -r -; - -1970 -u --> -pc -++; - -1974 -BADDR_ZPX -; - -1975 -v - = -u --> - `ad -(u, -baddr -); - -1976 -u --> - `wre -(u, -baddr -, ++ -v -); - -1977 -r - = ( -u --> -a - - -v -- (u-> -f_c -^1); - -1978 -u --> -f_v - = ((u-> -a -^ -v -)&(u->a^( -r -&0xff))&0x80) ? 1 : 0; - -1979 - `FLAG_SZCN -( -r -); - -1980 -u --> -a - = -r -; - -1981 -u --> -pc -++; - -1985 -BADDR_ABS -; - -1986 -v - = -u --> - `ad -(u, -baddr -); - -1987 -u --> - `wre -(u, -baddr -, ++ -v -); - -1988 -r - = ( -u --> -a - - -v -- (u-> -f_c -^1); - -1989 -u --> -f_v - = ((u-> -a -^ -v -)&(u->a^( -r -&0xff))&0x80) ? 1 : 0; - -1990 - `FLAG_SZCN -( -r -); - -1991 -u --> -a - = -r -; - -1992 -u --> -pc -+=2; - -1996 -BADDR_ABX -; - -1997 -v - = -u --> - `ad -(u, -baddr -); - -1998 -u --> - `wre -(u, -baddr -, ++ -v -); - -1999 -r - = ( -u --> -a - - -v -- (u-> -f_c -^1); - -2000 -u --> -f_v - = ((u-> -a -^ -v -)&(u->a^( -r -&0xff))&0x80) ? 1 : 0; - -2001 - `FLAG_SZCN -( -r -); - -2002 -u --> -a - = -r -; - -2003 -u --> -pc -+=2; - -2007 -BADDR_ABY -; - -2008 -v - = -u --> - `ad -(u, -baddr -); - -2009 -u --> - `wre -(u, -baddr -, ++ -v -); - -2010 -r - = ( -u --> -a - - -v -- (u-> -f_c -^1); - -2011 -u --> -f_v - = ((u-> -a -^ -v -)&(u->a^( -r -&0xff))&0x80) ? 1 : 0; - -2012 - `FLAG_SZCN -( -r -); - -2013 -u --> -a - = -r -; - -2014 -u --> -pc -+=2; - -2018 -BADDR_ZIX -; - -2019 -v - = -u --> - `ad -(u, -baddr -); - -2020 -u --> - `wre -(u, -baddr -, ++ -v -); - -2021 -r - = ( -u --> -a - - -v -- (u-> -f_c -^1); - -2022 -u --> -f_v - = ((u-> -a -^ -v -)&(u->a^( -r -&0xff))&0x80) ? 1 : 0; - -2023 - `FLAG_SZCN -( -r -); - -2024 -u --> -a - = -r -; - -2025 -u --> -pc -++; - -2029 -BADDR_ZIY -; - -2030 -v - = -u --> - `ad -(u, -baddr -); - -2031 -u --> - `wre -(u, -baddr -, ++ -v -); - -2032 -r - = ( -u --> -a - - -v -- (u-> -f_c -^1); - -2033 -u --> -f_v - = ((u-> -a -^ -v -)&(u->a^( -r -&0xff))&0x80) ? 1 : 0; - -2034 - `FLAG_SZCN -( -r -); - -2035 -u --> -a - = -r -; - -2036 -u --> -pc -++; - -2040 -u --> - - &u-> - `ad -u, cpu-> -baddr - ); - -2041 -u --> -pc -++; - -2042 -u --> -a - = cpu-> - -; - -2043 -u --> -x - = cpu-> - -; - -2044 - `FLAG_ZN -( -u --> -a -); - -2048 -READ_ZP -; - -2049 -u --> -a - = -v -; - -2050 -u --> -x - = -v -; - -2051 - `FLAG_ZN -( -u --> -a -); - -2055 -READ_ZPY -; - -2056 -u --> -a - = -v -; - -2057 -u --> -x - = -v -; - -2058 - `FLAG_ZN -( -u --> -a -); - -2062 -READ_ABS -; - -2063 -u --> -a - = -v -; - -2064 -u --> -x - = -v -; - -2065 - `FLAG_ZN -( -u --> -a -); - -2069 -u --> -a - = cpu-> - `ad -u, cpu-> -baddr - ); - -2070 -u --> -pc -+=2; - -2071 -u --> -x - = cpu-> -a -; - -2072 - `FLAG_ZN -( -u --> -a -); - -2076 -READ_ZIX -; - -2077 -u --> -a - = -v -; - -2078 -u --> -x - = -v -; - -2079 - `FLAG_ZN -( -u --> -a -); - -2083 -u --> -a - = cpu-> - `ad -u, cpu-> -baddr - ); - -2084 -u --> -x - = cpu-> -a -; - -2085 -u --> -pc -++; - -2086 - `FLAG_ZN -( -u --> -a -); - -2090 -BADDR_ZP -; - -2091 -r - = ( -u --> - `ad -(u, -baddr -)<<1)|u-> -f_c -; - -2092 -u --> -f_c - = ( -r -&0x100)!=0; - -2093 -u --> - `wre -(u, -baddr -, -r -); - -2094 -u --> -a - & -r -; - -2095 - `FLAG_ZN -( -u --> -a -); - -2096 -u --> -pc -++; - -2100 -BADDR_ZPX -; - -2101 -r - = ( -u --> - `ad -(u, -baddr -)<<1)|u-> -f_c -; - -2102 -u --> -f_c - = ( -r -&0x100)!=0; - -2103 -u --> - `wre -(u, -baddr -, -r -); - -2104 -u --> -a - & -r -; - -2105 - `FLAG_ZN -( -u --> -a -); - -2106 -u --> -pc -++; - -2110 -BADDR_ABS -; - -2111 -r - = ( -u --> - `ad -(u, -baddr -)<<1)|u-> -f_c -; - -2112 -u --> -f_c - = ( -r -&0x100)!=0; - -2113 -u --> - `wre -(u, -baddr -, -r -); - -2114 -u --> -a - & -r -; - -2115 - `FLAG_ZN -( -u --> -a -); - -2116 -u --> -pc -+=2; - -2120 -BADDR_ABX -; - -2121 -r - = ( -u --> - `ad -(u, -baddr -)<<1)|u-> -f_c -; - -2122 -u --> -f_c - = ( -r -&0x100)!=0; - -2123 -u --> - `wre -(u, -baddr -, -r -); - -2124 -u --> -a - & -r -; - -2125 - `FLAG_ZN -( -u --> -a -); - -2126 -u --> -pc -+=2; - -2130 -BADDR_ABY -; - -2131 -r - = ( -u --> - `ad -(u, -baddr -)<<1)|u-> -f_c -; - -2132 -u --> -f_c - = ( -r -&0x100)!=0; - -2133 -u --> - `wre -(u, -baddr -, -r -); - -2134 -u --> -a - & -r -; - -2135 - `FLAG_ZN -( -u --> -a -); - -2136 -u --> -pc -+=2; - -2140 -BADDR_ZIX -; - -2141 -r - = ( -u --> - `ad -(u, -baddr -)<<1)|u-> -f_c -; - -2142 -u --> -f_c - = ( -r -&0x100)!=0; - -2143 -u --> - `wre -(u, -baddr -, -r -); - -2144 -u --> -a - & -r -; - -2145 - `FLAG_ZN -( -u --> -a -); - -2146 -u --> -pc -++; - -2150 -BADDR_ZIY -; - -2151 -r - = ( -u --> - `ad -(u, -baddr -)<<1)|u-> -f_c -; - -2152 -u --> -f_c - = ( -r -&0x100)!=0; - -2153 -u --> - `wre -(u, -baddr -, -r -); - -2154 -u --> -a - & -r -; - -2155 - `FLAG_ZN -( -u --> -a -); - -2156 -u --> -pc -++; - -2160 -BADDR_ZP -; - -2161 -r - = -u --> - `ad -(u, -baddr -); - -2162 -v - = ( -r ->>1)|( -u --> -f_c -<<7); - -2163 -u --> -f_c - = -r -&1; - -2164 -u --> - `wre -(u, -baddr -, -v -); - -2165 -r - = -u --> -a - + -v - + cpu-> -f_c -; - -2166 -u --> -f_v - = ((u-> -a -^ -v -)&(u->a^( -r -&0xff))&0x80) ? 1 : 0; - -2167 - `FLAG_ZCN -( -r -); - -2168 -u --> -a - = -r -; - -2169 -u --> -pc -++; - -2173 -BADDR_ZPX -; - -2174 -r - = -u --> - `ad -(u, -baddr -); - -2175 -v - = ( -r ->>1)|( -u --> -f_c -<<7); - -2176 -u --> -f_c - = -r -&1; - -2177 -u --> - `wre -(u, -baddr -, -v -); - -2178 -r - = -u --> -a - + -v - + cpu-> -f_c -; - -2179 -u --> -f_v - = ((u-> -a -^ -v -)&(u->a^( -r -&0xff))&0x80) ? 1 : 0; - -2180 - `FLAG_ZCN -( -r -); - -2181 -u --> -a - = -r -; - -2182 -u --> -pc -++; - -2186 -BADDR_ABS -; - -2187 -r - = -u --> - `ad -(u, -baddr -); - -2188 -v - = ( -r ->>1)|( -u --> -f_c -<<7); - -2189 -u --> -f_c - = -r -&1; - -2190 -u --> - `wre -(u, -baddr -, -v -); - -2191 -r - = -u --> -a - + -v - + cpu-> -f_c -; - -2192 -u --> -f_v - = ((u-> -a -^ -v -)&(u->a^( -r -&0xff))&0x80) ? 1 : 0; - -2193 - `FLAG_ZCN -( -r -); - -2194 -u --> -a - = -r -; - -2195 -u --> -pc -+=2; - -2199 -BADDR_ABX -; - -2200 -r - = -u --> - `ad -(u, -baddr -); - -2201 -v - = ( -r ->>1)|( -u --> -f_c -<<7); - -2202 -u --> -f_c - = -r -&1; - -2203 -u --> - `wre -(u, -baddr -, -v -); - -2204 -r - = -u --> -a - + -v - + cpu-> -f_c -; - -2205 -u --> -f_v - = ((u-> -a -^ -v -)&(u->a^( -r -&0xff))&0x80) ? 1 : 0; - -2206 - `FLAG_ZCN -( -r -); - -2207 -u --> -a - = -r -; - -2208 -u --> -pc -+=2; - -2212 -BADDR_ABY -; - -2213 -r - = -u --> - `ad -(u, -baddr -); - -2214 -v - = ( -r ->>1)|( -u --> -f_c -<<7); - -2215 -u --> -f_c - = -r -&1; - -2216 -u --> - `wre -(u, -baddr -, -v -); - -2217 -r - = -u --> -a - + -v - + cpu-> -f_c -; - -2218 -u --> -f_v - = ((u-> -a -^ -v -)&(u->a^( -r -&0xff))&0x80) ? 1 : 0; - -2219 - `FLAG_ZCN -( -r -); - -2220 -u --> -a - = -r -; - -2221 -u --> -pc -+=2; - -2225 -BADDR_ZIX -; - -2226 -r - = -u --> - `ad -(u, -baddr -); - -2227 -v - = ( -r ->>1)|( -u --> -f_c -<<7); - -2228 -u --> -f_c - = -r -&1; - -2229 -u --> - `wre -(u, -baddr -, -v -); - -2230 -r - = -u --> -a - + -v - + cpu-> -f_c -; - -2231 -u --> -f_v - = ((u-> -a -^ -v -)&(u->a^( -r -&0xff))&0x80) ? 1 : 0; - -2232 - `FLAG_ZCN -( -r -); - -2233 -u --> -a - = -r -; - -2234 -u --> -pc -++; - -2238 -BADDR_ZIY -; - -2239 -r - = -u --> - `ad -(u, -baddr -); - -2240 -v - = ( -r ->>1)|( -u --> -f_c -<<7); - -2241 -u --> -f_c - = -r -&1; - -2242 -u --> - `wre -(u, -baddr -, -v -); - -2243 -r - = -u --> -a - + -v - + cpu-> -f_c -; - -2244 -u --> -f_v - = ((u-> -a -^ -v -)&(u->a^( -r -&0xff))&0x80) ? 1 : 0; - -2245 - `FLAG_ZCN -( -r -); - -2246 -u --> -a - = -r -; - -2247 -u --> -pc -++; - -2251 -BADDR_ZP -; - -2252 -r - = -u --> - `ad -(u, -baddr -)<<1; - -2253 -u --> -f_c - = ( -r -&0x100)!=0; - -2254 -u --> - `wre -(u, -baddr -, -r -); - -2255 -u --> -a - | -r -; - -2256 - `FLAG_ZN -( -u --> -a -); - -2257 -u --> -pc -++; - -2261 -BADDR_ZPX -; - -2262 -r - = -u --> - `ad -(u, -baddr -)<<1; - -2263 -u --> -f_c - = ( -r -&0x100)!=0; - -2264 -u --> - `wre -(u, -baddr -, -r -); - -2265 -u --> -a - | -r -; - -2266 - `FLAG_ZN -( -u --> -a -); - -2267 -u --> -pc -++; - -2271 -BADDR_ABS -; - -2272 -r - = -u --> - `ad -(u, -baddr -)<<1; - -2273 -u --> -f_c - = ( -r -&0x100)!=0; - -2274 -u --> - `wre -(u, -baddr -, -r -); - -2275 -u --> -a - | -r -; - -2276 - `FLAG_ZN -( -u --> -a -); - -2277 -u --> -pc -+=2; - -2281 -BADDR_ABX -; - -2282 -r - = -u --> - `ad -(u, -baddr -)<<1; - -2283 -u --> -f_c - = ( -r -&0x100)!=0; - -2284 -u --> - `wre -(u, -baddr -, -r -); - -2285 -u --> -a - | -r -; - -2286 - `FLAG_ZN -( -u --> -a -); - -2287 -u --> -pc -+=2; - -2291 -BADDR_ABY -; - -2292 -r - = -u --> - `ad -(u, -baddr -)<<1; - -2293 -u --> -f_c - = ( -r -&0x100)!=0; - -2294 -u --> - `wre -(u, -baddr -, -r -); - -2295 -u --> -a - | -r -; - -2296 - `FLAG_ZN -( -u --> -a -); - -2297 -u --> -pc -+=2; - -2301 -BADDR_ZIX -; - -2302 -r - = -u --> - `ad -(u, -baddr -)<<1; - -2303 -u --> -f_c - = ( -r -&0x100)!=0; - -2304 -u --> - `wre -(u, -baddr -, -r -); - -2305 -u --> -a - | -r -; - -2306 - `FLAG_ZN -( -u --> -a -); - -2307 -u --> -pc -++; - -2311 -BADDR_ZIY -; - -2312 -r - = -u --> - `ad -(u, -baddr -)<<1; - -2313 -u --> -f_c - = ( -r -&0x100)!=0; - -2314 -u --> - `wre -(u, -baddr -, -r -); - -2315 -u --> -a - | -r -; - -2316 - `FLAG_ZN -( -u --> -a -); - -2317 -u --> -pc -++; - -2321 -BADDR_ZP -; - -2322 -v - = -u --> - `ad -(u, -baddr -); - -2323 -u --> -f_c - = -v -&1; - -2324 -v - >>= 1; - -2325 -u --> - `wre -(u, -baddr -, -v -); - -2326 -u --> -a - ^ -v -; - -2327 - `FLAG_ZN -( -u --> -a -); - -2328 -u --> -pc -++; - -2332 -BADDR_ZPX -; - -2333 -v - = -u --> - `ad -(u, -baddr -); - -2334 -u --> -f_c - = -v -&1; - -2335 -v - >>= 1; - -2336 -u --> - `wre -(u, -baddr -, -v -); - -2337 -u --> -a - ^ -v -; - -2338 - `FLAG_ZN -( -u --> -a -); - -2339 -u --> -pc -++; - -2343 -BADDR_ABS -; - -2344 -v - = -u --> - `ad -(u, -baddr -); - -2345 -u --> -f_c - = -v -&1; - -2346 -v - >>= 1; - -2347 -u --> - `wre -(u, -baddr -, -v -); - -2348 -u --> -a - ^ -v -; - -2349 - `FLAG_ZN -( -u --> -a -); - -2350 -u --> -pc -+=2; - -2354 -BADDR_ABX -; - -2355 -v - = -u --> - `ad -(u, -baddr -); - -2356 -u --> -f_c - = -v -&1; - -2357 -v - >>= 1; - -2358 -u --> - `wre -(u, -baddr -, -v -); - -2359 -u --> -a - ^ -v -; - -2360 - `FLAG_ZN -( -u --> -a -); - -2361 -u --> -pc -+=2; - -2365 -BADDR_ABY -; - -2366 -v - = -u --> - `ad -(u, -baddr -); - -2367 -u --> -f_c - = -v -&1; - -2368 -v - >>= 1; - -2369 -u --> - `wre -(u, -baddr -, -v -); - -2370 -u --> -a - ^ -v -; - -2371 - `FLAG_ZN -( -u --> -a -); - -2372 -u --> -pc -+=2; - -2376 -BADDR_ZIX -; - -2377 -v - = -u --> - `ad -(u, -baddr -); - -2378 -u --> -f_c - = -v -&1; - -2379 -v - >>= 1; - -2380 -u --> - `wre -(u, -baddr -, -v -); - -2381 -u --> -a - ^ -v -; - -2382 - `FLAG_ZN -( -u --> -a -); - -2383 -u --> -pc -++; - -2387 -BADDR_ZIY -; - -2388 -v - = -u --> - `ad -(u, -baddr -); - -2389 -u --> -f_c - = -v -&1; - -2390 -v - >>= 1; - -2391 -u --> - `wre -(u, -baddr -, -v -); - -2392 -u --> -a - ^ -v -; - -2393 - `FLAG_ZN -( -u --> -a -); - -2394 -u --> -pc -++; - -2398 -BADDR_ABY -; - -2399 -v - = -u --> -x -; - -2402 i(( -u --> -cyes -&7)>2) - -2403 -v - &( -baddr ->>8)+1; - -2405 -u --> - `wre -(u, -baddr -, -v -); - -2406 -u --> -pc -+=2; - -2410 -BADDR_ABX -; - -2411 -v - = -u --> -y -; - -2414 i(( -u --> -cyes -&7)>2) - -2415 -v - &( -baddr ->>8)+1; - -2417 -u --> - `wre -(u, -baddr -, -v -); - -2418 -u --> -pc -+=2; - -2422 -READ_IMM -; - -2424 -u --> -a - = cpu-> -x - & -v -; - -2427 i(( -u --> -cyes -&7)>5) - -2429 -r - = ( -u --> -x -^0xff); - -2430 -r - & -u --> -cyes -; - -2431 -u --> -a - | -r -; - -2433 - `FLAG_ZN -( -u --> -a -); - -2437 -BADDR_ABY -; - -2438 -u --> - - = cpu-> -x - & cpu-> -a -; - -2439 -u --> - `wre -(u, -baddr -, cpu-> - -&((baddr>>8)+1)); - -2440 -u --> -pc -+=2; - -2444 -u --> -pc - = cpu-> -ϡpc -; - -2445  -SDL_TRUE -; - -2449  -SDL_FALSE -; - -2450 - } -} - - @6502.h - -23  - #FB_C - 0 - - ) - -24  - #FF_C - (1<< -FB_C -) - - ) - -25  - #FB_Z - 1 - - ) - -26  - #FF_Z - (1<< -FB_Z -) - - ) - -27  - #FB_I - 2 - - ) - -28  - #FF_I - (1<< -FB_I -) - - ) - -29  - #FB_D - 3 - - ) - -30  - #FF_D - (1<< -FB_D -) - - ) - -31  - #FB_B - 4 - - ) - -32  - #FF_B - (1<< -FB_B -) - - ) - -33  - #FB_R - 5 - - ) - -34  - #FF_R - (1<< -FB_R -) - - ) - -35  - #FB_V - 6 - - ) - -36  - #FF_V - (1<< -FB_V -) - - ) - -37  - #FB_N - 7 - - ) - -38  - #FF_N - (1<< -FB_N -) - - ) - -41  - #IRQB_VIA - 0 - - ) - -42  - #IRQF_VIA - (1<< -IRQB_VIA -) - - ) - -43  - #IRQB_DISK - 1 - - ) - -44  - #IRQF_DISK - (1<< -IRQB_DISK -) - - ) - -45  - #IRQB_VIA2 - 2 - - ) - -46  - #IRQF_VIA2 - (1<< -IRQB_VIA2 -) - - ) - -47  - #IRQB_ACIA - 3 - - ) - -48  - #IRQF_ACIA - (1<< -IRQB_ACIA -) - - ) - -51  - #MBPB_READ - 0 - - ) - -52  - #MBPF_READ - (1<< -MBPB_READ -) - - ) - -53  - #MBPB_WRITE - 1 - - ) - -54  - #MBPF_WRITE - (1<< -MBPB_WRITE -) - - ) - -55  - #MBPB_CHANGE - 2 - - ) - -56  - #MBPF_CHANGE - (1<< -MBPB_CHANGE -) - - ) - -57  - #MBPB_RESETCYCLES - 3 - - ) - -58  - #MBPF_RESETCYCLES - (1<< -MBPB_RESETCYCLES -) - - ) - -59  - #MBPB_RESETCYCLESCONTINUE - 4 - - ) - -60  - #MBPF_RESETCYCLESCONTINUE - (1<< -MBPB_RESETCYCLESCONTINUE -) - - ) - -63  - #MAKEFLAGS - (( -u --> -f_n -<<7)|(u-> -f_v -<<6)|(1<<5)|(u-> -f_b -<<4)|(u-> -f_d -<<3)|(u-> -f_i -<<2)|(u-> -f_z -<<1)|u-> -f_c -) - - ) - -64  - #MAKEFLAGSBC - (( -u --> -f_n -<<7)|(u-> -f_v -<<6)|(1<<5)|(u-> -f_d -<<3)|(u-> -f_i -<<2)|(u-> -f_z -<<1)|u-> -f_c -) - - ) - -67  - #SETFLAGS -( -n - -u --> -f_n -=(n&0x80)>>7;\ - -68 -u --> -f_v -=( -n -&0x40)>>6;\ - -69 -u --> -f_b -=( -n -&0x10)>>4;\ - -70 -u --> -f_d -=( -n -&0x08)>>3;\ - -71 -u --> -f_i -=( -n -&0x04)>>2;\ - -72 -u --> -f_z -=( -n -&0x02)>>1;\ - -73 -u --> -f_c -= -n -&0x01 - - ) - -75  - smembakpot - - -77 -Ut8 - - mags -; - -78 -Ut8 - - mϡv -; - -79 -Ut16 - - maddr -; - -82  - sm6502 - - -84 -St32 - - mcyes -; - -85 -Ut32 - - micyes -; - -86 -Ut32 - - mcyes -; - -87 -Ut16 - - mpc -, - mϡpc -, - mlc -, - mlct -, - mbaddr -; - -88 -SDL_bo - - mnmi -; - -89 (* - mwre -)( - mm6502 - *, - mUt16 -, - mUt8 -); - -90 (* - mad -)( - mm6502 - *, - mUt16 -); - -91 -SDL_bo - - mybp -, - mymbp -; - -92 -St32 - - mbakpots -[16]; - -93 -Ut8 - - mbakpot_ags -[16]; - -94  -membakpot - - mmembakpots -[16]; - -95 * - murda -; - -97 -Ut8 - - ma -, - mx -, - my -, - m -; - -98 -Ut8 - - mf_c -, - mf_z -, - mf_i -, - mf_d -, - mf_b -, - mf_v -, - mf_n -; - -99 -Ut8 - - mq -, - mnmicou -, - mlc -; - -102  -m6502_ - -m6502 - * -u -, * -urda -, -SDL_bo - -nukebakpots - ); - -103  -m6502_t - -m6502 - * -u - ); - -104 -SDL_bo - -m6502_ - -m6502 - * -u - ); - -105 -SDL_bo - -m6502_t_icyes - -m6502 - * -u -, SDL_bo -dobp -, * -bpmsg - ); - - @6551.c - -22  - ~"syem.h -" - -23  - ~"6502.h -" - -24  - ~"v.h -" - -25  - ~"8912.h -" - -26  - ~"gui.h -" - -27  - ~"disk.h -" - -28  - ~"mڙ.h -" - -29  - ~"6551.h -" - -30  - ~"mache.h -" - -32  - #DEBUG_ACIA - 0 - - ) - -35 #i -DEBUG_ACIA - == 3 - -36 #unde -dbg_tf - - -37  - #dbg_tf -( -x -...{ - `tf -(x);rtf("\n"); } - - ) - -38  - #DEBUG_ACIA_STATUS - 1 - - ) - -40 #i -DEBUG_ACIA - == 2 - -41 #unde -dbg_tf - - -42  - #dbg_tf -( -x -...{ - `tf -(x);rtf("\n"); } - - ) - -43  - #DEBUG_ACIA_STATUS - 0 - - ) - -45 #i -DEBUG_ACIA - == 1 - -46  - #DEBUG_ACIA_STATUS - 1 - - ) - -49  - #DEBUG_ACIA_STATUS - 0 - - ) - -52 #i -DEBUG_ACIA - - -53 * - gwreg_mes -[] = { "TXDATA", "RESET", "COMMAND", "CONTROL" }; - -54 * - gadg_mes -[] = { "RXDATA", "STATUS", "COMMAND", "CONTROL" }; - -55 * - gry_modes -[] = { "NONE", "ODD", "NONE", "EVEN", "NONE", "MARK", "NONE", "SPACE" }; - -56 * - gtxc_modes -[] = { "TXIRQ=0,RLEV=H", "TXIRQ=1,RLEV=L", "RXIRQ=0,RLEV=L", "RXIRQ=0,RLEV=L,TXBRK" }; - -57 * - gbaud_s -[] = { "EXT", "50", "75", "109.92", "134.58", "150", "300", "600", "1200", "1800", "2400", "3600", "4800", "7200", "9600", "19200" }; - -58 * - gb_nums -[] = { "8", "7", "6", "5" }; - -62  -Ut32 - - gbouds -[] = { 0, 50, 75, 110, 134, 150, 300, 600, 1200, 1800, 2400, 3600, 4800, 7200, 9600, 19200 }; - -64  - $ac_upde_ms - -ac - *acia ) - -66 8 - (( -ac --> -gs -[ -ACIA_CONTROL -]& -ACONF_WLEN -)>>5)) - -68 5: -ac --> -bmask - = 0x1f; ; - -69 6: -ac --> -bmask - = 0x3f; ; - -70 7: -ac --> -bmask - = 0x7f; ; - -71 8: : -ac --> -bmask - = 0xff; ; - -74 -ac --> -rx - = (ac-> -gs -[ -ACIA_COMMAND -] & -ACOMF_DTR -)? -SDL_TRUE - : -SDL_FALSE -; - -75 -ac --> -qrx - = (ac-> -rx - && 0 =ac-> -gs -[ -ACIA_COMMAND -] & -ACOMF_IRQDIS - ))? -SDL_TRUE - : -SDL_FALSE -; - -77  ( -ac --> -gs -[ -ACIA_COMMAND -] & -ACOMF_TXCON - ) >> 2 ) - -80 -ac --> -tx - = -SDL_FALSE -; - -81 -ac --> -qtx - = -SDL_FALSE -; - -84 -ac --> -tx - = -SDL_TRUE -; - -85 -ac --> -qtx - = -SDL_TRUE -; - -88 -ac --> -tx - = -SDL_TRUE -; - -89 -ac --> -qtx - = -SDL_FALSE -; - -93 -ac --> -tx - = -SDL_FALSE -; - -94 -ac --> -qtx - = -SDL_FALSE -; - -98 -ac --> -echo - = (ac-> -gs -[ -ACIA_COMMAND -]& -ACOMF_ECHO -)? -SDL_TRUE - : -SDL_FALSE -; - -101 -ac --> -amebs - = - -103 (8 - (( -ac --> -gs -[ -ACIA_CONTROL -]& -ACONF_WLEN -)>>5)) + - -104 (( -ac --> -gs -[ -ACIA_COMMAND -]>>5)&1) + - -105 (( -ac --> -gs -[ -ACIA_CONTROL -]& -ACONF_STOPB -) ? 2 : 1); - -107 -ac --> -boud - = -bouds -[ac-> -gs -[ -ACIA_CONTROL -]& -ACONF_BAUD -]; - -111 if(0 < -ac --> -boud -) - -112 -ac --> -amecye - = ( 115200 * 8680 ) / (c-> -boud - * 1000 ); - -114 -ac --> -amecye - = 0; - -115 - } -} - -117  - $ac_ - -ac - *ac,  -mache - * -ic - ) - -119 if -ac --> -de - ) - -120 -ac --> - `de -(cia ); - -122 -ac --> -ic - = oric; - -123 -ac --> -gs -[ -ACIA_RXDATA -] = 0; - -124 -ac --> -gs -[ -ACIA_TXDATA -] = 0; - -125 -ac --> -gs -[ -ACIA_STATUS -] = -ASTF_TXEMPTY -; - -126 -ac --> -gs -[ -ACIA_COMMAND -] = -ACOMF_IRQDIS -; - -127 -ac --> -gs -[ -ACIA_CONTROL -] = 0; - -129 -ac --> -cyes - = 0; - -130 - `ac_upde_ms - -ac - ); - -132  -ic --> -acbackd -) - -134  -ACIA_TYPE_LOOPBACK -: - -135 - `ac__loback - -ac - ); - -137 #ifde -BACKEND_MODEM - - -138  -ACIA_TYPE_MODEM -: - -139 - `ac__modem - -ac - ); - -142 #ifde -BACKEND_COM - - -143  -ACIA_TYPE_COM -: - -144 - `ac__com - -ac - ); - -147  -ACIA_TYPE_NONE -: - -149 - `ac__ne - -ac - ); - -152 - } -} - -154  - $ac_ock - -ac - *ac,  -cyes - ) - -157 if0 = -ac --> -gs -[ -ACIA_CONTROL -] & -ACONF_SRC - )) - -161 if0 = -ac --> -amecye - ) - -164 -ac --> -cyes - += cycles; - -165  -ac --> -amecye - -cyes - ) - -167 -ac --> -cyes - -ac-> -amecye -; - -170 if -ac --> -tx - && 0 =c-> -gs -[ -ACIA_STATUS -] & -ASTF_TXEMPTY -) ) - -172 if(! -ac --> - `put_by -ac-> -gs -[ -ACIA_TXDATA -] ) ) - -173 -ac --> -gs -[ -ACIA_STATUS -] | -ASTF_OVRUNERR -; - -176 -ac --> -gs -[ -ACIA_STATUS -] | -ASTF_TXEMPTY -; - -177 if -ac --> -qtx - ) - -179 -ac --> -gs -[ -ACIA_STATUS -] | -ASTF_IRQ -; - -180 -ac --> -ic --> -u -. -q - | -IRQF_ACIA -; - -182 if( -ac --> -echo -) - -183 -ac --> - `put_by -c-> -gs -[ -ACIA_TXDATA -]); - -188 if -ac --> -rx - ) - -190 -Ut8 - -da - = 0; - -191 if -ac --> - `has_by -(& -da -) ) - -193 -ac --> -gs -[ -ACIA_STATUS -] | -ASTF_RXDATA -; - -194 if -ac --> -qrx - ) - -196 -ac --> -gs -[ -ACIA_STATUS -] | -ASTF_IRQ -; - -197 -ac --> -ic --> -u -. -q - | -IRQF_ACIA -; - -204 if -ac --> - - ) - -205 -ac --> -gs -[ -ACIA_STATUS -] =c-> - ` -(acia->regs[ACIA_STATUS]); - -207 -ac --> -gs -[ -ACIA_STATUS -] |( -ASTF_CARRIER -| -ASTF_DSR -); - -208 - } -} - -210  - $ac_wre - -ac - *ac, -Ut16 - -addr -, -Ut8 - -da - ) - -212 #i -DEBUG_ACIA - - -213 - `dbg_tf -"ACIA wre: (%04X%02X%s", -ac --> -ic --> -u -. -pc --1, -da -, -wreg_mes -[ -addr -&3] ); - -215  -addr - & 3 ) - -217  -ACIA_RXDATA -: - -218 -ac --> -gs -[ -ACIA_TXDATA -] = -da - &c-> -bmask -; - -219 -ac --> -gs -[ -ACIA_STATUS -] &~( -ASTF_TXEMPTY -); - -222  -ACIA_STATUS -: - -223 -ac --> -gs -[ -ACIA_COMMAND -] & -ACOMF_PARITY -; - -224 -ac --> -gs -[ -ACIA_COMMAND -] | -ACOMF_IRQDIS -; - -225 -ac --> -gs -[ -ACIA_STATUS -] &~( -ASTF_OVRUNERR -); - -226 - `ac_upde_ms - -ac - ); - -229  -ACIA_COMMAND -: - -230 -ac --> -gs -[ -ACIA_COMMAND -] = -da -; - -231 - `ac_upde_ms - -ac - ); - -233 #i -DEBUG_ACIA - - -234 - `dbg_tf -" Py = %s", -ry_modes -[ -da ->>5] ); - -235 - `dbg_tf -" RX Mod%s", ( -da -& -ACOMF_ECHO -) ? "ECHO" : "NORMAL" ); - -236 - `dbg_tf -" TXC = %s", -txc_modes -[( -da -& -ACOMF_TXCON -)>>2] ); - -237 - `dbg_tf -" IRQ = %s", ( -da -& -ACOMF_IRQDIS -) ? "OFF" : "ON" ); - -238 - `dbg_tf -" DTR = %s", ( -da -& -ACOMF_DTR -) ? "ON" : "OFF" ); - -242  -ACIA_CONTROL -: - -243 -ac --> -gs -[ -ACIA_CONTROL -] = -da -; - -244 - `ac_upde_ms - -ac - ); - -246 #i -DEBUG_ACIA - - -247 - `dbg_tf -" Baud = %s", -baud_s -[ -da -& -ACONF_BAUD -] ); - -248 - `dbg_tf -" RXClock = %s", ( -da -& -ACONF_SRC -) ? "INT" : "EXT" ); - -249 - `dbg_tf -" B = %s", -b_nums -[( -da -& -ACONF_WLEN -)>>5] ); - -250 - `dbg_tf -" Stb%d", ( -da -& -ACONF_STOPB -) ? 2 : 1 ); - -254 - } -} - -256 -Ut8 - - $ac_ad - -ac - *ac, -Ut16 - -addr - ) - -258 -Ut8 - -da - = -ac --> -gs -[ -addr -&3]; - -260  -addr - & 3 ) - -262  -ACIA_RXDATA -: - -263 #i -DEBUG_ACIA - - -264 - `dbg_tf -"ACIAd: (%04Xom %(=%02X)", -ac --> -ic --> -u -. -pc --1, -adg_mes -[ -addr -&3], -da - ); - -266 -ac --> - `g_by -& -da - ); - -267 -da - & -ac --> -bmask -; - -268 -ac --> -gs -[ -ACIA_RXDATA -] = -da -; - -269 -ac --> -gs -[ -ACIA_STATUS -] &~( -ASTF_PARITYERR -| -ASTF_FRAMEERR -| -ASTF_OVRUNERR -); - -270 -ac --> -gs -[ -ACIA_STATUS -] &~( -ASTF_RXDATA -); - -273  -ACIA_STATUS -: - -274 #i -DEBUG_ACIA_STATUS - - -275 - `dbg_tf -"ACIAd: (%04Xom %(=%02X)", -ac --> -ic --> -u -. -pc --1, -adg_mes -[ -addr -&3], -da - ); - -278 -ac --> -gs -[ -ACIA_STATUS -] &~( -ASTF_IRQ -); - -279 -ac --> -ic --> -u -. -q - &~( -IRQF_ACIA -); - -283 #i -DEBUG_ACIA - - -284 - `dbg_tf -"ACIAd: (%04Xom %(=%02X)", -ac --> -ic --> -u -. -pc --1, -adg_mes -[ -addr -&3], -da - ); - -289  -da -; - -290 - } -} - -293 -SDL_bo - - $ac__ne - -ac - *acia ) - -295 -ac --> -de - = -NULL -; - -296 -ac --> - - = -NULL -; - -297 -ac --> -has_by - = -NULL -; - -298 -ac --> -g_by - = -NULL -; - -299 -ac --> -put_by - = -NULL -; - -301 -ac --> -ic --> -acbackd - = -ACIA_TYPE_NONE -; - -302  -SDL_TRUE -; - -303 - } -} - - @6551.h - -25 - mACIA_RXDATA -=0, - -26 - mACIA_STATUS -, - -27 - mACIA_COMMAND -, - -28 - mACIA_CONTROL -, - -29 - mACIA_TXDATA -, - -30 - mACIA_LAST - - -34  - #ACOMB_DTR - 0 - - ) - -35  - #ACOMF_DTR - (1<< -ACOMB_DTR -) - - ) - -36  - #ACOMB_IRQDIS - 1 - - ) - -37  - #ACOMF_IRQDIS - (1<< -ACOMB_IRQDIS -) - - ) - -38  - #ACOMF_TXCON - 0x0c - - ) - -39  - #ACOMB_ECHO - 2 - - ) - -40  - #ACOMF_ECHO - (1<< -ACOMB_ECHO -) - - ) - -41  - #ACOMF_PARITY - 0xe0 - - ) - -44  - #ACONF_BAUD - 0x0f - - ) - -45  - #ACONB_SRC - 4 - - ) - -46  - #ACONF_SRC - (1<< -ACONB_SRC -) - - ) - -47  - #ACONF_WLEN - 0x60 - - ) - -48  - #ACONB_STOPB - 7 - - ) - -49  - #ACONF_STOPB - (1<< -ACONB_STOPB -) - - ) - -52  - #ASTB_PARITYERR - 0 - - ) - -53  - #ASTF_PARITYERR - (1<< -ASTB_PARITYERR -) - - ) - -54  - #ASTB_FRAMEERR - 1 - - ) - -55  - #ASTF_FRAMEERR - (1<< -ASTB_FRAMEERR -) - - ) - -56  - #ASTB_OVRUNERR - 2 - - ) - -57  - #ASTF_OVRUNERR - (1<< -ASTB_OVRUNERR -) - - ) - -58  - #ASTB_RXDATA - 3 - - ) - -59  - #ASTF_RXDATA - (1<< -ASTB_RXDATA -) - - ) - -60  - #ASTB_TXEMPTY - 4 - - ) - -61  - #ASTF_TXEMPTY - (1<< -ASTB_TXEMPTY -) - - ) - -62  - #ASTB_CARRIER - 5 - - ) - -63  - #ASTF_CARRIER - (1<< -ASTB_CARRIER -) - - ) - -64  - #ASTB_DSR - 6 - - ) - -65  - #ASTF_DSR - (1<< -ASTB_DSR -) - - ) - -66  - #ASTB_IRQ - 7 - - ) - -67  - #ASTF_IRQ - (1<< -ASTB_IRQ -) - - ) - -71 #ifde -__LINUX__ - - -72  - #BACKEND_MODEM - - - ) - -74 #ifde -WIN32 - - -75  - #BACKEND_MODEM - - - ) - -77 #ifde -__amigaos4__ - - -78  - #BACKEND_MODEM - - - ) - -80 #ifde -__MORPHOS__ - - -81  - #BACKEND_MODEM - - - ) - -84 #ifde -__LINUX__ - - -85  - #BACKEND_COM - - - ) - -87 #ifde -WIN32 - - -88  - #BACKEND_COM - - - ) - -93 - mACIA_TYPE_NONE - = 0, - -94 - mACIA_TYPE_LOOPBACK -, - -95 - mACIA_TYPE_MODEM -, - -96 - mACIA_TYPE_COM -, - -98 - mACIA_TYPE_LAST - - -102  - #ACIA_BACKEND_NAME_LEN - 128 - - ) - -105  - #ACIA_TYPE_MODEM_DEFAULT_PORT - 23 - - ) - -107  - sac - - -109  -mache - * - mic -; - -110 -Ut8 - - mgs -[ -ACIA_LAST -]; - -112 -Ut32 - - mcyes -; - -113 -Ut32 - - mboud -; - -114 -Ut32 - - mamebs -; - -115 -Ut32 - - mamecye -; - -117 -Ut8 - - mbmask -; - -119 -SDL_bo - - mrx -; - -120 -SDL_bo - - mqrx -; - -121 -SDL_bo - - mtx -; - -122 -SDL_bo - - mqtx -; - -124 -SDL_bo - - mecho -; - -127 -Ut8 - (* - -)(Ut8 - m -); - -128 -SDL_bo - (* -has_by -)( -Ut8 -* - mda -); - -129 -SDL_bo - (* -g_by -)( -Ut8 -* - mda -); - -130 -SDL_bo - (* -put_by -)( -Ut8 - - mda -); - -131 (* - mde -)( -ac -* - mac -); - -134  -ac_ - -ac - *ac,  -mache - * -ic - ); - -135  -ac_ock - -ac - *ac,  -cyes - ); - -136  -ac_wre - -ac - *ac, -Ut16 - -addr -, -Ut8 - -da - ); - -137 -Ut8 - -ac_ad - -ac - *ac, -Ut16 - -addr - ); - -140 -SDL_bo - -ac__ne - -ac -*cia ); - -141 -SDL_bo - -ac__loback - -ac -*cia ); - -142 #ifde -BACKEND_MODEM - - -143 -SDL_bo - -ac__modem - -ac -*cia ); - -145 #ifde -BACKEND_COM - - -146 -SDL_bo - -ac__com - -ac -*cia ); - - @6551_com.c - -22  - ~"syem.h -" - -23  - ~"6502.h -" - -24  - ~"v.h -" - -25  - ~"8912.h -" - -26  - ~"gui.h -" - -27  - ~"disk.h -" - -28  - ~"mڙ.h -" - -29  - ~"6551.h -" - -30  - ~"mache.h -" - -32 #ifde -BACKEND_COM - - -34  -mache -* - gic - = -NULL -; - -36  - gcom_baud - = 115200; - -37  - gcom_bs - = 8; - -38  - gcom_ry - = 'N'; - -39  - gcom_bs - = 1; - -40  - gcom_me -[ -ACIA_BACKEND_NAME_LEN -]; - -43  -SDL_bo - -com_vide_m -(); - -44  -SDL_bo - -com_ݒ -(); - -45  -SDL_bo - -com_o -(); - -46  -SDL_bo - -com_wre -( -Ut8 - -da -); - -47  -SDL_bo - -com_ad -( -Ut8 -* -da -); - -48  -SDL_bo - -com_ek -( -Ut8 -* -da -); - -50  - $com_de - -ac -*cia ) - -52 - `com_o -(); - -53 - `ac__ne - -ac - ); - -54 - } -} - -56  -Ut8 - - $com_ -( -Ut8 - - -) - -58  ( - - | ( -ASTF_CARRIER -| -ASTF_DSR -)); - -59 - } -} - -61  -SDL_bo - - $com_has_by -( -Ut8 -* -da -) - -63  - `com_ek -( -da -); - -64 - } -} - -66  -SDL_bo - - $com_g_by -( -Ut8 -* -da -) - -68  - `com_ad -( -da -); - -69 - } -} - -71  -SDL_bo - - $com_put_by -( -Ut8 - -da -) - -73  - `com_wre -( -da -); - -74 - } -} - -76 -SDL_bo - - $ac__com - -ac -*cia ) - -78 -ic - = -ac -->oric; - -80 -ac --> -de - = -com_de -; - -81 -ac --> - - = -com_ -; - -82 -ac --> -has_by - = -com_has_by -; - -83 -ac --> -g_by - = -com_g_by -; - -84 -ac --> -put_by - = -com_put_by -; - -87 if(5 = - `ssnf -( -ic --> -acbackdme -, "com:%d,%d,%c,%d,%s", - -88 & -com_baud -, & -com_bs -, & -com_ry -, & -com_bs -, -com_me -)) - -91 if( - `com_vide_m -()) - -93 if( - `com_ݒ -()) - -95 -ic --> -acbackd - = -ACIA_TYPE_COM -; - -96  -SDL_TRUE -; - -102 - `ac__ne - -ac - ); - -103  -SDL_FALSE -; - -104 - } -} - -108  - #COM_FIFO_SIZE - 4096 - - ) - -109  - gcom_fifo - = 0; - -110  -Ut8 - - gcom_fifo_buf -[ -COM_FIFO_SIZE -]; - -113 #i -defed -( -__LINUX__ -|| defed( -__APPLE__ -) - -114  - ~ - -115  - ~ - -116  - ~ - -117  - ~ - -118  - ~ - -119  - ~ - -120  - ~ - -122  - #m -( -a -, -b -(()<(b))?):(b)) - - ) - -124  - gcom_fd - = -1; - -125  - gcom_m - = 0; - -127  -SDL_bo - - $com_vide_m -() - -129 -com_m - = 0; - -130  -com_baud -) - -132 50: -com_m - = -B50 -; ; - -133 75: -com_m - = -B75 -; ; - -134 110: -com_m - = -B110 -; ; - -135 134: -com_m - = -B134 -; ; - -136 150: -com_m - = -B150 -; ; - -137 300: -com_m - = -B300 -; ; - -138 600: -com_m - = -B600 -; ; - -139 1200: -com_m - = -B1200 -; ; - -140 1800: -com_m - = -B1800 -; ; - -141 2400: -com_m - = -B2400 -; ; - -143 4800: -com_m - = -B4800 -; ; - -145 9600: -com_m - = -B9600 -; ; - -146 19200: -com_m - = -B19200 -; ; - -147 38400: -com_m - = -B38400 -; ; - -148 57600: -com_m - = -B57600 -; ; - -149 115200: -com_m - = -B115200 -; ; - -151  -SDL_FALSE -; - -154  -com_bs -) - -156 5: -com_m - | -CS5 -; ; - -157 6: -com_m - | -CS6 -; ; - -158 7: -com_m - | -CS7 -; ; - -159 8: -com_m - | -CS8 -; ; - -161  -SDL_FALSE -; - -164  - `tow -( -com_ry -)) - -167 'o': -com_m - | -PARENB -| -PARODD -; ; - -168 'e': -com_m - | -PARENB -; ; - -170  -SDL_FALSE -; - -173  -com_bs -) - -175 2: -com_m - | -CSTOPB -; ; - -178  -SDL_FALSE -; - -181 -com_m - |( -CLOCAL -| -CREAD -); - -182  -SDL_TRUE -; - -183 - } -} - -185  -SDL_bo - - $com_ݒ -() - -187  -rmios - -tis -; - -189 -com_fifo - = 0; - -191 -com_fd - = - `ݒ -( -com_me -, -O_RDWR - | -O_NOCTTY - | -O_NDELAY -); - -192 if-1 = -com_fd - ) - -195  -SDL_FALSE -; - -198 - `f -( -com_fd -, -F_SETFL -, -FNDELAY -); - -200 - `tcg -( -com_fd -, & -tis -); - -201 -tis -. -c_cag - = -com_m -; - -202 - `tcr -( -com_fd -, -TCSANOW -, & -tis -); - -204  -SDL_TRUE -; - -205 - } -} - -207  -SDL_bo - - $com_o -() - -209 if-1 ! -com_fd - ) - -210 - `o - -com_fd - ); - -211 -com_fd - = -1; - -212  -SDL_TRUE -; - -213 - } -} - -215  -SDL_bo - - $com_wre -( -Ut8 - -da -) - -217 if-1 ! -com_fd - ) - -219 if0 < - `wre -( -com_fd -, & -da -, 1) ) - -220  -SDL_TRUE -; - -222  -SDL_FALSE -; - -223 - } -} - -225  - $com_fl_fifo -() - -227 if -com_fifo - < -COM_FIFO_SIZE - ) - -229  -n - = 0; - -230 if-1 ! - `iol -( -com_fd -, -FIONREAD -, & -n -) ) - -232 -n - = - `m -֒, -COM_FIFO_SIZE - - -com_fifo -); - -233 -n - = () - `ad - -com_fd -, -com_fifo_buf - + -com_fifo -,en); - -234 -com_fifo - + -n -; - -237 - } -} - -239  -SDL_bo - - $com_ad -( -Ut8 -* -da -) - -241 if-1 ! -com_fd - ) - -243 - `com_fl_fifo -(); - -245 if0 < -com_fifo - ) - -247 * -da - = -com_fifo_buf -[0]; - -248 - `memmove -( -com_fifo_buf -, com_fifo_buf+1, -- -com_fifo -); - -249  -SDL_TRUE -; - -252  -SDL_FALSE -; - -253 - } -} - -255  -SDL_bo - - $com_ek -( -Ut8 -* -da -) - -257 if-1 ! -com_fd - ) - -259 - `com_fl_fifo -(); - -261 if0 < -com_fifo - ) - -263 * -da - = -com_fifo_buf -[0]; - -264  -SDL_TRUE -; - -267  -SDL_FALSE -; - -268 - } -} - -271 #ifde -WIN32 - - -272  - #WIN32_LEAN_AND_MEAN - - - ) - -273  - ~ - -274  - ~ - -275 #ide -_MSC_VER - - -276  - ~ - -278  - ~ - -279  - ~ - -280  - ~ - -281  - ~ - -282  - ~ - -284  -HANDLE - - gcom_fd - = -INVALID_HANDLE_VALUE -; - -285  -DCB - - gcom_dcb -; - -287  -SDL_bo - - $com_vide_m -() - -289 - `memt -(& -com_dcb -, 0, (com_dcb)); - -290  -com_baud -) - -294 110: -com_dcb -. -BaudRe - = -CBR_110 -; ; - -297 300: -com_dcb -. -BaudRe - = -CBR_300 -; ; - -298 600: -com_dcb -. -BaudRe - = -CBR_600 -; ; - -299 1200: -com_dcb -. -BaudRe - = -CBR_1200 -; ; - -301 2400: -com_dcb -. -BaudRe - = -CBR_2400 -; ; - -303 4800: -com_dcb -. -BaudRe - = -CBR_4800 -; ; - -305 9600: -com_dcb -. -BaudRe - = -CBR_9600 -; ; - -306 19200: -com_dcb -. -BaudRe - = -CBR_19200 -; ; - -307 38400: -com_dcb -. -BaudRe - = -CBR_38400 -; ; - -308 57600: -com_dcb -. -BaudRe - = -CBR_57600 -; ; - -309 115200: -com_dcb -. -BaudRe - = -CBR_115200 -; ; - -311  -SDL_FALSE -; - -314  -com_bs -) - -319 8: -com_dcb -. -BySize - = -com_bs -; ; - -321  -SDL_FALSE -; - -324  - `tow -( -com_ry -)) - -326 'n': -com_dcb -. -fPy - = 0; com_dcb. -Py - = 0; ; - -327 'o': -com_dcb -. -fPy - = 1; com_dcb. -Py - = 1; ; - -328 'e': -com_dcb -. -fPy - = 1; com_dcb. -Py - = 2; ; - -330  -SDL_FALSE -; - -333  -com_bs -) - -335 2: -com_dcb -. -StBs - = 2; ; - -336 1: -com_dcb -. -StBs - = 0; ; - -338  -SDL_FALSE -; - -341  -SDL_TRUE -; - -342 - } -} - -344  -SDL_bo - - $com_ݒ -() - -346 -DCB - -dcb -; - -347 -COMMTIMEOUTS - -com_timeouts -; - -349 -com_fd - = - `CeFe -( -com_me -, -GENERIC_READ -| -GENERIC_WRITE -, 0,0, -OPEN_EXISTING -, 0,0); - -350 i -INVALID_HANDLE_VALUE - = -com_fd - ) - -351  -SDL_FALSE -; - -353 i(! - `GCommS -( -com_fd -, & -dcb -) ) - -355 - `com_o -(); - -356  -SDL_FALSE -; - -359 -dcb -. -BaudRe - = -com_dcb -.BaudRate; - -360 -dcb -. -BySize - = -com_dcb -.ByteSize; - -361 -dcb -. -fPy - = -com_dcb -.fParity; - -362 -dcb -. -Py - = -com_dcb -.Parity; - -363 -dcb -. -StBs - = -com_dcb -.StopBits; - -365 -dcb -. -fOutxCtsFlow -= -FALSE -; - -366 -dcb -. -fOutxDFlow -= -FALSE -; - -367 -dcb -. -fDCڌ -= -DTR_CONTROL_DISABLE -; - -368 -dcb -. -fTXCtueOnXoff -= -TRUE -; - -370 - `memmove -(& -com_dcb -, & -dcb -, (com_dcb)); - -372 i(! - `SCommS -( -com_fd -, & -com_dcb -) ) - -374 - `com_o -(); - -375  -SDL_FALSE -; - -378 -com_timeouts -. -RdIvTimeout -=0; - -379 -com_timeouts -. -RdTٮTimeoutCڡt -=0; - -380 -com_timeouts -. -RdTٮTimeoutMuɝlr -=0; - -381 -com_timeouts -. -WreTٮTimeoutCڡt -=0; - -382 -com_timeouts -. -WreTٮTimeoutMuɝlr -=0; - -383 - `SCommTimeouts - -com_fd -, & -com_timeouts - ); - -385  -SDL_TRUE -; - -386 - } -} - -388  -SDL_bo - - $com_o -() - -390 i -INVALID_HANDLE_VALUE - ! -com_fd - ) - -391 - `CloHd - -com_fd - ); - -392 -com_fd - = -INVALID_HANDLE_VALUE -; - -393  -SDL_TRUE -; - -394 - } -} - -396  -SDL_bo - - $com_wre -( -Ut8 - -da -) - -398 if -INVALID_HANDLE_VALUE - ! -com_fd - ) - -400 -DWORD - -n - = 0; - -401 if0 < - `WreFe - -com_fd -, & -da -, 1, & -n -, -NULL -) ) - -402  -SDL_TRUE -; - -404  -SDL_FALSE -; - -405 - } -} - -407  - $com_fl_fifo -() - -409 if -com_fifo - < -COM_FIFO_SIZE - ) - -411 -DWORD - -r -; - -412 -COMSTAT - -com_ -; - -413 - `CˬCommE - -com_fd -, & -r -, & -com_ - ); - -414 if0 < ( -com_ -. -cbInQue - ) - -416 -DWORD - -n - = - `m - -com_ -. -cbInQue -, -COM_FIFO_SIZE - - -com_fifo - ); - -417 if0 < - `RdFe - -com_fd -, -com_fifo_buf - + -com_fifo -, -n -, &n, -NULL -) ) - -419 -com_fifo - + -n -; - -423 - } -} - -425  -SDL_bo - - $com_ad -( -Ut8 -* -da -) - -427 if -INVALID_HANDLE_VALUE - ! -com_fd - ) - -429 - `com_fl_fifo -(); - -431 if0 < -com_fifo - ) - -433 * -da - = -com_fifo_buf -[0]; - -434 - `memmove -( -com_fifo_buf -, com_fifo_buf+1, -com_fifo --1); - -435 -com_fifo ---; - -436  -SDL_TRUE -; - -439  -SDL_FALSE -; - -440 - } -} - -442  -SDL_bo - - $com_ek -( -Ut8 -* -da -) - -444 if -INVALID_HANDLE_VALUE - ! -com_fd - ) - -446 - `com_fl_fifo -(); - -448 if0 < -com_fifo - ) - -450 * -da - = -com_fifo_buf -[0]; - -451  -SDL_TRUE -; - -454  -SDL_FALSE -; - -455 - } -} - - @6551_loopback.c - -22  - ~"syem.h -" - -23  - ~"6502.h -" - -24  - ~"v.h -" - -25  - ~"8912.h -" - -26  - ~"gui.h -" - -27  - ~"disk.h -" - -28  - ~"mڙ.h -" - -29  - ~"6551.h -" - -30  - ~"mache.h -" - -32  - #LOOPBACK_BUF_SIZE - 16 - - ) - -33  -Ut8 - - globack_buf -[ -LOOPBACK_BUF_SIZE -]; - -34  - globack_ - = 0; - -35  - globack_out - = 0; - -37  - $loback_de - -ac -*cia ) - -39 - `ac__ne - -ac - ); - -40 - } -} - -42  -Ut8 - - $loback_ -( -Ut8 - - -) - -45  ( - - & ~( -ASTF_CARRIER -| -ASTF_DSR -)); - -46 - } -} - -48  -SDL_bo - - $loback_has_by -( -Ut8 -* -da -) - -50  -loback_out_wp - = ( -loback_out - < -loback_ -)?oback_ou+ -LOOPBACK_BUF_SIZE - :oopback_out; - -52 if( -loback_ - < -loback_out_wp -) - -54 * -da - = -loback_buf -[ -loback_ -]; - -55  -SDL_TRUE -; - -57  -SDL_FALSE -; - -58 - } -} - -60  -SDL_bo - - $loback_g_by -( -Ut8 -* -da -) - -62  -loback_out_wp - = ( -loback_out - < -loback_ -)?oback_ou+ -LOOPBACK_BUF_SIZE - :oopback_out; - -64 if( -loback_ - < -loback_out_wp -) - -66 * -da - = -loback_buf -[ -loback_ -]; - -67 -loback_ -++; - -68 if( -LOOPBACK_BUF_SIZE - < -loback_ -) - -69 -loback_ - = 0; - -70  -SDL_TRUE -; - -72  -SDL_FALSE -; - -73 - } -} - -75  -SDL_bo - - $loback_put_by -( -Ut8 - -da -) - -77  -loback_out_wp - = ( -loback_out - < -loback_ -)?oback_ou+ -LOOPBACK_BUF_SIZE - :oopback_out; - -79 if( -loback_out_wp - + 1 = -loback_ -) - -80  -SDL_FALSE -; - -82 -loback_buf -[ -loback_out -] = -da -; - -83 -loback_out -++; - -84 if( -LOOPBACK_BUF_SIZE - < -loback_out -) - -85 -loback_out - = 0; - -87  -SDL_TRUE -; - -88 - } -} - -90 -SDL_bo - - $ac__loback - -ac -*cia ) - -92 -loback_ - = 0; - -93 -loback_out - = 0; - -94 -ac --> -de - = -loback_de -; - -95 -ac --> - - = -loback_ -; - -96 -ac --> -has_by - = -loback_has_by -; - -97 -ac --> -g_by - = -loback_g_by -; - -98 -ac --> -put_by - = -loback_put_by -; - -100 -ac --> -ic --> -acbackd - = -ACIA_TYPE_LOOPBACK -; - -101  -SDL_TRUE -; - -102 - } -} - - @6551_modem.c - -22 #ifde -__MINGW32__ - - -24  - #_WIN32_WINNT - 0x0501 - - ) - -27 #ifde -_MSC_VER - - -29 #agm -commt -( -lib -, "Ws2_32.lib") - -30  - ~ - -31  - ~ - -32  - ~ - -35  - ~"syem.h -" - -36  - ~"6502.h -" - -37  - ~"v.h -" - -38  - ~"8912.h -" - -39  - ~"gui.h -" - -40  - ~"disk.h -" - -41  - ~"mڙ.h -" - -42  - ~"6551.h -" - -43  - ~"mache.h -" - -45 #ifde -BACKEND_MODEM - - -47  -mache -* - gic - = -NULL -; - -49  - #CMD_BUF_SIZE - 4 - - ) - -50  -Ut8 - - gmdm_cmd_buf -[ -CMD_BUF_SIZE -]; - -53  -Ut32 - - gmdm_time_buf -[ -CMD_BUF_SIZE -]; - -55  - #DATA_BUF_SIZE - 4096 - - ) - -56  - gmdm_ - = 0; - -57  -Ut8 - - gmdm__buf -[ -DATA_BUF_SIZE -]; - -58  - gmdm_out - = 0; - -59  -Ut8 - - gmdm_out_buf -[ -DATA_BUF_SIZE -]; - -61  -SDL_bo - - gced - = -SDL_FALSE -; - -62  -SDL_bo - - glig - = -SDL_FALSE -; - -63  -SDL_bo - - gesd - = -SDL_FALSE -; - -65  - gv_sck - = -1; - -66  - gt_sck - = -1; - -69  -SDL_bo - -sock_ -(); - -70  -sock_de -(); - -71  -sock_ -(* -sock -,  -doma -); - -72  -sock_bd -( -sock -,  -pt -,  -doma -); - -73  -sock_li -( -sock -); - -74  -sock_ac -( -sock -, * -sck -); - -75  -sock_c -( -sock -, cڡ * - -,  -pt -,  -doma -); - -76  -sock_wre -( -sock -, cڡ * -da -,  -n -); - -77  -sock_ad -( -sock -, * -da -, * -n -); - -78  -sock_o -( -sock -); - -80 * - $im -(* -le -) - -82 if( -le - && *line) - -84  -l - = () - ` -( -le -); - -85 0 < -l - && -le -[l-1] == ' ') - -86 -le -[-- -l -] = '\0'; - -87 0 < -l - && -le -[0] == ' ') - -88 - `memmove -( -le -,e+1, -l ---); - -90  -le -; - -91 - } -} - -93  - $nd_r -(cڡ * -s -) - -95  -s - && *s) - -97 -mdm_out_buf -[ -mdm_out -] = * -s -++; - -98 -mdm_out -++; - -99 if( -mdm_out - = -DATA_BUF_SIZE -) - -101 - `memmove -( -mdm_out_buf -, mdm_out_buf+1, -DATA_BUF_SIZE --1); - -102 -mdm_ ---; - -105 - } -} - -107  - $nd_ -(cڡ * -s -) - -109 - `nd_r -("\r\n"); - -110 if( -s - && *s) - -112 - `nd_r -( -s -); - -113 - `nd_r -("\r\n"); - -115 - } -} - -117  - $nd__ok -() - -119 - `nd_ -("OK"); - -120 - } -} - -122  - $nd__r -() - -124 - `nd_ -("ERROR"); - -125 - } -} - -127  - $mdm_hgup -() - -129 -ced - = -SDL_FALSE -; - -130 -esd - = -SDL_FALSE -; - -131 - `sock_o -( -t_sck -); - -132 -t_sck - = -1; - -133 - } -} - -135  - $mdm_swoff -() - -137 if -lig - ) - -139 -lig - = -SDL_FALSE -; - -140 - `sock_o -( -v_sck -); - -141 -v_sck - = -1; - -143 - } -} - -145  - $mdm_sw -() - -147 if! -lig - ) - -149 if( - `sock_ -(& -v_sck -, -ic --> -acbackdcfgdoma -) && - -150 - `sock_bd -( -v_sck -, -ic --> -acbackdcfgpt -, oric-> -acbackdcfgdoma -) && - -151 - `sock_li -( -v_sck -)) - -152 -lig - = -SDL_TRUE -; - -154 - } -} - -156  - $mdm_c -(cڡ * -s -) - -158  - -[1024]; - -159 * -p - = -NULL -; - -160  -pt - = 0; - -162 - `ry -( - -, -s -); - -163 - `im -( - -); - -164 -p - = - `chr -( - -, ':'); - -166 if( -p -) - -168 -pt - = - `oi -( -p -+1); - -169 -p -[0] = '\0'; - -172 if( -pt - =0p܈ -ACIA_TYPE_MODEM_DEFAULT_PORT -; - -174 if - `sock_ -(& -t_sck -, -ic --> -acbackdcfgdoma -) ) - -176 if( - `sock_c -( -t_sck -, - -, -pt -, -ic --> -acbackdcfgdoma -)) - -178 - `nd_ -("CONNECT"); - -179 -ced - = -SDL_TRUE -; - -183 - `nd_ -("BUSY"); - -186 - `nd_ -("NO DIALTINE"); - -188 - `mdm_hgup -(); - -189 - } -} - -191  - $r_commd -(cڡ * -s -) - -193 if(! -s -) - -196 if -esd - ) - -198 if('\0' = -s -[0]) - -199 - `nd_ -(""); - -200 if(! - `rcmp -("ATA", -s -)) - -201 -esd - = -SDL_FALSE -; - -202 if(! - `rcmp -("ATO", -s -)) - -203 -esd - = -SDL_FALSE -; - -204 if(! - `rcmp -("ATH1", -s -)) - -205 -esd - = -SDL_FALSE -; - -206 if(! - `rcmp -("ATH0", -s -)) - -208 - `mdm_hgup -(); - -209 - `nd__ok -(); - -211 if(! - `cmp -("ATZ", -s -, 3)) - -213 - `mdm_hgup -(); - -214 - `nd__ok -(); - -217 - `nd__r -(); - -221 if('\0' = -s -[0]) - -222 - `nd_ -(""); - -223 if(! - `rcmp -("AT", -s -)) - -224 - `nd__ok -(); - -225 if(! - `rcmp -("ATA", -s -)) - -227 - `mdm_sw -(); - -228 if! -lig - ) - -229 - `nd__r -(); - -231 - `nd_ -("AUTOANSWER ON"); - -233 if(! - `cmp -("ATS0=", -s -, 5)) - -235 * -p - = - `im -( - `rdup -( -s -+5)); - -236  - - = - `oi -( -p -); - -237 - ` -( -p -); - -239 if(0< - -) - -241 - `mdm_sw -(); - -242 if! -lig - ) - -243 - `nd__r -(); - -245 - `nd_ -("AUTOANSWER ON"); - -249 - `mdm_swoff -(); - -250 - `nd_ -("AUTOANSWER OFF"); - -253 if(! - `rcmp -("ATS0?", -s -)) - -255 if -lig - ) - -256 - `nd_ -("AUTOANSWER ON"); - -258 - `nd_ -("AUTOANSWER OFF"); - -260 if(! - `rcmp -("ATH0", -s -)) - -262 - `mdm_hgup -(); - -263 - `nd__ok -(); - -265 if(! - `rcmp -("ATH1", -s -)) - -266 - `nd__ok -(); - -267 if(! - `cmp -("ATZ", -s -, 3)) - -268 - `nd__ok -(); - -269 if(! - `cmp -("AT&F", -s -, 4)) - -270 - `nd__ok -(); - -271 if(! - `cmp -("ATD", -s -, 3)) - -273 -s - = s + 3; - -274  - `tow -(* -s -)) - -278 -s -++; - -281 if(* -s -) - -282 - `mdm_c -( -s -); - -284 - `nd__r -(); - -287 - `nd__r -(); - -289 - } -} - -291  - $modem_de - -ac -*cia ) - -293 - `mdm_hgup -(); - -295 - `sock_o -( -v_sck -); - -296 -v_sck - = -1; - -298 - `sock_de -(); - -300 - } -} - -302  -Ut8 - - $modem_ -( -Ut8 - - -) - -304 if -ced - && ! -esd - ) - -306  -n - = -DATA_BUF_SIZE - - -mdm_out -; - -307 if(0 < -n -) - -309 if(! - `sock_ad -( -t_sck -, -mdm_out_buf - + -mdm_out -, & -n -)) - -311 - `mdm_hgup -(); - -312 - `nd_ -("NO CARRIER"); - -315 -mdm_out - + -n -; - -319 if! -ced - && -lig - ) - -321 if( - `sock_ac -( -v_sck -, & -t_sck -)) - -323 - `nd_ -("CONNECT"); - -324 -ced - = -SDL_TRUE -; - -328 if -ced - ) - -329  ( - - & ~( -ASTF_CARRIER -| -ASTF_DSR -)); - -331 if -lig - ) - -332  ( - - & ~( -ASTF_DSR -)); - -334  ( - - | ( -ASTF_CARRIER -| -ASTF_DSR -)); - -335 - } -} - -337  -SDL_bo - - $modem_has_by -( -Ut8 -* -da -) - -339 if(0 < -mdm_out -) - -341 * -da - = -mdm_out_buf -[0]; - -342  -SDL_TRUE -; - -345  -SDL_FALSE -; - -346 - } -} - -348  -SDL_bo - - $modem_g_by -( -Ut8 -* -da -) - -350 if(0 < -mdm_out -) - -352 * -da - = -mdm_out_buf -[0]; - -353 - `memmove -( -mdm_out_buf -, mdm_out_buf+1, -mdm_out -); - -354 -mdm_out ---; - -355  -SDL_TRUE -; - -358  -SDL_FALSE -; - -359 - } -} - -361  - $mdm_es -( -Ut8 - -da -) - -363 -mdm_cmd_buf -[0] = mdm_cmd_buf[1]; - -364 -mdm_cmd_buf -[1] = mdm_cmd_buf[2]; - -365 -mdm_cmd_buf -[2] = mdm_cmd_buf[3]; - -366 -mdm_cmd_buf -[3] = -da -; - -368 -mdm_time_buf -[0] = mdm_time_buf[1]; - -369 -mdm_time_buf -[1] = mdm_time_buf[2]; - -370 -mdm_time_buf -[2] = mdm_time_buf[3]; - -371 -mdm_time_buf -[3] = - `SDL_GTicks -(); - -373 if -mdm_cmd_buf -[1] == '+' && mdm_cmd_buf[2] == '+' && mdm_cmd_buf[3] == '+') - -375 if(1000 < ( -mdm_time_buf -[3] - mdm_time_buf[0])) - -377 -esd - = -SDL_TRUE -; - -380 - } -} - -382  -SDL_bo - - $modem_put_by -( -Ut8 - -da -) - -384 if -ced - && ! -esd - ) - -386 if(! - `sock_wre -( -t_sck -, & -da -, 1)) - -388 - `mdm_hgup -(); - -389 - `nd_ -("NO CARRIER"); - -391 - `mdm_es -( -da -); - -395 -mdm__buf -[ -mdm_ -] = -da -; - -396 -mdm_ -++; - -397 if( -mdm_ - = -DATA_BUF_SIZE -) - -399 - `memmove -( -mdm__buf -, mdm__buf+1, -DATA_BUF_SIZE --1); - -400 -mdm_ ---; - -406 if( -da - == 0x08 || data == 0x7f || data == 0x7e) - -408  -mdm_ -) - -413 -mdm_ - = 0; - -416 -mdm_ - -= 2; - -420 if( -da - == 0x0d) - -422 -mdm__buf -[ -mdm_ --1] = 0x00; - -423 - `r_commd -((cڡ *) -mdm__buf -); - -424 -mdm_ - = 0; - -429 if( -mdm_out - < -DATA_BUF_SIZE -) - -430 -mdm_out_buf -[ -mdm_out -++] = -da -; - -433  -SDL_TRUE -; - -434 - } -} - -436 -SDL_bo - - $ac__modem - -ac -*cia ) - -438 -ic - = -ac -->oric; - -440 -mdm_ - = 0; - -441 -mdm_out - = 0; - -443 -mdm__buf -[0] = 0x00; - -444 -mdm_out_buf -[0] = 0x00; - -445 - `memt -( -mdm_cmd_buf -, 0, ( -Ut8 -)* -CMD_BUF_SIZE -); - -446 - `memt -( -mdm_time_buf -, 0, ( -Ut32 -)* -CMD_BUF_SIZE -); - -448 -ac --> -de - = -modem_de -; - -449 -ac --> - - = -modem_ -; - -450 -ac --> -has_by - = -modem_has_by -; - -451 -ac --> -g_by - = -modem_g_by -; - -452 -ac --> -put_by - = -modem_put_by -; - -454 -v_sck - = -1; - -455 -t_sck - = -1; - -457 -ced - = -SDL_FALSE -; - -458 -lig - = -SDL_FALSE -; - -459 -esd - = -SDL_FALSE -; - -461 if( - `sock_ -()) - -463 -ic --> -acbackd - = -ACIA_TYPE_MODEM -; - -464  -SDL_TRUE -; - -468 - `ac__ne - -ac - ); - -469  -SDL_FALSE -; - -470 - } -} - -474  - ~ - -475  - ~ - -476  - ~ - -479 #i -defed -( -__amigaos4__ -|| defed( -__MORPHOS__ -) - -480  - ~ - -481  - ~ - -482  - ~ - -483  - ~ - -484  - #_cvda -( -a -, -b -, -c - - `cv -, b, c, 0) - - ) - -485  - #_osock - -o - - - ) - -486 #i -defed -( -__MORPHOS__ -) - -487  -Libry - * - gSockBa -; - -488  - tsockn_t -; - -489 * - $_ -( -_addr - -n -) - -491  -a -[ "XXX.XXX.XXX.XXX"]; - -492 * -p - = (*)& -n -; - -494 - `tf -( -a -, , "%d.%d.%d.%d", -p -[0]&0xff,[1]&0xff,[2]&0xff,[3]&0xff); - -495  -a -; - -496 - } -} - -500 #i -defed -( -__LINUX__ -|| defed( -__APPLE__ -) - -501  - ~ - -502  - ~ - -503  - ~ - -504  - ~ - -505  - ~ - -506  - #_cvda -( -a -, -b -, -c - - `ad -, b, c) - - ) - -507  - #_osock - -o - - - ) - -510 #ifde -__APPLE__ - - -511  - ~ - -514 #ifde -WIN32 - - -515  - #WIN32_LEAN_AND_MEAN - - - ) - -516  - ~ - -517  - ~ - -518  - #_cvda -( -a -, -b -, -c - - `cv -, b, c, 0) - - ) - -519  - #_osock - -osock - - - ) - -522  -SDL_bo - - gsock_lized - = -SDL_FALSE -; - -524  -SDL_bo - - $sock_ -() - -526 if(! -sock_lized -) - -528 #ifde -WIN32 - - -529 -WSADATA - -wda -; - -530 if( - `WSASup -( - `MAKEWORD -(2,2), & -wda -= -SOCKET_ERROR -) || - -531 ( - `WSASup -( - `MAKEWORD -(1,1), & -wda -= -SOCKET_ERROR -) ) - -532  -SDL_FALSE -; - -534 #ifde -__MORPHOS__ - - -535 if!( -SockBa - = - `OldOnLibry -("bsdsocket.library")) ) - -536  -SDL_FALSE -; - -539 -sock_lized - = -SDL_TRUE -; - -540  -SDL_TRUE -; - -541 - } -} - -543  - $sock_de -() - -545 #ifde -WIN32 - - -546 - `WSAC˪up -(); - -548 #ifde -__MORPHOS__ - - -549 if -SockBa - ) - -550 - `CloLibry -( -SockBa -); - -552 - } -} - -554  - $sock_ -(* -sock -,  -doma -) - -556  - - = 1; - -557 #i - `defed -( -__amigaos4__ -|| defed( -__MORPHOS__ -) - -558 -doma - = -AF_INET -; - -560 i( -doma - == 6) - -561 -doma - = -AF_INET6 -; - -563 -doma - = -AF_INET -; - -565 * -sock - = - `sock -( -doma -, -SOCK_STREAM -, 0); - -566 if(* -sock - == -1) - -569 if( - `tsockt -(* -sock -, -SOL_SOCKET -, -SO_REUSEADDR -, (cڡ *& - -, (on)) == -1) - -571 #ifde -__APPLE__ - - -572 if( - `tsockt -(* -sock -, -SOL_SOCKET -, -SO_REUSEPORT -, (cڡ *& - -, (on)) == -1) - -577 - } -} - -582  - $sock_bd -( -sock -,  -pt -,  -doma -) - -585 #ifde -NO_GETADDRINFO - - -586  -sockaddr_ - -v_addr -; - -587 - `memt -((*)& -v_addr -, 0, (srv_addr)); - -588 -v_addr -. -s_my - = -AF_INET -; - -589 -v_addr -. -s_addr -. -s_addr - = - `htl -( -INADDR_ANY -); - -590 -v_addr -. -s_pt - = - `hts -( -pt -); - -592 if( - `bd -( -sock -, ( -sockaddr -*& -v_addr -, (srv_addr)) == -1) { - -593 - ` -("socket_bind, bindrror: "); - -597  -addrfo - -hts -, * -s -, * -sve -; - -598  -rvi -[ -NI_MAXSERV -]; - -599  -n -; - -601 - `memt -(& -hts -, 0, (hints)); - -602 -hts -. -ai_ags - = -AI_PASSIVE -; - -603 i( -doma - == 6) - -604 -hts -. -ai_my - = -AF_INET6 -; - -606 -hts -. -ai_my - = -AF_INET -; - -607 -hts -. -ai_sockty - = -SOCK_STREAM -; - -609 - `rtf -( -rvi -, "%d", -pt -); - -611 i( -n - = - `gaddrfo -( -NULL -, -rvi -, & -hts -, & -s -)) != 0) { - -612 - `tf -("sock_bd, gaddrfؔr: %s", - `gai_ -( -n -)); - -615 -sve - = -s -; - -619 i( - `bd -( -sock -, -s --> -ai_addr -,es-> -ai_add -) == 0) - -621 }  ( -s - =es-> -ai_xt -! -NULL -); - -623 - `addrfo -( -sve -); - -625 i( -s - = -NULL -) { - -626 - ` -("socket_bind, bindrror: "); - -632 #i - `defed -( -__LINUX__ -|| defed( -__APPLE__ -|| defed( -__amigaos4__ -|| defed( -__MORPHOS__ -) - -633 - `f -( -sock -, -F_SETFL -, f(sock, -F_GETFL -, 0| -O_NONBLOCK -); - -636 #ifde -WIN32 - - -637 -u_lg - -imode - = 1; - -638 - `iolsock -( -sock -, -FIONBIO -, & -imode -); - -641 - } -} - -643  - $sock_li -( -sock -) - -645 if( - `li -( -sock -, 1) == -1) - -649 - } -} - -651  - $sock_ac -( -sock -, * -sck -) - -653 #i - `defed -( -__amigaos4__ -|| defed( -__MORPHOS__ -) - -654  -sockaddr_ - -i_addr -; - -656  -sockaddr_age - -i_addr -; - -658 -sockn_t - -i_addr_n - = ( -i_addr -); - -660 * -sck - = - `ac -( -sock -, ( -sockaddr -*& -i_addr -, ( -sockn_t -*& -i_addr_n -); - -661 if(* -sck - == -1) - -665 #i - `defed -( -__LINUX__ -|| defed( -__amigaos4__ -|| defed( -__MORPHOS__ -) - -666 - `f -(* -sck -, -F_SETFL -, f(*sck, -F_GETFL -, 0| -O_NONBLOCK -); - -669 #i - `defed -( -WIN32 -) - -670 -u_lg - -imode - = 1; - -671 - `iolsock -(* -sck -, -FIONBIO -, & -imode -); - -676 - } -} - -678  - $sock_wre -( -sock -, cڡ * -da -,  -n -) - -680 if( - `nd -( -sock -, (*) -da -, -n -, 0) == -1) - -683 - } -} - -685  - $sock_ad -( -sock -, * -da -, * -n -) - -687  -t - = () - `_cvda -( -sock -, (*) -da -, * -n -); - -688 * -n - = 0; - -689 if(0 = -t -) - -691 if(0 < -t -) - -692 * -n - = -t -; - -694 - } -} - -696 #ifde -NO_GETADDRINFO - - -697  - $home_to_ -(cڡ * -ho -, * - -,  -n -) - -699  -hot - * -he - = - `ghobyme -(*) -ho - ); - -700 if -NULL - ! -he - ) - -702  -_addr - ** -addr_li - = (_add** -he --> -h_addr_li -; - -703 if -NULL - ! -addr_li -[0] ) - -705 - `y -( - -, - `_ -(* -addr_li -[0]), -n -); - -709 - `y -( - -, -ho -, -n -); - -710 - } -} - -713  - $sock_c -( -sock -, cڡ * -ho -,  -pt -,  -doma -) - -715 #ifde -NO_GETADDRINFO - - -716  - -[64]; - -717  -sockaddr_ - -addr -; - -718 -addr -. -s_my - = -AF_INET -; - -719 -addr -. -s_pt - = - `hts -( -pt -); - -721 - `home_to_ -( -ho -, - -, 64); - -722 -addr -. -s_addr -. -s_addr - = - `_addr -((*) - -); - -724 if( - `c -( -sock -, ( -sockaddr -*& -addr -, (addr)) != 0) { - -725 - ` -("socket_connect, connectrror: "); - -729  -addrfo - -hts -, * -s -, * -sve -; - -730  -rvi -[ -NI_MAXSERV -]; - -731  -n -; - -733 - `memt -(& -hts -, 0, (hints)); - -734 i( -doma - == 6) - -735 -hts -. -ai_my - = -AF_INET6 -; - -737 -hts -. -ai_my - = -AF_INET -; - -738 -hts -. -ai_sockty - = -SOCK_STREAM -; - -740 - `rtf -( -rvi -, "%d", -pt -); - -742 i( -n - = - `gaddrfo -( -ho -, -rvi -, & -hts -, & -s -)) != 0) { - -743 - `tf -("sock_c, gaddrfؔr: %s", - `gai_ -( -n -)); - -746 -sve - = -s -; - -750 i( - `c -( -sock -, -s --> -ai_addr -,es-> -ai_add -) == 0) - -752 }  ( -s - =es-> -ai_xt -! -NULL -); - -754 - `addrfo -( -sve -); - -756 i( -s - = -NULL -) { - -757 - ` -("socket_bind, connectrror: "); - -762 #i - `defed -( -__LINUX__ -|| defed( -__APPLE__ -|| defed( -__amigaos4__ -|| defed( -__MORPHOS__ -) - -763 - `f -( -sock -, -F_SETFL -, f(sock, -F_GETFL -, 0| -O_NONBLOCK -); - -766 #ifde -WIN32 - - -767 -u_lg - -imode - = 1; - -768 - `iolsock -( -sock -, -FIONBIO -, & -imode -); - -772 - } -} - -774  - $sock_o -( -sock -) - -776 if( - `_osock -( -sock -) == -1) - -780 - } -} - - @8912.c - -22  - #TONETIME - 8 - - ) - -23  - #NOISETIME - 8 - - ) - -24  - #ENVTIME - 16 - - ) - -26  - ~ - -27  - ~ - -28  - ~ - -30  - ~"syem.h -" - -31  - ~"6502.h -" - -32  - ~"8912.h -" - -33  - ~"v.h -" - -34  - ~"gui.h -" - -35  - ~"disk.h -" - -36  - ~"mڙ.h -" - -37  - ~"6551.h -" - -38  - ~"mache.h -" - -39  - ~"avi.h -" - -41 #ifde -__amigaos4__ - - -42  - ~ - -45 -SDL_AudioSc - - gobed -; - -46 -Ut32 - - gcyeme -; - -48  -SDL_AudioCVT - - gcvt -; - -49  -St16 - - gaudiopbuf -[ -AUDIO_BUFLEN -]; - -50  -avi_hd - * -vidp -; - -52 -St16 - -sounds -; - -53 -SDL_bo - -soundavaab -, -sound -, -wpd -; - -57 * - gkeyqueue - = -NULL -; - -58  - gkeysqueued - = 0, - gkqoffs - = 0; - -61 -St32 - - gvޏb -[] = { 0, 513/4, 828/4, 1239/4, 1923/4, 3238/4, 4926/4, 9110/4, 10344/4, 17876/4, 24682/4, 30442/4, 38844/4, 47270/4, 56402/4, 65535/4}; - -66  - geshe0 -[] = { 15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 128+15 }; - -67  - geshe4 -[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15, 0, 128+16 }; - -68  - geshe8 -[] = { 15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 128+0 }; - -69  - gesheA -[] = { 15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15, 128+0 }; - -70  - gesheB -[] = { 15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 15, 128+16 }; - -71  - gesheC -[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15, 128+0 }; - -72  - gesheD -[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15, 128+15 }; - -73  - gesheE -[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 128+0 }; - -75 * - geshes -[] = { -eshe0 -, - -76 -eshe0 -, - -77 -eshe0 -, - -78 -eshe0 -, - -79 -eshe4 -, - -80 -eshe4 -, - -81 -eshe4 -, - -82 -eshe4 -, - -83 -eshe8 -, - -84 -eshe0 -, - -85 -esheA -, - -86 -esheB -, - -87 -esheC -, - -88 -esheD -, - -89 -esheE -, - -90 -eshe4 - }; - -93  -SDL_COMPAT_KEY - * - gkeyb -; - -97  -SDL_COMPAT_KEY - - gqwkb -[] = { '7' , 'n' , '5' , 'v' , -SDLK_RCTRL - , '1' , 'x' , '3' , - -98 'j' , 't' , 'r' , 'f' , 0 , -SDLK_ESCAPE -, 'q' , 'd' , - -99 'm' , '6' , 'b' , '4' , -SDLK_LCTRL - , 'z' , '2' , 'c' , - -101 -SDLK_SPACE - , ',' , '.' , -SDLK_UP - , -SDLK_LSHIFT -, -SDLK_LEFT - , -SDLK_DOWN - , -SDLK_RIGHT - , - -102 'u' , 'i' , 'o' , 'p' , -SDLK_LALT - , -SDLK_BACKSPACE -, ']' , '[' , - -103 'y' , 'h' , 'g' , 'e' , -SDLK_RALT - , 'a' , 's' , 'w' , - -104 '8' , 'l' , '0' , '/' , -SDLK_RSHIFT -, -SDLK_RETURN -, '`' , -SDLK_EQUALS - }; - -107  -SDL_COMPAT_KEY - - gazkb -[] = { '7' , 'n' , '5' , 'v' , -SDLK_RCTRL - , '1' , 'x' , '3' , - -108 'j' , 't' , 'r' , 'f' , 0 , -SDLK_ESCAPE -, 'a' , 'd' , - -109 'm' , '6' , 'b' , '4' , -SDLK_LCTRL - , 'w' , '2' , 'c' , - -111 -SDLK_SPACE - , ',' , '.' , -SDLK_UP - , -SDLK_LSHIFT -, -SDLK_LEFT - , -SDLK_DOWN - , -SDLK_RIGHT - , - -112 'u' , 'i' , 'o' , 'p' , -SDLK_LALT - , -SDLK_BACKSPACE -, ']' , '[' , - -113 'y' , 'h' , 'g' , 'e' , -SDLK_RALT - , 'q' , 's' , 'z' , - -114 '8' , 'l' , '0' , '/' , -SDLK_RSHIFT -, -SDLK_RETURN -, '`' , -SDLK_EQUALS - }; - -117  -SDL_COMPAT_KEY - - gqzkb -[] = { '7' , 'n' , '5' , 'v' , -SDLK_RCTRL - , '1' , 'x' , '3' , - -118 'j' , 't' , 'r' , 'f' , 0 , -SDLK_ESCAPE -, 'q' , 'd' , - -119 'm' , '6' , 'b' , '4' , -SDLK_LCTRL - , 'y' , '2' , 'c' , - -121 -SDLK_SPACE - , ',' , '.' , -SDLK_UP - , -SDLK_LSHIFT -, -SDLK_LEFT - , -SDLK_DOWN - , -SDLK_RIGHT - , - -122 'u' , 'i' , 'o' , 'p' , -SDLK_LALT - , -SDLK_BACKSPACE -, ']' , '[' , - -123 'z' , 'h' , 'g' , 'e' , -SDLK_RALT - , 'a' , 's' , 'w' , - -124 '8' , 'l' , '0' , '/' , -SDLK_RSHIFT -, -SDLK_RETURN -, '`' , -SDLK_EQUALS - }; - -128  - $queuekeys -* -r - ) - -130 if -r - ) - -132  -n - = () - ` - -r - ); - -133 if -keyqueue - ) - -135 -keyqueue - = - `loc -(keyqueue, - ` -(keyqueue+ -n - + 1); - -136 - `rt -( -keyqueue -, -r -); - -137 -keysqueued - + -n -; - -141 -keyqueue - = - `rdup - -r - ); - -142 -keysqueued - = -n -; - -143 -kqoffs - = 0; - -146 - } -} - -151  -Ut32 - - $aynd - -ay8912 - * -ay - ) - -153 -Ut32 - -rb - = ( -ay --> -dck -&1) ^ ((ay->rndrack>>2)&1); - -154 -ay --> -dck - = (ay->dck>>1)|( -rb -<<16); - -155  -rb -&1; - -156 - } -} - -158  - $ay_audiicktock - -ay8912 - * -ay -, -Ut32 - -cyes - ) - -160 -St32 - -i -; - -161 -St32 - -ouut -; - -164  -cyes - > 0 ) - -167 if(++ -ay --> -n ->ay-> -noir - ) - -170 -ay --> -cunoi - ^ - `aynd -(y ); - -173 -ay --> -n - = 0; - -176 -ay --> -wnoi - = -SDL_TRUE -; - -180  -i -=0; i<3; i++ ) - -182 if! -ay --> -tڕ -[ -i -] ) - -184 if! -ay --> -sign -[ -i -] ) - -186 -ay --> -sign -[ -i -] = 1; - -187 -ay --> -wout - |(1<< -i -); - -193 if(++ -ay --> - -[ -i -]>ay-> -tڕ -[i] ) - -196 -ay --> - -[ -i -] = 0; - -199 -ay --> -sign -[ -i -] ^= 1; - -202 -ay --> -wout - |(1<< -i -); - -207 if -ay --> -wnoi - ) && ( !ay-> -noib -[ -i -] ) ) - -208 -ay --> -wout - |(1<< -i -); - -212 if(++ -ay --> -e ->ay-> -vr - ) - -215 -ay --> -e - = 0; - -218 -ay --> -vpos -++; - -221 if -ay --> -vb -[ay-> -vpos -]&0x80 ) - -222 -ay --> -vpos - =y-> -vb -[ay->envpos]&0x7f; - -225  -i -=0; i<3; i++ ) - -228 if -ay --> -gs -[ -AY_CHA_AMP -+ -i -]&0x10 ) - -231 -ay --> -v -[ -i -] = -vޏb -[ay-> -vb -[ay-> -vpos -]]; - -234 -ay --> -wout - |(1<< -i -); - -240 -cyes ---; - -243 if! -ay --> -wout - ) ; - -246 -ouut - = -sounds -; - -249  -i -=0; i<3; i++ ) - -252 if -ay --> -wout - & (1<< -i -) ) - -253 -ay --> -out -[ -i -] = (y-> -teb -[i]|ay-> -sign -[i])&y-> -noib -[i]|ay-> -cunoi -)*y-> -v -[i]; - -256 -ouut - + -ay --> -out -[ -i -]; - -259 -ay --> -wout - = 0; - -262 if -ouut - > 32767 ) output = 32767; - -264 -ay --> -ouut - = output; - -265 - } -} - -267  - $ay_dowre - -ay8912 - * -ay -,  -aywre - * -aw - ) - -269 -St32 - -i -; - -271  -aw --> -g - ) - -273  -AY_CHA_PER_L -: - -274  -AY_CHA_PER_H -: - -275 -ay --> -gs -[ -aw --> -g -] =w-> -v -; - -276 -ay --> -tڕ -[0] = ((y-> -gs -[ -AY_CHA_PER_H -]&0xf)<<8)|ay->gs[ -AY_CHA_PER_L -]* -TONETIME -; - -279  -AY_CHB_PER_L -: - -280  -AY_CHB_PER_H -: - -281 -ay --> -gs -[ -aw --> -g -] =w-> -v -; - -282 -ay --> -tڕ -[1] = ((y-> -gs -[ -AY_CHB_PER_H -]&0xf)<<8)|ay->gs[ -AY_CHB_PER_L -]* -TONETIME -; - -285  -AY_CHC_PER_L -: - -286  -AY_CHC_PER_H -: - -287 -ay --> -gs -[ -aw --> -g -] =w-> -v -; - -288 -ay --> -tڕ -[2] = ((y-> -gs -[ -AY_CHC_PER_H -]&0xf)<<8)|ay->gs[ -AY_CHC_PER_L -]* -TONETIME -; - -291  -AY_STATUS -: - -292 -ay --> -gs -[ -aw --> -g -] =w-> -v -; - -293 -ay --> -teb -[0] = ( -aw --> -v -&0x01)?1:0; - -294 -ay --> -teb -[1] = ( -aw --> -v -&0x02)?1:0; - -295 -ay --> -teb -[2] = ( -aw --> -v -&0x04)?1:0; - -296 -ay --> -noib -[0] = ( -aw --> -v -&0x08)?1:0; - -297 -ay --> -noib -[1] = ( -aw --> -v -&0x10)?1:0; - -298 -ay --> -noib -[2] = ( -aw --> -v -&0x20)?1:0; - -299 -ay --> -wout - = 7; - -302  -AY_NOISE_PER -: - -303 -ay --> -gs -[ -aw --> -g -] =w-> -v -; - -304 -ay --> -noir - = (ay-> -gs -[ -AY_NOISE_PER -]&0x1f* -NOISETIME -; - -307  -AY_CHA_AMP -: - -308  -AY_CHB_AMP -: - -309  -AY_CHC_AMP -: - -310 -ay --> -gs -[ -aw --> -g -] =w-> -v -; - -311 -i - = -aw --> -g -- -AY_CHA_AMP -; - -312 if( -aw --> -v -&0x10) - -313 -ay --> -v -[ -i -] = -vޏb -[ay-> -vb -[ay-> -vpos -]]; - -315 -ay --> -v -[ -i -] = -vޏb -[ -aw --> -v -&0xf]; - -316 -ay --> -wout - |(1<< -i -); - -319  -AY_ENV_PER_L -: - -320  -AY_ENV_PER_H -: - -321 -ay --> -gs -[ -aw --> -g -] =w-> -v -; - -322 -ay --> -vr - = (y-> -gs -[ -AY_ENV_PER_H -]<<8)|ay->gs[ -AY_ENV_PER_L -])* -ENVTIME -; - -325  -AY_ENV_CYCLE -: - -326 if -aw --> -v - != 0xff ) - -328 -ay --> -gs -[ -aw --> -g -] =w-> -v -; - -329 -ay --> -vb - = -eshes -[ -aw --> -v -&0xf]; - -330 -ay --> -vpos - = 0; - -331  -i -=0; i<3; i++ ) - -333 if -ay --> -gs -[ -AY_CHA_AMP -+ -i -]&0x10 ) - -335 -ay --> -v -[ -i -] = -vޏb -[ay-> -vb -[ay-> -vpos -]]; - -336 -ay --> -wout - |(1<< -i -); - -342 - } -} - -344  - $ay_ushlog - -ay8912 - * -ay - ) - -346  -i -; - -348  -i -=0; i< -ay --> -logged -; i++) - -349 - `ay_dowre - -ay -, &ay-> -wrog -[ -i -] ); - -350 -ay --> -logged - = 0; - -351 - } -} - -357  - $ay_back -* -dummy -, -St8 - * -am -,  -ngth - ) - -359 -Ut16 - * -out -; - -360 -St16 - -fout -; - -361 -St32 - -i -, -j -, -logc -, -ogc -; - -362  -ay8912 - * -ay - = (ay8912 *) -dummy -; - -363 -St32 - -ddjuave -, -ddjumax -; - -364 -SDL_bo - -noi -; - -365  -au_ngth -; - -367 -logc - = 0; - -368 -ogc - = 0; - -369 -ddjuave - = 0; - -370 -ddjumax - = -sounds -; - -372 -noi - = -ay --> -ic -->noi && ((!ay->ic-> -turbo -)||y->ic-> -w -)); - -373 if! -noi - ) -ay --> -out - = 0; - -375 -out - = ( -Ut16 - *) -am -; - -376 -cvt -. -buf - = ( -Ut8 - *) -am -; - -378 -au_ngth - = -ngth -/(2*( -Ut16 -)); - -379 -au_ngth - = (au_ngth < -AUDIO_BUFLEN -)?ctual_length : AUDIO_BUFLEN; - -380 -au_ngth - = (au_ngth < -obed -. -mes -)?ctual_length : obtained.samples; - -382  -i -=0, -j -=0; i< -au_ngth -; i++ ) - -384 -ay --> -ccyc - =y-> -ccye ->> -FPBITS -; - -386  ( -logc - < -ay --> -logged - ) && (y-> -ccyc - >ay-> -wrog -[logc]. -cye - ) ) - -387 - `ay_dowre - -ay -, &ay-> -wrog -[ -logc -++] ); - -389 if -noi - ) - -391  ( -ogc - < -ay --> -ogged - ) && (y-> -ccyc - >ay-> -log -[ogc]. -cye - ) ) - -392 -ay --> -out - =y-> -log -[ -ogc -++]. -v - * 8192; - -395 if -ay --> -ccyc - >y-> -ϡcyc - ) - -397 - `ay_audiicktock - -ay -,y-> -ccyc --ay-> -ϡcyc - ); - -398 -ay --> -ϡcyc - =y-> -ccyc -; - -401 -fout - = -ay --> -ouut - +y-> -out -; - -402 -out -[ -j -++] = -fout -; - -403 -out -[ -j -++] = -fout -; - -404 if -vidp - ) -audiopbuf -[ -i -] = -fout -; - -406 if -fout - > -ddjumax - ) dcadjustmax = fout; - -407 -ddjuave - + -fout -; - -409 -ay --> -ccye - + -cyeme -; - -412 -ddjuave - /( -ngth -/4); - -414 if( -ddjumax -- -ddjuave -) > 32767 ) - -415 -ddjuave - = -(32767- -ddjumax -); - -417 if -ddjuave - ) - -419  -i -=0, -j -=0; i< -au_ngth -; i++ ) - -421 -out -[ -j -++] - -ddjuave -; - -422 -out -[ -j -++] - -ddjuave -; - -423 if -vidp - ) -audiopbuf -[ -i -] - -ddjuave -; - -427 if -vidp - ) - -429 #i -SDL_BYTEORDER - = -SDL_BIG_ENDIAN - - -430  -i -=0; i<( -ngth -/4); i++ ) - -431 -audiopbuf -[ -i -] = - `SDL_Sw16 -(udiocapbuf[i] ); - -433 - `avi_addaudio -& -vidp -, -audiopbuf -, -ngth -/2 ); - -436 i( -ay --> -logged - > -logc -) - -438 - `memmove -(& -ay --> -wrog -[0], &ay->wrog[ -logc -], (ay-> -logged --logc) * (ay->writelog[0])); - -439 -ay --> -logged - - -logc -; - -440  -i -=0; i< -ay --> -logged -; i++) - -441 -ay --> -wrog -[ -i -]. -cye - -ay-> -ϡcyc -; - -444 i( -ay --> -logged - > 150) - -445 - `ay_ushlog - -ay - ); - -449 -ay --> -logged - = 0; - -452 if -noi - ) - -454  -ogc - < -ay --> -ogged - ) - -455 -ay --> -out - =y-> -log -[ -ogc -++]. -v - * 8192; - -458 - `SDL_CvtAudio -(& -cvt -); - -460 -ay --> -ccye - -y-> -ϡcyc -<< -FPBITS -); - -461 -ay --> -ϡcyc - = 0; - -462 -ay --> -wlogcye - =y-> -ccye ->> -FPBITS -; - -463 -ay --> -do_logcye_t - = -SDL_TRUE -; - -465 -ay --> -ogged - = 0; - -466 - } -} - -472  - $ay_ticktock - -ay8912 - * -ay -,  -cyes - ) - -475 if -keyqueue - ) && ( -keysqueued - ) && (! -ay --> -ic --> -u -. -q -) ) - -477 if -kqoffs - > -keysqueued - ) - -479 - ` -( -keyqueue -); - -480 -keyqueue - = -NULL -; - -481 -keysqueued - = 0; - -482 -kqoffs - = 0; - -484  -ay --> -ic --> -ty - ) - -486  -MACH_ATMOS -: - -487  -MACH_PRAVETZ -: - -488 if -ay --> -ic --> -u -. -pc - =0xeb78 ) && (y->ic-> -rom - ) ) - -490 -ay --> -ic --> -u -. -a - = -keyqueue -[ -kqoffs -++]; - -491 -ay --> -ic --> -u -. - `wre -( &ay->oric->cpu, 0x2df, 0 ); - -492 -ay --> -ic --> -u -. -f_n - = 1; - -493 -ay --> -ic --> -u -. -lc - = 0xeb88; - -494 -ay --> -ic --> -u -. -lc - =y->ic->u. - `ad -&ay->ic->u,y->ic->u. -lc - ); - -498  -MACH_ORIC1 -: - -499  -MACH_ORIC1_16K -: - -500 if -ay --> -ic --> -u -. -pc - =0xe905 ) && (y->ic-> -rom - ) ) - -502 -ay --> -ic --> -u -. -a - = -keyqueue -[ -kqoffs -++]; - -503 -ay --> -ic --> -u -. - `wre -( &ay->oric->cpu, 0x2df, 0 ); - -504 -ay --> -ic --> -u -. -f_n - = 1; - -505 -ay --> -ic --> -u -. -lc - = 0xe915; - -506 -ay --> -ic --> -u -. -lc - =y->ic->u. - `ad -&ay->ic->u,y->ic->u. -lc - ); - -514 if -ay --> -ic --> -auto_jasm_t - ) - -516 i( -ay --> -ic --> -drivy - = -DRV_JASMIN -) - -518  -ay --> -ic --> -ty - ) - -520  -MACH_ATMOS -: - -521  -MACH_PRAVETZ -: - -522 if -ay --> -ic --> -u -. -pc - =0xeb78 ) && (y->ic-> -rom - ) ) - -524 -ay --> -ic --> -u -. - `wre -( &ay->oric->cpu, 0x3fb, 1 ); - -525 - `om - -ay --> -ic - ); - -526 - `m6502_t -& -ay --> -ic --> -u - ); - -527 - `m6502_t_icyes -& -ay --> -ic --> -u -, -SDL_FALSE -, -NULL - ); - -528 - `v_ -& -ay --> -ic --> -v -,y->ic, -VIA_MAIN - ); - -529 -ay --> -ic --> -auto_jasm_t - = -SDL_FALSE -; - -533  -MACH_ORIC1 -: - -534  -MACH_ORIC1_16K -: - -535 if -ay --> -ic --> -u -. -pc - =0xe905 ) && (y->ic-> -rom - ) ) - -537 -ay --> -ic --> -u -. - `wre -( &ay->oric->cpu, 0x3fb, 1 ); - -538 - `om - -ay --> -ic - ); - -539 - `m6502_t -& -ay --> -ic --> -u - ); - -540 - `m6502_t_icyes -& -ay --> -ic --> -u -, -SDL_FALSE -, -NULL - ); - -541 - `v_ -& -ay --> -ic --> -v -,y->ic, -VIA_MAIN - ); - -542 -ay --> -ic --> -auto_jasm_t - = -SDL_FALSE -; - -549 -ay --> -ic --> -auto_jasm_t - = -SDL_FALSE -; - -553 if -ay --> -keybday - > 0 ) - -555 if -cyes - > -ay --> -keybday - ) - -557 -ay --> -keybday - = 0; - -558 - `ay_upde_keybs - -ay - ); - -560 -ay --> -keybday - - -cyes -; - -564 if -ay --> -do_logcye_t - ) - -566 -ay --> -logcye - =y-> -wlogcye -; - -567 -ay --> -do_logcye_t - = -SDL_FALSE -; - -569 -ay --> -logcye - + -cyes -; - -570 - } -} - -572  - $ay_lockaudio - -ay8912 - * -ay - ) - -574 if -ay --> -audiocked - ) ; - -575 if -ay --> -ic --> -emu_mode - ! -EM_RUNNING - ) || ( ! -sound - ) || ( -wpd - ) ) ; - -576 - `SDL_LockAudio -(); - -577 -ay --> -audiocked - = -SDL_TRUE -; - -578 - } -} - -580  - $ay_uockaudio - -ay8912 - * -ay - ) - -582 if! -ay --> -audiocked - ) ; - -583 - `SDL_UockAudio -(); - -584 -ay --> -audiocked - = -SDL_FALSE -; - -585 - } -} - -591 -SDL_bo - - $ay_ - -ay8912 - * -ay -,  -mache - * -ic - ) - -593  -i -; - -595  -ic --> -keym - ) - -597  -KMAP_AZERTY -: -keyb - = -azkb -; ; - -598  -KMAP_QWERTZ -: -keyb - = -qzkb -; ; - -599 : -keyb - = -qwkb -; ; - -603  -i -=0; i<8; i++ ) - -604 -ay --> -keyes -[ -i -] = -SDL_FALSE -; - -607  -i -=0; i< -NUM_AY_REGS -; i++ ) - -608 -ay --> -gs -[ -i -] = 0; - -611  -i -=0; i<3; i++ ) - -613 -ay --> - -[ -i -] = 0; - -614 -ay --> -out -[ -i -] = 0; - -615 -ay --> -sign -[ -i -] = 0; - -616 -ay --> -teb -[ -i -] = 1; - -617 -ay --> -noib -[ -i -] = 1; - -618 -ay --> -v -[ -i -] = 0; - -620 -ay --> -wout - = 7; - -621 -ay --> -wnoi - = -SDL_TRUE -; - -622 -ay --> -n - = 0; - -623 -ay --> -e - = 0; - -625 -ay --> -vb - = -eshe0 -; - -626 -ay --> -vpos - = 0; - -628 -ay --> -bmode - = 0; - -629 -ay --> -eg - = 0; - -630 -ay --> -ic - = oric; - -631 -ay --> -sound - = -soundavaab - && sound && (! -wpd -); - -632 -ay --> -cunoi - = 0; - -633 -ay --> -dck - = 1; - -634 -ay --> -logged - = 0; - -635 -ay --> -logcye - = 0; - -636 -ay --> -do_logcye_t - = -SDL_FALSE -; - -637 -ay --> -ouut - = -sounds -; - -638 -ay --> -ϡcyc - = 0; - -639 -ay --> -ccyc - = 0; - -640 -ay --> -ccye - = 0; - -641 -ay --> -ogged - = 0; - -642 -ay --> -out - = 0; - -643 -ay --> -keybday - = 0; - -644 -ay --> -audiocked - = -SDL_FALSE -; - -645 if -soundavaab - ) - -646 - `SDL_PauAudio -( 0 ); - -649 - `SDL_BudAudioCVT -(& -cvt -, -AUDIO_S16SYS -, 2, -AUDIO_FREQ -, -obed -. -fm -, obed. -chls -, obed. -eq -); - -650 -cvt -. -n - = -obed -. -mes - * ( -St16 -* obed. -chls -; - -653  -SDL_TRUE -; - -654 - } -} - -659  - $ay_upde_keybs - -ay8912 - * -ay - ) - -661 -ay --> -cukeyoffs - =y-> -ic --> -v -. - `ad_pt_b -( &ay->oric->via ) & 0x7; - -663 if( -ay --> -egs -[ -AY_STATUS -]&0x40) == 0 ) - -665 -ay --> -ic --> -v -. - `wre_pt_b -( &ay->oric->via, 0x08, 0x00 ); - -669 if -ay --> -keyes -[ay-> -cukeyoffs -] & (ay-> -egs -[ -AY_PORT_A -]^0xff) ) - -670 -ay --> -ic --> -v -. - `wre_pt_b -( &ay->oric->via, 0x08, 0x08 ); - -672 -ay --> -ic --> -v -. - `wre_pt_b -( &ay->oric->via, 0x08, 0x00 ); - -673 - } -} - -678  - $ay_keyess - -ay8912 - * -ay -, -SDL_COMPAT_KEY - -key -, -SDL_bo - -down - ) - -680  -i -; - -683 if -key - == 0 ) ; - -686  -i -=0; i<64; i++ ) - -687 if -keyb -[ -i -] = -key - ) ; - -690 if -i - == 64 ) ; - -693 if -down - ) - -694 -ay --> -keyes -[ -i ->>3] |= (1<<(i&7)); - -696 -ay --> -keyes -[ -i ->>3] &= ~(1<<(i&7)); - -699 if -ay --> -cukeyoffs - =( -i ->>3) ) - -701 if -ay --> -keyes -[ay-> -cukeyoffs -] & (ay-> -egs -[ -AY_PORT_A -]^0xff) ) - -702 -ay --> -ic --> -v -. - `wre_pt_b -( &ay->oric->via, 0x08, 0x08 ); - -704 -ay --> -ic --> -v -. - `wre_pt_b -( &ay->oric->via, 0x08, 0x00 ); - -706 - } -} - -711  - $ay_modet - -ay8912 - * -ay - ) - -713  -v -, -ϡs6 -=0; - -715 if( -ay --> -bmode - ! -AYBMF_BC1 -&& (ay-> -ic --> -p܏_ay - != 0xff) ) - -717 -ay --> -ic --> -p܏_ay - = 0xff; - -718 if -ay --> -ic --> -p܏_is_ay - ) - -719 -ay --> -ic --> -v -. - `wre_pt_a -( &ay->oric->via, 0xff, 0xff ); - -722  -ay --> -bmode - ) - -724  -AYBMF_BC1 -: - -725 -ay --> -ic --> -p܏_ay - = (ay-> -eg ->= -NUM_AY_REGS -? 0 :y-> -egs -[ay->creg]; - -726 -ay --> -ic --> -v -. - `wre_pt_a -&ay->ic->v, 0xff,y->ic-> -p܏_ay - ); - -727 -ay --> -ic --> -p܏_is_ay - = -SDL_TRUE -; - -730  -AYBMF_BDIR -: - -731 if -ay --> -eg - > -NUM_AY_REGS - ) ; - -732 -v - = -ay --> -ic --> -v -. - `ad_pt_a -( &ay->oric->via ); - -734 if -ay --> -eg - = -AY_STATUS - ) - -735 -ϡs6 - = -ay --> -egs -[ -AY_STATUS -] & 0x40; - -737 if -ay --> -eg - ! -AY_ENV_CYCLE - ) || ( -v - != 0xff ) ) - -738 -ay --> -egs -[ay-> -eg -] = -v -; - -740  -ay --> -eg - ) - -742  -AY_STATUS -: - -743 if( -ay --> -egs -[ -AY_STATUS -]&0x40! -ϡs6 - ) - -745 -ay --> -keybday - = 3; - -747  -AY_CHA_PER_L -: - -748  -AY_CHA_PER_H -: - -749  -AY_CHB_PER_L -: - -750  -AY_CHB_PER_H -: - -751  -AY_CHC_PER_L -: - -752  -AY_CHC_PER_H -: - -753  -AY_NOISE_PER -: - -754  -AY_CHA_AMP -: - -755  -AY_CHB_AMP -: - -756  -AY_CHC_AMP -: - -757  -AY_ENV_PER_L -: - -758  -AY_ENV_PER_H -: - -759  -AY_ENV_CYCLE -: - -760 if! -sound - ) || ( -wpd - ) ) - -762  -aywre - -wrow -; - -764 - `ay_ushlog - -ay - ); - -765 -wrow -. -cye - = 0; - -766 -wrow -. -g - = -ay --> -eg -; - -767 -wrow -. -v - = -v -; - -768 - `ay_dowre - -ay -, & -wrow - ); - -772 - `ay_lockaudio - -ay - ); - -774 if -ay --> -do_logcye_t - ) - -776 -ay --> -logcye - =y-> -wlogcye -; - -777 -ay --> -do_logcye_t - = -SDL_FALSE -; - -780 if -ay --> -logged - > -WRITELOG_SIZE - ) - -781 - `ay_ushlog - -ay - ); - -783 -ay --> -wrog -[ay-> -logged - ]. -cye - =y-> -logcye -; - -784 -ay --> -wrog -[ay-> -logged - ]. -g - =y-> -eg -; - -785 -ay --> -wrog -[ay-> -logged -++]. -v - = -v -; - -788  -AY_PORT_A -: - -789 -ay --> -keybday - = 3; - -794  -AYBMF_BDIR -| -AYBMF_BC1 -: - -795 -ay --> -eg - =y-> -ic --> -v -. - `ad_pt_a -( &ay->oric->via ); - -798 - } -} - -800  - $ay_t_bcmode - -ay8912 - * -ay -,  -bc1 -,  -bd - ) - -802 -ay --> -bmode - = ( -bc1 -? -AYBMF_BC1 -:0)|( -bd -? -AYBMF_BDIR -:0); - -803 - `ay_modet - -ay - ); - -804 - } -} - -806  - $ay_t_bc1 - -ay8912 - * -ay -,  -e - ) - -808 if -e - ) - -809 -ay --> -bmode - | -AYBMF_BC1 -; - -811 -ay --> -bmode - &~ -AYBMF_BC1 -; - -812 - `ay_modet - -ay - ); - -813 - } -} - -815  - $ay_t_bd - -ay8912 - * -ay -,  -e - ) - -817 if -e - ) - -818 -ay --> -bmode - | -AYBMF_BDIR -; - -820 -ay --> -bmode - &~ -AYBMF_BDIR -; - -821 - `ay_modet - -ay - ); - -822 - } -} - - @8912.h - -24  - #FPBITS - 10 - - ) - -27 #ide -AUDIO_BUFLEN - - -28  - #AUDIO_BUFLEN - 2048 - - ) - -31  - #WRITELOG_SIZE - ( -AUDIO_BUFLEN -*12) - - ) - -32  - #TAPELOG_SIZE - ( -AUDIO_BUFLEN -) - - ) - -34  - #CYCLESPERSECOND - (312*64*50) - - ) - -39  - #AYBMB_BC1 - 0 - - ) - -40  - #AYBMF_BC1 - (1<< -AYBMB_BC1 -) - - ) - -41  - #AYBMB_BDIR - 1 - - ) - -42  - #AYBMF_BDIR - (1<< -AYBMB_BDIR -) - - ) - -47 - mAY_CHA_PER_L - = 0, - -48 - mAY_CHA_PER_H -, - -49 - mAY_CHB_PER_L -, - -50 - mAY_CHB_PER_H -, - -51 - mAY_CHC_PER_L -, - -52 - mAY_CHC_PER_H -, - -53 - mAY_NOISE_PER -, - -54 - mAY_STATUS -, - -55 - mAY_CHA_AMP -, - -56 - mAY_CHB_AMP -, - -57 - mAY_CHC_AMP -, - -58 - mAY_ENV_PER_L -, - -59 - mAY_ENV_PER_H -, - -60 - mAY_ENV_CYCLE -, - -61 - mAY_PORT_A -, - -62 - mNUM_AY_REGS - - -65  - saywre - - -67 -Ut32 - - mcye -; - -68 -Ut8 - - mg -; - -69 -Ut8 - - mv -; - -72  - schge - - -74 -Ut32 - - mcye -; - -75 -Ut8 - - mv -; - -78  - say8912 - - -80 -Ut8 - - mbmode -, - meg -; - -81 -Ut8 - - mgs -[ -NUM_AY_REGS -], - megs -[NUM_AY_REGS]; - -82 -SDL_bo - - mkeyes -[8], - mwnoi -; - -83 -SDL_bo - - msound -; - -84 -SDL_bo - - mnoi -; - -85 -Ut32 - - mtڕ -[3], - mnoir -, - mvr -; - -86 -Ut16 - - mteb -[3], - mnoib -[3], - mv -[3], - mwout -; - -87 -St32 - - m -[3], - mn -, - me -; - -88 -Ut32 - - mtڕos -[3], - mte -[3]; - -89 -St32 - - msign -[3], - mout -[3], - mvpos -; - -90 * - mvb -; - -91  -mache - * - mic -; - -92 -Ut32 - - mcunoi -, - mdck -; - -93 -St16 - - mouut -; - -94 -St16 - - mout -; - -95 -Ut32 - - mccye -, - mϡcyc -, - mccyc -; - -96 -Ut32 - - mkeybday -, - mcukeyoffs -; - -98 -SDL_bo - - maudiocked -; - -99 -SDL_bo - - mdo_logcye_t -; - -100 -St32 - - mlogged -, - mogged -; - -101 -Ut32 - - mlogcye -, - mwlogcye -; - -102  -aywre - - mwrog -[ -WRITELOG_SIZE -]; - -103  -chge - - mlog -[ -TAPELOG_SIZE -]; - -106  -queuekeys -* -r - ); - -108 -SDL_bo - -ay_ - -ay8912 - * -ay -,  -mache - * -ic - ); - -109  -ay_back -* -dummy -, -St8 - * -am -,  -ngth - ); - -110  -ay_ticktock - -ay8912 - * -ay -,  -cyes - ); - -111  -ay_upde_keybs - -ay8912 - * -ay - ); - -112  -ay_keyess - -ay8912 - * -ay -, -SDL_COMPAT_KEY - -key -, -SDL_bo - -down - ); - -114  -ay_t_bc1 - -ay8912 - * -ay -,  -e - ); - -115  -ay_t_bd - -ay8912 - * -ay -,  -e - ); - -116  -ay_t_bcmode - -ay8912 - * -ay -,  -bc1 -,  -bd - ); - -117  -ay_modet - -ay8912 - * -ay - ); - -119  -ay_lockaudio - -ay8912 - * -ay - ); - -120  -ay_uockaudio - -ay8912 - * -ay - ); - -121  -ay_ushlog - -ay8912 - * -ay - ); - - @XCode/Oricutron/Oricutron/SDLMain.h - -8 #ide -_SDLMa_h_ - - -9  - #_SDLMa_h_ - - - ) - -11 #imp܈< -Coc -/Coc. -h -> - -13 @ -r - - gSDLMa - : -NSObje - - -14 @ -d - - - @avi.c - -23  - ~ - -24  - ~ - -25  - ~ - -26  - ~ - -28  - ~"syem.h -" - -29  - ~"avi.h -" - -32 -SDL_AudioSc - -obed -; - -35  -SDL_bo - - $wre32l - -SDL_bo - -lok -,  -avi_hd - * -ah -, -Ut32 - -v -, Ut32 * -m - ) - -37 if! -lok - )  -SDL_FALSE -; - -38 if -m - ) (*m -ah --> -csize -; - -39 -ah --> -csize - += 4; - -40 - `_MAKE_LE32 -( -v -); - -41  ( - `fwre -& -v -, 4, 1, -ah --> -f - ) == 1); - -42 - } -} - -45  -SDL_bo - - $wre16l - -SDL_bo - -lok -,  -avi_hd - * -ah -, -Ut16 - -v -, -Ut32 - * -m - ) - -47 if! -lok - )  -SDL_FALSE -; - -48 if -m - ) (*m -ah --> -csize -; - -49 -ah --> -csize - += 2; - -50 - `_MAKE_LE16 -( -v -); - -51  ( - `fwre -& -v -, 2, 1, -ah --> -f - ) == 1); - -52 - } -} - -56  -SDL_bo - - $wrer - -SDL_bo - -lok -,  -avi_hd - * -ah -, * -r -, -Ut32 - * -m - ) - -58 -St32 - -i - = () - ` - -r - ); - -59 if! -lok - )  -SDL_FALSE -; - -60 if -m - ) (*m -ah --> -csize -; - -61 -ah --> -csize - + -i -; - -62  ( - `fwre - -r -, -i -, 1, -ah --> -f - ) == 1); - -63 - } -} - -66  -SDL_bo - - $ek_wre32l - -SDL_bo - -lok -,  -avi_hd - * -ah -, -Ut32 - -offs -, Ut32 -v - ) - -68 if! -lok - )  -SDL_FALSE -; - -69 if -offs - =0 )  -SDL_TRUE -; - -70 - `fek - -ah --> -f -, -offs -, -SEEK_SET - ); - -71 - `_MAKE_LE32 -( -v -); - -72  ( - `fwre -& -v -, 4, 1, -ah --> -f - ) == 1); - -73 - } -} - -76  -SDL_bo - - $wreblk - -SDL_bo - -lok -,  -avi_hd - * -ah -, -Ut8 - * -blk -, -Ut32 - -blkn - ) - -78 if! -lok - )  -SDL_FALSE -; - -79 -ah --> -csize - + -blkn -; - -80  ( - `fwre - -blk -, -blkn -, 1, -ah --> -f - ) == 1); - -81 - } -} - -84  -SDL_bo - - $wrebyt - -SDL_bo - -lok -,  -avi_hd - * -ah -, -Ut8 - -v - ) - -86 if! -lok - )  -SDL_FALSE -; - -87 -ah --> -csize - += 1; - -88  ( - `fwre -& -v -, 1, 1, -ah --> -f - ) == 1); - -89 - } -} - -91  - #AVIFLAGS - ( -AVIF_ISINTERLEAVED -| -AVIF_WASCAPTUREFILE -) - - ) - -92  -avi_hd - * - $avi_ݒ -* -fame -, -Ut8 - * -l -, -SDL_bo - -dosound -,  -is50hz - ) - -94  -avi_hd - * -ah -; - -95 -SDL_bo - -ok -; - -96 -St32 - -i -; - -98 -ah - = - `mloc - -avi_hd - ) ); - -99 if! -ah - )  -NULL -; - -101 - `memt - -ah -, 0,  -avi_hd - ) ); - -103 -ah --> -f - = - `fݒ - -fame -, "wb" ); - -104 if! -ah --> -f - ) - -106 - ` - -ah - ); - -107  -NULL -; - -110 -ah --> -dod - = -dosound -; - -111 -ah --> -csize - = 0; - -112 -ah --> -is50hz - = is50hz; - -114 -ok - = -SDL_TRUE -; - -115 -ok - & - `wrer -ok, -ah -, "RIFF" , -NULL - ); - -116 -ok - & - `wre32l -ok, -ah -, 0, &ah-> -offs_riffsize - ); - -117 -ok - & - `wrer -ok, -ah -, "AVI " , -NULL - ); - -118 -ok - & - `wrer -ok, -ah -, "LIST" , -NULL - ); - -119 -ok - & - `wre32l -ok, -ah -, 0, &ah-> -offs_hdsize - ); - -120 -ok - & - `wrer -ok, -ah -, "hd" , -NULL - ); - -122 -ok - & - `wrer -ok, -ah -, "avih" , -NULL - ); - -123 -ok - & - `wre32l -ok, -ah -, 56, -NULL - ); - -124 -ok - & - `wre32l -ok, -ah -, -is50hz -?20000:16667,&ah-> -offs_um -); - -125 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -126 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -127 -ok - & - `wre32l -ok, -ah -, -AVIFLAGS -, -NULL - ); - -128 -ok - & - `wre32l -ok, -ah -, 0, &ah-> -offs_ames - ); - -129 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -130 -ok - & - `wre32l -ok, -ah -,h-> -dod -?2:1, -NULL - ); - -131 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -132 -ok - & - `wre32l -ok, -ah -, 240, -NULL - ); - -133 -ok - & - `wre32l -ok, -ah -, 224, -NULL - ); - -134 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -135 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -136 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -137 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -139 -ok - & - `wrer -ok, -ah -, "LIST" , -NULL - ); - -140 -ok - & - `wre32l -ok, -ah -,4+8+56+8+40+8*4, -NULL - ); - -141 -ok - & - `wrer -ok, -ah -, "" , -NULL - ); - -143 -ok - & - `wrer -ok, -ah -, "rh" , -NULL - ); - -144 -ok - & - `wre32l -ok, -ah -, 56, -NULL - ); - -145 -ok - & - `wrer -ok, -ah -, "vids" , -NULL - ); - -146 -ok - & - `wrer -ok, -ah -, "MRLE" , -NULL - ); - -147 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -148 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -149 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -150 -ok - & - `wre32l -ok, -ah -, 1000000, -NULL - ); - -151 -ok - & - `wre32l -ok, -ah -, -is50hz -?50000000:60000000,&ah-> -offs_m -); - -152 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -153 -ok - & - `wre32l -ok, -ah -, 0, &ah-> -offs_ames2 - ); - -154 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -155 -ok - & - `wre32l -ok, -ah -, 10000, -NULL - ); - -156 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -157 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -158 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -160 -ok - & - `wrer -ok, -ah -, "rf" , -NULL - ); - -161 -ok - & - `wre32l -ok, -ah -, 40+8*4, -NULL - ); - -162 -ok - & - `wre32l -ok, -ah -, 40, -NULL - ); - -163 -ok - & - `wre32l -ok, -ah -, 240, -NULL - ); - -164 -ok - & - `wre32l -ok, -ah -, 224, -NULL - ); - -165 -ok - & - `wre16l -ok, -ah -, 1, -NULL - ); - -166 -ok - & - `wre16l -ok, -ah -, 8, -NULL - ); - -167 -ok - & - `wre32l -ok, -ah -, 1, -NULL - ); - -168 -ok - & - `wre32l -ok, -ah -, 240*244, -NULL - ); - -169 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -170 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -171 -ok - & - `wre32l -ok, -ah -, 8, -NULL - ); - -172 -ok - & - `wre32l -ok, -ah -, 8, -NULL - ); - -174  -i -=0; i<8; i++ ) - -176 -ok - & - `wrebyt -ok, -ah -, -l -[ -i -*3+2] ); - -177 -ok - & - `wrebyt -ok, -ah -, -l -[ -i -*3+1] ); - -178 -ok - & - `wrebyt -ok, -ah -, -l -[ -i -*3+0] ); - -179 -ok - & - `wrebyt -ok, -ah -, 0 ); - -182 if -ah --> -dod - ) - -184 -ok - & - `wrer -ok, -ah -, "LIST" , -NULL - ); - -185 -ok - & - `wre32l -ok, -ah -, 4+8+56+8+16, -NULL - ); - -186 -ok - & - `wrer -ok, -ah -, "" , -NULL - ); - -188 -ok - & - `wrer -ok, -ah -, "rh" , -NULL - ); - -189 -ok - & - `wre32l -ok, -ah -, 56, -NULL - ); - -190 -ok - & - `wrer -ok, -ah -, "auds" , -NULL - ); - -191 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -192 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -193 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -194 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -195 -ok - & - `wre32l -ok, -ah -, 1, -NULL - ); - -196 -ok - & - `wre32l -ok, -ah -, -obed -. -eq -, -NULL - ); - -197 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -198 -ok - & - `wre32l -ok, -ah -, 0, &ah-> -offs_audiޒ - ); - -199 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -200 -ok - & - `wre32l -ok, -ah -, 10000, -NULL - ); - -201 -ok - & - `wre32l -ok, -ah -, 2, -NULL - ); - -202 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -203 -ok - & - `wre32l -ok, -ah -, 0, -NULL - ); - -205 -ok - & - `wrer -ok, -ah -, "rf" , -NULL - ); - -206 -ok - & - `wre32l -ok, -ah -, 16, -NULL - ); - -207 -ok - & - `wre16l -ok, -ah -, 1, -NULL - ); - -208 -ok - & - `wre16l -ok, -ah -, 1, -NULL - ); - -209 -ok - & - `wre32l -ok, -ah -, -obed -. -eq -, -NULL - ); - -210 -ok - & - `wre32l -ok, -ah -, -obed -. -eq -*2, -NULL - ); - -211 -ok - & - `wre16l -ok, -ah -, 2, -NULL - ); - -212 -ok - & - `wre16l -ok, -ah -, 16, -NULL - ); - -215 -ah --> -hdsize - =h-> -csize - -h-> -offs_hdsize - - 4; - -217 -ok - & - `wrer -ok, -ah -, "LIST" , -NULL - ); - -218 -ok - & - `wre32l -ok, -ah -, 0, &ah-> -offs_movisize - ); - -219 -ok - & - `wrer -ok, -ah -, "movi" , -NULL - ); - -221 if! -ok - ) - -223 - ` - -ah - ); - -224  -NULL -; - -227 -ah --> -ames - = 0; - -228 -ah --> -amdju - = 0; - -229 -ah --> -audiޒ - = 0; - -230 -ah --> -movisize - = 0; - -231 -ah --> -ϡamevid - = -SDL_FALSE -; - -232 -ah --> -time_t - = 0; - -234  -ah -; - -235 - } -} - -237  -Ut32 - - $e_puixs - -avi_hd - * -ah -, -Ut8 - * -cda -, -Ut32 - -ec -, Ut32 -cc -, Ut32 -ngth - ) - -239 -Ut32 - -c -, -chunk -; - -241 if -ngth - =0 )  -ec -; - -243  -ngth - > 254 ) - -246 -chunk - = ( -ngth -<258) ? 250 : 254; - -247 -ec - = - `e_puixs - -ah -, -cda -,c, -cc -, -chunk - ); - -248 -cc - + -chunk -; - -249 -ngth - - -chunk -; - -253 if -ngth - < 3 ) - -255  -ngth - > 0 ) - -257 -ah --> -eda -[ -ec -++] = 0x01; - -258 -ah --> -eda -[ -ec -++] = -cda -[ -cc -++]; - -259 -ngth ---; - -261  -ec -; - -264 -c - = -ngth -; - -266 -ah --> -eda -[ -ec -++] = 0x00; - -267 -ah --> -eda -[ -ec -++] = -ngth -; - -268  -c - > 0 ) - -270 -ah --> -eda -[ -ec -++] = -cda -[ -cc -++]; - -271 -c ---; - -274 if -ngth - & 1 ) - -275 -ah --> -eda -[ -ec -++] = 0; - -277  -ec -; - -278 - } -} - -281  - #NOABS - 0xffffffff - - ) - -282  -Ut32 - - $e_code - -avi_hd - * -ah -, -Ut8 - * -cda -, -Ut32 - -ec -, Ut32 -e - ) - -284 -Ut32 - -cc -, -runc -, -abos -, -chunk -; - -285 -Ut8 - -thisc -; - -287 if -e - == 0 ) - -289 -ah --> -eda -[ -ec -++] = 0x00; - -290 -ah --> -eda -[ -ec -++] = 0x00; - -291  -ec -; - -294 -cc - = 0; - -295 -abos - = -NOABS -; - -296  -cc - < -e - ) - -299 -thisc - = -cda -[ -cc -]; - -302 if -cc - = -e --1 ) - -305 if -abos - ! -NOABS - ) -ec - = - `e_puixs - -ah -, -cda -,c,bos, -cc --abspos ); - -308 -ah --> -eda -[ -ec -++] = 0x01; - -309 -ah --> -eda -[ -ec -++] = -thisc -; - -311 -ah --> -eda -[ -ec -++] = 0x00; - -312 -ah --> -eda -[ -ec -++] = 0x00; - -313  -ec -; - -316 -runc - = 1; - -317  -cda -[ -cc -+ -runc -] = -thisc - ) - -319 -runc -++; - -320 if( -cc -+ -runc -> -e - ) ; - -324 if -runc - < 2 ) - -327 if -abos - = -NOABS - )bo -cc -; - -330 -cc -++; - -335 if -abos - ! -NOABS - ) - -337 -ec - = - `e_puixs - -ah -, -cda -,c, -abos -, -cc --abspos ); - -338 -abos - = -NOABS -; - -342 -cc - + -runc -; - -344  -runc - > 255 ) - -346 -chunk - = ( -runc -<258) ? 250 : 255; - -347 -ah --> -eda -[ -ec -++] = -chunk -; - -348 -ah --> -eda -[ -ec -++] = -thisc -; - -349 -runc - - -chunk -; - -352 -ah --> -eda -[ -ec -++] = -runc -; - -353 -ah --> -eda -[ -ec -++] = -thisc -; - -356 if -abos - ! -NOABS - ) -ec - = - `e_puixs - -ah -, -cda -,c,bos, -cc --abspos ); - -357 -ah --> -eda -[ -ec -++] = 0x00; - -358 -ah --> -eda -[ -ec -++] = 0x00; - -359  -ec -; - -360 - } -} - -362 -SDL_bo - - $avi_addame - -avi_hd - ** -ah -, -Ut8 - * -cda - ) - -364 -SDL_bo - -ok -; - -365 -St32 - -i -, -x -, -ϡle -, -ϡx -; - -366 -Ut32 - -size -; - -368 -ϡle - = 0; - -369 if(* -ah -)-> -ϡamevid - ) - -372  -i -=0; i<224; i++ ) - -374  -x -=0; x<240; x++ ) - -376 if(* -ah -)-> -ϡame -[ -i -*240+ -x -] ! -cda -[i*240+x] ) - -379 if -x -<240 ) ; - -381 -ϡle - = -i -; - -384 if -ϡle - == 224 ) - -386 -size - = 0; - -387 (* -ah -)-> -eda -[ -size -++] = 0x00; - -388 (* -ah -)-> -eda -[ -size -++] = 0x01; - -390  -i -=223, -size -=0; i>= -ϡle -; i-- ) - -392 -ϡx - = 240; - -393 if(* -ah -)-> -ϡamevid - ) - -396  -x -=239; x>=0; x-- ) - -398 if(* -ah -)-> -ϡame -[ -i -*240+ -x -] ! -cda -[i*240+x] ) - -401 -ϡx - = -x -+1; - -403 -size - = - `e_code -* -ah -, & -cda -[ -i -*240], size, -ϡx - ); - -405 (* -ah -)-> -eda -[ -size --1] = 0x01; - -408 - `memy -(* -ah -)-> -ϡame -, -cda -, 240*224 ); - -409 (* -ah -)-> -ϡamevid - = -SDL_TRUE -; - -411 -ok - = -SDL_TRUE -; - -412 -ok - & - `wrer -ok, * -ah -, "00dc", -NULL - ); - -413 -ok - & - `wre32l -ok, * -ah -, -size -, -NULL - ); - -414 -ok - & - `wreblk -ok, * -ah -, (*ah)-> -eda -, -size - ); - -416 (* -ah -)-> -movisize - + -size - + 8; - -417 (* -ah -)-> -ames -++; - -419 if! -ok - ) - -421 - `avi_o - -ah - ); - -422  -SDL_FALSE -; - -425 if!(* -ah -)-> -time_t - ) - -427 (* -ah -)-> -time_t - = - `SDL_GTicks -(); - -430  -SDL_TRUE -; - -431 - } -} - -433 -SDL_bo - - $avi_addaudio - -avi_hd - ** -ah -, -St16 - * -audioda -, -Ut32 - -audiosize - ) - -435 -SDL_bo - -ok -; - -437 if!(* -ah -)-> -dod - )  -SDL_TRUE -; - -439 -ok - = -SDL_TRUE -; - -440 -ok - & - `wrer -ok, * -ah -, "01wb", -NULL - ); - -441 -ok - & - `wre32l -ok, * -ah -, -audiosize -, -NULL - ); - -442 -ok - & - `wreblk -ok, * -ah -, ( -Ut8 - *) -audioda -, -audiosize - ); - -444 (* -ah -)-> -movisize - + -audiosize -+8; - -445 (* -ah -)-> -audiޒ - + -audiosize -; - -447 if! -ok - ) - -449 - `avi_o - -ah - ); - -450  -SDL_FALSE -; - -453  -SDL_TRUE -; - -454 - } -} - -456  - $avi_o - -avi_hd - ** -ah - ) - -458 -SDL_bo - -ok -; - -459 -Ut32 - -time_d - = - `SDL_GTicks -(); - -460  -time_ms -, - -, -um -; - -462 if! -ah - ) || (!(*ah)) ) ; - -464 if(* -ah -)-> -f - ) - -466 -ok - = -SDL_TRUE -; - -467 -ok - & - `ek_wre32l -ok, * -ah -, (*ah)-> -offs_riffsize -, (*ah)-> -csize --8 ); - -468 -ok - & - `ek_wre32l -ok, * -ah -, (*ah)-> -offs_hdsize -, (*ah)-> -hdsize - ); - -469 -ok - & - `ek_wre32l -ok, * -ah -, (*ah)-> -offs_ames -, (*ah)-> -ames - ); - -470 -ok - & - `ek_wre32l -ok, * -ah -, (*ah)-> -offs_ames2 -, (*ah)-> -ames - ); - -471 -ok - & - `ek_wre32l -ok, * -ah -, (*ah)-> -offs_movisize -, (*ah)-> -movisize - ); - -472 -ok - & - `ek_wre32l -ok, * -ah -, (*ah)-> -offs_audiޒ -, (*ah)-> -audiޒ - ); - -474 -time_ms - = ()( -time_d - - (* -ah -)-> -time_t -); - -476 - - = (()((* -ah -)-> -ames -* 1000000000.0f/ -time_ms -; - -477 -um - = ( -time_ms -*1000.0f/ (()(* -ah -)-> -ames -); - -479 -ok - & - `ek_wre32l -ok, * -ah -, (*ah)-> -offs_m -, ( -Ut32 -)( - - + .5) ); - -480 -ok - & - `ek_wre32l -ok, * -ah -, (*ah)-> -offs_um -, ( -Ut32 -)( -um - + .5) ); - -482 - `fo -(* -ah -)-> -f - ); - -484 - ` -(* -ah -) ); - -485 * -ah - = -NULL -; - -486 - } -} - - @avi.h - -21  - #AVIF_HASINDEX - 0x00000010 - - ) - -22  - #AVIF_MUSTUSEINDEX - 0x00000020 - - ) - -23  - #AVIF_ISINTERLEAVED - 0x00000100 - - ) - -24  - #AVIF_TRUSTCKTYPE - 0x00000800 - - ) - -25  - #AVIF_WASCAPTUREFILE - 0x00010000 - - ) - -26  - #AVIF_COPYRIGHTED - 0x00020000 - - ) - -28  - savi_hd - - -30 -FILE - * - mf -; - -31 -Ut32 - - mcsize -; - -32 -Ut32 - - mames -, - mamdju -; - -33 -Ut32 - - mhdsize -; - -34 -Ut32 - - mmovisize -; - -35 -Ut32 - - maudiޒ -; - -36 -Ut32 - - moffs_riffsize -; - -37 -Ut32 - - moffs_hdsize -; - -38 -Ut32 - - moffs_ames -; - -39 -Ut32 - - moffs_ames2 -; - -40 -Ut32 - - moffs_movisize -; - -41 -Ut32 - - moffs_audiޒ -; - -42 -Ut32 - - moffs_um -; - -43 -Ut32 - - moffs_m -; - -44 -Ut32 - - mtime_t -; - -46 -SDL_bo - - mdod -; - -47 -SDL_bo - - mϡamevid -; - -48 -Ut8 - - meda -[240*224*4]; - -49 -Ut8 - - mϡame -[240*224]; - -53  - mis50hz -; - -56  -avi_hd - * -avi_ݒ -* -fame -, -Ut8 - * -l -, -SDL_bo - -dosound -,  -is50hz - ); - -57 -SDL_bo - -avi_addame - -avi_hd - ** -ah -, -Ut8 - * -cda - ); - -58 -SDL_bo - -avi_addaudio - -avi_hd - ** -ah -, -St16 - * -audioda -, -Ut32 - -audiosize - ); - -59  -avi_o - -avi_hd - ** -ah - ); - - @disk.c - -31  - #MICRODISC_FUDGE - - - ) - -33  - ~ - -34  - ~ - -35  - ~ - -37  - ~"syem.h -" - -38  - ~"6502.h -" - -39  - ~"v.h -" - -40  - ~"8912.h -" - -41  - ~"gui.h -" - -42  - ~"disk.h -" - -43  - ~"disk_avz.h -" - -44  - ~"mڙ.h -" - -45  - ~"6551.h -" - -46  - ~"mache.h -" - -47  - ~"msgbox.h -" - -48  - ~"feq.h -" - -50  -diskfe -[], -diskth -[], -fmp -[]; - -51  -diskfe -[], -diskth -[]; - -52  -avdiskfe -[], -avdiskth -[]; - -53 -SDL_bo - -eshdisks -; - -55  - #GENERAL_DISK_DEBUG - 0 - - ) - -56  - #DEBUG_SECTOR_DUMP - 0 - - ) - -58 #i -DEBUG_SECTOR_DUMP - - -59  - gdumpr -[64]; - -60  - gdumpcou -; - -63 #ifde -MICRODISC_FUDGE - - -64  -miodisc_tq -* -md - ); - -67  -Ut16 - - $lc_c - -Ut16 - -c -, -Ut8 - -vue -) - -69 -c - = (()(crc >> 8)) | (crc << 8); - -70 -c - ^ -vue -; - -71 -c - ^= (()(crc & 0xff)) >> 4; - -72 -c - ^= (crc << 8) << 4; - -73 -c - ^= ((crc & 0xff) << 4) << 1; - -74  -c -; - -75 - } -} - -78  - $disk_pup - -mache - * -ic -,  -drive - ) - -80  -tmp -[40]; - -81 if! -ic --> -diskme -[ -drive -][0] ) - -83 - `do_pup - -ic -, "\x14\x15\x13" ); - -87 - `rtf - -tmp -, "\x14\x15""%d %-16s", -drive -, -ic --> -diskme -[drive] ); - -88 - `do_pup - -ic -, -tmp - ); - -89 - } -} - -92  - $diskimage_ - -mache - * -ic -,  -diskimage - ** -dimg - ) - -94 * -dth -, * -dfe -; - -96 if!(* -dimg -) ) ; - -98 if -ic --> -ty - ! -MACH_TELESTRAT - ) - -100  -ic --> -drivy -) - -102  -DRV_PRAVETZ -: - -103 -dth - = -avdiskth -; - -104 -dfe - = -avdiskfe -; - -108 -dth - = -diskth -; - -109 -dfe - = -diskfe -; - -113 -dth - = -diskth -; - -114 -dfe - = -diskfe -; - -117 if(* -dimg -)-> -modifd - ) - -119  -modmsg -[128]; - -120 - `rtf - -modmsg -, "Thdisk idriv%d imodifd.\nWould youiktاvthchges?", (* -dimg -)-> -drivum - ); - -121 if - `msgbox - -ic -, -MSGBOX_YES_NO -, -modmsg - ) ) - -123 - `rtf - -modmsg -, "Savdisk %d", (* -dimg -)-> -drivum - ); - -124 if - `feque - -ic -, -modmsg -, -dth -, -dfe -, -FR_DISKSAVE - ) ) - -126 - `joth - -dth -, -dfe - ); - -127 - `diskimage_ve - -ic -, -fmp -, (* -dimg -)-> -drivum - ); - -132 if(* -dimg -)-> -wimage - ) - ` -( (*dimg)->rawimage ); - -133 - ` -* -dimg - ); - -134 (* -dimg - -NULL -; - -135 - } -} - -138 -Ut32 - - $diskimage_wt - -diskimage - * -dimg -, -Ut32 - -offt - ) - -140 if! -dimg - )  0; - -141 if! -dimg --> -wimage - ) || ( dimg-> -wimag - < 4 ) )  0; - -142 if -offt - > ( -dimg --> -wimag --4) )  0; - -144  ( -dimg --> -wimage -[ -offt -+3]<<24)|(dimg->rawimage[offset+2]<<16)|(dimg->rawimage[offset+1]<<8)|dimg->rawimage[offset]; - -145 - } -} - -150  -diskimage - * - $diskimage_loc - -Ut32 - -wimgn - ) - -152  -diskimage - * -dimg -; - -153 -Ut8 - * -buf -= -NULL -; - -155 if -wimgn - ) - -157 -buf - = - `mloc - -wimgn - ); - -158 if! -buf - )  -NULL -; - -161 -dimg - = - `mloc - -diskimage - ) ); - -162 if! -dimg - ) - -164 - ` - -buf - ); - -165  -NULL -; - -168 -dimg --> -drivum - = -1; - -169 -dimg --> -numacks - = 0; - -170 -dimg --> -numsides - = 0; - -171 -dimg --> -geomry - = 0; - -172 -dimg --> -chedack - = -1; - -173 -dimg --> -chedside - = -1; - -174 -dimg --> -nums - = 0; - -175 -dimg --> -wimage - = -buf -; - -176 -dimg --> -wimag - = -wimgn -; - -177 -dimg --> -modifd - = -SDL_FALSE -; - -178 -dimg --> -modifd_time - = 0; - -179  -dimg -; - -180 - } -} - -183  - $disk_eje - -mache - * -ic -,  -drive - ) - -185 - `diskimage_ - -ic -, &ic-> -wddisk -. -disk -[ -drive -] ); - -186 -ic --> -avz -. -drv -[ -drive -]. -pimg - = -NULL -; - -187 -ic --> -avz -. -drv -[ -drive -]. -by - = 0; - -188 -ic --> -avz -. -drv -[ -drive -]. -dty - = -SDL_FALSE -; - -189 -ic --> -avz -. -drv -[ -drive -]. -hf_ack - = 0; - -190 -ic --> -diskme -[ -drive -][0] = 0; - -191 - `disk_pup - -ic -, -drive - ); - -192 - } -} - -198  - $diskimage_chck - -diskimage - * -dimg -,  -ack -,  -side - ) - -200 -Ut8 - * -r -, * -e -; - -201 -Ut32 - -cou -, -n -; - -204 if -dimg --> -chedack - = -ack - ) && - -205 -dimg --> -chedside - = -side - ) ) - -209  -n -=0;<32;++ ) - -211 -dimg --> - -[ -n -]. -id_r - = -NULL -; - -212 -dimg --> - -[ -n -]. -da_r - = -NULL -; - -214 -dimg --> -nums - = 0; - -215 -dimg --> -chedack - = -1; - -216 -dimg --> -chedside - = -1; - -218 if -side - > -dimg --> -numsides - ) - -222 -r - = & -dimg --> -wimage -[( -side -*dimg-> -numacks -+ -ack -)*6400+256]; - -223 -e - = & -r -[6400]; - -226 -cou - = 0; - -227  -r - < -e - ) - -230  ( -r -< -e -) && (ptr[0]!=0xfe) )tr++; - -233 if -r - > -e - ) ; - -236 -dimg --> - -[ -cou -]. -id_r - = -r -; - -237 -dimg --> - -[ -cou -]. -da_r - = -NULL -; - -238 -cou -++; - -241 -n - = -r -[4]; - -244 -r -+=7; - -247  ( -r -< -e -) && (ptr[0]!=0xfb) && (ptr[0]!=0xf8) )tr++; - -248 if -r - > -e - ) ; - -251 -dimg --> - -[ -cou --1]. -da_r - = -r -; - -254 -r - +(1<<( -n -+7))+3; - -257 if0 < -cou - ) - -260 -dimg --> -nums - = -cou -; - -261 -dimg --> -chedack - = -ack -; - -262 -dimg --> -chedside - = -side -; - -264 - } -} - -270 -SDL_bo - - $diskimage_ve - -mache - * -ic -, * -ame -,  -drive - ) - -272 -FILE - * -f -; - -275 if! -ic --> -wddisk -. -disk -[ -drive -] )  -SDL_FALSE -; - -277 if -ic --> -drivy - = -DRV_PRAVETZ - ) - -278 - `disk_avz_wre_image -(& -ic --> -avz -. -drv -[ -drive -]); - -281 -f - = - `fݒ - -ame -, "wb" ); - -282 if! -f - ) - -284 - `do_pup - -ic -, "\x14\x15Save failed" ); - -285  -SDL_FALSE -; - -289 if - `fwre - -ic --> -wddisk -. -disk -[ -drive -]-> -wimage -, oric->wddisk.disk[drive]-> -wimag -, 1, -f - ) != 1 ) - -291 - `fo - -f - ); - -292 - `do_pup - -ic -, "\x14\x15Save failed" ); - -293  -SDL_FALSE -; - -297 - `fo - -f - ); - -300 if -ame - ! -ic --> -wddisk -. -disk -[ -drive -]-> -fame - ) - -302 - `y - -ic --> -wddisk -. -disk -[ -drive -]-> -fame -, -ame -, 4096+512 ); - -303 -ic --> -wddisk -. -disk -[ -drive -]-> -fame -[4096+511] = 0; - -307 -ic --> -wddisk -. -disk -[ -drive -]-> -modifd - = -SDL_FALSE -; - -308 -ic --> -wddisk -. -disk -[ -drive -]-> -modifd_time - = 0; - -311 -eshdisks - = -SDL_TRUE -; - -312  -SDL_TRUE -; - -313 - } -} - -316 -SDL_bo - - $diskimage_ld - -mache - * -ic -, * -ame -,  -drive - ) - -318 -FILE - * -f -; - -319 -Ut32 - -n -; - -322 -f - = - `fݒ - -ame -, "rb" ); - -323 if! -f - )  -SDL_FALSE -; - -326 - `disk_eje - -ic -, -drive - ); - -329 - `fek - -f -, 0, -SEEK_END - ); - -330 -n - = () - `l - -f - ); - -331 - `fek - -f -, 0, -SEEK_SET - ); - -334 if -n - <= 0 ) - -336 - `fo - -f - ); - -337  -SDL_FALSE -; - -341 -ic --> -wddisk -. -disk -[ -drive -] = - `diskimage_loc - -n - ); - -342 if! -ic --> -wddisk -. -disk -[ -drive -] ) - -344 - `do_pup - -ic -, "\x14\x15""Out of memory" ); - -345 - `fo - -f - ); - -346  -SDL_FALSE -; - -350 if - `d - -ic --> -wddisk -. -disk -[ -drive -]-> -wimage -, -n -, 1, -f - ) != 1 ) - -352 - `fo - -f - ); - -353 - `disk_eje - -ic -, -drive - ); - -354 - `do_pup - -ic -, "\x14\x15""Readrror" ); - -355  -SDL_FALSE -; - -358 - `fo - -f - ); - -360 if -ic --> -drivy - = -DRV_PRAVETZ - ) - -362 -Ut16 - -t_idx -; - -363 -Ut16 - -s_idx -; - -364 -Ut16 - -sb_idx -; - -365 -Ut16 - -tb_idx -; - -367 -ic --> -avz -. -drv -[ -drive -]. -pimg - = oric-> -wddisk -. -disk -[drive]; - -369 if -drive - >= 2 ) - -371 - `disk_eje - -ic -, -drive - ); - -372 - `do_pup - -ic -, "\x14\x15""Invalid driveumber" ); - -373  -SDL_FALSE -; - -376 if -n - != 143360 ) - -378 - `disk_eje - -ic -, -drive - ); - -379 - `do_pup - -ic -, "\x14\x15""Invalidravetz disk image" ); - -380  -SDL_FALSE -; - -384  -t_idx - = 0;_idx < -PRAV_TRACKS_PER_DISK -;_idx++) - -386 -tb_idx - = 0; - -388  -s_idx - = 0; s_idx < -PRAV_SECTORS_PER_TRACK -; s_idx++) - -390  -sb_idx - = 0; sb_idx < -PRAV_RAW_BYTES_PER_SECTOR -; sb_idx++, -tb_idx -++) - -392 -ic --> -avz -. -drv -[ -drive -]. -image -[ -t_idx -][ -tb_idx -] = - -393 - `disk_avz_image_w_by -( -ic -, -drive -, -t_idx -, -s_idx -, -sb_idx -); - -397  -tb_idx - < -PRAV_RAW_TRACK_SIZE -) - -399 -ic --> -avz -. -drv -[ -drive -]. -image -[ -t_idx -][ -tb_idx -] = 0xFF; - -400 -tb_idx -++; - -404 -ic --> -avz -. -drv -[ -drive -]. -by - = 0; - -405 -ic --> -avz -. -drv -[ -drive -]. -hf_ack - = 0; - -410 if - `cmp -(*) -ic --> -wddisk -. -disk -[ -drive -]-> -wimage -, "MFM_DISK", 8 ) != 0 ) - -412 - `disk_eje - -ic -, -drive - ); - -413 - `do_pup - -ic -, "\x14\x15""Invalid disk image" ); - -414  -SDL_FALSE -; - -418 -ic --> -wddisk -. -disk -[ -drive -]-> -drivum - = drive; - -419 -ic --> -wddisk -. -disk -[ -drive -]-> -numsides - = - `diskimage_wt -( oric->wddisk.disk[drive], 8 ); - -420 -ic --> -wddisk -. -disk -[ -drive -]-> -numacks - = - `diskimage_wt -( oric->wddisk.disk[drive], 12 ); - -421 -ic --> -wddisk -. -disk -[ -drive -]-> -geomry - = - `diskimage_wt -( oric->wddisk.disk[drive], 16 ); - -424 if -ic --> -wddisk -. -disk -[ -drive -]-> -numsides - < 1 ) || - -425 -ic --> -wddisk -. -disk -[ -drive -]-> -numsides - > 2 ) ) - -427 - `disk_eje - -ic -, -drive - ); - -428 - `do_pup - -ic -, "\x14\x15""Invalid disk image" ); - -429  -SDL_FALSE -; - -434 -ic --> -wddisk -. -disk -[ -drive -]-> -modifd - = -SDL_FALSE -; - -435 -ic --> -wddisk -. -disk -[ -drive -]-> -modifd_time - = 0; - -438 - `y - -ic --> -wddisk -. -disk -[ -drive -]-> -fame -, -ame -, 4096+512 ); - -439 -ic --> -wddisk -. -disk -[ -drive -]-> -fame -[4096+511] = 0; - -442 if - ` - -ame - ) > 31 ) - -444 - `y - -ic --> -diskme -[ -drive -], & -ame -[ - ` -(fname)-31], 32 ); - -445 -ic --> -diskme -[ -drive -][0] = 22; - -447 - `y - -ic --> -diskme -[ -drive -], -ame -, 32 ); - -449 -ic --> -diskme -[ -drive -][31] = 0; - -452 - `disk_pup - -ic -, -drive - ); - -455 -eshdisks - = -SDL_TRUE -; - -456  -SDL_TRUE -; - -457 - } -}; - -461  - $wd17xx_dummy -* -nhg - ) - -463 - } -} - -466  - $wd17xx_ - -wd17xx - * -wd - ) - -468 -wd --> -r_us - = 0; - -469 -wd --> -r_ack - = 0; - -470 -wd --> -r_ - = 0; - -471 -wd --> -r_da - = 0; - -472 -wd --> -c_drive - = 0; - -473 -wd --> -c_side - = 0; - -474 -wd --> -c_ack - = 0; - -475 -wd --> -c_ - = 0; - -476 -wd --> -ϡ__ - = -SDL_FALSE -; - -477 -wd --> -tq - = -wd17xx_dummy -; - -478 -wd --> -rq - = -wd17xx_dummy -; - -479 -wd --> -qg - = -NULL -; - -480 -wd --> -tdrq - = -wd17xx_dummy -; - -481 -wd --> -rdrq - = -wd17xx_dummy -; - -482 -wd --> -drqg - = -NULL -; - -483 -wd --> -cut - = -COP_NUFFINK -; - -484 -wd --> -dayedt - = 0; - -485 -wd --> -dayeddrq - = 0; - -486 -wd --> -dius - = -1; - -487 -wd --> -ddus - = -1; - -488 -eshdisks - = -SDL_TRUE -; - -489 - } -} - -492  - $wd17xx_ticktock - -wd17xx - * -wd -,  -cyes - ) - -494 #ifde -MICRODISC_FUDGE - - -495 i(( -wd --> -cut - = -COP_READ_SECTORS_FUDGE -) || - -496 ( -wd --> -cut - = -COP_READ_SECTOR_FUDGE -)) - -498 i( -wd --> -disk -[wd-> -c_drive -]) - -500 -wd --> -cuoffs - = 0; - -501 -wd --> -cu - = - `wd17xx_fd_ -wd, wd-> -r_ - ); - -502 if! -wd --> -cu - ) - -504 -wd --> -r_us - = -WSF_RNF -; - -505 -wd --> - `rdrq -wd-> -drqg - ); - -506 -wd --> - `tq -wd-> -qg - ); - -507 -wd --> -cut - = -COP_NUFFINK -; - -508 -eshdisks - = -SDL_TRUE -; - -509 #i -GENERAL_DISK_DEBUG - - -510 - `dbg_tf -"DISK: Se %d found.", -wd --> -r_ - ); - -515 -wd --> -cu - = 1<<(wd-> -cu --> -id_r -[4]+7); - -516 -wd --> -r_us - = -WSF_BUSY -| -WSF_NOTREADY -; - -517 -wd --> -dayeddrq - = 60; - -518 -wd --> -cut - = (wd->cut = -COP_READ_SECTORS_FUDGE -? -COP_READ_SECTORS - : -COP_READ_SECTOR -; - -519 -wd --> -c - = 0xe295; - -520 -eshdisks - = -SDL_TRUE -; - -521 #i -DEBUG_SECTOR_DUMP - - -522 -dumpcou - = 0; - -523 -dumpr -[0] = 0; - -531 if -wd --> -dayedt - > 0 ) - -534 -wd --> -dayedt - - -cyes -; - -537 if -wd --> -dayedt - <= 0 ) - -540 -wd --> -dayedt - = 0; - -543 if -wd --> -dius - != -1 ) - -546 -wd --> -r_us - = wd-> -dius -; - -547 -wd --> -dius - = -1; - -551 -wd --> - `tq -wd-> -qg - ); - -552 #i -GENERAL_DISK_DEBUG - - -553 - `dbg_tf -( "DISK: Delayed INTRQ" ); - -559 if -wd --> -dayeddrq - > 0 ) - -562 -wd --> -dayeddrq - - -cyes -; - -565 if -wd --> -dayeddrq - <= 0 ) - -568 -wd --> -dayeddrq - = 0; - -571 if -wd --> -ddus - != -1 ) - -574 -wd --> -r_us - = wd-> -ddus -; - -575 -wd --> -ddus - = -1; - -579 -wd --> -r_us - | -WSF_DRQ -; - -580 -wd --> - `tdrq -wd-> -drqg - ); - -583 - } -} - -586  - $wd17xx_ek_ack - -wd17xx - * -wd -, -Ut8 - -ack -, -SDL_bo - -dofudge - ) - -589 if -wd --> -disk -[wd-> -c_drive -] ) - -592 if -ack - > -wd --> -disk -[wd-> -c_drive -]-> -numacks - ) - -594 -ack - = ( -wd --> -disk -[wd-> -c_drive -]-> -numacks ->0)?wd->disk[wd->c_drive]->numtracks-1:0; - -595 -wd --> -dius - = -WSFI_HEADL -| -WSFI_SEEKERR -; - -599 -wd --> -dius - = -WSFI_HEADL -| -WSFI_PULSE -; - -603 - `diskimage_chck - -wd --> -disk -[wd-> -c_drive -], -ack -, wd-> -c_side - ); - -606 -wd --> -c_ack - = -ack -; - -607 -wd --> -c_ - = 0; - -608 -wd --> -r_ack - = -ack -; - -614 -wd --> -dayedt - = 20; - -615 if -wd --> -c_ack - =0 ) wd-> -dius - | -WSFI_TRK0 -; - -616 #i -GENERAL_DISK_DEBUG - - -617 - `dbg_tf -"DISK: Aack %u (%u ses)", -ack -, -wd --> -disk -[wd-> -c_drive -]-> -nums - ); - -624 -wd --> - `tq -wd-> -qg - ); - -625 -wd --> -r_ack - = 0; - -627 #i -GENERAL_DISK_DEBUG - - -628 - `dbg_tf -( "DISK: Seek fail" ); - -631 #ifde -MICRODISC_FUDGE - - -633 i(( -dofudge -&& ( -wd --> -tq - = -miodisc_tq -)) - -635 -wd --> -r_us - = 0x44; - -641 -wd --> -r_us - = -WSF_NOTREADY -| -WSFI_SEEKERR -; - -642 - } -} - -647  -mfm - * - $wd17xx_fd_ - -wd17xx - * -wd -, -Ut8 - -cid - ) - -649  -vs -=0; - -650  -diskimage - * -dimg -; - -653 -dimg - = -wd --> -disk -[wd-> -c_drive -]; - -656 if! -dimg - )  -NULL -; - -659 - `diskimage_chck - -dimg -, -wd --> -c_ack -, wd-> -c_side - ); - -662 if -dimg --> -nums - < 1 ) - -663  -NULL -; - -668  -vs - < 2 ) - -671 -wd --> -c_ - = (wd->c_+1)% -dimg --> -nums -; - -674 if! -wd --> -c_ - ) - -676 -vs -++; - -677 -wd --> -r_us - | -WSFI_PULSE -; - -681 if -dimg --> - -[ -wd --> -c_ -]. -id_r -[3] = -cid - ) - -682  & -dimg --> - -[ -wd --> -c_ -]; - -686 #i -GENERAL_DISK_DEBUG - - -687 - `dbg_tf -"Couldn'fd se %u", -cid - ); - -689  -NULL -; - -690 - } -} - -694  -mfm - * - $wd17xx_f_ - -wd17xx - * -wd - ) - -696  -diskimage - * -dimg -; - -698 -dimg - = -wd --> -disk -[wd-> -c_drive -]; - -701 if! -dimg - )  -NULL -; - -704 - `diskimage_chck - -dimg -, -wd --> -c_ack -, wd-> -c_side - ); - -707 if -dimg --> -nums - < 1 ) - -708  -NULL -; - -711 -wd --> -c_ - = 0; - -712 -wd --> -r_us - = -WSFI_PULSE -; - -715  & -dimg --> - -[ -wd --> -c_ -]; - -716 - } -} - -719  -mfm - * - $wd17xx_xt_ - -wd17xx - * -wd - ) - -721  -diskimage - * -dimg -; - -723 -dimg - = -wd --> -disk -[wd-> -c_drive -]; - -726 if! -dimg - )  -NULL -; - -729 - `diskimage_chck - -dimg -, -wd --> -c_ack -, wd-> -c_side - ); - -732 if -dimg --> -nums - < 1 ) - -733  -NULL -; - -736 -wd --> -c_ - = (wd->c_+1)% -dimg --> -nums -; - -739 if! -wd --> -c_ - ) wd-> -r_us - | -WSFI_PULSE -; - -742  & -dimg --> - -[ -wd --> -c_ -]; - -743 - } -} - -746  - $wd17xx_ad - -wd17xx - * -wd -,  -addr - ) - -749  -addr - ) - -752 -wd --> - `rq -wd-> -qg - ); - -753  -wd --> -r_us -; - -756  -wd --> -r_ack -; - -759  -wd --> -r_ -; - -763  -wd --> -cut - ) - -765 #ifde -MICRODISC_FUDGE - - -766  -COP_READ_SECTOR_FUDGE -: - -767  -COP_READ_SECTORS_FUDGE -: - -771  -COP_READ_SECTOR -: - -772  -COP_READ_SECTORS -: - -774 if! -wd --> -cu - ) - -777 -wd --> -r_us - &~ -WSF_DRQ -; - -778 -wd --> -r_us - | -WSF_RNF -; - -779 -wd --> - `rdrq -wd-> -drqg - ); - -780 -wd --> -cut - = -COP_NUFFINK -; - -781 -eshdisks - = -SDL_TRUE -; - -786 if -wd --> -cuoffs - =0 ) wd-> -y - = (wd-> -cu --> -da_r -[wd->cuoffs++]==0xf8)? -WSFR_RECTYP -:0x00; - -789 -wd --> -r_da - = wd-> -cu --> -da_r -[wd-> -cuoffs -++]; - -790 -wd --> -c - = - `lc_c -wd->c, wd-> -r_da - ); - -793 -wd --> -r_us - &~ -WSF_DRQ -; - -794 -wd --> - `rdrq -wd-> -drqg - ); - -796 #i -DEBUG_SECTOR_DUMP - - -797 - `rtf -& -dumpr -[ -dumpcou -*2], "%02X", -wd --> -r_da - ); - -798 -dumpr -[34+ -dumpcou -] = (( -wd --> -r_da ->31)&&(wd->r_data<127)) ? wd->r_data : '.'; - -799 -dumpcou -++; - -800 if -dumpcou - >= 16 ) - -802 -dumpr -[32] = ' '; - -803 -dumpr -[33] = '\''; - -804 -dumpr -[50] = '\''; - -805 -dumpr -[51] = 0; - -806 - `dbg_tf -"%s", -dumpr - ); - -807 -dumpcou - = 0; - -812 if -wd --> -cuoffs - > wd-> -cu - ) - -815 #i -DEBUG_SECTOR_DUMP - - -816 if -dumpcou - ) - -818 -dumpr -[33] = '\''; - -819 -dumpr -[34+ -dumpcou -] = '\''; - -820 -dumpr -[35+ -dumpcou -] = 0; - -821  -dumpcou -*=2; sectordumpcount<33; sectordumpcount++ ) - -822 -dumpr -[ -dumpcou -*2] = ' '; - -823 - `dbg_tf -"%s", -dumpr - ); - -824 -dumpcou - = 0; - -830 if -wd --> -cut - = -COP_READ_SECTORS - ) - -832 #i -GENERAL_DISK_DEBUG - - -833 - `dbg_tf -( "Next sector..." ); - -836 -wd --> -r_ -++; - -837 -wd --> -cuoffs - = 0; - -838 -wd --> -cu - = - `wd17xx_fd_ -wd, wd-> -r_ - ); - -839 -wd --> -c - = 0xe295; - -843 if! -wd --> -cu - ) - -845 -wd --> -dayedt - = 20; - -846 -wd --> -dius - = wd-> -y -; - -847 -wd --> -cut - = -COP_NUFFINK -; - -848 -wd --> -r_us - &(~ -WSF_DRQ -); - -849 -wd --> - `rdrq -wd-> -drqg - ); - -850 -eshdisks - = -SDL_TRUE -; - -857 -wd --> -dayeddrq - = 180; - -862 -wd --> -dayedt - = 32; - -863 -wd --> -dius - = wd-> -y -; - -864 -wd --> -cut - = -COP_NUFFINK -; - -865 -wd --> -r_us - &(~ -WSF_DRQ -); - -866 -wd --> - `rdrq -wd-> -drqg - ); - -867 -eshdisks - = -SDL_TRUE -; - -869 -wd --> -dayeddrq - = 32; - -873  -COP_READ_ADDRESS -: - -874 if! -wd --> -cu - ) - -876 -wd --> -r_us - &~ -WSF_DRQ -; - -877 -wd --> - `rdrq -wd-> -drqg - ); - -878 -wd --> -cut - = -COP_NUFFINK -; - -879 -eshdisks - = -SDL_TRUE -; - -882 if -wd --> -cuoffs - =0 ) wd-> -r_ - = wd-> -cu --> -id_r -[1]; - -883 -wd --> -r_da - = wd-> -cu --> -id_r -[++wd-> -cuoffs -]; - -884 -wd --> -r_us - &~ -WSF_DRQ -; - -885 -wd --> - `rdrq -wd-> -drqg - ); - -886 if -wd --> -cuoffs - >= 6 ) - -888 -wd --> -dayedt - = 20; - -889 -wd --> -dius - = 0; - -890 -wd --> -cut - = -COP_NUFFINK -; - -891 -eshdisks - = -SDL_TRUE -; - -893 -wd --> -dayeddrq - = 32; - -898  -wd --> -r_da -; - -902 - } -} - -904  -SDL_bo - - gϡ__ - = -SDL_FALSE -; - -905  - $wd17xx_wre - -mache - * -ic -,  -wd17xx - * -wd -,  -addr -,  -da - ) - -907  -addr - ) - -910 -wd --> - `rq -wd-> -qg - ); - -911  -da - & 0xe0 ) - -914  -da - & 0x10 ) - -917 #i -GENERAL_DISK_DEBUG - - -918 - `dbg_tf -"DISK: (%04XRee", -ic --> -u -. -pc --1 ); - -920 -wd --> -r_us - = -WSF_BUSY -; - -921 if -da - & 8 ) -wd --> -r_us - | -WSFI_HEADL -; - -922 - `wd17xx_ek_ack - -wd -, 0, -ic --> -u -. -lc - == 0xe3a1 ); - -923 -wd --> -cut - = -COP_NUFFINK -; - -924 -eshdisks - = -SDL_TRUE -; - -928 #i -GENERAL_DISK_DEBUG - - -929 - `dbg_tf -"DISK: (%04XSk", -ic --> -u -. -pc --1 ); - -931 -wd --> -r_us - = -WSF_BUSY -; - -932 if -da - & 8 ) -wd --> -r_us - | -WSFI_HEADL -; - -933 - `wd17xx_ek_ack - -wd -, wd-> -r_da -, -SDL_FALSE - ); - -934 -wd --> -cut - = -COP_NUFFINK -; - -935 -eshdisks - = -SDL_TRUE -; - -941 #i -GENERAL_DISK_DEBUG - - -942 - `dbg_tf -"DISK: (%04XSp", -ic --> -u -. -pc --1 ); - -944 -wd --> -r_us - = -WSF_BUSY -; - -945 if -da - & 8 ) -wd --> -r_us - | -WSFI_HEADL -; - -946 if -ϡ__ - ) - -947 - `wd17xx_ek_ack - -wd -, wd-> -c_ack -+1, -SDL_FALSE - ); - -949 - `wd17xx_ek_ack - -wd -, wd-> -c_ack - > 0 ? wd->c_ack-1 : 0, -SDL_FALSE - ); - -950 -wd --> -cut - = -COP_NUFFINK -; - -951 -eshdisks - = -SDL_TRUE -; - -955 #i -GENERAL_DISK_DEBUG - - -956 - `dbg_tf -"DISK: (%04XSp-I(%d,%d)", -ic --> -u -. -pc --1, -wd --> -c_ack -, wd->c_track+1 ); - -958 -wd --> -r_us - = -WSF_BUSY -; - -959 if -da - & 8 ) -wd --> -r_us - | -WSFI_HEADL -; - -960 - `wd17xx_ek_ack - -wd -, wd-> -c_ack -+1, -SDL_FALSE - ); - -961 -ϡ__ - = -SDL_TRUE -; - -962 -wd --> -cut - = -COP_NUFFINK -; - -963 -eshdisks - = -SDL_TRUE -; - -967 #i -GENERAL_DISK_DEBUG - - -968 - `dbg_tf -( "DISK: Step-Out" ); - -970 -wd --> -r_us - = -WSF_BUSY -; - -971 if -da - & 8 ) -wd --> -r_us - | -WSFI_HEADL -; - -972 if -wd --> -c_ack - > 0 ) - -973 - `wd17xx_ek_ack - -wd -, wd-> -c_ack --1, -SDL_FALSE - ); - -974 -ϡ__ - = -SDL_FALSE -; - -975 -wd --> -cut - = -COP_NUFFINK -; - -976 -eshdisks - = -SDL_TRUE -; - -980 #i -GENERAL_DISK_DEBUG - - -981  -ic --> -drivy - ) - -983  -DRV_MICRODISC -: - -984 - `dbg_tf -"DISK: (%04XRd se %u (CODE=%02X,ROM=%s,EPROM=%s)", -ic --> -u -. -pc --1, -wd --> -r_ -, -da -, oric-> -romdis -?"OFF":"ON", oric-> -md -. -diskrom -?"ON":"OFF" ); - -988 - `dbg_tf -"DISK: (%04XRd se %u (CODE=%02X)", -ic --> -u -. -pc --1, -wd --> -r_ -, -da - ); - -992 #ifde -MICRODISC_FUDGE - - -993 i(! -wd --> -disk -[wd-> -c_drive -]) - -995 -wd --> -cut - = ( -da -&0x10? -COP_READ_SECTORS_FUDGE - : -COP_READ_SECTOR_FUDGE -; - -1000 -wd --> -cuoffs - = 0; - -1001 -wd --> -cu - = - `wd17xx_fd_ -wd, wd-> -r_ - ); - -1002 if! -wd --> -cu - ) - -1004 -wd --> -r_us - = -WSF_RNF -; - -1005 -wd --> - `rdrq -wd-> -drqg - ); - -1006 -wd --> - `tq -wd-> -qg - ); - -1007 -wd --> -cut - = -COP_NUFFINK -; - -1008 -eshdisks - = -SDL_TRUE -; - -1009 #i -GENERAL_DISK_DEBUG - - -1010 - `dbg_tf -"DISK: Se %d found.", -wd --> -r_ - ); - -1016 -wd --> -cu - = 1<<(wd-> -cu --> -id_r -[4]+7); - -1017 -wd --> -r_us - = -WSF_BUSY -| -WSF_NOTREADY -; - -1018 -wd --> -dayeddrq - = 60; - -1019 -wd --> -cut - = ( -da -&0x10? -COP_READ_SECTORS - : -COP_READ_SECTOR -; - -1020 -wd --> -c - = 0xe295; - -1021 -eshdisks - = -SDL_TRUE -; - -1022 #i -DEBUG_SECTOR_DUMP - - -1023 -dumpcou - = 0; - -1024 -dumpr -[0] = 0; - -1029 #i -GENERAL_DISK_DEBUG - - -1030  -ic --> -drivy - ) - -1032  -DRV_MICRODISC -: - -1033 - `dbg_tf -"DISK: (%04XWr %u (CODE=%02X,ROM=%s,EPROM=%s)", -ic --> -u -. -pc --1, -wd --> -r_ -, -da -, oric-> -romdis -?"OFF":"ON", oric-> -md -. -diskrom -?"ON":"OFF" ); - -1037 - `dbg_tf -"DISK: (%04XWr %u (CODE=%02X)", -ic --> -u -. -pc --1, -wd --> -r_ -, -da - ); - -1041 -wd --> -cuoffs - = 0; - -1042 -wd --> -cu - = - `wd17xx_fd_ -wd, wd-> -r_ - ); - -1043 if! -wd --> -cu - ) - -1045 -wd --> -r_us - = -WSF_RNF -; - -1046 -wd --> - `rdrq -wd-> -drqg - ); - -1047 -wd --> - `tq -wd-> -qg - ); - -1048 -wd --> -cut - = -COP_NUFFINK -; - -1049 -eshdisks - = -SDL_TRUE -; - -1050 #i -GENERAL_DISK_DEBUG - - -1051 - `dbg_tf -"DISK: Se %d found.", -wd --> -r_ - ); - -1057 -wd --> -cu - = 1<<(wd-> -cu --> -id_r -[4]+7); - -1058 -wd --> -r_us - = -WSF_BUSY -| -WSF_NOTREADY -; - -1059 -wd --> -dayeddrq - = 500; - -1060 -wd --> -cut - = ( -da -&0x10? -COP_WRITE_SECTORS - : -COP_WRITE_SECTOR -; - -1061 -wd --> -c - = 0xe295; - -1062 -eshdisks - = -SDL_TRUE -; - -1066  -da - & 0x10 ) - -1069 #i -GENERAL_DISK_DEBUG - - -1070 - `dbg_tf -"DISK: (%04XRdddss", -ic --> -u -. -pc --1 ); - -1072 -wd --> -cuoffs - = 0; - -1073 if! -wd --> -cu - ) - -1074 -wd --> -cu - = - `wd17xx_f_ -( wd ); - -1076 -wd --> -cu - = - `wd17xx_xt_ -( wd ); - -1078 if! -wd --> -cu - ) - -1080 -wd --> -r_us - = -WSF_RNF -; - -1081 -wd --> - `rdrq -wd-> -drqg - ); - -1082 -wd --> -cut - = -COP_NUFFINK -; - -1083 -wd --> - `tq -wd-> -qg - ); - -1084 -eshdisks - = -SDL_TRUE -; - -1085 #i -GENERAL_DISK_DEBUG - - -1086 - `dbg_tf -( "DISK: No sectors onhisrack?" ); - -1091 #i -GENERAL_DISK_DEBUG - - -1092 - `dbg_tf -( "DISK: %02X,%02X,%02X,%02X,%02X,%02X", - -1093 -wd --> -cu --> -id_r -[1], - -1094 -wd --> -cu --> -id_r -[2], - -1095 -wd --> -cu --> -id_r -[3], - -1096 -wd --> -cu --> -id_r -[4], - -1097 -wd --> -cu --> -id_r -[5], - -1098 -wd --> -cu --> -id_r -[6] ); - -1100 -wd --> -r_us - = -WSF_NOTREADY -| -WSF_BUSY -| -WSF_DRQ -; - -1101 -wd --> - `tdrq -wd-> -drqg - ); - -1102 -wd --> -cut - = -COP_READ_ADDRESS -; - -1103 -eshdisks - = -SDL_TRUE -; - -1107 #i -GENERAL_DISK_DEBUG - - -1108 - `dbg_tf -"DISK: (%04XF i", -ic --> -u -. -pc --1 ); - -1110 -wd --> -r_us - = 0; - -1111 -wd --> - `rdrq -wd-> -drqg - ); - -1112 -wd --> - `tq -wd-> -qg - ); - -1113 -wd --> -dayedt - = 0; - -1114 -wd --> -dayeddrq - = 0; - -1115 -wd --> -cut - = -COP_NUFFINK -; - -1116 -eshdisks - = -SDL_TRUE -; - -1122  -da - & 0x10 ) - -1125 #i -GENERAL_DISK_DEBUG - - -1126 - `dbg_tf -"DISK: (%04XRdck", -ic --> -u -. -pc --1 ); - -1128 -wd --> -cut - = -COP_READ_TRACK -; - -1129 -eshdisks - = -SDL_TRUE -; - -1133 #i -GENERAL_DISK_DEBUG - - -1134 - `dbg_tf -"DISK: (%04XWrack", -ic --> -u -. -pc --1 ); - -1136 -wd --> -cut - = -COP_WRITE_TRACK -; - -1137 -eshdisks - = -SDL_TRUE -; - -1145 -wd --> -r_ack - = -da -; - -1149 -wd --> -r_ - = -da -; - -1153 -wd --> -r_da - = -da -; - -1155  -wd --> -cut - ) - -1157  -COP_WRITE_SECTOR -: - -1158  -COP_WRITE_SECTORS -: - -1159 if! -wd --> -cu - ) - -1161 -wd --> -r_us - &~ -WSF_DRQ -; - -1162 -wd --> -r_us - | -WSF_RNF -; - -1163 -wd --> - `rdrq -wd-> -drqg - ); - -1164 -wd --> -cut - = -COP_NUFFINK -; - -1165 -eshdisks - = -SDL_TRUE -; - -1168 if -wd --> -cuoffs - =0 ) wd-> -cu --> -da_r -[wd->curroffs++]=0xfb; - -1169 -wd --> -cu --> -da_r -[wd-> -cuoffs -++] = wd-> -r_da -; - -1170 -wd --> -c - = - `lc_c -wd->c, wd-> -r_da - ); - -1171 if! -wd --> -disk -[wd-> -c_drive -]-> -modifd - ) -eshdisks - = -SDL_TRUE -; - -1172 -wd --> -disk -[wd-> -c_drive -]-> -modifd - = -SDL_TRUE -; - -1173 -wd --> -disk -[wd-> -c_drive -]-> -modifd_time - = 0; - -1174 -wd --> -r_us - &~ -WSF_DRQ -; - -1175 -wd --> - `rdrq -wd-> -drqg - ); - -1177 if -wd --> -cuoffs - > wd-> -cu - ) - -1179 -wd --> -cu --> -da_r -[wd-> -cuoffs -++] = wd-> -c ->>8; - -1180 -wd --> -cu --> -da_r -[wd-> -cuoffs -++] = wd-> -c -; - -1181 if -wd --> -cut - = -COP_WRITE_SECTORS - ) - -1183 #i -GENERAL_DISK_DEBUG - - -1184 - `dbg_tf -( "Next sector..." ); - -1187 -wd --> -r_ -++; - -1188 -wd --> -cuoffs - = 0; - -1189 -wd --> -cu - = - `wd17xx_fd_ -wd, wd-> -r_ - ); - -1190 -wd --> -c - = 0xe295; - -1192 if! -wd --> -cu - ) - -1194 -wd --> -dayedt - = 20; - -1195 -wd --> -dius - = wd-> -y -; - -1196 -wd --> -cut - = -COP_NUFFINK -; - -1197 -wd --> -r_us - &(~ -WSF_DRQ -); - -1198 -wd --> - `rdrq -wd-> -drqg - ); - -1199 -eshdisks - = -SDL_TRUE -; - -1202 -wd --> -dayeddrq - = 180; - -1206 -wd --> -dayedt - = 32; - -1207 -wd --> -dius - = wd-> -y -; - -1208 -wd --> -cut - = -COP_NUFFINK -; - -1209 -wd --> -r_us - &(~ -WSF_DRQ -); - -1210 -wd --> - `rdrq -wd-> -drqg - ); - -1211 -eshdisks - = -SDL_TRUE -; - -1213 -wd --> -dayeddrq - = 32; - -1219 - } -} - -1221  - $miodisc_tdrq -* -md - ) - -1223  -miodisc - * -mdp - = (miodis*) -md -; - -1224 -mdp --> -drq - = 0; - -1225 - } -} - -1227  - $miodisc_rdrq -* -md - ) - -1229  -miodisc - * -mdp - = (miodis*) -md -; - -1230 -mdp --> -drq - = -MF_DRQ -; - -1231 - } -} - -1233  - $miodisc_tq -* -md - ) - -1235  -miodisc - * -mdp - = (miodis*) -md -; - -1237 -mdp --> -q - = 0; - -1238 if -mdp --> -us - & -MDSF_INTENA - ) - -1239 -mdp --> -ic --> -u -. -q - | -IRQF_DISK -; - -1240 - } -} - -1242  - $miodisc_rq -* -md - ) - -1244  -miodisc - * -mdp - = (miodis*) -md -; - -1246 -mdp --> -q - = -MDSF_INTRQ -; - -1247 -mdp --> -ic --> -u -. -q - &~ -IRQF_DISK -; - -1248 - } -} - -1250  - $miodisc_ - -miodisc - * -md -,  -wd17xx - * -wd -,  -mache - * -ic - ) - -1252 - `wd17xx_ - -wd - ); - -1253 -wd --> -tq - = -miodisc_tq -; - -1254 -wd --> -rq - = -miodisc_rq -; - -1255 -wd --> -qg - = (*) -md -; - -1256 -wd --> -tdrq - = -miodisc_tdrq -; - -1257 -wd --> -rdrq - = -miodisc_rdrq -; - -1258 -wd --> -drqg - = (*) -md -; - -1260 -md --> -us - = 0; - -1261 -md --> -q - = 0; - -1262 -md --> -drq - = 0; - -1263 -md --> -wd - = wd; - -1264 -md --> -ic - = oric; - -1265 -md --> -diskrom - = -SDL_TRUE -; - -1266 - } -} - -1268  - $miodisc_ - -miodisc - * -md - ) - -1270  -i -; - -1271  -i -=0; i< -MAX_DRIVES -; i++ ) - -1272 - `disk_eje - -md --> -ic -, -i - ); - -1273 - } -} - -1275  - $miodisc_ad - -miodisc - * -md -,  -addr - ) - -1278 if -addr - >= 0x310 ) && (ddr < 0x314 ) ) - -1279  - `wd17xx_ad - -md --> -wd -, -addr -&3 ); - -1281  -addr - ) - -1284  -md --> -q -|0x7f; - -1287  -md --> -drq -|0x7f; - -1290  - `v_ad -& -md --> -ic --> -v -, -addr - ); - -1294 - } -} - -1296  - $miodisc_wre - -miodisc - * -md -,  -addr -,  -da - ) - -1299 if -addr - >= 0x310 ) && (ddr < 0x314 ) ) - -1301 - `wd17xx_wre - -md --> -ic -, md-> -wd -, -addr -&3, -da - ); - -1305  -addr - ) - -1308 -md --> -us - = -da -; - -1311 if -da -& -MDSF_INTENA - ) && ( -md --> -q - == 0 ) ) - -1313 -md --> -ic --> -u -. -q - | -IRQF_DISK -; - -1315 -md --> -ic --> -u -. -q - &~ -IRQF_DISK -; - -1318 -md --> -wd --> -c_drive - = ( -da -& -MDSF_DRIVE -)>>5; - -1319 -md --> -wd --> -c_side - = ( -da -& -MDSF_SIDE -) ? 1 : 0; - -1320 -md --> -ic --> -romdis - = ( -da -& -MDSF_ROMDIS -? -SDL_FALSE - : -SDL_TRUE -; - -1321 -md --> -diskrom - = ( -da -& -MDSF_EPROM -? -SDL_FALSE - : -SDL_TRUE -; - -1325 -md --> -drq - = ( -da -& -MF_DRQ -); - -1329 - `v_wre -& -md --> -ic --> -v -, -addr -, -da - ); - -1332 - } -} - -1334  - $jasm_tdrq -* -j - ) - -1336  -jasm - * -jp - = (jasm *) -j -; - -1337 -jp --> -ic --> -u -. -q - | -IRQF_DISK -; - -1338 - } -} - -1340  - $jasm_rdrq -* -j - ) - -1342  -jasm - * -jp - = (jasm *) -j -; - -1343 -jp --> -ic --> -u -. -q - &~ -IRQF_DISK -; - -1344 - } -} - -1346  - $jasm_tq -* -j - ) - -1348 - } -} - -1350  - $jasm_rq -* -j - ) - -1352 - } -} - -1354  - $jasm_ - -jasm - * -j -,  -wd17xx - * -wd -,  -mache - * -ic - ) - -1356 - `wd17xx_ - -wd - ); - -1357 -wd --> -tq - = -jasm_tq -; - -1358 -wd --> -rq - = -jasm_rq -; - -1359 -wd --> -qg - = (*) -j -; - -1360 -wd --> -tdrq - = -jasm_tdrq -; - -1361 -wd --> -rdrq - = -jasm_rdrq -; - -1362 -wd --> -drqg - = (*) -j -; - -1364 -j --> -ay - = 0; - -1365 -j --> -romdis - = 0; - -1366 -j --> -wd - = wd; - -1367 -j --> -ic - = oric; - -1368 - } -} - -1370  - $jasm_ - -jasm - * -j - ) - -1372  -i -; - -1373  -i -=0; i< -MAX_DRIVES -; i++ ) - -1374 - `disk_eje - -j --> -ic -, -i - ); - -1375 - } -} - -1377  - $jasm_ad - -jasm - * -j -,  -addr - ) - -1380 if -addr - >= 0x3f4 ) && (ddr < 0x3f8 ) ) - -1381  - `wd17xx_ad - -j --> -wd -, -addr -&3 ); - -1383  -addr - ) - -1386  -j --> -wd --> -c_side - ? 1 : 0; - -1396  -j --> -ay -; - -1399  -j --> -romdis -; - -1403  - `v_ad -& -j --> -ic --> -v -, -addr - ); - -1407 - } -} - -1409  - $jasm_wre - -jasm - * -j -,  -addr -,  -da - ) - -1411 if -addr - >= 0x3f4 ) && (ddr < 0x3f8 ) ) - -1413 - `wd17xx_wre - -j --> -ic -, j-> -wd -, -addr -&3, -da - ); - -1417  -addr - ) - -1420 -j --> -wd --> -c_side - = -da -&1; - -1428 -j --> -ay - = -da -&1; - -1432 -j --> -romdis - = -da -&1; - -1433 -j --> -ic --> -romdis - = ( -da -!=0? -SDL_TRUE - : -SDL_FALSE -; - -1440 -j --> -wd --> -c_drive - = -addr -&3; - -1444 - `v_wre -& -j --> -ic --> -v -, -addr -, -da - ); - -1447 - } -} - -1450  - $avz_ - -avz - * -p -,  -mache - * -ic - ) - -1452  -i -; - -1454 -p --> -ay - = 0; - -1455 -p --> -romdis - = 1; - -1456 -p --> -exnsi - = 0; - -1457 -p --> -ic - = oric; - -1459  -i -=0; i< -MAX_DRIVES -; i++) - -1461 -p --> -drv -[ -i -]. -wre_ady - = 0x80; - -1462 -p --> -drv -[ -i -]. -vume - = 254; - -1463 -p --> -drv -[ -i -]. - - = 0; - -1464 -p --> -drv -[ -i -]. -m_ - = 0; - -1465 -p --> -drv -[ -i -]. -pimg - = -NULL -; - -1467 - } -} - -1469  - $avz_ - -avz - * -p - ) - -1471  -i -; - -1472  -i -=0; i< -MAX_DRIVES -; i++ ) - -1473 - `disk_eje - -p --> -ic -, -i - ); - -1474 - } -} - -1476  - $avz_ad - -avz - * -p -,  -addr - ) - -1478  -da - = 0; - -1479 -da - = - `disk_avz_ad - -p --> -ic -, -addr - ); - -1480 -p --> -ic --> -wddisk -. -cut - =-> -drv -[p->ic->wddisk. -c_drive -]. -m_ - ? -COP_READ_SECTOR - : -COP_NUFFINK -; - -1481  -da -; - -1482 - } -} - -1484  - $avz_wre - -avz - * -p -,  -addr -,  -da - ) - -1486 - `disk_avz_wre - -p --> -ic -, -addr -, -da - ); - -1487 -p --> -ic --> -wddisk -. -cut - =-> -drv -[p->ic->wddisk. -c_drive -]. -m_ - ? -COP_READ_SECTOR - : -COP_NUFFINK -; - -1488 - } -} - - @disk.h - -23  - #MAX_DRIVES - 4 - - ) - -26  - #MDSB_INTENA - 0 - - ) - -27  - #MDSF_INTENA - (1<< -MDSB_INTENA -) - - ) - -28  - #MDSB_ROMDIS - 1 - - ) - -29  - #MDSF_ROMDIS - (1<< -MDSB_ROMDIS -) - - ) - -30  - #MDSB_DENSITY - 3 - - ) - -31  - #MDSF_DENSITY - (1<< -MDSB_DENSITY -) - - ) - -32  - #MDSB_SIDE - 4 - - ) - -33  - #MDSF_SIDE - (1<< -MDSB_SIDE -) - - ) - -34  - #MDSF_DRIVE - 0x60 - - ) - -35  - #MDSB_EPROM - 7 - -36  - #MDSF_EPROM - (1<< -MDSB_EPROM -) - - ) - -37  - #MDSB_INTRQ - 7 - -38  - #MDSF_INTRQ - (1<< -MDSB_INTRQ -) - - ) - -41  - #MB_DRQ - 7 - - ) - -42  - #MF_DRQ - (1<< -MB_DRQ -) - - ) - -47  - #WSB_BUSY - 0 - - ) - -48  - #WSF_BUSY - (1<< -WSB_BUSY -) - - ) - -49  - #WSBI_PULSE - 1 - - ) - -50  - #WSFI_PULSE - (1<< -WSBI_PULSE -) - -51  - #WSB_DRQ - 1 - - ) - -52  - #WSF_DRQ - (1<< -WSB_DRQ -) - - ) - -53  - #WSBI_TRK0 - 2 - - ) - -54  - #WSFI_TRK0 - (1<< -WSBI_TRK0 -) - -55  - #WSB_LOSTDAT - 2 - - ) - -56  - #WSF_LOSTDAT - (1<< -WSB_LOSTDAT -) - - ) - -57  - #WSB_CRCERR - 3 - - ) - -58  - #WSF_CRCERR - (1<< -WSB_CRCERR -) - - ) - -59  - #WSBI_SEEKERR - 4 - - ) - -60  - #WSFI_SEEKERR - (1<< -WSBI_SEEKERR -) - -61  - #WSB_RNF - 4 - - ) - -62  - #WSF_RNF - (1<< -WSB_RNF -) - - ) - -63  - #WSBI_HEADL - 5 - - ) - -64  - #WSFI_HEADL - (1<< -WSBI_HEADL -) - -65  - #WSBR_RECTYP - 5 - - ) - -66  - #WSFR_RECTYP - (1<< -WSBR_RECTYP -) - -67  - #WSB_WRITEERR - 5 - - ) - -68  - #WSF_WRITEERR - (1<< -WSB_WRITEERR -) - - ) - -69  - #WSB_WRPROT - 6 - - ) - -70  - #WSF_WRPROT - (1<< -WSB_WRPROT -) - - ) - -71  - #WSB_NOTREADY - 7 - - ) - -72  - #WSF_NOTREADY - (1<< -WSB_NOTREADY -) - - ) - -75  - #PRAV_DISK_OFFSET - 0x310 - - ) - -77  - #PRAV_SECTORS_PER_TRACK - 16 - - ) - -78  - #PRAV_BYTES_PER_SECTOR - 256 - - ) - -79  - #PRAV_RAW_BYTES_PER_SECTOR - 374 - - ) - -80  - #PRAV_TRACKS_PER_DISK - 35 - - ) - -81  - #PRAV_RAW_TRACK_SIZE - 6200 - - ) - -86 - mCOP_NUFFINK -=0, - -87 - mCOP_READ_TRACK -, - -88 - mCOP_READ_SECTOR -, - -89 - mCOP_READ_SECTORS -, - -90 - mCOP_WRITE_TRACK -, - -91 - mCOP_WRITE_SECTOR -, - -92 - mCOP_WRITE_SECTORS -, - -93 - mCOP_READ_ADDRESS -, - -94 #ifde -MICRODISC_FUDGE - - -95 - mCOP_READ_SECTOR_FUDGE -, - -96 - mCOP_READ_SECTORS_FUDGE - - -103  - smfm - - -105 -Ut8 - * - mid_r -; - -106 -Ut8 - * - mda_r -; - -113  - sdiskimage - - -115 -St16 - - mdrivum -; - -116 -Ut32 - - mnumacks -; - -117 -Ut32 - - mnumsides -; - -118 -Ut32 - - mgeomry -; - -119 -St16 - - mchedack -; - -120 -St16 - - mchedside -; - -121 -Ut32 - - mnums -; - -122  -mfm - - m -[32]; - -123 -Ut8 - * - mwimage -; - -124 -Ut32 - - mwimag -; - -125 -SDL_bo - - mmodifd -; - -126 -St32 - - mmodifd_time -; - -127  - mfame -[4096+512]; - -131  - swd17xx - - -133 -Ut8 - - mr_us -; - -134 -Ut8 - - mr_ack -; - -135 -Ut8 - - mr_ -; - -136 -Ut8 - - mr_da -; - -137 -Ut8 - - mc_drive -; - -138 -Ut8 - - mc_side -; - -139 -Ut8 - - mc_ack -; - -140 -Ut8 - - mc_ -; - -141 -Ut8 - - my -; - -142 -SDL_bo - - mϡ__ -; - -143 (* - mtq -)(*); - -144 (* - mrq -)(*); - -145 * - mqg -; - -146 (* - mtdrq -)(*); - -147 (* - mrdrq -)(*); - -148 * - mdrqg -; - -149  -diskimage - * - mdisk -[ -MAX_DRIVES -]; - -150  - mcut -; - -151  -mfm - * - mcu -; - -152  - mcu -; - -153  - mcuoffs -; - -154  - mdayedt -; - -155  - mdayeddrq -; - -156  - mdius -; - -157  - mddus -; - -158 -Ut16 - - mc -; - -162  - smiodisc - - -164 -Ut8 - - mus -; - -165 -Ut8 - - mq -; - -166 -Ut8 - - mdrq -; - -167  -wd17xx - * - mwd -; - -168  -mache - * - mic -; - -169 -SDL_bo - - mdiskrom -; - -174  - sjasm - - -176 -Ut8 - - may -; - -177 -Ut8 - - mromdis -; - -178  -wd17xx - * - mwd -; - -179  -mache - * - mic -; - -183  - savz_drive - - -185 -Ut8 - - mimage -[ -PRAV_TRACKS_PER_DISK -][ -PRAV_RAW_TRACK_SIZE -]; - -186 -Ut8 - - mvume -; - -187 -Ut8 - - m -; - -188 -Ut8 - - mm_ -; - -189 -Ut8 - - mwre_ady -; - -190 -Ut16 - - mby -; - -191 -Ut16 - - mhf_ack -; - -192 -Ut8 - * - m_r -; - -193 -SDL_bo - - mdty -; - -194  -diskimage - * - mpimg -; - -195 -SDL_bo - - m -; - -198  - savz - - -200 -Ut8 - - may -; - -201 -Ut8 - - mromdis -; - -202 -Ut16 - - mexnsi -; - -203  -mache - * - mic -; - -204  -avz_drive - - mdrv -[ -MAX_DRIVES -]; - -208 -SDL_bo - -diskimage_ld - -mache - * -ic -, * -ame -,  -drive - ); - -209 -SDL_bo - -diskimage_ve - -mache - * -ic -, * -ame -,  -drive - ); - -210  -diskimage_chck - -diskimage - * -dimg -,  -ack -,  -side - ); - -211  -mfm - * -wd17xx_fd_ - -wd17xx - * -wd -, -Ut8 - -cid - ); - -214  -wd17xx_ticktock - -wd17xx - * -wd -,  -cyes - ); - -217  -miodisc_ - -miodisc - * -md -,  -wd17xx - * -wd -,  -mache - * -ic - ); - -218  -miodisc_ - -miodisc - * -md - ); - -219  -miodisc_ad - -miodisc - * -md -,  -addr - ); - -220  -miodisc_wre - -miodisc - * -md -,  -addr -,  -da - ); - -223  -jasm_ - -jasm - * -j -,  -wd17xx - * -wd -,  -mache - * -ic - ); - -224  -jasm_ - -jasm - * -j - ); - -225  -jasm_ad - -jasm - * -j -,  -addr - ); - -226  -jasm_wre - -jasm - * -j -,  -addr -,  -da - ); - -229  -avz_ - -avz - * -p -,  -mache - * -ic - ); - -230  -avz_ - -avz - * -p - ); - -231  -avz_ad - -avz - * -p -,  -addr - ); - -232  -avz_wre - -avz - * -p -,  -addr -,  -da - ); - - @disk_pravetz.c - -26  - ~ - -27  - ~ - -28  - ~ - -30  - ~"syem.h -" - -31  - ~"6502.h -" - -32  - ~"v.h -" - -33  - ~"8912.h -" - -34  - ~"gui.h -" - -35  - ~"disk.h -" - -36  - ~"disk_avz.h -" - -37  - ~"mڙ.h -" - -38  - ~"6551.h -" - -39  - ~"mache.h -" - -41  - #GENERAL_DISK_DEBUG - 0 - - ) - -43 #i -GENERAL_DISK_DEBUG - - -44  - gϡ_ack - = -1; - -45  - gϡ_ - = -1; - -48  -Ut8 - -disk_avz_ad_ed -( -mache - * -ic -); - -49  -disk_avz_wre_ed -( -mache - * -ic -, -Ut8 - -da -); - -50  -disk_avz_swch -( -mache - * -ic -, -Ut16 - -addr -); - -52 -Ut8 - - $disk_avz_ad -( -mache - * -ic -, -Ut16 - -addr -) - -54 - `disk_avz_swch -( -ic -, -addr -- -PRAV_DISK_OFFSET -); - -56  (!( -addr - & 1))? - `disk_avz_ad_ed -( -ic -) : 0; - -57 - } -} - -59  - $disk_avz_wre -( -mache - * -ic -, -Ut16 - -addr -, -Ut8 - -da -) - -61 - `disk_avz_swch -( -ic -, -addr -- -PRAV_DISK_OFFSET -); - -63 if( -addr - & 1) - -65 - `disk_avz_wre_ed -( -ic -, -da -); - -67 - } -} - -70  - gve -[16] = - -76  - ge -[256] = - -112  - $disk_avz_upde_posi - ( -avz_drive - * -drv -) - -114 i( -drv --> -m_ -) - -116 -drv --> -by - = (1 + drv->by% -PRAV_RAW_TRACK_SIZE -; - -118 - } -} - -120 -Ut8 - - $disk_avz_image_w_by -( -mache - * -ic -,  -drive -, -Ut16 - -t_idx -, Ut16 -s_idx -, Ut16 -b_idx -) - -122  -f_pos -; - -124  -Ut8 - -d -; - -125  -Ut8 - -e -; - -126  -Ut8 - -w -; - -127  -Ut8 - -check -; - -129  -avz_drive - * -drv - = & -ic --> -avz -.drv[ -drive -]; - -131 -w - = 0xFF; - -133  -b_idx -) - -165 -check - = -drv --> -vume -; - -166  0xAA | ( -drv --> -vume - >> 1); - -170  0xAA | -drv --> -vume -; - -174 -check - ^ -t_idx -; - -175  0xAA | ( -t_idx - >> 1); - -179  0xAA | -t_idx -; - -183 -check - ^ -s_idx -; - -184  0xAA | ( -s_idx - >> 1); - -188  0xAA | -s_idx -; - -192  0xAA | ( -check - >> 1); - -196  0xAA | -check -; - -215 -e - = 0; - -218 -f_pos - = (256 * 16 * -t_idx -+ (256 * -ve -[ -s_idx -]); - -219 i( -drv --> -pimg -) - -220 -drv --> -_r - = &drv-> -pimg --> -wimage -[ -f_pos -]; - -222 -drv --> -_r - = -NULL -; - -227  -e -[ -e - & 0x3F]; - -230 -b_idx - -= 28; - -232 i( -b_idx - >= 0x56) - -235 -d - = -drv --> -_r -[ -b_idx - - 0x56]; - -236 -d - = old >> 2; - -237 -e - ^ -d -; - -238 -w - = -e -[ -e - & 0x3F]; - -239 -e - = -d -; - -244 -d - = ( -drv --> -_r -[ -b_idx -] & 0x01) << 1; - -245 -d - |( -drv --> -_r -[ -b_idx -] & 0x02) >> 1; - -246 -d - |( -drv --> -_r -[ -b_idx - + 0x56] & 0x01) << 3; - -247 -d - |( -drv --> -_r -[ -b_idx - + 0x56] & 0x02) << 1; - -248 -d - |( -drv --> -_r -[ -b_idx - + 0xAC] & 0x01) << 5; - -249 -d - |( -drv --> -_r -[ -b_idx - + 0xAC] & 0x02) << 3; - -250 -e - ^ -d -; - -251 -w - = -e -[ -e - & 0x3F]; - -252 -e - = -d -; - -257  -w -; - -258 - } -} - -265  -Ut8 - - $disk_avz_adby -( -mache - * -ic -) - -267  -avz_drive - * -drv - = & -ic --> -avz -.drv[ic-> -wddisk -. -c_drive -]; - -270 i(! -drv --> -pimg -) - -273 - `disk_avz_upde_posi -( -drv -); - -276 #i -GENERAL_DISK_DEBUG - - -277 if( -ϡ_ - ! -drv --> -by - / -PRAV_RAW_BYTES_PER_SECTOR - || -ϡ_ack - !drv-> -hf_ack -) - -279 - `tf -("{R} fdu: T:%.2d S:%.2X.%.3d [%.2X]\n", - -280 -drv --> -hf_ack - / 2, - -281 -drv --> -by - / -PRAV_RAW_BYTES_PER_SECTOR -, - -282 -drv --> -by - % -PRAV_RAW_BYTES_PER_SECTOR -, - -283 -drv --> -image -[drv-> -hf_ack - / 2][drv-> -by -]); - -284 -ϡ_ - = -drv --> -by - / -PRAV_RAW_BYTES_PER_SECTOR -; - -285 -ϡ_ack - = -drv --> -hf_ack -; - -290  -drv --> -image -[drv-> -hf_ack - / 2][drv-> -by -]; - -291 - } -} - -298  -Ut8 - - $disk_avz_ad_ed -( -mache - * -ic -) - -300  -avz_drive - * -drv - = & -ic --> -avz -.drv[ic-> -wddisk -. -c_drive -]; - -302 i(! -drv --> -wre_ady -) - -304 -drv --> -wre_ady - = 0x80; - -307  -drv --> - -) - -310  - `disk_avz_adby -( -ic -); - -313  -drv --> - - | drv-> -m_ -; - -316  -drv --> -wre_ady -; - -320 - } -} - -322  -Ut8 - - gmp__bufr -[ -PRAV_BYTES_PER_SECTOR - + 2]; - -324  - $disk_avz_wre_image -( -avz_drive - * -d_r -) - -326 -Ut8 - -e -; - -327 -Ut8 - -s_idx -; - -329  -_ch_cou -; - -331  -t_idx -; - -332  -b_idx -; - -333  -tb_idx -; - -334  -_cou -, -f_pos -; - -336 i(! -d_r -) - -339 i(! -d_r --> -dty -) - -342 -tb_idx - = 0; - -343  -t_idx - = 0;_idx < -PRAV_TRACKS_PER_DISK -;_idx++) - -345 -_cou - = 16; - -347 -fd_ -: - -351 -_ch_cou - = 0; - -352 0xD5 ! -d_r --> -image -[ -t_idx -][ -tb_idx -]) - -354 -tb_idx - = (tb_idx + 1% -PRAV_RAW_TRACK_SIZE -; - -355 i(++ -_ch_cou - > -PRAV_RAW_TRACK_SIZE -) ; - -358 -tb_idx - = (tb_idx + 1% -PRAV_RAW_TRACK_SIZE -; - -359 i(0xAA ! -d_r --> -image -[ -t_idx -][ -tb_idx -]) - -361 -tb_idx - = (tb_idx + 1% -PRAV_RAW_TRACK_SIZE -; - -362  -fd_ -; - -365 -tb_idx - = (tb_idx + 1% -PRAV_RAW_TRACK_SIZE -; - -366 i(0x96 ! -d_r --> -image -[ -t_idx -][ -tb_idx -]) - -368 -tb_idx - = (tb_idx + 1% -PRAV_RAW_TRACK_SIZE -; - -369  -fd_ -; - -375 -tb_idx - = (tb_idx + 5% -PRAV_RAW_TRACK_SIZE -; - -378 -s_idx - = 0x55 | ( -d_r --> -image -[ -t_idx -][ -tb_idx -] << 1); - -379 -tb_idx - = (tb_idx + 1% -PRAV_RAW_TRACK_SIZE -; - -380 -s_idx - & -d_r --> -image -[ -t_idx -][ -tb_idx -]; - -381 -tb_idx - = (tb_idx + 1% -PRAV_RAW_TRACK_SIZE -; - -385 0xD5 ! -d_r --> -image -[ -t_idx -][ -tb_idx -]) - -386 -tb_idx - = (tb_idx + 1% -PRAV_RAW_TRACK_SIZE -; - -388 -tb_idx - = (tb_idx + 1% -PRAV_RAW_TRACK_SIZE -; - -389 i(0xAA ! -d_r --> -image -[ -t_idx -][ -tb_idx -]) - -391 -tb_idx - = (tb_idx + 1% -PRAV_RAW_TRACK_SIZE -; - -392  -fd_ -; - -395 -tb_idx - = (tb_idx + 1% -PRAV_RAW_TRACK_SIZE -; - -396 i(0xAD ! -d_r --> -image -[ -t_idx -][ -tb_idx -]) - -398 -tb_idx - = (tb_idx + 1% -PRAV_RAW_TRACK_SIZE -; - -399  -fd_ -; - -404 -tb_idx - = (tb_idx + 1% -PRAV_RAW_TRACK_SIZE -; - -405 -e - = 0; - -407  -b_idx - = 0; b_idx < 342; b_idx++) - -409 -e - ^ -e -[ -d_r --> -image -[ -t_idx -][ -tb_idx -]]; - -410 -tb_idx - = (tb_idx + 1% -PRAV_RAW_TRACK_SIZE -; - -412 i( -b_idx - >= 0x56) - -415 -mp__bufr -[ -b_idx - - 0x56] |( -e - << 2); - -420 -mp__bufr -[ -b_idx -] = ( -e - & 0x01) << 1; - -421 -mp__bufr -[ -b_idx -] |( -e - & 0x02) >> 1; - -422 -mp__bufr -[ -b_idx - + 0x56] = ( -e - & 0x04) >> 1; - -423 -mp__bufr -[ -b_idx - + 0x56] |( -e - & 0x08) >> 3; - -424 -mp__bufr -[ -b_idx - + 0xAC] = ( -e - & 0x10) >> 3; - -425 -mp__bufr -[ -b_idx - + 0xAC] |( -e - & 0x20) >> 5; - -430 -f_pos - = ( -PRAV_BYTES_PER_SECTOR - * -PRAV_SECTORS_PER_TRACK - * -t_idx -) + - -431 ( -PRAV_BYTES_PER_SECTOR - * -ve -[ -s_idx -]); - -433 - `memy -(& -d_r --> -pimg --> -wimage -[ -f_pos -], -mp__bufr -, -PRAV_BYTES_PER_SECTOR -); - -434 -d_r --> -pimg --> -modifd - = -SDL_TRUE -; - -435 -d_r --> -pimg --> -modifd_time - = 0; - -436 -_cou ---; - -438 i( -_cou -) - -439  -fd_ -; - -442 -d_r --> -dty - = -SDL_FALSE -; - -443 - } -} - -449  - $disk_avz_wreby -( -mache - * -ic -, -Ut8 - -w_by -) - -451  -avz_drive - * -drv - = & -ic --> -avz -.drv[ic-> -wddisk -. -c_drive -]; - -452 - `disk_avz_upde_posi -( -drv -); - -455 i(! -drv --> -pimg -) - -458 i( -drv --> - -) - -462 i( -w_by - < 0x96) - -465 -drv --> -dty - = -SDL_TRUE -; - -466 -drv --> -image -[drv-> -hf_ack - / 2][drv-> -by -] = -w_by -; - -469 #i -GENERAL_DISK_DEBUG - - -470 if( -ϡ_ - ! -drv --> -by - / -PRAV_RAW_BYTES_PER_SECTOR - || -ϡ_ack - !drv-> -hf_ack -) - -472 - `tf -("{W} fdu: T:%.2d S:%.2X.%.3d [%.2X]\n", - -473 -drv --> -hf_ack - / 2, - -474 -drv --> -by - / -PRAV_RAW_BYTES_PER_SECTOR -, - -475 -drv --> -by - % -PRAV_RAW_BYTES_PER_SECTOR -, - -476 -w_by -); - -477 -ϡ_ - = -drv --> -by - / -PRAV_RAW_BYTES_PER_SECTOR -; - -478 -ϡ_ack - = -drv --> -hf_ack -; - -482 - } -} - -489  - $disk_avz_wre_ed -( -mache - * -ic -, -Ut8 - -w_by -) - -491  -avz_drive - * -drv - = & -ic --> -avz -.drv[ic-> -wddisk -. -c_drive -]; - -493 i(3 = -drv --> - -) - -495 i( -drv --> -m_ -) - -497 i( -drv --> -wre_ady -) - -499 - `disk_avz_wreby -( -ic -, -w_by -); - -500 -drv --> -wre_ady - = 0; - -504 - } -} - -506  - $disk_avz_swch - ( -mache - * -ic -, -Ut16 - -addr -) - -508  -avz_drive - * -drv - = & -ic --> -avz -.drv[ic-> -wddisk -. -c_drive -]; - -510  -addr - & 0xF) - -513 -drv --> -m_ - = 0; - -514 - `disk_avz_wre_image -( -drv -); - -518 -drv --> -m_ - = 0x20; - -524 i( -ic --> -wddisk -. -c_drive - !( -addr -&1)) - -526 - `disk_avz_wre_image -( -drv -); - -527 -ic --> -wddisk -. -c_drive - = -addr -&1; - -532 -drv --> - - &= 0xFE; - -536 -drv --> - - |= 0x01; - -540 -drv --> - - &= 0xFD; - -544 -drv --> - - |= 0x02; - -549  -pha - = ( -addr - & 0x06) >> 1; - -552 i( -addr - & 0x01) - -554 -pha - += 4; - -555 -pha - -( -drv --> -hf_ack - % 4); - -556 -pha - %= 4; - -558 i(1 = -pha -) - -560 i( -drv --> -hf_ack - < (2 * -PRAV_TRACKS_PER_DISK - - 2)) - -562 -drv --> -hf_ack -++; - -565 i(3 = -pha -) - -567 i( -drv --> -hf_ack - > 0) - -569 -drv --> -hf_ack ---; - -576 - } -} - - @disk_pravetz.h - -26 #ide -__disk_avz_h__ - - -27  - #__disk_avz_h__ - - - ) - -29 -Ut8 - -disk_avz_ad -( -mache - * -ic -, -Ut16 - -addr -); - -30  -disk_avz_wre -( -mache - * -ic -, -Ut16 - -addr -, -Ut8 - -da -); - -31 -Ut8 - -disk_avz_image_w_by -( -mache - * -ic -,  -drive -, -Ut16 - -t_idx -, Ut16 -s_idx -, Ut16 -b_idx -); - -32  -disk_avz_wre_image -( -avz_drive - * -d_r -); - - @filereq.h - -24 - mFR_DISKLOAD -=0, - -25 - mFR_DISKSAVE -, - -26 - mFR_TAPELOAD -, - -27 - mFR_TAPESAVETAP -, - -28 - mFR_TAPESAVEORT -, - -29 - mFR_ROMS -, - -30 - mFR_SNAPSHOTLOAD -, - -31 - mFR_SNAPSHOTSAVE -, - -32 - mFR_KEYMAPPINGLOAD -, - -33 - mFR_KEYMAPPINGSAVE -, - -34 - mFR_OTHER - - -37 -SDL_bo - -_feque - -mache - * -ic - ); - -38  -shut_feque - -mache - * -ic - ); - -39 -SDL_bo - -feque - -mache - * -ic -, * -t -, * -th -, * -ame -,  -ty - ); - - @filereq_amiga.c - -22  - #__USE_INLINE__ - - - ) - -24  - ~ - -25  - ~ - -27  - ~ - -28  - ~ - -29  - ~ - -31  - ~"syem.h -" - -32  - ~"6502.h -" - -33  - ~"v.h -" - -34  - ~"8912.h -" - -35  - ~"disk.h -" - -36  - ~"gui.h -" - -37  - ~"mڙ.h -" - -38  - ~"6551.h -" - -39  - ~"mache.h -" - -40  - ~"feq.h -" - -42  -Libry - * - gABa - = -NULL -; - -43  -FeReque - * - gq - = -NULL -; - -45 #ifde -__amigaos4__ - - -46  -AIFa - * - gIA - = -NULL -; - -49 -SDL_bo - - $_feque - -mache - * -ic - ) - -51 -ABa - = - `OnLibry -( -CONST_STRPTR -) -AName -, 39 ); - -52 if! -ABa - )  -SDL_FALSE -; - -54 #ifde -__amigaos4__ - - -55 -IA - = ( -AIFa - *) - `GI - -ABa -, "ma", 1, -NULL - ); - -56 if! -IA - )  -SDL_FALSE -; - -59 -q - = ( -FeReque - *) - `AocARequeTags - -ASL_FeReque -, -TAG_DONE - ); - -60 if! -q - )  -SDL_FALSE -; - -62  -SDL_TRUE -; - -63 - } -} - -65  - $shut_feque - -mache - * -ic - ) - -67 if -q - ) - `FeAReque -(eq ); - -68 #ifde -__amigaos4__ - - -69 if -IA - ) - `DrI -( -I - *)IAsl ); - -71 if -ABa - ) - `CloLibry -( AslBase ); - -72 - } -} - -74 -SDL_bo - - $feque - -mache - * -ic -, * -t -, * -th -, * -ame -,  -ty - ) - -76 * -t -, - -[16*2+2]; - -77 -BOOL - -dovemode - = -FALSE -; - -79  -ty - ) - -81  -FR_DISKSAVE -: - -82 -dovemode - = -TRUE -; - -83  -FR_DISKLOAD -: - -84 -t - = "#?.dsk"; - -87  -FR_TAPESAVETAP -: - -88 -dovemode - = -TRUE -; - -89 -t - = "#?.tap"; - -92  -FR_TAPESAVEORT -: - -93 -dovemode - = -TRUE -; - -94 -t - = "#?.ort"; - -97  -FR_TAPELOAD -: - -98 -t - = "#?.(tap|ort|wav)"; - -101  -FR_ROMS -: - -102 -t - = "#?.rom"; - -105  -FR_SNAPSHOTSAVE -: - -106 -dovemode - = -TRUE -; - -107  -FR_SNAPSHOTLOAD -: - -108 -t - = "#?.sna"; - -111  -FR_KEYMAPPINGSAVE -: - -112 -dovemode - = -TRUE -; - -113  -FR_KEYMAPPINGLOAD -: - -114 -t - = "#?.kma"; - -118 -t - = -NULL -; - -122 if -t - ) - `PPNoCa -( -CONST_STRPTR -, ( -UBYTE - *) - -, 16*2+2 ); - -124 if! - `ARequeTags - -q -, - -125 -ASLFR_TText -, -t -, - -126 -ASLFR_InlDw -, -th -, - -127 -ASLFR_InlFe -, -ame -, - -128 -ASLFR_DoPs -, -t - ! -NULL -, - -129 -ASLFR_RejeIcs -, -TRUE -, - -130 -ASLFR_DoSaveMode -, -dovemode -, - -131 -t - ? -ASLFR_AcP - : -TAG_IGNORE -, - -, - -132 -t - ? -ASLFR_InlP - : -TAG_IGNORE -,at, - -133 -TAG_DONE - ) ) - -134  -SDL_FALSE -; - -136 - `y - -th -, (cڡ *) -q --> -_Dw -, 4096 );ath[4095] = 0; - -137 - `y - -ame -, (cڡ *) -q --> -_Fe -, 512 ); fname[511] = 0; - -139  -SDL_TRUE -; - -140 - } -} - - @filereq_beos.cpp - -22  - ~ - -23  - ~ - -24  - ~ - -25  - ~ - -27  - ~ - -28  - ~ - -29  - ~ - -30  - ~ - -33  - ~"syem.h -" - -34  - ~"6502.h -" - -35  - ~"v.h -" - -36  - ~"8912.h -" - -37  - ~"disk.h -" - -38  - ~"gui.h -" - -39  - ~"mڙ.h -" - -40  - ~"6551.h -" - -41  - ~"mache.h -" - -42  - ~"feq.h -" - -46 as - cPLoݔ - : -public - -BLoݔ - { - -47 -public -: - -48 -PLoݔ -(); - -49 -vtu - ~ -PLoݔ -(); - -50 -vtu -  -MesgeReived -( -BMesge -* -mesge -); - -52  -Wa -(); - -53 -SDL_bo - - $DoIt -(cڡ {  -fDoIt -; }; - -54  - $GRef -( -y_f - & -f -cڡ {e -fRef -; - } -}; - -56 -ive -: - -57 -m_id - -fSem -; - -58 -y_f - -fRef -; - -59 -SDL_bo - -fDoIt -; - -63 - gPLoݔ -:: - $PLoݔ -() - -64 : - `BLoݔ -("PanelLooper"), - -65 - $fDoIt -( -SDL_FALSE -) - -67 -fSem - = - `_m -(0, "PanelLooperock"); - -68 - } -} - -71 - gPLoݔ -::~ - $PLoݔ -() - -73 - `de_m -( -fSem -); - -74 - } -} - -78 - gPLoݔ -:: - $MesgeReived -( -BMesge -* -mesge -) - -81  -mesge --> -wh -) { - -82  -B_SAVE_REQUESTED -: - -83 -mesge --> - `FdRef -("fs", & -fRef -); - -84 -fDoIt - = -SDL_TRUE -; - -86  -B_REFS_RECEIVED -: - -87 -mesge --> - `FdRef -("fs", & -fRef -); - -88 -fDoIt - = -SDL_TRUE -; - -90  -B_CANCEL -: - -94 - `a_m -( -fSem -); - -95 - } -} - -99 - gPLoݔ -:: - $Wa -() - -101 - `acque_m -( -fSem -); - -102 - } -} - -105 -SDL_bo - - $_feque - -mache - * -ic - ) - -107  -SDL_TRUE -; - -108 - } -} - -110  - $shut_feque - -mache - * -ic - ) - -112 - } -} - -114 -SDL_bo - - $feque - -mache - * -ic -, * -t -, * -th -, * -ame -,  -ty - ) - -116 -BFeP - * -l -; - -117 -PLoݔ - * -loݔ - = -w - - `PLoݔ -(); - -118 -loݔ --> - `Run -(); - -119 -SDL_bo - -t -; - -121 * -t -; - -122 -bo - -dovemode - = -l -; - -124  -ty - ) - -126  -FR_DISKSAVE -: - -127 -dovemode - = -ue -; - -128  -FR_DISKLOAD -: - -129 -t - = "*.dsk"; - -133  -FR_TAPESAVETAP -: - -134  -FR_TAPESAVEORT -: - -135 -dovemode - = -ue -; - -136  -FR_TAPELOAD -: - -137 -t - = "*.tap"; - -140  -FR_ROMS -: - -141 -t - = "*.rom"; - -144  -FR_SNAPSHOTSAVE -: - -145 -dovemode - = -ue -; - -146  -FR_SNAPSHOTLOAD -: - -147 -t - = "*.sna"; - -150  -FR_KEYMAPPINGSAVE -: - -151 -dovemode - = -ue -; - -152  -FR_KEYMAPPINGLOAD -: - -153 -t - = "*.kma"; - -157 -t - = -NULL -; - -163 -l - = -w - - `BFeP -( -dovemode - ? -B_SAVE_PANEL - : -B_OPEN_PANEL -); - -164 -l --> - `STg -( - `BMesng -( -loݔ -)); - -166 i( -th -) - -167 -l --> - `SPDey -( -th -); - -169 -l --> - `Show -(); - -171 -loݔ --> - `Wa -(); - -172 -t - = -loݔ --> - `DoIt -(); - -173 -y_f - -f -; - -174 -loݔ --> - `GRef -( -f -); - -176 -de - -l -; - -177 -loݔ --> - `Lock -(); - -178 -loݔ --> - `Qu -(); - -180 i( -t -) { - -181 -BPh - - `p -(& -f -); - -182 - `y - -ame -, -p -. - `Lf -(), 512 ); -th -[511] = 0; - -183 -p -. - `GPt -(&p); - -184 - `y - -th -, -p -. - `Ph -(), 4096 );ath[4095] = 0; - -187  -t -; - -188 - } -} - - @filereq_gtk.c - -22  - ~ - -23  - ~ - -24  - ~ - -25  - ~ - -26  - ~ - -27  - ~ - -29  - ~ - -31  - ~"syem.h -" - -32  - ~"6502.h -" - -33  - ~"v.h -" - -34  - ~"8912.h -" - -35  - ~"gui.h -" - -36  - ~"disk.h -" - -37  - ~"mڙ.h -" - -38  - ~"6551.h -" - -39  - ~"mache.h -" - -40  - ~"feq.h -" - -42 -SDL_bo - -fusn -; - -43  -toggfusn - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -45 -SDL_bo - - $_feque - -mache - * -ic - ) - -47 - `gtk_ -(0, -NULL -); - -48  -SDL_TRUE -; - -49 - } -} - -51  - $shut_feque - -mache - * -ic - ) - -53 - } -} - -61 -SDL_bo - - $feque - -mache - * -ic -, * -t -, * -th -, * -ame -,  -ty - ) - -63 -GtkWidg - * -dlog -; - -64 -SDL_bo - -su - = -SDL_FALSE -; - -65 -GtkFeChoorAi - -ai - = -GTK_FILE_CHOOSER_ACTION_OPEN -; - -66 -GtkFeFr - * -fr - = -NULL -, * -lfr - = - `gtk_fe_fr_w -(); - -67 -SDL_bo - -was_fusn - = -fusn -; - -69 i( -fusn -) - -70 - `toggfusn -( -ic -, -NULL -, 0); - -72 - `gtk_fe_fr_t_me -( -lfr -, "All files"); - -73 - `gtk_fe_fr_add_n -( -lfr -, "*"); - -75  -ty - ) - -77  -FR_DISKSAVE -: - -78 -ai - = -GTK_FILE_CHOOSER_ACTION_SAVE -; - -79  -FR_DISKLOAD -: - -80 -fr - = - `gtk_fe_fr_w -(); - -81 - `gtk_fe_fr_t_me -( -fr -, "Disk images"); - -82 - `gtk_fe_fr_add_n -( -fr -, "*.[Dd][Ss][Kk]"); - -85  -FR_TAPESAVETAP -: - -86 -ai - = -GTK_FILE_CHOOSER_ACTION_SAVE -; - -87 -fr - = - `gtk_fe_fr_w -(); - -88 - `gtk_fe_fr_t_me -( -fr -, ".tap files"); - -89 - `gtk_fe_fr_add_n -( -fr -, "*.[Tt][Aa][Pp]"); - -92  -FR_TAPESAVEORT -: - -93 -ai - = -GTK_FILE_CHOOSER_ACTION_SAVE -; - -94 -fr - = - `gtk_fe_fr_w -(); - -95 - `gtk_fe_fr_t_me -( -fr -, ".ort files"); - -96 - `gtk_fe_fr_add_n -( -fr -, "*.[Oo][Rr][Tt]"); - -99  -FR_TAPELOAD -: - -100 -fr - = - `gtk_fe_fr_w -(); - -101 - `gtk_fe_fr_t_me -( -fr -, "Tape images"); - -102 - `gtk_fe_fr_add_n -( -fr -, "*.[Tt][Aa][Pp]"); - -103 - `gtk_fe_fr_add_n -( -fr -, "*.[Ww][Aa][Vv]"); - -104 - `gtk_fe_fr_add_n -( -fr -, "*.[Oo][Rr][Tt]"); - -107  -FR_ROMS -: - -108 -fr - = - `gtk_fe_fr_w -(); - -109 - `gtk_fe_fr_t_me -( -fr -, "ROM images"); - -110 - `gtk_fe_fr_add_n -( -fr -, "*.[Rr][Oo][Mm]"); - -113  -FR_SNAPSHOTSAVE -: - -114 -ai - = -GTK_FILE_CHOOSER_ACTION_SAVE -; - -115  -FR_SNAPSHOTLOAD -: - -116 -fr - = - `gtk_fe_fr_w -(); - -117 - `gtk_fe_fr_t_me -( -fr -, "Snapshot files"); - -118 - `gtk_fe_fr_add_n -( -fr -, "*.[Ss][Nn][Aa]"); - -121  -FR_KEYMAPPINGSAVE -: - -122 -ai - = -GTK_FILE_CHOOSER_ACTION_SAVE -; - -123  -FR_KEYMAPPINGLOAD -: - -124 -fr - = - `gtk_fe_fr_w -(); - -125 - `gtk_fe_fr_t_me -( -fr -, "Keyboard Mapping files"); - -126 - `gtk_fe_fr_add_n -( -fr -, "*.[Kk][Mm][Aa]"); - -133 -dlog - = - `gtk_fe_choor_dlog_w -( -t -, - -134 -NULL -, - -135 -ai -, - -136 #i -GTK_MAJOR_VERSION - <= 2 - -137 -GTK_STOCK_CANCEL -, -GTK_RESPONSE_CANCEL -, - -138 -GTK_STOCK_OPEN -, -GTK_RESPONSE_ACCEPT -, - -140 "_Cl", -GTK_RESPONSE_CANCEL -, - -141 "_On", -GTK_RESPONSE_ACCEPT -, - -143 -NULL -); - -145 - `gtk_fe_choor_t_cut_fd -( - `GTK_FILE_CHOOSER -( -dlog -), -th -); - -146 i( -ai - = -GTK_FILE_CHOOSER_ACTION_SAVE -) - -147 - `gtk_fe_choor_t_cut_me -( - `GTK_FILE_CHOOSER -( -dlog -), -ame -); - -149 i( -fr -) - -150 - `gtk_fe_choor_add_fr -( - `GTK_FILE_CHOOSER -( -dlog -), -fr -); - -151 - `gtk_fe_choor_add_fr -( - `GTK_FILE_CHOOSER -( -dlog -), -lfr -); - -153 i( - `gtk_dlog_run -( - `GTK_DIALOG - ( -dlog -)= -GTK_RESPONSE_ACCEPT -) - -155 * -fame -; - -156  -i -; - -157 -fame - = - `gtk_fe_choor_g_fame - ( - `GTK_FILE_CHOOSER - ( -dlog -)); - -158 - `y - -th -, -fame -, 4096 );ath[4095] = 0; - -159 -i - = - ` -( -th -)-1; - -160  -i - >= 0) - -162 i( -th -[ -i -] = -PATHSEP -) ; - -163 -i ---; - -165 - `y - -ame -, & -th -[ -i -+1], 512 ); fname[511] = 0; - -166 -th -[ -i -+1] = 0; - -167 - `g_ -( -fame -); - -168 -su - = -SDL_TRUE -; - -171 - `gtk_widg_deroy -( -dlog -); - -172  - `gtk_evts_ndg -()) - -173 - `gtk_ma_i -(); - -175 i( -was_fusn -) - -176 - `toggfusn -( -ic -, -NULL -, 0); - -178  -su -; - -179 - } -} - - @filereq_sdl.c - -22  - ~ - -23  - ~ - -24  - ~ - -25 #ide -_MSC_VER - - -26  - ~ - -28  - ~ - -30  - ~"syem.h -" - -31  - ~"6502.h -" - -32  - ~"v.h -" - -33  - ~"8912.h -" - -34  - ~"gui.h -" - -35  - ~"disk.h -" - -36  - ~"mڙ.h -" - -37  - ~"6551.h -" - -38  - ~"mache.h -" - -39  - ~"feq.h -" - -42 -SDL_Sur - * -sn -; - -43  -xtze - * -tz -[ -NUM_TZ -]; - -46  - sq_t - - -48  - mme -[512]; - -49  - mshowme -[40]; - -50 -SDL_bo - - misd -; - -54  - sq_xtbox - - -56 * - mbuf -; - -57  - mx -, - my -, - mw -; - -58  - mmaxn -, - m -, - mos -, - mvpos -; - -62  -q_xtbox - - geqf_tbox -[] = { { -NULL -, 7, 28, 32, 4096, 0, 0, 0 }, - -63 { -NULL -, 7, 30, 32, 512, 0, 0, 0 } }; - -66  - geqf_size -=0, - geqf_ud -=0, - geqf_cgad -=2; - -67  -q_t - * - geqfes -= -NULL -; - -68  - geqf_icktime -=0; - -70 -SDL_bo - - $_feque - -mache - * -ic - ) - -72 if! - `loc_xtze - -ic -, -TZ_FILEREQ -, 160, 48, 40, 32, "Fes" ) )  -SDL_FALSE -; - -74  -SDL_TRUE -; - -75 - } -} - -77  - $shut_feque - -mache - * -ic - ) - -79 - `_xtze - -ic -, -TZ_FILEREQ - ); - -80 - } -} - -83  - $feq_nd - -mache - * -ic - ) - -85 -ic --> - `nd_beg -( oric ); - -87 -ic --> - `nd_video -ic, -SDL_TRUE - ); - -88 -ic --> - `nd_xtze -ic, -TZ_FILEREQ - ); - -90 -ic --> - `nd_d -( oric ); - -91 - } -} - -94  - $feq_addt - -SDL_bo - -isd -, * -me -, * -showme - ) - -96  -q_t - * -tmpf -; - -97  -i -, -j -; - -100 if! -eqfes - ) || ( -eqf_ud - > -eqf_size - ) ) - -103 -tmpf - = ( -q_t - *) - `loc - -eqfes -, q_* ( -eqf_size -+8) ); - -104 if! -tmpf - ) ; - -106 -eqfes - = -tmpf -; - -107 -eqf_size - += 8; - -111 -j - = 0; - -112 if -eqf_ud - > 0 ) - -114 if -isd - ) - -116  -j -=1; j< -eqf_ud -; j++ ) - -118 if - `rcmp - -me -, -eqfes -[ -j -].name ) <= 0 ) ; - -119 if! -eqfes -[ -j -]. -isd - ) ; - -122  -j -=1; j< -eqf_ud -; j++ ) - -123 if! -eqfes -[ -j -]. -isd - ) ; - -125  ; -j -< -eqf_ud -; j++ ) - -126 if - `rcmp - -me -, -eqfes -[ -j -].name ) <= 0 ) ; - -130 if -j - < -eqf_ud - ) - -132  -i -= -eqf_ud -; i> -j -; i-- ) - -133 -eqfes -[ -i -] = freqfiles[i-1]; - -138 -eqfes -[ -j -]. -isd - = isdir; - -139 - `y - -eqfes -[ -j -]. -me -,ame, 512 ); - -140 - `y - -eqfes -[ -j -]. -showme -, showname, 38 ); - -141 -eqfes -[ -j -]. -me -[511] = 0; - -142 -eqfes -[ -j -]. -showme -[37] = 0; - -145 -eqf_ud -++; - -146 - } -} - -149  -SDL_bo - - $feq_sn -* -th - ) - -151 -DIR - * -dh -; - -152  -dt - * -de -; - -153  - - -sb -; - -154 * -od -, * -h -; - -156 -h - = -th -; - -157 #ide -__amigaos4__ - - -158 if! -th -[0] ) - -159 -h - = "."; - -162 -eqf_ud - = 0; - -164 -dh - = - `ݒd - -h - ); - -165 if! -dh - )  -SDL_FALSE -; - -167 -od - = - `gcwd - -NULL -, 0 ); - -168 - `chd - -h - ); - -170 - `feq_addt - -SDL_TRUE -, "", "[Parent]" ); - -172  ( -de - = - `add - -dh - ) ) ) - -174 if - `rcmp - -de --> -d_me -, "." ) == 0 ) || - -175 - `rcmp - -de --> -d_me -, ".." ) == 0 ) ) - -177 - ` - -de --> -d_me -, & -sb - ); - -178 - `feq_addt - - `S_ISDIR -( -sb -. -_mode -), -de --> -d_me -, de->d_name ); - -181 - `od - -dh - ); - -183 - `chd - -od - ); - -184 - ` - -od - ); - -185  -SDL_TRUE -; - -186 - } -} - -189  - $feq_showfes - -offt -,  -cfe - ) - -191  -i -, -j -, -o -; - -194 if -eqf_cgad - != 2 ) - -195 -cfe - = -1; - -197  -i -=0; i<26; i++ ) - -200 if( -i -+ -offt -< -eqf_ud - ) - -201 - `tztc - -tz -[ -TZ_FILEREQ -], -eqfes -[ -i -+ -offt -]. -isd - ? 1 : 0, (i+offt)== -cfe - ? 7 : 6 ); - -203 - `tztc - -tz -[ -TZ_FILEREQ -], 0, 6 ); - -206 -o - = ( -i -+1)* -tz -[ -TZ_FILEREQ -]-> -w -+1; - -207  -j -=0; j<38; j++, -o -++ ) - -209 -tz -[ -TZ_FILEREQ -]-> -fc -[ -o -] =z[TZ_FILEREQ]-> -cfc -; - -210 -tz -[ -TZ_FILEREQ -]-> -bc -[ -o -] =z[TZ_FILEREQ]-> -cbc -; - -211 -tz -[ -TZ_FILEREQ -]-> -tx -[ -o -] = 32; - -214 if( -i -+ -offt -> -eqf_ud - ) - -218 - `tzos - -tz -[ -TZ_FILEREQ -], 1, -i -+1, -eqfes -[i+ -offt -]. -showme - ); - -220 - } -} - -223  - $feq_box - -q_xtbox - * -tb -, * -buf - ) - -226 -tb --> -buf - = buf; - -227 -tb --> - - = - ` - -buf - ); - -230 -tb --> -os - =b-> - -; - -231 -tb --> -vpos - =b-> - - > (tb-> -w --1) ?b->slen-(tb->w-1) : 0; - -232 - } -} - -235  - $feq_dwtbox - -q_xtbox - * -tb -, -SDL_bo - -aive - ) - -237  -i -, -j -, -o -; - -239 - `tztc - -tz -[ -TZ_FILEREQ -], 0, -aive - ? 7 : 6 ); - -240 -o - = ( -tb --> -y -* -tz -[ -TZ_FILEREQ -]-> -w -)+tb-> -x -; - -241  -i -=0, -j -= -tb --> -vpos -; i -w -; i++, -o -++, j++ ) - -243 if -aive - ) && ( -j -== -tb --> -os - ) ) - -245 -tz -[ -TZ_FILEREQ -]-> -fc -[ -o -] =z[TZ_FILEREQ]-> -cbc -; - -246 -tz -[ -TZ_FILEREQ -]-> -bc -[ -o -] =z[TZ_FILEREQ]-> -cfc -; - -248 -tz -[ -TZ_FILEREQ -]-> -fc -[ -o -] =z[TZ_FILEREQ]-> -cfc -; - -249 -tz -[ -TZ_FILEREQ -]-> -bc -[ -o -] =z[TZ_FILEREQ]-> -cbc -; - -251 if -j - < -tb --> - - ) - -252 -tz -[ -TZ_FILEREQ -]-> -tx -[ -o -] = -tb --> -buf -[ -j -]; - -254 -tz -[ -TZ_FILEREQ -]-> -tx -[ -o -] = 32; - -256 - } -} - -260  - $feq_tfbox - -cfe -, * -ame - ) - -262 if -cfe - < 0 ) || ( cf> -eqf_ud - ) || - -263 -eqfes -[ -cfe -]. -isd - ) ) - -265 -ame -[0] = 0; - -266 -eqf_tbox -[1]. -os -=0; - -267 -eqf_tbox -[1]. -vpos -=0; - -268 -eqf_tbox -[1]. - -=0; - -272 - `y - -ame -, -eqfes -[ -cfe -]. -me -, 512 ); - -273 -ame -[511] = 0; - -274 - `feq_box -& -eqf_tbox -[1], -ame - ); - -275 - } -} - -279 - mACTION_NONE - = 0, - -280 - mACTION_SELECTITEM -, - -281 - mACTION_PAGEUP -, - -282 - mACTION_PAGEDOWN - - -291 -SDL_bo - - $feque - -mache - * -ic -, * -t -, * -th -, * -ame -,  -ty - ) - -293 -SDL_Evt - -evt -; - -294  -q_xtbox - * -tb -; - -295  -t -=0, -cfe -=0, -i -, -mx -, -my -, -mick -; - -296 -SDL_bo - -shiy - = -SDL_FALSE -, -wasunicode -; - -297  -di -; - -299 -wasunicode - = - `SDL_COMPAT_EbUNICODE - -SDL_TRUE - ); - -300 - `SDL_COMPAT_EbKeyRt - -SDL_DEFAULT_REPEAT_DELAY -, -SDL_DEFAULT_REPEAT_INTERVAL - ); - -302 - `feq_box -& -eqf_tbox -[0], -th - ); - -303 - `feq_box -& -eqf_tbox -[1], -ame - ); - -305 - `tz - -tz -[ -TZ_FILEREQ -], -t - ); - -306 - `tztc - -tz -[ -TZ_FILEREQ -], 2, 3 ); - -307 - `tzos - -tz -[ -TZ_FILEREQ -], 1, 28, "Path:" ); - -308 - `tzos - -tz -[ -TZ_FILEREQ -], 1, 30, "File:" ); - -310 if! - `feq_sn - -th - ) ) - -312 if -th -[0] ) - -314 -th -[0] = 0; - -315 - `feq_box -& -eqf_tbox -[0], -th - ); - -316 if! - `feq_sn - -th - ) ) - -318 - `SDL_COMPAT_EbUNICODE - -wasunicode - ); - -319 - `SDL_COMPAT_EbKeyRt - -wasunicode - ? -SDL_DEFAULT_REPEAT_DELAY - : 0, wasunicod? -SDL_DEFAULT_REPEAT_INTERVAL - : 0 ); - -320  -SDL_FALSE -; - -323 - `SDL_COMPAT_EbUNICODE - -wasunicode - ); - -324 - `SDL_COMPAT_EbKeyRt - -wasunicode - ? -SDL_DEFAULT_REPEAT_DELAY - : 0, wasunicod? -SDL_DEFAULT_REPEAT_INTERVAL - : 0 ); - -325  -SDL_FALSE -; - -328 - `feq_showfes - -t -, -cfe - ); - -329 - `feq_dwtbox -& -eqf_tbox -[0], -eqf_cgad -==0 ); - -330 - `feq_dwtbox -& -eqf_tbox -[1], -eqf_cgad -==1 ); - -331 - `feq_nd - -ic - ); - -335 if! - `SDL_WaEvt -& -evt - ) ) - -337 - `SDL_COMPAT_EbUNICODE - -wasunicode - ); - -338 - `SDL_COMPAT_EbKeyRt - -wasunicode - ? -SDL_DEFAULT_REPEAT_DELAY - : 0, wasunicod? -SDL_DEFAULT_REPEAT_INTERVAL - : 0 ); - -339  -SDL_FALSE -; - -342 -mx - = -1; - -343 -my - = -1; - -344 -mick - = 0; - -345 -di - = -ACTION_NONE -; - -346  -evt -. -ty - ) - -348  -SDL_MOUSEMOTION -: - -349 -mx - = ( -evt -. -mi -. -x - - -tz -[ -TZ_FILEREQ -]->x)/8; - -350 -my - = ( -evt -. -mi -. -y - - -tz -[ -TZ_FILEREQ -]->y)/12; - -353  -SDL_MOUSEBUTTONDOWN -: - -354 if -evt -. -bu -.bu = -SDL_BUTTON_LEFT - ) - -356 -mx - = ( -evt -. -bu -. -x - - -tz -[ -TZ_FILEREQ -]->x)/8; - -357 -my - = ( -evt -. -bu -. -y - - -tz -[ -TZ_FILEREQ -]->y)/12; - -358 -mick - = - `SDL_GTicks -(); - -363  -evt -. -ty - ) - -365  -SDL_COMPAT_ACTIVEEVENT -: - -366 if( - `SDL_COMPAT_IsAFocud -& -evt - ) ) { - -367 - `feq_nd - -ic - ); - -371  -SDL_MOUSEBUTTONDOWN -: - -372 if -mx - < 1 ) || ( mx > 38 ) ) - -375 if -my - == 28 ) || ( my == 30 ) ) - -377 -eqf_cgad - = ( -my --28)/2; - -378 - `feq_showfes - -t -, -cfe - ); - -379 - `feq_dwtbox -& -eqf_tbox -[0], -eqf_cgad -==0 ); - -380 - `feq_dwtbox -& -eqf_tbox -[1], -eqf_cgad -==1 ); - -381 - `feq_nd - -ic - ); - -385 if -my - < 1 ) || ( my > 26 ) ) - -388 -eqf_cgad - = 2; - -390 -i - = ( -my --1)- -t -; - -391 if -i - > -eqf_ud - ) i = freqf_used-1; - -393 if -cfe - ! -i - ) - -395 -cfe - = -i -; - -396 - `feq_tfbox - -cfe -, -ame - ); - -397 - `feq_showfes - -t -, -cfe - ); - -398 - `feq_dwtbox -& -eqf_tbox -[1], 0 ); - -399 - `feq_nd - -ic - ); - -400 -eqf_icktime - = -mick -; - -404 if -eqf_icktime - == 0 ) || - -405 ( -mick -- -eqf_icktime -) >= 2000 ) ) - -407 -eqf_icktime - = -mick -; - -411 -eqf_icktime - = 0; - -412 -di - = -ACTION_SELECTITEM -; - -415  -SDL_KEYUP -: - -416  -evt -. -key -. -keysym -. -sym - ) - -418  -SDLK_LSHIFT -: - -419  -SDLK_RSHIFT -: - -420 -shiy - = -SDL_FALSE -; - -423  -SDLK_ESCAPE -: - -424 - `SDL_COMPAT_EbUNICODE - -wasunicode - ); - -425 - `SDL_COMPAT_EbKeyRt - -wasunicode - ? -SDL_DEFAULT_REPEAT_DELAY - : 0, wasunicod? -SDL_DEFAULT_REPEAT_INTERVAL - : 0 ); - -426  -SDL_FALSE -; - -428  -SDLK_RETURN -: - -429  -SDLK_KP_ENTER -: - -430  -eqf_cgad - ) - -433 -cfe - = -t - = 0; - -434 if! - `feq_sn - -th - ) ) - -436 if -th -[0] ) - -438 -th -[0] = 0; - -439 - `feq_box -& -eqf_tbox -[0], -th - ); - -440 if! - `feq_sn - -th - ) ) - -442 - `SDL_COMPAT_EbUNICODE - -wasunicode - ); - -443 - `SDL_COMPAT_EbKeyRt - -wasunicode - ? -SDL_DEFAULT_REPEAT_DELAY - : 0, wasunicod? -SDL_DEFAULT_REPEAT_INTERVAL - : 0 ); - -444  -SDL_FALSE -; - -447 - `SDL_COMPAT_EbUNICODE - -wasunicode - ); - -448 - `SDL_COMPAT_EbKeyRt - -wasunicode - ? -SDL_DEFAULT_REPEAT_DELAY - : 0, wasunicod? -SDL_DEFAULT_REPEAT_INTERVAL - : 0 ); - -449  -SDL_FALSE -; - -452 - `feq_showfes - -t -, -cfe - ); - -453 - `feq_dwtbox -& -eqf_tbox -[0], -eqf_cgad -==0 ); - -454 - `feq_dwtbox -& -eqf_tbox -[1], -eqf_cgad -==1 ); - -455 - `feq_nd - -ic - ); - -459 - `SDL_COMPAT_EbUNICODE - -wasunicode - ); - -460 - `SDL_COMPAT_EbKeyRt - -wasunicode - ? -SDL_DEFAULT_REPEAT_DELAY - : 0, wasunicod? -SDL_DEFAULT_REPEAT_INTERVAL - : 0 ); - -461  -SDL_TRUE -; - -464 -di - = -ACTION_SELECTITEM -; - -474  -SDL_KEYDOWN -: - -475  -evt -. -key -. -keysym -. -sym - ) - -477  -SDLK_LSHIFT -: - -478  -SDLK_RSHIFT -: - -479 -shiy - = -SDL_TRUE -; - -482  -SDLK_TAB -: - -483 if -shiy - ) - -484 -eqf_cgad - = (freqf_cgad+2)%3; - -486 -eqf_cgad - = (freqf_cgad+1)%3; - -487 - `feq_showfes - -t -, -cfe - ); - -488 - `feq_dwtbox -& -eqf_tbox -[0], -eqf_cgad -==0 ); - -489 - `feq_dwtbox -& -eqf_tbox -[1], -eqf_cgad -==1 ); - -490 - `feq_nd - -ic - ); - -493  -SDLK_UP -: - -494 if -eqf_cgad - != 2 ) - -496 -eqf_cgad - = 2; - -497 - `feq_showfes - -t -, -cfe - ); - -498 - `feq_dwtbox -& -eqf_tbox -[0], -eqf_cgad -==0 ); - -499 - `feq_dwtbox -& -eqf_tbox -[1], -eqf_cgad -==1 ); - -500 - `feq_nd - -ic - ); - -504 if -cfe - <= 0 ) ; - -505 if -shiy - ) - -507 -di - = -ACTION_PAGEUP -; - -510 -cfe ---; - -511 if -cfe - < -t - )op = cfile; - -512 - `feq_tfbox - -cfe -, -ame - ); - -513 - `feq_showfes - -t -, -cfe - ); - -514 - `feq_dwtbox -& -eqf_tbox -[1], -SDL_FALSE - ); - -515 - `feq_nd - -ic - ); - -518  -SDLK_DOWN -: - -519 if -eqf_cgad - != 2 ) - -521 -eqf_cgad - = 2; - -522 - `feq_showfes - -t -, -cfe - ); - -523 - `feq_dwtbox -& -eqf_tbox -[0], -eqf_cgad -==0 ); - -524 - `feq_dwtbox -& -eqf_tbox -[1], -eqf_cgad -==1 ); - -525 - `feq_nd - -ic - ); - -529 if -cfe - >( -eqf_ud --1) ) ; - -530 if -shiy - ) - -532 -di - = -ACTION_PAGEDOWN -; - -535 -cfe -++; - -536 if -cfe - > ( -t -+25) )op = cfile-25; - -537 - `feq_tfbox - -cfe -, -ame - ); - -538 - `feq_showfes - -t -, -cfe - ); - -539 - `feq_dwtbox -& -eqf_tbox -[1], -SDL_FALSE - ); - -540 - `feq_nd - -ic - ); - -543  -SDLK_PAGEUP -: - -544 if -eqf_cgad - != 2 ) - -546 -eqf_cgad - = 2; - -547 - `feq_showfes - -t -, -cfe - ); - -548 - `feq_dwtbox -& -eqf_tbox -[0], -eqf_cgad -==0 ); - -549 - `feq_dwtbox -& -eqf_tbox -[1], -eqf_cgad -==1 ); - -550 - `feq_nd - -ic - ); - -554 -di - = -ACTION_PAGEUP -; - -557  -SDLK_PAGEDOWN -: - -558 if -eqf_cgad - != 2 ) - -560 -eqf_cgad - = 2; - -561 - `feq_showfes - -t -, -cfe - ); - -562 - `feq_dwtbox -& -eqf_tbox -[0], -eqf_cgad -==0 ); - -563 - `feq_dwtbox -& -eqf_tbox -[1], -eqf_cgad -==1 ); - -564 - `feq_nd - -ic - ); - -568 -di - = -ACTION_PAGEDOWN -; - -571  -SDLK_BACKSPACE -: - -572 if -eqf_cgad - == 2 ) ; - -573 -tb - = & -eqf_tbox -[ -eqf_cgad -]; - -574 if -tb --> -os - < 1 ) ; - -575  -i -= -tb --> -os --1; i - -; i++ ) - -576 -tb --> -buf -[ -i -] =b->buf[i+1]; - -577 -tb --> - ---; - -578 if -tb --> - - < 0 ) - -580 -tb --> - - = 0; - -581 -tb --> -os - = 0; - -584  -SDLK_LEFT -: - -585 if -eqf_cgad - == 2 ) ; - -586 -tb - = & -eqf_tbox -[ -eqf_cgad -]; - -587 if -tb --> -os - > 0 )b->cpos--; - -588 if -tb --> -os - -vpos - )b->vpos =b->cpos; - -589 if -tb --> -os - >b-> -vpos -+tb-> -w -) )b->vpos =b->cpos-(tb->w-1); - -590 if -tb --> -vpos - < 0 )b->vpos = 0; - -591 - `feq_dwtbox - -tb -, -SDL_TRUE - ); - -592 - `feq_nd - -ic - ); - -595  -SDLK_RIGHT -: - -596 if -eqf_cgad - == 2 ) ; - -597 -tb - = & -eqf_tbox -[ -eqf_cgad -]; - -598 if -tb --> -os - - - )b->cpos++; - -599 if -tb --> -os - -vpos - )b->vpos =b->cpos; - -600 if -tb --> -os - >b-> -vpos -+tb-> -w -) )b->vpos =b->cpos-(tb->w-1); - -601 if -tb --> -vpos - < 0 )b->vpos = 0; - -602 - `feq_dwtbox - -tb -, -SDL_TRUE - ); - -603 - `feq_nd - -ic - ); - -606  -SDLK_DELETE -: - -607 if -eqf_cgad - == 2 ) ; - -608 -tb - = & -eqf_tbox -[ -eqf_cgad -]; - -609 if -tb --> -os - >tb-> - - ) ; - -610  -i -= -tb --> -os -; i - -; i++ ) - -611 -tb --> -buf -[ -i -] =b->buf[i+1]; - -612 -tb --> - ---; - -613 if -tb --> - - < 0 ) - -615 -tb --> - - = 0; - -616 -tb --> -os - = 0; - -618 - `feq_dwtbox - -tb -, -SDL_TRUE - ); - -619 - `feq_nd - -ic - ); - -626  - `SDL_COMPAT_GKeysymUnicode - -evt -. -key -. -keysym - ) ) - -629 if -eqf_cgad - == 2 ) ; - -631 if - `SDL_COMPAT_GKeysymUnicode - -evt -. -key -. -keysym - ) > 31 ) && ( SDL_COMPAT_GetKeysymUnicode(vent.key.keysym ) < 127 ) ) - -633 -tb - = & -eqf_tbox -[ -eqf_cgad -]; - -634 if -tb --> - - >b-> -maxn --1) ) ; - -635  -i -= -tb --> - -; i>b-> -os -; i-- ) - -636 -tb --> -buf -[ -i -] =b->buf[i-1]; - -637 -tb --> -buf -[tb-> -os -] = - `SDL_COMPAT_GKeysymUnicode - -evt -. -key -. -keysym - ); - -638 -tb --> - -++; - -639 -tb --> -os -++; - -640 -tb --> -buf -[tb-> -os -] = 0; - -641 if -tb --> -os - -vpos - )b->vpos =b->cpos; - -642 if -tb --> -os - >b-> -vpos -+tb-> -w -) )b->vpos =b->cpos-(tb->w-1); - -643 if -tb --> -vpos - < 0 )b->vpos = 0; - -644 - `feq_dwtbox - -tb -, -SDL_TRUE - ); - -645 - `feq_nd - -ic - ); - -651  -SDL_QUIT -: - -652 - `mumode - -ic -, -NULL -, -EM_PLEASEQUIT - ); - -653  -SDL_FALSE -; - -659  -di - ) - -661  -ACTION_PAGEUP -: - -662 if -cfe - > -t - ) - -664 -cfe - = -t -; - -666 -t - -= 25; - -667 if -t - < 0 )op = 0; - -668 -cfe - = -t -; - -670 - `feq_showfes - -t -, -cfe - ); - -671 - `feq_dwtbox -& -eqf_tbox -[0], -eqf_cgad -==0 ); - -672 - `feq_dwtbox -& -eqf_tbox -[1], -eqf_cgad -==1 ); - -673 - `feq_nd - -ic - ); - -676  -ACTION_PAGEDOWN -: - -677 if -cfe - < ( -t -+25) ) - -679 -cfe - = -t -+25; - -681 -cfe - += 25; - -683 if -cfe - > ( -eqf_ud --1) ) cfile = freqf_used-1; - -684 -t - = -cfe --25; - -685 if -t - < 0 )op = 0; - -686 - `feq_showfes - -t -, -cfe - ); - -687 - `feq_dwtbox -& -eqf_tbox -[0], -eqf_cgad -==0 ); - -688 - `feq_dwtbox -& -eqf_tbox -[1], -eqf_cgad -==1 ); - -689 - `feq_nd - -ic - ); - -692  -ACTION_SELECTITEM -: - -693 if -eqf_ud - <= 0 ) ; - -694 if -cfe -<=0 ) - -696 -i - = - ` - -th - )-1; - -697 if -i -<=0 ) ; - -698 if -th -[ -i -] = -PATHSEP - ) i--; - -699  -i - > -1 ) - -701 if -th -[ -i -] = -PATHSEP - ) ; - -702 -i ---; - -704 if -i -==-1 ) i++; - -705 -th -[ -i -] = 0; - -706 } if -eqfes -[ -cfe -]. -isd - ) { - -707 -i - = - ` - -th - )-1; - -708 if -i - < 0 ) - -710 -i -++; - -712 if -th -[ -i -] ! -PATHSEP - ) - -713 -i -++; - -715 if -i - > 0 ) -th -[i++] = -PATHSEP -; - -716 - `y -& -th -[ -i -], -eqfes -[ -cfe -]. -me -, 4096-i ); - -717 -th -[4095] = 0; - -719 - `SDL_COMPAT_EbUNICODE - -wasunicode - ); - -720 - `SDL_COMPAT_EbKeyRt - -wasunicode - ? -SDL_DEFAULT_REPEAT_DELAY - : 0, wasunicod? -SDL_DEFAULT_REPEAT_INTERVAL - : 0 ); - -721  -SDL_TRUE -; - -723 -cfe - = -t - = 0; - -724 - `feq_box -& -eqf_tbox -[0], -th - ); - -725 if! - `feq_sn - -th - ) ) - -727 if -th -[0] ) - -729 -th -[0] = 0; - -730 - `feq_box -& -eqf_tbox -[0], -th - ); - -731 if! - `feq_sn - -th - ) ) - -733 - `SDL_COMPAT_EbUNICODE - -wasunicode - ); - -734 - `SDL_COMPAT_EbKeyRt - -wasunicode - ? -SDL_DEFAULT_REPEAT_DELAY - : 0, wasunicod? -SDL_DEFAULT_REPEAT_INTERVAL - : 0 ); - -735  -SDL_FALSE -; - -738 - `SDL_COMPAT_EbUNICODE - -wasunicode - ); - -739 - `SDL_COMPAT_EbKeyRt - -wasunicode - ? -SDL_DEFAULT_REPEAT_DELAY - : 0, wasunicod? -SDL_DEFAULT_REPEAT_INTERVAL - : 0 ); - -740  -SDL_FALSE -; - -743 - `feq_showfes - -t -, -cfe - ); - -744 - `feq_dwtbox -& -eqf_tbox -[0], -eqf_cgad -==0 ); - -745 - `feq_dwtbox -& -eqf_tbox -[1], -eqf_cgad -==1 ); - -746 - `feq_nd - -ic - ); - -751 - `SDL_COMPAT_EbUNICODE - -wasunicode - ); - -752 - `SDL_COMPAT_EbKeyRt - -wasunicode - ? -SDL_DEFAULT_REPEAT_DELAY - : 0, wasunicod? -SDL_DEFAULT_REPEAT_INTERVAL - : 0 ); - -753  -SDL_FALSE -; - -754 - } -} - - @filereq_win32.c - -22  - ~ - -23  - ~ - -24  - ~ - -26  - #WANT_WMINFO - - - ) - -28  - ~"syem.h -" - -29  - ~"6502.h -" - -30  - ~"v.h -" - -31  - ~"8912.h -" - -32  - ~"disk.h -" - -33  - ~"gui.h -" - -34  - ~"mڙ.h -" - -35  - ~"6551.h -" - -36  - ~"mache.h -" - -37  - ~"feq.h -" - -39 -SDL_bo - - $_feque - -mache - * -ic - ) - -41  -SDL_TRUE -; - -42 - } -} - -44  - $shut_feque - -mache - * -ic - ) - -46 - } -} - -48 -SDL_bo - - $feque - -mache - * -ic -, * -t -, * -th -, * -ame -,  -ty - ) - -50 -SDL_SysWMfo - -wmi -; - -51 -OPENFILENAME - -o -; - -52 -HWND - -hwnd -; - -53  -tmp -[4096]; - -54  -i -; - -55 * -od -; - -57 - `ry - -tmp -, -ame - ); - -59 -hwnd - = -NULL -; - -60 - `SDL_VERSION -(& -wmi -. -vsi -); - -61 i( - `SDL_COMPAT_GWMInfo -(& -wmi -)) - -62 #i -SDL_MAJOR_VERSION - == 1 - -63 -hwnd - = ( -HWND -) -wmi -. -wdow -; - -65 -hwnd - = ( -HWND -) -wmi -. -fo -. -w -. -wdow -; - -68 - `ZoMemy -& -o -, ( ofn ) ); - -69 -o -. -lSuSize - = ( ofn ); - -70 -o -. -hwndOwr - = -hwnd -; - -71 -o -. -͡rFe - = -ame -; - -72 -o -. -nMaxFe - = 4096; - -74 -o -. -Fgs - = -OFN_PATHMUSTEXIST - | -OFN_FILEMUSTEXIST -; - -75  -ty - ) - -77  -FR_DISKSAVE -: - -78 -o -. -Fgs - = -OFN_PATHMUSTEXIST -; - -79  -FR_DISKLOAD -: - -80 -o -. -͡rFr - = "All Files\0*.*\0Disk Images (*.dsk)\0*.DSK\0"; - -81 -o -. -nFrIndex - = 2; - -84  -FR_TAPESAVETAP -: - -85 -o -. -Fgs - = -OFN_PATHMUSTEXIST -; - -86 -o -. -͡rFr - = "All Files\0*.*\0Tape Images (*.tap)\0*.TAP\0"; - -87 -o -. -nFrIndex - = 2; - -90  -FR_TAPESAVEORT -: - -91 -o -. -Fgs - = -OFN_PATHMUSTEXIST -; - -92 -o -. -͡rFr - = "All Files\0*.*\0Raw Tape Images (*.ort)\0*.ORT\0"; - -93 -o -. -nFrIndex - = 2; - -96  -FR_TAPELOAD -: - -97 -o -. -͡rFr - = "All Files\0*.*\0Tape Images (*.tap, *.ort, *.wav)\0*.TAP;*.ORT;*.WAV\0"; - -98 -o -. -nFrIndex - = 2; - -101  -FR_ROMS -: - -102 -o -. -͡rFr - = "All Files\0*.*\0Rom Images (*.rom)\0*.ROM\0"; - -103 -o -. -nFrIndex - = 2; - -106  -FR_SNAPSHOTSAVE -: - -107 -o -. -Fgs - = -OFN_PATHMUSTEXIST -; - -108  -FR_SNAPSHOTLOAD -: - -109 -o -. -͡rFr - = "All Files\0*.*\0Snapshot files (*.sna)\0*.SNA\0"; - -110 -o -. -nFrIndex - = 2; - -113  -FR_KEYMAPPINGSAVE -: - -114 -o -. -Fgs - = -OFN_PATHMUSTEXIST -; - -115  -FR_KEYMAPPINGLOAD -: - -116 -o -. -͡rFr - = "All Files\0*.*\0Keyboard Mapping files (*.kma)\0*.KMA\0"; - -117 -o -. -nFrIndex - = 2; - -121 -o -. -͡rFr - = "All Files\0*.*"; - -122 -o -. -nFrIndex - = 1; - -126 -o -. -͡rFeT - = -NULL -; - -127 -o -. -nMaxFeT - = 0; - -128 -o -. -͡rInlD - = -th -; - -130 -od - = - `gcwd - -NULL -, 0 ); - -132  -ty - ) - -134  -FR_SNAPSHOTSAVE -: - -135  -FR_DISKSAVE -: - -136 if! - `GSaveFeName -& -o - ) ) - -138 - `chd - -od - ); - -139 - ` - -od - ); - -140  -SDL_FALSE -; - -145 if! - `GOnFeName -& -o - ) ) - -147 - `chd - -od - ); - -148 - ` - -od - ); - -149  -SDL_FALSE -; - -154 - `chd - -od - ); - -155 - ` - -od - ); - -157 -i - = - ` - -o -. -͡rFe - ); - -158 if! -i - )  -SDL_FALSE -; - -160 -i ---; - -161  -o -. -͡rFe -[ -i -] ! -PATHSEP - ) - -163 if -i - == 0 ) ; - -164 -i ---; - -167 if -o -. -͡rFe -[ -i -] = -PATHSEP - ) && ( i < ( - ` -(ofn.lpstrFile)-1) ) ) - -169 -o -. -͡rFe -[ -i -] = 0; - -170 - `ry - -th -, -o -. -͡rFe - ); - -171 - `y - -ame -, & -o -. -͡rFe -[ -i -+1], 512 ); - -172 -ame -[511] = 0; - -174 -th -[0] = 0; - -175 - `y - -ame -, -o -. -͡rFe -, 512 ); - -176 -ame -[511] = 0; - -179  -SDL_TRUE -; - -180 - } -} - - @font.c - -22  - gtheft -[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - - @gui.c - -28  - ~ - -29  - ~ - -30  - ~ - -31  - ~ - -32  - ~ - -34 #ifde -__amigaos4__ - - -35  - ~ - -38 #i -defed -( -__MORPHOS__ -|| defed( -__AROS__ -) - -39  - ~ - -40  - ~ - -44  - ~"syem.h -" - -45  - ~"6502.h -" - -46  - ~"v.h -" - -47  - ~"8912.h -" - -48  - ~"gui.h -" - -49  - ~"disk.h -" - -50  - ~"mڙ.h -" - -51  - ~"6551.h -" - -52  - ~"mache.h -" - -53  - ~"feq.h -" - -54  - ~"nd_sw.h -" - -55  - ~"nd_sw8.h -" - -56  - ~"nd_gl.h -" - -57  - ~"nd_nu.h -" - -58  - ~"u.h -" - -59  - ~".h -" - -60  - ~"joyick.h -" - -61  - ~"sh.h -" - -62  - ~"msgbox.h -" - -63  - ~"keybrd.h -" - -65  - ~"ugs/ch376/ch376.h -" - -66  - ~"ugs/ch376/ic_ch376_ug.h -" - -68 -SDL_bo - -fusn -; - -70  - gth -[4096], - gfe -[512]; - -71  - gdiskth -[4096], - gdiskfe -[512]; - -72  - gdiskth -[4096], - gdiskfe -[512]; - -73  - gavdiskth -[4096], - gavdiskfe -[512]; - -74  -moomfe -[]; - -75  -ic1romfe -[]; - -76  -mdisomfe -[]; - -77  -jasmomfe -[]; - -78  -avzromfe -[2][1024]; - -79  -bkfes -[8][1024]; - -80  - gth -[4096], - gfe -[512]; - -81  - gmpgth -[4096], - gmpgfe -[512]; - -82  - gfmp -[4096+512+4]; - -84 -SDL_bo - - geshus - = -SDL_TRUE -, - geshdisks - = SDL_TRUE, - geshavi - = SDL_TRUE, - gesh - = SDL_TRUE, - -85 - geshkeybrd - = -SDL_TRUE -; - -86  -avi_hd - * -vidp -; - -88 -SDL_bo - -ed_sdl_qu -; - -89 -SDL_AudioSc - -obed -; - -90 -Ut32 - -cyeme -; - -93  - #GIMG_W_DISK - 18 - - ) - -94  - #GIMG_W_TAPE - 20 - - ) - -95  - #GIMG_W_AVIR - 16 - - ) - -98  -guiimg - - ggimgs -[ -NUM_GIMG -] = { - -99 { -IMAGEPREFIX -"disk_ejeed.bmp", -GIMG_W_DISK -, 16, -NULL - }, - -100 { -IMAGEPREFIX -"disk_id.bmp", -GIMG_W_DISK -, 16, -NULL - }, - -101 { -IMAGEPREFIX -"disk_aive.bmp", -GIMG_W_DISK -, 16, -NULL - }, - -102 { -IMAGEPREFIX -"disk_modifd.bmp", -GIMG_W_DISK -, 16, -NULL - }, - -103 { -IMAGEPREFIX -"disk_modaive.bmp", -GIMG_W_DISK -, 16, -NULL - }, - -104 { -IMAGEPREFIX -"_ejeed.bmp", -GIMG_W_TAPE -, 16, -NULL - }, - -105 { -IMAGEPREFIX -"_u.bmp", -GIMG_W_TAPE -, 16, -NULL - }, - -106 { -IMAGEPREFIX -"_ay.bmp", -GIMG_W_TAPE -, 16, -NULL - }, - -107 { -IMAGEPREFIX -"_.bmp", -GIMG_W_TAPE -, 16, -NULL - }, - -108 { -IMAGEPREFIX -"_cd.bmp", -GIMG_W_TAPE -, 16, -NULL - }, - -109 { -IMAGEPREFIX -"avec.bmp", -GIMG_W_AVIR -, 16, -NULL - }, - -110 { -IMAGEPREFIX -"gfx_ic1kbd.bmp", 640, 240, -NULL - }, - -111 { -IMAGEPREFIX -"gfx_moskbd.bmp", 640, 240, -NULL - }, - -112 { -IMAGEPREFIX -"gfx_avzkbd.bmp", 640, 240, -NULL - }}; - -114 -SDL_bo - - gsoundavaab -, - gsound -; - -115 #i -defed -( -__lux__ -) - -116 -St16 - - gsounds - = 0; - -118 -St16 - - gsounds - = -32768; - -120 -SDL_bo - -miodisom_vid -, -jasmrom_vid -, -avzrom_vid -; - -123  - #GIMG_POS_SBARY - (480-16) - - ) - -124  - #GIMG_POS_TAPEX - (640-4- -GIMG_W_TAPE -) - - ) - -125  - #GIMG_POS_DISKX - ( -GIMG_POS_TAPEX --(6+( -GIMG_W_DISK -*4))) - - ) - -126  - #GIMG_POS_AVIRECX - ( -GIMG_POS_DISKX --(6+ -GIMG_W_AVIR -)) - - ) - -129  - gsgl -[] = { 0x00, 0x00, 0x00, - -154  - gg_fegroundc -[] = { 0, 0, 1, 1, 0, 2, 1 }; - -155  - gg_backgroundc -[] = { 10, 10, 0, 0, 14, 3, 0 }; - -156  - gg_fegroundcl -[] = { 1, 1, 0, 0, 0, 1, 0 }; - -157  - gg_backgroundcl -[] = { 11, 11, 12, 13, 15, 5, 9 }; - -158  - gg_mu_scheme - = 5; - -162  -xtze - * - gtz -[ -NUM_TZ -]; - -165  - gvtmp -[ -VSPTMPSIZE -]; - -168 -Ut32 - -amimve -; - -169 -SDL_bo - - gwpd -= -SDL_FALSE -; - -172  -osdmu - * - gcmu - = -NULL -; - -173  - gcmuem - = 0; - -175 * - gacbackds -[ -ACIA_TYPE_LAST -] = { - -182  - gacbackdb -[32]; - -184  - $mufc -( -SDL_bo - -bSeed -{  (bSeed ? -g_fegroundcl -[ -g_mu_scheme -] : -g_fegroundc -[g_mu_scheme]); - } -} - -185  - $mubc -( -SDL_bo - -bSeed -{  (bSeed ? -g_backgroundcl -[ -g_mu_scheme -] : -g_backgroundc -[g_mu_scheme]); - } -} - -188  -toggˏnoi - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -189  -toggsound - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -190  - - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -191  -disk - -mache - * -ic -,  -osdmuem - * -mem -,  -drive - ); - -192  -tic - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -193  -toggˏturbo - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -194  -toggch376 -( -mache - * -ic -,  -osdmuem - * -mem -,  -dummy -); - -195  -toggautowd - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -196  -toggautot - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -197  -toggsymbާuto - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -198  -toggsyms - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -199  -toggvsynchack - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -200  -sw_nd_mode - -mache - * -ic -,  -osdmuem - * -mem -,  -wndmode - ); - -201  -toggˬio - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -202  -togghtch - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -203  -togg˷lgho - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -204  -toggsƚes - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -205  -toggligh - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -206  -toggacbackd - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -207  -tovock - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -208  -ve - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -209  -ld - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -210  -toggkeybrd - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -211  -defempg - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -212  -toggˡickykeys - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -213  -vempg - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -214  -ldmpg - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -215  -tmpg - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -216 #ifde -__CBCOPY__ - - -217  -bd_cy_gui - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -219 #ifde -__CBPASTE__ - - -220  -bd_e_gui - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -226  -osdmuem - - gmaems -[] = { { "Ine...", "T", 't', - -, 0, 0 }, - -227 { "Sav ouut...", "[F9]", -SDLK_F9 -, -toggˏp -, 0, 0 }, - -228 { "In disk 0...", "0", -SDLK_0 -, -disk -, 0, 0 }, - -229 { "In disk 1...", "1", -SDLK_1 -, -disk -, 1, 0 }, - -230 { "In disk 2...", "2", -SDLK_2 -, -disk -, 2, 0 }, - -231 { "In disk 3...", "3", -SDLK_3 -, -disk -, 3, 0 }, - -232 { -OSDMENUBAR -, -NULL -, 0, NULL, 0, 0 }, - -233 { "Savsh...", -NULL -, 0, -ve -, 0, 0 }, - -234 { "Ld spsh...", -NULL -, 0, -ld -, 0, 0 }, - -235 #i -defed -( -__CBCOPY__ -|| defed( -__CBPASTE__ -) - -236 { -OSDMENUBAR -, -NULL -, 0, NULL, 0, 0 }, - -238 #i -defed -( -__CBCOPY__ -) - -239 { "Cybrd", "[F11]", -SDLK_F11 -, -bd_cy_gui -, 0, 0 }, - -241 #i -defed -( -__CBPASTE__ -) - -242 { "Paom clbrd", "[F12]", -SDLK_F12 -, -bd_e_gui -,0, 0 }, - -244 { -OSDMENUBAR -, -NULL -, 0, NULL, 0, 0 }, - -245 { "Hdwtis...", "H", 'h', -gomu -, 1, 0 }, - -246 { "Auditis...", "A", 'a', -gomu -, 2, 0 }, - -247 { "Videtis...", "V", 'v', -gomu -, 4, 0 }, - -248 { "Keybrd ois...", "K", 'k', -gomu -, 7, 0 }, - -249 { "Debug ois...", "D", 'd', -gomu -, 3, 0 }, - -250 { "Ovock ois...", "C", 'c', -gomu -, 6, 0 }, - -251 { -OSDMENUBAR -, -NULL -, 0, NULL, 0, 0 }, - -252 { "Mڙ", "[F2]", -SDLK_F2 -, -mumode -, -EM_DEBUG -, 0 }, - -253 { "ReBu NMI", "[F3]", -SDLK_F3 -, -soợtic -, 0, 0 }, - -254 { "Hd Ret", "[F4]", -SDLK_F4 -, -tic -, 0, 0 }, - -255 { "Back", "\x17", -SDLK_BACKSPACE -, -mumode -, -EM_RUNNING -, 0 }, - -256 { -OSDMENUBAR -, -NULL -, 0, NULL, 0, 0 }, - -257 { "About", -NULL -, 0, -gomu -, 5, 0 }, - -258 { -OSDMENUBAR -, -NULL -, 0, NULL, 0, 0 }, - -259 { "Qu", -NULL -, 0, -mumode -, -EM_PLEASEQUIT -, 0 }, - -260 { -NULL -, } }; - -262  -osdmuem - - ghwݙems -[] = { { " Oric-1", "1", -SDLK_1 -, -swmach -, (0xffff<<16)| -MACH_ORIC1 -, 0 }, - -263 { " Oric-1 16K", "2", -SDLK_2 -, -swmach -, (0xffff<<16)| -MACH_ORIC1_16K -, 0 }, - -264 { " Atmos", "3", -SDLK_3 -, -swmach -, (0xffff<<16)| -MACH_ATMOS -, 0 }, - -265 { " Tet", "4", -SDLK_4 -, -swmach -, ( -DRV_NONE -<<16)| -MACH_TELESTRAT -, 0 }, - -266 { " Pvz 8D", "5", -SDLK_5 -, -swmach -, (0xffff<<16)| -MACH_PRAVETZ -, 0 }, - -267 { -OSDMENUBAR -, -NULL -, 0, NULL, 0, 0 }, - -268 { " Ndisk", "X", 'x', -tdrivy -, -DRV_NONE -, 0 }, - -269 { " Miodisc", "M", 'm', -tdrivy -, -DRV_MICRODISC -, 0 }, - -270 { " Jasm", "J", 'j', -tdrivy -, -DRV_JASMIN -, 0 }, - -272 { " Pvz 8D disk", "P", 'p', -tdrivy -, -DRV_PRAVETZ -, 0 }, - -273 { -OSDMENUBAR -, -NULL -, 0, NULL, 0, 0 }, - -274 { " Turb؏", -NULL -, 0, -toggˏturbo -, 0, 0 }, - -275 { " Autoe", -NULL -, 0, -toggautot -, 0, 0 }, - -276 { " Autewde", -NULL -, 0, -toggautowd -, 0, 0 }, - -277 { -OSDMENUBAR -, -NULL -, 0, NULL, 0, 0 }, - -278 { " VSynhack", -NULL -, 0, -toggvsynchack -, 0, 0 }, - -279 { " Ligh", -NULL -, 0, -toggligh -, 0, 0 }, - -280 { " Snڐ ", -NULL -, 0, -toggacbackd -, 0, 0 }, - -281 { " CH376 (Tet ", -NULL -, 0, -toggch376 -, 0, 0 }, - -283 { -OSDMENUBAR -, -NULL -, 0, NULL, 0, 0 }, - -284 { "Back", "\x17", -SDLK_BACKSPACE -, -gomu -, 0, 0 }, - -285 { -NULL -, } }; - -287  -osdmuem - - gauݙems -[] = { { " Soundbd", -NULL -, 0, -toggsound -, 0, 0 }, - -288 { " Tnoi", -NULL -, 0, -toggˏnoi -, 0, 0 }, - -289 { -OSDMENUBAR -, -NULL -, 0, NULL, 0, 0 }, - -290 { "Back", "\x17", -SDLK_BACKSPACE -, -gomu -, 0, 0 }, - -291 { -NULL -, } }; - -293  -osdmuem - - gkeݙems -[] = { { " Show keybrd", -NULL -, 0, -toggkeybrd -, 0, 0 }, - -294 { " Sticky mod keys", -NULL -, 0, -toggˡickykeys -,0, 0 }, - -295 { " Defmpg", -NULL -, 0, -defempg -, 0, 0 }, - -296 { "Savmpg...", -NULL -, 0, -vempg -, 0, 0 }, - -297 { "Ld mpg...", -NULL -, 0, -ldmpg -, 0, 0 }, - -298 { "Rempg", -NULL -, 0, -tmpg -, 0, 0 }, - -299 { -OSDMENUBAR -, -NULL -, 0, NULL, 0, 0 }, - -300 { "Back", "\x17", -SDLK_BACKSPACE -, -gomu -, 0, 0 }, - -301 { -NULL -, } }; - -305  -osdmuem - - gdbݙems -[] = { { " Autd symbޠfe", -NULL -, 0, -toggsymbާuto -, 0, 0 }, - -306 { " Ca-nsivsymbs", -NULL -, 0, -toggsyms -, 0, 0 }, - -307 { -OSDMENUBAR -, -NULL -, 0, NULL, 0, 0 }, - -308 { "Back", "\x17", -SDLK_BACKSPACE -, -gomu -, 0, 0 }, - -309 { -NULL -, } }; - -311 #ifde -__OPENGL_AVAILABLE__ - - -312  -osdmuem - - gvdݙems -[] = { { " OnGLdg", "O", 'o', -sw_nd_mode -, -RENDERMODE_GL -, 0 }, - -313 { " Sowndg", "S", 's', -sw_nd_mode -, -RENDERMODE_SW -, 0 }, - -314 { -OSDMENUBAR -, -NULL -, 0, NULL, 0, 0 }, - -315 { " Fusn", "[F8]", -SDLK_F8 -, -toggfusn -, 0, 0 }, - -316 { " Sƚes", "C", 'c', -toggsƚes -, 0, 0 }, - -317 { -OSDMENUBAR -, -NULL -, 0, NULL, 0, 0 }, - -318 { "Back", "\x17", -SDLK_BACKSPACE -, -gomu -, 0, 0 }, - -319 { -NULL -, } }; - -321  -osdmuem - - gvdݙems -[] = { { " Fusn", "F", 'f', -toggfusn -, 0, 0 }, - -322 { " Sƚes", "C", 'c', -toggsƚes -, 0, 0 }, - -323 { -OSDMENUBAR -, -NULL -, 0, NULL, 0, 0 }, - -324 { "Back", "\x17", -SDLK_BACKSPACE -, -gomu -, 0, 0 }, - -325 { -NULL -, } }; - -328  -osdmuem - - gglݙems -[] = { { " OnGLdg", "O", 'o', -sw_nd_mode -, -RENDERMODE_GL -, 0 }, - -329 { " Sowndg", "S", 's', -sw_nd_mode -, -RENDERMODE_SW -, 0 }, - -330 { -OSDMENUBAR -, -NULL -, 0, NULL, 0, 0 }, - -331 { " Fusn", "F", 'f', -toggfusn -, 0, 0 }, - -332 { " 50Hz/60Hzeio", "R", 'r', -toggˬio -, 0, 0 }, - -333 { " Hizڏȡtch", "H", 'h', -togghtch -, 0, 0 }, - -334 { " Sƚes", "C", 'c', -toggsƚes -, 0, 0 }, - -335 { " PAL ghog", "P", 'p', -togg˷lgho -, 0, 0 }, - -336 { -OSDMENUBAR -, -NULL -, 0, NULL, 0, 0 }, - -337 { "Back", "\x17", -SDLK_BACKSPACE -, -gomu -, 0, 0 }, - -338 { -NULL -, } }; - -340  -osdmuem - - gaboutems -[] = { { "", -NULL -, 0, NULL, 0, 0 }, - -341 { -APP_NAME_FULL -, -NULL -, 0, NULL, 0, -OMIF_BRIGHT -| -OMIF_CENTRED - }, - -342 { "hps://ghub.com/-gd/icu", -NULL -, 0, -gose -, 0, -OMIF_CENTRED - }, - -343 { "", -NULL -, 0, NULL, 0, 0 }, - -344 { "(C)" -APP_YEAR - " P Gd", -NULL -, 0, NULL, 0, -OMIF_BRIGHT -| -OMIF_CENTRED - }, - -345 { "hp://www.rgd.g.uk", -NULL -, 0, -gose -, 0, -OMIF_CENTRED - }, - -346 { "", -NULL -, 0, NULL, 0, 0 }, - -347 { "Addiڮrogmmg", -NULL -, 0, NULL, 0, -OMIF_BRIGHT -| -OMIF_CENTRED - }, - -348 { "FncoiRev", -NULL -, 0, NULL, 0, -OMIF_CENTRED - }, - -349 { "SHaubth", -NULL -, 0, NULL, 0, -OMIF_CENTRED - }, - -350 { "Axd Devt", -NULL -, 0, NULL, 0, -OMIF_CENTRED - }, - -351 { "Ibisum", -NULL -, 0, NULL, 0, -OMIF_CENTRED - }, - -352 { "Kam Biskri", -NULL -, 0, NULL, 0, -OMIF_CENTRED - }, - -353 { "Iss", -NULL -, 0, NULL, 0, -OMIF_CENTRED - }, - -354 { "Pri Tgu", -NULL -, 0, NULL, 0, -OMIF_CENTRED - }, - -355 { "", -NULL -, 0, NULL, 0, 0 }, - -356 { -OSDMENUBAR -, -NULL -, 0, NULL, 0, 0 }, - -357 { "Back", "\x17", -SDLK_BACKSPACE -, -gomu -, 0, 0 }, - -358 { -NULL -, } }; - -360  -osdmuem - - govݙems -[] = { { " 1mhz (Ne)", "1", '1', -tovock -, 0, 0 }, - -361 { " 2mhz", "2", '2', -tovock -, 1, 0 }, - -362 { " 4mhz", "3", '3', -tovock -, 2, 0 }, - -363 { " 8mhz", "4", '4', -tovock -, 3, 0 }, - -364 { " 16mhz", "5", '5', -tovock -, 4, 0 }, - -365 { " 32mhz", "6", '6', -tovock -, 5, 0 }, - -366 { " 64mhz", "7", '7', -tovock -, 6, 0 }, - -367 { -OSDMENUBAR -, -NULL -, 0, NULL, 0, 0 }, - -368 { "Back", "\x17", -SDLK_BACKSPACE -, -gomu -,0, 0 }, - -369 { -NULL -, } }; - -371  - #LAST_ITEM -( -x -(((x)/( -osdmuem -))-2) - - ) - -373  -osdmu - - gmus -[] = { { "Ma Mu", -LAST_ITEM -( -maems -)-4, mainitems }, - -374 { "Hdwtis", -LAST_ITEM -( -hwݙems -), hwopitems }, - -375 { "Auditis", -LAST_ITEM -( -auݙems -),uopitems }, - -376 { "Debug ois", -LAST_ITEM -( -dbݙems -), dbopitems }, - -377 { "Videtis", -LAST_ITEM -( -vdݙems -), vdopitems }, - -378 { "AbouOricu", -LAST_ITEM -( -aboutems -),boutitems }, - -379 { "Ovock", -LAST_ITEM -( -ovݙems -), ovopitems }, - -380 { "Keybrd ois", -LAST_ITEM -( -keݙems -), keopitems }}; - -383 -SDL_bo - - $gimg_ld - -guiimg - * -gi - ) - -385 -SDL_RWs - * -f -; - -386 -Ut8 - -hdrbuf -[640*3]; - -387 -St32 - -x -, -y -; - -388 -SDL_bo - -feok -; - -391 -f - = - `SDL_RWFromFe - -gi --> -fame -, "rb" ); - -392 if! -f - ) - -394 - `r_tf -"guUbˁݒ '%s'\n", -gi --> -fame - ); - -395 - `r_tf -("SDLr : %s\n", - `SDL_GE -()); - -396  -SDL_FALSE -; - -400 if - `SDL_RWad - -f -, -hdrbuf -, 54, 1 ) != 1 ) - -402 - `r_tf -"E܄dg '%s'\n", -gi --> -fame - ); - -403 - `SDL_RWo - -f - ); - -404  -SDL_FALSE -; - -407 -feok - = -SDL_TRUE -; - -408 if - `cmp -(*) -hdrbuf -, "BM", 2 ) !0 ) -feok - = -SDL_FALSE -; - -409 if(( -hdrbuf -[21]<<24)|(hdrbuf[20]<<16)|(hdrbuf[19]<<8)|hdrbuf[18]! -gi --> -w - ) -feok - = -SDL_FALSE -; - -410 if(( -hdrbuf -[25]<<24)|(hdrbuf[24]<<16)|(hdrbuf[23]<<8)|hdrbuf[22]! -gi --> -h - ) -feok - = -SDL_FALSE -; - -411 if(( -hdrbuf -[27]<<8)|hdrbuf[26]!1 ) -feok - = -SDL_FALSE -; - -412 if(( -hdrbuf -[29]<<8)|hdrbuf[28]!24 ) -feok - = -SDL_FALSE -; - -413 if(( -hdrbuf -[33]<<24)|(hdrbuf[32]<<16)|(hdrbuf[31]<<8)|hdrbuf[30]!0 ) -feok - = -SDL_FALSE -; - -415 if! -feok - ) - -417 - `r_tf -"'%s'dtb%dx%d, uncomesd, 24-b BMP image\n", -gi --> -fame -, gi-> -w -, gi-> -h - ); - -418 - `SDL_RWo - -f - ); - -419  -SDL_FALSE -; - -423 if! -gi --> -buf - ) - -424 -gi --> -buf - = - `mloc -gi-> -w - * gi-> -h - * 3 ); - -426 if! -gi --> -buf - ) - -428 - `r_tf -( "Out of memory\n" ); - -429 - `SDL_RWo - -f - ); - -430  -SDL_FALSE -; - -434  -y -= -gi --> -h --1; y>=0; y-- ) - -436 - `SDL_RWad - -f -, -hdrbuf -, (( -gi --> -w -*3)+3)&0xfffffffc, 1 ); - -437  -x -=0; x< -gi --> -w -; x++ ) - -439 -gi --> -buf -[( -y -*gi-> -w -+ -x -)*3+0] = -hdrbuf -[x*3+2]; - -440 -gi --> -buf -[( -y -*gi-> -w -+ -x -)*3+1] = -hdrbuf -[x*3+1]; - -441 -gi --> -buf -[( -y -*gi-> -w -+ -x -)*3+2] = -hdrbuf -[x*3]; - -445 - `SDL_RWo - -f - ); - -447  -SDL_TRUE -; - -448 - } -} - -451  - $dw_usb - -mache - * -ic - ) - -453 i( -ic --> -usb_mode - = -STATUSBARMODE_NONE -) - -454 -ic --> - `nd_r_ -0, -GIMG_POS_SBARY -, 640, 480-GIMG_POS_SBARY ); - -456 -ic --> - `nd_gimg - -GIMG_STATUSBAR -, 0, -GIMG_POS_SBARY - ); - -457 - } -} - -459  - $dw_keybrd - -mache - * -ic - ) { - -460 i( -ic --> -show_keybrd -) { - -461  -ic --> -ty - ) - -463  -MACH_PRAVETZ -: - -464 -ic --> - `nd_gimg - -GIMG_PRAVETZ_KEYBOARD -, 0, 480); - -466  -MACH_ORIC1 -: - -467  -MACH_ORIC1_16K -: - -468 -ic --> - `nd_gimg - -GIMG_ORIC1_KEYBOARD -, 0, 480); - -471 -ic --> - `nd_gimg - -GIMG_ATMOS_KEYBOARD -, 0, 480); - -475 - } -} - -478  - $dw_disks - -mache - * -ic - ) - -480 -St32 - -i -, -j -; - -482 if -ic --> -usb_mode - = -STATUSBARMODE_NONE - ) - -485 if -ic --> -drivy - = -DRV_NONE - ) - -487 -ic --> - `nd_gimg - -GIMG_STATUSBAR -, -GIMG_POS_DISKX -, -GIMG_POS_SBARY -, GIMG_POS_DISKX, 0, 18*4, 16 ); - -491  -i -=0; i<4; i++ ) - -493 -j - = -GIMG_DISK_EJECTED -; - -494 if -ic --> -wddisk -. -disk -[ -i -] ) - -496 -j - = (( -ic --> -wddisk -. -c_drive -== -i -)&&(ic->wddisk. -cut -!= -COP_NUFFINK -)? -GIMG_DISK_ACTIVE - : -GIMG_DISK_IDLE -; - -497 if -ic --> -wddisk -. -disk -[ -i -]-> -modifd - ) -j -+=2; - -499 -ic --> - `nd_gimg - -j -, -GIMG_POS_DISKX -+ -i -* -GIMG_W_DISK -, -GIMG_POS_SBARY - ); - -501 - } -} - -504  - $dw_avec - -mache - * -ic -, -SDL_bo - -cdg - ) - -506 if -ic --> -usb_mode - = -STATUSBARMODE_NONE -) - -509 if -cdg - ) - -511 -ic --> - `nd_gimg - -GIMG_AVI_RECORD -, -GIMG_POS_AVIRECX -, -GIMG_POS_SBARY - ); - -515 -ic --> - `nd_gimg - -GIMG_STATUSBAR -, -GIMG_POS_AVIRECX -, -GIMG_POS_SBARY -, GIMG_POS_AVIRECX, 0, 16, 16 ); - -516 - } -} - -519  - $dw_ - -mache - * -ic - ) - -521 if -ic --> -usb_mode - = -STATUSBARMODE_NONE - ) - -524 if -ic --> -p - ) - -526 -ic --> - `nd_gimg - -GIMG_TAPE_RECORD -, -GIMG_POS_TAPEX -, -GIMG_POS_SBARY - ); - -530 if! -ic --> -buf - ) - -532 -ic --> - `nd_gimg - -GIMG_TAPE_EJECTED -, -GIMG_POS_TAPEX -, -GIMG_POS_SBARY - ); - -536 if -ic --> -m - ) - -538 -ic --> - `nd_gimg - -GIMG_TAPE_PLAY -, -GIMG_POS_TAPEX -, -GIMG_POS_SBARY - ); - -542 if -ic --> -offs - >ic-> -n - ) - -544 -ic --> - `nd_gimg - -GIMG_TAPE_STOP -, -GIMG_POS_TAPEX -, -GIMG_POS_SBARY - ); - -548 -ic --> - `nd_gimg - -GIMG_TAPE_PAUSE -, -GIMG_POS_TAPEX -, -GIMG_POS_SBARY - ); - -549 - } -} - -552  - $do_pup - -mache - * -ic -, * -r - ) - -554 - `y - -ic --> -pupr -, -r -, 40 ); oric->popupstr[39] = 0; - -555 -ic --> -wpupr - = -SDL_TRUE -; - -556 -ic --> -puime - = 100; - -557 - } -} - -559  - $nd_us - -mache - * -ic - ) - -561 if -eshus - ) - -562 - `dw_usb - -ic - ); - -564 if -eshdisks - || -eshus - ) - -566 - `dw_disks - -ic - ); - -567 -eshdisks - = -SDL_FALSE -; - -570 if -eshavi - || -eshus - ) - -572 - `dw_avec - -ic -, -vidp - ! -NULL - ); - -573 -eshavi - = -SDL_FALSE -; - -576 if -esh - || -eshus - ) - -578 - `dw_ - -ic - ); - -579 -esh - = -SDL_FALSE -; - -582 if( -eshkeybrd - || -eshus -) { - -583 - `dw_keybrd - -ic - ); - -584 -eshkeybrd - = -SDL_FALSE -; - -587 -eshus - = -SDL_FALSE -; - -588 - } -} - -591  - $nd - -mache - * -ic - ) - -593  -rc -, -s -; - -595 if -ic --> -emu_mode - = -EM_DEBUG - ) - -596 - `m_upde - -ic - ); - -598 -ic --> - `nd_beg -( oric ); - -600  -ic --> -emu_mode - ) - -602  -EM_MENU -: - -603 -ic --> - `nd_video -ic, -SDL_TRUE - ); - -604 - `nd_us - -ic - ); - -605 if -tz -[ -TZ_MENU -] ) -ic --> - `nd_xtze -( oric, TZ_MENU ); - -608  -EM_RUNNING -: - -609 -ic --> - `nd_video -ic, -SDL_TRUE - ); - -610 - `nd_us - -ic - ); - -611 if -ic --> -usb_mode - = -STATUSBARMODE_FULL - ) - -613 -s - = 100000/( -amimve -?frametimeave:1); - -614 if -ic --> -vid_eq - ) - -615 -rc - = 200000/( -amimve -?frametimeave:1); - -617 -rc - = 166667/( -amimve -?frametimeave:1); - -619 #ifde -DEBUG_VSYNC - - -620 - `rtf - -ic --> -usr -, "%4d.%02d%% - %4dFPS VSYNC:%3d", -rc -/100,c%100, -s -/100, oric-> -vid_offt - ); - -622 - `rtf - -ic --> -usr -, "%4d.%02d%% - %4dFPS", -rc -/100,c%100, -s -/100 ); - -625 -ic --> -wusr - = -SDL_TRUE -; - -627 if -ic --> -puime - > 0 ) - -629 -ic --> -puime ---; - -630 if -ic --> -puime - == 0 ) - -632 -ic --> -pupr -[0] = 0; - -633 -ic --> -wpupr - = -SDL_TRUE -; - -638  -EM_DEBUG -: - -639 - `m_nd - -ic - ); - -643 -ic --> - `nd_d -( oric ); - -644 - } -} - -650  - $makebox - -xtze - * -z -,  -x -,  -y -,  -w -,  -h -,  -fg -,  -bg - ) - -652  -cx -, -cy -, -o -, -bo -; - -654 -o - = -y -* -z --> -w -+ -x -; - -655  -cy -=0; cy< -h -; cy++ ) - -657  -cx -=0; cx< -w -; cx++ ) - -659 -z --> -tx -[ -o - ] = ' '; - -660 -z --> -fc -[ -o - ] = -fg -; - -661 -z --> -bc -[ -o -++] = -bg -; - -663 -z --> -tx -[ -o -- -w -] = 5; - -664 -z --> -tx -[ -o --1] = 5; - -665 -o - + -z --> -w --w; - -669 -o - = -y -* -z --> -w -+ -x -; - -670 -bo - = -o - + ( -h --1)* -z --> -w -; - -671  -cx -=0; cx<( -w --1); cx++ ) - -673 -z --> -tx -[ -o -++] = -cx -==0?1:2; - -674 -z --> -tx -[ -bo -++] = -cx -==0?9:2; - -676 -z --> -tx -[ -o -] = 4; - -677 -z --> -tx -[ -bo -] = 11; - -679 -z --> -modifd - = -SDL_TRUE -; - -680 - } -} - -683  - $tzr - -xtze - * -z -, * -xt - ) - -685  -i -, -o -; - -687 -o - = -z --> -py -*z-> -w -+z-> -px -; - -688  -i -=0; -xt - &&ext[i]; i++ ) - -690  -xt -[ -i -] ) - -693 -z --> -px - = 1; - -694 -z --> -py -++; - -695 -o - = -z --> -py -*z-> -w -+1; - -702 -z --> -tx -[ -o - ] = -xt -[ -i -]; - -703 -z --> -fc -[ -o - ] =tz-> -cfc -; - -704 -z --> -bc -[ -o -++] =tz-> -cbc -; - -705 -z --> -px -++; - -706 if -z --> -px - >z-> -w - ) - -708 -z --> -px - = 1; - -709 -z --> -py -++; - -710 -o - = -z --> -py -*z-> -w -+1; - -716 -z --> -modifd - = -SDL_TRUE -; - -717 - } -} - -719  - $tzputc - -xtze - * -z -,  -c - ) - -721  -tmp -[2]; - -722 -tmp -[0] = -c -; - -723 -tmp -[1] = 0; - -724 - `tzr - -z -, -tmp - ); - -725 - } -} - -728  - $tztf - -xtze - * -z -, * -fmt -, ... ) - -730 -va_li - - -; - -731 - `va_t - - -, -fmt - ); - -732 if - `vtf - -vtmp -, -VSPTMPSIZE -, -fmt -, - - ) != -1 ) - -734 -vtmp -[ -VSPTMPSIZE --1] = 0; - -735 - `tzr - -z -, -vtmp - ); - -737 - `va_d - - - ); - -738 - } -} - -741  - $tzos - -xtze - * -z -,  -x -,  -y -, * -xt - ) - -743 -z --> -px - = -x -; - -744 -z --> -py - = -y -; - -745 - `tzr - -z -, -xt - ); - -746 - } -} - -749  - $tztos - -xtze - * -z -,  -x -,  -y -, * -fmt -, ... ) - -751 -va_li - - -; - -752 - `va_t - - -, -fmt - ); - -753 if - `vtf - -vtmp -, -VSPTMPSIZE -, -fmt -, - - ) != -1 ) - -755 -vtmp -[ -VSPTMPSIZE --1] = 0; - -756 - `tzos - -z -, -x -, -y -, -vtmp - ); - -758 - `va_d - - - ); - -759 - } -} - -762  - $tztc - -xtze - * -z -,  -fc -,  -bc - ) - -764 -z --> -cfc - = -fc -; - -765 -z --> -cbc - = -bc -; - -766 - } -} - -769  - $tz - -xtze - * -z -, * -t - ) - -771  -ox -, -oy -; - -772 - `makebox - -z -, 0, 0,tz-> -w -,tz-> -h -, - `mufc -( -SDL_FALSE -), - `mubc -(SDL_FALSE)); - -773 if! -t - ) ; - -775 - `tztc - -z -, - `mufc -( -SDL_FALSE -), - `mubc -(SDL_FALSE)); - -776 -ox - = -z --> -px -; - -777 -oy - = -z --> -py -; - -778 -z --> -px - = 3; - -779 -z --> -py - = 0; - -780 - `tzr - -z -, "[ " ); - -781 - `tzr - -z -, -t - ); - -782 - `tzr - -z -, " ]" ); - -783 -z --> -px - = -ox -; - -784 -z --> -py - = -oy -; - -785 - } -} - -787 -SDL_bo - - $_xtze - -xtze - * -tz -,  -x -,  -y - ) - -789 if -x - > -tz -->x ) && ( x < (tz->x+tz-> -w -*8) ) && - -790 -y - > -tz -->y ) && ( y < (tz->y+tz-> -h -*12) ) ) - -792  -SDL_TRUE -; - -795  -SDL_FALSE -; - -796 - } -} - -799 -SDL_bo - - $loc_xtze - -mache - * -ic -,  -i -,  -x -,  -y -,  -w -,  -h -, * -t - ) - -801  -xtze - * -z -; - -803 -z - = - `mloc - -xtze - ) + -w -* -h -*3 ); - -804 if! -z - )  -SDL_FALSE -; - -806 -z --> -x - = x; - -807 -z --> -y - = y; - -808 -z --> -w - = w; - -809 -z --> -h - = h; - -811 -z --> -tx - = (*)(&ntz[1]); - -812 -z --> -fc - = &z-> -tx -[ -w -* -h -]; - -813 -z --> -bc - = &z-> -fc -[ -w -* -h -]; - -815 - `tz - -z -, -t - ); - -817 -z --> -px - = 1; - -818 -z --> -py - = 1; - -820 -z --> -modifd - = -SDL_TRUE -; - -822 -tz -[ -i -] = -z -; - -823 -ic --> - `nd_xtze_loc -ic, -i - ); - -825  -SDL_TRUE -; - -826 - } -} - -828  - $r_xtze - -mache - * -ic -,  -i - ) - -830  -x -, -y -; - -831  -xtze - * -z - = -tz -[ -i -]; - -833 i(! -z -) ; - -835  -y -=1; y<( -z --> -h --1); y++ ) - -837  -x -=1; x<( -z --> -w --1); x++ ) - -839 -z --> -tx -[ -y -*z-> -w -+ -x -] = ' '; - -840 -z --> -fc -[ -y -*z-> -w -+ -x -] = 2; - -841 -z --> -bc -[ -y -*z-> -w -+ -x -] = 3; - -845 -z --> -modifd - = -SDL_TRUE -; - -846 - } -} - -849  - $_xtze - -mache - * -ic -,  -i - ) - -851 -ic --> - `nd_xtze_ -ic, -i - ); - -852 if! -tz -[ -i -] ) ; - -853 - ` - -tz -[ -i -] ); - -854 -tz -[ -i -] = -NULL -; - -855 - } -} - -858  - $dwems -( ) - -860  -i -, -j -, -o -; - -863 if! -cmu - ) || ( ! -tz -[ -TZ_MENU -] ) ) - -867  -i -=0; -cmu --> -ems -[i]. -me -; i++ ) - -870 if -cmu --> -ems -[ -i -]. -me - = -OSDMENUBAR - ) - -873 -o - = -tz -[ -TZ_MENU -]-> -w - * ( -i -+1) + 1; - -874  -j -=1; j< -tz -[ -TZ_MENU -]-> -w --1; j++, -o -++ ) - -876 -tz -[ -TZ_MENU -]-> -tx -[ -o -] = 12; - -877 -tz -[ -TZ_MENU -]-> -fc -[ -o -] = - `mufc -( -SDL_FALSE -); - -878 -tz -[ -TZ_MENU -]-> -bc -[ -o -] = - `mubc -( -SDL_FALSE -); - -884 if -i -== -cmu --> -cem - ) - -885 - `tztc - -tz -[ -TZ_MENU -], - `mufc -( -SDL_TRUE -), - `mubc -(SDL_TRUE)); - -887 - `tztc - -tz -[ -TZ_MENU -], ( -cmu --> -ems -[ -i -]. -ags -& -OMIF_BRIGHT -? 1 : - `mufc -( -SDL_FALSE -), - `mubc -(SDL_FALSE)); - -890 -o - = -tz -[ -TZ_MENU -]-> -w - * ( -i -+1) + 1; - -893  -j -=1; j< -tz -[ -TZ_MENU -]-> -w --1; j++, -o -++ ) - -894 -tz -[ -TZ_MENU -]-> -bc -[ -o -] =z[TZ_MENU]-> -cbc -; - -897 if -cmu --> -ems -[ -i -]. -ags - & -OMIF_CENTRED - ) - -898 - `tzos - -tz -[ -TZ_MENU -], (tz[TZ_MENU]-> -w --() - ` -( -cmu --> -ems -[ -i -]. -me -))/2, i+1, cmenu->items[i].name ); - -900 - `tzos - -tz -[ -TZ_MENU -], 1, -i -+1, -cmu --> -ems -[i]. -me - ); - -903 if -cmu --> -ems -[ -i -]. -key - ) - -904 - `tzos - -tz -[ -TZ_MENU -],z[TZ_MENU]-> -w --(1+() - ` -( -cmu --> -ems -[ -i -]. -key -)), i+1, cmenu->items[i].key ); - -906 - } -} - -910  - $joth -* -th -, * -fe - ) - -912 #i - `defed -( -__amigaos4__ -) - -913 - `ry - -fmp -, -th - ); - -914 -IDOS --> - `AddPt - -fmp -, -fe -, 4096 ); - -915 #i - `defed -( -WIN32 -) - -916  -i -; - -917 - `y - -fmp -, -th -, 4096 ); filetmp[4095] = 0; - -918 -i - = - ` - -fmp - ); - -919 if -i - > 0 ) && ( -fmp -[i-1] ! -PATHSEP - ) && ( filetmp[i-1] != ':' ) ) - -921 -fmp -[ -i -++] = -PATHSEP -; - -922 -fmp -[ -i -++] = 0; - -924 - `t - -fmp -, -fe -, 4096+512 ); - -925 -fmp -[4096+511] = 0; - -927  -i -; - -928 - `y - -fmp -, -th -, 4096 ); filetmp[4095] = 0; - -929 -i - = () - ` - -fmp - ); - -930 if -i - > 0 ) && ( -fmp -[i-1] ! -PATHSEP - ) ) - -932 -fmp -[ -i -++] = -PATHSEP -; - -933 -fmp -[ -i -++] = 0; - -935 - `t - -fmp -, -fe -, 4096+512 ); - -936 -fmp -[4096+511] = 0; - -938 - } -} - -941  - $ - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -943 if! - `feque - -ic -, "Ine", -th -, -fe -, -FR_TAPELOAD - ) ) ; - -944 -ic --> -ϡfe -[0] = 0; - -945 - `joth - -th -, -fe - ); - -947  - `de_image_ty -( -fmp -)) - -949  -IMG_SNAPSHOT -: - -950 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -954 - `ld_sh -( -ic -, -fmp -); - -959  -IMG_ATMOS_MICRODISC -: - -960 i(( -ic --> -ty - ! -MACH_ATMOS -) && - -961 ( -ic --> -ty - ! -MACH_ORIC1 -) && - -962 ( -ic --> -ty - ! -MACH_PRAVETZ -)) - -964 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -968 - `swmach - -ic -, -NULL -, ( -DRV_MICRODISC -<<16)| -MACH_ATMOS - ); - -969 - `joth - -th -, -fe - ); - -970 - `diskimage_ld - -ic -, -fmp -, 0 ); - -972 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -976 i( -ic --> -drivy - ! -DRV_MICRODISC -) - -978 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -982 - `swmach - -ic -, -NULL -, ( -DRV_MICRODISC -<<16)|ic-> -ty - ); - -983 - `joth - -th -, -fe - ); - -984 - `diskimage_ld - -ic -, -fmp -, 0 ); - -986 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -990 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -994 - `joth - -th -, -fe - ); - -995 - `diskimage_ld - -ic -, -fmp -, 0 ); - -997 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1000  -IMG_ATMOS_JASMIN -: - -1001 i(( -ic --> -ty - ! -MACH_ATMOS -) && - -1002 ( -ic --> -ty - ! -MACH_ORIC1 -) && - -1003 ( -ic --> -ty - ! -MACH_PRAVETZ -)) - -1005 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -1009 - `swmach - -ic -, -NULL -, ( -DRV_JASMIN -<<16)| -MACH_ATMOS - ); - -1010 - `joth - -th -, -fe - ); - -1011 - `diskimage_ld - -ic -, -fmp -, 0 ); - -1012 -ic --> -auto_jasm_t - = -SDL_TRUE -; - -1014 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1018 i( -ic --> -drivy - ! -DRV_JASMIN -) - -1020 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -1024 - `swmach - -ic -, -NULL -, ( -DRV_JASMIN -<<16)|ic-> -ty - ); - -1025 - `joth - -th -, -fe - ); - -1026 - `diskimage_ld - -ic -, -fmp -, 0 ); - -1027 -ic --> -auto_jasm_t - = -SDL_TRUE -; - -1029 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1033 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -1037 - `joth - -th -, -fe - ); - -1038 - `diskimage_ld - -ic -, -fmp -, 0 ); - -1040 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1043  -IMG_TELESTRAT_DISK -: - -1044 i( -ic --> -ty - ! -MACH_TELESTRAT -) - -1046 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -1050 - `swmach - -ic -, -NULL -, -MACH_TELESTRAT - ); - -1051 - `joth - -th -, -fe - ); - -1052 - `diskimage_ld - -ic -, -fmp -, 0 ); - -1054 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1058 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -1062 - `joth - -th -, -fe - ); - -1063 - `diskimage_ld - -ic -, -fmp -, 0 ); - -1065 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1068  -IMG_PRAVETZ_DISK -: - -1069 i( -ic --> -ty - ! -MACH_PRAVETZ -) - -1071 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -1075 - `swmach - -ic -, -NULL -, ( -DRV_PRAVETZ -<<16)| -MACH_PRAVETZ - ); - -1076 - `joth - -th -, -fe - ); - -1077 - `diskimage_ld - -ic -, -fmp -, 0 ); - -1078 - `avdiskbo - -ic - ); - -1080 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1084 i( -ic --> -drivy - ! -DRV_PRAVETZ -) - -1086 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -1090 - `swmach - -ic -, -NULL -, ( -DRV_PRAVETZ -<<16)| -MACH_PRAVETZ - ); - -1091 - `joth - -th -, -fe - ); - -1092 - `diskimage_ld - -ic -, -fmp -, 0 ); - -1093 - `avdiskbo - -ic - ); - -1095 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1099 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -1103 - `joth - -th -, -fe - ); - -1104 - `diskimage_ld - -ic -, -fmp -, 0 ); - -1106 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1109  -IMG_GUESS_MICRODISC -: - -1110 i(( -ic --> -drivy - = -DRV_PRAVETZ -) || - -1111 ( -ic --> -drivy - = -DRV_NONE -)) - -1113 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -1117 - `swmach - -ic -, -NULL -, ( -DRV_MICRODISC -<<16)|ic-> -ty - ); - -1118 - `joth - -th -, -fe - ); - -1119 - `diskimage_ld - -ic -, -fmp -, 0 ); - -1121 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1125 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -1129 - `joth - -th -, -fe - ); - -1130 - `diskimage_ld - -ic -, -fmp -, 0 ); - -1132 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1136 - `_ld_p - -ic -, -fmp - ); - -1137 if -ic --> -symbާutd - ) - `m_w_symbs -&ic-> -ursyms -, oric, "symbs", -SYM_BESTGUESS -, -SDL_TRUE -, SDL_TRUE ); - -1138 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1139 - } -} - -1142  - $disk - -mache - * -ic -,  -osdmuem - * -mem -,  -drive - ) - -1144 * -dth -, * -dfe -; - -1146 if -ic --> -ty - ! -MACH_TELESTRAT - ) - -1148  -ic --> -drivy -) - -1150  -DRV_PRAVETZ -: - -1151 -dth - = -avdiskth -; - -1152 -dfe - = -avdiskfe -; - -1156 -dth - = -diskth -; - -1157 -dfe - = -diskfe -; - -1161 -dth - = -diskth -; - -1162 -dfe - = -diskfe -; - -1165 if! - `feque - -ic -, "In disk", -dth -, -dfe -, -FR_DISKLOAD - ) ) ; - -1166 - `joth - -dth -, -dfe - ); - -1168  - `de_image_ty -( -fmp -)) - -1170  -IMG_SNAPSHOT -: - -1171 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -1175 - `ld_sh -( -ic -, -fmp -); - -1180  -IMG_ATMOS_MICRODISC -: - -1181 i(( -ic --> -ty - ! -MACH_ATMOS -) && - -1182 ( -ic --> -ty - ! -MACH_ORIC1 -) && - -1183 ( -ic --> -ty - ! -MACH_PRAVETZ -)) - -1185 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -1189 - `swmach - -ic -, -NULL -, ( -DRV_MICRODISC -<<16)| -MACH_ATMOS - ); - -1194 i(( -ic --> -drivy - ! -DRV_MICRODISC -) && - -1195 ( -ic --> -drivy - ! -DRV_NONE -)) - -1197 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -1201 - `swmach - -ic -, -NULL -, ( -DRV_MICRODISC -<<16)|ic-> -ty - ); - -1207  -IMG_ATMOS_JASMIN -: - -1208 i(( -ic --> -ty - ! -MACH_ATMOS -) && - -1209 ( -ic --> -ty - ! -MACH_ORIC1 -) && - -1210 ( -ic --> -ty - ! -MACH_PRAVETZ -)) - -1212 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -1216 - `swmach - -ic -, -NULL -, ( -DRV_JASMIN -<<16)| -MACH_ATMOS - ); - -1217 -ic --> -auto_jasm_t - = -SDL_TRUE -; - -1222 i( -ic --> -drivy - = -DRV_NONE -) - -1224 - `swmach - -ic -, -NULL -, ( -DRV_JASMIN -<<16)|ic-> -ty -); - -1225 -ic --> -auto_jasm_t - = -SDL_TRUE -; - -1229 i( -ic --> -drivy - ! -DRV_JASMIN -) - -1231 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -1235 - `swmach - -ic -, -NULL -, ( -DRV_JASMIN -<<16)|ic-> -ty - ); - -1236 -ic --> -auto_jasm_t - = -SDL_TRUE -; - -1242  -IMG_TELESTRAT_DISK -: - -1243 i( -ic --> -ty - ! -MACH_TELESTRAT -) - -1245 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -1249 - `swmach - -ic -, -NULL -, -MACH_TELESTRAT - ); - -1255  -IMG_PRAVETZ_DISK -: - -1256 i( -ic --> -ty - ! -MACH_PRAVETZ -) - -1258 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -1262 - `swmach - -ic -, -NULL -, ( -DRV_PRAVETZ -<<16)| -MACH_PRAVETZ - ); - -1263 - `avdiskbo - -ic - ); - -1268 i( -ic --> -drivy - = -DRV_NONE -) - -1270 - `swmach - -ic -, -NULL -, ( -DRV_PRAVETZ -<<16)| -MACH_PRAVETZ - ); - -1271 - `avdiskbo - -ic - ); - -1275 i( -ic --> -drivy - ! -DRV_PRAVETZ -) - -1277 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -1281 - `swmach - -ic -, -NULL -, ( -DRV_PRAVETZ -<<16)| -MACH_PRAVETZ - ); - -1282 - `avdiskbo - -ic - ); - -1288  -IMG_GUESS_MICRODISC -: - -1289 i( -ic --> -drivy - = -DRV_PRAVETZ -) - -1291 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -1295 - `swmach - -ic -, -NULL -, ( -DRV_MICRODISC -<<16)|ic-> -ty - ); - -1301  -IMG_TAPE -: - -1302 i( - `msgbox -( -ic -, -MSGBOX_YES_NO -, - -1306 -ic --> -ϡfe -[0] = 0; - -1307 - `_ld_p - -ic -, -fmp - ); - -1308 if -ic --> -symbާutd - ) - `m_w_symbs -&ic-> -ursyms -, oric, "symbs", -SYM_BESTGUESS -, -SDL_TRUE -, SDL_TRUE ); - -1310 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1314 - `joth - -dth -, -dfe - ); - -1315 - `diskimage_ld - -ic -, -fmp -, -drive - ); - -1317 if -ic --> -drivy - = -DRV_NONE - ) - -1319 - `swmach - -ic -, -NULL -, ( -DRV_MICRODISC -<<16)|ic-> -ty - ); - -1323 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1324 - } -} - -1326  - $ve - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1328 if! - `feque - -ic -, "SavSpsh", -th -, -fe -, -FR_SNAPSHOTSAVE - ) ) ; - -1329 - `joth - -th -, -fe - ); - -1330 - `ve_sh - -ic -, -fmp - ); - -1331 - } -} - -1333  - $ld - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1335 if! - `feque - -ic -, "Ld Spsh", -th -, -fe -, -FR_SNAPSHOTLOAD - ) ) ; - -1336 - `joth - -th -, -fe - ); - -1337 - `ld_sh - -ic -, -fmp - ); - -1338 - } -} - -1340  - $soợtic -( -mache - * -ic -,  -osdmuem - * -mem -,  -dummy -) - -1342 -ic --> -u -. -nmi - = -SDL_TRUE -; - -1343 -ic --> -u -. -nmicou - = 2; - -1344 - `mumode -( -ic -, -NULL -, -EM_RUNNING -); - -1345 - } -} - -1348  - $tic - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1350  -ic --> -drivy - ) - -1352  -DRV_MICRODISC -: - -1353 -ic --> -romdis - = -SDL_TRUE -; - -1354 - `miodisc_ -& -ic --> -md -, &ic-> -wddisk -, oric ); - -1357  -DRV_JASMIN -: - -1358 -ic --> -romdis - = -SDL_TRUE -; - -1362 -ic --> -romdis - = -SDL_FALSE -; - -1365 - `om - -ic - ); - -1366 - `m6502_t -& -ic --> -u - ); - -1367 - `v_ -& -ic --> -v -, oric, -VIA_MAIN - ); - -1368 - `v_ -& -ic --> -_v -, oric, -VIA_TELESTRAT - ); - -1369 - `ay_ -& -ic --> -ay -, oric ); - -1370 -ic --> -u -. -cyes - = oric-> -cye -; - -1371 -ic --> -ames - = 0; - -1372 if -ic --> -autewd - ) - `_wd -( oric ); - -1373 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1374 - } -} - -1376  -osdmuem - * - $fd_em_by_funi -( -osdmuem - * -mu -, * -funi -) - -1378  -i -; - -1379  -osdmuem - -dummyem -; - -1381  -i -=0; -mu -[i]. -me -; i++) - -1382 i( -mu -[ -i -]. -func - = -funi -) - -1383  & -mu -[ -i -]; - -1385  & -dummyem -; - -1386 - } -} - -1388  -osdmuem - * - $fd_em_by_funi_d_g -( -osdmuem - * -mu -, * -funi -,  -g -) - -1390  -i -; - -1391  -osdmuem - -dummyem -; - -1393  -i -=0; -mu -[i]. -me -; i++) - -1394 i(( -mu -[ -i -]. -func - = -funi -&& (mu[i]. -g - ==rg)) - -1395  & -mu -[ -i -]; - -1397  & -dummyem -; - -1398 - } -} - -1400  -osdmuem - * - $fd_em_by_key -( -osdmuem - * -mu -,  -sdlkey -) - -1402  -i -; - -1403  -osdmuem - -dummyem -; - -1405  -i -=0; -mu -[i]. -me -; i++) - -1406 i( -mu -[ -i -]. -sdlkey - == sdlkey) - -1407  & -mu -[ -i -]; - -1409  & -dummyem -; - -1410 - } -} - -1413  - $toggˏnoi - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1415 if -ic --> -noi - ) - -1417 -ic --> -ay -. -out - = 0; - -1418 -ic --> -noi - = -SDL_FALSE -; - -1419 -mem --> -me - = " Tapeoise"; - -1423 -ic --> -noi - = -SDL_TRUE -; - -1424 -mem --> -me - = "\x0e""Tapeoise"; - -1425 - } -} - -1428  - $toggsound - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1430 if -sound - ) || (! -soundavaab -) ) - -1432 -sound - = -SDL_FALSE -; - -1433 -ic --> -ay -. -sound - = -SDL_FALSE -; - -1434 -mem --> -me - = " Soundnabled"; - -1435 if -soundavaab - ) - `SDL_PauAudio -( 1 ); - -1439 -sound - = -SDL_TRUE -; - -1440 -ic --> -ay -. -sound - = ! -wpd -; - -1441 -mem --> -me - = "\x0e""Soundnabled"; - -1442 if -ic --> -emu_mode - = -EM_RUNNING - ) - `SDL_PauAudio -! -wpd - ); - -1443 - } -} - -1446  - $toggˏturbo - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1448 -ic --> -turbo_foff - = -SDL_FALSE -; - -1450 if -ic --> -turbo - ) - -1452 -ic --> -turbo - = -SDL_FALSE -; - -1453 -mem --> -me - = " Turboape"; - -1457 -ic --> -turbo - = -SDL_TRUE -; - -1458 -mem --> -me - = "\x0e""Turboape"; - -1459 - } -} - -1462  - $toggvsynchack - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1464 if -ic --> -vsynchack - ) - -1466 -ic --> -vsynchack - = -SDL_FALSE -; - -1467 -mem --> -me - = " VSync hack"; - -1471 -ic --> -vsynchack - = -SDL_TRUE -; - -1472 -mem --> -me - = "\x0e""VSync hack"; - -1473 - } -} - -1476  - $toggligh - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1478 if -ic --> -ligh - ) - -1480 -ic --> -ligh - = -SDL_FALSE -; - -1481 -ic --> -u -. -ad - = oric-> -ad_n_ligh -; - -1482 -mem --> -me - = " Lightpen"; - -1486 -ic --> -ligh - = -SDL_TRUE -; - -1487 -ic --> -u -. -ad - = -ligh_ad -; - -1488 -mem --> -me - = "\x0e""Lightpen"; - -1489 - } -} - -1492  - $toggacbackd - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1494 if -ic --> -acbackd - ) - -1496 -ic --> -acbackd - = -ACIA_TYPE_NONE -; - -1497 -mem --> -me - = -acbackds -[ -ic --> -acbackd -]; - -1501 -ic --> -acbackd - = oric-> -acbackdcfg -; - -1502 -mem --> -me - = -acbackdb -; - -1505 - `ac_ -& -ic --> -_ac -, oric ); - -1506 - } -} - -1509  - $toggch376 -( -mache - * -ic -,  -osdmuem - * -mem -,  -dummy -) - -1512 i( -ic --> -ch376_aived -) - -1514 -ic --> -ch376_aived - = -SDL_FALSE -; - -1515 -mem --> -me - = " CH376 (Telestrat)"; - -1519 -ic --> -ch376_aived - = -SDL_TRUE -; - -1520 -mem --> -me - = "\x0e""CH376 (Telestrat)"; - -1521 -ic --> -ch376 - = - `ch376_ic_ -(); - -1522 i( -ic --> -ch376 - ! -NULL -) - -1523 - `ch376_ic_cfig -( -ic --> -ch376 -); - -1524 - } -} - -1527  - $toggsymbާuto - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1529 if -ic --> -symbާutd - ) - -1531 -ic --> -symbާutd - = -SDL_FALSE -; - -1532 -mem --> -me - = " Autoload symbols file"; - -1536 -ic --> -symbާutd - = -SDL_TRUE -; - -1537 -mem --> -me - = "\x0e""Autoload symbols file"; - -1538 - } -} - -1541  - $toggsyms - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1543 if -ic --> -symbs - ) - -1545 -ic --> -symbs - = -SDL_FALSE -; - -1546 -mem --> -me - = " Case-sensitive symbols"; - -1550 -ic --> -symbs - = -SDL_TRUE -; - -1551 -mem --> -me - = "\x0e""Case-sensitive symbols"; - -1552 - } -} - -1555  - $toggautowd - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1557 if -ic --> -autewd - ) - -1559 -ic --> -autewd - = -SDL_FALSE -; - -1560 -mem --> -me - = " Autorewindape"; - -1564 -ic --> -autewd - = -SDL_TRUE -; - -1565 -mem --> -me - = "\x0e""Autorewindape"; - -1566 - } -} - -1569  - $toggautot - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1571 if -ic --> -auto - ) - -1573 -ic --> -auto - = -SDL_FALSE -; - -1574 -mem --> -me - = " Autoinsertape"; - -1578 -ic --> -auto - = -SDL_TRUE -; - -1579 -mem --> -me - = "\x0e""Autoinsertape"; - -1580 - } -} - -1583  - $toggfusn - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1585 if! -ic --> - `nd_toggfusn -( oric ) ) ; - -1587 if -fusn - ) - -1589 - `fd_em_by_funi -( -vdݙems -, -toggfusn -)-> -me - = "\x0e""Fullscreen"; - -1590 - `fd_em_by_funi -( -glݙems -, -toggfusn -)-> -me - = "\x0e""Fullscreen"; - -1594 - `fd_em_by_funi -( -vdݙems -, -toggfusn -)-> -me - = " Fullscreen"; - -1595 - `fd_em_by_funi -( -glݙems -, -toggfusn -)-> -me - = " Fullscreen"; - -1596 - } -} - -1599  - $toggˬio - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1601 if -ic --> -io - ) - -1603 -ic --> -io - = -SDL_FALSE -; - -1604 -mem --> -me - = " 50Hz/60Hzspectatio"; - -1608 -ic --> -io - = -SDL_TRUE -; - -1609 -mem --> -me - = "\x0e""50Hz/60Hzspectatio"; - -1610 - } -} - -1613  - $togghtch - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1615 if -ic --> -htch - ) - -1617 -ic --> -htch - = -SDL_FALSE -; - -1618 -mem --> -me - = " Horizontal stretch"; - -1622 -ic --> -htch - = -SDL_TRUE -; - -1623 -mem --> -me - = "\x0e""Horizontal stretch"; - -1624 - } -} - -1627  - $togg˷lgho - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1629 if -ic --> -lgho - ) - -1631 -ic --> -lgho - = -SDL_FALSE -; - -1632 -mem --> -me - = " PAL ghosting"; - -1636 -ic --> -lgho - = -SDL_TRUE -; - -1637 -mem --> -me - = "\x0e""PAL ghosting"; - -1638 - } -} - -1641  - $toggsƚes - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1643 if -ic --> -sƚes - ) - -1645 -ic --> -sƚes - = -SDL_FALSE -; - -1646 - `fd_em_by_funi -( -vdݙems -, -toggsƚes -)-> -me - = " Scanlines"; - -1647 - `fd_em_by_funi -( -glݙems -, -toggsƚes -)-> -me - = " Scanlines"; - -1651 -ic --> -sƚes - = -SDL_TRUE -; - -1652 - `fd_em_by_funi -( -vdݙems -, -toggsƚes -)-> -me - = "\x0e""Scanlines"; - -1653 - `fd_em_by_funi -( -glݙems -, -toggsƚes -)-> -me - = "\x0e""Scanlines"; - -1654 - } -} - -1656  - $tovock - -mache - * -ic -,  -osdmuem - * -mem -,  -vue - ) - -1658  -i -; - -1662 * -ames -[] = { "\x0e"" 1MHz (None)", "\x0e"" 2MHz", "\x0e"" 4MHz", "\x0e"" 8MHz", - -1664 * -unames -[] = { " 1MHz (None)", " 2MHz", " 4MHz", " 8MHz", - -1667 -ic --> -ovockmu - = 1<< -vue -; - -1668 -ic --> -ovockshi - = -vue -; - -1670  -i -=0; i<7; i++ ) - -1672 if( -i - = -vue -) - -1673 -ovݙems -[ -i -]. -me - = -ames -[i]; - -1675 -ovݙems -[ -i -]. -me - = -unames -[i]; - -1677 - } -} - -1680  - $gose - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1683 #i - `defed -( -__MORPHOS__ -|| defed( -__AROS__ -) - -1684  -Libry - * -OnURLBa - = - `OnLibry -( "openurl.library", 0 ); - -1685 cڡ  -TagIm - -URLTags -[] = {{ -TAG_DONE -, ( -ULONG - -NULL -}}; - -1687 if -OnURLBa - ) - -1689 - `URL_OnA -( -mem --> -me -, ( -TagIm -* -URLTags -); - -1690 - `CloLibry - -OnURLBa - ); - -1693 #i - `defed -( -__amigaos4__ -) - -1694  -tmp -[256]; - -1695 -BPTR - -h -; - -1696 - `rtf - -tmp -, "URL:%s", -mem --> -me - ); - -1697 if -h - = -IDOS --> - `On - -tmp -, -MODE_OLDFILE - ) ) ) IDOS-> - `Clo -( h ); - -1699 #i - `defed -( -WIN32 -|| defed( -__APPLE__ -|| defed( -__BEOS__ -|| defed( -__HAIKU__ -) - -1700 - `gui_ݒ_u - -mem --> -me - ); - -1704  -tmp -[256]; - -1705 - `rtf - -tmp -, "xdg-ݒ '%s'", -mem --> -me - ); - -1706 - `syem - -tmp - ); - -1709 - } -} - -1712  - $gomu - -mache - * -ic -,  -osdmuem - * -mem -,  -munum - ) - -1714  -i -, -w -, -keyw -; - -1716 if -tz -[ -TZ_MENU -] ) - `_xtze - -ic -, TZ_MENU ); - -1718 -cmu - = & -mus -[ -munum -]; - -1719 -w - = () - ` - -cmu --> -t - )+8; - -1720 -keyw - = 0; - -1721  -i -=0; -cmu --> -ems -[i]. -me -; i++ ) - -1723 if -cmu --> -ems -[ -i -]. -me - = -OSDMENUBAR - ) - -1725 if - ` - -cmu --> -ems -[ -i -]. -me - ) > -w - ) - -1726 -w - = () - ` - -cmu --> -ems -[ -i -]. -me - ); - -1727 if -cmu --> -ems -[ -i -]. -key - ) - -1729 if( - ` - -cmu --> -ems -[ -i -]. -key - )+1> -keyw - ) - -1730 -keyw - = () - ` - -cmu --> -ems -[ -i -]. -key - )+1; - -1734 -w -+= -keyw -+2; -i -+=2; - -1736 if! - `loc_xtze - -ic -, -TZ_MENU -, 320- -w -*4, 240- -i -*6, w, i, -cmu --> -t - ) ) - -1738 -cmu - = -NULL -; - -1739 -ic --> -emu_mode - = -EM_RUNNING -; - -1743 - `dwems -(); - -1744 - } -} - -1746  - $toggkeybrd - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1748 if -ic --> -show_keybrd - ) - -1750 -ic --> -show_keybrd - = -SDL_FALSE -; - -1751 -mem --> -me - = " Show keyboard"; - -1752 -ic --> - `shut_nd -(oric); - -1753 -ic --> - `_nd -(oric); - -1757 -ic --> -show_keybrd - = -SDL_TRUE -; - -1758 -mem --> -me - = "\x0e""Show keyboard"; - -1759 -ic --> - `shut_nd -(oric); - -1760 -ic --> - `_nd -(oric); - -1761 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1762 - } -} - -1764  - $defempg - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1766 if -ic --> -defe_mpg - ) - -1768 -ic --> -defe_mpg - = -SDL_FALSE -; - -1769 -mem --> -me - = " Define mapping"; - -1773 -ic --> -defe_mpg - = -SDL_TRUE -; - -1774 -mem --> -me - = "\x0e""Define mapping"; - -1775 if(! -ic --> -show_keybrd -) { - -1776 - `fd_em_by_funi -( -keݙems -, -toggkeybrd -)-> -me - = "\x0e""Show keyboard"; - -1777 -ic --> -show_keybrd - = -SDL_TRUE -; - -1778 -ic --> - `shut_nd -(oric); - -1779 -ic --> - `_nd -(oric); - -1781 -cmu - = -NULL -; - -1782 -ic --> -emu_mode - = -EM_RUNNING -; - -1783 - `do_pup - -ic -, "Click onn Oric key." ); - -1784 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1785 - } -} - -1787  - $toggˡickykeys - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1789 if -ic --> -icky_mod_keys - ) - -1791 -ic --> -icky_mod_keys - = -SDL_FALSE -; - -1792 -mem --> -me - = " Sticky mod keys"; - -1793 - `a_icky_keys -(); - -1797 -ic --> -icky_mod_keys - = -SDL_TRUE -; - -1798 -mem --> -me - = "\x0e""Sticky mod keys"; - -1799 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1800 - } -} - -1803  - $vempg - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1805 if! - `feque - -ic -, "SavKeybrd Mpg", -mpgth -, -mpgfe -, -FR_KEYMAPPINGSAVE - ) ) ; - -1806 - `joth - -mpgth -, -mpgfe - ); - -1807 - `ve_keybrd_mpg -( -ic -, -fmp -); - -1808 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1809 - } -} - -1811  - $ldmpg - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1813 if! - `feque - -ic -, "Ld Keybrd Mpg", -mpgth -, -mpgfe -, -FR_KEYMAPPINGLOAD - ) ) ; - -1814 - `joth - -mpgth -, -mpgfe - ); - -1815 - `ld_keybrd_mpg -( -ic -, -fmp -); - -1816 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1817 - } -} - -1819  - $tmpg - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1821 - `t_keybrd_mpg -(&( -ic --> -keybrd_mpg -)); - -1822 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1823 - } -} - -1825 #ifde -__CBCOPY__ - - -1826  - $bd_cy_gui - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1828 - `brd_cy -( -ic -); - -1829 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1830 - } -} - -1832 #ifde -__CBPASTE__ - - -1833  - $bd_e_gui - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -1835 - `brd_e -( -ic -); - -1836 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1837 - } -} - -1844 -SDL_bo - - $mu_evt - -SDL_Evt - * -ev -,  -mache - * -ic -, -SDL_bo - * -ednd - ) - -1846 -SDL_bo - -de - = -SDL_FALSE -; - -1847  -i -, -x -, -y -; - -1850 if! -cmu - ) || ( ! -tz -[ -TZ_MENU -] ) ) - -1851  -de -; - -1853 -x - = -1; - -1854 -y - = -1; - -1855  -ev --> -ty - ) - -1857  -SDL_MOUSEMOTION -: - -1858 -x - = ( -ev --> -mi -.x - -tz -[ -TZ_MENU -]->x)/8; - -1859 -y - = ( -ev --> -mi -.y - -tz -[ -TZ_MENU -]->y)/12-1; - -1862  -SDL_MOUSEBUTTONDOWN -: - -1863 if -ev --> -bu -.bu = -SDL_BUTTON_LEFT - ) - -1865 -x - = ( -ev --> -bu -.x - -tz -[ -TZ_MENU -]->x)/8; - -1866 -y - = ( -ev --> -bu -.y - -tz -[ -TZ_MENU -]->y)/12-1; - -1871  -ev --> -ty - ) - -1873  -SDL_COMPAT_ACTIVEEVENT -: - -1874 if( - `SDL_COMPAT_IsAFocud -( -ev -)) { - -1875 * -ednd - = -SDL_TRUE -; - -1879  -SDL_MOUSEMOTION -: - -1880  -SDL_MOUSEBUTTONDOWN -: - -1881 -x - = ( -ev --> -mi -.x - -tz -[ -TZ_MENU -]->x)/8; - -1882 -y - = ( -ev --> -mi -.y - -tz -[ -TZ_MENU -]->y)/12-1; - -1884 if -x - < 0 ) || ( -y - < 0 ) || - -1885 -x - > -tz -[ -TZ_MENU -]-> -w - ) ) - -1888  -i -=0; i< -y -; i++ ) - -1889 if -cmu --> -ems -[ -i -]. -me - = -NULL - ) - -1892 if -i - ! -y - ) || ( -cmu --> -ems -[y]. -me - = -OSDMENUBAR - ) || ( cmu->ems[y]. -func - = -NULL - ) ) - -1895 -cmu --> -cem - = -y -; - -1897 if -ev --> -ty - = -SDL_MOUSEBUTTONDOWN - ) && - -1898 ( -ev --> -bu -.bu== -SDL_BUTTON_LEFT -) || - -1899 ( -ev --> -bu -.bu== -SDL_BUTTON_RIGHT -) ) ) - -1900 -cmu --> -ems -[cmu-> -cem -]. - `func - -ic -, &cmu->ems[cmu->cem], cmu->ems[cmu->cem]. -g - ); - -1902 - `dwems -(); - -1903 * -ednd - = -SDL_TRUE -; - -1906  -SDL_KEYDOWN -: - -1907  -ev --> -key -. -keysym -. -sym - ) - -1909  -SDLK_UP -: - -1911 -i - = -cmu --> -cem --1; - -1912  ( -cmu --> -ems -[ -i -]. -me - = -OSDMENUBAR - ) || - -1913 -cmu --> -ems -[ -i -]. -func - = -NULL - ) ) - -1915 if -i - < 0 ) ; - -1916 -i ---; - -1920 if -i - < 0 ) || ( -cmu --> -ems -[i]. -me - = -OSDMENUBAR - ) ) - -1923  -i -=0; -cmu --> -ems -[i]. -me -; i++ ) ; - -1924 -i ---; - -1927  ( -cmu --> -ems -[ -i -]. -me - = -OSDMENUBAR - ) || - -1928 -cmu --> -ems -[ -i -]. -func - = -NULL - ) ) - -1930 if -i - < 0 ) ; - -1931 -i ---; - -1933 if -i - < 0 ) || ( -cmu --> -ems -[i]. -me - = -OSDMENUBAR - ) ) ; - -1935 -cmu --> -cem - = -i -; - -1936 - `dwems -(); - -1937 * -ednd - = -SDL_TRUE -; - -1940  -SDLK_DOWN -: - -1941 -i - = -cmu --> -cem -+1; - -1942  ( -cmu --> -ems -[ -i -]. -me - = -OSDMENUBAR - ) || - -1943 -cmu --> -ems -[ -i -]. -func - = -NULL - ) ) - -1945 if -cmu --> -ems -[ -i -]. -me - = -NULL - ) ; - -1946 -i -++; - -1949 if -cmu --> -ems -[ -i -]. -me - = -NULL - ) || ( cmu->ems[i].m= -OSDMENUBAR - ) ) - -1951 -i -=0; - -1953  ( -cmu --> -ems -[ -i -]. -me - = -OSDMENUBAR - ) || - -1954 -cmu --> -ems -[ -i -]. -func - = -NULL - ) ) - -1956 if -cmu --> -ems -[ -i -]. -me - = -NULL - ) ; - -1957 -i -++; - -1960 if -cmu --> -ems -[ -i -]. -me - = -NULL - ) || ( cmu->ems[i].m= -OSDMENUBAR - ) ) - -1964 -cmu --> -cem - = -i -; - -1965 - `dwems -(); - -1966 * -ednd - = -SDL_TRUE -; - -1974  -SDL_KEYUP -: - -1975  -ev --> -key -. -keysym -. -sym - ) - -1977  -SDLK_RETURN -: - -1978  -SDLK_KP_ENTER -: - -1979 if! -cmu --> -ems -[cmu-> -cem -]. -func - ) ; - -1980 -cmu --> -ems -[cmu-> -cem -]. - `func - -ic -, &cmu->ems[cmu->cem], cmu->ems[cmu->cem]. -g - ); - -1981 - `dwems -(); - -1982 * -ednd - = -SDL_TRUE -; - -1985  -SDLK_ESCAPE -: - -1986 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1987 * -ednd - = -SDL_TRUE -; - -1991  -i -=0; -cmu --> -ems -[i]. -me -; i++ ) - -1993 if -cmu --> -ems -[ -i -]. -sdlkey - ) && - -1994 -cmu --> -ems -[ -i -]. -sdlkey - = -ev --> -key -. -keysym -. -sym - ) && - -1995 -cmu --> -ems -[ -i -]. -func - ) ) - -1999 if! -cmu --> -ems -[ -i -]. -me - ) ; - -2001 -cmu --> -ems -[ -i -]. - `func - -ic -, &cmu->ems[i], cmu->ems[i]. -g - ); - -2002 - `dwems -(); - -2003 * -ednd - = -SDL_TRUE -; - -2009 i(* -ednd - - `u_t_dty -( -ic -); - -2010  -de -; - -2011 - } -} - -2013  - $t_nd_mode - -mache - * -ic -,  -whichndmode - ) - -2015 -ic --> -ndmode - = -whichndmode -; - -2016  -whichndmode - ) - -2018  -RENDERMODE_SW -: - -2019 i( -ic --> -sw_dth - == 8) - -2021 -ic --> -nd_beg - = -nd_beg_sw8 -; - -2022 -ic --> -nd_d - = -nd_d_sw8 -; - -2023 -ic --> -nd_xtze_loc - = -nd_xtze_loc_sw8 -; - -2024 -ic --> -nd_xtze_ - = -nd_xtze__sw8 -; - -2025 -ic --> -nd_xtze - = -nd_xtze_sw8 -; - -2026 -ic --> -nd_r_ - = -nd_r__sw8 -; - -2027 -ic --> -nd_gimg - = -nd_gimg_sw8 -; - -2028 -ic --> -nd_gimg - = -nd_gimg_sw8 -; - -2029 -ic --> -nd_video - = -nd_video_sw8 -; - -2030 -ic --> -nd_toggfusn - = -nd_toggfusn_sw8 -; - -2031 -ic --> -_nd - = -_nd_sw8 -; - -2032 -ic --> -shut_nd - = -shut_nd_sw8 -; - -2033 - `fd_em_by_funi_d_g -( -vdݙems -, -sw_nd_mode -, -RENDERMODE_GL -)-> -me - = " OpenGLendering"; - -2034 - `fd_em_by_funi_d_g -( -glݙems -, -sw_nd_mode -, -RENDERMODE_GL -)-> -me - = " OpenGLendering"; - -2035 - `fd_em_by_funi_d_g -( -vdݙems -, -sw_nd_mode -, -RENDERMODE_SW -)-> -me - = "\x0e""Softwareendering"; - -2036 - `fd_em_by_funi_d_g -( -glݙems -, -sw_nd_mode -, -RENDERMODE_SW -)-> -me - = "\x0e""Softwareendering"; - -2037 -mus -[4]. -ems - = -vdݙems -; - -2040 -ic --> -nd_beg - = -nd_beg_sw -; - -2041 -ic --> -nd_d - = -nd_d_sw -; - -2042 -ic --> -nd_xtze_loc - = -nd_xtze_loc_sw -; - -2043 -ic --> -nd_xtze_ - = -nd_xtze__sw -; - -2044 -ic --> -nd_xtze - = -nd_xtze_sw -; - -2045 -ic --> -nd_r_ - = -nd_r__sw -; - -2046 -ic --> -nd_gimg - = -nd_gimg_sw -; - -2047 -ic --> -nd_gimg - = -nd_gimg_sw -; - -2048  -ic --> -sw_dth -) - -2051 -ic --> -nd_video - = -nd_video_sw_16b -; - -2054 -ic --> -nd_video - = -nd_video_sw_32b -; - -2058 -ic --> -nd_video - = -nd_video_sw_16b -; - -2061 -ic --> -nd_toggfusn - = -nd_toggfusn_sw -; - -2062 -ic --> -_nd - = -_nd_sw -; - -2063 -ic --> -shut_nd - = -shut_nd_sw -; - -2064 - `fd_em_by_funi_d_g -( -vdݙems -, -sw_nd_mode -, -RENDERMODE_GL -)-> -me - = " OpenGLendering"; - -2065 - `fd_em_by_funi_d_g -( -glݙems -, -sw_nd_mode -, -RENDERMODE_GL -)-> -me - = " OpenGLendering"; - -2066 - `fd_em_by_funi_d_g -( -vdݙems -, -sw_nd_mode -, -RENDERMODE_SW -)-> -me - = "\x0e""Softwareendering"; - -2067 - `fd_em_by_funi_d_g -( -glݙems -, -sw_nd_mode -, -RENDERMODE_SW -)-> -me - = "\x0e""Softwareendering"; - -2068 -mus -[4]. -ems - = -vdݙems -; - -2071 #ifde -__OPENGL_AVAILABLE__ - - -2072  -RENDERMODE_GL -: - -2073 -ic --> -nd_beg - = -nd_beg_gl -; - -2074 -ic --> -nd_d - = -nd_d_gl -; - -2075 -ic --> -nd_xtze_loc - = -nd_xtze_loc_gl -; - -2076 -ic --> -nd_xtze_ - = -nd_xtze__gl -; - -2077 -ic --> -nd_xtze - = -nd_xtze_gl -; - -2078 -ic --> -nd_r_ - = -nd_r__gl -; - -2079 -ic --> -nd_gimg - = -nd_gimg_gl -; - -2080 -ic --> -nd_gimg - = -nd_gimg_gl -; - -2081 -ic --> -nd_video - = -nd_video_gl -; - -2082 -ic --> -nd_toggfusn - = -nd_toggfusn_gl -; - -2083 -ic --> -_nd - = -_nd_gl -; - -2084 -ic --> -shut_nd - = -shut_nd_gl -; - -2085 - `fd_em_by_funi_d_g -( -vdݙems -, -sw_nd_mode -, -RENDERMODE_GL -)-> -me - = "\x0e""OpenGLendering"; - -2086 - `fd_em_by_funi_d_g -( -glݙems -, -sw_nd_mode -, -RENDERMODE_GL -)-> -me - = "\x0e""OpenGLendering"; - -2087 - `fd_em_by_funi_d_g -( -vdݙems -, -sw_nd_mode -, -RENDERMODE_SW -)-> -me - = " Softwareendering"; - -2088 - `fd_em_by_funi_d_g -( -glݙems -, -sw_nd_mode -, -RENDERMODE_SW -)-> -me - = " Softwareendering"; - -2089 -mus -[4]. -ems - = -glݙems -; - -2094 -ic --> -nd_beg - = -nd_beg_nu -; - -2095 -ic --> -nd_d - = -nd_d_nu -; - -2096 -ic --> -nd_xtze_loc - = -nd_xtze_loc_nu -; - -2097 -ic --> -nd_xtze_ - = -nd_xtze__nu -; - -2098 -ic --> -nd_xtze - = -nd_xtze_nu -; - -2099 -ic --> -nd_r_ - = -nd_r__nu -; - -2100 -ic --> -nd_gimg - = -nd_gimg_nu -; - -2101 -ic --> -nd_gimg - = -nd_gimg_nu -; - -2102 -ic --> -nd_video - = -nd_video_nu -; - -2103 -ic --> -nd_toggfusn - = -nd_toggfusn_nu -; - -2104 -ic --> -_nd - = -_nd_nu -; - -2105 -ic --> -shut_nd - = -shut_nd_nu -; - -2106 - `fd_em_by_funi_d_g -( -vdݙems -, -sw_nd_mode -, -RENDERMODE_GL -)-> -me - = " OpenGLendering"; - -2107 - `fd_em_by_funi_d_g -( -glݙems -, -sw_nd_mode -, -RENDERMODE_GL -)-> -me - = " OpenGLendering"; - -2108 - `fd_em_by_funi_d_g -( -vdݙems -, -sw_nd_mode -, -RENDERMODE_SW -)-> -me - = " Softwareendering"; - -2109 - `fd_em_by_funi_d_g -( -glݙems -, -sw_nd_mode -, -RENDERMODE_SW -)-> -me - = " Softwareendering"; - -2110 -mus -[4]. -ems - = -vdݙems -; - -2113 - } -} - -2115  - $sw_nd_mode - -mache - * -ic -,  -osdmuem - * -mem -,  -wndmode - ) - -2117 if -ic --> -ndmode - = -wndmode - ) ; - -2119 - `shut_gui - -ic - ); - -2120 - `shut_joy - -ic - ); - -2121 - `SDL_COMPAT_Qu -(); - -2122 -ed_sdl_qu - = -SDL_FALSE -; - -2125 if - `SDL_In - -SDL_INIT_VIDEO - | -SDL_INIT_AUDIO - ) < 0 ) - -2127 - `r_tf -( "SDL init failed\n" ); - -2128 -ic --> -emu_mode - = -EM_PLEASEQUIT -; - -2131 -ed_sdl_qu - = -SDL_TRUE -; - -2133 #ide -__APPLE__ - - -2134 - `SDL_COMPAT_WM_SIc - - `SDL_LdBMP - -IMAGEPREFIX -"wic.bmp" ), -NULL - ); - -2137 if! - `_joy - -ic - ) ) - -2139 -ic --> -emu_mode - = -EM_PLEASEQUIT -; - -2143 if! - `_gui - -ic -, -wndmode - ) ) - -2145 -ic --> -emu_mode - = -EM_PLEASEQUIT -; - -2149 if! - `ay_ -& -ic --> -ay -, oric ) ) - -2151 -ic --> -emu_mode - = -EM_PLEASEQUIT -; - -2155 if! - `_feque - -ic - ) ) - -2157 -ic --> -emu_mode - = -EM_PLEASEQUIT -; - -2161 if! - `_msgbox - -ic - ) ) - -2163 -ic --> -emu_mode - = -EM_PLEASEQUIT -; - -2167 - `joy_tup - -ic - ); - -2168 - `m_wm - -ic - ); - -2170 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -2171 - } -} - -2175  - $e_gui - -mache - * -ic - ) - -2177  -i -; - -2178  -i -=0; i< -NUM_TZ -; i++ ) -tz -[i] = -NULL -; - -2179  -i -=0; i< -NUM_GIMG -; i++ ) -gimgs -[i]. -buf - = -NULL -; - -2180 - `ry - -th -, -FILEPREFIX -"tapes" ); - -2181 - `ry - -fe -, "" ); - -2182 - `ry - -diskth -, -FILEPREFIX -"disks" ); - -2183 - `ry - -diskfe -, "" ); - -2184 - `ry - -diskth -, -FILEPREFIX -"teledisks" ); - -2185 - `ry - -diskfe -, "" ); - -2186 - `ry - -avdiskth -, -FILEPREFIX -"pravdisks" ); - -2187 - `ry - -avdiskfe -, "" ); - -2188 - `ry - -moomfe -, -ROMPREFIX -"basic11b" ); - -2189 - `ry - -ic1romfe -, -ROMPREFIX -"basic10" ); - -2190 - `ry - -mdisomfe -, -ROMPREFIX -"microdis" ); - -2191 - `ry - -jasmomfe -, -ROMPREFIX -"jasmin" ); - -2192 - `ry - -avzromfe -[0], -ROMPREFIX -"pravetzt" ); - -2193 - `ry - -avzromfe -[1], -ROMPREFIX -"8dos2" ); - -2194 -bkfes -[0][0] = 0; - -2195 -bkfes -[1][0] = 0; - -2196 -bkfes -[2][0] = 0; - -2197 -bkfes -[3][0] = 0; - -2198 -bkfes -[4][0] = 0; - -2199 - `ry - -bkfes -[5], -ROMPREFIX -"teleass" ); - -2200 - `ry - -bkfes -[6], -ROMPREFIX -"hyperbas" ); - -2201 - `ry - -bkfes -[7], -ROMPREFIX -"telmon24" ); - -2202 - `t_nd_mode - -ic -, -RENDERMODE_NULL - ); - -2203 - `ry - -th -, -FILEPREFIX -"snapshots" ); - -2204 - `ry - -fe -, "" ); - -2205 - `ry - -mpgth -, -FILEPREFIX -"keymap" ); - -2206 - `ry - -mpgfe -, "" ); - -2207 - } -} - -2210  - $tmutoggs - -mache - * -ic - ) - -2212  -ic --> -drivy -) - -2214  -DRV_JASMIN -: - -2215  -DRV_MICRODISC -: - -2216 - `fd_em_by_key -( -maems -, -SDLK_0 -)-> -func - = -disk -; - -2217 - `fd_em_by_key -( -maems -, -SDLK_1 -)-> -func - = -disk -; - -2218 - `fd_em_by_key -( -maems -, -SDLK_2 -)-> -func - = -disk -; - -2219 - `fd_em_by_key -( -maems -, -SDLK_3 -)-> -func - = -disk -; - -2222  -DRV_PRAVETZ -: - -2224 - `fd_em_by_key -( -maems -, -SDLK_0 -)-> -func - = -disk -; - -2225 - `fd_em_by_key -( -maems -, -SDLK_1 -)-> -func - = -disk -; - -2226 - `fd_em_by_key -( -maems -, -SDLK_2 -)-> -func - = -NULL -; - -2227 - `fd_em_by_key -( -maems -, -SDLK_3 -)-> -func - = -NULL -; - -2231 if -soundavaab - && -sound - ) - -2232 - `fd_em_by_funi -( -auݙems -, -toggsound -)-> -me - = "\x0e""Soundnabled"; - -2234 - `fd_em_by_funi -( -auݙems -, -toggsound -)-> -me - = " Soundnabled"; - -2236 if -ic --> -noi - ) - -2237 - `fd_em_by_funi -( -auݙems -, -toggˏnoi -)-> -me - = "\x0e""Tapeoise"; - -2239 - `fd_em_by_funi -( -auݙems -, -toggˏnoi -)-> -me - = " Tapeoise"; - -2241 if -ic --> -turbo - ) - -2242 - `fd_em_by_funi -( -hwݙems -, -toggˏturbo -)-> -me - = "\x0e""Turboape"; - -2244 - `fd_em_by_funi -( -hwݙems -, -toggˏturbo -)-> -me - = " Turboape"; - -2246 if -ic --> -auto - ) - -2247 - `fd_em_by_funi -( -hwݙems -, -toggautot -)-> -me - = "\x0e""Autoinsertape"; - -2249 - `fd_em_by_funi -( -hwݙems -, -toggautot -)-> -me - = " Autoinsertape"; - -2251 if -ic --> -autewd - ) - -2252 - `fd_em_by_funi -( -hwݙems -, -toggautowd -)-> -me - = "\x0e""Autorewindape"; - -2254 - `fd_em_by_funi -( -hwݙems -, -toggautowd -)-> -me - = " Autorewindape"; - -2256 if -ic --> -vsynchack - ) - -2257 - `fd_em_by_funi -( -hwݙems -, -toggvsynchack -)-> -me - = "\x0e""VSync hack"; - -2259 - `fd_em_by_funi -( -hwݙems -, -toggvsynchack -)-> -me - = " VSync hack"; - -2261 if -ic --> -ligh - ) - -2262 - `fd_em_by_funi -( -hwݙems -, -toggligh -)-> -me - = "\x0e""Lightpen"; - -2264 - `fd_em_by_funi -( -hwݙems -, -toggligh -)-> -me - = " Lightpen"; - -2266 if -ic --> -acbackd - ) - -2268 - `ry -( -acbackdb -, -acbackds -[ -ic --> -acbackd -]); - -2269 - `rtf -( -acbackdb -+18, "%.4X", -ic --> -acofft -); - -2270 - `fd_em_by_funi -( -hwݙems -, -toggacbackd -)-> -me - = -acbackdb -; - -2273 - `fd_em_by_funi -( -hwݙems -, -toggacbackd -)-> -me - = -acbackds -[ -ic --> -acbackd -]; - -2275 if -ic --> -symbާutd - ) - -2276 - `fd_em_by_funi -( -dbݙems -, -toggsymbާuto -)-> -me - = "\x0e""Autoload symbols file"; - -2278 - `fd_em_by_funi -( -dbݙems -, -toggsymbާuto -)-> -me - = " Autoload symbols file"; - -2280 if -ic --> -symbs - ) - -2281 - `fd_em_by_funi -( -dbݙems -, -toggsyms -)-> -me - = "\x0e""Case-sensitive symbols"; - -2283 - `fd_em_by_funi -( -dbݙems -, -toggsyms -)-> -me - = " Case-sensitive symbols"; - -2285 if -fusn - ) - -2287 - `fd_em_by_funi -( -vdݙems -, -toggfusn -)-> -me - = "\x0e""Fullscreen"; - -2288 - `fd_em_by_funi -( -glݙems -, -toggfusn -)-> -me - = "\x0e""Fullscreen"; - -2290 - `fd_em_by_funi -( -vdݙems -, -toggfusn -)-> -me - = " Fullscreen"; - -2291 - `fd_em_by_funi -( -glݙems -, -toggfusn -)-> -me - = " Fullscreen"; - -2294 if -ic --> -io - ) - -2295 - `fd_em_by_funi -( -glݙems -, -toggˬio -)-> -me - = "\x0e""50Hz/60Hzspectatio"; - -2297 - `fd_em_by_funi -( -glݙems -, -toggˬio -)-> -me - = " 50Hz/60Hzspectatio"; - -2299 if -ic --> -htch - ) - -2300 - `fd_em_by_funi -( -glݙems -, -togghtch -)-> -me - = "\x0e""Horizontal stretch"; - -2302 - `fd_em_by_funi -( -glݙems -, -togghtch -)-> -me - = " Horizontal stretch"; - -2304 if -ic --> -sƚes - ) - -2306 - `fd_em_by_funi -( -vdݙems -, -toggsƚes -)-> -me - = "\x0e""Scanlines"; - -2307 - `fd_em_by_funi -( -glݙems -, -toggsƚes -)-> -me - = "\x0e""Scanlines"; - -2309 - `fd_em_by_funi -( -vdݙems -, -toggsƚes -)-> -me - = " Scanlines"; - -2310 - `fd_em_by_funi -( -glݙems -, -toggsƚes -)-> -me - = " Scanlines"; - -2313 if -ic --> -lgho - ) - -2314 - `fd_em_by_funi -( -glݙems -, -togg˷lgho -)-> -me - = "\x0e""PAL ghosting"; - -2316 - `fd_em_by_funi -( -glݙems -, -togg˷lgho -)-> -me - = " PAL ghosting"; - -2319 - `fd_em_by_funi_d_g -( -hwݙems -, -swmach -, (0xffff<<16)| -MACH_ORIC1 - )-> -me - = -ic --> -ty -==MACH_ORIC1 ? "\x0e""Oric-1" : " Oric-1"; - -2320 - `fd_em_by_funi_d_g -( -hwݙems -, -swmach -, (0xffff<<16)| -MACH_ORIC1_16K - )-> -me - = -ic --> -ty -==MACH_ORIC1_16K ? "\x0e""Oric-1 16K" : " Oric-1 16K"; - -2321 - `fd_em_by_funi_d_g -( -hwݙems -, -swmach -, (0xffff<<16)| -MACH_ATMOS - )-> -me - = -ic --> -ty -==MACH_ATMOS ? "\x0e""Atmos" : " Atmos"; - -2322 - `fd_em_by_funi_d_g -( -hwݙems -, -swmach -, ( -DRV_NONE -<<16)| -MACH_TELESTRAT -)-> -me - = -ic --> -ty -==MACH_TELESTRAT ? "\x0e""Telestrat" : " Telestrat"; - -2323 - `fd_em_by_funi_d_g -( -hwݙems -, -swmach -, (0xffff<<16)| -MACH_PRAVETZ - )-> -me - = -ic --> -ty -==MACH_PRAVETZ ? "\x0e""Pravetz 8D" : " Pravetz 8D"; - -2325 - `fd_em_by_key -( -hwݙems -, 'm')-> -func - = -miodisom_vid - ? -tdrivy - : -NULL -; - -2326 - `fd_em_by_key -( -hwݙems -, 'j')-> -func - = -jasmrom_vid - ? -tdrivy - : -NULL -; - -2327 - `fd_em_by_key -( -hwݙems -, 'p')-> -func - = -avzrom_vid - ? -tdrivy - : -NULL -; - -2329 - `fd_em_by_key -( -hwݙems -, 'x')-> -me - = -ic --> -drivy -== -DRV_NONE - ? "\x0e""No disk" : " No disk"; - -2330 - `fd_em_by_key -( -hwݙems -, 'm')-> -me - = -ic --> -drivy -== -DRV_MICRODISC - ? "\x0e""Microdisc" : " Microdisc"; - -2331 - `fd_em_by_key -( -hwݙems -, 'j')-> -me - = -ic --> -drivy -== -DRV_JASMIN - ? "\x0e""Jasmin" : " Jasmin"; - -2332 - `fd_em_by_key -( -hwݙems -, 'p')-> -me - = -ic --> -drivy -== -DRV_PRAVETZ - ? "\x0e""Pravetz 8D disk": " Pravetz 8D disk"; - -2334 if( -ic --> -show_keybrd -) - -2335 - `fd_em_by_funi -( -keݙems -, -toggkeybrd -)-> -me - = "\x0e""Show keyboard"; - -2337 - `fd_em_by_funi -( -keݙems -, -toggkeybrd -)-> -me - = " Show keyboard"; - -2339 if( -ic --> -show_keybrd -) - -2340 - `fd_em_by_funi -( -keݙems -, -toggˡickykeys -)-> -me - = "\x0e""Sticky mod keys"; - -2342 - `fd_em_by_funi -( -keݙems -, -toggˡickykeys -)-> -me - = " Sticky mod keys"; - -2344 - `fd_em_by_funi -( -hwݙems -, -toggch376 -)-> -me - = -ic --> -ch376_aived - ? "\x0e""CH376 (Telestrat)" : " CH376 (Telestrat) "; - -2345 - } -} - -2348 -SDL_bo - - $_gui - -mache - * -ic -, -St32 - -ndmode - ) - -2350  -i -; - -2351 -SDL_AudioSc - -wd -; - -2353  -i -=0; i< -NUM_GIMG -; i++ ) - -2355 if! - `gimg_ld -& -gimgs -[ -i -] ) )  -SDL_FALSE -; - -2358 - `t_nd_mode - -ic -, -ndmode - ); - -2359 if! -ic --> - `_nd -i -SDL_FALSE -; - -2362 if! - `loc_xtze - -ic -, -TZ_MONITOR -, 0, 228, 50, 21, "Mڙ" ) )  -SDL_FALSE -; - -2363 if! - `loc_xtze - -ic -, -TZ_DEBUG -, 0, 228, 50, 21, "Debug cse" ) )  -SDL_FALSE -; - -2364 if! - `loc_xtze - -ic -, -TZ_MEMWATCH -, 0, 228, 50, 21, "Memy wch" ) )  -SDL_FALSE -; - -2365 if! - `loc_xtze - -ic -, -TZ_REGS -, 240, 0, 50, 19, "6502 Stus" ) )  -SDL_FALSE -; - -2366 if! - `loc_xtze - -ic -, -TZ_VIA -, 400, 228, 30, 21, "VIA Stus" ) )  -SDL_FALSE -; - -2367 if! - `loc_xtze - -ic -, -TZ_VIA2 -, 400, 228, 30, 21, "TeVIA Stus" ) )  -SDL_FALSE -; - -2368 if! - `loc_xtze - -ic -, -TZ_AY -, 400, 228, 30, 21, "AY Stus" ) )  -SDL_FALSE -; - -2369 if! - `loc_xtze - -ic -, -TZ_DISK -, 400, 228, 30, 21, "Disk Stus" ) )  -SDL_FALSE -; - -2372 -wd -. -eq - = -AUDIO_FREQ -; - -2373 -wd -. -fm - = -AUDIO_S16SYS -; - -2374 -wd -. -chls - = 2; - -2375 -wd -. -mes - = -AUDIO_BUFLEN -; - -2377 -wd -. -back - = (*) -ay_back -; - -2378 -wd -. -urda - = & -ic --> -ay -; - -2380 -soundavaab - = -SDL_FALSE -; - -2381 -sound - = -SDL_FALSE -; - -2382 if - `SDL_OnAudio -& -wd -, & -obed - ) >= 0 ) - -2384 -sound - = -SDL_TRUE -; - -2385 -soundavaab - = -SDL_TRUE -; - -2386 -sounds - = -obed -. -s - * 8192; - -2387 -cyeme - = (( -CYCLESPERSECOND -<< -FPBITS -)/ -obed -. -eq -); - -2390 - `tmutoggs - -ic - ); - -2391 #i - `defed -( -__APPLE__ -|| defed( -__BEOS__ -|| defed( -__HAIKU__ -) - -2392 - `_gui_tive - -ic - ); - -2393 #i - `defed -( -__WIN32__ -|| defed( -__CYGWIN__ -) - -2394 - `_gui_tive - -ic - ); - -2395 #i - `defed -( -__lux__ -) - -2396 - `_gui_tive - -ic - ); - -2398  -SDL_TRUE -; - -2399 - } -} - -2402  - $shut_gui - -mache - * -ic - ) - -2404  -i -; - -2405  -i - = 0; i< -NUM_GIMG -; i++) - -2407 - ` -( -gimgs -[ -i -]. -buf -); - -2408 -gimgs -[ -i -]. -buf - = 0; - -2411 -ic --> - `shut_nd -( oric ); - -2413  -i -=0; i< -NUM_TZ -; i++ ) - -2414 - `_xtze - -ic -, -i - ); - -2416 #i - `defed -( -__APPLE__ -|| defed( -__BEOS__ -|| defed( -__HAIKU__ -) - -2417 - `shut_gui_tive - -ic - ); - -2418 #i - `defed -( -__WIN32__ -|| defed( -__CYGWIN__ -) - -2419 - `shut_gui_tive - -ic - ); - -2420 #i - `defed -( -__lux__ -) - -2421 - `shut_gui_tive - -ic - ); - -2423 - } -} - -2425  - $avdiskbo - -mache - * -ic - ) - -2427 if -ic --> -avdiskautobo - ) - -2429 - `queuekeys -( "CALL800\x0d" ); - -2431 - } -} - - @gui.h - -25 - mRENDERMODE_NULL - = 0, - -26 - mRENDERMODE_SW -, - -27 - mRENDERMODE_GL - - -33 - mTZ_MONITOR - = 0, - -34 - mTZ_DEBUG -, - -35 - mTZ_MEMWATCH -, - -36 - mTZ_REGS -, - -37 - mTZ_VIA -, - -38 - mTZ_VIA2 -, - -39 - mTZ_AY -, - -40 - mTZ_DISK -, - -41 - mTZ_MENU -, - -42 - mTZ_MSGBOX -, - -43 - mTZ_FILEREQ -, - -44 - mNUM_TZ - - -49 - mSTATUSBARMODE_FULL - = 0, - -50 - mSTATUSBARMODE_NOFPS -, - -51 - mSTATUSBARMODE_NONE -, - -52 - mSTATUSBARMODE_LAST - - -55  - sxtze - - -57  - mx -, - my -, - mw -, - mh -; - -58  - mpx -, - mpy -, - mcfc -, - mcbc -; - -59 * - mtx -; - -60 * - mfc -, * - mbc -; - -61 -SDL_bo - - mmodifd -; - -65  - #OSDMENUBAR - ((*)-1) - - ) - -68  - #OMIB_CENTRED - 0 - - ) - -69  - #OMIF_CENTRED - (1<< -OMIB_CENTRED -) - - ) - -70  - #OMIB_BRIGHT - 1 - - ) - -71  - #OMIF_BRIGHT - (1<< -OMIB_BRIGHT -) - - ) - -73  - sosdmuem - - -75 * - mme -; - -76 * - mkey -; - -77  - msdlkey -; - -78 (* - mfunc -)( - mmache - *, - mosdmuem - *,); - -79  - mg -; - -80 -Ut16 - - mags -; - -83  - sosdmu - - -85 * - mt -; - -86  - mcem -; - -87  -osdmuem - * - mems -; - -90  - #VSPTMPSIZE - 1024 - - ) - -92  - sguiimg - - -94 * - mfame -; - -95 -Ut16 - - mw -, - mh -; - -96 -Ut8 - * - mbuf -; - -101 - mGIMG_STATUSBAR -, - -102 - mGIMG_DISK_EJECTED -, - -103 - mGIMG_DISK_IDLE -, - -104 - mGIMG_DISK_ACTIVE -, - -105 - mGIMG_DISK_IDLE_MOD -, - -106 - mGIMG_DISK_ACTIVE_MOD -, - -107 - mGIMG_TAPE_EJECTED -, - -108 - mGIMG_TAPE_PAUSE -, - -109 - mGIMG_TAPE_PLAY -, - -110 - mGIMG_TAPE_STOP -, - -111 - mGIMG_TAPE_RECORD -, - -112 - mGIMG_AVI_RECORD -, - -113 - mGIMG_ORIC1_KEYBOARD -, - -114 - mGIMG_ATMOS_KEYBOARD -, - -115 - mGIMG_PRAVETZ_KEYBOARD -, - -116 - mNUM_GIMG - - -119  - #NUM_GUI_COLS - 16 - - ) - -121 -SDL_bo - -loc_xtze - -mache - * -ic -,  -i -,  -x -,  -y -,  -w -,  -h -, * -t - ); - -122  -_xtze - -mache - * -ic -,  -i - ); - -123 -SDL_bo - -_xtze - -xtze - * -tz -,  -x -,  -y - ); - -125  -do_pup - -mache - * -ic -, * -r - ); - -126  -makebox - -xtze - * -z -,  -x -,  -y -,  -w -,  -h -,  -fg -,  -bg - ); - -127  -tz - -xtze - * -z -, * -t - ); - -128  -tzr - -xtze - * -z -, * -xt - ); - -129  -tzputc - -xtze - * -z -,  -c - ); - -130  -tzos - -xtze - * -z -,  -x -,  -y -, * -xt - ); - -131  -tztc - -xtze - * -z -,  -fc -,  -bc - ); - -132  -tztf - -xtze - * -z -, * -fmt -, ... ); - -133  -tztos - -xtze - * -z -,  -x -,  -y -, * -fmt -, ... ); - -134  -dw_xtze - -xtze - * -z - ); - -135  -tr - -x -,  -y -, -Ut32 - -fc -, Ut32 -bc -, * -r - ); - -136  -gose - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -137  -gomu - -mache - * -ic -,  -osdmuem - * -mem -,  -munum - ); - -138 -SDL_bo - -mu_evt - -SDL_Evt - * -ev -,  -mache - * -ic -, SDL_bo * -ednd - ); - -139  -tmutoggs - -mache - * -ic - ); - -140  -t_nd_mode - -mache - * -ic -,  -whichndmode - ); - -142  -nd - -mache - * -ic - ); - -143  -e_gui - -mache - * -ic - ); - -144 -SDL_bo - -_gui - -mache - * -ic -, -St32 - -ndmode - ); - -145  -shut_gui - -mache - * -ic - ); - -147  -dw_usb - -mache - * -ic - ); - -148  -dw_disks - -mache - * -ic - ); - -149  -dw_avec - -mache - * -ic -, -SDL_bo - -cdg - ); - -150  -dw_ - -mache - * -ic - ); - -152  -dw_keybrd - -mache - * -ic - ); - -155  -urtr - -x -, -Ut32 - -fc -, * -r - ); - -156  -joth -* -th -, * -fe - ); - -160 -SDL_bo - -_gui_tive - -mache - * -ic - ); - -161  -shut_gui_tive - -mache - * -ic - ); - -162  -gui_ݒ_u -cڡ * -u - ); - -163 -SDL_bo - -brd_cy - -mache - * -ic - ); - -164 -SDL_bo - -brd_e - -mache - * -ic - ); - -166  -tovock - -mache - * -ic -,  -osdmuem - * -mem -,  -vue - ); - -167  -r_xtze - -mache - * -ic -,  -i - ); - -169  -osdmuem - * -fd_em_by_funi -(osdmuem * -mu -, * -funi -); - -171  -toggfusn - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -173  -soợtic - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -175  -avdiskbo - -mache - * -ic - ); - - @gui_beos.cpp - -22  - ~ - -23  - ~ - -24  - ~ - -25  - ~ - -26  - ~ - -27  - ~ - -28  - ~ - -29  - ~ - -30  - ~ - -31  - ~ - -32  - ~ - -33  - ~ - -34  - ~ - -35  - ~ - -36  - ~ - -37  - ~ - -40  - ~"syem.h -" - -41  - ~"6502.h -" - -42  - ~"v.h -" - -43  - ~"8912.h -" - -44  - ~"gui.h -" - -45  - ~"disk.h -" - -46  - ~"mڙ.h -" - -47  - ~"6551.h -" - -48  - ~"mache.h -" - -51  -rgb_c - -ic_cs -[] = { - -62  -osdmu - -mus -[]; - -63  -osdmuem - -aboutems -[]; - -66 as - cOSDMuIm - : -public - -BMuIm - { - -67 -public -: - -68 - $OSDMuIm -( -osdmuem - * -desc -, cڡ * -me -, -BMesge - * -mesge -) - -69 : - `BMuIm -( -me -, -mesge -), - $fIm -( -desc -) - -71 i( -desc --> -me -[0] == '\x0e') - -72 - `SMked -( -ue -); - -73 i( -desc --> -key -) - -74 - `STrigg -( -desc --> -key -[0]); - -76 -vtu - ~ - $OSDMuIm -({ - } -}; - -77  -osdmuem - * - gfIm -; - -80  - $bud_tive_mus - -osdmu - * -mu -, -BMu - * -m - ) - -82  -osdmuem - * -em - = -mu --> -ems -; - -84 - `tf -("mu '%s': {\n", -mu --> -t -); - -85 ; -em --> -me -; item++) { - -86 -BMuIm - * -mi -; - -87 cڡ * -me - = -em -->name; - -88 i( -me - = -OSDMENUBAR -) { - -89 -me - = "------------"; - -91 i( -em -[1]. -sdlkey - = -SDLK_BACKSPACE -) - -93 -mi - = -w - - `BSIm -(); - -94 } i( -em --> -func - = -gomu -) { - -95 i( -em --> -g - == 0) - -98 i( -mus -[ -em --> -g -]. -ems - = -aboutems -) { - -99 -mi - = -w - - `BMuIm -( -me -,ew - `BMesge -( -B_ABOUT_REQUESTED -)); - -101 -BMu - * -subMu - = -w - - `BMu -( -me -); - -102 -mi - = -w - - `BMuIm -( -subMu -); - -103 - `bud_tive_mus -& -mus -[ -em --> -g -], -subMu - ); - -106 i( -me -[0] == ' ' ||ame[0] == '\x0e') - -107 -me - = &name[1]; - -108 -mi - = -w - - `OSDMuIm -( -em -, -me -, -NULL -); - -113 -m --> - `AddIm -( -mi -); - -115 - `tf -("}\n"); - -116 - } -} - -119  - $run_tive_about -( ) - -121  -osdmuem - * -em - = -aboutems -; - -122 -BSg - -xt -; - -123 ; -em --> -me -; item++) { - -124 i( -em --> -me - = -OSDMENUBAR -) - -126 -xt - << -em --> -me -; - -127 -xt - << "\n"; - -129 -BA˹ - * -t - = -w - - `BA˹ -("About", -xt -. - `Sg -(), "Ok"); - -130 -t --> - `Go -(); - -131 - } -} - -134 -SDL_bo - - $_gui_tive - -mache - * -ic - ) - -136 -BMimeTy - - `Ty -("application/x-oric-tape"); - -137 i(! -Ty -. - `IsInd -()) - -138 -Ty -. - `Inl -(); - -139 -BMesge - -exts -; - -140 i( -Ty -. - `GFeExnsis -(& -exts -! -B_OK -) { - -141 -exts -. - `AddSg -("extensions", "tap"); - -142 -Ty -. - `SShtDesti -("ORIC Tape"); - -143 -Ty -. - `SLgDesti -("ORIC Tape Image formulators"); - -144 -Ty -. - `SPedA -("application/x-vnd.oricutron"); - -145 -Ty -. - `SFeExnsis -(& -exts -); - -146 -Ty -. - `SSnifrRu -("0.40 [0:8](\"\\026\\026\\026\\044\")"); - -148 -exts -. - `MakeEmy -(); - -149 -BMimeTy - - `diskTy -("application/x-oric-disk"); - -150 i(! -diskTy -. - `IsInd -()) - -151 -diskTy -. - `Inl -(); - -152 i( -diskTy -. - `GFeExnsis -(& -exts -! -B_OK -) { - -153 -exts -. - `AddSg -("extensions", "dsk"); - -154 -diskTy -. - `Inl -(); - -155 -diskTy -. - `SShtDesti -("ORIC Disk"); - -156 -diskTy -. - `SLgDesti -("ORIC Disk Image formulators"); - -157 -diskTy -. - `SPedA -("application/x-vnd.oricutron"); - -158 -diskTy -. - `SFeExnsis -(& -exts -); - -159 -diskTy -. - `SSnifrRu -("0.80 (\"MFM_DISK\")"); - -170  -SDL_TRUE -; - -171 - } -} - -173  - $shut_gui_tive - -mache - * -ic - ) - -175 - } -} - -177 "C" -SDL_bo - -brd_cy - -mache - * -ic - ); - -178 "C" -SDL_bo - -brd_e - -mache - * -ic - ); - -180 -xt_run - * - $w_run -( -t32 - -offt -,  -c -) - -182 -BFt - - `ft -( -be_fixed_ft -); - -183 -xt_run - * -run - = -w -ext_run; - -184 -run --> -offt - = offset; - -185 -run --> -ft - = font; - -186 -run --> -c - = -ic_cs -[color]; - -187  -run -; - -188 - } -} - -191 -SDL_bo - - $brd_cy_xt - -mache - * -ic - ) - -193 * -vidmem - = (& -ic --> -mem -[ic-> -vid_addr -]); - -194  -le -, -c -; - -196 -BSg - -xt -; - -197 -BLi - -xuns -; - -199 -xuns -. - `AddIm -( - `w_run -(0, 0)); - -201  -le - = 0;ine < 28;ine++) { - -202  -c - = 0; col < 40; col++) { - -203  -c - = -vidmem -[ -le - * 40 + -c -]; - -205 i( -c - > 127) { - -206 -c - -= 128; - -209 i( -c - < 8) { - -210 -xuns -. - `AddIm -( - `w_run -( -xt -. - `Lgth -(), -c -)); - -211 -xt - << ' '; - -212 } i( -c - < ' ' || c == 127) { - -213 -xt - << ' '; - -214 } i( -c - == 0x60) { - -215 -xt - << -B_UTF8_COPYRIGHT -; - -217 -xt - << () -c -; - -219 -xt - << '\n'; - -224 -BMesge - * - - = -NULL -; - -225 i( -be_brd --> - `Lock -()) { - -226 -be_brd --> - `Cˬ -(); - -227 - - = -be_brd --> - `Da -(); - -228 i( - -) { - -229 - --> - `AddDa -("xt/a", -B_MIME_TYPE -, -xt -. - `Sg -(),ext. - `Lgth -()); - -231  -ySize - = ( -xt_run_y -) - -232 + -xuns -. - `CouIms -(* ( -xt_run -); - -233 -xt_run_y - * -y - = (xt_run_y *) - `mloc -( -ySize -); - -234 -y --> -cou - = -xuns -. - `CouIms -(); - -235  -i - = 0; i < -y --> -cou -; i++) { - -236 - `memy -(& -y --> -runs -[ -i -], -xuns -. - `ImAt -(i), ( -xt_run -)); - -238 - --> - `AddDa -("iti/x-vnd.Be-xt_run_y", -B_MIME_TYPE -, - -239 -y -, -ySize -); - -240 - ` -( -y -); - -242 -be_brd --> - `Comm -(); - -244 -be_brd --> - `Uock -(); - -247  -i - = 0; i < -xuns -. - `CouIms -(); i++) { - -248 - `de - ( -xt_run - *)( -xuns -. - `ImAt -( -i -)); - -250 -xuns -. - `MakeEmy -(); - -252  -SDL_TRUE -; - -253 - } -} - -256 -SDL_bo - - $brd_cy - -mache - * -ic - ) - -259 i( -ic --> -vid_addr - =ic-> -vidbas -[0]) { - -261 } i( -ic --> -vid_addr - =ic-> -vidbas -[2]) { - -263  - `brd_cy_xt - -ic - ); - -266  -SDL_TRUE -; - -267 - } -} - -269 -SDL_bo - - $brd_e - -mache - * -ic - ) - -271 cڡ * -xt -; - -272 -t32 - -xtL -; - -273 -BMesge - * - - = -NULL -; - -275 i( -be_brd --> - `Lock -()) { - -276 - - = -be_brd --> - `Da -(); - -277 i( - - && cl-> - `FdDa -("xt/a", -B_MIME_TYPE -, (cڡ **)& -xt -, & -xtL -= -B_OK -) { - -278 - `tf -(":%ld\n", -xtL -); - -279 -BSg - - `t -( -xt -, -xtL -); - -280 -t -. - `RA -('\n', '\r'); - -281 -t -. - `RA -('\t', ' '); - -282 - `queuekeys -(*) -t -. - `Sg -() ); - -284 -be_brd --> - `Uock -(); - -286  -SDL_TRUE -; - -287 - } -} - -291 -SDL_bo - - $brd_e_sdl - -mache - * -ic - ) - -293 cڡ * -xt -; - -294 -t32 - -xtL -; - -295 -BMesge - * - - = -NULL -; - -296 -SDL_Evt - -ev -; - -297 -ev -. -key -. -keysym -. -sncode - = 0; - -298 -ev -. -key -. -keysym -. -mod - = ( -SDLMod -)0; - -299 -ev -. -key -. -keysym -. -sym - = ( -SDLKey -)0; - -301 i( -be_brd --> - `Lock -()) { - -302 - - = -be_brd --> - `Da -(); - -303 i( - - && cl-> - `FdDa -("xt/a", -B_MIME_TYPE -, (cڡ **)& -xt -, & -xtL -= -B_OK -) { - -304  -i - = 0; i < -xtL -; i++) { - -305 - `rtf -( -dr -, "pushg key '%c'\n", -xt -[ -i -]); - -306 -ev -. -key -. -keysym -. -sym - = ( -SDLKey -) -xt -[ -i -]; - -307 -ev -. -key -. -keysym -. -unicode - = -xt -[ -i -]; - -308 -ev -. -ty - = -SDL_KEYDOWN -; - -309 -ev -. -key -. -e - = -SDL_PRESSED -; - -310 - `SDL_PushEvt -(& -ev -); - -311 -ev -. -ty - = -SDL_KEYUP -; - -312 -ev -. -key -. -e - = -SDL_RELEASED -; - -313 - `SDL_PushEvt -(& -ev -); - -316 -be_brd --> - `Uock -(); - -318  -SDL_TRUE -; - -319 - } -} - -321  - $gui_ݒ_u -cڡ * -u - ) - -325 -BSg - - `commd -("/bin/open '"); - -326 -commd - << -u - << "'"; - -327 - `syem -( -commd -. - `Sg -()); - -328 - } -} - - @gui_win.c - -27 #ifde -WIN32 - - -28  - ~ - -29  - #WANT_WMINFO - - - ) - -32  - ~"syem.h -" - -33  - ~"6502.h -" - -34  - ~"v.h -" - -35  - ~"8912.h -" - -36  - ~"disk.h -" - -37  - ~"gui.h -" - -38  - ~"mڙ.h -" - -39  - ~"6551.h -" - -40  - ~"mache.h -" - -42  -HWND - - gg_SDL_Wdow -; - -44  -SDL_bo - - glized - = -SDL_FALSE -; - -46 * - gxt - = -NULL -; - -48  - $_brd -() - -50 if( -lized -) - -54 -SDL_SysWMfo - -fo -; - -55 - `SDL_VERSION -(& -fo -. -vsi -); - -56 i( - `SDL_COMPAT_GWMInfo -(& -fo -)) - -59 #i -SDL_MAJOR_VERSION - == 1 - -60 -g_SDL_Wdow - = -fo -. -wdow -; - -62 -g_SDL_Wdow - = -fo -.fo. -w -. -wdow -; - -64 -lized - = -SDL_TRUE -; - -66 - } -} - -68 * - $g_brd_xt_w -() - -70 i(! -lized -) - -71  -NULL -; - -73 i( - `IsClbrdFmAvaab -( -CF_TEXT -&& - `OnClbrd -( -g_SDL_Wdow -)) - -75 cڡ -HANDLE - -hMem - = - `GClbrdDa -( -CF_TEXT -); - -76 i( -hMem -) - -78 * -c - = (*) - `GlobLock -( -hMem -); - -79 i( -c -) - -81 - ` -( -xt -); - -82 -xt - = - `rdup -( -c -); - -83 - `GlobUock -( -hMem -); - -86 - `CloClbrd -(); - -89  -xt -; - -90 - } -} - -92  - $t_brd_xt_w -(cڡ * -xt -) - -94 i(! -lized -) - -97 i -xt - ! -NULL - ) - -99 i - `OnClbrd -( -g_SDL_Wdow -) ) - -101 -HANDLE - -hMem - = - `GlobAoc -(( -GMEM_MOVEABLE -| -GMEM_DDESHARE -), - ` -( -xt -)+1); - -102 i -hMem - ! -NULL - ) - -104 * -d - = (*) - `GlobLock -( -hMem -); - -105 - `memy -( -d -, -xt -, - ` -(text)+1); - -106 - `GlobUock -( -hMem -); - -107 - `EmyClbrd -(); - -108 - `SClbrdDa -( -CF_TEXT -, -hMem -); - -110 - `CloClbrd -(); - -113 - } -} - -115 -SDL_bo - - $_gui_tive - -mache - * -ic - ) - -117 - `_brd -(); - -118  -lized -; - -119 - } -} - -121  - $shut_gui_tive - -mache - * -ic - ) - -123 if( -xt -) - -125 - ` -( -xt -); - -126 -xt - = 0; - -128 - } -} - -130  - $gui_ݒ_u -cڡ * -u - ) - -132 - `ShlExecu -( -NULL -, "ݒ", -u -, - -133 -NULL -, NULL, -SW_SHOWNORMAL -); - -135 - } -} - -137 -SDL_bo - - $brd_cy - -mache - * -ic - ) - -140 i( -ic --> -vid_addr - !ic-> -vidbas -[2]) - -141  -SDL_FALSE -; - -143  -le -, -c -, -i -; - -144  -xt -[40 * 28 + 28 + 1]; - -145 * -vidmem - = (& -ic --> -mem -[ic-> -vid_addr -]); - -147  -i - = 0, -le - = 0;ine < 28;ine++) { - -148  -c - = 0; col < 40; col++) { - -149  -c - = -vidmem -[ -le - * 40 + -c -]; - -151 i( -c - > 127) { - -152 -c - -= 128; - -155 i( -c - < ' ' || c == 127) { - -156 -xt -[ -i -++] = ' '; - -158 -xt -[ -i -++] = () -c -; - -160 -xt -[ -i -++] = '\n'; - -162 -xt -[ -i -++] = '\0'; - -165 - `t_brd_xt_w -( -xt -); - -166  -SDL_TRUE -; - -167 - } -} - -169 -SDL_bo - - $brd_e - -mache - * -ic - ) - -171 if( - `g_brd_xt_w -()) - -173 * -p - = -xt -; - -174  -p - && *p) - -176 * -p -) - -178 '\t': * -p - = ' '; ; - -179 '\n': * -p - = '\r'; ; - -181 * -p - = (*p < 0x20 || 127 < *p)? ' ' : *p; - -184 -p -++; - -186 - `queuekeys -( -xt -); - -188  -SDL_TRUE -; - -189 - } -} - - @gui_x11.c - -27  - #WANT_WMINFO - - - ) - -29  - ~"syem.h -" - -30  - ~"6502.h -" - -31  - ~"v.h -" - -32  - ~"8912.h -" - -33  - ~"gui.h -" - -34  - ~"disk.h -" - -35  - ~"mڙ.h -" - -36  - ~"6551.h -" - -37  - ~"mache.h -" - -39  - ~ - -41  -Diy - * - gdiy -; - -42  -Wdow - - gwdow -; - -44  -SDL_bo - - glized - = -SDL_FALSE -; - -46 #i -SDL_MAJOR_VERSION - == 1 - -48 (* - glock_diy -)( -NULL -; - -49 (* - guock_diy -)( -NULL -; - -51  - $Lock_Diy -() - -53 if( -lock_diy -) - -54 - `lock_diy -(); - -55 - } -} - -57  - $Uock_Diy -() - -59 if( -uock_diy -) - -60 - `uock_diy -(); - -61 - } -} - -63  - $brd_fr -(cڡ -SDL_Evt - * -evt -) - -66 i -evt --> -ty - = -SDL_SYSWMEVENT - &&vt-> -syswm -. -msg - ! -NULL -) - -68 -XEvt - -xevt - = -evt --> -syswm -. -msg -->event.xevent; - -71  -xevt -. -ty -) - -74  -SeiReque -: - -76 -XEvt - -vt -; - -77 -XSeiRequeEvt - * -q -; - -78  -_fm -; - -79  -nbys -; - -80  -ovow -; - -81 * -_da -; - -83 -q - = & -xevt -. -xiڻque -; - -84 -vt -. -xi -. -ty - = -SeiNify -; - -85 -vt -. -xi -. -diy - = -q -->display; - -86 -vt -. -xi -. -i - = -q -->selection; - -87 -vt -. -xi -. -rg - = -Ne -; - -88 -vt -. -xi -. -ݔty - = -Ne -; - -89 -vt -. -xi -. -que - = -q -->requestor; - -90 -vt -. -xi -. -time - = -q -->time; - -91 i - `XGWdowPrݔty -( -diy -, - `DeuRoWdow -(display), - -92 -XA_CUT_BUFFER0 -, 0, -INT_MAX -/4, -F -, -q --> -rg -, - -93 & -vt -. -xi -. -rg -, & -_fm -, - -94 & -nbys -, & -ovow -, & -_da -= -Sucss - ) - -96 i -vt -. -xi -. -rg - = -q -->target ) - -98 i -vt -. -xi -. -rg - = -XA_STRING - ) - -100 i -_da -[ -nbys --1] == '\0' ) - -101 -- -nbys -; - -103 - `XChgePrݔty -( -diy -, -q --> -que -,eq-> -ݔty -, - -104 -vt -. -xi -. -rg -, -_fm -, -PrModeR -, - -105 -_da -, -nbys -); - -106 -vt -. -xi -. -ݔty - = -q -->property; - -108 - `XFe -( -_da -); - -110 - `XSdEvt -( -diy -, -q --> -que -, -F -,0,& -vt -); - -111 - `XSync -( -diy -, -F -); - -119 - } -} - -121 * - $g_brd_xt_x11 -() - -123 -Atom - -i -; - -124 -Wdow - -owr -; - -125 -Atom - -_ty -; - -126  -_fm -; - -127  -nbys -; - -128  -ovow -; - -129 * -c -; - -130 * -xt - = -NULL -; - -132 i(! -lized -) - -133  -NULL -; - -135 - `Lock_Diy -(); - -136 -owr - = - `XGSeiOwr -( -diy -, -XA_PRIMARY -); - -137 - `Uock_Diy -(); - -139 i( -owr - = -Ne - || owø= -wdow -) - -141 -owr - = - `DeuRoWdow -( -diy -); - -142 -i - = -XA_CUT_BUFFER0 -; - -146  -i_ڣ - = 0; - -147 -SDL_Evt - -evt -; - -149 -owr - = -wdow -; - -151 - `Lock_Diy -(); - -152 -i - = - `XInAtom -( -diy -, "Oricu", -F -); - -153 - `XCvtSei -( -diy -, -XA_PRIMARY -, -XA_STRING -, -i -, -owr -, -CutTime -); - -154 - `Uock_Diy -(); - -156 ! -i_ڣ -) - -158 - `SDL_WaEvt -(& -evt -); - -159 i( -evt -. -ty - = -SDL_SYSWMEVENT - &&vt. -syswm -. -msg - ! -NULL -) - -161 -XEvt - -xevt - = -evt -. -syswm -. -msg -->event.xevent; - -162 i( -xevt -. -ty - = -SeiNify -) && - -163 ( -xevt -. -xi -. -que - = -owr -) ) - -164 -i_ڣ - = 1; - -169 - `Lock_Diy -(); - -170 i( - `XGWdowPrݔty -( -diy -, -owr -, -i -, 0, - -171 -INT_MAX -/4, -F -, -XA_STRING -, & -_ty -, & -_fm -, - -172 & -nbys -, & -ovow -, (**)& -c -= -Sucss -) - -174 i( -_ty - = -XA_STRING -) - -176 -xt - = - `rdup -( -c -); - -178 - `XFe -( -c -); - -180 - `Uock_Diy -(); - -182  -xt -; - -183 - } -} - -185  - $t_brd_xt_x11 -(cڡ * -xt -) - -187 i(! -lized -) - -190 i -xt - ! -NULL - ) - -192 - `Lock_Diy -(); - -193 - `XChgePrݔty -( -diy -, - `DeuRoWdow -(display), - -194 ( -Atom -) -XA_CUT_BUFFER0 -, -XA_STRING -, 8, -PrModeR -, (*) -xt -, - ` -(text)+1); - -195 i - `XGSeiOwr -( -diy -, -XA_PRIMARY -! -wdow - ) - -196 - `XSSeiOwr -( -diy -, -XA_PRIMARY -, -wdow -, -CutTime -); - -197 - `Uock_Diy -(); - -199 - } -} - -201  - $_brd -() - -203 if( -lized -) - -207 -SDL_SysWMfo - -fo -; - -208 - `SDL_VERSION -(& -fo -. -vsi -); - -209 i( - `SDL_COMPAT_GWMInfo -(& -fo -)) - -212 i( -fo -. -subsyem - = -SDL_SYSWM_X11 -) - -214 -diy - = -fo -.fo. -x11 -.display; - -215 -wdow - = -fo -.fo. -x11 -.window; - -216 -lock_diy - = -fo -.fo. -x11 -. -lock_func -; - -217 -uock_diy - = -fo -.fo. -x11 -. -uock_func -; - -220 - `SDL_EvtS -( -SDL_SYSWMEVENT -, -SDL_ENABLE -); - -221 - `SDL_COMPAT_SEvtFr -( -brd_fr -); - -223 -lized - = -SDL_TRUE -; - -226 - } -} - -230  - $_brd -() - -232 if( -lized -) - -236 -SDL_SysWMfo - -fo -; - -237 - `SDL_VERSION -(& -fo -. -vsi -); - -238 i( - `SDL_COMPAT_GWMInfo -(& -fo -)) - -241 i( -fo -. -subsyem - = -SDL_SYSWM_X11 -) - -243 -diy - = -fo -.fo. -x11 -.display; - -244 -wdow - = -fo -.fo. -x11 -.window; - -246 -lized - = -SDL_TRUE -; - -249 - } -} - -253 -SDL_bo - - $_gui_tive - -mache - * -ic - ) - -255 - `_brd -(); - -256  -lized -; - -257 - } -} - -259  - $shut_gui_tive - -mache - * -ic - ) - -262 - } -} - -264  - $gui_ݒ_u -cڡ * -u - ) - -267 - } -} - -269 -SDL_bo - - $brd_cy - -mache - * -ic - ) - -272 i( -ic --> -vid_addr - !ic-> -vidbas -[2]) - -273  -SDL_FALSE -; - -275  -le -, -c -, -i -; - -276  -xt -[40 * 28 + 28 + 1]; - -277 * -vidmem - = (& -ic --> -mem -[ic-> -vid_addr -]); - -279  -i - = 0, -le - = 0;ine < 28;ine++) { - -280  -c - = 0; col < 40; col++) { - -281  -c - = -vidmem -[ -le - * 40 + -c -]; - -283 i( -c - > 127) { - -284 -c - -= 128; - -287 i( -c - < ' ' || c == 127) { - -288 -xt -[ -i -++] = ' '; - -290 -xt -[ -i -++] = () -c -; - -292 -xt -[ -i -++] = '\n'; - -294 -xt -[ -i -++] = '\0'; - -297 #i -SDL_MAJOR_VERSION - == 1 - -298 - `t_brd_xt_x11 -( -xt -); - -300 - `SDL_SClbrdText -( -xt -); - -302  -SDL_TRUE -; - -303 - } -} - -305 -SDL_bo - - $brd_e - -mache - * -ic - ) - -307 * -xt - = -NULL -; - -309 #i -SDL_MAJOR_VERSION - == 1 - -310 -xt - = - `g_brd_xt_x11 -(); - -312 if( - `SDL_HasClbrdText -()) - -313 -xt - = - `SDL_GClbrdText -(); - -316 if( -xt - ! -NULL -) - -318 * -p - = -xt -; - -319  -p - && *p) - -321 * -p -) - -323 '\t': * -p - = ' '; ; - -324 '\n': * -p - = '\r'; ; - -326 * -p - = (*p < 0x20 || 128 <= *p)? ' ' : *p; - -329 -p -++; - -331 - `queuekeys -( -xt -); - -332 - ` -( -xt -); - -334  -SDL_TRUE -; - -335 - } -} - - @joystick.c - -22  - ~ - -23  - ~ - -24  - ~ - -25  - ~ - -27  - ~"syem.h -" - -28  - ~"6502.h -" - -29  - ~"v.h -" - -30  - ~"8912.h -" - -31  - ~"gui.h -" - -32  - ~"disk.h -" - -33  - ~"mڙ.h -" - -34  - ~"6551.h -" - -35  - ~"mache.h -" - -36  - ~"joyick.h -" - -38  - skeyjoydef - - -40 * - mid -; - -41 -SDL_COMPAT_KEY - - msym -; - -44  -keyjoydef - - gkeyjoyb -[] = { { "BACKSPACE", -SDLK_BACKSPACE - }, - -45 { "TAB", -SDLK_TAB - }, - -46 { "CLEAR", -SDLK_CLEAR - }, - -47 { "RETURN", -SDLK_RETURN - }, - -48 { "ENTER", -SDLK_RETURN - }, - -49 { "PAUSE", -SDLK_PAUSE - }, - -50 { "ESCAPE", -SDLK_ESCAPE - }, - -51 { "SPACE", -SDLK_SPACE - }, - -52 { "HELP", -SDLK_HELP - }, - -53 { "DELETE", -SDLK_DELETE - }, - -54 { "DEL", -SDLK_DELETE - }, - -55 { "LSHIFT", -SDLK_LSHIFT - }, - -56 { "RSHIFT", -SDLK_RSHIFT - }, - -57 { "RCTRL", -SDLK_RCTRL - }, - -58 { "LCTRL", -SDLK_LCTRL - }, - -59 { "RALT", -SDLK_RALT - }, - -60 { "LALT", -SDLK_LALT - }, - -61 { "KP0", -SDLK_KP0 - }, - -62 { "KP1", -SDLK_KP1 - }, - -63 { "KP2", -SDLK_KP2 - }, - -64 { "KP3", -SDLK_KP3 - }, - -65 { "KP4", -SDLK_KP4 - }, - -66 { "KP5", -SDLK_KP5 - }, - -67 { "KP6", -SDLK_KP6 - }, - -68 { "KP7", -SDLK_KP7 - }, - -69 { "KP8", -SDLK_KP8 - }, - -70 { "KP9", -SDLK_KP9 - }, - -71 { "KP_PERIOD", -SDLK_KP_PERIOD - }, - -72 { "KP_FULLSTOP", -SDLK_KP_PERIOD - }, - -73 { "KP_DIVIDE", -SDLK_KP_DIVIDE - }, - -74 { "KP_MULTIPLY", -SDLK_KP_MULTIPLY - }, - -75 { "KP_MINUS", -SDLK_KP_MINUS - }, - -76 { "KP_PLUS", -SDLK_KP_PLUS - }, - -77 { "KP_ENTER", -SDLK_KP_ENTER - }, - -78 { "KP_EQUALS", -SDLK_KP_EQUALS - }, - -79 { "UP", -SDLK_UP - }, - -80 { "DOWN", -SDLK_DOWN - }, - -81 { "LEFT", -SDLK_LEFT - }, - -82 { "RIGHT", -SDLK_RIGHT - }, - -83 { "INSERT", -SDLK_INSERT - }, - -84 { "HOME", -SDLK_HOME - }, - -85 { "END", -SDLK_END - }, - -86 { "PAGEUP", -SDLK_PAGEUP - }, - -87 { "PAGEDOWN", -SDLK_PAGEDOWN - }, - -88 { -NULL -, 0 } }; - -90  -SDL_bo - - gjoysubed - = -SDL_FALSE -; - -91 -Ut8 - - gjoye_a -[6], - gjoye_b -[6]; - -93  -SDL_bo - - $is__joyick - -St16 - -joymode - ) - -95 if -joymode - > -JOYMODE_SDL0 - ) && ( joymod< -JOYMODE_SDL9 - ) ) - -96  -SDL_TRUE -; - -97  -SDL_FALSE -; - -98 - } -} - -100  - $o_joyicks - -mache - * -ic - ) - -102 if -joysubed - ) - -104 if -ic --> -sdljoy_a - ) - -106 - `SDL_JoyickClo - -ic --> -sdljoy_a - ); - -107 if -ic --> -sdljoy_b - =ic-> -sdljoy_a - ) - -108 -ic --> -sdljoy_b - = -NULL -; - -109 -ic --> -sdljoy_a - = -NULL -; - -111 if -ic --> -sdljoy_b - ) - -113 - `SDL_JoyickClo - -ic --> -sdljoy_b - ); - -114 -ic --> -sdljoy_b - = -NULL -; - -117 - `SDL_JoyickEvtS - -SDL_FALSE - ); - -119 - } -} - -122 -St16 - - $joy_keyme_to_sym -* -me - ) - -124 -St32 - -i -; - -125  -c -; - -128 if -me -[1] == 0 ) - -130 -c - = - `tow - -me -[0] ); - -131 if -c - >= 32 ) && ( c < 127 ) )  c; - -136  -i -=0; -keyjoyb -[i]. -id -; i++ ) - -138 if - `rcmp - -keyjoyb -[ -i -]. -id -, -me - ) == 0 ) - -139  -keyjoyb -[ -i -]. -sym -; - -143 - } -} - -145  -SDL_bo - - $dojoyevt - -SDL_Evt - * -ev -,  -mache - * -ic -, -St16 - -mode -, -Ut8 - * -joye -, -SDL_Joyick - * -sjoy - ) - -147 -St32 - -i -; - -148 -SDL_COMPAT_KEY - * -kbb -; - -149 -SDL_bo - -swlow - = -SDL_FALSE -; - -151 -kbb - = -ic --> -kbjoy2 -; - -152  -mode - ) - -154  -JOYMODE_NONE -: - -155  -JOYMODE_MOUSE -: - -156  -SDL_FALSE -; - -158  -JOYMODE_KB1 -: - -159 -kbb - = -ic --> -kbjoy1 -; - -160  -JOYMODE_KB2 -: - -161  -ev --> -ty - ) - -163  -SDL_KEYDOWN -: - -164  -i -=0; i<6; i++ ) - -166 if -ev --> -key -. -keysym -. -sym - = -kbb -[ -i -] ) - -168 -joye -[ -i -] = 1; - -169 -swlow - = -SDL_TRUE -; - -174  -SDL_KEYUP -: - -175  -i -=0; i<6; i++ ) - -177 if -ev --> -key -. -keysym -. -sym - = -kbb -[ -i -] ) - -179 -joye -[ -i -] = 0; - -180 -swlow - = -SDL_TRUE -; - -187  -JOYMODE_SDL0 -: - -188  -JOYMODE_SDL1 -: - -189  -JOYMODE_SDL2 -: - -190  -JOYMODE_SDL3 -: - -191  -JOYMODE_SDL4 -: - -192  -JOYMODE_SDL5 -: - -193  -JOYMODE_SDL6 -: - -194  -JOYMODE_SDL7 -: - -195  -JOYMODE_SDL8 -: - -196  -JOYMODE_SDL9 -: - -197 if! -sjoy - )  -SDL_FALSE -; - -199  -ev --> -ty - ) - -201  -SDL_JOYAXISMOTION -: - -202 if -ev --> -jaxis -. -which - !( -mode -- -JOYMODE_SDL0 - -SDL_FALSE -; - -203 -swlow - = -SDL_TRUE -; - -204  -ev --> -jaxis -. -axis - ) - -207 if -ev --> -jaxis -. -vue - < -3200 ) - -209 -joye -[2] = 1; - -210 -joye -[3] = 0; - -211 } if -ev --> -jaxis -. -vue - > 3200 ) { - -212 -joye -[2] = 0; - -213 -joye -[3] = 1; - -215 -joye -[2] = 0; - -216 -joye -[3] = 0; - -221 if -ev --> -jaxis -. -vue - < -3200 ) - -223 -joye -[0] = 1; - -224 -joye -[1] = 0; - -225 } if -ev --> -jaxis -. -vue - > 3200 ) { - -226 -joye -[0] = 0; - -227 -joye -[1] = 1; - -229 -joye -[0] = 0; - -230 -joye -[1] = 0; - -236  -SDL_JOYBUTTONDOWN -: - -237 if -ev --> -jbu -. -which - !( -mode -- -JOYMODE_SDL0 - -SDL_FALSE -; - -238 -joye -[4+( -ev --> -jbu -. -bu -&1)] = 1; - -239 -swlow - = -SDL_TRUE -; - -242  -SDL_JOYBUTTONUP -: - -243 if -ev --> -jbu -. -which - !( -mode -- -JOYMODE_SDL0 - -SDL_FALSE -; - -244 -joye -[4+( -ev --> -jbu -. -bu -&1)] = 0; - -245 -swlow - = -SDL_TRUE -; - -251  -swlow -; - -252 - } -} - -254  - $joy_budmask - -mache - * -ic - ) - -256 -Ut8 - -mkmask - = 0xff; - -257 -Ut8 - -joyl - = -ic --> -v -. - `ad_pt_a -( &oric->via ); - -258 -SDL_bo - -gimme_pt_a - = -SDL_FALSE -; - -260  -ic --> -joy_i - ) - -262  -JOYIFACE_ALTAI -: - -263 if -joyl - & 0x80 ) - -265 if -joye_a -[0] ) -mkmask - &= 0xef; - -266 if -joye_a -[1] ) -mkmask - &= 0xf7; - -267 if -joye_a -[2] ) -mkmask - &= 0xfe; - -268 if -joye_a -[3] ) -mkmask - &= 0xfd; - -269 if -joye_a -[4] ) -mkmask - &= 0xdf; - -270 -gimme_pt_a - = -SDL_TRUE -; - -273 if -joyl - & 0x40 ) - -275 if -joye_b -[0] ) -mkmask - &= 0xef; - -276 if -joye_b -[1] ) -mkmask - &= 0xf7; - -277 if -joye_b -[2] ) -mkmask - &= 0xfe; - -278 if -joye_b -[3] ) -mkmask - &= 0xfd; - -279 if -joye_b -[4] ) -mkmask - &= 0xdf; - -280 -gimme_pt_a - = -SDL_TRUE -; - -284  -JOYIFACE_IJK -: - -285 -mkmask - &= 0xdf; - -287 if(( -ic --> -v -. -ddrb - & 0x10)==0) || - -288 (( -ic --> -v -. - `ad_pt_b -( &oric->via )&0x10)!=0) ) - -291 -gimme_pt_a - = -SDL_TRUE -; - -293 if -joyl - & 0xc0 ) == 0xc0 ) ; - -295 if -joyl - & 0x40 ) - -297 if -joye_a -[0] ) -mkmask - &= 0xef; - -298 if -joye_a -[1] ) -mkmask - &= 0xf7; - -299 if -joye_a -[2] ) -mkmask - &= 0xfd; - -300 if -joye_a -[3] ) -mkmask - &= 0xfe; - -301 if -joye_a -[4] ) -mkmask - &= 0xfb; - -304 if -joyl - & 0x80 ) - -306 if -joye_b -[0] ) -mkmask - &= 0xef; - -307 if -joye_b -[1] ) -mkmask - &= 0xf7; - -308 if -joye_b -[2] ) -mkmask - &= 0xfd; - -309 if -joye_b -[3] ) -mkmask - &= 0xfe; - -310 if -joye_b -[4] ) -mkmask - &= 0xfb; - -315 -ic --> -p܏_joy - = -mkmask -; - -316 if -gimme_pt_a - ) - -318 -ic --> -v -. - `wre_pt_a -&ic->v, 0xff, -mkmask - ); - -319 -ic --> -p܏_is_ay - = -SDL_FALSE -; - -321 if! -ic --> -p܏_is_ay - ) - -323 -ic --> -v -. - `wre_pt_a -&ic->v, 0xff, oric-> -p܏_ay - ); - -324 -ic --> -p܏_is_ay - = -SDL_TRUE -; - -327 - } -} - -329 -SDL_bo - - $joy_fr_evt - -SDL_Evt - * -ev -,  -mache - * -ic - ) - -331 -SDL_bo - -swlow_evt -; - -333 -swlow_evt - = - `dojoyevt - -ev -, -ic -, (ic-> -ty -== -MACH_TELESTRAT -? oric-> -joymode_a - : oric-> -joymode_a -, -joye_a -, oric-> -sdljoy_a - ); - -334 -swlow_evt - | - `dojoyevt - -ev -, -ic -, (ic-> -ty -== -MACH_TELESTRAT -? oric-> -joymode_b - : oric-> -joymode_b -, -joye_b -, oric-> -sdljoy_b - ); - -336 if -swlow_evt - ) - -340 - `joy_budmask - -ic - ); - -351  -swlow_evt -; - -352 - } -} - -354  - $dojoytup - -mache - * -ic -, -St16 - -mode_a -, St16 -mode_b - ) - -356 -St32 - -i -; - -358 - `o_joyicks - -ic - ); - -360  -i -=0; i<6; i++ ) - -362 -joye_a -[ -i -] = 0; - -363 -joye_b -[ -i -] = 0; - -366 if(! - `is__joyick - -mode_a - )&& (!is__joyick -mode_b - )) ) - -369 if! -joysubed - ) - -372 if - `SDL_InSubSyem - -SDL_INIT_JOYSTICK - ) != 0 ) - -376 -joysubed - = -SDL_TRUE -; - -379 if - `is__joyick - -mode_a - ) ) - -381 -ic --> -sdljoy_a - = - `SDL_JoyickOn - -mode_a - - -JOYMODE_SDL0 - ); - -383 - `SDL_JoyickEvtS - -SDL_TRUE - ); - -386 if - `is__joyick - -mode_b - ) ) - -388 if -mode_b - = -mode_a - ) - -390 -ic --> -sdljoy_b - = oric-> -sdljoy_a -; - -392 -ic --> -sdljoy_b - = - `SDL_JoyickOn - -mode_b - - -JOYMODE_SDL0 - ); - -393 - `SDL_JoyickEvtS - -SDL_TRUE - ); - -396 - } -} - -398  - $joy_tup - -mache - * -ic - ) - -400 if -ic --> -ty - = -MACH_TELESTRAT - ) - -401 - `dojoytup - -ic -, oric-> -joymode_a -, oric-> -joymode_b - ); - -403 - `dojoytup - -ic -, oric-> -joymode_a -, oric-> -joymode_b - ); - -404 - } -} - -408 -SDL_bo - - $_joy - -mache - * -ic - ) - -410  -SDL_TRUE -; - -411 - } -} - -413  - $shut_joy - -mache - * -ic - ) - -415 - `o_joyicks - -ic - ); - -416 - } -} - - @joystick.h - -25 - mJOYIFACE_NONE - = 0, - -26 - mJOYIFACE_ALTAI -, - -27 - mJOYIFACE_IJK - - -33 - mJOYMODE_NONE - = 0, - -34 - mJOYMODE_KB1 -, - -35 - mJOYMODE_KB2 -, - -36 - mJOYMODE_SDL0 -, - -37 - mJOYMODE_SDL1 -, - -38 - mJOYMODE_SDL2 -, - -39 - mJOYMODE_SDL3 -, - -40 - mJOYMODE_SDL4 -, - -41 - mJOYMODE_SDL5 -, - -42 - mJOYMODE_SDL6 -, - -43 - mJOYMODE_SDL7 -, - -44 - mJOYMODE_SDL8 -, - -45 - mJOYMODE_SDL9 -, - -46 - mJOYMODE_MOUSE - - -49 -SDL_bo - -_joy - -mache - * -ic - ); - -50  -shut_joy - -mache - * -ic - ); - -52 -St16 - -joy_keyme_to_sym -* -me - ); - -53  -joy_tup - -mache - * -ic - ); - -54 -SDL_bo - -joy_fr_evt - -SDL_Evt - * -ev -,  -mache - * -ic - ); - -55  -joy_budmask - -mache - * -ic - ); - - @keyboard.c - -22 #ifde -_MSC_VER - - -23  - ~ - -26  - ~ - -28  - ~"syem.h -" - -29  - ~"6502.h -" - -30  - ~"v.h -" - -31  - ~"8912.h -" - -32  - ~"gui.h -" - -33  - ~"disk.h -" - -34  - ~"mڙ.h -" - -35  - ~"6551.h -" - -36  - ~"mache.h -" - -37  - ~"feq.h -" - -38  - ~"nd_sw.h -" - -39  - ~"nd_sw8.h -" - -40  - ~"nd_gl.h -" - -41  - ~"nd_nu.h -" - -42  - ~"u.h -" - -43  - ~".h -" - -44  - ~"joyick.h -" - -45  - ~"msgbox.h -" - -46  - ~"keybrd.h -" - -49  -kbdkey - - gkbd_mos -[65], - gkbd_ic1 -[65], - gkbd_avz -[65]; - -51 -SDL_Sur -* - $CeSur - -width - ,  -height - ) - -53 -ut32_t - -rmask - , -gmask - , -bmask - , -amask -; - -54 -SDL_Sur -* -sur -; - -58 #i -SDL_BYTEORDER - = -SDL_BIG_ENDIAN - - -59 -rmask - = 0xff000000; - -60 -gmask - = 0x00ff0000; - -61 -bmask - = 0x0000ff00; - -62 -amask - = 0x000000ff; - -64 -rmask - = 0x000000ff; - -65 -gmask - = 0x0000ff00; - -66 -bmask - = 0x00ff0000; - -67 -amask - = 0xff000000; - -70 -sur - = - `SDL_CeRGBSur -0 , -width - , -height - , 32 , -rmask - , -gmask - , -bmask - , -amask - ); - -71 if -sur - = -NULL - ) - -73 - `r_tf -("CeRGBSur faed: %s", - `SDL_GE -() ); - -74 - `ex -( -EXIT_FAILURE -); - -77  -sur -; - -78 - } -} - -80  - #KEYSIM_FLAG - (( -SDL_COMPAT_KEY -)0x8000) - - ) - -81  - #KEYSIM_MASK - (( -SDL_COMPAT_KEY -)0x7FFF) - - ) - -83  -SDL_COMPAT_KEY - - gkeyM -[] = { - -85 -SDLK_ESCAPE -, 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', -SDLK_BACKSPACE -, - -86 -SDLK_LCTRL -, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', -SDLK_RETURN -, - -87 -SDLK_LSHIFT -, 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', -SDLK_RSHIFT -, - -88 -SDLK_LEFT -, -SDLK_DOWN -, ' ', -SDLK_UP -, -SDLK_RIGHT -, -SDLK_RALT -, ' ', ' ', ' ', ' ', ' ', ' ' }; - -90  -SDL_COMPAT_KEY - - gkeyMPvz -[] = { - -91 '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', -KEYSIM_FLAG -|';', '-', ';', - -92 -SDLK_ESCAPE -, 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', -KEYSIM_FLAG -|'2', '\\', -SDLK_BACKSPACE -, - -93 -SDLK_LCTRL -, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', '[', ']', -SDLK_RETURN -, - -94 -SDLK_LSHIFT -, 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', -SDLK_RSHIFT -, - -95 -SDLK_LEFT -, -SDLK_DOWN -, ' ', -SDLK_UP -, -SDLK_RIGHT -, -SDLK_RALT -, -KEYSIM_FLAG -|'6', ' ', ' ', ' ', ' ', ' ' }; - -97  -SDL_COMPAT_KEY - - gkeyMShiedPvz -[] = { - -98 '1', '\'', '3', '4', '5', '7', -KEYSIM_FLAG -|'\'', '9', '0', '-', '8', KEYSIM_FLAG|'=', '=', - -99 -SDLK_ESCAPE -, 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '~', '\\', -SDLK_BACKSPACE -, - -100 -SDLK_LCTRL -, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', '[', ']', -SDLK_RETURN -, - -101 -SDLK_LSHIFT -, 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', -SDLK_RSHIFT -, - -102 -SDLK_LEFT -, -SDLK_DOWN -, ' ', -SDLK_UP -, -SDLK_RIGHT -, -SDLK_RALT -, '`', ' ', ' ', ' ', ' ', ' ' }; - -105 - mMOD_CTRL - = 0, - -106 - mMOD_LSHIFT -, - -107 - mMOD_RSHIFT -, - -108 - mMOD_FUNCT -, - -109 - mMODKEY_MAX - - -112  -SDL_COMPAT_KEY - - gmodKeys -[ -MODKEY_MAX -] = { -SDLK_LCTRL -, -SDLK_LSHIFT -, -SDLK_RSHIFT -, -SDLK_LALT - }; - -113 * - gmodKeyNames -[ -MODKEY_MAX -] = { "Ctrl", "Left shift", "Right shift", "Funct" }; - -114 cڡ  - gmodKeyMax - = -MODKEY_MAX -; - -115  -SDL_bo - - gmodKeyPsd -[ -MODKEY_MAX -]; - -116  -SDL_bo - - gmodKeyFakePsd -[ -MODKEY_MAX -]; - -118  - $kbd_ - -mache - * -ic - ) - -120  -i -, -j -; - -122 - `memt -(& -modKeyPsd -[0], 0, (modKeyPressed)); - -123 - `memt -(& -modKeyFakePsd -[0], 0, (modKeyFakePressed)); - -125 -ic --> -keybrd_mpg -. -nb_m - = 0; - -127  -i -=0; i<62; i++ ) - -129 -kbd_mos -[ -i -]. -w - = 43; - -130 -kbd_mos -[ -i -]. -h - = 43; - -131 -kbd_mos -[ -i -]. -highlight - = 0; - -132 -kbd_mos -[ -i -]. -highlightde - = 0; - -133 -kbd_mos -[ -i -]. -is_mod_key - = 0; - -134 -kbd_mos -[ -i -]. -keysim - = -keyM -[i]; - -136 -kbd_ic1 -[ -i -]. -w - = 43; - -137 -kbd_ic1 -[ -i -]. -h - = 43; - -138 -kbd_ic1 -[ -i -]. -highlight - = 0; - -139 -kbd_ic1 -[ -i -]. -highlightde - = 0; - -140 -kbd_ic1 -[ -i -]. -is_mod_key - = 0; - -141 -kbd_ic1 -[ -i -]. -keysim - = -keyM -[i]; - -143 -kbd_avz -[ -i -]. -w - = 41; - -144 -kbd_avz -[ -i -]. -h - = 41; - -145 -kbd_avz -[ -i -]. -highlight - = 0; - -146 -kbd_avz -[ -i -]. -highlightde - = 0; - -147 -kbd_avz -[ -i -]. -is_mod_key - = 0; - -148 -kbd_avz -[ -i -]. -keysim - = -keyMPvz -[i]; - -149 -kbd_avz -[ -i -]. -keysimshied - = -keyMShiedPvz -[i]; - -153  -j - = 0; j < -modKeyMax -; j++) { - -154 i( -kbd_mos -[ -i -]. -keysim - = -modKeys -[ -j -]) { - -155 -kbd_mos -[ -i -]. -is_mod_key - = 1; - -156 -kbd_ic1 -[ -i -]. -is_mod_key - = 1; - -157 -kbd_avz -[ -i -]. -is_mod_key - = 1; - -164  -i -=0; i<13; i++ ) - -166 -kbd_mos -[ -i -]. -x - = i*43+47; - -167 -kbd_mos -[ -i -]. -y - = 10; - -169 -kbd_ic1 -[ -i -]. -x - = i*43+40; - -170 -kbd_ic1 -[ -i -]. -y - = 15; - -172 -kbd_avz -[ -i -]. -x - = i*42+47; - -173 -kbd_avz -[ -i -]. -y - = 10; - -175  -i -=13; i<27; i++ ) - -177 -kbd_mos -[ -i -]. -x - = (i-13)*43+23; - -178 -kbd_mos -[ -i -]. -y - = 53; - -180 -kbd_ic1 -[ -i -]. -x - = (i-13)*43+16; - -181 -kbd_ic1 -[ -i -]. -y - = 58; - -183 -kbd_avz -[ -i -]. -x - = (i-13)*42+25; - -184 -kbd_avz -[ -i -]. -y - = 51; - -186  -i -=27; i<40; i++ ) - -188 -kbd_mos -[ -i -]. -x - = (i-27)*43+38; - -189 -kbd_mos -[ -i -]. -y - = 96; - -191 -kbd_ic1 -[ -i -]. -x - = (i-27)*43+27; - -192 -kbd_ic1 -[ -i -]. -y - = 101; - -194 -kbd_avz -[ -i -]. -x - = (i-27)*43+40; - -195 -kbd_avz -[ -i -]. -y - = 93; - -197 -kbd_mos -[39]. -w - = 65; - -198 -kbd_ic1 -[39]. -w - = 87; - -200 -kbd_mos -[40]. -x - = 38; - -201 -kbd_mos -[40]. -y - = 139; - -202 -kbd_mos -[40]. -w - = 65; - -204  -i -=41; i<52; i++ ) - -206 -kbd_mos -[ -i -]. -x - = (i-41)*43+103; - -207 -kbd_mos -[ -i -]. -y - = 139; - -209 -kbd_mos -[51]. -w - = 65; - -211 -kbd_mos -[52]. -x - = 60; - -212 -kbd_mos -[52]. -y - = 182; - -213 -kbd_mos -[53]. -x - = 103; - -214 -kbd_mos -[53]. -y - = 182; - -215 -kbd_mos -[54]. -x - = 146; - -216 -kbd_mos -[54]. -y - = 182; - -217 -kbd_mos -[54]. -w - = 344; - -218 -kbd_mos -[55]. -x - = 490; - -219 -kbd_mos -[55]. -y - = 182; - -220 -kbd_mos -[56]. -x - = 533; - -221 -kbd_mos -[56]. -y - = 182; - -222 -kbd_mos -[57]. -x - = 576; - -223 -kbd_mos -[57]. -y - = 182; - -224 -kbd_mos -[58]. -x - = -1; - -226  -i -=40; i<52; i++ ) - -228 -kbd_ic1 -[ -i -]. -x - = (i-40)*43+49; - -229 -kbd_ic1 -[ -i -]. -y - = 144; - -232 -kbd_ic1 -[52]. -x - = 135; - -233 -kbd_ic1 -[52]. -y - = 187; - -234 -kbd_ic1 -[53]. -x - = 178; - -235 -kbd_ic1 -[53]. -y - = 187; - -236 -kbd_ic1 -[54]. -x - = 221; - -237 -kbd_ic1 -[54]. -y - = 187; - -238 -kbd_ic1 -[54]. -w - = 215; - -239 -kbd_ic1 -[55]. -x - = 436; - -240 -kbd_ic1 -[55]. -y - = 187; - -241 -kbd_ic1 -[56]. -x - = 479; - -242 -kbd_ic1 -[56]. -y - = 187; - -243 -kbd_ic1 -[57]. -x - = -1; - -245  -i -=41; i<52; i++ ) - -247 -kbd_avz -[ -i -]. -x - = (i-41)*43+103; - -248 -kbd_avz -[ -i -]. -y - = 137; - -251 -kbd_avz -[26]. -x - = 38; - -252 -kbd_avz -[26]. -y - = 180; - -254 -kbd_avz -[39]. -w - = 65; - -255 -kbd_avz -[40]. -x - = 38; - -256 -kbd_avz -[40]. -y - = 137; - -257 -kbd_avz -[40]. -w - = 65; - -258 -kbd_avz -[51]. -w - = 65; - -260 -kbd_avz -[52]. -x - = 82; - -261 -kbd_avz -[52]. -y - = 180; - -262 -kbd_avz -[53]. -x - = 125; - -263 -kbd_avz -[53]. -y - = 180; - -264 -kbd_avz -[54]. -x - = 168; - -265 -kbd_avz -[54]. -y - = 180; - -266 -kbd_avz -[54]. -w - = 215+88; - -267 -kbd_avz -[55]. -x - = 436+40; - -268 -kbd_avz -[55]. -y - = 180; - -269 -kbd_avz -[56]. -x - = 479+40; - -270 -kbd_avz -[56]. -y - = 180; - -271 -kbd_avz -[58]. -x - = (13)*42+25; - -272 -kbd_avz -[58]. -y - = 51; - -273 -kbd_avz -[59]. -x - = 479+40 +42; - -274 -kbd_avz -[59]. -y - = 180; - -275 -kbd_avz -[60]. -x - = -1; - -278 - } -} - -280  -SDL_bo - - gdefg_key_m - = -SDL_FALSE -; - -281  -kbdkey - * - gcut_key - = -NULL -; - -282  -SDL_bo - - ga_keys - = -SDL_FALSE -; - -286 -SDL_bo - - $keybrd_evt - -SDL_Evt - * -ev -,  -mache - * -ic -, -SDL_bo - * -ednd - ) - -288 -SDL_bo - -de - = -SDL_FALSE -; - -289 -SDL_bo - -lshied - = -modKeyPsd -[ -MOD_LSHIFT -]; - -290 -SDL_bo - -rshied - = -modKeyPsd -[ -MOD_RSHIFT -]; - -292  -i -, -x -, -y -, -cut_key_num - = -1; - -293  -tmp -[64]; - -294  -kbdkey - * -kbd -; - -296 i( -a_keys -) - -298 -x - = 0; - -299  -i -=0; i< -modKeyMax -; i++) - -301 i( -modKeyPsd -[ -i -]) - -303 -modKeyPsd -[ -i -] = -SDL_FALSE -; - -304 - `ay_keyess -& -ic --> -ay -, -modKeys -[ -i -], -SDL_FALSE - ); - -305 - `tf -( -tmp -, mp), "%ad.", -modKeyNames -[ -i -]); - -306 - `do_pup -( -ic -, -tmp -); - -307 -x -++; - -308 } i( -modKeyFakePsd -[ -i -]) { - -309 -modKeyFakePsd -[ -i -] = -SDL_FALSE -; - -310 - `ay_keyess -& -ic --> -ay -, -modKeys -[ -i -], -SDL_FALSE - ); - -314 i( -x - > 1) - -315 - `do_pup -( -ic -, "All keyseleased"); - -317 -a_keys - = -SDL_FALSE -; - -320 -x - = -1; - -321 -y - = -1; - -322  -ev --> -ty - ) - -324  -SDL_MOUSEBUTTONDOWN -: - -325 -x - = -ev --> -bu -.x; - -326 -y - = -ev --> -bu -.y - 480; - -328  -ic --> -ty - ) - -330  -MACH_PRAVETZ -: - -331 -kbd - = -kbd_avz -; - -333  -MACH_ORIC1 -: - -334  -MACH_ORIC1_16K -: - -335 -kbd - = -kbd_ic1 -; - -338 -kbd - = -kbd_mos -; - -343 -cut_key - = -NULL -; - -344  -i -=0; i<62; i++) { - -345 i(( -x - > -kbd -[ -i -].x&& (x < kbd[i].x + kbd[i]. -w -) && - -346 ( -y - > -kbd -[ -i -].y&& (y < kbd[i].y + kbd[i]. -h -)) { - -347 -cut_key - = &( -kbd -[ -i -]); - -348 -cut_key_num - = -i -; - -356 i( -cut_key - ! -NULL -) { - -358 if -ev --> -bu -.bu = -SDL_BUTTON_LEFT - ) - -360 if( -ic --> -defe_mpg -) { - -361 - `do_pup - -ic -, "Presshe key you wanto use." ); - -362 -defg_key_m - = -SDL_TRUE -; - -365 i( -cut_key --> -is_mod_key - && -ic --> -icky_mod_keys -) { - -366  -i -=0; i< -modKeyMax -; i++) { - -367 i( -cut_key --> -keysim - = -modKeys -[ -i -]) - -371 i( -i - < -modKeyMax -) { - -372 i( -modKeyPsd -[ -i -]) { - -373 -modKeyPsd -[ -i -] = -SDL_FALSE -; - -374 - `tf -( -tmp -, mp), "%ad.", -modKeyNames -[ -i -]); - -376 -modKeyPsd -[ -i -] = -SDL_TRUE -; - -377 - `tf -( -tmp -, mp), "%esd.", -modKeyNames -[ -i -]); - -379 - `do_pup -( -ic -, -tmp -); - -380 - `ay_keyess -& -ic --> -ay -, -cut_key --> -keysim -, -modKeyPsd -[ -i -] ); - -381 -cut_key - = -NULL -; - -382  -de -; - -387  -ic --> -ty - ) - -389  -MACH_PRAVETZ -: - -390 i( -lshied -) { - -391 i( -cut_key_num - == 24) - -392 - `queuekeys -("\x60"); - -393 i( -KEYSIM_FLAG - & -cut_key --> -keysimshied -) - -394 - `ay_keyess -& -ic --> -ay -, -modKeys -[ -MOD_LSHIFT -], -SDL_FALSE - ); - -395 - `ay_keyess -& -ic --> -ay -, -KEYSIM_MASK - & -cut_key --> -keysimshied -, -SDL_TRUE - ); - -396 } i( -rshied -) { - -397 i( -cut_key_num - == 24) - -398 - `queuekeys -("\x60"); - -399 i( -KEYSIM_FLAG - & -cut_key --> -keysimshied -) - -400 - `ay_keyess -& -ic --> -ay -, -modKeys -[ -MOD_RSHIFT -], -SDL_FALSE - ); - -401 - `ay_keyess -& -ic --> -ay -, -KEYSIM_MASK - & -cut_key --> -keysimshied -, -SDL_TRUE - ); - -403 i( -cut_key_num - == 59) { - -404 - `queuekeys -("\x14"); - -405 } i( -KEYSIM_FLAG - & -cut_key --> -keysim -) { - -406 - `ay_keyess -& -ic --> -ay -, -modKeys -[ -MOD_LSHIFT -], -SDL_TRUE - ); - -407 - `ay_keyess -& -ic --> -ay -, -KEYSIM_MASK - & -cut_key --> -keysim -, -SDL_TRUE - ); - -408 -modKeyFakePsd -[ -MOD_LSHIFT -] = -SDL_TRUE -; - -410 - `ay_keyess -& -ic --> -ay -, -KEYSIM_MASK - & -cut_key --> -keysim -, -SDL_TRUE - ); - -414  -MACH_ORIC1 -: - -415  -MACH_ORIC1_16K -: - -416  -MACH_ATMOS -: - -418 - `ay_keyess -& -ic --> -ay -, -cut_key --> -keysim -, -SDL_TRUE - ); - -423 -a_keys - = -SDL_TRUE -; - -429  -SDL_MOUSEBUTTONUP -: - -430 i(( -cut_key - = -NULL -|| ( -defg_key_m -)) - -434  -ic --> -ty - ) - -436  -MACH_PRAVETZ -: - -437 i( -lshied - || -rshied -) { - -438 - `ay_keyess -& -ic --> -ay -, -KEYSIM_MASK - & -cut_key --> -keysimshied -, -SDL_FALSE - ); - -440 - `ay_keyess -& -ic --> -ay -, -KEYSIM_MASK - & -cut_key --> -keysim -, -SDL_FALSE - ); - -443  -MACH_ORIC1 -: - -444  -MACH_ORIC1_16K -: - -445  -MACH_ATMOS -: - -447 - `ay_keyess -& -ic --> -ay -, -cut_key --> -keysim -, -SDL_FALSE - ); - -451 -cut_key - = -NULL -; - -454  -SDL_KEYUP -: - -455 i( -defg_key_m -) { - -456 -SDL_KeybrdEvt - * -kbd_evt - = (SDL_KeybrdEv* -ev -; - -457 - `add_to_keybrd_mpg -&( -ic --> -keybrd_mpg -), -kbd_evt --> -keysym -. -sym -, -cut_key --> -keysim - ); - -458 - `do_pup - -ic -, "Key mapping done."); - -459 -defg_key_m - = -SDL_FALSE -; - -460 -cut_key - = -NULL -; - -465  -de -; - -466 - } -} - -468  - $a_icky_keys -() - -470 -a_keys - = -SDL_TRUE -; - -471 - } -} - -473  - $add_to_keybrd_mpg - -keybrd_mpg - * -m -, -SDL_COMPAT_KEY - -ho_key -, SDL_COMPAT_KEY -ic_key - ) - -476  -dex - = 0; - -477  -dex - < -m --> -nb_m -) { - -478 i( -m --> -ho_keys -[ -dex -] = -ho_key -) { - -480 -m --> -ic_keys -[ -dex -] = -ic_key -; - -484 -dex -++; - -488 -m --> -ho_keys -[m-> -nb_m -] = -ho_key -; - -489 -m --> -ic_keys -[m-> -nb_m -] = -ic_key -; - -490 -m --> -nb_m -++; - -491 - } -} - -493  - $t_keybrd_mpg - -keybrd_mpg - * -m - ) - -495 -m --> -nb_m - = 0; - -496 - } -} - -498 -SDL_bo - - $ve_keybrd_mpg - -mache - * -ic -, * -fame - ) - -500 -SDL_bo - -ok - = -SDL_TRUE -; - -501 -FILE - * -f - = -NULL -; - -503 -f - = - `fݒ -( -fame -, "wt"); - -504 i(! -f -) - -506 - `msgbox -( -ic -, -MSGBOX_OK -, "Unableo create keyboard mapping file (1)"); - -507  -SDL_FALSE -; - -510 i( - `uts -("# SDL_key_symb_f_ho : SDL_key_symb_f_ic\n", -f -) < 0) - -512 - `msgbox -( -ic -, -MSGBOX_OK -, "Unableo writeo keyboard mapping file (2)"); - -513 -ok - = -SDL_FALSE -; - -515 i( -ok - = -SDL_TRUE - && - `uts -("# s hp://www.libsdl.g/a/SDL-1.2.15/docs/html/sdlkey.htm\n", -f -) < 0) - -517 - `msgbox -( -ic -, -MSGBOX_OK -, "Unableo writeo keyboard mapping file (2)"); - -518 -ok - = -SDL_FALSE -; - -522 i( -ok - = -SDL_TRUE - && -ic --> -keybrd_mpg -. -nb_m - != 0) { - -523  -i -; - -525  -i -=0; i < -ic --> -keybrd_mpg -. -nb_m - && -ok - = -SDL_TRUE -; i++) { - -527 i( - `rtf -( -f -, "%d : %d\n", -ic --> -keybrd_mpg -. -ho_keys -[ -i -], oric->keybrd_mpg. -ic_keys -[i]) < 0) - -529 - `msgbox -( -ic -, -MSGBOX_OK -, "Unableo writeo keyboard mapping file (3)"); - -530 -ok - = -SDL_FALSE -; - -535 if( - `fo -( -f -= -EOF -) { - -536 - `msgbox -( -ic -, -MSGBOX_OK -, "Unableo close keyboard mapping file (4)"); - -537 -ok - = -SDL_FALSE -; - -540  -ok -; - -541 - } -} - -543 -SDL_bo - - $ld_keybrd_mpg - -mache - * -ic -, * -fame - ) - -545 -SDL_bo - -ok - = -SDL_TRUE -; - -546 -FILE - * -f - = -NULL -; - -547  -buf -[4096]; - -548  -ho_key -, -ic_key -; - -550 -f - = - `fݒ -( -fame -, "rt"); - -551 i(! -f -) - -553 - `msgbox -( -ic -, -MSGBOX_OK -, "Unableoead keyboard mapping file (1)"); - -554  -SDL_FALSE -; - -558 - `t_keybrd_mpg -(&( -ic --> -keybrd_mpg -)); - -561 ! - `of -( -f -&& ! - ` -(f)) { - -563 i( - `fgs -( -buf -, 4096, -f -)>0) { - -565 i( -buf -[0] != '#') { - -567 i( - `ssnf -( -buf -, "%d : %d", & -ho_key -, & -ic_key -)==2) { - -569 - `add_to_keybrd_mpg -&( -ic --> -keybrd_mpg -), -ho_key -, -ic_key -); - -575 if( - ` -( -f -)) { - -576 - `msgbox -( -ic -, -MSGBOX_OK -, "Problem whileeading from keyboard mapping file (2)"); - -577 -ok - = -SDL_FALSE -; - -580 i( -ok - = -SDL_TRUE - && - `rtf -( -buf -, "Rd %d key mpgs", -ic --> -keybrd_mpg -. -nb_m -) > 0) - -581 - `do_pup -( -ic -, -buf -); - -583 if( - `fo -( -f -= -EOF -) { - -584 - `msgbox -( -ic -, -MSGBOX_OK -, "Unableo close keyboard mapping file (3)"); - -585 -ok - = -SDL_FALSE -; - -588  -ok -; - -589 - } -} - - @keyboard.h - -21 #ide -KEYBOARD_H - - -22  - #KEYBOARD_H - - - ) - -24  - skbdkey - - -26  - mx -, - my -, - mw -, - mh -; - -27  - mhighlight -; - -28  - mhighlightde -; - -29 -SDL_COMPAT_KEY - - mkeysim -; - -30 -SDL_COMPAT_KEY - - mkeysimshied -; - -31  - mis_mod_key -; - -34  - skeybrd_mpg - - -36 -SDL_COMPAT_KEY - - mho_keys -[65]; - -37 -SDL_COMPAT_KEY - - mic_keys -[65]; - -38 -SDL_COMPAT_KEY - - mnb_m -; - -42  -kbd_ - -mache - * -ic - ); - -44 -SDL_bo - -keybrd_evt - -SDL_Evt - * -ev -,  -mache - * -ic -, SDL_bo * -ednd - ); - -46  -a_icky_keys -(); - -48  -add_to_keybrd_mpg - -keybrd_mpg - * -m -, -SDL_COMPAT_KEY - -ho_key -, SDL_COMPAT_KEY -ic_key - ); - -50  -t_keybrd_mpg - -keybrd_mpg - * -m - ); - -52 -SDL_bo - -ve_keybrd_mpg - -mache - * -ic -, * -fame - ); - -54 -SDL_bo - -ld_keybrd_mpg - -mache - * -ic -, * -fame - ); - - @machine.c - -22  - ~ - -23  - ~ - -24  - ~ - -25  - ~ - -27 #i -defed -( -__amigaos4__ -|| defed( -__MORPHOS__ -) - -28  - ~ - -29  - ~ - -30  - ~ - -33  - ~"syem.h -" - -34  - ~"6502.h -" - -35  - ~"v.h -" - -36  - ~"8912.h -" - -37  - ~"gui.h -" - -38  - ~"disk.h -" - -39  - ~"mڙ.h -" - -40  - ~"6551.h -" - -46  - ~"ugs/ch376/ch376.h -" - -47  - ~"ugs/ch376/ic_ch376_ug.h -" - -49  - ~"mache.h -" - -50  - ~"avi.h -" - -51  - ~"feq.h -" - -52  - ~"ma.h -" - -53  - ~"u.h -" - -54  - ~"joyick.h -" - -55  - ~".h -" - -56  - ~"keybrd.h -" - -58 -SDL_bo - -wpd -, -soundavaab -, -sound -; - -59  -diskth -[], -diskfe -[], -fmp -[]; - -60  -diskth -[], -diskfe -[]; - -61  -avdiskth -[], -avdiskfe -[]; - -62 -SDL_bo - -eshus -, -eshavi -; - -63  -g_mu_scheme -; - -65  - gmoomfe -[1024]; - -66  - gic1romfe -[1024]; - -67  - gmdisomfe -[1024]; - -68  - gjasmomfe -[1024]; - -69  - gavzromfe -[2][1024]; - -70  - gbkfes -[8][1024]; - -72  -avi_hd - * - gvidp - = -NULL -; - -73  - gvidame -[128]; - -74  - gvidpcou - = 0; - -76  - gsname -[128]; - -77  - gsnpcou - = 0; - -79  - grom_miodisc -[8912], - grom_jasm -[2048], - grom_avz -[512]; - -80  -symbޏb - - gsym_miodisc -, - gsym_jasm -, - gsym_avz -; - -81 -SDL_bo - - gmiodisom_vid -, - gjasmrom_vid -, - gavzrom_vid -; - -82  -osdmuem - -maems -[]; - -84 -Ut8 - - gi -[] = { 0x00, 0x00, 0x00, - -93  -Ut8 - - gdic_de -[] = - -100  -Ut8 - - gtd_de -[] = - -107  -Ut8 - - gdos_de -[] = - -114  - $de_image_ty -(* -fame -) - -116 -FILE - * -f -; - -117 -size_t - -size -; - -118  -tmp -[6400]; - -120 -f - = - `fݒ -( -fame -, "rb"); - -121 i(! -f -) - -122  -IMG_I_DUNNO -; - -124 - `fek -( -f -, 0, -SEEK_END -); - -125 -size - = - `l -( -f -); - -126 - `fek -( -f -, 0, -SEEK_SET -); - -128 i(1 ! - `d -( -tmp -, 8, 1, -f -)) - -130 - `fo -( -f -); - -131  -IMG_I_DUNNO -; - -135 i(( - `memcmp -( -tmp -, "\x16\x16\x16\x16", 4) == 0) || - -136 ( - `memcmp -( -tmp -, "\x16\x16\x16\x24", 4) == 0) || - -137 ( - `memcmp -( -tmp -, "\x16\x16\x24", 3) == 0) || - -138 ( - `memcmp -( -tmp -, "RIFF", 4) == 0) || - -139 ( - `memcmp -( -tmp -, "ORT\x00", 4) == 0)) - -141 - `fo -( -f -); - -142  -IMG_TAPE -; - -146 i( - `memcmp -( -tmp -, "OSN\x00", 4)==0) - -148 - `fo -( -f -); - -149  -IMG_SNAPSHOT -; - -153 i(( -size - > 20&& ( - `memcmp -( -tmp -, "MFM_DISK", 8)==0)) - -155 -Ut8 - * -r -, * -e -; - -156  -n -; - -157 -SDL_bo - -g٣ - = -SDL_FALSE -; - -160 - `fek -( -f -, 256, -SEEK_SET -); - -161 - `d -( -tmp -, 6400, 1, -f -); - -162 - `fo -( -f -); - -165 -r - = -tmp -; - -166 -e - = & -tmp -[6400]; - -170  ( -r -< -e -) && (ptr[0]!=0xfe) )tr++; - -173 i( -r - > -e -) - -175 - `tf -("%s: couldn'fdck 0 se 1 i%s\n", -__func__ -, -fame -); - -176  -IMG_I_DUNNO -; - -180 -n - = (1<<( -r -[4]+7)); - -181 -g٣ - = ( -r -[3] == 1); - -184 -r -+=7; - -187  ( -r -< -e -) && (ptr[0]!=0xfb) && (ptr[0]!=0xf8) )tr++; - -188 i( -r - > -e -) - -190 - `tf -("%s: couldn'fdck 0 se 1 i%(2)\n", -__func__ -, -fame -); - -191  -IMG_I_DUNNO -; - -195 i( -g٣ -) - -199 -r - + -n -+3; - -200 i( -r - > -e -) - -202 - `tf -("%s: couldn'fdck 0 se 1 i%(3)\n", -__func__ -, -fame -); - -203  -IMG_I_DUNNO -; - -209 i( -n - == 256) - -211 i( - `memcmp -( -r -, -dic_de -, (sedoric_detect))==0) - -212  -IMG_ATMOS_MICRODISC -; - -214 i( - `memcmp -( -r -, -td_de -, (stratsed_detect))==0) - -215  -IMG_TELESTRAT_DISK -; - -217 i( - `memcmp -( -r -, -dos_de -, (ftdos_detect))==0) - -218  -IMG_ATMOS_JASMIN -; - -222  -IMG_GUESS_MICRODISC -; - -225 - `fo -( -f -); - -228 i( -size - == 143360) - -229  -IMG_PRAVETZ_DISK -; - -231  -IMG_I_DUNNO -; - -232 - } -} - -235  - $mumode - -mache - * -ic -,  -osdmuem - * -mem -,  -mode - ) - -237 -ic --> -emu_mode - = -mode -; - -239  -mode - ) - -241  -EM_RUNNING -: - -242 - `SDL_COMPAT_EbKeyRt -( 0, 0 ); - -243 - `SDL_COMPAT_EbUNICODE - -SDL_FALSE - ); - -244 -ic --> -ay -. -sound - = -soundavaab - && sound && (! -wpd -); - -245 if -ic --> -ay -. -sound - ) - -247 - `ay_ushlog -& -ic --> -ay - ); - -248 - `SDL_PauAudio -( 0 ); - -250 - `u_t_dty - -ic - ); - -253  -EM_MENU -: - -254 if -vidp - ) - `avi_o -( &vidcap ); - -255 - `gomu - -ic -, -NULL -, 0 ); - -256 - `SDL_COMPAT_EbKeyRt - -SDL_DEFAULT_REPEAT_DELAY -, -SDL_DEFAULT_REPEAT_INTERVAL - ); - -257 - `SDL_COMPAT_EbUNICODE - -SDL_TRUE - ); - -258 -ic --> -ay -. -sound - = -SDL_FALSE -; - -259 if -soundavaab - ) - -260 - `SDL_PauAudio -( 1 ); - -263  -EM_DEBUG -: - -264 if -vidp - ) - `avi_o -( &vidcap ); - -265 - `m_r - -ic - ); - -266 - `SDL_COMPAT_EbKeyRt - -SDL_DEFAULT_REPEAT_DELAY -, -SDL_DEFAULT_REPEAT_INTERVAL - ); - -267 - `SDL_COMPAT_EbUNICODE - -SDL_TRUE - ); - -268 -ic --> -ay -. -sound - = -SDL_FALSE -; - -269 if -soundavaab - ) - -270 - `SDL_PauAudio -( 1 ); - -273 - } -} - -275  - $om - -mache - * -ic - ) - -278 -ic --> -rom - = -SDL_TRUE -; - -279 if -ic --> -drivy - = -DRV_JASMIN - ) - -281 if -ic --> -jasm -. -ay - == 0 ) - -283 -ic --> -rom - = !ic-> -romdis -; - -285 -ic --> -rom - = -SDL_FALSE -; - -288 if -ic --> -drivy - = -DRV_PRAVETZ - ) - -290 -ic --> -rom - = !ic-> -avz -. -ay -; - -292 -ic --> -rom - = !ic-> -romdis -; - -294 - } -} - -297  - $moswre - -m6502 - * -u -,  -addr -,  -da - ) - -299  -mache - * -ic - = (mach*) -u --> -urda -; - -300 if! -ic --> -romdis - ) && ( -addr - >= 0xc000 ) ) ; - -301 if -addr - & 0xff00 ) == 0x0300 ) - -303 if -ic --> -acbackd - && ( oric-> -acofft - < -addr - &&ddr < oric->aciaoffset+4 ) ) - -304 - `ac_wre -& -ic --> -_ac -, -addr -, -da - ); - -306 if -ic --> -ch376_aived - && ( 0x340 < -addr - ) && (ddr < 0x342 ) ) - -307 - `ch376_ic_wre -( -ic --> -ch376 -, -addr -, -da -); - -310 - `v_wre -& -ic --> -v -, -addr -, -da - ); - -314 -ic --> -mem -[ -addr -] = -da -; - -315 - } -} - -318  - $o16kwre - -m6502 - * -u -,  -addr -,  -da - ) - -320  -mache - * -ic - = (mach*) -u --> -urda -; - -321 if! -ic --> -romdis - ) && ( -addr - >= 0xc000 ) ) ; - -322 if -addr - & 0xff00 ) == 0x0300 ) - -324 if -ic --> -acbackd - && ( oric-> -acofft - < -addr - &&ddr < oric->aciaoffset+4 ) ) - -325 - `ac_wre -& -ic --> -_ac -, -addr -, -da - ); - -327 if -ic --> -ch376_aived - && ( 0x340 < -addr - ) && (ddr < 0x342 ) ) - -328 - `ch376_ic_wre -( -ic --> -ch376 -, -addr -, -da -); - -331 - `v_wre -& -ic --> -v -, -addr -, -da - ); - -336 -ic --> -mem -[ -addr -&0x3fff] = -da -; - -337 - } -} - -340  - $ˡtwre - -m6502 - * -u -,  -addr -,  -da - ) - -342  -mache - * -ic - = (mach*) -u --> -urda -; - -344 if -addr - >= 0xc000 ) - -350  -ic --> -_bkty - ) - -352  -TELEBANK_HALFNHALF -: - -353 if -addr - >= 0xe000 ) ; - -354  -TELEBANK_RAM -: - -355 -ic --> -rom -[ -addr --0xc000] = -da -; - -362 if -addr - & 0xff00 ) == 0x0300 ) - -364  -addr - & 0x0f0 ) - -368 - `v_wre -& -ic --> -_v -, -addr -, -da - ); - -372 if -addr - >= 0x31c ) - -373 - `ac_wre -& -ic --> -_ac -, -addr -, -da - ); - -375 - `miodisc_wre -& -ic --> -md -, -addr -, -da - ); - -379 i( -ic --> -ch376_aived -) - -381 i( -addr - == 0x340 ||ddr == 0x341) - -382 - `ch376_ic_wre -( -ic --> -ch376 -, -addr -, -da -); - -387 - `v_wre -& -ic --> -v -, -addr -, -da - ); - -393 -ic --> -mem -[ -addr -] = -da -; - -394 - } -} - -397  - $jasm_moswre - -m6502 - * -u -,  -addr -,  -da - ) - -399  -mache - * -ic - = (mach*) -u --> -urda -; - -401 if -ic --> -jasm -. -ay - == 0 ) - -403 if -ic --> -romdis - ) - -405 if -addr - >= 0xf800 ) ; - -407 if -addr - >= 0xc000 ) ; - -411 if -addr - & 0xff00 ) == 0x0300 ) - -413 if -addr - >= 0x3f4 ) && (ddr < 0x400 ) ) - -414 - `jasm_wre -& -ic --> -jasm -, -addr -, -da - ); - -416 if -ic --> -acbackd - && ( oric-> -acofft - < -addr - &&ddr < oric->aciaoffset+4 ) ) - -417 - `ac_wre -& -ic --> -_ac -, -addr -, -da - ); - -419 if -ic --> -ch376_aived - && ( 0x340 < -addr - ) && (ddr < 0x342 ) ) - -420 - `ch376_ic_wre -( -ic --> -ch376 -, -addr -, -da -); - -423 - `v_wre -& -ic --> -v -, -addr -, -da - ); - -427 -ic --> -mem -[ -addr -] = -da -; - -428 - } -} - -431  - $jasm_o16kwre - -m6502 - * -u -,  -addr -,  -da - ) - -433  -mache - * -ic - = (mach*) -u --> -urda -; - -435 if -ic --> -jasm -. -ay - == 0 ) - -437 if -ic --> -romdis - ) - -439 if -addr - >= 0xf800 ) ; - -441 if -addr - >= 0xc000 ) ; - -445 if -addr - & 0xff00 ) == 0x0300 ) - -447 if -addr - >= 0x3f4 ) && (ddr < 0x400 ) ) - -448 - `jasm_wre -& -ic --> -jasm -, -addr -, -da - ); - -450 if -ic --> -acbackd - && ( oric-> -acofft - < -addr - &&ddr < oric->aciaoffset+4 ) ) - -451 - `ac_wre -& -ic --> -_ac -, -addr -, -da - ); - -453 if -ic --> -ch376_aived - && ( 0x340 < -addr - ) && (ddr < 0x342 ) ) - -454 - `ch376_ic_wre -( -ic --> -ch376 -, -addr -, -da -); - -457 - `v_wre -& -ic --> -v -, -addr -, -da - ); - -462 -ic --> -mem -[ -addr -&0x3fff] = -da -; - -463 - } -} - -466  - $miodisc_moswre - -m6502 - * -u -,  -addr -,  -da - ) - -468  -mache - * -ic - = (mach*) -u --> -urda -; - -469 if -ic --> -romdis - ) - -471 if -ic --> -md -. -diskrom - ) && ( -addr - >= 0xe000 ) ) ; - -473 if -addr - >= 0xc000 ) ; - -476 if -addr - & 0xff00 ) == 0x0300 ) - -478 if -addr - >= 0x310 ) && (ddr < 0x31c ) ) - -479 - `miodisc_wre -& -ic --> -md -, -addr -, -da - ); - -481 if -ic --> -acbackd - && ( oric-> -acofft - < -addr - &&ddr < oric->aciaoffset+4 ) ) - -482 - `ac_wre -& -ic --> -_ac -, -addr -, -da - ); - -484 if -ic --> -ch376_aived - && ( 0x340 < -addr - ) && (ddr < 0x342 ) ) - -485 - `ch376_ic_wre -( -ic --> -ch376 -, -addr -, -da -); - -488 - `v_wre -& -ic --> -v -, -addr -, -da - ); - -492 -ic --> -mem -[ -addr -] = -da -; - -493 - } -} - -496  - $miodisc_o16kwre - -m6502 - * -u -,  -addr -,  -da - ) - -498  -mache - * -ic - = (mach*) -u --> -urda -; - -499 if -ic --> -romdis - ) - -501 if -ic --> -md -. -diskrom - ) && ( -addr - >= 0xe000 ) ) ; - -503 if -addr - >= 0xc000 ) ; - -506 if -addr - & 0xff00 ) == 0x0300 ) - -508 if -addr - >= 0x310 ) && (ddr < 0x31c ) ) - -509 - `miodisc_wre -& -ic --> -md -, -addr -, -da - ); - -511 if -ic --> -acbackd - && ( oric-> -acofft - < -addr - &&ddr < oric->aciaoffset+4 ) ) - -512 - `ac_wre -& -ic --> -_ac -, -addr -, -da - ); - -514 if -ic --> -ch376_aived - && ( 0x340 < -addr - ) && (ddr < 0x342 ) ) - -515 - `ch376_ic_wre -( -ic --> -ch376 -, -addr -, -da -); - -518 - `v_wre -& -ic --> -v -, -addr -, -da - ); - -522 -ic --> -mem -[ -addr -&0x3fff] = -da -; - -523 - } -} - -526  - $avz_moswre - -m6502 - * -u -,  -addr -,  -da - ) - -528  -mache - * -ic - = (mach*) -u --> -urda -; - -530 -ic --> -mem -[ -addr -] = -da -; - -532 if0x300 < -addr - &&ddr <= 0x30f ) - -534 - `v_wre -& -ic --> -v -, -addr -, -da - ); - -536 if0x310 < -addr - &&ddr <= 0x31f ) - -538 if -ic --> -acbackd - && oric-> -avz -. -exnsi - == 0x100 ) - -539 - `ac_wre -& -ic --> -_ac -, -addr -, -da - ); - -541 - `avz_wre -& -ic --> -avz -, -addr -, -da - ); - -543 if0x320 < -addr - &&ddr <= 0x3ff ) - -545  -addr - ) - -548 -ic --> -avz -. -ay - = 0; - -549 -ic --> -avz -. -romdis - = 1; - -550 -ic --> -avz -. -exnsi - = 0; - -551 -ic --> -romdis - = !ic-> -avz -.romdis; - -552 -ic --> -rom - = !ic-> -romdis -; - -555 -ic --> -avz -. -ay - = 1; - -556 -ic --> -avz -. -romdis - = 0; - -557 -ic --> -avz -. -exnsi - = 0; - -558 -ic --> -romdis - = !ic-> -avz -.romdis; - -559 -ic --> -rom - = !ic-> -romdis -; - -562 -ic --> -avz -. -ay - = 0; - -563 -ic --> -avz -. -romdis - = 1; - -564 -ic --> -avz -. -exnsi - = 0x100; - -565 -ic --> -romdis - = !ic-> -avz -.romdis; - -566 -ic --> -rom - = !ic-> -romdis -; - -569 -ic --> -avz -. -ay - = 1; - -570 -ic --> -avz -. -romdis - = 0; - -571 -ic --> -avz -. -exnsi - = 0x100; - -572 -ic --> -romdis - = !ic-> -avz -.romdis; - -573 -ic --> -rom - = !ic-> -romdis -; - -579 - } -} - -582 -SDL_bo - - $iam - -mache - * -ic -,  -addr - ) - -584 if -addr - < 0xc000 )  -SDL_TRUE -; - -586 if -ic --> -ty - = -MACH_TELESTRAT - ) - -588  -ic --> -_bkty - = -TELEBANK_RAM -; - -591 if! -ic --> -romdis - )  -SDL_FALSE -; - -593  -ic --> -drivy - ) - -595  -DRV_MICRODISC -: - -596 if! -ic --> -md -. -diskrom - )  -SDL_TRUE -; - -597 if -addr - >0xe000 )  -SDL_FALSE -; - -600  -DRV_JASMIN -: - -601 if -ic --> -jasm -. -ay - )  -SDL_TRUE -; - -602 if -addr - >0xf800 )  -SDL_FALSE -; - -605  -DRV_PRAVETZ -: - -606 if -ic --> -avz -. -ay - )  -SDL_TRUE -; - -607 if -addr - >0xc000 )  -SDL_FALSE -; - -611  -SDL_TRUE -; - -612 - } -} - -615  - $mod - -m6502 - * -u -,  -addr - ) - -617  -mache - * -ic - = (mach*) -u --> -urda -; - -619 if -addr - & 0xff00 ) == 0x0300 ) - -621 if -ic --> -acbackd - && ( oric-> -acofft - < -addr - &&ddr < oric->aciaoffset+4 ) ) - -622  - `ac_ad -& -ic --> -_ac -, -addr - ); - -624 if -ic --> -ch376_aived - && ( 0x340 < -addr - ) && (ddr < 0x342 ) ) - -625  - `ch376_ic_ad -( -ic --> -ch376 -, -addr -); - -627  - `v_ad -& -ic --> -v -, -addr - ); - -630 if! -ic --> -romdis - ) && ( -addr - >= 0xc000 ) ) - -631  -ic --> -rom -[ -addr --0xc000]; - -633  -ic --> -mem -[ -addr -]; - -634 - } -} - -637  - $o16kad - -m6502 - * -u -,  -addr - ) - -639  -mache - * -ic - = (mach*) -u --> -urda -; - -641 if -addr - & 0xff00 ) == 0x0300 ) - -643 if -ic --> -acbackd - && ( oric-> -acofft - < -addr - &&ddr < oric->aciaoffset+4 ) ) - -644  - `ac_ad -& -ic --> -_ac -, -addr - ); - -646 if -ic --> -ch376_aived - && ( 0x340 < -addr - ) && (ddr < 0x342 ) ) - -647  - `ch376_ic_ad -( -ic --> -ch376 -, -addr -); - -649  - `v_ad -& -ic --> -v -, -addr - ); - -652 if! -ic --> -romdis - ) && ( -addr - >= 0xc000 ) ) - -653  -ic --> -rom -[ -addr --0xc000]; - -655  -ic --> -mem -[ -addr -&0x3fff]; - -656 - } -} - -659  - $ˡd - -m6502 - * -u -,  -addr - ) - -661  -mache - * -ic - = (mach*) -u --> -urda -; - -663 if -addr - & 0xff00 ) == 0x0300 ) - -665  -addr - & 0x0f0 ) - -669 if -addr - >= 0x31c ) - -671  - `ac_ad -& -ic --> -_ac -, -addr - ); - -674  - `miodisc_ad -& -ic --> -md -, -addr - ); - -677  - `v_ad -& -ic --> -_v -, -addr - ); - -680 i( -ic --> -ch376_aived -) - -682 i( -addr - == 0x340 ||ddr == 0x341) - -683  - `ch376_ic_ad -( -ic --> -ch376 -, -addr -); - -687  - `v_ad -& -ic --> -v -, -addr - ); - -690 if -addr - >= 0xc000 ) - -697  -ic --> -rom -[ -addr --0xc000]; - -701  -ic --> -mem -[ -addr -]; - -702 - } -} - -705  - $jasm_mod - -m6502 - * -u -,  -addr - ) - -707  -mache - * -ic - = (mach*) -u --> -urda -; - -709 if -ic --> -jasm -. -ay - == 0 ) - -711 if -ic --> -romdis - ) - -713 if -addr - >0xf800 )  -rom_jasm -[addr-0xf800]; - -715 if -addr - >0xc000 )  -ic --> -rom -[addr-0xc000]; - -719 if -addr - & 0xff00 ) == 0x0300 ) - -721 if -addr - >= 0x3f4 ) && (ddr < 0x400 ) ) - -722  - `jasm_ad -& -ic --> -jasm -, -addr - ); - -724 if -ic --> -acbackd - && ( oric-> -acofft - < -addr - &&ddr < oric->aciaoffset+4 ) ) - -725  - `ac_ad -& -ic --> -_ac -, -addr - ); - -727 if -ic --> -ch376_aived - && ( 0x340 < -addr - ) && (ddr < 0x342 ) ) - -728  - `ch376_ic_ad -( -ic --> -ch376 -, -addr -); - -730  - `v_ad -& -ic --> -v -, -addr - ); - -733  -ic --> -mem -[ -addr -]; - -734 - } -} - -737  - $jasm_o16kad - -m6502 - * -u -,  -addr - ) - -739  -mache - * -ic - = (mach*) -u --> -urda -; - -741 if -ic --> -jasm -. -ay - == 0 ) - -743 if -ic --> -romdis - ) - -745 if -addr - >0xf800 )  -rom_jasm -[addr-0xf800]; - -747 if -addr - >0xc000 )  -ic --> -rom -[addr-0xc000]; - -751 if -addr - & 0xff00 ) == 0x0300 ) - -753 if -addr - >= 0x3f4 ) && (ddr < 0x400 ) ) - -754  - `jasm_ad -& -ic --> -jasm -, -addr - ); - -756 if -ic --> -acbackd - && ( oric-> -acofft - < -addr - &&ddr < oric->aciaoffset+4 ) ) - -757  - `ac_ad -& -ic --> -_ac -, -addr - ); - -759 if -ic --> -ch376_aived - && ( 0x340 < -addr - ) && (ddr < 0x342 ) ) - -760  - `ch376_ic_ad -( -ic --> -ch376 -, -addr -); - -762  - `v_ad -& -ic --> -v -, -addr - ); - -765  -ic --> -mem -[ -addr -&0x3fff]; - -766 - } -} - -769  - $miodisc_mod - -m6502 - * -u -,  -addr - ) - -771  -mache - * -ic - = (mach*) -u --> -urda -; - -773 if -ic --> -romdis - ) - -775 if -ic --> -md -. -diskrom - ) && ( -addr - >= 0xe000 ) ) - -776  -rom_miodisc -[ -addr --0xe000]; - -778 if -addr - >= 0xc000 ) - -779  -ic --> -rom -[ -addr --0xc000]; - -782 if -addr - & 0xff00 ) == 0x0300 ) - -784 if -addr - >= 0x310 ) && (ddr < 0x31c ) ) - -785  - `miodisc_ad -& -ic --> -md -, -addr - ); - -787 if -ic --> -acbackd - && ( oric-> -acofft - < -addr - &&ddr < oric->aciaoffset+4 ) ) - -788  - `ac_ad -& -ic --> -_ac -, -addr - ); - -790 if -ic --> -ch376_aived - && ( 0x340 < -addr - ) && (ddr < 0x342 ) ) - -791  - `ch376_ic_ad -( -ic --> -ch376 -, -addr -); - -793  - `v_ad -& -ic --> -v -, -addr - ); - -796  -ic --> -mem -[ -addr -]; - -797 - } -} - -800  - $miodisc_o16kad - -m6502 - * -u -,  -addr - ) - -802  -mache - * -ic - = (mach*) -u --> -urda -; - -804 if -ic --> -romdis - ) - -806 if -ic --> -md -. -diskrom - ) && ( -addr - >= 0xe000 ) ) - -807  -rom_miodisc -[ -addr --0xe000]; - -809 if -addr - >= 0xc000 ) - -810  -ic --> -rom -[ -addr --0xc000]; - -813 if -addr - & 0xff00 ) == 0x0300 ) - -815 if -addr - >= 0x310 ) && (ddr < 0x31c ) ) - -816  - `miodisc_ad -& -ic --> -md -, -addr - ); - -818 if -ic --> -acbackd - && ( oric-> -acofft - < -addr - &&ddr < oric->aciaoffset+4 ) ) - -819  - `ac_ad -& -ic --> -_ac -, -addr - ); - -821 if -ic --> -ch376_aived - && ( 0x340 < -addr - ) && (ddr < 0x342 ) ) - -822  - `ch376_ic_ad -( -ic --> -ch376 -, -addr -); - -824  - `v_ad -& -ic --> -v -, -addr - ); - -827  -ic --> -mem -[ -addr -&0x3fff]; - -828 - } -} - -831  - $avz_mod - -m6502 - * -u -,  -addr - ) - -833  -mache - * -ic - = (mach*) -u --> -urda -; - -835 if0x300 = -addr - & 0xfff0 ) ) - -837  - `v_ad -& -ic --> -v -, -addr - ); - -840 if0x310 = -addr - & 0xfff0 ) ) - -842 if -ic --> -acbackd - && oric-> -avz -. -exnsi - == 0x100 ) - -843  - `ac_ad -& -ic --> -_ac -, -addr - ); - -845  - `avz_ad -& -ic --> -avz -, -addr - ); - -848 if0x320 < -addr - &&ddr <= 0x3ff ) - -850 if -avzrom_vid - ) - -852  -rom_avz -[ -addr - - 0x300 + -ic --> -avz -. -exnsi -]; - -856 if0xc000 < -addr - ) - -858 if! -ic --> -avz -. -ay - ) - -860  -ic --> -rom -[ -addr --0xc000]; - -864  -ic --> -mem -[ -addr -]; - -865 - } -} - -868  - $ligh_ad - -m6502 - * -u -,  -addr - ) - -870  -mache - * -ic - = (mach*) -u --> -urda -; - -872 if -addr - =0x3e0 )  -ic --> -lighx -; - -873 if -addr - =0x3e1 )  -ic --> -lighy -; - -875  -ic --> - `ad_n_ligh - -u -, -addr - ); - -876 - } -} - -879  -SDL_bo - - $ld_rom - -mache - * -ic -, * -ame -,  -size -, * -whe -,  -symbޏb - * -ab -,  -symags - ) - -881 -SDL_RWs - * -f -; - -882 * -tmame -; - -885 -tmame - = - `mloc - - ` - -ame - ) + 10 ); - -886 if! -tmame - )  -SDL_FALSE -; - -888 - `rtf - -tmame -, "%s.rom", -ame - ); - -889 -f - = - `SDL_RWFromFe - -tmame -, "rb" ); - -890 if! -f - ) - -892 - `r_tf -"Ubˁݒ '%s'\n", -tmame - ); - -893 - ` - -tmame - ); - -894  -SDL_FALSE -; - -897 if -size - < 0 ) - -899  -fesize -; - -900 - `SDL_RWek - -f -, 0, -SEEK_END - ); - -901 -fesize - = - `SDL_RW - -f - ); - -902 - `SDL_RWek - -f -, 0, -SEEK_SET - ); - -904 if -fesize - > - -size - ) - -906 - `r_tf -"ROM '%s'xed%d bys.\n", -ame -, - -size - ); - -907 - `SDL_RWo - -f - ); - -908 - ` - -tmame - ); - -909  -SDL_FALSE -; - -912 -whe - +(- -size -)- -fesize -; - -913 -size - = -fesize -; - -916 if - `SDL_RWad - -f -, -whe -, -size -, 1 ) != 1 ) - -918 - `r_tf -"Ubˁػad '%s'\n", -tmame - ); - -919 - `SDL_RWo - -f - ); - -920 - ` - -tmame - ); - -921  -SDL_FALSE -; - -924 - `SDL_RWo - -f - ); - -926 - `rtf - -tmame -, "%s.sym", -ame - ); - -927 - `m_w_symbs - -ab -, -ic -, -tmame -, -symags -, -SDL_FALSE -, SDL_FALSE ); - -928 - ` - -tmame - ); - -930  -SDL_TRUE -; - -931 - } -} - -933  - $e_mache - -mache - * -ic - ) - -935  -i -; - -937 - `m__symb -& -sym_miodisc - ); - -938 - `m__symb -& -sym_jasm - ); - -939 - `m__symb -& -ic --> -romsyms - ); - -940 - `m__symb -& -ic --> -_bksyms -[0] ); - -941 - `m__symb -& -ic --> -_bksyms -[1] ); - -942 - `m__symb -& -ic --> -_bksyms -[2] ); - -943 - `m__symb -& -ic --> -_bksyms -[3] ); - -944 - `m__symb -& -ic --> -_bksyms -[4] ); - -945 - `m__symb -& -ic --> -_bksyms -[5] ); - -946 - `m__symb -& -ic --> -_bksyms -[6] ); - -947 - `m__symb -& -ic --> -_bksyms -[7] ); - -949 -ic --> -mem - = -NULL -; - -950 -ic --> -rom - = -NULL -; - -952 -ic --> -buf - = -NULL -; - -953 -ic --> -n - = 0; - -954 -ic --> -m - = -SDL_FALSE -; - -955 -ic --> -vsynchack - = -SDL_FALSE -; - -956 -ic --> -turbo - = -SDL_TRUE -; - -957 -ic --> -turbo_foff - = -SDL_FALSE -; - -958 -ic --> -autewd - = -SDL_FALSE -; - -959 -ic --> -auto - = -SDL_TRUE -; - -960 -ic --> -symbާutd - = -SDL_TRUE -; - -961 -ic --> -symbs - = -SDL_FALSE -; - -962 -ic --> -me -[0] = 0; - -963 -ic --> -f - = -NULL -; - -964 -ic --> -ock - = 0; - -965 -ic --> -o - = 0; - -966 -ic --> -ϡfe -[0] = 0; - -967 -ic --> -keym - = -KMAP_QWERTY -; - -968 -ic --> -usb_mode - = -STATUSBARMODE_FULL -; - -969 -ic --> -pupr -[0] = 0; - -970 -ic --> -wpupr - = -SDL_FALSE -; - -971 -ic --> -puime - = 0; - -972 -ic --> -usr -[0] = 0; - -973 -ic --> -wusr - = -SDL_FALSE -; - -974 -ic --> -sdljoy_a - = -NULL -; - -975 -ic --> -sdljoy_b - = -NULL -; - -976 -ic --> -mn - = 0; - -977 -ic --> -p - = -NULL -; - -978 -ic --> -noi - = -SDL_FALSE -; - -979 -ic --> -w - = -SDL_FALSE -; - -981 -ic --> -joy_i - = -JOYIFACE_NONE -; - -982 -ic --> -joymode_a - = -JOYMODE_KB1 -; - -983 -ic --> -joymode_b - = -JOYMODE_NONE -; - -984 -ic --> -joymode_a - = -JOYMODE_KB1 -; - -985 -ic --> -joymode_b - = -JOYMODE_NONE -; - -987 -ic --> -p܏_joy - = 0xff; - -988 -ic --> -p܏_ay - = 0; - -989 -ic --> -p܏_is_ay - = -SDL_TRUE -; - -991 -ic --> -kbjoy1 -[0] = -SDLK_KP8 -; - -992 -ic --> -kbjoy1 -[1] = -SDLK_KP2 -; - -993 -ic --> -kbjoy1 -[2] = -SDLK_KP4 -; - -994 -ic --> -kbjoy1 -[3] = -SDLK_KP6 -; - -995 -ic --> -kbjoy1 -[4] = -SDLK_KP_ENTER -; - -996 -ic --> -kbjoy1 -[5] = -SDLK_KP_PLUS -; - -997 -ic --> -kbjoy2 -[0] = 'w'; - -998 -ic --> -kbjoy2 -[1] = 's'; - -999 -ic --> -kbjoy2 -[2] = 'a'; - -1000 -ic --> -kbjoy2 -[3] = 'd'; - -1001 -ic --> -kbjoy2 -[4] = -SDLK_SPACE -; - -1002 -ic --> -kbjoy2 -[5] = 'n'; - -1004 -ic --> -drivy - = -DRV_NONE -; - -1005  -i -=0; i< -MAX_DRIVES -; i++ ) - -1007 -ic --> -wddisk -. -disk -[ -i -] = -NULL -; - -1008 -ic --> -diskme -[ -i -][0] = 0; - -1010 -ic --> -diskautove - = -SDL_FALSE -; - -1011 -ic --> -auto_jasm_t - = -SDL_TRUE -; - -1013 -ic --> -ligh - = -SDL_FALSE -; - -1014 -ic --> -lighx - = 0; - -1015 -ic --> -lighy - = 0; - -1016 -ic --> -ad_n_ligh - = -NULL -; - -1018 -ic --> -b - = -SDL_TRUE -; - -1019 -ic --> -tfr - = -SDL_TRUE -; - -1021 -ic --> -acbackd - = -ACIA_TYPE_NONE -; - -1022 -ic --> -acofft - = 0x31c; - -1024 -ic --> -tvf - = -NULL -; - -1026 -ic --> -keybrd_mpg -. -nb_m - = 0; - -1027 -ic --> -show_keybrd - = -SDL_FALSE -; - -1028 -ic --> -defe_mpg - = -SDL_FALSE -; - -1029 -ic --> -icky_mod_keys - = -SDL_FALSE -; - -1031 -ic --> -avdiskautobo - = -SDL_TRUE -; - -1032 - } -} - -1034  - $ld_diskroms - -mache - * -ic - ) - -1036 -miodisom_vid - = - `ld_rom - -ic -, -mdisomfe -, 8192, -rom_miodisc -, & -sym_miodisc -, -SYMF_ROMDIS1 -| -SYMF_MICRODISC - ); - -1037 -jasmrom_vid - = - `ld_rom - -ic -, -jasmomfe -, 2048, -rom_jasm -, & -sym_jasm -, -SYMF_ROMDIS1 -| -SYMF_JASMIN - ); - -1038 -avzrom_vid - = - `ld_rom - -ic -, -avzromfe -[1], 512, -rom_avz -, & -sym_avz -, -SYMF_PRAVZ8D - ); - -1039 - } -} - -1045  - $mkey - -mache - * -ic -,  -key - ) - -1047  -key - ) - -1049 #i - `defed -( -__amigaos4__ -|| defed( -__MORPHOS__ -|| defed( -__AROS__ -) - -1066 #i - `defed -( -WIN32 -) - -1071 i( -ic --> -keybrd_mpg -. -nb_m - != 0) { - -1072  -i -; - -1073  -i -=0; i < -ic --> -keybrd_mpg -. -nb_m -; i++) { - -1074 i( -key - = -ic --> -keybrd_mpg -. -ho_keys -[ -i -]) - -1075  -ic --> -keybrd_mpg -. -ic_keys -[ -i -]; - -1079  -key -; - -1080 - } -} - -1082  -SDL_bo - - glighdown - = -SDL_FALSE -; - -1083  - $move_ligh - -mache - * -ic -,  -x -,  -y - ) - -1085 i(! -lighdown -) ; - -1087 i(( -ic --> -ndmode - = -RENDERMODE_SW -|| (!ic-> -htch -)) - -1089 -x - = (x-80)/2; - -1090 if( -ic --> -ndmode - = -RENDERMODE_GL - && oric-> -io - && oric-> -vid_eq -) - -1092 -y - = (y-48)/2; - -1096 -y - = (y-14)/2; - -1101 -x - = (()x)/(640.0f/240.0f); - -1102 -y - = (y-14)/2; - -1105 i(( -x ->=0&& (x<240&& ( -y ->=0) && (y<224)) - -1107 i( -ic --> -s -[ -y -*240+ -x -] != 0) - -1109 -ic --> -lighx - = ( -x -+219)&0xff; - -1110 -ic --> -lighy - = ( -y -+54)&0xff; - -1113 - } -} - -1115  -SDL_bo - - gshied - = -SDL_FALSE -; - -1116 -SDL_bo - - $emu_evt - -SDL_Evt - * -ev -,  -mache - * -ic -, -SDL_bo - * -ednd - ) - -1118 -St32 - -i -; - -1120 if - `joy_fr_evt - -ev -, -ic - ) ) - -1121  -SDL_FALSE -; - -1124  -ev --> -ty - ) - -1126  -SDL_MOUSEBUTTONDOWN -: - -1127  -ev --> -bu -.button) - -1129  -SDL_BUTTON_LEFT -: - -1130 -lighdown - = -SDL_TRUE -; - -1131 - `move_ligh - -ic -, -ev --> -bu -. -x -,v->bu. -y - ); - -1134  -SDL_BUTTON_RIGHT -: - -1135 - `mumode - -ic -, -NULL -, -EM_MENU - ); - -1136 * -ednd - = -SDL_TRUE -; - -1141  -SDL_MOUSEBUTTONUP -: - -1142 if -ev --> -bu -.bu = -SDL_BUTTON_LEFT - ) - -1143 -lighdown - = -SDL_FALSE -; - -1146  -SDL_MOUSEMOTION -: - -1147 - `move_ligh - -ic -, -ev --> -mi -. -x -,v->mi. -y - ); - -1150  -SDL_KEYUP -: - -1151  -ev --> -key -. -keysym -. -sym - ) - -1153  -SDLK_F1 -: - -1154 - `mumode - -ic -, -NULL -, -EM_MENU - ); - -1155 * -ednd - = -SDL_TRUE -; - -1158  -SDLK_F2 -: - -1159 - `mumode - -ic -, -NULL -, -EM_DEBUG - ); - -1160 * -ednd - = -SDL_TRUE -; - -1163  -SDLK_F3 -: - -1164 - `soợtic -( -ic -, -NULL -, 0); - -1167  -SDLK_F4 -: - -1168 if -shied - ) && ( -ic --> -drivy - = -DRV_JASMIN - ) ) - -1169 -ic --> -u -. - `wre -( &oric->cpu, 0x3fb, 1 ); - -1170 if -ic --> -drivy - = -DRV_MICRODISC - ) - -1172 -ic --> -romdis - = -SDL_TRUE -; - -1173 - `miodisc_ -& -ic --> -md -, &ic-> -wddisk -, oric ); - -1175 if -ic --> -drivy - = -DRV_PRAVETZ - ) - -1177 -ic --> -avz -. -ay - = 0; - -1178 -ic --> -avz -. -romdis - = 1; - -1179 -ic --> -avz -. -exnsi - = 0; - -1180 -ic --> -romdis - = !ic-> -avz -.romdis; - -1182 - `om - -ic - ); - -1183 - `m6502_t -& -ic --> -u - ); - -1184 - `v_ -& -ic --> -v -, oric, -VIA_MAIN - ); - -1185 - `v_ -& -ic --> -_v -, oric, -VIA_TELESTRAT - ); - -1186 - `ac_ -& -ic --> -_ac -, oric ); - -1188 i( -ic --> -ch376_aived -) - -1190 -ic --> -ch376 - = - `ch376_ic_ -(); - -1191 i( -ic --> -ch376 - ! -NULL -) - -1192 - `ch376_ic_cfig -( -ic --> -ch376 -); - -1197  -SDLK_F5 -: - -1198 -ic --> -usb_mode - = (ic->usb_mode+1% -STATUSBARMODE_LAST -; - -1199 -eshus - = -SDL_TRUE -; - -1200 -ic --> -usr -[0] = 0; - -1201 -ic --> -wusr - = -SDL_TRUE -; - -1204  -SDLK_F6 -: - -1205 if -vidp - ) - -1207 -wpd - = -SDL_FALSE -; - -1211 -wpd - = wpd ? -SDL_FALSE - : -SDL_TRUE -; - -1214 if -soundavaab - && -sound - ) - -1216 - `ay_ushlog -& -ic --> -ay - ); - -1217 -ic --> -ay -. -sound - = ! -wpd -; - -1218 - `SDL_PauAudio - -wpd - ); - -1222  -SDLK_F7 -: - -1223 if -ic --> -drivy - = -DRV_NONE - ) ; - -1225  -i -=0; i<4; i++ ) - -1227 if -ic --> -wddisk -. -disk -[ -i -] ) && ( oric->wddisk.disk[i]-> -modifd - ) ) - -1229 if -shied - ) - -1231  -me -[64]; - -1232 * -dth -, * -dfe -; - -1234 if -ic --> -ty - ! -MACH_TELESTRAT - ) - -1236  -ic --> -drivy -) - -1238  -DRV_PRAVETZ -: - -1239 -dth - = -avdiskth -; - -1240 -dfe - = -avdiskfe -; - -1244 -dth - = -diskth -; - -1245 -dfe - = -diskfe -; - -1249 -dth - = -diskth -; - -1250 -dfe - = -diskfe -; - -1253 - `rtf - -me -, "Savdisk %d", -i - ); - -1254 if - `feque - -ic -, -me -, -dth -, -dfe -, -FR_DISKSAVE - ) ) - -1256 - `joth - -dth -, -dfe - ); - -1257 - `diskimage_ve - -ic -, -fmp -, -i - ); - -1260 - `diskimage_ve - -ic -, oric-> -wddisk -. -disk -[ -i -]-> -fame -, i ); - -1266  -SDLK_F8 -: - -1267 - `toggfusn - -ic -, -NULL -, 0 ); - -1270  -SDLK_F9 -: - -1271 - `toggˏp - -ic -, - `fd_em_by_funi -( -maems -, -toggˏp -), 0 ); - -1274  -SDLK_F10 -: - -1275 if -vidp - ) - -1277 - `ay_lockaudio -& -ic --> -ay - ); - -1278 - `avi_o -& -vidp - ); - -1279 - `ay_uockaudio -& -ic --> -ay - ); - -1280 - `do_pup - -ic -, "AVI capture stopped" ); - -1281 -eshavi - = -SDL_TRUE -; - -1285 - `rtf - -vidame -, "Cturgvideo%02d.avi", -vidpcou - ); - -1286 -wpd - = -SDL_FALSE -; - -1287 - `ay_lockaudio -& -ic --> -ay - ); - -1288 -vidp - = - `avi_ݒ -& -vidame -[13], -i -, -soundavaab -&& -sound -, -ic --> -vid_eq - ); - -1289 - `ay_uockaudio -& -ic --> -ay - ); - -1290 if -vidp - ) - -1292 -vidpcou -++; - -1293 - `do_pup - -ic -, -vidame - ); - -1295 -eshavi - = -SDL_TRUE -; - -1297 #ifde -__CBCOPY__ - - -1298  -SDLK_F11 -: - -1299 - `brd_cy - -ic - ); - -1302 #ifde -__CBPASTE__ - - -1303  -SDLK_F12 -: - -1304 - `brd_e - -ic - ); - -1308 #ifde -__amigaos4__ - - -1309  -SDLK_HELP -: - -1310 -IDOS --> - `SyemTags -( "Multiview Oricutron.guide", - -1311 -SYS_Iut -, -IDOS --> - `On -"NIL:", -MODE_NEWFILE - ), - -1312 -SYS_Ouut -, -IDOS --> - `On -"NIL:", -MODE_NEWFILE - ), - -1313 -SYS_Asynch -, -TRUE -, - -1314 -TAG_DONE - ); - -1318 #ifde -__MORPHOS__ - - -1319  -SDLK_HELP -: - -1321  -NewAmigaGuide - -g - = - -1322 { ( -BPTR - -NULL -, - -1324 -NULL -, - -1325 -NULL -, - -1326 -NULL -, - -1327 -NULL -, - -1328 -NULL -, - -1330 -NULL -, - -1333 -NULL -, - -1334 -NULL - - -1337 - `OnAmigaGuide -(& -g -, -TAG_DONE -); - -1342  -SDLK_PRINT -: - -1343 - `rtf - -sname -, "Cturgsnsh%02d.bmp", -snpcou - ); - -1344 -snpcou -++; - -1345 - `do_pup - -ic -, -sname - ); - -1346 - `SDL_COMPAT_TakeSnsh -& -sname -[13] ); - -1349  -SDLK_LSHIFT -: - -1350  -SDLK_RSHIFT -: - -1351 -shied - = -SDL_FALSE -; - -1354 - `ay_keyess -& -ic --> -ay -, - `mkey -ic, -ev --> -key -. -keysym -. -sym - ), -SDL_FALSE - ); - -1359  -SDL_KEYDOWN -: - -1360  -ev --> -key -. -keysym -. -sym - ) - -1362  -SDLK_LSHIFT -: - -1363  -SDLK_RSHIFT -: - -1364 -shied - = -SDL_TRUE -; - -1367 - `ay_keyess -& -ic --> -ay -, - `mkey -ic, -ev --> -key -. -keysym -. -sym - ), -SDL_TRUE - ); - -1373  -SDL_FALSE -; - -1374 - } -} - -1376  - $bnk_m - -St32 - -how -, -Ut8 - * -mem -, -Ut32 - -size - ) - -1378 -Ut32 - -i -, -j -; - -1380  -how - ) - -1383  -i -=0; i< -size -; i+=256 ) - -1385  -j -=0; j<128; j++ ) - -1387 -mem -[ -i -+ -j - ] = 0; - -1388 -mem -[ -i -+ -j -+128] = 255; - -1394  -i -=0; i< -size -; i+=2 ) - -1396 -mem -[ -i - ] = 0xff; - -1397 -mem -[ -i -+1] = 0x00; - -1401 - } -} - -1403  - $r_tches - -mache - * -ic - ) - -1405 -ic --> -pch_fd_d_gme_pc - = -1; - -1406 -ic --> -pch_fd_cve_gme_pc - = -1; - -1407 -ic --> -pch_fd_e_gme_pc - = -1; - -1408 -ic --> -pch_fd__gme_pc - = -1; - -1409 -ic --> -pch_fd_gme_addr - = -1; - -1410 -ic --> -pch_fd_avaab - = -SDL_FALSE -; - -1412 -ic --> -pch__gsync_pc - = -1; - -1413 -ic --> -pch__gsync_d_pc - = -1; - -1414 -ic --> -pch__gsync_lo_pc - = -1; - -1415 -ic --> -pch__adby_pc - = -1; - -1416 -ic --> -pch__adby_d_pc - = -1; - -1417 -ic --> -pch__adby_eby_addr - = -1; - -1418 -ic --> -pch__adby_ezo_addr - = -1; - -1419 -ic --> -pch__putby_pc - = -1; - -1420 -ic --> -pch__putby_d_pc - = -1; - -1421 -ic --> -pch__cve_d_pc - = -1; - -1422 -ic --> -pch__e_d_pc - = -1; - -1423 -ic --> -pch__avaab - = -SDL_FALSE -; - -1424 -ic --> -pch__ve_avaab - = -SDL_FALSE -; - -1426 -ic --> -keym - = -KMAP_QWERTY -; - -1427 - } -} - -1429 * - gkeymmes -[] = { "qwerty", - -1432 -NULL - }; - -1434  -Ut8 - - $hex2b -( -c -) - -1436  ( ('0' < -c - && c <'9')? (- '0': (10 + ( - `tou -(c) - 'A')) ); - -1437 - } -} - -1439  -Ut8 - - $hex2by -(* -s -) - -1441  - `hex2b -( -s -[0]) * 16 + hex2bin(s[1]); - -1442 - } -} - -1444  -SDL_bo - - $ishexch -( -c -) - -1446 if('0' < -c - && c <= '9') - -1447  -SDL_TRUE -; - -1449 -c - = - `tou -(c); - -1450 if('A' < -c - && c <= 'F') - -1451  -SDL_TRUE -; - -1453  -SDL_FALSE -; - -1454 - } -} - -1456  - $ld_tches - -mache - * -ic -, * -ame - ) - -1458 -FILE - * -f -; - -1459 -St32 - -i -; - -1460 * -tmame -; - -1463 -tmame - = - `mloc - - ` - -ame - ) + 10 ); - -1464 if! -tmame - ) ; - -1466 - `rtf - -tmame -, "%s.pch", -ame - ); - -1468 -f - = - `fݒ - -tmame -, "r" ); - -1469 - ` - -tmame - ); - -1470 if! -f - ) ; - -1472  ! - `of - -f - ) ) - -1474 if! - `fgs - -fmp -, 2048, -f - ) ) ; - -1476  -i -=0; - `isws - -fmp -[i] ); i++ ) ; - -1478 if - `ad_cfig_t -& -fmp -[ -i -], "fd_d_gme_pc", & -ic --> -pch_fd_d_gme_pc -, 0, 65535 ) ) ; - -1479 if - `ad_cfig_t -& -fmp -[ -i -], "fd_cve_gme_pc", & -ic --> -pch_fd_cve_gme_pc -, 0, 65535 ) ) ; - -1480 if - `ad_cfig_t -& -fmp -[ -i -], "fd_e_gme_pc", & -ic --> -pch_fd_e_gme_pc -, 0, 65535 ) ) ; - -1481 if - `ad_cfig_t -& -fmp -[ -i -], "fd__gme_pc", & -ic --> -pch_fd__gme_pc -, 0, 65535 ) ) ; - -1482 if - `ad_cfig_t -& -fmp -[ -i -], "fd_gme_addr", & -ic --> -pch_fd_gme_addr -, 0, 65535 ) ) ; - -1483 if - `ad_cfig_t -& -fmp -[ -i -], "_gsync_pc", & -ic --> -pch__gsync_pc -, 0, 65535 ) ) ; - -1484 if - `ad_cfig_t -& -fmp -[ -i -], "_gsync_d_pc", & -ic --> -pch__gsync_d_pc -, 0, 65535 ) ) ; - -1485 if - `ad_cfig_t -& -fmp -[ -i -], "_gsync_lo_pc", & -ic --> -pch__gsync_lo_pc -, 0, 65535 ) ) ; - -1486 if - `ad_cfig_t -& -fmp -[ -i -], "_adby_pc", & -ic --> -pch__adby_pc -, 0, 65535 ) ) ; - -1487 if - `ad_cfig_t -& -fmp -[ -i -], "_adby_d_pc", & -ic --> -pch__adby_d_pc -, 0, 65535 ) ) ; - -1488 if - `ad_cfig_t -& -fmp -[ -i -], "_adby_eby_addr", & -ic --> -pch__adby_eby_addr -, 0, 65535 ) ) ; - -1489 if - `ad_cfig_t -& -fmp -[ -i -], "_adby_ezo_addr", & -ic --> -pch__adby_ezo_addr -, 0, 65535 ) ) ; - -1490 if - `ad_cfig_bo -& -fmp -[ -i -], "_adby_ty", & -ic --> -pch__adby_ty - ) ) ; - -1491 if - `ad_cfig_t -& -fmp -[ -i -], "_putby_pc", & -ic --> -pch__putby_pc -, 0, 65535 ) ) ; - -1492 if - `ad_cfig_t -& -fmp -[ -i -], "_putby_d_pc", & -ic --> -pch__putby_d_pc -, 0, 65535 ) ) ; - -1493 if - `ad_cfig_t -& -fmp -[ -i -], "_cve_d_pc", & -ic --> -pch__cve_d_pc -, 0, 65535 ) ) ; - -1494 if - `ad_cfig_t -& -fmp -[ -i -], "_e_d_pc", & -ic --> -pch__e_d_pc -, 0, 65535 ) ) ; - -1495 if - `ad_cfig_t -& -fmp -[ -i -], "_wrd_pc", & -ic --> -pch__wrd_pc -, 0, 65535 ) ) ; - -1496 if - `ad_cfig_t -& -fmp -[ -i -], "_wrd_d_pc", & -ic --> -pch__wrd_d_pc -, 0, 65535 ) ) ; - -1497 if - `ad_cfig_ti -& -fmp -[ -i -], "keym", & -ic --> -keym -, -keymmes - ) ) ; - -1505 if(8 < - ` -(& -fmp -[ -i -]) && ';' != filetmp[i]) - -1507 * -mp - = & -fmp -[ -i -]; - -1509 if( -mp -[0]=='$' &&tmp[5]==':') - -1512 if( - `ishexch -( -mp -[1]) && ishexchar(ptmp[2]) && ishexchar(ptmp[3]) && ishexchar(ptmp[4])) - -1514 -Ut16 - -tchaddr - = - `hex2by -( -mp -+1) * 256 + hex2byte(ptmp+3); - -1515 -mp - += 6; - -1516  - `ishexch -( -mp -[0]) && ishexchar(ptmp[1])) - -1518 -Ut8 - -tchby - = - `hex2by -( -mp -); - -1520 -ic --> -rom -[ -tchaddr -] = -tchby - ; - -1521 -tchaddr -++; - -1522 -mp - += 2; - -1530 - `fo - -f - ); - -1533 if -ic --> -pch_fd_d_gme_pc - != -1 ) || - -1534 -ic --> -pch_fd_cve_gme_pc - != -1 ) || - -1535 -ic --> -pch_fd_e_gme_pc - != -1 ) || - -1536 -ic --> -pch_fd__gme_pc - != -1 ) ) && - -1537 -ic --> -pch_fd_gme_addr - != -1 ) ) - -1538 -ic --> -pch_fd_avaab - = -SDL_TRUE -; - -1540 if -ic --> -pch__gsync_pc - != -1 ) && - -1541 -ic --> -pch__gsync_d_pc - != -1 ) && - -1542 -ic --> -pch__gsync_lo_pc - != -1 ) && - -1543 -ic --> -pch__adby_pc - != -1 ) && - -1544 -ic --> -pch__adby_d_pc - != -1 ) ) - -1545 -ic --> -pch__avaab - = -SDL_TRUE -; - -1547 if -ic --> -pch__putby_pc - != -1 ) && - -1548 -ic --> -pch__putby_d_pc - != -1 ) ) - -1549 -ic --> -pch__ve_avaab - = -SDL_TRUE -; - -1550 - } -} - -1552  - $tup_f_miodisc - -mache - * -ic -, * -adr -, * -wr - ) - -1554 -ic --> -u -. -ad - = -adr -; - -1555 -ic --> -u -. -wre - = -wr -; - -1556 -ic --> -romdis - = -SDL_TRUE -; - -1557 - `miodisc_ -& -ic --> -md -, &ic-> -wddisk -, oric ); - -1558 -ic --> -disksyms - = & -sym_miodisc -; - -1559 - } -} - -1561  - $tup_f_jasm - -mache - * -ic -, * -adr -, * -wr - ) - -1563 -ic --> -u -. -ad - = -adr -; - -1564 -ic --> -u -. -wre - = -wr -; - -1565 -ic --> -romdis - = -SDL_FALSE -; - -1566 - `jasm_ -& -ic --> -jasm -, &ic-> -wddisk -, oric ); - -1567 -ic --> -disksyms - = & -sym_jasm -; - -1568 - } -} - -1570  - $tup_f_avzdisk - -mache - * -ic -, * -adr -, * -wr - ) - -1572 -ic --> -u -. -ad - = -adr -; - -1573 -ic --> -u -. -wre - = -wr -; - -1574 -ic --> -romdis - = -SDL_FALSE -; - -1575 - `avz_ -& -ic --> -avz -, oric ); - -1576 -ic --> -disksyms - = & -sym_avz -; - -1577 - } -} - -1579  - $tup_f_no_disk - -mache - * -ic -, * -adr -, * -wr - ) - -1581 -ic --> -drivy - = -DRV_NONE -; - -1582 -ic --> -u -. -ad - = -adr -; - -1583 -ic --> -u -. -wre - = -wr -; - -1584 -ic --> -romdis - = -SDL_FALSE -; - -1585 -ic --> -disksyms - = -NULL -; - -1586 - } -} - -1588 -SDL_bo - - $_mache - -mache - * -ic -,  -ty -, -SDL_bo - -nukebakpots - ) - -1590  -i -; - -1592 -ic --> -turbo_foff - = -SDL_FALSE -; - -1594 -ic --> -ty - =ype; - -1595 - `m6502_ -& -ic --> -u -, (*)ic, -nukebakpots - ); - -1597 -ic --> -turbo_syncack - = -1; - -1599 -ic --> -vidbas -[0] = 0xa000; - -1600 -ic --> -vidbas -[1] = 0x9800; - -1601 -ic --> -vidbas -[2] = 0xbb80; - -1602 -ic --> -vidbas -[3] = 0xb400; - -1604 -ic --> -romsyms -. -numsyms - = 0; - -1605 -ic --> -_bksyms -[0]. -numsyms - = 0; - -1606 -ic --> -_bksyms -[1]. -numsyms - = 0; - -1607 -ic --> -_bksyms -[2]. -numsyms - = 0; - -1608 -ic --> -_bksyms -[3]. -numsyms - = 0; - -1609 -ic --> -_bksyms -[4]. -numsyms - = 0; - -1610 -ic --> -_bksyms -[5]. -numsyms - = 0; - -1611 -ic --> -_bksyms -[6]. -numsyms - = 0; - -1612 -ic --> -_bksyms -[7]. -numsyms - = 0; - -1614 - `r_tches - -ic - ); - -1616 -g_mu_scheme - = -ty -; - -1618  -ty - ) - -1620  -MACH_ORIC1_16K -: - -1621  -i -=0; i<4; i++ ) - -1622 -ic --> -vidbas -[ -i -] &= 0x7fff; - -1623 -ic --> -memsize - = 16384 + 16384; - -1624 -ic --> -mem - = - `mloc -ic-> -memsize - ); - -1625 if! -ic --> -mem - ) - -1627 - `r_tf -( "Out of memory\n" ); - -1628  -SDL_FALSE -; - -1631 - `bnk_m - -ic --> -mn -, oric-> -mem -, 16384+16384 ); - -1633 -ic --> -rom - = &ic-> -mem -[16384]; - -1635  -ic --> -drivy - ) - -1637  -DRV_MICRODISC -: - -1638 - `tup_f_miodisc - -ic -, -miodisc_o16kad -, -miodisc_o16kwre -); - -1641  -DRV_JASMIN -: - -1642 - `tup_f_jasm - -ic -, -jasm_o16kad -, -jasm_o16kwre -); - -1645  -DRV_PRAVETZ -: - -1647 - `tup_f_no_disk - -ic -, -o16kad -, -o16kwre - ); - -1651 if! - `ld_rom - -ic -, -ic1romfe -, -16384, &ic-> -rom -[0], &ic-> -romsyms -, -SYMF_ROMDIS0 - ) )  -SDL_FALSE -; - -1652 - `ld_tches - -ic -, -ic1romfe - ); - -1655  -MACH_ORIC1 -: - -1656 -ic --> -memsize - = 65536 + 16384; - -1657 -ic --> -mem - = - `mloc -ic-> -memsize - ); - -1658 if! -ic --> -mem - ) - -1660 - `r_tf -( "Out of memory\n" ); - -1661  -SDL_FALSE -; - -1664 - `bnk_m - -ic --> -mn -, oric-> -mem -, 65536+16384 ); - -1666 -ic --> -rom - = &ic-> -mem -[65536]; - -1668  -ic --> -drivy - ) - -1670  -DRV_MICRODISC -: - -1671 - `tup_f_miodisc - -ic -, -miodisc_mod -, -miodisc_moswre -); - -1674  -DRV_JASMIN -: - -1675 - `tup_f_jasm - -ic -, -jasm_mod -, -jasm_moswre -); - -1678  -DRV_PRAVETZ -: - -1680 - `tup_f_no_disk - -ic -, -mod -, -moswre - ); - -1684 if! - `ld_rom - -ic -, -ic1romfe -, -16384, &ic-> -rom -[0], &ic-> -romsyms -, -SYMF_ROMDIS0 - ) )  -SDL_FALSE -; - -1685 - `ld_tches - -ic -, -ic1romfe - ); - -1688  -MACH_ATMOS -: - -1689 -ic --> -memsize - = 65536 + 16384; - -1690 -ic --> -mem - = - `mloc -ic-> -memsize - ); - -1691 if! -ic --> -mem - ) - -1693 - `r_tf -( "Out of memory\n" ); - -1694  -SDL_FALSE -; - -1697 - `bnk_m - -ic --> -mn -, oric-> -mem -, 65536+16384 ); - -1699 -ic --> -rom - = &ic-> -mem -[65536]; - -1701  -ic --> -drivy - ) - -1703  -DRV_MICRODISC -: - -1704 - `tup_f_miodisc - -ic -, -miodisc_mod -, -miodisc_moswre -); - -1707  -DRV_JASMIN -: - -1708 - `tup_f_jasm - -ic -, -jasm_mod -, -jasm_moswre -); - -1711  -DRV_PRAVETZ -: - -1713 - `tup_f_no_disk - -ic -, -mod -, -moswre - ); - -1717 if! - `ld_rom - -ic -, -moomfe -, -16384, &ic-> -rom -[0], &ic-> -romsyms -, -SYMF_ROMDIS0 - ) )  -SDL_FALSE -; - -1718 - `ld_tches - -ic -, -moomfe - ); - -1721  -MACH_TELESTRAT -: - -1722 -ic --> -drivy - = -DRV_MICRODISC -; - -1723 -ic --> -memsize - = 65536 + 16384*7; - -1724 -ic --> -mem - = - `mloc -ic-> -memsize - ); - -1725 if! -ic --> -mem - ) - -1727 - `r_tf -( "Out of memory\n" ); - -1728  -SDL_FALSE -; - -1731 - `bnk_m - -ic --> -mn -, oric-> -mem -, 65536+16384*7 ); - -1733 - `tup_f_miodisc - -ic -, -ˡd -, -ˡtwre - ); - -1734 -ic --> -disksyms - = -NULL -; - -1736  -i -=0; i<8; i++ ) - -1739 -ic --> -rom - = oric-> -_bk -[ -i -]. -r - = &ic-> -mem -[0x0c000+(i*0x4000)]; - -1740 if -bkfes -[ -i -][0] ) - -1742 -ic --> -_bk -[ -i -]. -ty - = -TELEBANK_ROM -; - -1743 if! - `ld_rom - -ic -, -bkfes -[ -i -], -16384, oric-> -_bk -[i]. -r -, &ic-> -_bksyms -[i], -SYMF_TELEBANK0 -<< -SDL_FALSE -; - -1744 - `ld_tches - -ic -, -bkfes -[ -i -] ); - -1746 -ic --> -_bk -[ -i -]. -ty - = -TELEBANK_RAM -; - -1750 -ic --> -_cubk - = 7; - -1751 -ic --> -_bkty - = oric-> -_bk -[7]. -ty -; - -1752 -ic --> -rom - = oric-> -_bk -[7]. -r -; - -1755  -MACH_PRAVETZ -: - -1756 -ic --> -memsize - = 65536 + 16384; - -1757 -ic --> -mem - = - `mloc -ic-> -memsize - ); - -1758 if! -ic --> -mem - ) - -1760 - `r_tf -( "Out of memory\n" ); - -1761  -SDL_FALSE -; - -1764 - `bnk_m - -ic --> -mn -, oric-> -mem -, 65536+16384 ); - -1766 -ic --> -rom - = &ic-> -mem -[65536]; - -1768  -ic --> -drivy - ) - -1770  -DRV_MICRODISC -: - -1771 - `tup_f_miodisc - -ic -, -miodisc_mod -, -miodisc_moswre -); - -1774  -DRV_JASMIN -: - -1775 - `tup_f_jasm - -ic -, -jasm_mod -, -jasm_moswre -); - -1778  -DRV_PRAVETZ -: - -1779 - `tup_f_avzdisk - -ic -, -avz_mod -, -avz_moswre - ); - -1783 - `tup_f_no_disk - -ic -, -mod -, -moswre - ); - -1787 if! - `ld_rom - -ic -, -avzromfe -[0], -16384, &ic-> -rom -[0], &ic-> -romsyms -, -SYMF_ROMDIS0 - ) )  -SDL_FALSE -; - -1788 - `ld_tches - -ic -, -avzromfe -[0] ); - -1793  -SDL_FALSE -; - -1796 -ic --> -cye - = 64; - -1797 -ic --> -vid_t - = 65; - -1798 -ic --> -vid_max - = 312; - -1799 -ic --> -vid_d - = oric-> -vid_t - + 224; - -1800 -ic --> -vid_ - = 0; - -1801 - `u_powup_deu - -ic - ); - -1803 -ic --> -ad_n_ligh - = oric-> -u -. -ad -; - -1805 i( -ic --> -ligh -) - -1806 -ic --> -u -. -ad - = -ligh_ad -; - -1808 - `om - -ic - ); - -1809 -ic --> -me -[0] = 0; - -1810 - `_wd - -ic - ); - -1811 - `m6502_t -& -ic --> -u - ); - -1812 - `v_ -& -ic --> -v -, oric, -VIA_MAIN - ); - -1813 - `v_ -& -ic --> -_v -, oric, -VIA_TELESTRAT - ); - -1814 - `ac_ -& -ic --> -_ac -, oric ); - -1816 i( -ic --> -ch376_aived -) - -1818 -ic --> -ch376 - = - `ch376_ic_ -(); - -1819 - `ch376_ic_cfig -( -ic --> -ch376 -); - -1822 - `ay_ -& -ic --> -ay -, oric ); - -1823 - `joy_tup - -ic - ); - -1824 -ic --> -u -. -cyes - = oric-> -cye -; - -1825 -ic --> -ames - = 0; - -1826 -ic --> -vid_doub - = -SDL_TRUE -; - -1827 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -1829 if -ic --> -autewd - ) - `_wd -( oric ); - -1831 - `tmutoggs - -ic - ); - -1832 -eshus - = -SDL_TRUE -; - -1834  -SDL_TRUE -; - -1835 - } -} - -1837  - $shut_mache - -mache - * -ic - ) - -1839 if -ic --> -drivy - = -DRV_MICRODISC - ) { - `miodisc_ -&ic-> -md - ); oric->drivy = -DRV_NONE -; } - -1840 if -ic --> -drivy - = -DRV_JASMIN - ) { - `jasm_ -&ic-> -jasm - ); oric->drivy = -DRV_NONE -; } - -1841 if -ic --> -drivy - = -DRV_PRAVETZ - ) { - `avz_ -&ic-> -avz - ); oric->drivy = -DRV_NONE -; } - -1842 if -ic --> -mem - ) { - ` -ic->mem ); oric->mem = -NULL -; oric-> -rom - = NULL; } - -1843 if -ic --> -f - ) { - `fo -ic->); oric-> -NULL -; } - -1844 if -ic --> -tvf - ) - `__vch -( oric ); - -1845 if -ic --> -p - ) - `toggˏp -ic, - `fd_em_by_funi -( -maems -, -toggˏp -), 0 ); - -1846 i( -ic --> -buf -{ - ` -(ic->buf); oric->bu -NULL -; } - -1847 - `m_syms -& -sym_miodisc - ); - -1848 - `m_syms -& -sym_jasm - ); - -1849 - `m_syms -& -sym_avz - ); - -1850 - `m_syms -& -ic --> -romsyms - ); - -1851 - `m_syms -& -ic --> -_bksyms -[0] ); - -1852 - `m_syms -& -ic --> -_bksyms -[1] ); - -1853 - `m_syms -& -ic --> -_bksyms -[2] ); - -1854 - `m_syms -& -ic --> -_bksyms -[3] ); - -1855 - `m_syms -& -ic --> -_bksyms -[4] ); - -1856 - `m_syms -& -ic --> -_bksyms -[5] ); - -1857 - `m_syms -& -ic --> -_bksyms -[6] ); - -1858 - `m_syms -& -ic --> -_bksyms -[7] ); - -1859 - } -} - -1861  -shut -( ); - -1862  - $tdrivy - -mache - * -ic -,  -osdmuem - * -mem -,  -ty - ) - -1864 if -ic --> -drivy - = -ty - ) - -1867 if -ty - = -DRV_PRAVETZ - ) && - -1868 -ic --> -ty - ! -MACH_PRAVETZ - ) ) - -1870 - `swmach - -ic -, -mem -, ( -DRV_PRAVETZ -<<16)| -MACH_PRAVETZ - ); - -1874 - `shut_mache - -ic - ); - -1876  -ty - ) - -1878  -DRV_MICRODISC -: - -1879  -DRV_JASMIN -: - -1880  -DRV_PRAVETZ -: - -1881 -ic --> -drivy - = -ty -; - -1885 -ic --> -drivy - = -DRV_NONE -; - -1889 - `m_e_t - -ic - ); - -1890 if! - `_mache - -ic -, oric-> -ty -, -SDL_FALSE - ) ) - -1892 - `shut -(); - -1893 - `ex - -EXIT_FAILURE - ); - -1896 - `tmutoggs - -ic - ); - -1897 - } -} - -1899  - $swmach - -mache - * -ic -,  -osdmuem - * -mem -,  -which - ) - -1901  -cu_drivy -; - -1903 -cu_drivy - = -ic --> -drivy -; - -1905 - `shut_mache - -ic - ); - -1907 if(( -which ->>16)&0xffff) != 0xffff ) - -1908 -cu_drivy - = ( -which ->>16)&0xffff; - -1910 -which - &= 0xffff; - -1912 -ic --> -drivy - = -cu_drivy -; - -1916 - `r_xtze - -ic -, -TZ_DISK - ); - -1918 - `m_e_t - -ic - ); - -1919 if! - `_mache - -ic -, -which -, which!=ic-> -ty - ) ) - -1921 - `shut -(); - -1922 - `ex - -EXIT_FAILURE - ); - -1924 - } -} - - @machine.h - -21 #ifde -_MSC_VER - - -22  - ~ - -25  - ~"keybrd.h -" - -29 - mDRV_NONE - = 0, - -30 - mDRV_JASMIN -, - -31 - mDRV_MICRODISC -, - -32 - mDRV_PRAVETZ - - -37 - mMACH_ORIC1 - = 0, - -38 - mMACH_ORIC1_16K -, - -39 - mMACH_ATMOS -, - -40 - mMACH_TELESTRAT -, - -41 - mMACH_PRAVETZ -, - -42 - mMACH_LAST - - -47 - mEM_PAUSED - = 0, - -48 - mEM_RUNNING -, - -49 - mEM_DEBUG -, - -50 - mEM_MENU -, - -51 - mEM_PLEASEQUIT - - -56 - mTELEBANK_RAM -, - -57 - mTELEBANK_ROM -, - -58 - mTELEBANK_HALFNHALF - - -63 - mKMAP_QWERTY - = 0, - -64 - mKMAP_AZERTY -, - -65 - mKMAP_QWERTZ - - -71 - mIMG_I_DUNNO - = 0, - -72 - mIMG_ATMOS_MICRODISC -, - -73 - mIMG_ATMOS_JASMIN -, - -74 - mIMG_TELESTRAT_DISK -, - -75 - mIMG_PRAVETZ_DISK -, - -76 - mIMG_GUESS_MICRODISC -, - -77 - mIMG_SNAPSHOT -, - -78 - mIMG_TAPE - - -81  - sbkfo - - -83  - mty -; - -84 * - mr -; - -87  - smache - - -89 -Ut8 - - mty -; - -90  -m6502 - - mu -; - -91  -v - - mv -; - -92  -ay8912 - - may -; - -93  - mmemsize -; - -94 * - mmem -; - -95 * - mrom -; - -96  - memu_mode -; - -98  -symbޏb - - mromsyms -; - -99  -symbޏb - - mursyms -; - -100  -symbޏb - * - mdisksyms -; - -102  -bkfo - - m_bk -[8]; - -103  -symbޏb - - m_bksyms -[8]; - -104  -v - - m_v -; - -105  -ac - - m_ac -; - -106  -ch376 - * - mch376 -; - -107 -SDL_bo - - mch376_aived -; - -108  - m_cubk -; - -109  - m_bkty -; - -112  - mvid_t -; - -113  - mvid_d -; - -114  - mvid_max -; - -115  - mvid_ -; - -116  - mvid_offt -; - -118  - mvid_fg_c -; - -119  - mvid_bg_c -; - -120 -Ut16 - * - mvid_br -; - -121 -Ut16 - * - mvid_v_br -; - -122  - mvid_mode -; - -123  - mvid_eq -; - -124  - mvid_xrs -; - -125  - mvid_blkmask -; - -126  - mvid_chle -; - -127  - mames -; - -128 -SDL_bo - - mvid_dty -[224]; - -129 (* - mvid_block_func -) - mmache - *, - mSDL_bo -, , ); - -131  - movockmu -, - movockshi -; - -133  - mcye -; - -134  - mvsync -; - -136 -SDL_bo - - mvid_doub -; - -137 -SDL_bo - - mromdis -, - mrom -; - -138 -SDL_bo - - mvsynchack -; - -140  - mvid_addr -; - -141 * - mvid_ch_da -; - -142 * - mvid_ch_ba -; - -144 -Ut8 - * - ms -; - -145 -Ut8 - * - ms -; - -147 -Ut16 - - mvidbas -[4]; - -149  - mdrivy -; - -150  -wd17xx - - mwddisk -; - -151  -miodisc - - mmd -; - -152  -jasm - - mjasm -; - -153  -avz - - mavz -; - -154  - mdiskme -[ -MAX_DRIVES -][32]; - -155 -SDL_bo - - mdiskautove -; - -156 -SDL_bo - - mauto_jasm_t -; - -158 -FILE - * - mf -; - -159  - mo -, - mock -; - -161  - mb -, - mout -, - mry -; - -162  - mn -, - moffs -, - mcou -, - mtime -, - mdupbys -, - mhdnd -, - mday -; - -163 * - mbuf -; - -164 -SDL_bo - - mm -, - mnoi -, - mturbo -, - mautewd -, - mauto -; - -165 -SDL_bo - - mturbo_foff -; - -166 -SDL_bo - - msymbާutd -, - msymbs -; - -167 -SDL_bo - - mw -; - -168  - mnڿwd -, - mhd -; - -169  - mϡfe -[20]; - -170  - mme -[32]; - -171  - mturbo_syncack -; - -172 -FILE - * - mp -; - -173  - mpcou -; - -174  - mab -; - -175  - mpvbys -; - -176  - mpvoffs -; - -179  - mpch_fd_d_gme_pc -; - -180  - mpch_fd_cve_gme_pc -; - -181  - mpch_fd_e_gme_pc -; - -182  - mpch_fd__gme_pc -; - -183  - mpch_fd_gme_addr -; - -184 -SDL_bo - - mpch_fd_avaab -; - -187  - mpch__gsync_pc -; - -188  - mpch__gsync_d_pc -; - -189  - mpch__gsync_lo_pc -; - -190  - mpch__adby_pc -; - -191  - mpch__adby_d_pc -; - -192  - mpch__adby_eby_addr -; - -193  - mpch__adby_ezo_addr -; - -194  - mpch__putby_pc -; - -195  - mpch__putby_d_pc -; - -196  - mpch__cve_d_pc -; - -197  - mpch__e_d_pc -; - -198  - mpch__wrd_pc -; - -199  - mpch__wrd_d_pc -; - -200 -SDL_bo - - mpch__adby_ty -; - -201 -SDL_bo - - mpch__avaab -; - -202 -SDL_bo - - mpch__ve_avaab -; - -203 -FILE - * - mtvf -; - -205 -St32 - - mkeym -; - -207 -SDL_bo - - mio -, - mhtch -, - msƚes -, - mlgho -, - mavdiskautobo -; - -208 -St32 - - msw_dth -; - -210  - mndmode -; - -211 (* - mnd_beg -)( - mmache - *); - -212 (* - mnd_d -)( - mmache - *); - -213 (* - mnd_xtze_loc -)( - mmache - *, ); - -214 (* - mnd_xtze_ -)( - mmache - *, ); - -215 (* - mnd_xtze -)( - mmache - *, ); - -216 (* - mnd_r_ -)( , , , ); - -217 (* - mnd_gimg -)(, - mSt32 -, Sint32); - -218 (* - mnd_gimg -)(, - mSt32 -, Sint32, Sint32, Sint32, Sint32, Sint32); - -219 (* - mnd_loc_xtze -)( - mmache - *,  - mxtze - *); - -220 (* - mnd__xtze -)( - mmache - *,  - mxtze - *); - -221 (* - mnd_video -)( - mmache - *, - mSDL_bo -); - -222 -SDL_bo - (* -nd_toggfusn -)( -mache - * - mic -); - -223 -SDL_bo - (* -_nd -)( - mmache - *); - -224 (* - mshut_nd -)( - mmache - *); - -226  - mpupr -[40]; - -227  - mpuime -; - -228 -SDL_bo - - mwpupr -; - -230  - musr -[40]; - -231 -SDL_bo - - mwusr -; - -233  - musb_mode -; - -235  - mmn -; - -237 -St32 - - mjoy_i -; - -238 -St32 - - mjoymode_a -, - mjoymode_b -; - -239 -St32 - - mjoymode_a -, - mjoymode_b -; - -240 -SDL_COMPAT_KEY - - mkbjoy1 -[6], - mkbjoy2 -[6]; - -242 -SDL_bo - - mb -; - -243 -SDL_bo - - mtfr -; - -245 -SDL_bo - - mligh -; - -246 -Ut8 - - mlighx -, - mlighy -; - -247 (* - mad_n_ligh -)( - mm6502 - *, - mUt16 -); - -249 -Ut8 - - mp܏_joy -, - mp܏_ay -; - -250 -SDL_bo - - mp܏_is_ay -; - -252 -SDL_Joyick - * - msdljoy_a -, * - msdljoy_b -; - -254  -keybrd_mpg - - mkeybrd_mpg -; - -255 -SDL_bo - - mshow_keybrd -; - -256 -SDL_bo - - mdefe_mpg -; - -257 -SDL_bo - - micky_mod_keys -; - -259  - macofft -; - -260  - macbackd -; - -261  - macbackdcfg -; - -262  - macbackdcfgpt -; - -263  - macbackdcfgdoma -; - -264  - macbackdme -[ -ACIA_BACKEND_NAME_LEN -]; - -267  -om - -mache - * -ic - ); - -268  -mumode - -mache - * -ic -,  -osdmuem - * -mem -,  -mode - ); - -269  -video_show - -mache - * -ic - ); - -270 -SDL_bo - -emu_evt - -SDL_Evt - * -ev -,  -mache - * -ic -, SDL_bo * -ednd - ); - -272  -e_mache - -mache - * -ic - ); - -273  -ld_diskroms - -mache - * -ic - ); - -274 -SDL_bo - -_mache - -mache - * -ic -,  -ty -, SDL_bo -nukebakpots - ); - -275  -shut_mache - -mache - * -ic - ); - -276  -tdrivy - -mache - * -ic -,  -osdmuem - * -mem -,  -ty - ); - -277  -swmach - -mache - * -ic -,  -osdmuem - * -mem -,  -which - ); - -278 -SDL_bo - -iam - -mache - * -ic -,  -addr - ); - -280  -r_tches - -mache - * -ic - ); - -282  -ligh_ad - -m6502 - * -u -,  -addr - ); - -284  -de_image_ty -(* -fame -); - - @main.c - -21 #ifde -__APPLE__ - - -22  - ~"CeFoundi/CeFoundi.h -" - -25 #ifde -_MSC_VER - - -26  - #_CRTDBG_MAP_ALLOC - - - ) - -27  - ~ - -28  - ~ - -31  - ~ - -32  - ~ - -33  - ~ - -35 #ifde -__amigaos4__ - - -36  - ~ - -37  - ~ - -40 #ifde -WIN32 - - -41  - ~ - -44  - ~"syem.h -" - -45  - ~"6502.h -" - -46  - ~"v.h -" - -47  - ~"8912.h -" - -48  - ~"gui.h -" - -49  - ~"disk.h -" - -50  - ~"mڙ.h -" - -51  - ~"6551.h -" - -52  - ~"mache.h -" - -53  - ~"feq.h -" - -54  - ~"msgbox.h -" - -55  - ~"avi.h -" - -56  - ~"ma.h -" - -57  - ~"u.h -" - -58  - ~"nd_sw.h -" - -59  - ~"nd_sw8.h -" - -60  - ~"nd_gl.h -" - -61  - ~"joyick.h -" - -62  - ~".h -" - -63  - ~"sh.h -" - -64  - ~"keybrd.h -" - -66  - #FRAMES_TO_AVERAGE - 8 - - ) - -68 -SDL_bo - - ged_sdl_qu - = -SDL_FALSE -; - -69 -SDL_bo - - gfusn -, - ghwsur -; - -70 -SDL_bo - -wpd -, -sound -; - -71 -Ut32 - - gϡamimes -[ -FRAMES_TO_AVERAGE -], - gamimve -; - -72  -m_bpmsg -[]; - -73  -avi_hd - * -vidp -; - -74  -th -[], -diskth -[], -diskth -[], -avdiskth -[]; - -75  -moomfe -[]; - -76  -ic1romfe -[]; - -77  -mdisomfe -[]; - -78  -jasmomfe -[]; - -79  -avzromfe -[2][1024]; - -80  -bkfes -[8][1024]; - -82  - gkeym_th -[4096+32]; - -83  - gld_keym - = -SDL_FALSE -; - -85 #ifde -__amigaos4__ - - -86  -__ibu__ -(( -ud -) - gackcook -[] = "$STACK: 1000000"; - -89 #i -defed -( -__amigaos4__ -|| defed( -__MORPHOS__ -|| defed( -__AROS__ -) - -90 #i -EXIT_FAILURE - == 1 - -91 #unde -EXIT_FAILURE - - -92  - #EXIT_FAILURE - -RETURN_FAIL - - - ) - -94 #ide -__AMIGADATE__ - - -95  - #__AMIGADATE__ - "(" -__DATE__ -")" - - ) - -97  -__ibu__ -(( -ud -) - gvsiڏg -[] = "$VER: " -APP_NAME_FULL - " " -__AMIGADATE__ -; - -100  - st_ts - - -102  - mlmp -[2048]; - -103 -SDL_bo - - mt_mache_t -; - -104 -St32 - - mt_mache -; - -105 -SDL_bo - - mt_diskty_t -; - -106 -St32 - - mt_diskty -; - -107 -St32 - - mt_ndmode -; - -108 -SDL_bo - - mt_debug -; - -109  - mt_disk -[1024]; - -110  - mt_ -[1024]; - -111  - mt_syms -[1024]; - -112 * - mt_syms_fes -[32]; - -113 -St32 - - mt_syms_cou -; - -114  - mt_sh -[1024]; - -115 * - mt_bakpot -; - -118 * - gmachtys -[] = { "oric1", - -123 -NULL - }; - -125 * - gdisktys -[] = { "none", - -129 -NULL - }; - -131 * - gjoyitys -[] = { "none", - -134 -NULL - }; - -136 * - gjoymodes -[] = { "none", - -150 -NULL - }; - -152 * - gndmodes -[] = { "{{INVALID}}", - -155 -NULL - }; - -157 * - gswdths -[] = { "8", "16", "32", -NULL - }; - -159  -SDL_bo - - $iokd - -c - ) - -161 if - `isws - -c - ) )  -SDL_TRUE -; - -162 if -c - =0 ) || ( c =10 ) || ( c =13 ) )  -SDL_TRUE -; - -163  -SDL_FALSE -; - -164 - } -} - -166 -SDL_bo - - $ad_cfig_rg -* -buf -, * -tok -, * -de -, -St32 - -maxn - ) - -168 -St32 - -i -, -tokn -, -d -; - -171 -tokn - = () - ` - -tok - ); - -174 if - `cmp - -buf -, -tok -, -tokn - ) !0 )  -SDL_FALSE -; - -175 -i - = -tokn -; - -178  - `isws - -buf -[ -i -] ) ) i++; - -179 if -buf -[ -i -] !'=' )  -SDL_TRUE -; - -180 -i -++; - -181  - `isws - -buf -[ -i -] ) ) i++; - -182 if -buf -[ -i -] !'\'' )  -SDL_TRUE -; - -183 -i -++; - -186 -d -=0; - -187  -buf -[ -i -] != '\'' ) - -189 if -d - >( -maxn --1) ) ; - -190 if! -buf -[ -i -] ) ; - -192 if -buf -[ -i -] == '\\' ) && ( buf[i+1] == '\'' ) ) - -194 -de -[ -d -++] = '\''; - -195 -i -+=2; - -199 if -buf -[ -i -] == '\\' ) && ( buf[i+1] == '\\' ) ) - -201 -de -[ -d -++] = '\\'; - -202 -i -+=2; - -206 -de -[ -d -++] = -buf -[ -i -++]; - -209 -de -[ -d -] = 0; - -210  -SDL_TRUE -; - -211 - } -} - -213 -SDL_bo - - $ad_cfig_bo -* -buf -, * -tok -, -SDL_bo - * -de - ) - -215 -St32 - -i -, -tokn -; - -218 -tokn - = () - ` - -tok - ); - -221 if - `cmp - -buf -, -tok -, -tokn - ) !0 )  -SDL_FALSE -; - -222 -i - = -tokn -; - -225  - `isws - -buf -[ -i -] ) ) i++; - -226 if -buf -[ -i -] !'=' )  -SDL_TRUE -; - -227 -i -++; - -228  - `isws - -buf -[ -i -] ) ) i++; - -230 (* -de - -SDL_FALSE -; - -231 if - `cmp -& -buf -[ -i -], "ue", 4 ) =0 ) (* -de - -SDL_TRUE -; - -232 if - `cmp -& -buf -[ -i -], "yes", 3 ) =0 ) (* -de - -SDL_TRUE -; - -233  -SDL_TRUE -; - -234 - } -} - -236 -SDL_bo - - $ad_cfig_ti -* -buf -, * -tok -, -St32 - * -de -, ** -tis - ) - -238 -St32 - -i -, -j -, -n -; - -239 * -thist -; - -242 -n - = () - ` - -tok - ); - -245 if - `cmp - -buf -, -tok -, -n - ) !0 )  -SDL_FALSE -; - -246 -i - = -n -; - -249  - `isws - -buf -[ -i -] ) ) i++; - -250 if -buf -[ -i -] !'=' )  -SDL_TRUE -; - -251 -i -++; - -252  - `isws - -buf -[ -i -] ) ) i++; - -255 if - `cmp -& -buf -[ -i -], "{{INVALID}}", 11 ) == 0 ) - -256  -SDL_FALSE -; - -258  -j -=0; -tis -[j]; j++ ) - -260 -thist - = -tis -[ -j -]; - -261  -thist -[0] ) - -263 -n - = 0; - -264  ( -thist -[ -n -]!=0) && (thisopt[len]!='|') )en++; - -266 if - `cmp -& -buf -[ -i -], -thist -, -n - ) == 0 ) - -268 if - `iokd - -buf -[ -i -+ -n -] ) ) - -270 * -de - = -j -; - -271  -SDL_TRUE -; - -274 -thist - + -n -; - -275 if -thist -[0] == '|' )hisopt++; - -279  -SDL_TRUE -; - -280 - } -} - -282 -SDL_bo - - $ad_cfig_t -* -buf -, * -tok -, * -de -,  -m -,  -max - ) - -284 -St32 - -i -, -tokn -; - -285  -v -, -hv -; - -288 -tokn - = () - ` - -tok - ); - -291 if - `cmp - -buf -, -tok -, -tokn - ) !0 )  -SDL_FALSE -; - -292 -i - = -tokn -; - -295  - `isws - -buf -[ -i -] ) ) i++; - -296 if -buf -[ -i -] !'=' )  -SDL_TRUE -; - -297 -i -++; - -298  - `isws - -buf -[ -i -] ) ) i++; - -300 -v - = 0; - -301 if -buf -[ -i -] == '$' ) - -303 -i -++; - -304  ( -hv -= - `hex -( -buf -[ -i -])) != -1 ) - -306 -v - = (v<<4+ -hv -; - -307 -i -++; - -310 -v - = - `oi -& -buf -[ -i -] ); - -313 if -v - < -m - ) val = min; - -314 if -v - > -max - ) val = max; - -316 (* -de - -v -; - -317  -SDL_TRUE -; - -318 - } -} - -320 -SDL_bo - - $ad_cfig_joykey -* -buf -, * -tok -, -SDL_COMPAT_KEY - * -de - ) - -322 -St32 - -i -, -tokn -, -d -; - -323 -SDL_COMPAT_KEY - -thekey -; - -324  -keyme -[32]; - -327 -tokn - = () - ` - -tok - ); - -330 if - `cmp - -buf -, -tok -, -tokn - ) !0 )  -SDL_FALSE -; - -331 -i - = -tokn -; - -334  - `isws - -buf -[ -i -] ) ) i++; - -335 if -buf -[ -i -] !'=' )  -SDL_TRUE -; - -336 -i -++; - -337  - `isws - -buf -[ -i -] ) ) i++; - -338 if -buf -[ -i -] !'\'' )  -SDL_TRUE -; - -339 -i -++; - -342 -d -=0; - -343  -buf -[ -i -] != '\'' ) - -345 if -d - >= 31 ) ; - -346 if! -buf -[ -i -] ) ; - -348 if -buf -[ -i -] == '\\' ) && ( buf[i+1] == '\'' ) ) - -350 -keyme -[ -d -++] = '\''; - -351 -i -+=2; - -355 if -buf -[ -i -] == '\\' ) && ( buf[i+1] == '\\' ) ) - -357 -keyme -[ -d -++] = '\\'; - -358 -i -+=2; - -362 -keyme -[ -d -++] = -buf -[ -i -++]; - -365 -keyme -[ -d -] = 0; - -367 -thekey - = - `joy_keyme_to_sym - -keyme - ); - -369 if -thekey - ) - -371 * -de - = -thekey -; - -372  -SDL_TRUE -; - -375  -SDL_FALSE -; - -376 - } -} - -378  - $ld_cfig - -t_ts - * -o -,  -mache - * -ic - ) - -380 -FILE - * -f -; - -381 -St32 - -i -, -j -; - -382  -tbtmp -[32]; - -383  -keym_fe -[4096]; - -385 -f - = - `fݒ - -FILEPREFIX -"oricutron.cfg", "r" ); - -386 if! -f - ) ; - -388  ! - `of - -f - ) ) - -390 if! - `fgs - -o --> -lmp -, 2048, -f - ) ) ; - -392  -i -=0; - `isws - -o --> -lmp -[i] ); i++ ) ; - -394 if - `ad_cfig_ti -& -o --> -lmp -[ -i -], "mache", &o-> -t_mache -, -machtys - ) ) ; - -395 if - `ad_cfig_ti -& -o --> -lmp -[ -i -], "diskty", &o-> -t_diskty -, -disktys - ) ) ; - -396 if - `ad_cfig_bo -& -o --> -lmp -[ -i -], "debug", &o-> -t_debug - ) ) ; - -397 if - `ad_cfig_bo -& -o --> -lmp -[ -i -], "fusn", & -fusn - ) ) ; - -398 if - `ad_cfig_bo -& -o --> -lmp -[ -i -], "hwsur", & -hwsur - ) ) ; - -399 if - `ad_cfig_bo -& -o --> -lmp -[ -i -], "sƚes", & -ic --> -sƚes - ) ) ; - -400 if - `ad_cfig_bo -& -o --> -lmp -[ -i -], "io", & -ic --> -io - ) ) ; - -401 if - `ad_cfig_bo -& -o --> -lmp -[ -i -], "htch", & -ic --> -htch - ) ) ; - -402 if - `ad_cfig_bo -& -o --> -lmp -[ -i -], "lghog", & -ic --> -lgho - ) ) ; - -403 if - `ad_cfig_rg -& -o --> -lmp -[ -i -], "diskimage", sto-> -t_disk -, 1024 ) ) ; - -404 if - `ad_cfig_rg -& -o --> -lmp -[ -i -], "image", sto-> -t_ -, 1024 ) ) ; - -405 if - `ad_cfig_rg -& -o --> -lmp -[ -i -], "symbs", sto-> -t_syms -, 1024 ) ) ; - -406 if - `ad_cfig_rg -& -o --> -lmp -[ -i -], "th", -th -, 1024 ) ) ; - -407 if - `ad_cfig_rg -& -o --> -lmp -[ -i -], "diskth", -diskth -, 1024 ) ) ; - -408 if - `ad_cfig_rg -& -o --> -lmp -[ -i -], "diskth", -diskth -, 1024 ) ) ; - -409 if - `ad_cfig_rg -& -o --> -lmp -[ -i -], "avdiskth", -avdiskth -, 1024 ) ) ; - -410 if - `ad_cfig_rg -& -o --> -lmp -[ -i -], "moom", -moomfe -, 1024 ) ) ; - -411 if - `ad_cfig_rg -& -o --> -lmp -[ -i -], "ic1rom", -ic1romfe -, 1024 ) ) ; - -412 if - `ad_cfig_rg -& -o --> -lmp -[ -i -], "mdisom", -mdisomfe -, 1024 ) ) ; - -413 if - `ad_cfig_rg -& -o --> -lmp -[ -i -], "jasmrom", -jasmomfe -, 1024 ) ) ; - -414 if - `ad_cfig_rg -& -o --> -lmp -[ -i -], "avzrom", -avzromfe -[0], 1024 ) ) ; - -415 if - `ad_cfig_rg -& -o --> -lmp -[ -i -], "avz8drom", -avzromfe -[1], 1024 ) ) ; - -416 if - `ad_cfig_t -& -o --> -lmp -[ -i -], "mn", & -ic --> -mn -, 0, 1 ) ) ; - -417 if - `ad_cfig_ti -& -o --> -lmp -[ -i -], "swdth", & -ic --> -sw_dth -, -swdths - ) ) - -420  -ic --> -sw_dth -) - -422 0: -ic --> -sw_dth - = 8; ; - -423 2: -ic --> -sw_dth - = 32; ; - -424 : -ic --> -sw_dth - = 16; ; - -428 if - `ad_cfig_ti -& -o --> -lmp -[ -i -], "ndmode", &o-> -t_ndmode -, -ndmodes - ) ) - -430 #ide -__OPENGL_AVAILABLE__ - - -431 if -o --> -t_ndmode - = -RENDERMODE_GL - ) - -432 -o --> -t_ndmode - = -RENDERMODE_SW -; - -436  -j -=0; j<8; j++ ) - -438 - `rtf - -tbtmp -, "bk%c", -j -+'0' ); - -439 if - `ad_cfig_rg -& -o --> -lmp -[ -i -], -tbtmp -, -bkfes -[ -j -], 1024 ) ) ; - -441 if - `ad_cfig_bo -& -o --> -lmp -[ -i -], "ligh", & -ic --> -ligh - ) ) ; - -442 if - `ad_cfig_bo -& -o --> -lmp -[ -i -], "b", & -ic --> -b - ) ) ; - -443 if - `ad_cfig_bo -& -o --> -lmp -[ -i -], "tfr", & -ic --> -tfr - ) ) ; - -444 if - `ad_cfig_t -& -o --> -lmp -[ -i -], "rl_addss", & -ic --> -acofft -, 0x310, 0x3fc ) ) ; - -445 if - `ad_cfig_rg -& -o --> -lmp -[ -i -], "rl", -ic --> -acbackdme -, -ACIA_BACKEND_NAME_LEN - ) ) - -447 if(! - `rcmp -("ne", -ic --> -acbackdme -)) - -448 -ic --> -acbackdcfg - = oric-> -acbackd - = -ACIA_TYPE_NONE -; - -449 if(! - `rcmp -("loback", -ic --> -acbackdme -)) - -450 -ic --> -acbackdcfg - = oric-> -acbackd - = -ACIA_TYPE_LOOPBACK -; - -451 if(! - `cmp -("modem", -ic --> -acbackdme -, 5)) - -453 #ifde -BACKEND_MODEM - - -454 * -p - = - `rchr -( -ic --> -acbackdme -, ':'); - -455 -ic --> -acbackdcfg - = oric-> -acbackd - = -ACIA_TYPE_MODEM -; - -456 -ic --> -acbackdcfgpt - = 0; - -457 -ic --> -acbackdcfgdoma - = 4; - -458 if( -p -) { - -459 * -p2 - = - `rchr -( -p -+1, ':'); - -460 i( -p2 -) { - -462 i( - `rcmp -( -p2 -+1, "ipv6")==0) - -463 -ic --> -acbackdcfgdoma - = 6; - -464 * -p2 - = '\0'; - -465 -ic --> -acbackdcfgpt - = - `oi -( -p -+1); - -466 * -p2 - = ':'; - -468 -ic --> -acbackdcfgpt - = - `oi -( -p -+1); - -471 if( -ic --> -acbackdcfgpt - <= 0) - -472 -ic --> -acbackdcfgpt - = -ACIA_TYPE_MODEM_DEFAULT_PORT -; - -477 #ifde -BACKEND_COM - - -478 -ic --> -acbackdcfg - = oric-> -acbackd - = -ACIA_TYPE_COM -; - -483 if - `ad_cfig_ti -& -o --> -lmp -[ -i -], "joyr", & -ic --> -joy_i -, -joyitys - ) ) ; - -484 if - `ad_cfig_ti -& -o --> -lmp -[ -i -], "joyick_a", & -ic --> -joymode_a -, -joymodes - ) ) ; - -485 if - `ad_cfig_ti -& -o --> -lmp -[ -i -], "joyick_b", & -ic --> -joymode_b -, -joymodes - ) ) ; - -486 if - `ad_cfig_ti -& -o --> -lmp -[ -i -], "joy_a", & -ic --> -joymode_a -, -joymodes - ) ) ; - -487 if - `ad_cfig_ti -& -o --> -lmp -[ -i -], "joy_b", & -ic --> -joymode_b -, -joymodes - ) ) ; - -488 if - `ad_cfig_joykey -& -o --> -lmp -[ -i -], "kbjoy1_up", & -ic --> -kbjoy1 -[0] ) ) ; - -489 if - `ad_cfig_joykey -& -o --> -lmp -[ -i -], "kbjoy1_down", & -ic --> -kbjoy1 -[1] ) ) ; - -490 if - `ad_cfig_joykey -& -o --> -lmp -[ -i -], "kbjoy1_", & -ic --> -kbjoy1 -[2] ) ) ; - -491 if - `ad_cfig_joykey -& -o --> -lmp -[ -i -], "kbjoy1_right", & -ic --> -kbjoy1 -[3] ) ) ; - -492 if - `ad_cfig_joykey -& -o --> -lmp -[ -i -], "kbjoy1_fe1", & -ic --> -kbjoy1 -[4] ) ) ; - -493 if - `ad_cfig_joykey -& -o --> -lmp -[ -i -], "kbjoy1_fe2", & -ic --> -kbjoy1 -[5] ) ) ; - -494 if - `ad_cfig_joykey -& -o --> -lmp -[ -i -], "kbjoy2_up", & -ic --> -kbjoy2 -[0] ) ) ; - -495 if - `ad_cfig_joykey -& -o --> -lmp -[ -i -], "kbjoy2_down", & -ic --> -kbjoy2 -[1] ) ) ; - -496 if - `ad_cfig_joykey -& -o --> -lmp -[ -i -], "kbjoy2_", & -ic --> -kbjoy2 -[2] ) ) ; - -497 if - `ad_cfig_joykey -& -o --> -lmp -[ -i -], "kbjoy2_right", & -ic --> -kbjoy2 -[3] ) ) ; - -498 if - `ad_cfig_joykey -& -o --> -lmp -[ -i -], "kbjoy2_fe1", & -ic --> -kbjoy2 -[4] ) ) ; - -499 if - `ad_cfig_joykey -& -o --> -lmp -[ -i -], "kbjoy2_fe2", & -ic --> -kbjoy2 -[5] ) ) ; - -500 if - `ad_cfig_bo -& -o --> -lmp -[ -i -], "diskautove", & -ic --> -diskautove - ) ) ; - -501 if - `ad_cfig_bo -& -o --> -lmp -[ -i -], "ch376", & -ic --> -ch376_aived -) ) ; - -502 if - `ad_cfig_bo -& -o --> -lmp -[ -i -], "avdiskautobo", & -ic --> -avdiskautobo - ) ) ; - -503 if - `ad_cfig_bo -& -o --> -lmp -[ -i -], "show_keybrd", & -ic --> -show_keybrd - ) ) ; - -504 if - `ad_cfig_bo -& -o --> -lmp -[ -i -], "icky_mod_keys", & -ic --> -icky_mod_keys - ) ); - -505 if - `ad_cfig_rg -& -o --> -lmp -[ -i -], "autd_keybrd_mpg", -keym_fe -, 4096 ) ) - -507 - `ry -( -keym_th -, -FILEPREFIX -""); - -508 - `rt -( -keym_th -, -keym_fe -); - -509 -ld_keym - = -SDL_TRUE -; - -514 - `fo - -f - ); - -515 - } -} - -517  - $uge - -t - ) - -519 - `tf - -VERSION_COPYRIGHTS - "\n\n" - -541 #ifde -__OPENGL_AVAILABLE__ - - -564 #ifde -BACKEND_MODEM - - -569 #ifde -BACKEND_COM - - -577 - `ex -( -t -); - -578 - } -} - -581  - $r_tf -* -fmt -, ... ) - -583  -r -[256]; - -585 -va_li - - -; - -586 - `va_t - - -, -fmt - ); - -587 if - `vtf - -r -, 256, -fmt -, - - ) != -1 ) - -589 -r -[255] = 0; - -590 #ifde -WIN32 - - -591 - `MesgeBoxA - -NULL -, -r -, "Oricu", -MB_OK - ); - -593 - `rtf - -dr -, "%s\n", -r - ); - -596 - `va_d - - - ); - -597 - } -} - -599  -SDL_bo - - $__off -* -g -, * -ti -, -SDL_bo - * -age - ) - -601 if -ti - ) - -603 if - `rcmp - -ti -, "on" ) == 0 ) - -605 * -age - = -SDL_TRUE -; - -606  -SDL_TRUE -; - -609 if - `rcmp - -ti -, "off" ) == 0 ) - -611 * -age - = -SDL_FALSE -; - -612  -SDL_TRUE -; - -616 - `r_tf -("Pam '%s' should bflowed by '' o'off'", -g -); - -617  -SDL_FALSE -; - -618 - } -} - -620 -SDL_bo - - $ - -mache - * -ic -,  -gc -, * -gv -[] ) - -622 -St32 - -i -; - -623  -t_ts - * -o -; - -624  -t_ty -, * -t_g -, * -tmp -; - -626 -o - = - `mloc - -t_ts - ) ); - -627 if! -o - )  -SDL_FALSE -; - -630 -o --> -t_mache - = -MACH_ATMOS -; - -631 -o --> -t_mache_t - = -SDL_FALSE -; - -632 -o --> -t_diskty - = -DRV_NONE -; - -633 -o --> -t_diskty_t - = -SDL_FALSE -; - -634 -o --> -t_debug - = -SDL_FALSE -; - -635 -o --> -t_ndmode - = -RENDERMODE_SW -; - -636 -o --> -t_disk -[0] = 0; - -637 -o --> -t_ -[0] = 0; - -638 -o --> -t_syms -[0] = 0; - -639 -o --> -t_syms_cou - = 0; - -640 -o --> -t_sh -[0] = 0; - -641 -o --> -t_bakpot - = -NULL -; - -642 -ic --> -ch376_aived - = -SDL_FALSE -; - -643 -fusn - = -SDL_FALSE -; - -644 #ifde -WIN32 - - -645 -hwsur - = -SDL_TRUE -; - -647 -hwsur - = -SDL_FALSE -; - -650 - `e_u - -ic - ); - -651 - `e_mache - -ic - ); - -652 - `e_nd_sw - -ic - ); - -653 - `e_nd_sw8 - -ic - ); - -654 #ifde -__OPENGL_AVAILABLE__ - - -655 - `e_nd_gl - -ic - ); - -657 - `e_gui - -ic - ); - -659 - `kbd_ -( -ic -); - -662 if - `SDL_In - -SDL_INIT_VIDEO - | -SDL_INIT_AUDIO - ) < 0 ) - -664 - `r_tf -( "SDL init failed" ); - -665 - ` - -o - ); - -666  -SDL_FALSE -; - -668 -ed_sdl_qu - = -SDL_TRUE -; - -670 #ide -__APPLE__ - - -671 - `SDL_COMPAT_WM_SIc - - `SDL_LdBMP - -IMAGEPREFIX -"wic.bmp" ), -NULL - ); - -674 - `nd_sw_devideo - -ic - ); - -676 - `ld_cfig - -o -, -ic - ); - -678  -i -=1; i< -gc -; i++ ) - -680 -t_ty - = 0; - -681 if -gv -[ -i -][0] == '-' ) - -683  -gv -[ -i -][1] ) - -686 -t_g - = -NULL -; - -687 -tmp - = & -gv -[ -i -][2]; - -689 if - `rcmp - -tmp -, "fusn" ) =0 ) { -t_ty - = 'f'; ; } - -690 if - `rcmp - -tmp -, "wdow" ) =0 ) { -t_ty - = 'w'; ; } - -691 if - `rcmp - -tmp -, "debug" ) =0 ) { -t_ty - = 'b'; ; } - -692 if - `rcmp - -tmp -, "hwsur" ) =0 ) { -hwsur - = -SDL_TRUE -; ; } - -693 if - `rcmp - -tmp -, "swsur" ) =0 ) { -hwsur - = -SDL_FALSE -; ; } - -694 if - `rcmp - -tmp -, "hp" ) =0 ) { -t_ty - = 'h'; ; } - -696 if -i -<( -gc --1) ) - -697 -t_g - = -gv -[ -i -+1]; - -698 -i -++; - -700 if - `rcmp - -tmp -, "mache" ) =0 ) { -t_ty - = 'm'; ; } - -701 if - `rcmp - -tmp -, "disk" ) =0 ) { -t_ty - = 'd'; ; } - -702 if - `rcmp - -tmp -, "" ) =0 ) { -t_ty - = 't'; ; } - -703 if - `rcmp - -tmp -, "drive" ) =0 ) { -t_ty - = 'k'; ; } - -704 if - `rcmp - -tmp -, "symbs" ) =0 ) { -t_ty - = 's'; ; } - -705 if - `rcmp - -tmp -, "bakpot" ) =0 ) { -t_ty - = 'r'; ; } - -706 #ifde -__OPENGL_AVAILABLE__ - - -707 if - `rcmp - -tmp -, "ndmode" ) =0 ) { -t_ty - = 'R'; ; } - -711 if - `rcmp - -tmp -, "turbotape" ) == 0 ) - -713 if! - `__off - -gv -[ -i --1], -t_g -, & -ic --> -turbo - ) ) - `ex - -EXIT_FAILURE - ); - -717 if - `rcmp - -tmp -, "lightpen" ) == 0 ) - -719 if! - `__off - -gv -[ -i --1], -t_g -, & -ic --> -ligh - ) ) - `ex - -EXIT_FAILURE - ); - -723 if - `rcmp - -tmp -, "serial_address" ) == 0 ) - -725 if! -t_g - ) - -726 - `ex - -EXIT_FAILURE - ); - -727 if'$' = -t_g -[0] && 1 = - `ssnf -(t_g, "$%x", & -ic --> -acofft -) ) - -729 if'0' = -t_g -[0] && 1 = - `ssnf -(t_g, "0x%x", & -ic --> -acofft -) ) - -731 if'0' = -t_g -[0] && 1 = - `ssnf -(t_g, "0X%x", & -ic --> -acofft -) ) - -733 if1 = - `ssnf -( -t_g -, "%d", & -ic --> -acofft -) ) - -735 - `ex - -EXIT_FAILURE - ); - -738 if - `rcmp - -tmp -, "serial" ) == 0 ) - -740 -ic --> -acbackdcfg - = oric-> -acbackd - = -ACIA_TYPE_NONE -; - -741 if(! - `rcmp -("ne", -t_g -)) - -743 if(! - `rcmp -("loback", -t_g -)) - -744 -ic --> -acbackdcfg - = oric-> -acbackd - = -ACIA_TYPE_LOOPBACK -; - -745 if(! - `cmp -("modem", -t_g -, 5)) - -747 #ifde -BACKEND_MODEM - - -748 * -p - = - `rchr -( -t_g -, ':'); - -749 -ic --> -acbackdcfg - = oric-> -acbackd - = -ACIA_TYPE_MODEM -; - -750 -ic --> -acbackdcfgpt - = 0; - -751 -ic --> -acbackdcfgdoma - = 4; - -752 if( -p -) { - -753 * -p2 - = - `rchr -( -p -+1, ':'); - -754 i( -p2 -) { - -756 i( - `rcmp -( -p2 -+1, "ipv6")==0) - -757 -ic --> -acbackdcfgdoma - = 6; - -758 * -p2 - = '\0'; - -759 -ic --> -acbackdcfgpt - = - `oi -( -p -+1); - -760 * -p2 - = ':'; - -762 -ic --> -acbackdcfgpt - = - `oi -( -p -+1); - -765 if( -ic --> -acbackdcfgpt - <= 0) - -766 -ic --> -acbackdcfgpt - = -ACIA_TYPE_MODEM_DEFAULT_PORT -; - -771 #ifde -BACKEND_COM - - -772 - `y -( -ic --> -acbackdme -, -t_g -, -ACIA_BACKEND_NAME_LEN -); - -773 -ic --> -acbackdcfg - = oric-> -acbackd - = -ACIA_TYPE_COM -; - -779 if - `rcmp - -tmp -, "vsynchack" ) == 0 ) - -781 if! - `__off - -gv -[ -i --1], -t_g -, & -ic --> -vsynchack - ) ) - `ex - -EXIT_FAILURE - ); - -785 if - `rcmp - -tmp -, "scanlines" ) == 0 ) - -787 if! - `__off - -gv -[ -i --1], -t_g -, & -ic --> -sƚes - ) ) - `ex - -EXIT_FAILURE - ); - -793 -t_ty - = -gv -[ -i -][1]; - -794 -t_g - = -NULL -; - -795 i( -gv -[ -i -][2]) - -796 -t_g - = & -gv -[ -i -][2]; - -797 i -i -<( -gc --1)) - -799  -t_ty -) - -807 #ifde -__OPENGL_AVAILABLE__ - - -810 -t_g - = -gv -[ -i -+1]; - -811 -i -++; - -817  -t_ty - ) - -820 if -t_g - ) - -822 if( - `rcmp - -t_g -, "atmos" ) == 0 ) || - -823 - `rcmp - -t_g -, "a" ) == 0 )) - -825 -o --> -t_mache - = -MACH_ATMOS -; - -826 -o --> -t_mache_t - = -SDL_TRUE -; - -829 if( - `rcmp - -t_g -, "oric1" ) == 0 ) || - -830 - `rcmp - -t_g -, "1" ) == 0 )) - -832 -o --> -t_mache - = -MACH_ORIC1 -; - -833 -o --> -t_mache_t - = -SDL_TRUE -; - -836 if - `rcmp - -t_g -, "o16k" ) == 0 ) - -838 -o --> -t_mache - = -MACH_ORIC1_16K -; - -839 -o --> -t_mache_t - = -SDL_TRUE -; - -842 if( - `rcmp - -t_g -, "telestrat" ) == 0 ) || - -843 - `rcmp - -t_g -, "t" ) == 0 )) - -845 -o --> -t_mache - = -MACH_TELESTRAT -; - -846 -o --> -t_mache_t - = -SDL_TRUE -; - -849 if( - `rcmp - -t_g -, "pravetz" ) == 0 ) || - -850 - `rcmp - -t_g -, "pravetz8d" ) == 0 ) || - -851 - `rcmp - -t_g -, "p" ) == 0 )) - -853 -o --> -t_mache - = -MACH_PRAVETZ -; - -854 -o --> -t_mache_t - = -SDL_TRUE -; - -859 - `r_tf -( "Invalid machineype" ); - -860 - ` - -o - ); - -861 - `ex - -EXIT_FAILURE - ); - -866 -SDL_bo - -dr_through - = -SDL_FALSE -; - -867 if -t_g - ) - -869  - `de_image_ty -( -t_g -)) - -871  -IMG_ATMOS_MICRODISC -: - -872  -IMG_ATMOS_JASMIN -: - -873  -IMG_TELESTRAT_DISK -: - -874  -IMG_PRAVETZ_DISK -: - -875  -IMG_GUESS_MICRODISC -: - -876 - `tf -("'%s' smtbdisk image.\n", -t_g -); - -877 -dr_through - = -SDL_TRUE -; - -880  -IMG_SNAPSHOT -: - -881 - `tf -("'%s' smtbsh fe.\n", -t_g -); - -882 - `y - -o --> -t_sh -, -t_g -, 1024); - -883 -o --> -t_sh -[1023] = 0; - -886  -IMG_TAPE -: - -888 - `y - -o --> -t_ -, -t_g -, 1024 ); - -889 -o --> -t_ -[1023] = 0; - -893 - `r_tf -( "Noape image specified" ); - -894 - ` - -o - ); - -895 - `ex - -EXIT_FAILURE - ); - -898 i(! -dr_through -) - -903 if -t_g - ) - -905 - `y - -o --> -t_disk -, -t_g -, 1024 ); - -906 -o --> -t_disk -[1023] = 0; - -907  - `de_image_ty -( -o --> -t_disk -)) - -909  -IMG_ATMOS_MICRODISC -: - -910 i(! -o --> -t_mache_t -o-> -t_mache - = -MACH_ATMOS -; - -911 i(! -o --> -t_diskty_t -o-> -t_diskty - = -DRV_MICRODISC -; - -914  -IMG_ATMOS_JASMIN -: - -915 i(! -o --> -t_mache_t -o-> -t_mache - = -MACH_ATMOS -; - -916 i(! -o --> -t_diskty_t -o-> -t_diskty - = -DRV_JASMIN -; - -919  -IMG_TELESTRAT_DISK -: - -920 i(! -o --> -t_mache_t -o-> -t_mache - = -MACH_TELESTRAT -; - -921 i(! -o --> -t_diskty_t -o-> -t_diskty - = -DRV_MICRODISC -; - -924  -IMG_PRAVETZ_DISK -: - -925 i(! -o --> -t_mache_t -o-> -t_mache - = -MACH_PRAVETZ -; - -926 i(! -o --> -t_diskty_t -o-> -t_diskty - = -DRV_PRAVETZ -; - -929  -IMG_GUESS_MICRODISC -: - -930 i(! -o --> -t_diskty_t -o-> -t_diskty - = -DRV_MICRODISC -; - -933  -IMG_TAPE -: - -934 - `tf -("'%s' smtb image.\n", -o --> -t_disk -); - -935 - `ry -( -o --> -t_ -, sto-> -t_disk -); - -936 -o --> -t_disk -[0] = 0; - -939  -IMG_SNAPSHOT -: - -940 - `tf -("'%s' smtbsh fe.\n", -t_g -); - -941 - `y - -o --> -t_sh -, -t_g -, 1024); - -942 -o --> -t_sh -[1023] = 0; - -946 - `r_tf -( "No disk image specified" ); - -947 - ` - -o - ); - -948 - `ex - -EXIT_FAILURE - ); - -953 if -t_g - ) - -955 if( - `rcmp - -t_g -, "microdisc" ) == 0 ) || - -956 - `rcmp - -t_g -, "m" ) == 0 )) - -958 -o --> -t_diskty - = -DRV_MICRODISC -; - -959 -o --> -t_diskty_t - = -SDL_TRUE -; - -962 if( - `rcmp - -t_g -, "jasmin" ) == 0 ) || - -963 - `rcmp - -t_g -, "j" ) == 0 )) - -965 -o --> -t_diskty - = -DRV_JASMIN -; - -966 -o --> -t_diskty_t - = -SDL_TRUE -; - -969 if( - `rcmp - -t_g -, "pravetz" ) == 0 ) || - -970 - `rcmp - -t_g -, "p" ) == 0 )) - -972 -o --> -t_diskty - = -DRV_PRAVETZ -; - -973 -o --> -t_diskty_t - = -SDL_TRUE -; - -976 if( - `rcmp - -t_g -, "none" ) == 0 ) || - -977 - `rcmp - -t_g -, "n" ) == 0 )) - -979 -o --> -t_diskty - = -DRV_NONE -; - -980 -o --> -t_diskty_t - = -SDL_FALSE -; - -985 - `r_tf -( "Invalid driveype" ); - -986 - ` - -o - ); - -987 - `ex - -EXIT_FAILURE - ); - -991 if -t_g - ) - -993 if -o --> -t_syms_cou - < 32 ) - -995 * -w_syms - = - `rdup - -t_g - ); - -996 if -NULL - ! -w_syms - ) - -997 -o --> -t_syms_fes -[o-> -t_syms_cou -++] = -w_syms -; - -1000 - `r_tf -( "No symbols file specified" ); - -1001 - ` - -o - ); - -1002 - `ex - -EXIT_FAILURE - ); - -1007 -fusn - = -SDL_TRUE -; - -1011 -fusn - = -SDL_FALSE -; - -1015 -o --> -t_debug - = -SDL_TRUE -; - -1019 if -t_g - ) - -1021 -o --> -t_bakpot - = -t_g -; - -1025 - `r_tf -( "Breakpointddress or symbolxpected" ); - -1026 - ` - -o - ); - -1027 - `ex - -EXIT_FAILURE - ); - -1031 #ifde -__OPENGL_AVAILABLE__ - - -1033 if -t_g - ) - -1035 if - `rcmp - -t_g -, "so" ) =0 ) { -o --> -t_ndmode - = -RENDERMODE_SW -; ; } - -1036 if - `rcmp - -t_g -, "ݒgl" ) =0 ) { -o --> -t_ndmode - = -RENDERMODE_GL -; ; } - -1039 - `r_tf -( "Invalidender mode" ); - -1040 - ` - -o - ); - -1041 - `ex - -EXIT_FAILURE - ); - -1046 - ` - -o - ); - -1047 - `uge - -EXIT_SUCCESS - ); - -1053  - `de_image_ty -( -gv -[ -i -])) - -1055  -IMG_SNAPSHOT -: - -1056 - `y - -o --> -t_sh -, -gv -[ -i -], 1024); - -1057 -o --> -t_sh -[1023] = 0; - -1060  -IMG_ATMOS_MICRODISC -: - -1061 i(! -o --> -t_mache_t -o-> -t_mache - = -MACH_ATMOS -; - -1062 i(! -o --> -t_diskty_t -o-> -t_diskty - = -DRV_MICRODISC -; - -1063 - `y - -o --> -t_disk -, -gv -[ -i -], 1024 ); - -1064 -o --> -t_disk -[1023] = 0; - -1067  -IMG_ATMOS_JASMIN -: - -1068 i(! -o --> -t_mache_t -o-> -t_mache - = -MACH_ATMOS -; - -1069 i(! -o --> -t_diskty_t -o-> -t_diskty - = -DRV_JASMIN -; - -1070 - `y - -o --> -t_disk -, -gv -[ -i -], 1024 ); - -1071 -o --> -t_disk -[1023] = 0; - -1074  -IMG_TELESTRAT_DISK -: - -1075 i(! -o --> -t_mache_t -o-> -t_mache - = -MACH_TELESTRAT -; - -1076 i(! -o --> -t_diskty_t -o-> -t_diskty - = -DRV_MICRODISC -; - -1077 - `y - -o --> -t_disk -, -gv -[ -i -], 1024 ); - -1078 -o --> -t_disk -[1023] = 0; - -1081  -IMG_PRAVETZ_DISK -: - -1082 i(! -o --> -t_mache_t -o-> -t_mache - = -MACH_PRAVETZ -; - -1083 i(! -o --> -t_diskty_t -o-> -t_diskty - = -DRV_PRAVETZ -; - -1084 - `y - -o --> -t_disk -, -gv -[ -i -], 1024 ); - -1085 -o --> -t_disk -[1023] = 0; - -1088  -IMG_GUESS_MICRODISC -: - -1089 i(! -o --> -t_diskty_t -o-> -t_diskty - = -DRV_MICRODISC -; - -1090 - `y - -o --> -t_disk -, -gv -[ -i -], 1024 ); - -1091 -o --> -t_disk -[1023] = 0; - -1094  -IMG_TAPE -: - -1095 - `y -( -o --> -t_ -, -gv -[ -i -], 1024); - -1096 -o --> -t_ -[1023] = 0; - -1100 - ` - -o - ); - -1101 - `uge - -EXIT_FAILURE - ); - -1106 - `ld_diskroms - -ic - ); - -1108 if -o --> -t_disk -[0] ) && ( sto-> -t_diskty - = -DRV_NONE - ) ) - -1109 -o --> -t_diskty - = -DRV_MICRODISC -; - -1111  -i -=0; i<8; i++ ) -ϡamimes -[i] = 0; - -1112 -amimve - = 0; - -1114 - `tovock - -ic -, -NULL -, 0 ); - -1115 if! - `_gui - -ic -, -o --> -t_ndmode - ) ) { - ` -С);  -SDL_FALSE -; } - -1116 if! - `_feque - -ic - ) ) { - ` - -o - );  -SDL_FALSE -; } - -1117 if! - `_msgbox - -ic - ) ) { - ` - -o - );  -SDL_FALSE -; } - -1118 -ic --> -drivy - = -o --> -t_diskty -; - -1119 if! - `_u - -ic - ) ) { - ` - -o - );  -SDL_FALSE -; } - -1120 if! - `_joy - -ic - ) ) { - ` - -o - );  -SDL_FALSE -; } - -1121 if! - `_mache - -ic -, -o --> -t_mache -, -SDL_TRUE - ) ) { - ` -С);  -SDL_FALSE -; } - -1123 if -o --> -t_disk -[0] ) - -1125 - `diskimage_ld - -ic -, -o --> -t_disk -, 0 ); - -1126  -ic --> -drivy -) - -1128  -DRV_PRAVETZ -: - -1129 - `avdiskbo - -ic - ); - -1132  -DRV_JASMIN -: - -1133 -ic --> -auto_jasm_t - = -SDL_TRUE -; - -1137 if -o --> -t_ -[0] ) - -1139 if - `_ld_p - -ic -, -o --> -t_ - ) ) - -1140 - `queuekeys -( "CLOAD\"\"\x0d" ); - -1143 - `m_ - -ic - ); - -1144 if -o --> -t_syms -[0] ) - -1145 - `m_w_symbs -& -ic --> -ursyms -, oric, -o --> -t_syms -, -SYM_BESTGUESS -, -SDL_TRUE -, SDL_TRUE ); - -1147  -i -=0; i< -o --> -t_syms_cou -; i++ ) - -1149 if -NULL -!= -o --> -t_syms_fes -[ -i -] ) - -1151 - `m_w_symbs -& -ic --> -ursyms -, oric, -o --> -t_syms_fes -[ -i -], -SYM_BESTGUESS -, -SDL_TRUE -, SDL_TRUE ); - -1152 - ` -( -o --> -t_syms_fes -[ -i -]); - -1153 -o --> -t_syms_fes -[ -i -] = -NULL -; - -1156 -o --> -t_syms_cou - = 0; - -1158 if -o --> -t_bakpot - ) - -1160 if -o --> -t_bakpot -[0] == ':' ) - -1162 -SDL_bo - -ednd - = -SDL_FALSE -; - -1163  -bsbuf -[32]; - -1164 * - - = -o --> -t_bakpot - + 1; - -1165 -FILE -* -f - = - `fݒ - - -, "rt" ); - -1166 if! -f - ) - -1168 - `r_tf -( "Invalid breakpoint file" ); - -1169 - ` - -o - ); - -1170  -SDL_FALSE -; - -1172  ! - `of - -f - ) ) - -1174 * -p -; - -1175 if! - `fgs - -bsbuf -, 32, -f - ) ) ; - -1176 -bsbuf -[31] = 0; - -1177  -NULL - !( -p - = - `rchr - -bsbuf -, '\r' )) ) *p = 0; - -1178  -NULL - !( -p - = - `rchr - -bsbuf -, '\n' )) ) *p = 0; - -1179  -NULL - !( -p - = - `rchr - -bsbuf -, '\t' )) ) *p = ' '; - -1180 -p - = -bsbuf -; - -1181  * -p - && - `isws -( *p ) )++; - -1182 if* -p - ) - `m_cmd - -bsbuf -, -ic -, & -ednd - ); - -1184 - `fo - -f - ); - -1188  -i - = 0; - -1189  -addr -; - -1190 if! - `m_gnum - -ic -, & -addr -, -o --> -t_bakpot -, & -i -, -SDL_FALSE -, SDL_FALSE, SDL_FALSE, -SDL_TRUE - ) ) - -1192 - `r_tf -( "Invalid breakpoint" ); - -1193 - ` - -o - ); - -1194  -SDL_FALSE -; - -1197 -ic --> -u -. -bakpots -[0] = -addr -; - -1198 -ic --> -u -. -ybp - = -SDL_TRUE -; - -1202 if -o --> -t_sh -[0] ) - -1203 - `ld_sh - -ic -, -o --> -t_sh - ); - -1205 if -o --> -t_debug - ) - -1206 - `mumode - -ic -, -NULL -, -EM_DEBUG - ); - -1208 - ` - -o - ); - -1209  -SDL_TRUE -; - -1210 - } -} - -1212  - $shut - -mache - * -ic - ) - -1214 if -vidp - ) - `avi_o -( &vidcap ); - -1215 #i - `defed -( -DEBUG_CPU_TRACE -) && DEBUG_CPU_TRACE > 0 - -1216 - `dump_ua -( -ic -); - -1218 if -ic - ) - -1220 - `shut_mache - -ic - ); - -1221 - `shut_joy - -ic - ); - -1222 - `shut_u - -ic - ); - -1223 - `m_shut - -ic - ); - -1224 - `shut_feque - -ic - ); - -1225 - `shut_msgbox - -ic - ); - -1226 - `shut_gui - -ic - ); - -1228 if -ed_sdl_qu - ) - `SDL_COMPAT_Qu -(); - -1229 - } -} - -1231  - $amo_ovock - -mache - * -ic -, -SDL_bo - * -amede -, SDL_bo * -ednd - ) - -1233  -lo -, -cyes -; - -1235  ( !(* -amede -&& ( !(* -ednd -) ) ) - -1237  -ic --> -u -. -cyes - > 0 ) - -1240  -lo -=0, -cyes -=0; inlo < -ic --> -ovockmu -; instloop++ ) - -1242 if - `m6502_t_icyes -& -ic --> -u -, -SDL_TRUE -, -m_bpmsg - ) ) - -1245 - `mumode - -ic -, -NULL -, -EM_DEBUG - ); - -1246 * -ednd - = -SDL_TRUE -; - -1250 -cyes - + -ic --> -u -. -icyes -; - -1251 - `_tches - -ic - ); - -1253 if -lo - < ( -ic --> -ovockmu --1) ) - -1255 i( - `m6502_ -& -ic --> -u - )) - -1261 -cyes - >> -ic --> -ovockshi -; - -1264 - `v_ock -& -ic --> -v -, -cyes - ); - -1265 - `ay_ticktock -& -ic --> -ay -, -cyes - ); - -1266 if(( -ic --> -drivy - = -DRV_MICRODISC -|| (ic->drivy = -DRV_JASMIN -) - `wd17xx_ticktock -&ic-> -wddisk -, -cyes - ); - -1267 if -ic --> -ty - = -MACH_TELESTRAT - ) - -1269 - `v_ock -& -ic --> -_v -, -cyes - ); - -1271 if -ic --> -acbackd - ) - -1272 - `ac_ock -& -ic --> -_ac -, -cyes - ); - -1274 -ic --> -u -. -cyes - - -cyes -; - -1278 if -ic --> -emu_mode - ! -EM_RUNNING - ) ; - -1279 if - `m6502_ -& -ic --> -u - ) ) - -1282 - `m_tf_above -"Opcod%02Xxecud%04X", -ic --> -u -. -lc -, oric->u. -ϡpc - ); - -1283 - `mumode - -ic -, -NULL -, -EM_DEBUG - ); - -1284 * -ednd - = -SDL_TRUE -; - -1289 if -ic --> -u -. -cyes - <= 0 ) - -1291 * -amede - = - `u_da - -ic - ); - -1292 -ic --> -u -. -cyes - +ic-> -cye -; - -1295 - } -} - -1297  - $amo_nm - -mache - * -ic -, -SDL_bo - * -amede -, SDL_bo * -ednd - ) - -1299  ( !(* -amede -&& ( !(* -ednd -) ) ) - -1301  -ic --> -u -. -cyes - > 0 ) - -1303 if - `m6502_t_icyes -& -ic --> -u -, -SDL_TRUE -, -m_bpmsg - ) ) - -1306 - `mumode - -ic -, -NULL -, -EM_DEBUG - ); - -1307 * -ednd - = -SDL_TRUE -; - -1311 - `_tches - -ic - ); - -1312 - `v_ock -& -ic --> -v -, oric-> -u -. -icyes - ); - -1313 - `ay_ticktock -& -ic --> -ay -, oric-> -u -. -icyes - ); - -1314 if(( -ic --> -drivy - = -DRV_MICRODISC -|| (ic->drivy = -DRV_JASMIN -) - `wd17xx_ticktock -&ic-> -wddisk -, oric-> -u -. -icyes - ); - -1315 if -ic --> -ty - = -MACH_TELESTRAT - ) - -1317 - `v_ock -& -ic --> -_v -, oric-> -u -. -icyes - ); - -1319 if -ic --> -acbackd - ) - -1320 - `ac_ock -& -ic --> -_ac -, oric-> -u -. -icyes - ); - -1322 -ic --> -u -. -cyes - -ic->u. -icyes -; - -1323 if - `m6502_ -& -ic --> -u - ) ) - -1326 - `m_tf_above -"Opcod%02Xxecud%04X", -ic --> -u -. -lc -, oric->u. -ϡpc - ); - -1327 - `mumode - -ic -, -NULL -, -EM_DEBUG - ); - -1328 * -ednd - = -SDL_TRUE -; - -1333 if -ic --> -u -. -cyes - <= 0 ) - -1335 * -amede - = - `u_da - -ic - ); - -1336 -ic --> -u -. -cyes - +ic-> -cye -; - -1339 - } -} - -1342  - $_r_ame - -mache - * -ic - ) - -1344  -i -; - -1346 if -ic --> -diskautove - ) - -1348  -i -=0; i<4; i++ ) - -1350 if -ic --> -wddisk -. -disk -[ -i -] ) && ( oric->wddisk.disk[i]-> -modifd - ) ) - -1352 -ic --> -wddisk -. -disk -[ -i -]-> -modifd_time -++; - -1353 if -ic --> -wddisk -. -disk -[ -i -]-> -modifd_time - >= 20 ) - -1355 - `diskimage_ve - -ic -, oric-> -wddisk -. -disk -[ -i -]-> -fame -, i ); - -1360 - } -} - -1362  - $ma - -gc -, * -gv -[] ) - -1364  -mache - -ic -; - -1365 -SDL_bo - -is -; - -1367 #ifde -_MSC_VER - - -1368 - `_CSDbgFg -( -_CRTDBG_ALLOC_MEM_DF - | -_CRTDBG_LEAK_CHECK_DF -); - -1372 #ide -__MORPHOS__ - - -1373 - `punv -("SDL_VIDEO_CENTERED=center"); - -1376 - `memt -(& -ic -, 0, (oric)); - -1380 #ifde -__APPLE__ - - -1381 -CFBundRef - -maBund - = - `CFBundGMaBund -(); - -1382 -CFURLRef - -soursURL - = - `CFBundCyResoursDeyURL -( -maBund -); - -1383  -th -[ -PATH_MAX -]; - -1384 i(! - `CFURLGFeSyemRi -( -soursURL -, -TRUE -, ( -UI8 - *) -th -, -PATH_MAX -)) - -1388 - `CFR -( -soursURL -); - -1391 - `rt -( -th -, "/../../.."); - -1392 - `chd -( -th -); - -1396 if -is - = - ` -& -ic -, -gc -, -gv - ) ) ) - -1398 -Ut64 - -xtame_us -; - -1399 -Ut32 - -xtame_ms -, -now -=0, -th -; - -1400 -SDL_bo - -de -, -ednd -, -amede -; - -1401 -St32 - -i -; - -1403 -now - = - `SDL_GTicks -(); - -1404 -xtame_ms - = -now -; - -1405 -xtame_us - = (( -Ut64 -) -xtame_ms -)*1000; - -1407 -de - = -SDL_FALSE -; - -1408 -ednd - = -SDL_TRUE -; - -1409 -amede - = -SDL_FALSE -; - -1411 if( -ld_keym -) - -1413 - `ld_keybrd_mpg -& -ic -, -keym_th - ); - -1414 -ld_keym - = -SDL_FALSE -; - -1417  ! -de - ) - -1419 -SDL_Evt - -evt -; - -1421 if -ic -. -emu_mode - = -EM_PLEASEQUIT - ) - -1424 if -ic -. -emu_mode - = -EM_RUNNING - ) - -1426 if -ic -. -ovockmu -==1 ) - -1427 - `amo_nm -& -ic -, & -amede -, & -ednd - ); - -1429 - `amo_ovock -& -ic -, & -amede -, & -ednd - ); - -1431 - `ay_uockaudio -& -ic -. -ay - ); - -1433 if -amede - ) - -1435 -xtame_us - + -ic -. -vid_eq - ? 20000LL : 16667LL; - -1436 -xtame_ms - = ( -Ut32 -)( -xtame_us -/1000LL); - -1438 i( -wpd -) - -1440 i(( -ic -. -ames -&3)==0) - -1441 -ednd - = -SDL_TRUE -; - -1445 -ednd - = -SDL_TRUE -; - -1449 if -ednd - ) - -1451 - `nd -& -ic - ); - -1452 -ednd - = -SDL_FALSE -; - -1455 if -amede - ) - -1457 - `_r_ame -& -ic - ); - -1459 -th - = -now -; - -1460 -now - = - `SDL_GTicks -(); - -1462 -amimve - = 0; - -1463  -i -=( -FRAMES_TO_AVERAGE --1); i>0; i-- ) - -1465 -ϡamimes -[ -i -] =astframetimes[i-1]; - -1466 -amimve - + -ϡamimes -[ -i -]; - -1468 -ϡamimes -[0] = -now -- -th -; - -1469 -amimve - = (amimve+ -ϡamimes -[0])/ -FRAMES_TO_AVERAGE -; - -1471 i( -wpd -) - -1473 -xtame_ms - = -now -; - -1474 -xtame_us - = (( -Ut64 -) -xtame_ms -)*1000; - -1478 i( -now - > -xtame_ms -) - -1480 -xtame_ms - = -now -; - -1481 -xtame_us - = (( -Ut64 -) -xtame_ms -)*1000; - -1485 - `SDL_Day -( -xtame_ms -- -now -); - -1488 -amede - = -SDL_FALSE -; - -1491 if! - `SDL_PlEvt -& -evt - ) ) ; - -1495 - `ay_uockaudio -& -ic -. -ay - ); - -1496 if -ednd - ) - -1498 - `nd -& -ic - ); - -1499 -ednd - = -SDL_FALSE -; - -1501 if! - `SDL_WaEvt -& -evt - ) ) ; - -1505  -evt -. -ty - ) - -1507  -SDL_COMPAT_ACTIVEEVENT -: - -1509 if( - `SDL_COMPAT_IsAAive -(& -evt -)) - -1511 -ic -. - `shut_nd -(&oric); - -1512 -ic -. - `_nd -(&oric); - -1513 -ednd - = -SDL_TRUE -; - -1517  -SDL_QUIT -: - -1518 -de - = -SDL_TRUE -; - -1522  -ic -. -emu_mode - ) - -1524  -EM_MENU -: - -1525 -de - | - `mu_evt -& -evt -, & -ic -, & -ednd - ); - -1528  -EM_RUNNING -: - -1529 -de - | - `emu_evt -& -evt -, & -ic -, & -ednd - ); - -1532  -EM_DEBUG -: - -1533 -de - | - `m_evt -& -evt -, & -ic -, & -ednd - ); - -1537 i( -ic -. -show_keybrd -) - -1538 - `keybrd_evt -& -evt -, & -ic -, & -ednd - ); - -1540 }  - `SDL_PlEvt -& -evt - ) ); - -1542 - `ay_uockaudio -& -ic -. -ay - ); - -1544 - `shut -& -ic - ); - -1546  -is - ? -EXIT_SUCCESS - : -EXIT_FAILURE -; - -1547 - } -} - - @main.h - -21 -SDL_bo - -ad_cfig_rg -* -buf -, * -tok -, * -de -, -St32 - -maxn - ); - -22 -SDL_bo - -ad_cfig_bo -* -buf -, * -tok -, SDL_bo * -de - ); - -23 -SDL_bo - -ad_cfig_ti -* -buf -, * -tok -, -St32 - * -de -, ** -tis - ); - -24 -SDL_bo - -ad_cfig_t -* -buf -, * -tok -, * -de -,  -m -,  -max - ); - - @monitor.c - -22  - #MAX_CONS_INPUT - 127 - -23  - #MAX_ASM_INPUT - 36 - - ) - -24  - #CONS_WIDTH - 46 - -25 - - ) - -26  - ~ - -27  - ~ - -28  - ~ - -29  - ~ - -30  - ~ - -32  - ~"syem.h -" - -33 #unde -REG_PC - - -34  - #REG_PC - -_REG_PC - - - ) - -35  - ~"6502.h -" - -36  - ~"v.h -" - -37  - ~"8912.h -" - -38  - ~"gui.h -" - -39  - ~"disk.h -" - -40  - ~"mڙ.h -" - -41  - ~"6551.h -" - -42  - ~"mache.h -" - -43  - ~"u.h -" - -44  - ~".h -" - -45  - ~"sh.h -" - -47  - #LOG_DEBUG - 0 - - ) - -49 #i -LOG_DEBUG - - -50 #i -defed -( -__amigaos4__ -|| defed( -__MORPHOS__ -) - -51 * - gdebug_logme - = "RAM:debug.log"; - -53 * - gdebug_logme - = "debug_log.txt"; - -55 -FILE - * - gdebug_logfe - = -NULL -; - -58  - sdisf - - -60 * - mme -; - -61  - mamode -; - -64  - sasmf - - -66 * - mme -; - -67  - mimp -, - mimm -, - mzp -, - mzpx -, - mzpy -, - mabs -, - mabx -, - maby -, - mzix -, - mziy -, - ml -, - md -; - -70  - sick - - -72  - mx -, - my -, - mtime -; - -75  -ick - - gick -[2]; - -77  -xtze - * -tz -[]; - -78  -vtmp -[]; - -79  -th -[], -fmp -[]; - -80 -SDL_bo - -eshus -; - -82  - gdimp -[128]; - -83  - gdiddrs -[10]; - -84  - gibuf -[128], - gϡcmd -; - -85  - ghiy -[10][128]; - -86  - g -, - goff -=0, - gcursx -, - ghiu -=0, - ghip -=-1; - -87  - gm_addr -, - gm_asmmode - = -SDL_FALSE -; - -88  -SDL_bo - - gkshied - = -SDL_FALSE -, - gupdvw - = SDL_FALSE; - -89  - ghpcou -=0; - -91  -symbޏb - - gdeusyms -; - -93  - gm_bpmsg -[80]; - -95  -SDL_bo - - gmw_l - = -SDL_FALSE -; - -96  - gmw_which - = 0; - -97  - gmw_addr -[2]; - -98  - gmw_mode -=0, - gmw_koffs -=0; - -99  - gmw_ibuf -[8]; - -100  - gmwch_d -[65536]; - -101  -SDL_bo - - gmwch_dvid - = -SDL_FALSE -; - -102  -m6502 - - gu_d -; - -103  - gvid_d -, - games_d -; - -104  -SDL_bo - - gu_dvid - = -SDL_FALSE -; - -105  -ay8912 - - gay_d -; - -106  -SDL_bo - - gay_dvid - = -SDL_FALSE -; - -107  -v - - gv_d -; - -108  -SDL_bo - - gv_dvid - = -SDL_FALSE -; - -109  -v - - gv2_d -; - -110  -SDL_bo - - gv2_dvid - = -SDL_FALSE -; - -111  -SDL_bo - - gmodifd - = -SDL_FALSE -; - -114  -msym - - gdefsym_ -[] = { { 0x0300, 0, "VIA_IORB" , "VIA_IORB" , "VIA_IORB" }, - -159  -msym - - gdefsym_mos -[] = { { 0x0300, 0, "VIA_IORB" , "VIA_IORB" , "VIA_IORB" }, - -175 { 0xc000, -SYMF_ROMDIS0 -, "ROMStart" , "ROMStart" , "ROMStart" }, - -176 { 0xc000, -SYMF_ROMDIS1 -, "Overlay" , "Overlay" , "Overlay" } }; - -180 - mMSHOW_VIA -=0, - -181 - mMSHOW_VIA2 -, - -182 - mMSHOW_AY -, - -183 - mMSHOW_DISK -, - -184 - mMSHOW_LAST - - -189 - mCSHOW_CONSOLE -=0, - -190 - mCSHOW_DEBUG -, - -191 - mCSHOW_MWATCH -, - -192 - mCSHOW_LAST - - -195  - gmshow -, - gcshow -; - -199 - mREG_A -=0, - -200 - mREG_X -, - -201 - mREG_Y -, - -202 - mREG_PC -, - -203 - mREG_SP -, - -204 - mREG_VIA_PCR -, - -205 - mREG_VIA_ACR -, - -206 - mREG_VIA_SR -, - -207 - mREG_VIA_IFR -, - -208 - mREG_VIA_IER -, - -209 - mREG_VIA_IRA -, - -210 - mREG_VIA_ORA -, - -211 - mREG_VIA_DDRA -, - -212 - mREG_VIA_IRB -, - -213 - mREG_VIA_ORB -, - -214 - mREG_VIA_DDRB -, - -215 - mREG_VIA_T1L -, - -216 - mREG_VIA_T1C -, - -217 - mREG_VIA_T2L -, - -218 - mREG_VIA_T2C -, - -219 - mREG_VIA_CA1 -, - -220 - mREG_VIA_CA2 -, - -221 - mREG_VIA_CB1 -, - -222 - mREG_VIA_CB2 - - -227 - mAM_IMP -=0, - -228 - mAM_IMM -, - -229 - mAM_ZP -, - -230 - mAM_ZPX -, - -231 - mAM_ZPY -, - -232 - mAM_ABS -, - -233 - mAM_ABX -, - -234 - mAM_ABY -, - -235 - mAM_ZIX -, - -236 - mAM_ZIY -, - -237 - mAM_REL -, - -238 - mAM_IND - - -241  - #AMF_IMP - (1<< -AM_IMP -) - - ) - -242  - #AMF_IMM - (1<< -AM_IMM -) - - ) - -243  - #AMF_ZP - (1<< -AM_ZP -) - - ) - -244  - #AMF_ZPX - (1<< -AM_ZPX -) - - ) - -245  - #AMF_ZPY - (1<< -AM_ZPY -) - - ) - -246  - #AMF_ABS - (1<< -AM_ABS -) - - ) - -247  - #AMF_ABX - (1<< -AM_ABX -) - - ) - -248  - #AMF_ABY - (1<< -AM_ABY -) - - ) - -249  - #AMF_ZIX - (1<< -AM_ZIX -) - - ) - -250  - #AMF_ZIY - (1<< -AM_ZIY -) - - ) - -251  - #AMF_REL - (1<< -AM_REL -) - - ) - -252  - #AMF_IND - (1<< -AM_IND -) - - ) - -255  -asmf - - gasmb -[] = { { "BRK", 0x00, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, - -336 { -NULL -, } }; - -338  -disf - - gdiab -[] = { { "BRK", -AM_IMM - }, - -339 { "ORA", -AM_ZIX - }, - -340 { "JAM", -AM_IMP - }, - -341 { "SLO", -AM_ZIX - }, - -342 { "DOP", -AM_ZP - }, - -343 { "ORA", -AM_ZP - }, - -344 { "ASL", -AM_ZP - }, - -345 { "SLO", -AM_ZP - }, - -346 { "PHP", -AM_IMP - }, - -347 { "ORA", -AM_IMM - }, - -348 { "ASL", -AM_IMP - }, - -349 { "ANC", -AM_IMM - }, - -350 { "TOP", -AM_IMP - }, - -351 { "ORA", -AM_ABS - }, - -352 { "ASL", -AM_ABS - }, - -353 { "SLO", -AM_ABS - }, - -354 { "BPL", -AM_REL - }, - -355 { "ORA", -AM_ZIY - }, - -356 { "JAM", -AM_IMP - }, - -357 { "SLO", -AM_ZIY - }, - -358 { "DOP", -AM_ZPX - }, - -359 { "ORA", -AM_ZPX - }, - -360 { "ASL", -AM_ZPX - }, - -361 { "SLO", -AM_ZPX - }, - -362 { "CLC", -AM_IMP - }, - -363 { "ORA", -AM_ABY - }, - -364 { "NOP", -AM_IMP - }, - -365 { "SLO", -AM_ABY - }, - -366 { "TOP", -AM_ABX - }, - -367 { "ORA", -AM_ABX - }, - -368 { "ASL", -AM_ABX - }, - -369 { "SLO", -AM_IMP - }, - -370 { "JSR", -AM_ABS - }, - -371 { "AND", -AM_ZIX - }, - -372 { "JAM", -AM_IMP - }, - -373 { "RLA", -AM_ZIX - }, - -374 { "BIT", -AM_ZP - }, - -375 { "AND", -AM_ZP - }, - -376 { "ROL", -AM_ZP - }, - -377 { "RLA", -AM_ZP - }, - -378 { "PLP", -AM_IMP - }, - -379 { "AND", -AM_IMM - }, - -380 { "ROL", -AM_IMP - }, - -381 { "ANC", -AM_IMP - }, - -382 { "BIT", -AM_ABS - }, - -383 { "AND", -AM_ABS - }, - -384 { "ROL", -AM_ABS - }, - -385 { "RLA", -AM_ABS - }, - -386 { "BMI", -AM_REL - }, - -387 { "AND", -AM_ZIY - }, - -388 { "JAM", -AM_IMP - }, - -389 { "RLA", -AM_ZIY - }, - -390 { "DOP", -AM_ZPX - }, - -391 { "AND", -AM_ZPX - }, - -392 { "ROL", -AM_ZPX - }, - -393 { "RLA", -AM_ZPX - }, - -394 { "SEC", -AM_IMP - }, - -395 { "AND", -AM_ABY - }, - -396 { "NOP", -AM_IMP - }, - -397 { "RLA", -AM_ABY - }, - -398 { "TOP", -AM_ABX - }, - -399 { "AND", -AM_ABX - }, - -400 { "ROL", -AM_ABX - }, - -401 { "RLA", -AM_ABX - }, - -402 { "RTI", -AM_IMP - }, - -403 { "EOR", -AM_ZIX - }, - -404 { "JAM", -AM_IMP - }, - -405 { "SRE", -AM_ZIX - }, - -406 { "DOP", -AM_ZP - }, - -407 { "EOR", -AM_ZP - }, - -408 { "LSR", -AM_ZP - }, - -409 { "SRE", -AM_ZP - }, - -410 { "PHA", -AM_IMP - }, - -411 { "EOR", -AM_IMM - }, - -412 { "LSR", -AM_IMP - }, - -413 { "ALR", -AM_IMM - }, - -414 { "JMP", -AM_ABS - }, - -415 { "EOR", -AM_ABS - }, - -416 { "LSR", -AM_ABS - }, - -417 { "SRE", -AM_ABS - }, - -418 { "BVC", -AM_REL - }, - -419 { "EOR", -AM_ZIY - }, - -420 { "JAM", -AM_IMP - }, - -421 { "SRE", -AM_ZIY - }, - -422 { "DOP", -AM_ZPX - }, - -423 { "EOR", -AM_ZPX - }, - -424 { "LSR", -AM_ZPX - }, - -425 { "SRE", -AM_ZPX - }, - -426 { "CLI", -AM_IMP - }, - -427 { "EOR", -AM_ABY - }, - -428 { "NOP", -AM_IMP - }, - -429 { "SRE", -AM_ABY - }, - -430 { "TOP", -AM_ABX - }, - -431 { "EOR", -AM_ABX - }, - -432 { "LSR", -AM_ABX - }, - -433 { "SRE", -AM_ABX - }, - -434 { "RTS", -AM_IMP - }, - -435 { "ADC", -AM_ZIX - }, - -436 { "JAM", -AM_IMP - }, - -437 { "RRA", -AM_ZIX - }, - -438 { "DOP", -AM_IMP - }, - -439 { "ADC", -AM_ZP - }, - -440 { "ROR", -AM_ZP - }, - -441 { "RRA", -AM_ZP - }, - -442 { "PLA", -AM_IMP - }, - -443 { "ADC", -AM_IMM - }, - -444 { "ROR", -AM_IMP - }, - -445 { "ARR", -AM_IMM - }, - -446 { "JMP", -AM_IND - }, - -447 { "ADC", -AM_ABS - }, - -448 { "ROR", -AM_ABS - }, - -449 { "RRA", -AM_ABS - }, - -450 { "BVS", -AM_REL - }, - -451 { "ADC", -AM_ZIY - }, - -452 { "JAM", -AM_IMP - }, - -453 { "RRA", -AM_ZIY - }, - -454 { "DOP", -AM_ZPX - }, - -455 { "ADC", -AM_ZPX - }, - -456 { "ROR", -AM_ZPX - }, - -457 { "RRA", -AM_ZPX - }, - -458 { "SEI", -AM_IMP - }, - -459 { "ADC", -AM_ABY - }, - -460 { "NOP", -AM_IMP - }, - -461 { "RRA", -AM_ABY - }, - -462 { "TOP", -AM_ABX - }, - -463 { "ADC", -AM_ABX - }, - -464 { "ROR", -AM_ABX - }, - -465 { "RRA", -AM_ABX - }, - -466 { "DOP", -AM_IMM - }, - -467 { "STA", -AM_ZIX - }, - -468 { "DOP", -AM_IMM - }, - -469 { "SAX", -AM_ZIX - }, - -470 { "STY", -AM_ZP - }, - -471 { "STA", -AM_ZP - }, - -472 { "STX", -AM_ZP - }, - -473 { "SAX", -AM_ZP - }, - -474 { "DEY", -AM_IMP - }, - -475 { "DOP", -AM_IMM - }, - -476 { "TXA", -AM_IMP - }, - -477 { "XAA", -AM_IMM - }, - -478 { "STY", -AM_ABS - }, - -479 { "STA", -AM_ABS - }, - -480 { "STX", -AM_ABS - }, - -481 { "SAX", -AM_ABS - }, - -482 { "BCC", -AM_REL - }, - -483 { "STA", -AM_ZIY - }, - -484 { "JAM", -AM_IMP - }, - -485 { "AHX", -AM_ZIY - }, - -486 { "STY", -AM_ZPX - }, - -487 { "STA", -AM_ZPX - }, - -488 { "STX", -AM_ZPY - }, - -489 { "SAX", -AM_ZPY - }, - -490 { "TYA", -AM_IMP - }, - -491 { "STA", -AM_ABY - }, - -492 { "TXS", -AM_IMP - }, - -493 { "TAS", -AM_IMM - }, - -494 { "SHY", -AM_ABY - }, - -495 { "STA", -AM_ABX - }, - -496 { "SHX", -AM_ABX - }, - -497 { "AHX", -AM_ABY - }, - -498 { "LDY", -AM_IMM - }, - -499 { "LDA", -AM_ZIX - }, - -500 { "LDX", -AM_IMM - }, - -501 { "LAX", -AM_ZIX - }, - -502 { "LDY", -AM_ZP - }, - -503 { "LDA", -AM_ZP - }, - -504 { "LDX", -AM_ZP - }, - -505 { "LAX", -AM_ZP - }, - -506 { "TAY", -AM_IMP - }, - -507 { "LDA", -AM_IMM - }, - -508 { "TAX", -AM_IMP - }, - -509 { "LAX", -AM_IMM - }, - -510 { "LDY", -AM_ABS - }, - -511 { "LDA", -AM_ABS - }, - -512 { "LDX", -AM_ABS - }, - -513 { "LAX", -AM_ABS - }, - -514 { "BCS", -AM_REL - }, - -515 { "LDA", -AM_ZIY - }, - -516 { "JAM", -AM_IMP - }, - -517 { "LAX", -AM_ZIY - }, - -518 { "LDY", -AM_ZPX - }, - -519 { "LDA", -AM_ZPX - }, - -520 { "LDX", -AM_ZPY - }, - -521 { "LAX", -AM_ZPY - }, - -522 { "CLV", -AM_IMP - }, - -523 { "LDA", -AM_ABY - }, - -524 { "TSX", -AM_IMP - }, - -525 { "LAS", -AM_IMP - }, - -526 { "LDY", -AM_ABX - }, - -527 { "LDA", -AM_ABX - }, - -528 { "LDX", -AM_ABY - }, - -529 { "LAX", -AM_ABY - }, - -530 { "CPY", -AM_IMM - }, - -531 { "CMP", -AM_ZIX - }, - -532 { "DOP", -AM_IMP - }, - -533 { "DCP", -AM_ZIX - }, - -534 { "CPY", -AM_ZP - }, - -535 { "CMP", -AM_ZP - }, - -536 { "DEC", -AM_ZP - }, - -537 { "DCP", -AM_ZP - }, - -538 { "INY", -AM_IMP - }, - -539 { "CMP", -AM_IMM - }, - -540 { "DEX", -AM_IMP - }, - -541 { "AXS", -AM_IMM - }, - -542 { "CPY", -AM_ABS - }, - -543 { "CMP", -AM_ABS - }, - -544 { "DEC", -AM_ABS - }, - -545 { "DCP", -AM_ABS - }, - -546 { "BNE", -AM_REL - }, - -547 { "CMP", -AM_ZIY - }, - -548 { "JAM", -AM_IMP - }, - -549 { "DCP", -AM_ZIY - }, - -550 { "DOP", -AM_ZPX - }, - -551 { "CMP", -AM_ZPX - }, - -552 { "DEC", -AM_ZPX - }, - -553 { "DCP", -AM_ZPX - }, - -554 { "CLD", -AM_IMP - }, - -555 { "CMP", -AM_ABY - }, - -556 { "NOP", -AM_IMP - }, - -557 { "DCP", -AM_ABY - }, - -558 { "TOP", -AM_ABX - }, - -559 { "CMP", -AM_ABX - }, - -560 { "DEC", -AM_ABX - }, - -561 { "DCP", -AM_ABX - }, - -562 { "CPX", -AM_IMM - }, - -563 { "SBC", -AM_ZIX - }, - -564 { "DOP", -AM_IMM - }, - -565 { "ISC", -AM_ZIX - }, - -566 { "CPX", -AM_ZP - }, - -567 { "SBC", -AM_ZP - }, - -568 { "INC", -AM_ZP - }, - -569 { "ISC", -AM_ZP - }, - -570 { "INX", -AM_IMP - }, - -571 { "SBC", -AM_IMM - }, - -572 { "NOP", -AM_IMP - }, - -573 { "SBC", -AM_IMM - }, - -574 { "CPX", -AM_ABS - }, - -575 { "SBC", -AM_ABS - }, - -576 { "INC", -AM_ABS - }, - -577 { "ISC", -AM_ABS - }, - -578 { "BEQ", -AM_REL - }, - -579 { "SBC", -AM_ZIY - }, - -580 { "JAM", -AM_IMP - }, - -581 { "ISC", -AM_ZIY - }, - -582 { "DOP", -AM_ZPX - }, - -583 { "SBC", -AM_ZPX - }, - -584 { "INC", -AM_ZPX - }, - -585 { "ISC", -AM_ZPX - }, - -586 { "SED", -AM_IMP - }, - -587 { "SBC", -AM_ABY - }, - -588 { "NOP", -AM_IMP - }, - -589 { "ISC", -AM_ABY - }, - -590 { "TOP", -AM_ABX - }, - -591 { "SBC", -AM_ABX - }, - -592 { "INC", -AM_ABX - }, - -593 { "ISC", -AM_ABX - } }; - -595 -SDL_bo - - $isws - -c - ) - -597 if -c - =9 ) || ( c =32 ) )  -SDL_TRUE -; - -598  -SDL_FALSE -; - -599 - } -} - -601 -SDL_bo - - $isb - -c - ) - -603 if -c - >'0' ) && ( c <'1' ) )  -SDL_TRUE -; - -604  -SDL_FALSE -; - -605 - } -} - -607 -SDL_bo - - $ium - -c - ) - -609 if -c - >'0' ) && ( c <'9' ) )  -SDL_TRUE -; - -610  -SDL_FALSE -; - -611 - } -} - -613 -SDL_bo - - $ishex - -c - ) - -615 if - `ium - -c - ) )  -SDL_TRUE -; - -616 if -c - >'a' ) && ( c <'f' ) )  -SDL_TRUE -; - -617 if -c - >'A' ) && ( c <'F' ) )  -SDL_TRUE -; - -618  -SDL_FALSE -; - -619 - } -} - -621 -SDL_bo - - $ih - -c - ) - -623 if -c - >'a' ) && ( c <'z' ) )  -SDL_TRUE -; - -624 if -c - >'A' ) && ( c <'Z' ) )  -SDL_TRUE -; - -625  -SDL_FALSE -; - -626 - } -} - -628 -SDL_bo - - $issymt - -c - ) - -630 if - `ih - -c - ) )  -SDL_TRUE -; - -631 if -c - ='_' )  -SDL_TRUE -; - -632  -SDL_FALSE -; - -633 - } -} - -635 -SDL_bo - - $issymch - -c - ) - -637 if - `issymt - -c - ) )  -SDL_TRUE -; - -638 if - `ium - -c - ) )  -SDL_TRUE -; - -639  -SDL_FALSE -; - -640 - } -} - -642  - $hex - -c - ) - -644 if - `ium - -c - ) )  c-'0'; - -645 if -c - >= 'a' ) && ( c <= 'f' ) )  c-('a'-10); - -646 if -c - >= 'A' ) && ( c <= 'F' ) )  c-('A'-10); - -648 - } -} - -650  - $bp_ - -mache - * -ic -,  -addr -, * -xbp -, * -mbp - ) - -652  -bpmask - = 0, -i -; - -654 if -xbp - ) *xbp = -1; - -655 if -mbp - ) *mbp = -1; - -657 -ic --> -u -. -ybp - = -SDL_FALSE -; - -658  -i -=0; i<16; i++ ) - -660 if -ic --> -u -. -bakpots -[ -i -] != -1 ) - -662 -ic --> -u -. -ybp - = -SDL_TRUE -; - -663 if -addr - = -ic --> -u -. -bakpots -[ -i -] ) - -665 -bpmask - |= 8; - -666 if -xbp - ) *xb -i -; - -672 -ic --> -u -. -ymbp - = -SDL_FALSE -; - -673  -i -=0; i<16; i++ ) - -675 if -ic --> -u -. -membakpots -[ -i -]. -ags - ) - -677 -ic --> -u -. -ymbp - = -SDL_TRUE -; - -678 if -ic --> -u -. -membakpots -[ -i -]. -addr - ==ddr ) - -680 -bpmask - | -ic --> -u -. -membakpots -[ -i -]. -ags -; - -681 if -mbp - ) *mb -i -; - -687  -bpmask -; - -688 - } -} - -691  - $m_ad - -mache - * -ic -,  -addr - ) - -694 if -ic --> -drivy - = -DRV_MICRODISC - ) - -696  -addr - ) - -699  -ic --> -wddisk -. -r_us -; - -702  -ic --> -wddisk -. -r_ack -; - -705  -ic --> -wddisk -. -r_ -; - -708  -ic --> -wddisk -. -r_da -; - -711  -ic --> -md -. -q -|0x7f; - -714  -ic --> -md -. -drq -|0x7f; - -718 if -ic --> -drivy - = -DRV_PRAVETZ - ) - -720 i0x300 < -addr - ) && (ddr <= 0x30f ) ) - -722  - `v_m_ad -& -ic --> -v -, -addr - ); - -724 i0x310 < -addr - ) && (ddr <= 0x31f ) ) - -728  -ic --> -u -. - `ad -&ic->u, -addr - ); - -731 if -addr - & 0xff00 ) == 0x0300 ) - -733 i! -ic --> -ligh - ) || ( -addr - < 0x3e0 ) || (ddr > 0x3e1 ) ) - -735  - `v_m_ad -& -ic --> -v -, -addr - ); - -739  -ic --> -u -. - `ad -&ic->u, -addr - ); - -740 - } -} - -742  - $m_e_e - -mache - * -ic - ) - -744  -k -; - -746  -k -=0; k<65536; k++ ) - -748 if - `iam - -ic -, -k - ) ) - -749 -mwch_d -[ -k -] = - `m_ad - -ic -, k ); - -751 -mwch_dvid - = -SDL_TRUE -; - -753 -u_d - = -ic --> -u -; - -754 -vid_d - = -ic --> -vid_ -; - -755 -ames_d - = -ic --> -ames -; - -756 -u_dvid - = -SDL_TRUE -; - -758 -ay_d - = -ic --> -ay -; - -759 -ay_dvid - = -SDL_TRUE -; - -761 -v_d - = -ic --> -v -; - -762 -v_dvid - = -SDL_TRUE -; - -764 -v2_d - = -ic --> -_v -; - -765 -v2_dvid - = -SDL_TRUE -; - -766 - } -} - -768  - $m_t_modifd - -mache - * -ic - ) - -770 if -modifd - ) ; - -772 -modifd - = -SDL_TRUE -; - -773 - `m_e_e - -ic - ); - -774 - } -} - -776  - $dbg_sl -( ) - -778  -x -, -y -, -s -, -d -; - -779  -xtze - * -z - = -tz -[ -TZ_DEBUG -]; - -781 -s - = -z --> -w -*2+1; - -782 -d - = -z --> -w -+1; - -783  -y -=0; y<18; y++ ) - -785  -x -=0; x<48; x++ ) - -787 -z --> -tx -[ -d -] =tz->tx[ -s -]; - -788 -z --> -fc -[ -d -] =tz->fc[ -s -]; - -789 -z --> -bc -[ -d -++] =tz->bc[ -s -++]; - -791 -d - += 2; - -792 -s - += 2; - -795  -x -=0; x<48; x++ ) - -797 -z --> -tx -[ -d -] = ' '; - -798 -z --> -fc -[ -d -] = 2; - -799 -z --> -bc -[ -d -++] = 3; - -801 - } -} - -803  - $dbg_tf -* -fmt -, ... ) - -805 -va_li - - -; - -807 - `dbg_sl -(); - -809 - `va_t - - -, -fmt - ); - -810 if - `vtf - -vtmp -, -VSPTMPSIZE -, -fmt -, - - ) != -1 ) - -812 -vtmp -[ -VSPTMPSIZE --1] = 0; - -813 #i -LOG_DEBUG - - -814 if -debug_logfe - ) - -816 - `rtf - -debug_logfe -, "%s\n", -vtmp - ); - -817 - `fush - -debug_logfe - ); - -820 -vtmp -[48] = 0; - -821 - `tzos - -tz -[ -TZ_DEBUG -], 1, 19, -vtmp - ); - -823 - `va_d - - - ); - -824 - } -} - -826  -msym - * - $m_b_fd_sym_by_addr - -symbޏb - * -ab -,  -mache - * -ic -,  -addr -, -SDL_bo - * -ovride_romdis - ) - -828  -i -, -j -, -k -; - -829 -SDL_bo - -romdis -; - -831 -romdis - = -ic -->romdis; - -832 if -ic --> -drivy - = -DRV_JASMIN - ) && ( oric-> -jasm -. -ay - ) ) - -833 -romdis - = -SDL_FALSE -; - -835 i( -ovride_romdis -) - -836 -romdis - = * -ovride_romdis -; - -838  -i -=0; i< -ab --> -numsyms -; i++ ) - -840 if -ic --> -ty - = -MACH_TELESTRAT - ) - -842 if -ab --> -syms -[ -i -]. -addr - >= 0xc000 ) - -844  -j -=0, -k -= -SYMF_TELEBANK0 -; j<8; j++, k<<=1 ) - -846 if(( -ab --> -syms -[ -i -]. -ags -& -k -)==0&& ( -ic --> -_cubk - = -j - ) ) - -850 if -j - != 8 ) ; - -853 if -ab --> -syms -[ -i -]. -ags -& -SYMF_MICRODISC - ) - -855 if -ic --> -drivy - ! -DRV_MICRODISC - ) || ( !ic-> -md -. -diskrom - ) ) - -859 if( -ab --> -syms -[ -i -]. -ags -& -SYMF_JASMIN -&& ( -ic --> -drivy - ! -DRV_JASMIN - ) ) - -862 if -romdis - ) - -864 if( -ab --> -syms -[ -i -]. -ags -& -SYMF_ROMDIS0 -) != 0 ) - -867 if( -ab --> -syms -[ -i -]. -ags -& -SYMF_ROMDIS1 -) != 0 ) - -872 if -addr - = -ab --> -syms -[ -i -].addr ) - -873  & -ab --> -syms -[ -i -]; - -876  -NULL -; - -877 - } -} - -879  -msym - * - $m_b_fd_sym_by_me - -symbޏb - * -ab -,  -mache - * -ic -, * -me -, * -symnum - ) - -881  -i -, -j -, -k -, -romdis -; - -883 -romdis - = -ic -->romdis; - -884 if -ic --> -drivy - = -DRV_JASMIN - ) && ( oric-> -jasm -. -ay - ) ) - -885 -romdis - = 1; - -887  -i -=0; i< -ab --> -numsyms -; i++ ) - -889 if -ic --> -ty - = -MACH_TELESTRAT - ) - -891 if -ab --> -syms -[ -i -]. -addr - >= 0xc000 ) - -893  -j -=0, -k -= -SYMF_TELEBANK0 -; j<8; j++, k<<=1 ) - -895 if(( -ab --> -syms -[ -i -]. -ags -& -k -)==0&& ( -ic --> -_cubk - = -j - ) ) - -899 if -j - != 8 ) ; - -902 if -ab --> -syms -[ -i -]. -ags -& -SYMF_MICRODISC - ) - -904 if -ic --> -drivy - ! -DRV_MICRODISC - ) || ( !ic-> -md -. -diskrom - ) ) - -908 if( -ab --> -syms -[ -i -]. -ags -& -SYMF_JASMIN -&& ( -ic --> -drivy - ! -DRV_JASMIN - ) ) - -911 if -romdis - ) - -913 if( -ab --> -syms -[ -i -]. -ags -& -SYMF_ROMDIS0 -) != 0 ) - -916 if( -ab --> -syms -[ -i -]. -ags -& -SYMF_ROMDIS1 -) != 0 ) - -921 if! -ic --> -symbs - ) - -923 if - `rcmp - -me -, -ab --> -syms -[ -i -].name ) == 0 ) - -925 if -symnum - ) (*symnum -i -; - -926  & -ab --> -syms -[ -i -]; - -929 if - `rcmp - -me -, -ab --> -syms -[ -i -].name ) == 0 ) - -931 if -symnum - ) (*symnum -i -; - -932  & -ab --> -syms -[ -i -]; - -937 if -symnum - ) (*symnum) = -1; - -938  -NULL -; - -939 - } -} - -941  -msym - * - $m_fd_sym_by_addr - -mache - * -ic -,  -addr -, -SDL_bo - * -ovride_romdis - ) - -943  -msym - * -t -; - -945 -t - = - `m_b_fd_sym_by_addr -& -ic --> -ursyms -, oric, -addr -, -ovride_romdis - ); - -946 if! -t - ) = - `m_b_fd_sym_by_addr -& -ic --> -romsyms -, oric, -addr -, -ovride_romdis - ); - -947 if! -t - ) && ( -ic --> -ty - = -MACH_TELESTRAT - ) ) = - `m_b_fd_sym_by_addr -&ic-> -_bksyms -[ic-> -_cubk -], oric, -addr -, -ovride_romdis - ); - -948 if! -t - ) && ( -ic --> -disksyms - ) ) = - `m_b_fd_sym_by_addr -ic->disksyms, oric, -addr -, -ovride_romdis - ); - -949 if -t - ) et; - -951  - `m_b_fd_sym_by_addr -& -deusyms -, -ic -, -addr -, -ovride_romdis - ); - -952 - } -} - -954  -msym - * - $m_fd_sym_by_me - -mache - * -ic -, * -me - ) - -956  -msym - * -t -; - -958 -t - = - `m_b_fd_sym_by_me -& -ic --> -ursyms -, oric, -me -, -NULL - ); - -959 if! -t - ) = - `m_b_fd_sym_by_me -& -ic --> -romsyms -, oric, -me -, -NULL - ); - -960 if! -t - ) && ( -ic --> -ty - = -MACH_TELESTRAT - ) ) = - `m_b_fd_sym_by_me -&ic-> -_bksyms -[ic-> -_cubk -], oric, -me -, -NULL - ); - -961 if! -t - ) && ( -ic --> -disksyms - ) ) = - `m_b_fd_sym_by_me -ic->disksyms, oric, -me -, -NULL - ); - -962 if -t - ) et; - -964  - `m_b_fd_sym_by_me -& -deusyms -, -ic -, -me -, -NULL - ); - -965 - } -} - -967 -SDL_bo - - $m_addsym - -symbޏb - * -ab -,  -addr -,  -ags -, * -me -,  -msym - ** -symr - ) - -969  -i -; - -971 if -symr - ) (*symr -NULL -; - -974 if -ab --> -syma - =-1 )  -SDL_FALSE -; - -976 if! -ab --> -syms - ) || ( sb-> -syma - < (ab-> -numsyms -+1) ) ) - -978  -msym - * -wbuf -; - -980 -wbuf - = - `mloc - -msym - ) * ( -ab --> -syma -+64) ); - -981 if! -wbuf - )  -SDL_FALSE -; - -983 if -ab --> -syms - ) && ( sb-> -numsyms - > 0 ) ) - -984 - `memy - -wbuf -, -ab --> -syms -,  -msym - ) * sb-> -numsyms - ); - -986 - ` - -ab --> -syms - ); - -987 -ab --> -syms - = -wbuf -; - -988 -ab --> -syma - += 64; - -990  -i -= -ab --> -numsyms -; i -syma -; i++ ) - -991 -ab --> -syms -[ -i -]. -me - = -NULL -; - -994 if! -ab --> -syms -[ab-> -numsyms -]. -me - ) - -996 -ab --> -syms -[ab-> -numsyms -]. -me - = - `mloc -( 128 ); - -997 if! -ab --> -syms -[ab-> -numsyms -]. -me - )  -SDL_FALSE -; - -1000 -ab --> -syms -[ab-> -numsyms -]. -addr - =ddr; - -1001 -ab --> -syms -[ab-> -numsyms -]. -ags - = flags; - -1002 - `y - -ab --> -syms -[ab-> -numsyms -]. -me -,ame, 128 ); - -1003 -ab --> -syms -[ab-> -numsyms -]. -me -[127] = 0; - -1005 if - ` - -me - ) > -SNAME_LEN - ) - -1007 - `y - -ab --> -syms -[ab-> -numsyms -]. -ame -, -me -, ( -SNAME_LEN --1) ); - -1008 -ab --> -syms -[ab-> -numsyms -]. -ame -[ -SNAME_LEN --1] = 22; - -1009 -ab --> -syms -[ab-> -numsyms -]. -ame -[ -SNAME_LEN -] = 0; - -1011 - `ry - -ab --> -syms -[ab-> -numsyms -]. -ame -, -me - ); - -1014 if - ` - -me - ) > -SSNAME_LEN - ) - -1016 - `y - -ab --> -syms -[ab-> -numsyms -]. -same -, -me -, ( -SSNAME_LEN --1) ); - -1017 -ab --> -syms -[ab-> -numsyms -]. -same -[ -SSNAME_LEN --1] = 22; - -1018 -ab --> -syms -[ab-> -numsyms -]. -same -[ -SSNAME_LEN -] = 0; - -1020 - `ry - -ab --> -syms -[ab-> -numsyms -]. -same -, -me - ); - -1023 if -symr - ) *(symr& -ab --> -syms -[ab-> -numsyms -]; - -1025 -ab --> -numsyms -++; - -1027  -SDL_TRUE -; - -1028 - } -} - -1030  - $m__symb - -symbޏb - * -ab - ) - -1032 -ab --> -syms - = -NULL -; - -1033 -ab --> -numsyms - = 0; - -1034 -ab --> -syma - = 0; - -1035 - } -} - -1037  - $m_syms - -symbޏb - * -ab - ) - -1040 if -ab --> -syma - == -1 ) ; - -1041 i( -ab --> -syms -) - -1043  -i -; - -1044  -i - = 0; i < -ab --> -numsyms -; i++) - -1046 - ` -( -ab --> -syms -[ -i -]. -me -); - -1048 - ` -( -ab --> -syms -); - -1050 -ab --> -syms - = -NULL -; - -1051 -ab --> -numsyms - = 0; - -1052 -ab --> -syma - = 0; - -1053 - } -} - -1057 * - $m_dismb - -mache - * -ic -, * -ddr -, -SDL_bo - * -loed -, SDL_bo -femode - ) - -1059  -ddr -, -addr -; - -1060  - -, -a1 -, -a2 -; - -1061  -i -; - -1062 * -tmpame -, * -di -; - -1063  -ame -[ -SNAME_LEN -+1]; - -1064  -msym - * -csym -; - -1066 -di - = -dimp -; - -1068 -ddr - = * -ddr -; - -1069 if -loed - ) *loed = -SDL_FALSE -; - -1071 -tmpame - = ""; - -1072 if! -femode - ) - -1074 -csym - = - `m_fd_sym_by_addr - -ic -, -ddr -, -NULL - ); - -1075 if -csym - ) -tmpame - = csym-> -ame -; - -1077 -csym - = - `m_fd_sym_by_addr - -ic -, -ddr -, -NULL - ); - -1078 if -csym - ) - -1080 -tmpame - = -csym --> -me -; - -1082 if - ` - -tmpame - ) > -SNAME_LEN - ) - -1084 - `rtf - -dimp -, "%s\n", -tmpame - ); - -1085 -di - = & -dimp -[ - ` -(distmp)]; - -1086 -tmpame - = ""; - -1091 - `ry - -ame -, -tmpame - ); - -1092  -i -=() - ` -( -ame -); i< -SNAME_LEN -; i++ ) - -1093 -ame -[ -i -] = 32; - -1094 -ame -[ -i -] = 0; - -1096 - - = - `m_ad - -ic -, (* -ddr -)++ ); - -1097  -diab -[ - -]. -amode - ) - -1099  -AM_IMP -: - -1100 - `rtf - -di -, "% %04X %02X %s", -ame -, -ddr -, - -, -diab -[]. -me - ); - -1103  -AM_IMM -: - -1104 -a1 - = - `m_ad - -ic -, (* -ddr -)++ ); - -1105 - `rtf - -di -, "% %04X %02X %02X %#$%02X", -ame -, -ddr -, - -, -a1 -, -diab -[]. -me -,1 ); - -1108  -AM_ZP -: - -1109  -AM_ZPX -: - -1110  -AM_ZPY -: - -1111 -a1 - = - `m_ad - -ic -, (* -ddr -)++ ); - -1112 -csym - = - `m_fd_sym_by_addr - -ic -, -a1 -, -NULL - ); - -1113 if -csym - ) - -1114 - `rtf - -di -, "% %04X %02X %02X %%s", -ame -, -ddr -, - -, -a1 -, -diab -[]. -me -, -femode - ? -csym -->name : csym->sname ); - -1116 - `rtf - -di -, "% %04X %02X %02X %$%02X", -ame -, -ddr -, - -, -a1 -, -diab -[]. -me -,1 ); - -1117 if -diab -[ - -]. -amode - = -AM_ZP - ) ; - -1118 - `rt - -di -, -diab -[ - -]. -amode - = -AM_ZPX - ? ",X" : ",Y" ); - -1121  -AM_ABS -: - -1122  -AM_ABX -: - -1123  -AM_ABY -: - -1124 -a1 - = - `m_ad - -ic -, (* -ddr -)++ ); - -1125 -a2 - = - `m_ad - -ic -, (* -ddr -)++ ); - -1126 -csym - = - `m_fd_sym_by_addr - -ic -, ( -a2 -<<8)| -a1 -, -NULL - ); - -1127 if -csym - ) - -1128 - `rtf - -di -, "% %04X %02X %02X %02X %%s", -ame -, -ddr -, - -, -a1 -, -a2 -, -diab -[]. -me -, -femode - ? -csym -->name : csym->sname ); - -1130 - `rtf - -di -, "% %04X %02X %02X %02X %$%02X%02X", -ame -, -ddr -, - -, -a1 -, -a2 -, -diab -[]. -me -,2,1 ); - -1131 if -diab -[ - -]. -amode - = -AM_ABS - ) ; - -1132 - `rt - -di -, -diab -[ - -]. -amode - = -AM_ABX - ? ",X" : ",Y" ); - -1135  -AM_ZIX -: - -1136 -a1 - = - `m_ad - -ic -, (* -ddr -)++ ); - -1137 -csym - = - `m_fd_sym_by_addr - -ic -, -a1 -, -NULL - ); - -1138 if -csym - ) - -1139 - `rtf - -di -, "% %04X %02X %02X %(%s,X)", -ame -, -ddr -, - -, -a1 -, -diab -[]. -me -, -femode - ? -csym -->m: csym-> -same - ); - -1141 - `rtf - -di -, "% %04X %02X %02X %($%02X,X)", -ame -, -ddr -, - -, -a1 -, -diab -[]. -me -,1 ); - -1144  -AM_ZIY -: - -1145 -a1 - = - `m_ad - -ic -, (* -ddr -)++ ); - -1146 -csym - = - `m_fd_sym_by_addr - -ic -, -a1 -, -NULL - ); - -1147 if -csym - ) - -1148 - `rtf - -di -, "% %04X %02X %02X %(%s),Y", -ame -, -ddr -, - -, -a1 -, -diab -[]. -me -, -femode - ? -csym -->m: csym-> -same - ); - -1150 - `rtf - -di -, "% %04X %02X %02X %($%02X),Y", -ame -, -ddr -, - -, -a1 -, -diab -[]. -me -,1 ); - -1153  -AM_REL -: - -1154 -a1 - = - `m_ad - -ic -, (* -ddr -)++ ); - -1155 -addr - = ((* -ddr -)+((sigd ) -a1 -))&0xffff; - -1156 -csym - = - `m_fd_sym_by_addr - -ic -, -addr -, -NULL - ); - -1157 if -csym - ) - -1158 - `rtf - -di -, "% %04X %02X %02X %%s", -ame -, -ddr -, - -, -a1 -, -diab -[]. -me -, -femode - ? -csym -->name : csym->sname ); - -1160 - `rtf - -di -, "% %04X %02X %02X %$%04X", -ame -, -ddr -, - -, -a1 -, -diab -[]. -me -, -addr - ); - -1163  -AM_IND -: - -1164 -a1 - = - `m_ad - -ic -, (* -ddr -)++ ); - -1165 -a2 - = - `m_ad - -ic -, (* -ddr -)++ ); - -1166 -csym - = - `m_fd_sym_by_addr - -ic -, ( -a2 -<<8)| -a1 -, -NULL - ); - -1167 if -csym - ) - -1168 - `rtf - -di -, "% %04X %02X %02X %02X %(%s)", -ame -, -ddr -, - -, -a1 -, -a2 -, -diab -[]. -me -, -femode - ? -csym -->name : csym->sname ); - -1170 - `rtf - -di -, "% %04X %02X %02X %02X %($%02X%02X)", -ame -, -ddr -, - -, -a1 -, -a2 -, -diab -[]. -me -,2,1 ); - -1174 - `ry - -di -, " WTF?" ); - -1178  -i -=() - ` -( -di -); i<47; i++ ) - -1179 -di -[ -i -] = 32; - -1180 -di -[ -i -] = 0; - -1182  - `bp_ - -ic -, -ddr -, -NULL -, NULL ) ) - -1184  -MBPF_READ -): -di -[ -SNAME_LEN -+1] = 'r'; ; - -1185  -MBPF_WRITE - ): -di -[ -SNAME_LEN -+1] = 'w'; ; - -1186  -MBPF_WRITE -| -MBPF_READ -): -di -[ -SNAME_LEN -+1] = 'a'; ; - -1187  -MBPF_CHANGE - ): -di -[ -SNAME_LEN -+1] = 'c'; ; - -1188  -MBPF_CHANGE - | -MBPF_READ -): -di -[ -SNAME_LEN -+1] = 'g'; ; - -1189  -MBPF_CHANGE -| -MBPF_WRITE - ): -di -[ -SNAME_LEN -+1] = 'm'; ; - -1190  -MBPF_CHANGE -| -MBPF_WRITE -| -MBPF_READ -): -di -[ -SNAME_LEN -+1] = '+'; ; - -1191 (8 ): -di -[ -SNAME_LEN -+1] = 'X'; ; - -1192 (8| -MBPF_READ -): -di -[ -SNAME_LEN -+1] = 'R'; ; - -1193 (8| -MBPF_WRITE - ): -di -[ -SNAME_LEN -+1] = 'W'; ; - -1194 (8| -MBPF_WRITE -| -MBPF_READ -): -di -[ -SNAME_LEN -+1] = 'A'; ; - -1195 (8| -MBPF_CHANGE - ): -di -[ -SNAME_LEN -+1] = 'C'; ; - -1196 (8| -MBPF_CHANGE - | -MBPF_READ -): -di -[ -SNAME_LEN -+1] = 'G'; ; - -1197 (8| -MBPF_CHANGE -| -MBPF_WRITE - ): -di -[ -SNAME_LEN -+1] = 'M'; ; - -1198 (8| -MBPF_CHANGE -| -MBPF_WRITE -| -MBPF_READ -): -di -[ -SNAME_LEN -+1] = '*'; ; - -1201 if -ddr - = -ic --> -u -. -pc - ) - -1202 -di -[ -SNAME_LEN -+2] = '>'; - -1204 if -loed - ) && ( -ddr - > * -ddr - ) ) - -1205 * -loed - = -SDL_TRUE -; - -1207  -dimp -; - -1208 - } -} - -1210  - $m_gmod - -x -,  -y -,  -w - ) - -1212  -offs -, -i -; - -1214 -offs - = -y -* -tz -[ -TZ_REGS -]-> -w -+ -x -; - -1215  -i -=0; i< -w -; i++, -offs -++ ) - -1217 -tz -[ -TZ_REGS -]-> -fc -[ -offs -] = 1; - -1218 -tz -[ -TZ_REGS -]-> -bc -[ -offs -] = 8; - -1220 - } -} - -1222  - $m_upde_gs - -mache - * -ic - ) - -1224  -i -; - -1225  -addr -, -pc -; - -1226  -msym - * -csym -; - -1227  -mp -[48]; - -1229 -pc - = -ic --> -u -.pc; - -1231 if -ic --> -u -. -q - ) && ( oric->u. -f_i - == 0 ) ) - -1232 -pc - = ( - `m_ad - -ic -, 0xffff )<<8) | mon_read( oric, 0xfffe ); - -1234 - `tztos - -tz -[ -TZ_REGS -], 2, 2, "PC=%04X SP=01%02X A=%02X X=%02X Y=%02X LPC=%04X", - -1235 -pc -, - -1236 -ic --> -u -. - -, - -1237 -ic --> -u -. -a -, - -1238 -ic --> -u -. -x -, - -1239 -ic --> -u -. -y -, - -1240 -ic --> -u -. -ϡpc - ); - -1242 -csym - = - `m_fd_sym_by_addr - -ic -, -pc -, -NULL - ); - -1243 if -csym - ) - -1245 if - ` - -csym --> -me - ) > 46 ) - -1247 - `y - -mp -, -csym --> -me -, 46 ); - -1248 -mp -[46] = 0; - -1250 - `ry - -mp -, -csym --> -me - ); - -1252 - `tzos - -tz -[ -TZ_REGS -], 2, 3, -mp - ); - -1254 - `tztos - -tz -[ -TZ_REGS -], 2, 3, "%46s", " " ); - -1257 - `tztos - -tz -[ -TZ_REGS -], 2, 4, "CY=%09d", -ic --> -u -. -cyes - ); - -1258 - `tztos - -tz -[ -TZ_REGS -], 2, 5, "FM=%06d RS=%03d", -ic --> -ames -, oric-> -vid_ - ); - -1260 - `tzos - -tz -[ -TZ_REGS -], 35, 4, ( -ic --> -u -. -q -& -IRQF_VIA -) ? "VIA" : " " ); - -1261 - `tzos - -tz -[ -TZ_REGS -], 35, 5, ( -ic --> -u -. -q -& -IRQF_DISK -) ? "DISK" : " " ); - -1264 - `tzos - -tz -[ -TZ_REGS -], 20, 4, "NV-BDIZC" ); - -1265 - `tztos - -tz -[ -TZ_REGS -], 20, 5, "%01X%01X1%01X%01X%01X%01X%01X", - -1266 -ic --> -u -. -f_n -, - -1267 -ic --> -u -. -f_v -, - -1268 -ic --> -u -. -f_b -, - -1269 -ic --> -u -. -f_d -, - -1270 -ic --> -u -. -f_i -, - -1271 -ic --> -u -. -f_z -, - -1272 -ic --> -u -. -f_c - ); - -1274 - `tztos - -tz -[ -TZ_REGS -], 30, 4, "NMI=%04X RST=%04X", - -1275 ( -ic --> -u -. - `ad -( &oric->cpu, 0xfffb )<<8)|oric->cpu.read( &oric->cpu, 0xfffa ), - -1276 ( -ic --> -u -. - `ad -( &oric->cpu, 0xfffd )<<8)|oric->cpu.read( &oric->cpu, 0xfffc ) ); - -1277 - `tztos - -tz -[ -TZ_REGS -], 30, 5, "IRQ=%04X", ( -ic --> -u -. - `ad -( &oric->cpu, 0xffff )<<8)|oric->cpu.read( &oric->cpu, 0xfffe ) ); - -1280 -addr - = -pc -; - -1281  -i -=0; i<10; i++ ) - -1283 -diddrs -[ -i -] = -addr -; - -1284 - `tztc - -tz -[ -TZ_REGS -], ( -addr -== -pc -) ? 1 : 2, 3 ); - -1285 - `tzos - -tz -[ -TZ_REGS -], 23, 7+ -i -, " " ); - -1286 - `tzos - -tz -[ -TZ_REGS -], 2, 7+ -i -, - `m_dismb - -ic -, & -addr -, -NULL -, -SDL_FALSE - ) ); - -1289 if -u_dvid - ) - -1291 if -u_d -. -pc - !p - `m_gmod -( 5, 2, 4 ); - -1292 if -u_d -. - - ! -ic --> -u -. ) - `m_gmod -( 14, 2, 4 ); - -1293 if -u_d -. -a - ! -ic --> -u -. - `m_gmod -( 22, 2, 2 ); - -1294 if -u_d -. -x - ! -ic --> -u -.x ) - `m_gmod -( 28, 2, 2 ); - -1295 if -u_d -. -y - ! -ic --> -u -.y ) - `m_gmod -( 34, 2, 2 ); - -1296 if -u_d -. -cyes - ! -ic --> -u -.cye - `m_gmod -( 5, 4, 9 ); - -1297 if -ames_d - ! -ic --> -ames - ) - `m_gmod -( 5, 5, 6 ); - -1298 if -vid_d - ! -ic --> -vid_ - ) - `m_gmod -( 15, 5, 3 ); - -1299 if -u_d -. -f_n - ! -ic --> -u -.f_ - `m_gmod -( 20, 5, 1 ); - -1300 if -u_d -. -f_v - ! -ic --> -u -.f_v ) - `m_gmod -( 21, 5, 1 ); - -1301 if -u_d -. -f_b - ! -ic --> -u -.f_b ) - `m_gmod -( 23, 5, 1 ); - -1302 if -u_d -. -f_d - ! -ic --> -u -.f_d ) - `m_gmod -( 24, 5, 1 ); - -1303 if -u_d -. -f_i - ! -ic --> -u -.f_ - `m_gmod -( 25, 5, 1 ); - -1304 if -u_d -. -f_z - ! -ic --> -u -.f_z ) - `m_gmod -( 26, 5, 1 ); - -1305 if -u_d -. -f_c - ! -ic --> -u -.f_ - `m_gmod -( 27, 5, 1 ); - -1307 if( -u_d -. -q -& -IRQF_VIA -!( -ic --> -u -.q&IRQF_VIA - `m_gmod -( 35, 4, 3 ); - -1308 if( -u_d -. -q -& -IRQF_DISK -!( -ic --> -u -.q&IRQF_DISK - `m_gmod -( 35, 5, 4 ); - -1310 - } -} - -1312  - $m_ick_gs - -mache - * -ic -, -SDL_bo - * -ednd -,  -x -,  -y -, SDL_bo -dblk - ) - -1314  -cmdtmp -[32]; - -1316 if -dblk - ) && ( -y - == 5 ) ) - -1318  -x - ) - -1320 20: - `m_t_modifd - -ic - ); oric-> -u -. -f_n - ^1; * -ednd - = -SDL_TRUE -; ; - -1321 21: - `m_t_modifd - -ic - ); oric-> -u -. -f_v - ^1; * -ednd - = -SDL_TRUE -; ; - -1322 23: - `m_t_modifd - -ic - ); oric-> -u -. -f_b - ^1; * -ednd - = -SDL_TRUE -; ; - -1323 24: - `m_t_modifd - -ic - ); oric-> -u -. -f_d - ^1; * -ednd - = -SDL_TRUE -; ; - -1324 25: - `m_t_modifd - -ic - ); oric-> -u -. -f_i - ^1; * -ednd - = -SDL_TRUE -; ; - -1325 26: - `m_t_modifd - -ic - ); oric-> -u -. -f_z - ^1; * -ednd - = -SDL_TRUE -; ; - -1326 27: - `m_t_modifd - -ic - ); oric-> -u -. -f_c - ^1; * -ednd - = -SDL_TRUE -; ; - -1330 if -dblk - ) && ( -y - >= 7 ) && ( y < 17 ) ) - -1332  -i -; - -1334 if - `bp_ - -ic -, -diddrs -[ -y --7], & -i -, -NULL - ) & 8 ) - -1336 - `rtf - -cmdtmp -, "b%d", -i - ); - -1337 - `m_do_cmd - -cmdtmp -, -ic -, -ednd - ); - -1338 * -ednd - = -SDL_TRUE -; - -1340 - `rtf - -cmdtmp -, "b$%04x", -diddrs -[ -y --7] ); - -1341 - `m_do_cmd - -cmdtmp -, -ic -, -ednd - ); - -1342 * -ednd - = -SDL_TRUE -; - -1347 - } -} - -1349  - $m_vmod - -x -,  -y -,  -w -,  -xtze - * -vtz - ) - -1351  -offs -, -i -; - -1353 -offs - = -y -* -vtz --> -w -+ -x -; - -1354  -i -=0; i< -w -; i++, -offs -++ ) - -1356 -vtz --> -fc -[ -offs -] = 1; - -1357 -vtz --> -bc -[ -offs -] = 8; - -1359 - } -} - -1361  - $m_upde_v - -mache - * -ic -,  -xtze - * -vtz -,  -v - * -v -, v * -d -, -SDL_bo - * -dvid - ) - -1363  -i -, -j -, -o -; - -1364  -v -; - -1365 * -mes -[] = { "IORB ", "IORAh", "DDRB ", "DDRA ", "T1CL ", "T1CH ", "T1LL ", "T1LH ", "T2CL ", "T2CH ", "SR ", "ACR ", "PCR ", "IFR ", "IER ", "IORA " }; - -1367  -i -=0; i<16; i++ ) - -1369 -v - = - `v_m_ad - -v -, v =& -ic --> -v - ? 0x300+ -i - : 0x320+i ); - -1370 - `tztos - -vtz -, 2, -i -+1, "%04X: %$%02X %%", ( -v - =& -ic --> -v -? 0x300+: 0x320+i, -mes -[i], -v - ); - -1371  -j -=128; j; j>>=1 ) - -1372 - `tzputc -( -vtz -, ( -v -& -j -)?'1':'0'); - -1374 if* -dvid - ) - -1376  -ov - = - `v_m_ad -( -d -, ( -v - =& -ic --> -v -? 0x300+ -i - : 0x320+i ); - -1377 if -v - ! -ov - ) - `m_vmod -16, -i -+1, 2, -vtz - ); - -1378  -j -=128, -o -=19; j; j>>=1, o++ ) - -1380 i(( -v -& -j -!( -ov -&j)) - -1381 - `m_vmod - -o -, -i -+1, 1, -vtz - ); - -1386 - `tztos - -vtz -, 2, 18, "---------- TAPE ----------"); - -1387 - `tztos - -vtz -, 2, 19, "OFS %08u LEN %08u", -ic --> -offs -, oric-> -n - ); - -1430 - } -} - -1432  - $m_aymod - -x -,  -y -,  -w - ) - -1434  -offs -, -i -; - -1436 -offs - = -y -* -tz -[ -TZ_AY -]-> -w -+ -x -; - -1437  -i -=0; i< -w -; i++, -offs -++ ) - -1439 -tz -[ -TZ_AY -]-> -fc -[ -offs -] = 1; - -1440 -tz -[ -TZ_AY -]-> -bc -[ -offs -] = 8; - -1442 - } -} - -1444  - $ygbs - -mache - * -ic -, * -r -, -St16 - -x -, St16 -y -,  -g -, -Ut8 - -bs - ) - -1446  -i -, -o -, -fc -, -bc -; - -1447 -Ut8 - -vw -, -vd -; - -1448  -xtze - * -z - = -tz -[ -TZ_AY -]; - -1450 -vw - = -ic --> -ay -. -egs -[ -g -]; - -1451 -vd - = -ay_d -. -egs -[ -g -]; - -1453 - `tztos - -z -, -x -, -y -, -r -, -vw - ); - -1454 -fc - = 2; - -1455 -bc - = 3; - -1456 if -ay_dvid - ) && ( -ay_d -. -egs -[ -g -] ! -ic --> -ay -.eregs[reg] ) ) - -1458 -fc - = 1; - -1459 -bc - = 8; - -1460 - `m_aymod - -x -+14, -y -, 2 ); - -1463 -x -+=18; - -1464 -o - = ( -y -* -z --> -w -)+ -x -; - -1465 -bs - = 8-bits; - -1467  -i -=0; i<8; i++ ) - -1469 if -i - > -bs - ) - -1470 -z --> -tx -[ -o -] = ( -vw -&(0x80>> -i -)) ? '1' : '0'; - -1472 -z --> -tx -[ -o -] = ' '; - -1474 if( -vw -&(0x80)>> -i -!( -vd -&(0x80)>>i) ) - -1476 -z --> -fc -[ -o -] = fc; - -1477 -z --> -bc -[ -o -] = bc; - -1479 -z --> -fc -[ -o -] = 2; - -1480 -z --> -bc -[ -o -] = 3; - -1482 -o -++; - -1484 - } -} - -1486  - $m_upde_ay - -mache - * -ic - ) - -1488 * -rs -[] = { "INACTIVE", - -1492 - `tztos - -tz -[ -TZ_AY -], 2, 1, "CTRL=%s REG=%02X", - -1493 -rs -[ -ic --> -ay -. -bmode -&3], - -1494 -ic --> -ay -. -eg - ); - -1496 if -ay_dvid - ) - -1498 if( -ay_d -. -bmode -&3!( -ic --> -ay -.bmode&3 - `m_aymod -( 7, 1, 8 ); - -1499 if -ay_d -. -eg - ! -ic --> -ay -.eg ) - `m_aymod -( 21, 1, 2 ); - -1502 - `ygbs - -ic -, "R0 Pch A L $%02X %%", 2, 2, -AY_CHA_PER_L -, 8 ); - -1503 - `ygbs - -ic -, "R1 Pch A H $%02X %%", 2, 3, -AY_CHA_PER_H -, 4 ); - -1504 - `ygbs - -ic -, "R2 Pch B L $%02X %%", 2, 4, -AY_CHB_PER_L -, 8 ); - -1505 - `ygbs - -ic -, "R3 Pch B H $%02X %%", 2, 5, -AY_CHB_PER_H -, 4 ); - -1506 - `ygbs - -ic -, "R4 Pch C L $%02X %%", 2, 6, -AY_CHC_PER_L -, 8 ); - -1507 - `ygbs - -ic -, "R5 Pch C H $%02X %%", 2, 7, -AY_CHC_PER_H -, 4 ); - -1509 - `ygbs - -ic -, "R6 Noi $%02X %%", 2, 9, -AY_NOISE_PER -, 5 ); - -1510 - `ygbs - -ic -, "R7 Stu $%02X %%", 2,10, -AY_STATUS -, 7 ); - -1512 - `ygbs - -ic -, "R8 VumA $%02X %%", 2,12, -AY_CHA_AMP -, 5 ); - -1513 - `ygbs - -ic -, "R9 VumB $%02X %%", 2,13, -AY_CHB_AMP -, 5 ); - -1514 - `ygbs - -ic -, "RA VumC $%02X %%", 2,14, -AY_CHC_AMP -, 5 ); - -1516 - `ygbs - -ic -, "RB Env P L $%02X %%", 2,16, -AY_ENV_PER_L -, 8 ); - -1517 - `ygbs - -ic -, "RC Env P H $%02X %%", 2,17, -AY_ENV_PER_H -, 8 ); - -1518 - `ygbs - -ic -, "RD Env Cy$%02X %%", 2,18, -AY_ENV_CYCLE -, 4 ); - -1519 - `ygbs - -ic -, "RE Key C $%02X %%", 2,19, -AY_PORT_A -, 8 ); - -1539 - } -} - -1561  - $m_upde_disk - -mache - * -ic - ) - -1563 * -me -; - -1565 if -ic --> -drivy - = -DRV_NONE - ) - -1568 if -ic --> -drivy - = -DRV_PRAVETZ - ) - -1570  -i - = -ic --> -wddisk -. -c_drive -; - -1571 - `tztos - -tz -[ -TZ_DISK -], 2, 2, "DRIVE=%02X EXT=%04X", - -1572 -ic --> -wddisk -. -c_drive -, - -1573 -ic --> -avz -. -exnsi - ); - -1574 - `tztos - -tz -[ -TZ_DISK -], 2, 3, "VOL=%02X SEL=%02X", - -1575 -ic --> -avz -. -drv -[ -i -]. -vume -, - -1576 -ic --> -avz -. -drv -[ -i -]. - - ); - -1577 - `tztos - -tz -[ -TZ_DISK -], 2, 4, "MOTOR=%01X WRRDY=%01X", - -1578 -ic --> -avz -. -drv -[ -i -]. -m_ -, - -1579 -ic --> -avz -. -drv -[ -i -]. -wre_ady - ); - -1580 - `tztos - -tz -[ -TZ_DISK -], 2, 5, "OVRAM=%s", -ic --> -avz -. -ay - ? "ON " : "OFF" ); - -1584 -me - = "Unknown "; - -1585  -ic --> -wddisk -. -cut - ) - -1587  -COP_NUFFINK -: -me - = "Idle "; ; - -1588  -COP_READ_TRACK -: -me - = "Readrack "; ; - -1589  -COP_READ_SECTOR -: -me - = "Read sector "; ; - -1590  -COP_READ_SECTORS -: -me - = "Read sectors "; ; - -1591  -COP_WRITE_TRACK -: -me - = "Writerack "; ; - -1592  -COP_WRITE_SECTOR -: -me - = "Write sector "; ; - -1593  -COP_WRITE_SECTORS -: -me - = "Write sectors"; ; - -1594  -COP_READ_ADDRESS -: -me - = "Readddress "; ; - -1597 - `tztos - -tz -[ -TZ_DISK -], 2, 2, "STATUS=%02X ROMDIS=%1X", -ic --> -wddisk -. -r_us -, oric-> -romdis - ); - -1598 - `tztos - -tz -[ -TZ_DISK -], 2, 3, "DRIVE=%02X SIDE=%02X TRACK=%02X", - -1599 -ic --> -wddisk -. -c_drive -, - -1600 -ic --> -wddisk -. -c_side -, - -1601 -ic --> -wddisk -. -c_ack - ); - -1602 - `tztos - -tz -[ -TZ_DISK -], 2, 4, "SECTR=%02X DATA=%02X", - -1603 -ic --> -wddisk -. -r_ -, - -1604 -ic --> -wddisk -. -r_da - ); - -1605 - `tztos - -tz -[ -TZ_DISK -], 2, 5, "OP=%s", -me - ); - -1606 - `tztos - -tz -[ -TZ_DISK -], 2, 6, "IRQC=%03d DRQC=%03d", - -1607 -ic --> -wddisk -. -dayedt -, - -1608 -ic --> -wddisk -. -dayeddrq - ); - -1610  -ic --> -drivy - ) - -1612  -DRV_MICRODISC -: - -1613 - `tztos - -tz -[ -TZ_DISK -], 2, 8, "MDSTAT=%02X INTRQ=%1X DRQ=%1X", - -1614 -ic --> -md -. -us -, - -1615 -ic --> -md -. -q -!=0, - -1616 -ic --> -md -. -drq -!=0 ); - -1617 - `tztos - -tz -[ -TZ_DISK -], 2, 9, "EPROM=%1X", -ic --> -md -. -diskrom - ); - -1620  -DRV_JASMIN -: - -1621 - `tztos - -tz -[ -TZ_DISK -], 2, 8, "OVRAM=%s", -ic --> -jasm -. -ay - ? "ON " : "OFF" ); - -1624 - } -} - -1626  - $m_e_t - -mache - * -ic - ) - -1628 -mwch_dvid - = -SDL_FALSE -; - -1629 -u_dvid - = -SDL_FALSE -; - -1630 -ay_dvid - = -SDL_FALSE -; - -1631 -v_dvid - = -SDL_FALSE -; - -1632 -v2_dvid - = -SDL_FALSE -; - -1633 - } -} - -1635  - $m_upde_mwch - -mache - * -ic - ) - -1637  -addr -; - -1638  -j -, -k -, -l -; - -1639  -v -; - -1641 if -mw_l - ) - -1643 -tz -[ -TZ_MEMWATCH -]-> -tx -[ 50] = -mw_which -==0 ? 14 : 5; - -1644 -tz -[ -TZ_MEMWATCH -]-> -tx -[550] = -mw_which -==1 ? 14 : 5; - -1646  -offs - = 10* -tz -[ -TZ_MEMWATCH -]-> -w -+1; - -1647  -k -=0; k<48; k++ ) - -1648 -tz -[ -TZ_MEMWATCH -]-> -tx -[ -offs -+ -k -] = 32; - -1649 -tz -[ -TZ_MEMWATCH -]-> -tx -[ 50] = 5; - -1650 -tz -[ -TZ_MEMWATCH -]-> -tx -[550] = 5; - -1654 -addr - = -mw_addr -[0]; - -1655  -j -=0; j<19; j++, -addr -+=8 ) - -1657 if -mw_l - ) && ( -j - == 9 ) ) - -1659  -offs - = 10* -tz -[ -TZ_MEMWATCH -]-> -w -+1; - -1660  -k -=0; k<48; k++ ) - -1662 -tz -[ -TZ_MEMWATCH -]-> -tx -[ -offs -+ -k -] = 2; - -1663 -tz -[ -TZ_MEMWATCH -]-> -bc -[ -offs -+ -k -] = 3; - -1664 -tz -[ -TZ_MEMWATCH -]-> -fc -[ -offs -+ -k -] = 2; - -1666 -j -++; - -1667 -addr - = -mw_addr -[1]; - -1670 - `rtf - -vtmp -, "%04X ", -addr - ); - -1671  -k -=0; k<8; k++ ) - -1673  -tmp -[8]; - -1674 - `tf - -tmp -, 7, "%02X ", - `m_ad - -ic -, -addr -+ -k - ) ); - -1675 - `rt - -vtmp -, -tmp - ); - -1677 -l - = () - ` - -vtmp - ); - -1678 -vtmp -[ -l -++] = 32; - -1679 -vtmp -[ -l -++] = '\''; - -1680  -k -=0; k<8; k++ ) - -1682 -v - = - `m_ad - -ic -, -addr -+ -k - ); - -1683 -vtmp -[ -l -++] = (( -v ->31)&&(v<128))?v:'.'; - -1685 -vtmp -[ -l -++] = '\''; - -1686 -vtmp -[ -l -++] = 0; - -1687 - `tzos - -tz -[ -TZ_MEMWATCH -], 1, -j -+1, -vtmp - ); - -1689 if -mwch_dvid - ) - -1691  -k -=0; k<8; k++ ) - -1693 if - `iam - -ic -, -addr -+ -k - ) && ( -mwch_d -[addr+k] ! - `m_ad -( oric,ddr+k ) ) ) - -1695  -offs - = ( -j -+1)* -tz -[ -TZ_MEMWATCH -]-> -w -; - -1696 -tz -[ -TZ_MEMWATCH -]-> -fc -[ -offs -+( -k -*3+7)] = 1; - -1697 -tz -[ -TZ_MEMWATCH -]-> -fc -[ -offs -+( -k -*3+8)] = 1; - -1698 -tz -[ -TZ_MEMWATCH -]-> -fc -[ -offs -+( -k -+33)] = 1; - -1699 -tz -[ -TZ_MEMWATCH -]-> -bc -[ -offs -+( -k -*3+7)] = 8; - -1700 -tz -[ -TZ_MEMWATCH -]-> -bc -[ -offs -+( -k -*3+8)] = 8; - -1701 -tz -[ -TZ_MEMWATCH -]-> -bc -[ -offs -+( -k -+33)] = 8; - -1707 if -mw_mode - == 0 ) ; - -1709 - `makebox - -tz -[ -TZ_MEMWATCH -], 17, 8, 7, 3, 2, 3 ); - -1710 - `tzos - -tz -[ -TZ_MEMWATCH -], 18, 9, -mw_ibuf - ); - -1711 - } -} - -1713  - $m_upde - -mache - * -ic - ) - -1715 - `m_upde_gs - -ic - ); - -1716  -mshow - ) - -1718  -MSHOW_VIA -: - -1719 - `m_upde_v - -ic -, -tz -[ -TZ_VIA -], &ic-> -v -, & -v_d -, & -v_dvid - ); - -1722  -MSHOW_VIA2 -: - -1723 - `m_upde_v - -ic -, -tz -[ -TZ_VIA2 -], &ic-> -_v -, & -v2_d -, & -v2_dvid - ); - -1726  -MSHOW_AY -: - -1727 - `m_upde_ay - -ic - ); - -1730  -MSHOW_DISK -: - -1731 - `m_upde_disk - -ic - ); - -1735  -cshow - ) - -1737  -CSHOW_MWATCH -: - -1738 - `m_upde_mwch - -ic - ); - -1741 - } -} - -1743  - $m_nd - -mache - * -ic - ) - -1745 i( -updvw -) - -1746 - `u_ndsn - -ic - ); - -1747 -ic --> - `nd_video -ic, -SDL_FALSE - ); - -1749  -mshow - ) - -1751  -MSHOW_VIA -: - -1752 -ic --> - `nd_xtze -ic, -TZ_VIA - ); - -1755  -MSHOW_VIA2 -: - -1756 -ic --> - `nd_xtze -ic, -TZ_VIA2 - ); - -1759  -MSHOW_AY -: - -1760 -ic --> - `nd_xtze -ic, -TZ_AY - ); - -1763  -MSHOW_DISK -: - -1764 -ic --> - `nd_xtze -ic, -TZ_DISK - ); - -1768  -cshow - ) - -1770  -CSHOW_CONSOLE -: - -1771 -ic --> - `nd_xtze -ic, -TZ_MONITOR - ); - -1774  -CSHOW_DEBUG -: - -1775 -ic --> - `nd_xtze -ic, -TZ_DEBUG - ); - -1778  -CSHOW_MWATCH -: - -1779 -ic --> - `nd_xtze -ic, -TZ_MEMWATCH - ); - -1782 -ic --> - `nd_xtze -ic, -TZ_REGS - ); - -1783 - } -} - -1785  - $m_hide_curs -( ) - -1787  -xtze - * -z - = -tz -[ -TZ_MONITOR -]; - -1788  -x - = -cursx -- -off -; - -1790 if -m_asmmode - ) - -1792 -z --> -fc -[z-> -w -*19+8+ -x -] = 2; - -1793 -z --> -bc -[z-> -w -*19+8+ -x -] = 3; - -1797 if -x - < 0 ) || ( x > -CONS_WIDTH - ) ) ; - -1798 -z --> -fc -[z-> -w -*19+2+ -x -] = 2; - -1799 -z --> -bc -[z-> -w -*19+2+ -x -] = 3; - -1800 - } -} - -1802  - $m_show_curs -( ) - -1804  -xtze - * -z - = -tz -[ -TZ_MONITOR -]; - -1805  -x - = -cursx -- -off -; - -1807 if -m_asmmode - ) - -1809 -z --> -fc -[z-> -w -*19+8+ -x -] = 3; - -1810 -z --> -bc -[z-> -w -*19+8+ -x -] = 2; - -1814 if -x - < 0 ) || ( x > -CONS_WIDTH - ) ) ; - -1815 -z --> -fc -[z-> -w -*19+2+ -x -] = 3; - -1816 -z --> -bc -[z-> -w -*19+2+ -x -] = 2; - -1817 - } -} - -1819  - $m_sl - -SDL_bo - -above - ) - -1821  -x -, -y -, -s -, -d -, -h -; - -1822  -xtze - * -z - = -tz -[ -TZ_MONITOR -]; - -1824 -h - = -above - ? 17 : 18; - -1826 -s - = -z --> -w -*2+1; - -1827 -d - = -z --> -w -+1; - -1828  -y -=0; y< -h -; y++ ) - -1830  -x -=0; x<48; x++ ) - -1832 -z --> -tx -[ -d -] =tz->tx[ -s -]; - -1833 -z --> -fc -[ -d -] =tz->fc[ -s -]; - -1834 -z --> -bc -[ -d -++] =tz->bc[ -s -++]; - -1836 -d - += 2; - -1837 -s - += 2; - -1840  -x -=0; x<48; x++ ) - -1842 -z --> -tx -[ -d -] = ' '; - -1843 -z --> -fc -[ -d -] = 2; - -1844 -z --> -bc -[ -d -++] = 3; - -1846 - } -} - -1848  - $m_rtf -* -fmt -, ... ) - -1850 -va_li - - -; - -1851  -i -; - -1852  -mp -[48]; - -1854 - `va_t - - -, -fmt - ); - -1855 if - `vtf - -vtmp -, -VSPTMPSIZE -, -fmt -, - - ) != -1 ) - -1857 -vtmp -[ -VSPTMPSIZE --1] = 0; - -1858 -i - = 0; - -1859  - ` -& -vtmp -[ -i -] ) > 47 ) - -1861 - `y - -mp -, & -vtmp -[ -i -], 47 ); - -1862 -mp -[47] = 0; - -1863 - `tzos - -tz -[ -TZ_MONITOR -], 1, 19, -mp - ); - -1864 - `m_sl - -SDL_FALSE - ); - -1865 -i - += 47; - -1867 - `tzos - -tz -[ -TZ_MONITOR -], 1, 19, & -vtmp -[ -i -] ); - -1869 - `va_d - - - ); - -1870 - } -} - -1872  - $m_tf -* -fmt -, ... ) - -1874 -va_li - - -; - -1875  -i -; - -1876  -mp -[48]; - -1878 - `m_sl - -SDL_FALSE - ); - -1880 - `va_t - - -, -fmt - ); - -1881 if - `vtf - -vtmp -, -VSPTMPSIZE -, -fmt -, - - ) != -1 ) - -1883 -vtmp -[ -VSPTMPSIZE --1] = 0; - -1884 -i - = 0; - -1885  - ` -& -vtmp -[ -i -] ) > 46 ) - -1887 - `y - -mp -, & -vtmp -[ -i -], 46 ); - -1888 -mp -[46] = 0; - -1889 - `tzos - -tz -[ -TZ_MONITOR -], 1, 19, -mp - ); - -1890 - `m_sl - -SDL_FALSE - ); - -1891 -i - += 46; - -1893 - `tzos - -tz -[ -TZ_MONITOR -], 1, 19, & -vtmp -[ -i -] ); - -1895 - `va_d - - - ); - -1896 - } -} - -1898  - $m_tf_above -* -fmt -, ... ) - -1900 -va_li - - -; - -1901  -i -; - -1902  -mp -[48]; - -1904 - `m_sl - -SDL_TRUE - ); - -1906 - `va_t - - -, -fmt - ); - -1907 if - `vtf - -vtmp -, -VSPTMPSIZE -, -fmt -, - - ) != -1 ) - -1909 -vtmp -[ -VSPTMPSIZE --1] = 0; - -1910 -i - = 0; - -1911  - ` -& -vtmp -[ -i -] ) > 46 ) - -1913 - `y - -mp -, & -vtmp -[ -i -], 46 ); - -1914 -mp -[46] = 0; - -1915 - `tzos - -tz -[ -TZ_MONITOR -], 1, 18, -mp - ); - -1916 - `m_sl - -SDL_TRUE - ); - -1917 -i - += 46; - -1919 - `tzos - -tz -[ -TZ_MONITOR -], 1, 18, & -vtmp -[ -i -] ); - -1921 - `va_d - - - ); - -1922 - } -} - -1924  - $m_r -* -r - ) - -1926 - `m_sl - -SDL_FALSE - ); - -1927 - `tzos - -tz -[ -TZ_MONITOR -], 1, 19, -r - ); - -1928 - } -} - -1930  - $m_r_above -* -r - ) - -1932 - `m_sl - -SDL_TRUE - ); - -1933 - `tzos - -tz -[ -TZ_MONITOR -], 1, 18, -r - ); - -1934 - } -} - -1936  - $m_t_put -( ) - -1938 - `m_sl - -SDL_FALSE - ); - -1939 -ibuf -[0] = 0; - -1940 - - = 0; - -1941 -off - = 0; - -1942 -cursx - = 0; - -1944 if -m_asmmode - ) - -1946 - `tztc - -tz -[ -TZ_MONITOR -], 1, 3 ); - -1947 - `tztos - -tz -[ -TZ_MONITOR -], 1, 19, " %04X:", -m_addr - ); - -1950 - `tztc - -tz -[ -TZ_MONITOR -], 1, 3 ); - -1951 - `tzos - -tz -[ -TZ_MONITOR -], 1, 19, "]" ); - -1952 - } -} - -1954  - $m_r - -mache - * -ic - ) - -1956 -deusyms -. -syms - = -NULL -; - -1957 -deusyms -. -numsyms - = 0; - -1958 -deusyms -. -syma - = -1; - -1959  -ic --> -ty - ) - -1961  -MACH_ORIC1 -: - -1962  -MACH_ORIC1_16K -: - -1963  -MACH_ATMOS -: - -1964  -MACH_PRAVETZ -: - -1965 -deusyms -. -syms - = -defsym_mos -; - -1966 -deusyms -. -numsyms - =  -defsym_mos - ) /  -msym - ); - -1969  -MACH_TELESTRAT -: - -1970 -deusyms -. -syms - = -defsym_ -; - -1971 -deusyms -. -numsyms - =  -defsym_ - ) /  -msym - ); - -1975 if -m_bpmsg -[0] ) - -1977 - `m_tf_above - -m_bpmsg - ); - -1978 -m_bpmsg -[0] = 0; - -1981 -modifd - = -SDL_FALSE -; - -1982 -updvw - = -SDL_TRUE -; - -1983 - } -} - -1985  - $m_wm - -mache - * -ic - ) - -1987 - `m_t_put -(); - -1988 - `m_show_curs -(); - -1989 - } -} - -1991  - $m_ - -mache - * -ic - ) - -1993 -deusyms -. -numsyms - = 0; - -1994 -deusyms -. -syma - = 0; - -1995 -deusyms -. -syms - = -NULL -; - -1996 -ic --> -ursyms -. -numsyms - = 0; - -1997 -ic --> -ursyms -. -syma - = 0; - -1998 -ic --> -ursyms -. -syms - = -NULL -; - -2000 -m_bpmsg -[0] = 0; - -2001 -mshow - = -MSHOW_VIA -; - -2002 -cshow - = -CSHOW_CONSOLE -; - -2003 -m_asmmode - = -SDL_FALSE -; - -2004 - `m_t_put -(); - -2005 - `m_show_curs -(); - -2006 -m_addr - = -ic --> -u -. -pc -; - -2007 -ϡcmd - = 0; - -2008 -mw_l - = -SDL_FALSE -; - -2009 -mw_which - = 0; - -2010 -mwch_dvid - = -SDL_FALSE -; - -2011 -u_dvid - = -SDL_FALSE -; - -2012 -ay_dvid - = -SDL_FALSE -; - -2013 -v_dvid - = -SDL_FALSE -; - -2014 #i -LOG_DEBUG - - -2015 -debug_logfe - = - `fݒ - -debug_logme -, "w" ); - -2017 - } -} - -2019  - $m_shut - -mache - * -ic - ) - -2021 - `m_syms -& -ic --> -ursyms - ); - -2022 #i -LOG_DEBUG - - -2023 if -debug_logfe - ) - `fo -( debug_logfile ); - -2024 -debug_logfe - = -NULL -; - -2026 - } -} - -2028  - $m_gg -* -buf -, * -off -, -SDL_bo - -addegs -, SDL_bo -egs -, SDL_bo -vgs - ) - -2030  -i -; - -2032 -i - = * -off -; - -2034  - `isws - -buf -[ -i -] ) ) i++; - -2036 if -vgs - ) - -2038 if - `cmp -& -buf -[ -i -], "vpcr", 4 ) == 0 ) - -2040 -i -+=4; - -2041 * -off - = -i -; - -2042  -REG_VIA_PCR -; - -2045 if - `cmp -& -buf -[ -i -], "vacr", 4 ) == 0 ) - -2047 -i -+=4; - -2048 * -off - = -i -; - -2049  -REG_VIA_ACR -; - -2052 if - `cmp -& -buf -[ -i -], "vsr", 3 ) == 0 ) - -2054 -i -+=3; - -2055 * -off - = -i -; - -2056  -REG_VIA_SR -; - -2059 if - `cmp -& -buf -[ -i -], "vifr", 4 ) == 0 ) - -2061 -i -+=4; - -2062 * -off - = -i -; - -2063  -REG_VIA_IFR -; - -2066 if - `cmp -& -buf -[ -i -], "vier", 4 ) == 0 ) - -2068 -i -+=4; - -2069 * -off - = -i -; - -2070  -REG_VIA_IER -; - -2073 if - `cmp -& -buf -[ -i -], "vira", 4 ) == 0 ) - -2075 -i -+=4; - -2076 * -off - = -i -; - -2077  -REG_VIA_IRA -; - -2080 if - `cmp -& -buf -[ -i -], "vora", 4 ) == 0 ) - -2082 -i -+=4; - -2083 * -off - = -i -; - -2084  -REG_VIA_ORA -; - -2087 if - `cmp -& -buf -[ -i -], "vddra", 5 ) == 0 ) - -2089 -i -+=5; - -2090 * -off - = -i -; - -2091  -REG_VIA_DDRA -; - -2094 if - `cmp -& -buf -[ -i -], "virb", 4 ) == 0 ) - -2096 -i -+=4; - -2097 * -off - = -i -; - -2098  -REG_VIA_IRB -; - -2101 if - `cmp -& -buf -[ -i -], "vorb", 4 ) == 0 ) - -2103 -i -+=4; - -2104 * -off - = -i -; - -2105  -REG_VIA_ORB -; - -2108 if - `cmp -& -buf -[ -i -], "vddrb", 5 ) == 0 ) - -2110 -i -+=5; - -2111 * -off - = -i -; - -2112  -REG_VIA_DDRB -; - -2115 if - `cmp -& -buf -[ -i -], "vt1l", 4 ) == 0 ) - -2117 -i -+=4; - -2118 * -off - = -i -; - -2119  -REG_VIA_T1L -; - -2122 if - `cmp -& -buf -[ -i -], "vt1c", 4 ) == 0 ) - -2124 -i -+=4; - -2125 * -off - = -i -; - -2126  -REG_VIA_T1C -; - -2129 if - `cmp -& -buf -[ -i -], "vt2l", 4 ) == 0 ) - -2131 -i -+=4; - -2132 * -off - = -i -; - -2133  -REG_VIA_T2L -; - -2136 if - `cmp -& -buf -[ -i -], "vt2c", 4 ) == 0 ) - -2138 -i -+=4; - -2139 * -off - = -i -; - -2140  -REG_VIA_T2C -; - -2143 if - `cmp -& -buf -[ -i -], "vca1", 4 ) == 0 ) - -2145 -i -+=4; - -2146 * -off - = -i -; - -2147  -REG_VIA_CA1 -; - -2150 if - `cmp -& -buf -[ -i -], "vca2", 4 ) == 0 ) - -2152 -i -+=4; - -2153 * -off - = -i -; - -2154  -REG_VIA_CA2 -; - -2157 if - `cmp -& -buf -[ -i -], "vcb1", 4 ) == 0 ) - -2159 -i -+=4; - -2160 * -off - = -i -; - -2161  -REG_VIA_CB1 -; - -2164 if - `cmp -& -buf -[ -i -], "vcb2", 4 ) == 0 ) - -2166 -i -+=4; - -2167 * -off - = -i -; - -2168  -REG_VIA_CA2 -; - -2172 if -addegs - ) - -2174 if - `cmp -& -buf -[ -i -], "pc", 2 ) == 0 ) - -2176 -i -+=2; - -2177 * -off - = -i -; - -2178  -REG_PC -; - -2181 if - `cmp -& -buf -[ -i -], "sp", 2 ) == 0 ) - -2183 -i -+=2; - -2184 * -off - = -i -; - -2185  -REG_SP -; - -2189 if -egs - ) - -2191  -buf -[ -i -] ) - -2195 -i -++; - -2196 * -off - = -i -; - -2197  -REG_A -; - -2201 -i -++; - -2202 * -off - = -i -; - -2203  -REG_X -; - -2207 -i -++; - -2208 * -off - = -i -; - -2209  -REG_Y -; - -2214 - } -} - -2216 -SDL_bo - - $m_gnum - -mache - * -ic -, * -num -, * -buf -, * -off -, -SDL_bo - -addegs -, SDL_bo -egs -, SDL_bo -vgs -, SDL_bo -symbs - ) - -2218  -i -, -j -; - -2219  -c -; - -2220  -v -; - -2222 -i - = * -off -; - -2223  - `isws - -buf -[ -i -] ) ) i++; - -2225 if -symbs - ) && ( - `issymt - -buf -[ -i -] ) ) ) - -2227  -msym - * -fsym -; - -2229  -j -=0; - `issymch - -buf -[ -i -+j] ); j++ ) ; - -2230 -c - = -buf -[ -i -+ -j -]; - -2231 if - `isws - -c - ) || ( c == 13 ) || ( c == 10 ) || ( c == 0 ) || ( c == ',' ) || ( c == ')' ) ) - -2233 -buf -[ -i -+ -j -] = 0; - -2234 -fsym - = - `m_fd_sym_by_me - -ic -, & -buf -[ -i -] ); - -2235 -buf -[ -i -+ -j -] = -c -; - -2236 if -fsym - ) - -2238 (* -num - -fsym --> -addr -; - -2239 (* -off - -i -+ -j -; - -2240  -SDL_TRUE -; - -2245 -j - = - `m_gg - -buf -, -off -, -addegs -, -egs -, -vgs - ); - -2246 if -j - != -1 ) - -2248  -j - ) - -2250  -REG_A -: - -2251 * -num - = -ic --> -u -. -a -; - -2252  -SDL_TRUE -; - -2253  -REG_X -: - -2254 * -num - = -ic --> -u -. -x -; - -2255  -SDL_TRUE -; - -2256  -REG_Y -: - -2257 * -num - = -ic --> -u -. -y -; - -2258  -SDL_TRUE -; - -2259  -REG_PC -: - -2260 * -num - = -ic --> -u -. -pc -; - -2261  -SDL_TRUE -; - -2262  -REG_SP -: - -2263 * -num - = -ic --> -u -. - -|0x100; - -2264  -SDL_TRUE -; - -2265  -REG_VIA_PCR -: - -2266 * -num - = -ic --> -v -. -p -; - -2267  -SDL_TRUE -; - -2268  -REG_VIA_ACR -: - -2269 * -num - = -ic --> -v -. -a -; - -2270  -SDL_TRUE -; - -2271  -REG_VIA_SR -: - -2272 * -num - = -ic --> -v -. - -; - -2273  -SDL_TRUE -; - -2274  -REG_VIA_IFR -: - -2275 * -num - = -ic --> -v -. -i -; - -2276  -SDL_TRUE -; - -2277  -REG_VIA_IER -: - -2278 * -num - = -ic --> -v -. -r -; - -2279  -SDL_TRUE -; - -2280  -REG_VIA_IRA -: - -2281 * -num - = -ic --> -v -. -a -; - -2282  -SDL_TRUE -; - -2283  -REG_VIA_ORA -: - -2284 * -num - = -ic --> -v -. -a -; - -2285  -SDL_TRUE -; - -2286  -REG_VIA_DDRA -: - -2287 * -num - = -ic --> -v -. -dd -; - -2288  -SDL_TRUE -; - -2289  -REG_VIA_IRB -: - -2290 * -num - = -ic --> -v -. -b -; - -2291  -SDL_TRUE -; - -2292  -REG_VIA_ORB -: - -2293 * -num - = -ic --> -v -. -b -; - -2294  -SDL_TRUE -; - -2295  -REG_VIA_DDRB -: - -2296 * -num - = -ic --> -v -. -ddrb -; - -2297  -SDL_TRUE -; - -2298  -REG_VIA_T1L -: - -2299 * -num - = ( -ic --> -v -. -t1l_h -<<8)|ic->v. -t1l_l -; - -2300  -SDL_TRUE -; - -2301  -REG_VIA_T1C -: - -2302 * -num - = -ic --> -v -. -t1c -; - -2303  -SDL_TRUE -; - -2304  -REG_VIA_T2L -: - -2305 * -num - = ( -ic --> -v -. -t2l_h -<<8)|ic->v. -t2l_l -; - -2306  -SDL_TRUE -; - -2307  -REG_VIA_T2C -: - -2308 * -num - = -ic --> -v -. -t2c -; - -2309  -SDL_TRUE -; - -2310  -REG_VIA_CA1 -: - -2311 * -num - = -ic --> -v -. -1 -; - -2312  -SDL_TRUE -; - -2313  -REG_VIA_CA2 -: - -2314 * -num - = -ic --> -v -. -2 -; - -2315  -SDL_TRUE -; - -2316  -REG_VIA_CB1 -: - -2317 * -num - = -ic --> -v -. -cb1 -; - -2318  -SDL_TRUE -; - -2319  -REG_VIA_CB2 -: - -2320 * -num - = -ic --> -v -. -cb2 -; - -2321  -SDL_TRUE -; - -2325 if -buf -[ -i -] == '%' ) - -2328 -i -++; - -2329 if! - `isb - -buf -[ -i -] ) )  -SDL_FALSE -; - -2331 -v - = 0; - -2332  - `isb - -buf -[ -i -] ) ) - -2334 -v - = (v<<1| ( -buf -[ -i -]-'0'); - -2335 -i -++; - -2338 * -num - = -v -; - -2339 * -off - = -i -; - -2340  -SDL_TRUE -; - -2343 if -buf -[ -i -] == '$' ) - -2346 -i -++; - -2347 if! - `ishex - -buf -[ -i -] ) )  -SDL_FALSE -; - -2349 -v - = 0; - -2352 -j - = - `hex - -buf -[ -i -] ); - -2353 if -j - == -1 ) ; - -2354 -v - = (v<<4| -j -; - -2355 -i -++; - -2358 * -num - = -v -; - -2359 * -off - = -i -; - -2360  -SDL_TRUE -; - -2363 if! - `ium - -buf -[ -i -] ) )  -SDL_FALSE -; - -2365 -v - = 0; - -2366  - `ium - -buf -[ -i -] ) ) - -2368 -v - = (v*10+ ( -buf -[ -i -]-'0'); - -2369 -i -++; - -2372 * -num - = -v -; - -2373 * -off - = -i -; - -2374  -SDL_TRUE -; - -2375 - } -} - -2377 -Ut16 - - $m_sym_be_guess - -mache - * -ic -, -Ut16 - -addr -, * -symme -, -SDL_bo - -u_emu_e - ) - -2380 if -addr - >= 0xc000 ) - -2383 if -ic --> -ty - = -MACH_TELESTRAT - ) - -2386 if -symme -[0] == 't' ) && - -2387 -symme -[1] >= '0' ) && ( symname[1] <= '7' ) ) && - -2388 -symme -[2] == '_' ) ) - -2389  -SYMF_TELEBANK0 - << ( -symme -[1]-'0'); - -2392 if -u_emu_e - ) - -2393  -SYMF_TELEBANK0 - << -ic --> -_cubk -; - -2396  -SYMF_TELEBANK0 -| -SYMF_TELEBANK1 -| -SYMF_TELEBANK2 -| -SYMF_TELEBANK3 -| -SYMF_TELEBANK4 -| -SYMF_TELEBANK5 -| -SYMF_TELEBANK6 -| -SYMF_TELEBANK7 -; - -2400 if -u_emu_e - ) - -2402  -romdis - = -ic -->romdis; - -2403 if -ic --> -drivy - = -DRV_JASMIN - ) && ( oric-> -jasm -. -ay - ) ) - -2404 -romdis - = 1; - -2406  -romdis - ? -SYMF_ROMDIS1 - : -SYMF_ROMDIS0 -; - -2409  -SYMF_ROMDIS1 -; - -2414 - } -} - -2416  -msym - * - $m_a__add_symb - -symbޏb - * -ab -,  -mache - * -ic -, * -symme -,  -ags -, -Ut16 - -addr - ) - -2418  -i -; - -2419  -symtmp -[160]; - -2420  -msym - * -tv - = -NULL -; - -2422  -i -=0; - `issymch -( -symme -[i]); i++ ) - -2423 -symtmp -[ -i -] = -symme -[i]; - -2424 -symtmp -[ -i -] = 0; - -2427 if -ab --> -syma - =-1 )  -tv -; - -2429 if -ags - = -SYM_BESTGUESS - ) - -2430 -ags - = - `m_sym_be_guess - -ic -, -addr -, -symtmp -, -SDL_TRUE - ); - -2432  -i -=0; i< -ab --> -numsyms -; i++ ) - -2434 if! -ic --> -symbs - ) - -2436 if - `rcmp - -symtmp -, -ab --> -syms -[ -i -]. -me - ) == 0 ) - -2439 if - `rcmp - -symtmp -, -ab --> -syms -[ -i -]. -me - ) == 0 ) - -2445 if -i - < -ab --> -numsyms - ) - -2447 -ab --> -syms -[ -i -]. -addr - =ddr; - -2448 -ab --> -syms -[ -i -]. -ags - = flags; - -2449  & -ab --> -syms -[ -i -]; - -2452 - `m_addsym - -ab -, -addr -, -ags -, -symtmp -, & -tv - ); - -2453  -tv -; - -2454 - } -} - -2456 -SDL_bo - - $m_symsomsh - -symbޏb - * -ab -, * -bufr -,  -n -) - -2458  -offs -, -symn -, -addr -, -ags -; - -2459 * -symme -; - -2461 -ab --> -numsyms - = 0; - -2463 -offs - = 0; - -2464  -offs - < -n -) - -2466 -symn - = ( -bufr -[ -offs -]<<24)|(buffer[offs+1]<<16)|(buffer[offs+2]<<8)|buffer[offs+3]; - -2467 -offs -+=4; - -2468 i( -symn -+ -offs - > -n - -SDL_FALSE -; - -2470 -symme - = (*)(& -bufr -[ -offs -]); - -2471 -offs - + -symn -; - -2473 -addr - = ( -bufr -[ -offs -]<<8)|buffer[offs+1]; - -2474 -offs - += 2; - -2476 -ags - = ( -bufr -[ -offs -]<<8)|buffer[offs+1]; - -2477 -offs - += 2; - -2479 - `m_addsym - -ab -, -addr -, -ags -, -symme -, -NULL - ); - -2482  -SDL_TRUE -; - -2483 - } -} - -2487 -SDL_bo - - $m_w_symbs - -symbޏb - * -ab -,  -mache - * -ic -, * -ame -,  -ags -, -SDL_bo - -above -, SDL_bo -vbo - ) - -2489 -FILE - * -f -; - -2490  -i -, -j -; - -2491  -v -; - -2493 -f - = - `fݒ - -ame -, "r" ); - -2494 if! -f - ) - -2496 if -vbo - ) - -2498 if -above - ) - -2499 - `m_tf_above -"Ubˁݒ '%s'", -ame - ); - -2501 - `m_tf -"Ubˁݒ '%s'", -ame - ); - -2503  -SDL_FALSE -; - -2506 -ab --> -numsyms - = 0; - -2507  ! - `of - -f - ) ) - -2509  -lmp -[256]; - -2511 if! - `fgs - -lmp -, 256, -f - ) ) ; - -2513 if - `ssnf - -lmp -, " %06X .%s", & -v -,inetmp ) != 2 ) - -2515  -i -=0, -v -=0; i<4; i++ ) - -2517 -j - = - `hex - -lmp -[ -i -] ); - -2518 if -j - == -1 ) ; - -2519 -v - = (v<<4)| -j -; - -2521 if -i - < 4 ) ; - -2522 if -lmp -[4] != 32 ) ; - -2523 if! - `issymt - -lmp -[5] ) ) ; - -2525  -i -=5, -j -=0; - `issymch -( -lmp -[i]); i++,j++ ) - -2526 -lmp -[ -j -] =mp[ -i -]; - -2527 -lmp -[ -j -] = 0; - -2531 - `fush - -dout - ); - -2534 if -ags - = -SYM_BESTGUESS - ) - -2536 - `m_addsym - -ab -, -v -, - `m_sym_be_guess - -ic -, v, -lmp -, -SDL_FALSE - ),mp, -NULL - ); - -2538 - `m_addsym - -ab -, -v -, -ags -, -lmp -, -NULL - ); - -2542 - `fo - -f - ); - -2544 if -vbo - ) - -2546 if -above - ) - -2547 - `m_tf_above -"Symbޠlded from '%s'", -ame - ); - -2549 - `m_tf -"Symbޠlded from '%s'", -ame - ); - -2551  -SDL_TRUE -; - -2552 - } -} - -2554 -SDL_bo - - $m_cmd -* -cmd -,  -mache - * -ic -, -SDL_bo - * -ednd - ) - -2556  -i -, -j -, -k -, -l -; - -2557  -v -, -w -; - -2558 -SDL_bo - -de - = -SDL_FALSE -; - -2559 * -tmem -; - -2560  -msym - * -tmpsym -; - -2561 -FILE - * -f -; - -2563 -i -=0; - -2564  - `isws - -cmd -[ -i -] ) ) i++; - -2566 if -cmd -[ -i -] != '?' ) - -2567 -hpcou - = 0; - -2569  -cmd -[ -i -] ) - -2572 -ϡcmd - = -cmd -[ -i -]; - -2573 -i -++; - -2575 if - `m_gnum - -ic -, & -v -, -cmd -, & -i -, -SDL_TRUE -, -SDL_FALSE -, SDL_FALSE, SDL_TRUE ) ) - -2576 -m_addr - = -v -; - -2578 -m_asmmode - = -SDL_TRUE -; - -2582 -ϡcmd - = 0; - -2583 -i -++; - -2584  -cmd -[ -i -] ) - -2587 -ic --> -symbs - = -SDL_FALSE -; - -2588 - `m_r -( "Symbolsreot case-sensitive" ); - -2592 -ic --> -symbs - = -SDL_TRUE -; - -2593 - `m_r -( "Symbolsre case-sensitive" ); - -2597 if! - `isws - -cmd -[ -i -+1] ) ) - -2599 - `m_r -( "???" ); - -2603 -i -+=2; - -2604  - `isws - -cmd -[ -i -] ) ) i++; - -2606 if! - `issymt - -cmd -[ -i -] ) ) - -2608 - `m_r -( "Expected symbolamendddress" ); - -2612 -j - = -i -; - -2613  - `issymch - -cmd -[ -i -] ) ) i++; - -2615 if! - `isws - -cmd -[ -i -] ) ) - -2617 - `m_r -( "Expected symbolamendddress" ); - -2621 if! - `m_gnum - -ic -, & -v -, -cmd -, & -i -, -SDL_TRUE -, -SDL_FALSE -, SDL_FALSE, SDL_TRUE ) ) - -2623 - `m_r -( "Addressxpected" ); - -2627 -tmpsym - = - `m_a__add_symb -& -ic --> -ursyms -, oric, & -cmd -[ -j -], -SYM_BESTGUESS -, -v - ); - -2628 if! -tmpsym - ) - -2630 - `m_r -( "Failed for someeason" ); - -2634 - `m_tf -"%%04X", -tmpsym --> -me -,mpsym-> -addr - ); - -2638 if! - `isws - -cmd -[ -i -+1] ) ) - -2640 - `m_r -( "???" ); - -2644 -i -+=2; - -2645  - `isws - -cmd -[ -i -] ) ) i++; - -2647 if! - `issymt - -cmd -[ -i -] ) ) - -2649 - `m_r -( "Symbolxpected" ); - -2653 -j - = -i -; - -2654  - `issymch - -cmd -[ -i -] ) ) i++; - -2656 if -cmd -[ -i -] != 0 ) - -2658 - `m_tf -"Exednd ol '%s'", & -cmd -[ -i -] ); - -2662 if! - `m_b_fd_sym_by_me -& -ic --> -ursyms -, oric, & -cmd -[ -j -], & -k - ) ) - -2664 - `m_tf -"Couldn'fd '%s' ithusymbށab", & -cmd -[ -j -] ); - -2668  ; -k -<( -ic --> -ursyms -. -numsyms --1); k++ ) - -2669 -ic --> -ursyms -. -syms -[ -k -] = oric->usersyms.syms[k+1]; - -2670 -ic --> -ursyms -. -numsyms ---; - -2671 - `m_tf -"Kd symb '%s'", & -cmd -[ -j -] ); - -2675 -ic --> -ursyms -. -numsyms - = 0; - -2676 - `m_r -( "Symbols zapped!" ); - -2680 if! - `isws - -cmd -[ -i -+1] ) ) - -2682 - `m_r -( "???" ); - -2686 -i -+=2; - -2688 - `m_w_symbs -& -ic --> -ursyms -, oric, & -cmd -[ -i -], -SYM_BESTGUESS -, -SDL_FALSE -, -SDL_TRUE - ); - -2692 if! - `isws - -cmd -[ -i -+1] ) ) - -2694 - `m_r -( "???" ); - -2698 -i -+=2; - -2700 -f - = - `fݒ -& -cmd -[ -i -], "w" ); - -2701 if! -f - ) - -2703 - `m_tf -"Ubˁݒ '%s' f wrg", & -cmd -[ -i -] ); - -2707  -j -=0; j< -ic --> -ursyms -. -numsyms -; j++ ) - -2708 - `rtf - -f -, "%04X %s\n", -ic --> -ursyms -. -syms -[ -j -]. -addr -, oric->ursyms.syms[j]. -me - ); - -2709 - `fo - -f - ); - -2711 - `m_tf -"Usymbޠexp܋d'%s'", & -cmd -[ -i -] ); - -2715 - `m_r -( "???" ); - -2721 -ϡcmd - = 0; - -2722 -i -++; - -2723  -cmd -[ -i -] ) - -2726 if -cmd -[ -i -+1] == 'm' ) - -2728 -ic --> -u -. -ymbp - = -SDL_FALSE -; - -2729  -j -=0; j<16; j++ ) - -2731 if -ic --> -u -. -membakpots -[ -j -]. -ags - ) - -2733 - `m_tf -( "%02d: $%04X %c%c%c", - -2734 -j -, - -2735 -ic --> -u -. -membakpots -[ -j -]. -addr -, - -2736 ( -ic --> -u -. -membakpots -[ -j -]. -ags -& -MBPF_READ -) ? 'r' : ' ', - -2737 ( -ic --> -u -. -membakpots -[ -j -]. -ags -& -MBPF_WRITE -) ? 'w' : ' ', - -2738 ( -ic --> -u -. -membakpots -[ -j -]. -ags -& -MBPF_CHANGE -) ? 'c' : ' ' ); - -2739 -ic --> -u -. -ymbp - = -SDL_TRUE -; - -2745 -ic --> -u -. -ybp - = -SDL_FALSE -; - -2746  -j -=0; j<16; j++ ) - -2748 if -ic --> -u -. -bakpots -[ -j -] != -1 ) - -2750 - `m_tf -( "%02d: $%04X %s%s", - -2751 -j -, - -2752 -ic --> -u -. -bakpots -[ -j -], - -2753 ( -ic --> -u -. -bakpot_ags -[ -j -]& -MBPF_RESETCYCLES -) ? "z" : "", - -2754 ( -ic --> -u -. -bakpot_ags -[ -j -]& -MBPF_RESETCYCLESCONTINUE -) ? "c" : ""); - -2755 -ic --> -u -. -ybp - = -SDL_TRUE -; - -2761 if -cmd -[ -i -+1] == 'm' ) - -2763  -j -=0; j<16; j++ ) - -2765 if -ic --> -u -. -membakpots -[ -j -]. -ags - == 0 ) - -2769 if -j - == 16 ) - -2771 - `m_r -( "Max 16 breakpoints" ); - -2775 -i - += 2; - -2776 if! - `m_gnum - -ic -, & -v -, -cmd -, & -i -, -SDL_TRUE -, SDL_TRUE, SDL_TRUE, SDL_TRUE ) ) - -2778 - `m_r -( "Addressxpected" ); - -2782 -ic --> -u -. -membakpots -[ -j -]. -addr - = -v - & 0xffff; - -2783 -ic --> -u -. -membakpots -[ -j -]. -ϡv - = - `m_ad -ic, -v -&0xffff ); - -2784 -ic --> -u -. -membakpots -[ -j -]. -ags - = 0; - -2786  - `isws - -cmd -[ -i -] ) ) i++; - -2790  -cmd -[ -i -] ) - -2793 -ic --> -u -. -membakpots -[ -j -]. -ags - | -MBPF_READ -; - -2794 -i -++; - -2798 -ic --> -u -. -membakpots -[ -j -]. -ags - | -MBPF_WRITE -; - -2799 -i -++; - -2803 -ic --> -u -. -membakpots -[ -j -]. -ags - | -MBPF_CHANGE -; - -2804 -i -++; - -2810 if! -ic --> -u -. -membakpots -[ -j -]. -ags - ) - -2811 -ic --> -u -. -membakpots -[ -j -]. -ags - = -MBPF_READ -| -MBPF_WRITE -; - -2812 -ic --> -u -. -ymbp - = -SDL_TRUE -; - -2814 - `m_tf -"m%02d: $%04X %s%s%s", -j -, -ic --> -u -. -membakpots -[j]. -addr -, - -2815 ( -ic --> -u -. -membakpots -[ -j -]. -ags -& -MBPF_READ -) ? "r" : "", - -2816 ( -ic --> -u -. -membakpots -[ -j -]. -ags -& -MBPF_WRITE -) ? "w" : "", - -2817 ( -ic --> -u -. -membakpots -[ -j -]. -ags -& -MBPF_CHANGE -) ? "c" : "" ); - -2821  -j -=0; j<16; j++ ) - -2823 if -ic --> -u -. -bakpots -[ -j -] == -1 ) - -2827 if -j - == 16 ) - -2829 - `m_r -( "Max 16 breakpoints" ); - -2833 -i -++; - -2834 if! - `m_gnum - -ic -, & -v -, -cmd -, & -i -, -SDL_TRUE -, SDL_TRUE, SDL_TRUE, SDL_TRUE ) ) - -2836 - `m_r -( "Addressxpected" ); - -2840 -ic --> -u -. -bakpots -[ -j -] = -v - & 0xffff; - -2841 -ic --> -u -. -bakpot_ags -[ -j -] = 0; - -2842 -ic --> -u -. -ybp - = -SDL_TRUE -; - -2844  - `isws - -cmd -[ -i -] ) ) i++; - -2848  -cmd -[ -i -] ) - -2851 -ic --> -u -. -bakpot_ags -[ -j -] | -MBPF_RESETCYCLES -; - -2852 -i -++; - -2855 -ic --> -u -. -bakpot_ags -[ -j -] | -MBPF_RESETCYCLESCONTINUE -; - -2856 -i -++; - -2862 - `m_tf -( "%02d: $%04X %s%s", - -2863 -j -, - -2864 -ic --> -u -. -bakpots -[ -j -], - -2865 ( -ic --> -u -. -bakpot_ags -[ -j -]& -MBPF_RESETCYCLES -) ? "z" : "", - -2866 ( -ic --> -u -. -bakpot_ags -[ -j -]& -MBPF_RESETCYCLESCONTINUE -) ? "c" : "" ); - -2870 -j - = 0; - -2871 if -cmd -[ -i -+1] == 'm' ) - -2873 -j - = 1; - -2874 -i -++; - -2877 -i -++; - -2878 if! - `m_gnum - -ic -, & -v -, -cmd -, & -i -, -SDL_FALSE -, SDL_FALSE, SDL_FALSE, SDL_FALSE ) ) - -2880 - `m_r -( "Breakpoint IDxpected" ); - -2884 if -v - > 15 ) - -2886 - `m_r -( "Invalid breakpoint ID" ); - -2890 if -j - ) - -2892 -ic --> -u -. -membakpots -[ -v -]. -ags - = 0; - -2893 -ic --> -u -. -ymbp - = -SDL_FALSE -; - -2894  -j -=0; j<16; j++ ) - -2896 if -ic --> -u -. -membakpots -[ -j -]. -ags - != 0 ) - -2898 -ic --> -u -. -ymbp - = -SDL_TRUE -; - -2905 -ic --> -u -. -bakpots -[ -v -] = -1; - -2906 -ic --> -u -. -ybp - = -SDL_FALSE -; - -2907  -j -=0; j<16; j++ ) - -2909 if -ic --> -u -. -bakpots -[ -j -] != -1 ) - -2911 -ic --> -u -. -ybp - = -SDL_TRUE -; - -2918 if -cmd -[ -i -+1] == 'm' ) - -2920  -i -=0; i<16; i++ ) - -2921 -ic --> -u -. -membakpots -[ -i -]. -ags - = 0; - -2922 -ic --> -u -. -ymbp - = -SDL_FALSE -; - -2926  -i -=0; i<16; i++ ) - -2927 -ic --> -u -. -bakpots -[ -i -] = -1; - -2928 -ic --> -u -. -ybp - = -SDL_FALSE -; - -2932 - `m_r -( "???" ); - -2938 -ϡcmd - = -cmd -[ -i -]; - -2939 -i -++; - -2941  -cmd -[ -i -] ) - -2944 -ϡcmd - = 0; - -2945 -i -++; - -2947 if! - `m_gnum - -ic -, & -v -, -cmd -, & -i -, -SDL_TRUE -, -SDL_FALSE -, SDL_FALSE, SDL_TRUE ) ) - -2949 - `m_r -( "Badddress" ); - -2953 if! - `m_gnum - -ic -, & -w -, -cmd -, & -i -, -SDL_TRUE -, -SDL_FALSE -, SDL_FALSE, SDL_TRUE ) ) - -2955 - `m_r -( "Valuexpected" ); - -2959 - `m_t_modifd - -ic - ); - -2960 -ic --> -u -. - `wre -&ic->u, -v -, -w - ); - -2961 -updvw - = -SDL_TRUE -; - -2965 -ϡcmd - = 0; - -2966 -i -++; - -2968 if! - `m_gnum - -ic -, & -v -, -cmd -, & -i -, -SDL_TRUE -, -SDL_FALSE -, SDL_FALSE, SDL_TRUE ) ) - -2970 - `m_r -( "Badddress" ); - -2974 if -mw_l - ) - -2976 -mw_addr -[ -mw_which -] = -v -; - -2978 -mw_which - = 0; - -2979 -mw_addr -[0] = -v -; - -2981 -cshow - = -CSHOW_MWATCH -; - -2985 if -cmd -[ -i -] !0 ) && ( ! - `isws -( cmd[i] ) ) ) - -2987 - `m_r -( "???" ); - -2992 if - `m_gnum - -ic -, & -v -, -cmd -, & -i -, -SDL_TRUE -, -SDL_FALSE -, SDL_FALSE, SDL_TRUE ) ) - -2993 -m_addr - = -v -; - -2995  -j -=0; j<16; j++ ) - -2997 - `rtf - -vtmp -, "%04X ", -m_addr - ); - -2998  -k -=0; k<8; k++ ) - -3000  -tmp -[8]; - -3001 - `tf - -tmp -, 7, "%02X ", - `m_ad - -ic -, -m_addr -+ -k - ) ); - -3002 - `rt - -vtmp -, -tmp - ); - -3004 -l - = () - ` - -vtmp - ); - -3005 -vtmp -[ -l -++] = 32; - -3006 -vtmp -[ -l -++] = '\''; - -3007  -k -=0; k<8; k++ ) - -3009 -v - = - `m_ad - -ic -, -m_addr -++ ); - -3010 -vtmp -[ -l -++] = (( -v ->31)&&(v<128))?v:'.'; - -3012 -vtmp -[ -l -++] = '\''; - -3013 -vtmp -[ -l -++] = 0; - -3014 - `m_r - -vtmp - ); - -3021 if -cmd -[ -i -+1] == 'f' ) - -3023 -i -+=2; - -3025 if! - `m_gnum - -ic -, & -v -, -cmd -, & -i -, -SDL_TRUE -, -SDL_FALSE -, SDL_FALSE, SDL_TRUE ) ) - -3027 - `m_r -( "Startddressxpected\n" ); - -3031 -m_addr - = -v -; - -3032 if! - `m_gnum - -ic -, & -v -, -cmd -, & -i -, -SDL_TRUE -, -SDL_FALSE -, SDL_FALSE, SDL_TRUE ) ) - -3034 - `m_r -( "Endddressxpected\n" ); - -3038  - `isws - -cmd -[ -i -] ) ) i++; - -3039 if! -cmd -[ -i -] ) - -3041 - `m_r -( "Filenamexpected" ); - -3045 -f - = - `fݒ -& -cmd -[ -i -], "w" ); - -3046 if! -f - ) - -3048 - `m_tf -"Ubˁݒ '%s'", & -cmd -[ -i -] ); - -3052  -m_addr - < -v - ) - -3054 -SDL_bo - -loed -; - -3055 - `rtf - -f -, "%s\n", - `m_dismb - -ic -, & -m_addr -, & -loed -, -SDL_TRUE - ) ); - -3056 if -loed - ) ; - -3059 - `fo - -f - ); - -3063 -ϡcmd - = -cmd -[ -i -]; - -3064 -i -++; - -3065 if - `m_gnum - -ic -, & -v -, -cmd -, & -i -, -SDL_TRUE -, -SDL_FALSE -, SDL_FALSE, SDL_TRUE ) ) - -3066 -m_addr - = -v -; - -3068  -j -=0; j<16; j++ ) - -3069 - `m_r - - `m_dismb - -ic -, & -m_addr -, -NULL -, -SDL_FALSE - ) ); - -3073 -ϡcmd - = 0; - -3074 -i -++; - -3076 -j - = - `m_gg - -cmd -, & -i -, -SDL_TRUE -, SDL_TRUE, SDL_TRUE ); - -3077 if -j - == -1 ) - -3079 - `m_r -( "Registerxpected" ); - -3083 if! - `m_gnum - -ic -, & -v -, -cmd -, & -i -, -SDL_TRUE -, SDL_TRUE, SDL_TRUE, SDL_TRUE ) ) - -3085 - `m_r -( "Expressionxpected" ); - -3089  -j - ) - -3091  -REG_PC -: - `m_t_modifd - -ic - ); oric-> -u -. -pc - = -v -; ; - -3092  -REG_SP -: - `m_t_modifd - -ic - ); oric-> -u -. - - = -v -; ; - -3093  -REG_A -: - `m_t_modifd - -ic - ); oric-> -u -. -a - = -v -; ; - -3094  -REG_X -: - `m_t_modifd - -ic - ); oric-> -u -. -x - = -v -; ; - -3095  -REG_Y -: - `m_t_modifd - -ic - ); oric-> -u -. -y - = -v -; ; - -3097  -REG_VIA_PCR -: - `m_t_modifd - -ic - ); - `v_wre -&ic-> -v -, -VIA_PCR -, -v - ); ; - -3098  -REG_VIA_ACR -: - `m_t_modifd - -ic - ); - `v_wre -&ic-> -v -, -VIA_ACR -, -v - ); ; - -3099  -REG_VIA_SR -: - `m_t_modifd - -ic - ); - `v_wre -&ic-> -v -, -VIA_SR -, -v - ); ; - -3100  -REG_VIA_IFR -: - `m_t_modifd - -ic - ); - `v_m_wre_i -&ic-> -v -, -v - ); ; - -3101  -REG_VIA_IER -: - `m_t_modifd - -ic - ); oric-> -v -. -r - = -v -&0x7f; ; - -3102  -REG_VIA_IRA -: - `m_t_modifd - -ic - ); oric-> -v -. - `wre_pt_a -&ic->v, 0xff, -v - ); ; - -3103  -REG_VIA_ORA -: - `m_t_modifd - -ic - ); - `v_wre -&ic-> -v -, -VIA_IORA -, -v - ); ; - -3104  -REG_VIA_DDRA -: - `m_t_modifd - -ic - ); - `v_wre -&ic-> -v -, -VIA_DDRA -, -v - ); ; - -3105  -REG_VIA_IRB -: - `m_t_modifd - -ic - ); oric-> -v -. - `wre_pt_b -&ic->v, 0xff, -v - ); ; - -3106  -REG_VIA_ORB -: - `m_t_modifd - -ic - ); - `v_wre -&ic-> -v -, -VIA_IORB -, -v - ); ; - -3107  -REG_VIA_DDRB -: - `m_t_modifd - -ic - ); - `v_wre -&ic-> -v -, -VIA_DDRB -, -v - ); ; - -3108  -REG_VIA_T1C -: - `m_t_modifd - -ic - ); oric-> -v -. -t1c - = -v -; ; - -3109  -REG_VIA_CA1 -: - `m_t_modifd - -ic - ); - `v_wre_CA1 -&ic-> -v -, -v - ); ; - -3110  -REG_VIA_CA2 -: - `m_t_modifd - -ic - ); - `v_wre_CA2 -&ic-> -v -, -v - ); ; - -3111  -REG_VIA_CB1 -: - `m_t_modifd - -ic - ); - `v_wre_CB1 -&ic-> -v -, -v - ); ; - -3112  -REG_VIA_CB2 -: - `m_t_modifd - -ic - ); - `v_wre_CB2 -&ic-> -v -, -v - ); ; - -3113  -REG_VIA_T2C -: - `m_t_modifd - -ic - ); oric-> -v -. -t2c - = -v -; ; - -3115  -REG_VIA_T1L -: - -3116 - `m_t_modifd - -ic - ); - -3117 - `v_wre -& -ic --> -v -, -VIA_T1L_L -, -v -&0xff ); - -3118 - `v_wre -& -ic --> -v -, -VIA_T1L_H -, ( -v ->>8)&0xff ); - -3121  -REG_VIA_T2L -: - -3122 - `m_t_modifd - -ic - ); - -3123 - `v_wre -& -ic --> -v -, -VIA_T2C_L -, -v -&0xff ); - -3124 - `v_wre -& -ic --> -v -, -VIA_T2C_H -, ( -v ->>8)&0xff ); - -3128 * -ednd - = -SDL_TRUE -; - -3129 -updvw - = -SDL_TRUE -; - -3133  -SDL_FALSE -; - -3136 -ϡcmd - = -cmd -[ -i -]; - -3137  -cmd -[ -i -+1] ) - -3142 - `m_e_e - -ic - ); - -3143 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -3147 -de - = -SDL_TRUE -; - -3151 - `m_tf -( "???" ); - -3157 - `m_e_e - -ic - ); - -3158 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -3162 -ϡcmd - = 0; - -3163 -i -++; - -3164  -cmd -[ -i -] ) - -3167 -i -++; - -3168 if! - `m_gnum - -ic -, & -v -, -cmd -, & -i -, -SDL_TRUE -, SDL_TRUE, SDL_TRUE, SDL_TRUE ) ) - -3170 - `m_r -( "Addressxpected" ); - -3174 if! - `m_gnum - -ic -, & -w -, -cmd -, & -i -, -SDL_TRUE -, SDL_TRUE, SDL_TRUE, SDL_TRUE ) ) - -3176 - `m_r -( "Sizexpected" ); - -3180  - `isws - -cmd -[ -i -] ) ) i++; - -3181 if! -cmd -[ -i -] ) - -3183 - `m_r -( "Filenamexpected" ); - -3187 -tmem - = - `mloc - -w - ); - -3188 if! -tmem - ) - -3190 - `m_r -( "Amnesia!" ); - -3194  -j -=0; j< -w -; j++ ) - -3195 -tmem -[ -j -] = - `m_ad - -ic -, -v -+j ); - -3197 -f - = - `fݒ -& -cmd -[ -i -], "wb" ); - -3198 if! -f - ) - -3200 - ` - -tmem - ); - -3201 - `m_tf -"Ubˁݒ '%s'", & -cmd -[ -i -] ); - -3205 - `fwre - -tmem -, -w -, 1, -f - ); - -3206 - `fo - -f - ); - -3207 - ` - -tmem - ); - -3208 - `m_tf -"Wr%d byt'%s'", -w -, & -cmd -[ -i -] ); - -3214 -ϡcmd - = 0; - -3215 -i -++; - -3216 -j - = -cmd -[ -i -]; - -3217  -j - ) - -3221 -i -++; - -3222  - `isws - -cmd -[ -i -] ) ) i++; - -3223 if! -cmd -[ -i -] ) - -3225 - `m_r -( "Filenamexpected" ); - -3229 - `joth -( -th -, & -cmd -[ -i -]); - -3230 i( -j - == 'l') - -3232 i(! - `ld_sh -( -ic -, -fmp -)) - -3233 - `m_tf -("Snapshotoad failed"); - -3235 - `m_tf -("Snapshotoaded"); - -3239 i(! - `ve_sh -( -ic -, -fmp -)) - -3240 - `m_tf -("Snapshot save failed"); - -3242 - `m_tf -("Snapshot saved"); - -3247 - `m_tf -( "???" ); - -3253 -ϡcmd - = -cmd -[ -i -]; - -3254  -hpcou - ) - -3257 - `m_r -( "KEYS:" ); - -3259 - `m_r -( " F2 : Quit Monitor F3 : Toggle Console" ); - -3260 - `m_r -( " F4 : Toggle info F9 : Reset cycles" ); - -3261 - `m_r -( " F10: Step into F11: Step over" ); - -3262 - `m_r -( " F12: Skip inst." ); - -3263 - `m_r -( " " ); - -3264 - `m_r -( "COMMANDS:" ); - -3265 - `m_r -( " - Assemble" ); - -3266 - `m_r -( " bc - Clear breakpoint" ); - -3267 - `m_r -( " bcm - Clear mem breakpoint" ); - -3268 - `m_r -( " bl - List breakpoints" ); - -3269 - `m_r -( " blm - List mem breakpoints" ); - -3270 - `m_r -( " bs [zc] - Set breakpoint/cycles" ); - -3271 - `m_r -( " bsm [rwc] - Set mem breakpoint" ); - -3272 - `m_r -( " bz - Zap breakpoints" ); - -3273 - `m_r -( " bzm - Zap mem breakpoints" ); - -3274 - `m_r -( " d - Disassemble" ); - -3275 - `m_r -( "---- MORE" ); - -3276 -hpcou -++; - -3280 - `m_r -( " df - Disassembleo file" ); - -3281 - `m_r -( " m - Dump memory" ); - -3282 - `m_r -( " mm - Modify memory" ); - -3283 - `m_r -( " mw - Memory watchtddr" ); - -3284 - `m_r -( "l - Load snapshot" ); - -3285 - `m_r -( "s - Save snapshot" ); - -3286 - `m_r -( " - Set o " ); - -3287 - `m_r -( " q, x or qm - Quit monitor" ); - -3288 - `m_r -( " qe - Quitmulator" ); - -3289 - `m_r -( " sa - Add or move user sym." ); - -3290 - `m_r -( " sk - Kill user symbol" ); - -3291 - `m_r -( " sc - Symbolsot case-sens." ); - -3292 - `m_r -( " sC - Symbols case-sensitive" ); - -3293 - `m_r -( " sl - Load user symbols" ); - -3294 - `m_r -( " sx - Export user symbols" ); - -3295 - `m_r -( " sz - Zap user symbols" ); - -3296 - `m_r -( " wm - Write memo disk" ); - -3297 -hpcou - = 0; - -3298 -ϡcmd - = 0; - -3304 -ϡcmd - = 0; - -3305 - `m_tf -( "???" ); - -3309  -de -; - -3310 - } -} - -3312 -SDL_bo - - $m_do_cmd -* -cmd -,  -mache - * -ic -, -SDL_bo - * -ednd - ) - -3314  -i -; - -3315 -SDL_bo - -t -; - -3317 - `m_hide_curs -(); - -3318  -i -=2; i<49; i++ -tz -[ -TZ_MONITOR -]-> -tx -[50*19+i] = 32; - -3319 - `tzos - -tz -[ -TZ_MONITOR -], 2, 19, -cmd - ); - -3320 - `tztc - -tz -[ -TZ_MONITOR -], 2, 3 ); - -3321 -t - = - `m_cmd - -cmd -, -ic -, -ednd - ); - -3322 - `m_t_put -(); - -3323 - `m_show_curs -(); - -3324  -t -; - -3325 - } -} - -3327  - $m_wre_ibuf -( ) - -3329  -ibtmp -[ -CONS_WIDTH -+1]; - -3331 - `y - -ibtmp -, & -ibuf -[ -off -], -CONS_WIDTH - ); - -3332 -ibtmp -[ -CONS_WIDTH -] = 0; - -3334 - `tzos - -tz -[ -TZ_MONITOR -], 1, 19, -off - > 0 ? "\x16" : "]" ); - -3335 - `tzos - -tz -[ -TZ_MONITOR -], 2, 19, -ibtmp - ); - -3336 if - ` -& -ibuf -[ -off -] ) > -CONS_WIDTH - ) - -3338 - `tzos - -tz -[ -TZ_MONITOR -], 2+ -CONS_WIDTH -, 19, "\x16" ); - -3340 - `tzr - -tz -[ -TZ_MONITOR -], " " ); - -3341 - `tzos - -tz -[ -TZ_MONITOR -], 2+ -CONS_WIDTH -, 19, " " ); - -3343 - } -} - -3345  - $m_wre_ibuf_asm -( ) - -3347  -ibtmp -[ -CONS_WIDTH -+1]; - -3349 - `y - -ibtmp -, -ibuf -, -CONS_WIDTH - ); - -3350 -ibtmp -[ -CONS_WIDTH -] = 0; - -3352 - `tzos - -tz -[ -TZ_MONITOR -], 8, 19, -ibtmp - ); - -3353 - `tzr - -tz -[ -TZ_MONITOR -], " " ); - -3354 - } -} - -3356  - $m_t_curs_to_d -( ) - -3358 -cursx - = - -; - -3359 -off - = - -- -CONS_WIDTH -; - -3360 if -off - < 0 ) iloff = 0; - -3361 - } -} - -3363  - $m_t_off -( ) - -3365 if -cursx - < -off - ) iloff = cursx; - -3366 if -cursx - >( -off -+ -CONS_WIDTH -) ) iloff = cursx-CONS_WIDTH; - -3367 if -off - < 0 ) iloff =0; - -3368 - } -} - -3384  -SDL_bo - - $m_decodeݔd - -mache - * -ic -, * -r -, * -ty -, * -v - ) - -3386  -i -; - -3387  -v -; - -3389 -i -=0; - -3390  - `isws - -r -[ -i -] ) ) i++; - -3393 if -r -[ -i -] == 0 ) - -3395 (* -ty - -AM_IMP -; - -3396  -SDL_TRUE -; - -3400 if -r -[ -i -] == '#' ) - -3402 -i -++; - -3403 if! - `m_gnum - -ic -, & -v -, -r -, & -i -, -SDL_FALSE -, SDL_FALSE, SDL_FALSE, -SDL_TRUE - ) ) - -3404  -SDL_FALSE -; - -3405 (* -ty - -AM_IMM -; - -3406 (* -v - -v -; - -3407  -SDL_TRUE -; - -3411 if -r -[ -i -] == '(' ) - -3413 -i -++; - -3414 if! - `m_gnum - -ic -, & -v -, -r -, & -i -, -SDL_TRUE -, SDL_TRUE, -SDL_FALSE -, SDL_TRUE ) ) - -3415  -SDL_FALSE -; - -3417 if - `cmp -& -r -[ -i -], ",X)", 3 ) == 0 ) - -3419 (* -ty - -AM_ZIX -; - -3420 (* -v - -v -&0xff; - -3421  -SDL_TRUE -; - -3424 if - `cmp -& -r -[ -i -], "),Y", 3 ) == 0 ) - -3426 (* -ty - -AM_ZIY -; - -3427 (* -v - -v -&0xff; - -3428  -SDL_TRUE -; - -3431 if -r -[ -i -] == ')' ) - -3433 (* -ty - -AM_IND -; - -3434 (* -v - -v -; - -3435  -SDL_TRUE -; - -3438  -SDL_FALSE -; - -3441 if! - `m_gnum - -ic -, & -v -, -r -, & -i -, -SDL_TRUE -, SDL_TRUE, -SDL_FALSE -, SDL_TRUE ) ) - -3442  -SDL_FALSE -; - -3444 if - `cmp -& -r -[ -i -], ",X", 2 ) == 0 ) - -3446 (* -ty - -AM_ABX -; - -3447 (* -v - -v -; - -3448  -SDL_TRUE -; - -3451 if - `cmp -& -r -[ -i -], ",Y", 2 ) == 0 ) - -3453 (* -ty - -AM_ABY -; - -3454 (* -v - -v -; - -3455  -SDL_TRUE -; - -3458 (* -ty - -AM_ABS -; - -3459 (* -v - -v -; - -3460  -SDL_TRUE -; - -3461 - } -} - -3463  -SDL_bo - - $m_asmb_le - -mache - * -ic - ) - -3465  -i -, -j -, -addsym -, -amode -; - -3466  -v -; - -3468 -i -=0; - -3469  - `isws - -ibuf -[ -i -] ) ) i++; - -3471 if -ibuf -[ -i -] =0 )  -SDL_TRUE -; - -3474 -j - = -i -; - -3475 -addsym - = -1; - -3476 if - `issymt - -ibuf -[ -j -] ) ) - -3478  - `issymch - -ibuf -[ -j -] ) ) j++; - -3479 if -ibuf -[ -j -] == ':' ) - -3481 -addsym - = -i -; - -3482 -i - = -j -+1; - -3483  - `isws - -ibuf -[ -i -] ) ) i++; - -3487  -j -=0; -asmb -[j]. -me -; j++ ) - -3489 if - `cmp - -asmb -[ -j -]. -me -, & -ibuf -[ -i -], 3 ) == 0 ) - -3493 if! -asmb -[ -j -]. -me - ) - -3495 - `m_rtf -" %04X %c%c% ??? ", -m_addr -, -ibuf -[ -i -], ibuf[i+1], ibuf[i+2] ); - -3496  -SDL_FALSE -; - -3499 -i - += 3; - -3500 if! - `m_decodeݔd - -ic -, & -ibuf -[ -i -], & -amode -, & -v - ) ) - -3502 - `m_r -( "Illegal operand" ); - -3503  -SDL_FALSE -; - -3506  -amode - ) - -3508  -AM_IMP -: - -3509 if -asmb -[ -j -]. -imp - =-1 ) { - `m_r -"Ondxed" );  -SDL_FALSE -; } - -3510 - `m_t_modifd - -ic - ); - -3511 -ic --> -u -. - `wre -&ic->u, -m_addr -, -asmb -[ -j -]. -imp - ); - -3514  -AM_IMM -: - -3515 if -asmb -[ -j -]. -imm - =-1 ) { - `m_r -"Ieg ond" );  -SDL_FALSE -; } - -3516 - `m_t_modifd - -ic - ); - -3517 -ic --> -u -. - `wre -&ic->u, -m_addr -, -asmb -[ -j -]. -imm - ); - -3518 -ic --> -u -. - `wre -&ic->u, -m_addr -+1, -v - ); - -3521  -AM_ABS -: - -3522 if -asmb -[ -j -]. -l - != -1 ) - -3524 -i - = (() -v -)-(()( -m_addr -+2)); - -3525 if -i - < -128 ) || ( i > 127 ) ) - -3527 - `m_r -( "Branch out ofange" ); - -3528  -SDL_FALSE -; - -3530 - `m_t_modifd - -ic - ); - -3531 -ic --> -u -. - `wre -&ic->u, -m_addr -, -asmb -[ -j -]. -l - ); - -3532 -ic --> -u -. - `wre -&ic->u, -m_addr -+1, -i -&0xff ); - -3536 if -asmb -[ -j -]. -zp - !-1 ) && ( ( -v -&0xff00)==0 ) ) - -3538 - `m_t_modifd - -ic - ); - -3539 -ic --> -u -. - `wre -&ic->u, -m_addr -, -asmb -[ -j -]. -zp - ); - -3540 -ic --> -u -. - `wre -&ic->u, -m_addr -+1, -v - ); - -3544 if -asmb -[ -j -]. -abs - =-1 ) { - `m_r -"Ieg ond" );  -SDL_FALSE -; } - -3545 - `m_t_modifd - -ic - ); - -3546 -ic --> -u -. - `wre -&ic->u, -m_addr -, -asmb -[ -j -]. -abs - ); - -3547 -ic --> -u -. - `wre -&ic->u, -m_addr -+1, -v -&0xff ); - -3548 -ic --> -u -. - `wre -&ic->u, -m_addr -+2, ( -v ->>8)&0xff ); - -3551  -AM_IND -: - -3552 if -asmb -[ -j -]. -d - =-1 ) { - `m_r -"Ieg ond" );  -SDL_FALSE -; } - -3553 - `m_t_modifd - -ic - ); - -3554 -ic --> -u -. - `wre -&ic->u, -m_addr -, -asmb -[ -j -]. -d - ); - -3555 -ic --> -u -. - `wre -&ic->u, -m_addr -+1, -v -&0xff ); - -3556 -ic --> -u -. - `wre -&ic->u, -m_addr -+2, ( -v ->>8)&0xff ); - -3559  -AM_ZPX -: - -3560 if -asmb -[ -j -]. -zpx - =-1 ) { - `m_r -"Ieg ond" );  -SDL_FALSE -; } - -3561 - `m_t_modifd - -ic - ); - -3562 -ic --> -u -. - `wre -&ic->u, -m_addr -, -asmb -[ -j -]. -zpx - ); - -3563 -ic --> -u -. - `wre -&ic->u, -m_addr -+1, -v - ); - -3566  -AM_ZPY -: - -3567 if -asmb -[ -j -]. -zpy - =-1 ) { - `m_r -"Ieg ond" );  -SDL_FALSE -; } - -3568 - `m_t_modifd - -ic - ); - -3569 -ic --> -u -. - `wre -&ic->u, -m_addr -, -asmb -[ -j -]. -zpy - ); - -3570 -ic --> -u -. - `wre -&ic->u, -m_addr -+1, -v - ); - -3573  -AM_ZIX -: - -3574 if -asmb -[ -j -]. -zix - =-1 ) { - `m_r -"Ieg ond" );  -SDL_FALSE -; } - -3575 - `m_t_modifd - -ic - ); - -3576 -ic --> -u -. - `wre -&ic->u, -m_addr -, -asmb -[ -j -]. -zix - ); - -3577 -ic --> -u -. - `wre -&ic->u, -m_addr -+1, -v - ); - -3580  -AM_ZIY -: - -3581 if -asmb -[ -j -]. -ziy - =-1 ) { - `m_r -"Ieg ond" );  -SDL_FALSE -; } - -3582 - `m_t_modifd - -ic - ); - -3583 -ic --> -u -. - `wre -&ic->u, -m_addr -, -asmb -[ -j -]. -ziy - ); - -3584 -ic --> -u -. - `wre -&ic->u, -m_addr -+1, -v - ); - -3587  -AM_ABX -: - -3588 if -asmb -[ -j -]. -zpx - !-1 ) && ( ( -v -&0xff00)==0 ) ) - -3590 - `m_t_modifd - -ic - ); - -3591 -ic --> -u -. - `wre -&ic->u, -m_addr -, -asmb -[ -j -]. -zpx - ); - -3592 -ic --> -u -. - `wre -&ic->u, -m_addr -+1, -v - ); - -3596 if -asmb -[ -j -]. -abx - =-1 ) { - `m_r -"Ieg ond" );  -SDL_FALSE -; } - -3597 - `m_t_modifd - -ic - ); - -3598 -ic --> -u -. - `wre -&ic->u, -m_addr -, -asmb -[ -j -]. -abx - ); - -3599 -ic --> -u -. - `wre -&ic->u, -m_addr -+1, -v -&0xff ); - -3600 -ic --> -u -. - `wre -&ic->u, -m_addr -+2, ( -v ->>8)&0xff ); - -3603  -AM_ABY -: - -3604 if -asmb -[ -j -]. -zpy - !-1 ) && ( ( -v -&0xff00)==0 ) ) - -3606 - `m_t_modifd - -ic - ); - -3607 -ic --> -u -. - `wre -&ic->u, -m_addr -, -asmb -[ -j -]. -zpy - ); - -3608 -ic --> -u -. - `wre -&ic->u, -m_addr -+1, -v - ); - -3612 if -asmb -[ -j -]. -aby - =-1 ) { - `m_r -"Ieg ond" );  -SDL_FALSE -; } - -3613 - `m_t_modifd - -ic - ); - -3614 -ic --> -u -. - `wre -&ic->u, -m_addr -, -asmb -[ -j -]. -aby - ); - -3615 -ic --> -u -. - `wre -&ic->u, -m_addr -+1, -v -&0xff ); - -3616 -ic --> -u -. - `wre -&ic->u, -m_addr -+2, ( -v ->>8)&0xff ); - -3620 if -addsym - != -1 ) - -3621 - `m_a__add_symb -& -ic --> -ursyms -, oric, & -ibuf -[ -addsym -], -SYM_BESTGUESS -, -m_addr - ); - -3623 - `m_rtf - - `m_dismb - -ic -, & -m_addr -, -NULL -, -SDL_FALSE - ) ); - -3624  -SDL_FALSE -; - -3625 - } -} - -3627  -SDL_bo - - $m_cse_keydown - -SDL_Evt - * -ev -,  -mache - * -ic -, -SDL_bo - * -ednd - ) - -3629  -i -; - -3630 -SDL_bo - -de -; - -3632 -de - = -SDL_FALSE -; - -3634 if -m_asmmode - ) - -3636  -ev --> -key -. -keysym -. -sym - ) - -3638  -SDLK_LEFT -: - -3639 if -cursx - > 0 ) - -3641 - `m_hide_curs -(); - -3642 -cursx ---; - -3643 - `m_wre_ibuf_asm -(); - -3644 - `m_show_curs -(); - -3645 * -ednd - = -SDL_TRUE -; - -3649  -SDLK_RIGHT -: - -3650 if -cursx - < - - ) - -3652 - `m_hide_curs -(); - -3653 -cursx -++; - -3654 - `m_wre_ibuf_asm -(); - -3655 - `m_show_curs -(); - -3656 * -ednd - = -SDL_TRUE -; - -3660  -SDLK_BACKSPACE -: - -3661 if -cursx - > 0 ) - -3663 - `m_hide_curs -(); - -3664  -i -= -cursx --1; i< - -; i++ ) - -3665 -ibuf -[ -i -] = ibuf[i+1]; - -3666 -cursx ---; - -3667 - - = () - ` - -ibuf - ); - -3668 - `m_t_off -(); - -3669 - `m_wre_ibuf_asm -(); - -3670 - `m_show_curs -(); - -3671 * -ednd - = -SDL_TRUE -; - -3675  -SDLK_RETURN -: - -3676  -SDLK_KP_ENTER -: - -3677 - `m_hide_curs -(); - -3678 -ibuf -[ - -] = 0; - -3680 if - `m_asmb_le - -ic - ) ) - -3682 -m_asmmode - = -SDL_FALSE -; - -3683 - `m_t_put -(); - -3684 - `m_show_curs -(); - -3685 * -ednd - = -SDL_TRUE -; - -3686 -updvw - = -SDL_TRUE -; - -3690 - `m_t_put -(); - -3691 - `m_show_curs -(); - -3692 * -ednd - = -SDL_TRUE -; - -3693 -updvw - = -SDL_TRUE -; - -3700  - `SDL_COMPAT_GKeysymUnicode - -ev --> -key -. -keysym - ) ) - -3703 if - `SDL_COMPAT_GKeysymUnicode - -ev --> -key -. -keysym - ) > 31 ) && ( SDL_COMPAT_GetKeysymUnicode(v->key.keysym ) < 127 ) ) - -3705 if - - > -MAX_ASM_INPUT - ) ; - -3707 - `m_hide_curs -(); - -3708  -i -= - -+1; i> -cursx -; i-- ) - -3709 -ibuf -[ -i -] = ibuf[i-1]; - -3710 -ibuf -[ -cursx -] = - `SDL_COMPAT_TneUnicode - -ev --> -key -. -keysym - ); - -3711 -cursx -++; - -3712 - -++; - -3713 - `m_wre_ibuf_asm -(); - -3714 - `m_show_curs -(); - -3715 * -ednd - = -SDL_TRUE -; - -3719  -de -; - -3722  -ev --> -key -. -keysym -. -sym - ) - -3724  -SDLK_UP -: - -3725 if -hip - >( -hiu --1) ) ; - -3726 - `m_hide_curs -(); - -3727 - `ry - -ibuf -, & -hiy -[++ -hip -][0] ); - -3728 - - = () - ` - -ibuf - ); - -3729 - `m_t_curs_to_d -(); - -3730 - `m_t_off -(); - -3731 - `tzos - -tz -[ -TZ_MONITOR -], 2, 19, " " ); - -3732 - `m_wre_ibuf -(); - -3733 - `m_show_curs -(); - -3734 * -ednd - = -SDL_TRUE -; - -3737  -SDLK_DOWN -: - -3738 - `m_hide_curs -(); - -3739 if -hip - <= 0 ) - -3741 -hip - = -1; - -3742 -ibuf -[0] = 0; - -3743 - - = 0; - -3744 -off - = 0; - -3745 -cursx - = 0; - -3747 - `ry - -ibuf -, & -hiy -[-- -hip -][0] ); - -3748 - `m_t_curs_to_d -(); - -3749 - `m_t_off -(); - -3751 - `tzos - -tz -[ -TZ_MONITOR -], 2, 19, " " ); - -3752 - `m_wre_ibuf -(); - -3753 - `m_show_curs -(); - -3754 * -ednd - = -SDL_TRUE -; - -3757  -SDLK_LEFT -: - -3758 if -cursx - > 0 ) - -3760 - `m_hide_curs -(); - -3761 -cursx ---; - -3762 - `m_t_off -(); - -3763 - `m_wre_ibuf -(); - -3764 - `m_show_curs -(); - -3765 * -ednd - = -SDL_TRUE -; - -3769  -SDLK_RIGHT -: - -3770 if -cursx - < - - ) - -3772 - `m_hide_curs -(); - -3773 -cursx -++; - -3774 - `m_t_off -(); - -3775 - `m_wre_ibuf -(); - -3776 - `m_show_curs -(); - -3777 * -ednd - = -SDL_TRUE -; - -3784  -SDLK_BACKSPACE -: - -3785 if -cursx - > 0 ) - -3787 - `m_hide_curs -(); - -3788  -i -= -cursx --1; i< - -; i++ ) - -3789 -ibuf -[ -i -] = ibuf[i+1]; - -3790 -cursx ---; - -3791 - - = () - ` - -ibuf - ); - -3792 - `m_t_off -(); - -3793 - `m_wre_ibuf -(); - -3794 - `m_show_curs -(); - -3795 * -ednd - = -SDL_TRUE -; - -3799  -SDLK_RETURN -: - -3800  -SDLK_KP_ENTER -: - -3801 - `m_hide_curs -(); - -3802 -ibuf -[ - -] = 0; - -3803 if - - == 0 ) - -3805  -ϡcmd - ) - -3810 -ibuf -[ -cursx -++] = -ϡcmd -; - -3811 -ibuf -[ -cursx -] = 0; - -3812 - - = 1; - -3816 if -hiu - > 0 ) && ( - `rcmp -& -hiy -[0][0], -ibuf - ) == 0 ) ) - -3819 if -hiu - > 0 ) - -3821  -i -= -hiu -; i>0; i-- ) - -3822 - `ry -& -hiy -[ -i -][0], &history[i-1][0] ); - -3825 - `ry -& -hiy -[0][0], -ibuf - ); - -3826 if -hiu - < 10 ) histu++; - -3829 -hip - = -1; - -3831 - `tztc - -tz -[ -TZ_MONITOR -], 2, 3 ); - -3832 -de - | - `m_cmd - -ibuf -, -ic -, -ednd - ); - -3833 - `m_t_put -(); - -3834 - `m_show_curs -(); - -3835 * -ednd - = -SDL_TRUE -; - -3839  - `SDL_COMPAT_GKeysymUnicode - -ev --> -key -. -keysym - ) ) - -3842 if - `SDL_COMPAT_GKeysymUnicode - -ev --> -key -. -keysym - ) > 31 ) && ( SDL_COMPAT_GetKeysymUnicode(v->key.keysym ) < 127 ) ) - -3844 if - - > -MAX_CONS_INPUT - ) ; - -3846 - `m_hide_curs -(); - -3847  -i -= - -+1; i> -cursx -; i-- ) - -3848 -ibuf -[ -i -] = ibuf[i-1]; - -3849 -ibuf -[ -cursx -] = - `SDL_COMPAT_TneUnicode - -ev --> -key -. -keysym - ); - -3850 -cursx -++; - -3851 - -++; - -3852 - `m_t_off -(); - -3853 - `m_wre_ibuf -(); - -3854 - `m_show_curs -(); - -3855 * -ednd - = -SDL_TRUE -; - -3859  -de -; - -3860 - } -} - -3862  -SDL_bo - - $m_mwch_keydown - -SDL_Evt - * -ev -,  -mache - * -ic -, -SDL_bo - * -ednd - ) - -3864 -SDL_bo - -de -; - -3865  -v -; - -3866  -i -, -ge -; - -3868 -ge - = -mw_l - ? 8*8 : 8*18; - -3870 -de - = -SDL_FALSE -; - -3871  -ev --> -key -. -keysym -. -sym - ) - -3873  -SDLK_UP -: - -3874 -mw_addr -[ -mw_which -] - -kshied - ? -ge - : 8; - -3875 * -ednd - = -SDL_TRUE -; - -3878  -SDLK_DOWN -: - -3879 -mw_addr -[ -mw_which -] + -kshied - ? -ge - : 8; - -3880 * -ednd - = -SDL_TRUE -; - -3883  -SDLK_PAGEUP -: - -3884 -mw_addr -[ -mw_which -] - -ge -; - -3885 * -ednd - = -SDL_TRUE -; - -3888  -SDLK_PAGEDOWN -: - -3889 -mw_addr -[ -mw_which -] + -ge -; - -3890 * -ednd - = -SDL_TRUE -; - -3893  -SDLK_RETURN -: - -3894  -SDLK_KP_ENTER -: - -3895 if -mw_mode - != 1 ) ; - -3896 -mw_ibuf -[5] = 0; - -3897 -mw_mode - = 0; - -3898 -i - = 0; - -3899 if - `m_gnum - -ic -, & -v -, -mw_ibuf -, & -i -, -SDL_FALSE -, SDL_FALSE, SDL_FALSE, SDL_FALSE ) ) - -3900 -mw_addr -[ -mw_which -] = -v -; - -3901 * -ednd - = -SDL_TRUE -; - -3904  -SDLK_ESCAPE -: - -3905 -mw_mode - = 0; - -3906 * -ednd - = -SDL_TRUE -; - -3909  -SDLK_BACKSPACE -: - -3910 if -mw_mode - != 1 ) ; - -3911 if -mw_koffs - <= 0 ) ; - -3912 -mw_ibuf -[ -mw_koffs ---] = 0; - -3913 * -ednd - = -SDL_TRUE -; - -3916  -SDLK_s -: - -3917 if -mw_mode - != 0 ) ; - -3918 -mw_l - = !mw_split; - -3919 if! -mw_l - ) && ( -mw_which - != 0 ) ) - -3920 -mw_which - = 0; - -3921 * -ednd - = -SDL_TRUE -; - -3924  -SDLK_TAB -: - -3925 if! -mw_l - ) ; - -3926 if -mw_mode - != 0 ) mw_mode = 0; - -3927 -mw_which - ^= 1; - -3928 * -ednd - = -SDL_TRUE -; - -3935 if - `ishex - - `SDL_COMPAT_GKeysymUnicode - -ev --> -key -. -keysym - ) ) ) - -3937 if -mw_mode - != 1 ) - -3939 -mw_mode - = 1; - -3940 -mw_ibuf -[0] = '$'; - -3941 -mw_ibuf -[1] = 0; - -3942 -mw_koffs - = 0; - -3945 if -mw_koffs - < 4 ) - -3947 -mw_ibuf -[++ -mw_koffs -] = - `SDL_COMPAT_TneUnicode - -ev --> -key -. -keysym - ); - -3948 -mw_ibuf -[ -mw_koffs -+1] = 0; - -3951 * -ednd - = -SDL_TRUE -; - -3954  -de -; - -3955 - } -} - -3957  - $py_ - -mache - * -ic - ) - -3959 - `m6502_t_icyes -& -ic --> -u -, -SDL_FALSE -, -m_bpmsg - ); - -3960 - `_tches - -ic - ); - -3961 - `v_ock -& -ic --> -v -, oric-> -u -. -icyes - ); - -3962 - `ay_ticktock -& -ic --> -ay -, oric-> -u -. -icyes - ); - -3963 if(( -ic --> -drivy - = -DRV_MICRODISC -|| (ic->drivy = -DRV_JASMIN -) - `wd17xx_ticktock -&ic-> -wddisk -, oric-> -u -. -icyes - ); - -3964 if -ic --> -ty - = -MACH_TELESTRAT - ) - -3966 - `v_ock -& -ic --> -_v -, oric-> -u -. -icyes - ); - -3968 if -ic --> -acbackd - ) - -3969 - `ac_ock -& -ic --> -_ac -, oric-> -u -. -icyes - ); - -3971 -ic --> -u -. -cyes - -ic->u. -icyes -; - -3972 - `m6502_ -& -ic --> -u - ); - -3974 if -ic --> -u -. -cyes - <= 0 ) - -3976 - `u_da - -ic - ); - -3977 -ic --> -u -. -cyes - +ic-> -cye -; - -3980 if -m_bpmsg -[0] ) - -3982 - `m_tf_above - -m_bpmsg - ); - -3983 -m_bpmsg -[0] = 0; - -3987  -ic --> -u -. -icyes -; - -3988 - } -} - -3990  -SDL_bo - - $ickze - -xtze - * -tz -, * -tx -, * -ty -, -SDL_bo - * -dblk - ) - -3992  -dx -, -dy -; - -3994 if! - `_xtze - -tz -, -ick -[0]. -x -,eick[0]. -y - ) ) - -3995  -SDL_FALSE -; - -3997 * -tx - = ( -ick -[0]. -x - - -tz -->x) / 8; - -3998 * -ty - = ( -ick -[0]. -y - - -tz -->y) / 12; - -4000 -dx - = ( -ick -[1]. -x - - -tz -->x) / 8; - -4001 -dy - = ( -ick -[1]. -y - - -tz -->y) / 12; - -4003 if(* -tx -= -dx - ) && ( (* -ty -= -dy - ) && ( ( -ick -[0]. -time --leftclick[1].time) < 1000 ) ) - -4005 * -dblk - = -SDL_TRUE -; - -4008 -ick -[0]. -time - = -1; - -4010 * -dblk - = -SDL_FALSE -; - -4013  -SDL_TRUE -; - -4014 - } -} - -4016 -SDL_bo - - $m_evt - -SDL_Evt - * -ev -,  -mache - * -ic -, -SDL_bo - * -ednd - ) - -4018 -SDL_bo - -de -; - -4019 -SDL_bo - -dkey -; - -4021 -de - = -SDL_FALSE -; - -4022 -dkey - = -SDL_FALSE -; - -4023  -ev --> -ty - ) - -4025  -SDL_COMPAT_ACTIVEEVENT -: - -4026 if( - `SDL_COMPAT_IsAFocud -( -ev -)) { - -4027 * -ednd - = -SDL_TRUE -; - -4031  -SDL_MOUSEBUTTONDOWN -: - -4033  -tx -, -ty -; - -4034 -SDL_bo - -dblk -; - -4036 -ick -[1] =eftclick[0]; - -4037 -ick -[0]. -x - = -ev --> -bu -.x; - -4038 -ick -[0]. -y - = -ev --> -bu -.y; - -4039 -ick -[0]. -time - = - `SDL_GTicks -(); - -4041 if - `ickze - -tz -[ -TZ_REGS -], & -tx -, & -ty -, & -dblk - ) ) - -4043 - `m_ick_gs - -ic -, -ednd -, -tx -, -ty -, -dblk - ); - -4048  -SDL_KEYUP -: - -4049  -ev --> -key -. -keysym -. -sym - ) - -4051  -SDLK_F9 -: - -4052 -ic --> -u -. -cyes - = 0; - -4053 * -ednd - = -SDL_TRUE -; - -4056  -SDLK_LSHIFT -: - -4057  -SDLK_RSHIFT -: - -4058 -kshied - = -SDL_FALSE -; - -4061  -SDLK_F1 -: - -4062 -eshus - = -SDL_TRUE -; - -4063 * -ednd - = -SDL_TRUE -; - -4064 - `m_e_e - -ic - ); - -4065 - `u_t_dty - -ic - ); - -4066 - `mumode - -ic -, -NULL -, -EM_MENU - ); - -4069  -SDLK_F2 -: - -4071 - `m6502_t_icyes -& -ic --> -u -, -SDL_FALSE -, -m_bpmsg - ); - -4072 - `_tches - -ic - ); - -4073 - `v_ock -& -ic --> -v -, oric-> -u -. -icyes - ); - -4074 - `ay_ticktock -& -ic --> -ay -, oric-> -u -. -icyes - ); - -4075 if(( -ic --> -drivy - = -DRV_MICRODISC -|| (ic->drivy = -DRV_JASMIN -) - `wd17xx_ticktock -&ic-> -wddisk -, oric-> -u -. -icyes - ); - -4076 if -ic --> -ty - = -MACH_TELESTRAT - ) - -4078 - `v_ock -& -ic --> -_v -, oric-> -u -. -icyes - ); - -4080 if -ic --> -acbackd - ) - -4081 - `ac_ock -& -ic --> -_ac -, oric-> -u -. -icyes - ); - -4082 -ic --> -u -. -cyes - -ic->u. -icyes -; - -4083 - `m6502_ -& -ic --> -u - ); - -4084 if -ic --> -u -. -cyes - <= 0 ) - -4086 - `u_da - -ic - ); - -4087 -ic --> -u -. -cyes - +ic-> -cye -; - -4089 * -ednd - = -SDL_TRUE -; - -4090 - `m_e_e - -ic - ); - -4091 - `mumode - -ic -, -NULL -, -EM_RUNNING - ); - -4094  -SDLK_F3 -: - -4095 -cshow - = (cshow+1)% -CSHOW_LAST -; - -4096 * -ednd - = -SDL_TRUE -; - -4099  -SDLK_F4 -: - -4100 -mshow - = (mshow+1)% -MSHOW_LAST -; - -4101 if -mshow - = -MSHOW_VIA2 - ) && ( -ic --> -ty - ! -MACH_TELESTRAT - ) ) - -4102 -mshow - = (mshow+1)% -MSHOW_LAST -; - -4103 if -ic --> -drivy - = -DRV_NONE - ) && ( -mshow - = -MSHOW_DISK - ) ) - -4104 -mshow - = (mshow+1)% -MSHOW_LAST -; - -4105 * -ednd - = -SDL_TRUE -; - -4113  -SDL_KEYDOWN -: - -4114  -ev --> -key -. -keysym -. -sym - ) - -4116  -SDLK_LSHIFT -: - -4117  -SDLK_RSHIFT -: - -4118 -kshied - = -SDL_TRUE -; - -4119 -dkey - = -SDL_TRUE -; - -4122  -SDLK_F10 -: - -4123 if! -kshied - ) - -4125 - `m_e_e - -ic - ); - -4126 - `py_ - -ic - ); - -4127 * -ednd - = -SDL_TRUE -; - -4128 -dkey - = -SDL_TRUE -; - -4132  -SDLK_F11 -: - -4133 if - `m_ad - -ic -, oric-> -u -. -pc - ) == 0x20 ) - -4135 -Ut16 - -wpc -; - -4136  -dticks -; - -4138 -wpc - = -ic --> -u -. -pc -+3; - -4140 - `m_e_e - -ic - ); - -4141 -dticks - = - `SDL_GTicks -()+5000; - -4142  ( -ic --> -u -. -pc - ! -wpc - ) && ( - `SDL_GTicks -(< -dticks - ) ) - -4143 - `py_ - -ic - ); - -4145 * -ednd - = -SDL_TRUE -; - -4146 -dkey - = -SDL_TRUE -; - -4150 - `m_e_e - -ic - ); - -4151 - `py_ - -ic - ); - -4152 * -ednd - = -SDL_TRUE -; - -4153 -dkey - = -SDL_TRUE -; - -4156  -SDLK_F12 -: - -4157  -diab -[ - `m_ad - -ic -, oric-> -u -. -pc - )]. -amode - ) - -4159  -AM_IMM -: - -4160  -AM_ZP -: - -4161  -AM_ZPX -: - -4162  -AM_ZPY -: - -4163  -AM_ZIX -: - -4164  -AM_ZIY -: - -4165  -AM_REL -: - -4166 -ic --> -u -. -pc - += 2; - -4169  -AM_ABS -: - -4170  -AM_ABX -: - -4171  -AM_ABY -: - -4172  -AM_IND -: - -4173 -ic --> -u -. -pc - += 3; - -4176  -AM_IMP -: - -4178 -ic --> -u -. -pc -++; - -4181 * -ednd - = -SDL_TRUE -; - -4182 -dkey - = -SDL_TRUE -; - -4189 if! -dkey - ) - -4191  -cshow - ) - -4193  -CSHOW_CONSOLE -: - -4194 -de - | - `m_cse_keydown - -ev -, -ic -, -ednd - ); - -4197  -CSHOW_MWATCH -: - -4198 -de - | - `m_mwch_keydown - -ev -, -ic -, -ednd - ); - -4205  -de -; - -4206 - } -} - -4209 #i -defed -( -DEBUG_CPU_TRACE -) && DEBUG_CPU_TRACE > 0 - -4210  -u_a_y - - gua -[ -DEBUG_CPU_TRACE -], * - gli_t - = -NULL -, * - gli_d -, * - gxt - = NULL; - -4212  - $m_a -( -m6502 - * -u -) - -4214  -mache - * -ic - = (mach*) -u --> -urda -; - -4216 i(! -li_t -) - -4218  -i -; - -4219 -li_t - = & -ua -[0]; - -4220 -li_d - = & -ua -[ -DEBUG_CPU_TRACE --1]; - -4221  -i -=0; i< -DEBUG_CPU_TRACE -; i++) - -4223 -ua -[ -i -]. -ev - = (i==0? -NULL - : &cputrace[i-1]; - -4224 -ua -[ -i -]. -xt - = (i==( -DEBUG_CPU_TRACE --1)? -NULL - : &cputrace[i+1]; - -4226 -xt - = -li_t -; - -4230 i( -xt - = -NULL -) - -4232 -xt - = -li_t -; - -4233 -li_t - =i_t-> -xt -; - -4234 -li_d --> -xt - =ext; - -4235 -xt --> -ev - = -li_d -; - -4236 -xt -->x -NULL -; - -4237 -li_t --> -ev - = -NULL -; - -4238 -li_d - = -xt -; - -4241 -xt --> -pc - = -u --> -lc -; - -4242 -xt --> -a - = -u -->a; - -4243 -xt --> -x - = -u -->x; - -4244 -xt --> -y - = -u -->y; - -4245 -xt --> - - = -u -->sp; - -4246 -xt --> -ags - = -MAKEFLAGS -; - -4247 -xt --> - -[0] = - `m_ad -( -ic -, -u --> -lc -); - -4248 -xt --> - -[1] = - `m_ad -( -ic -, -u --> -lc -+1); - -4249 -xt --> - -[2] = - `m_ad -( -ic -, -u --> -lc -+2); - -4250 -xt --> -romdis - = -ic -->romdis; - -4251 if -ic --> -drivy - = -DRV_JASMIN - ) && ( oric-> -jasm -. -ay - ) ) - -4252 -xt --> -romdis - = -SDL_FALSE -; - -4253 -xt - =ext->next; - -4254 - } -} - -4256 * - $ua_t - -mache - * -ic -,  -u_a_y - * -e - ) - -4258  -ddr -, -addr -; - -4259  - -, -a1 -, -a2 -; - -4260  -i -; - -4261 * -tmpame -, * -di -; - -4262  -ame -[ -SNAME_LEN -+1]; - -4263  -msym - * -csym -; - -4265 -di - = -dimp -; - -4267 -tmpame - = ""; - -4268 -csym - = - `m_fd_sym_by_addr - -ic -, -e --> -pc -, &e-> -romdis - ); - -4269 if -csym - ) - -4271 -tmpame - = -csym --> -me -; - -4273 if - ` - -tmpame - ) > -SNAME_LEN - ) - -4275 - `rtf - -dimp -, "%s\n", -tmpame - ); - -4276 -di - = & -dimp -[ - ` -(distmp)]; - -4277 -tmpame - = ""; - -4281 - `ry - -ame -, -tmpame - ); - -4282  -i -= - ` -( -ame -); i< -SNAME_LEN -; i++ ) - -4283 -ame -[ -i -] = 32; - -4284 -ame -[ -i -] = 0; - -4286 -ddr - = -e --> -pc -; - -4287 - - = -e --> - -[0]; - -4288 -a1 - = -e --> - -[1]; - -4289 -a2 - = -e --> - -[2]; - -4290  -diab -[ - -]. -amode - ) - -4292  -AM_IMP -: - -4293 - `rtf - -di -, "% %04X %02X %s", -ame -, -ddr -, - -, -diab -[]. -me - ); - -4296  -AM_IMM -: - -4297 - `rtf - -di -, "% %04X %02X %02X %#$%02X", -ame -, -ddr -, - -, -a1 -, -diab -[]. -me -,1 ); - -4300  -AM_ZP -: - -4301  -AM_ZPX -: - -4302  -AM_ZPY -: - -4303 -csym - = - `m_fd_sym_by_addr - -ic -, -a1 -, & -e --> -romdis - ); - -4304 if -csym - ) - -4305 - `rtf - -di -, "% %04X %02X %02X %%s", -ame -, -ddr -, - -, -a1 -, -diab -[]. -me -, -csym -->name ); - -4307 - `rtf - -di -, "% %04X %02X %02X %$%02X", -ame -, -ddr -, - -, -a1 -, -diab -[]. -me -,1 ); - -4308 if -diab -[ - -]. -amode - = -AM_ZP - ) ; - -4309 - `rt - -di -, -diab -[ - -]. -amode - = -AM_ZPX - ? ",X" : ",Y" ); - -4312  -AM_ABS -: - -4313  -AM_ABX -: - -4314  -AM_ABY -: - -4315 -csym - = - `m_fd_sym_by_addr - -ic -, ( -a2 -<<8)| -a1 -, & -e --> -romdis - ); - -4316 if -csym - ) - -4317 - `rtf - -di -, "% %04X %02X %02X %02X %%s", -ame -, -ddr -, - -, -a1 -, -a2 -, -diab -[]. -me -, -csym -->name ); - -4319 - `rtf - -di -, "% %04X %02X %02X %02X %$%02X%02X", -ame -, -ddr -, - -, -a1 -, -a2 -, -diab -[]. -me -,2,1 ); - -4320 if -diab -[ - -]. -amode - = -AM_ABS - ) ; - -4321 - `rt - -di -, -diab -[ - -]. -amode - = -AM_ABX - ? ",X" : ",Y" ); - -4324  -AM_ZIX -: - -4325 -csym - = - `m_fd_sym_by_addr - -ic -, -a1 -, & -e --> -romdis - ); - -4326 if -csym - ) - -4327 - `rtf - -di -, "% %04X %02X %02X %(%s,X)", -ame -, -ddr -, - -, -a1 -, -diab -[]. -me -, -csym -->name ); - -4329 - `rtf - -di -, "% %04X %02X %02X %($%02X,X)", -ame -, -ddr -, - -, -a1 -, -diab -[]. -me -,1 ); - -4332  -AM_ZIY -: - -4333 -csym - = - `m_fd_sym_by_addr - -ic -, -a1 -, & -e --> -romdis - ); - -4334 if -csym - ) - -4335 - `rtf - -di -, "% %04X %02X %02X %(%s),Y", -ame -, -ddr -, - -, -a1 -, -diab -[]. -me -, -csym -->name ); - -4337 - `rtf - -di -, "% %04X %02X %02X %($%02X),Y", -ame -, -ddr -, - -, -a1 -, -diab -[]. -me -,1 ); - -4340  -AM_REL -: - -4341 -addr - = (( -e --> -pc -+2)+((sigd ) -a1 -))&0xffff; - -4342 -csym - = - `m_fd_sym_by_addr - -ic -, -addr -, & -e --> -romdis - ); - -4343 if -csym - ) - -4344 - `rtf - -di -, "% %04X %02X %02X %%s", -ame -, -ddr -, - -, -a1 -, -diab -[]. -me -, -csym -->name ); - -4346 - `rtf - -di -, "% %04X %02X %02X %$%04X", -ame -, -ddr -, - -, -a1 -, -diab -[]. -me -, -addr - ); - -4349  -AM_IND -: - -4350 -csym - = - `m_fd_sym_by_addr - -ic -, ( -a2 -<<8)| -a1 -, & -e --> -romdis - ); - -4351 if -csym - ) - -4352 - `rtf - -di -, "% %04X %02X %02X %02X %(%s)", -ame -, -ddr -, - -, -a1 -, -a2 -, -diab -[]. -me -, -csym -->name ); - -4354 - `rtf - -di -, "% %04X %02X %02X %02X %($%02X%02X)", -ame -, -ddr -, - -, -a1 -, -a2 -, -diab -[]. -me -,2,1 ); - -4358 - `ry - -di -, " WTF?" ); - -4362  -i -= - ` -( -di -); i<60; i++ ) - -4363 -di -[ -i -] = 32; - -4364 -di -[ -i -] = 0; - -4366 - `rtf -(& -di -[60], "%c%c-%c%c%c%c%c A=%02X X=%02X Y=%02X SP=%04X ROMDIS=%d", - -4367 ( -e --> -ags -&0x80) ? 'N' : '-', - -4368 ( -e --> -ags -&0x40) ? 'V' : '-', - -4369 ( -e --> -ags -&0x10) ? 'B' : '-', - -4370 ( -e --> -ags -&0x08) ? 'D' : '-', - -4371 ( -e --> -ags -&0x04) ? 'I' : '-', - -4372 ( -e --> -ags -&0x02) ? 'Z' : '-', - -4373 ( -e --> -ags -&0x01) ? 'C' : '-', - -4374 -e --> -a -, - -4375 -e --> -x -, - -4376 -e --> -y -, - -4377 -e --> - -+0x100, - -4378 -e --> -romdis -); - -4380  -dimp -; - -4381 - } -} - -4383  - $dump_ua -( -mache - * -ic -) - -4385  -u_a_y - * - - = -li_t -; - -4387  - - ! -xt -) - -4389 - `tf -("%s\n", - `ua_t -( -ic -, - -)); - -4390 - - = ir-> -xt -; - -4392 - } -} - - @monitor.h - -22  - #SNAME_LEN - 11 - -23  - #SSNAME_LEN - ( -SNAME_LEN --3) - -24 - - ) - -25  - #SYMB_ROMDIS0 - 0 - - ) - -26  - #SYMF_ROMDIS0 - (1<< -SYMB_ROMDIS0 -) - - ) - -27  - #SYMB_ROMDIS1 - 1 - - ) - -28  - #SYMF_ROMDIS1 - (1<< -SYMB_ROMDIS1 -) - - ) - -29  - #SYMB_MICRODISC - 2 - - ) - -30  - #SYMF_MICRODISC - (1<< -SYMB_MICRODISC -) - - ) - -31  - #SYMB_JASMIN - 3 - - ) - -32  - #SYMF_JASMIN - (1<< -SYMB_JASMIN -) - - ) - -33  - #SYMB_TELEBANK0 - 4 - - ) - -34  - #SYMF_TELEBANK0 - (1<< -SYMB_TELEBANK0 -) - - ) - -35  - #SYMB_TELEBANK1 - 5 - - ) - -36  - #SYMF_TELEBANK1 - (1<< -SYMB_TELEBANK1 -) - - ) - -37  - #SYMB_TELEBANK2 - 6 - - ) - -38  - #SYMF_TELEBANK2 - (1<< -SYMB_TELEBANK2 -) - - ) - -39  - #SYMB_TELEBANK3 - 7 - - ) - -40  - #SYMF_TELEBANK3 - (1<< -SYMB_TELEBANK3 -) - - ) - -41  - #SYMB_TELEBANK4 - 8 - - ) - -42  - #SYMF_TELEBANK4 - (1<< -SYMB_TELEBANK4 -) - - ) - -43  - #SYMB_TELEBANK5 - 9 - - ) - -44  - #SYMF_TELEBANK5 - (1<< -SYMB_TELEBANK5 -) - - ) - -45  - #SYMB_TELEBANK6 - 10 - - ) - -46  - #SYMF_TELEBANK6 - (1<< -SYMB_TELEBANK6 -) - - ) - -47  - #SYMB_TELEBANK7 - 11 - - ) - -48  - #SYMF_TELEBANK7 - (1<< -SYMB_TELEBANK7 -) - - ) - -49  - #SYMB_PRAVZ8D - 12 - - ) - -50  - #SYMF_PRAVZ8D - (1<< -SYMB_PRAVZ8D -) - - ) - -52  - #SYM_BESTGUESS - 0xffff - - ) - -54  - smsym - - -56  - maddr -; - -57  - mags -; - -58  - mame -[ -SNAME_LEN -+1]; - -59  - msame -[ -SSNAME_LEN -+1]; - -60 * - mme -; - -63  - ssymbޏb - - -65  - mnumsyms -, - msyma -; - -66  -msym - * - msyms -; - -69 -SDL_bo - -isws - -c - ); - -70 -SDL_bo - -ishex - -c - ); - -71  -hex - -c - ); - -73  -m_wm - -mache - * -ic - ); - -74  -m_ - -mache - * -ic - ); - -75  -m_nd - -mache - * -ic - ); - -76  -m_upde_gs - -mache - * -ic - ); - -77  -m_upde - -mache - * -ic - ); - -78 -SDL_bo - -m_evt - -SDL_Evt - * -ev -,  -mache - * -ic -, SDL_bo * -ednd - ); - -79  -dbg_tf -* -fmt -, ... ); - -80  -m_tf_above -* -fmt -, ... ); - -81  -m_r - -mache - * -ic - ); - -82  -m_shut - -mache - * -ic - ); - -83  -m__symb - -symbޏb - * -ab - ); - -84  -m_syms - -symbޏb - * -ab - ); - -85 -SDL_bo - -m_w_symbs - -symbޏb - * -ab -,  -mache - * -ic -, * -ame -,  -ags -, SDL_bo -above -, SDL_bo -vbo - ); - -86 -SDL_bo - -m_symsomsh - -symbޏb - * -ab -, * -bufr -,  -n -); - -87  -m_e_t - -mache - * -ic - ); - -88 -SDL_bo - -m_gnum - -mache - * -ic -, * -num -, * -buf -, * -off -, SDL_bo -addegs -, SDL_bo -egs -, SDL_bo -vgs -, SDL_bo -symbs - ); - -89 -SDL_bo - -m_do_cmd -* -cmd -,  -mache - * -ic -, SDL_bo * -ednd - ); - -90 -SDL_bo - -m_cmd -* -cmd -,  -mache - * -ic -, SDL_bo * -ednd - ); - -92 #i -defed -( -DEBUG_CPU_TRACE -) && DEBUG_CPU_TRACE > 0 - -93  - su_a_y - - -95  -u_a_y - * - mxt -, * - mev -; - -96 -Ut16 - - mpc -; - -97 -Ut8 - - ma -, - mx -, - my -, - m -, - mags -; - -98 -Ut8 - - m -[3]; - -99 -SDL_bo - - mromdis -; - -101  -m_a -( -m6502 - * -u -); - -102  -dump_ua -( -mache - * -ic -); - - @msgbox.h - -24 - mMSGBOX_YES_NO - = 0, - -25 - mMSGBOX_OK_CANCEL -, - -26 - mMSGBOX_OK - - -29 -SDL_bo - -_msgbox - -mache - * -ic - ); - -30  -shut_msgbox - -mache - * -ic - ); - -31 -SDL_bo - -msgbox - -mache - * -ic -,  -ty -, * -msg - ); - - @msgbox_beos.cpp - -22  - ~ - -23  - ~ - -24  - ~ - -25  - ~ - -26  - ~ - -27  - ~ - -28  - ~ - -31  - ~"syem.h -" - -32  - ~"6502.h -" - -33  - ~"v.h -" - -34  - ~"8912.h -" - -35  - ~"gui.h -" - -36  - ~"disk.h -" - -37  - ~"mڙ.h -" - -38  - ~"6551.h -" - -39  - ~"mache.h -" - -40  - ~"msgbox.h -" - -43 -SDL_bo - - $_msgbox - -mache - * -ic - ) - -45  -SDL_TRUE -; - -46 - } -} - -48  - $shut_msgbox - -mache - * -ic - ) - -50 - } -} - -52 -SDL_bo - - $msgbox - -mache - * -ic -,  -ty -, * -msg - ) - -54  -ty - ) - -56  -MSGBOX_YES_NO -: - -57  (( -w - - `BA˹ -("Oricu Reque", -msg -, "Yes", "No"))-> - `Go -(=0? -SDL_TRUE - : -SDL_FALSE -; - -60  -MSGBOX_OK_CANCEL -: - -61  (( -w - - `BA˹ -("Oricu Reque", -msg -, "Ok", "Cl"))-> - `Go -(=0? -SDL_TRUE - : -SDL_FALSE -; - -64  -MSGBOX_OK -: - -65 ( -w - - `BA˹ -("Oricu Reque", -msg -, "Ok"))-> - `Go -(); - -66  -SDL_TRUE -; - -69  -SDL_TRUE -; - -70 - } -} - - @msgbox_gtk.c - -22  - ~ - -23  - ~ - -24  - ~ - -25  - ~ - -26  - ~ - -27  - ~ - -29  - ~ - -31  - ~"syem.h -" - -32  - ~"6502.h -" - -33  - ~"v.h -" - -34  - ~"8912.h -" - -35  - ~"gui.h -" - -36  - ~"disk.h -" - -37  - ~"mڙ.h -" - -38  - ~"6551.h -" - -39  - ~"mache.h -" - -40  - ~"msgbox.h -" - -42 -SDL_bo - -fusn -; - -43  -toggfusn - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -45 -SDL_bo - - $_msgbox - -mache - * -ic - ) - -48  -SDL_TRUE -; - -49 - } -} - -51  - $shut_msgbox - -mache - * -ic - ) - -53 - } -} - -55 -SDL_bo - - $msgbox - -mache - * -ic -,  -ty -, * -msg - ) - -57 -GtkWidg - * -dlog - = -NULL -; - -58 -GtkBusTy - -bs - = -GTK_BUTTONS_OK -; - -59 -GtkMesgeTy - -mtyp - = -GTK_MESSAGE_INFO -; - -60 -SDL_bo - -su - = -SDL_FALSE -; - -61 -gt - -s -; - -62 -SDL_bo - -was_fusn - = -fusn -; - -64 i( -fusn -) - -65 - `toggfusn -( -ic -, -NULL -, 0); - -67  -ty - ) - -69  -MSGBOX_YES_NO -: - -70 -bs - = -GTK_BUTTONS_YES_NO -; - -71 -mtyp - = -GTK_MESSAGE_QUESTION -; - -74  -MSGBOX_OK_CANCEL -: - -75 -bs - = -GTK_BUTTONS_OK_CANCEL -; - -82 -dlog - = - `gtk_mesge_dlog_w -( -NULL -, -GTK_DIALOG_MODAL -, -mtyp -, -bs -, "%s", -msg -); - -83 -s - = - `gtk_dlog_run -( - `GTK_DIALOG - ( -dlog -)); - -84 i(( -s - = -GTK_RESPONSE_OK -|| (= -GTK_RESPONSE_YES -|| (= -GTK_RESPONSE_ACCEPT -)) - -85 -su - = -SDL_TRUE -; - -87 - `gtk_widg_deroy -( -dlog -); - -88  - `gtk_evts_ndg -()) - -89 - `gtk_ma_i -(); - -91 i( -was_fusn -) - -92 - `toggfusn -( -ic -, -NULL -, 0); - -94  -su -; - -95 - } -} - - @msgbox_os2.c - -22  - ~ - -24  - ~"syem.h -" - -25  - ~"6502.h -" - -26  - ~"v.h -" - -27  - ~"8912.h -" - -28  - ~"gui.h -" - -29  - ~"disk.h -" - -30  - ~"mڙ.h -" - -31  - ~"6551.h -" - -32  - ~"mache.h -" - -33  - ~"msgbox.h -" - -35 -SDL_bo - - $_msgbox - -mache - * -ic - ) - -37  -SDL_TRUE -; - -38 - } -} - -40  - $shut_msgbox - -mache - * -ic - ) - -42 - } -} - -44 -SDL_bo - - $msgbox - -mache - * -ic -,  -ty -, * -msg - ) - -46 * -bs - = "OK|Cancel"; - -47  -EasySu - -myES - = - -49 ( -EasySu -), - -52 -msg -, - -53 -bs -, - -56  -ty - ) - -58  -MSGBOX_YES_NO -: - -59 - `ry -( -bs -, "Yes|No"); - -62  -MSGBOX_OK -: - -63 - `ry -( -bs -, "OK"); - -66  -MSGBOX_OK_CANCEL -: - -70  - `EasyReque -( -NULL -, & -myES -, NULL); - -71 - } -} - - @msgbox_os4.c - -22  - ~ - -23  - ~ - -24  - ~ - -25  - ~ - -26  - ~ - -27  - ~ - -29  - ~ - -31  - ~ - -32  - ~ - -33  - ~ - -35  - ~"syem.h -" - -36  - ~"6502.h -" - -37  - ~"v.h -" - -38  - ~"8912.h -" - -39  - ~"gui.h -" - -40  - ~"disk.h -" - -41  - ~"mڙ.h -" - -42  - ~"6551.h -" - -43  - ~"mache.h -" - -44  - ~"msgbox.h -" - -46  -Libry - * - gIuiBa - = -NULL -; - -47  -Libry - * - gRequeBa - = -NULL -; - -49  -IuiIFa - * - gIIui - = -NULL -; - -50  -RequeIFa - * - gIReque - = -NULL -; - -52 -SDL_bo - - $_msgbox - -mache - * -ic - ) - -54 -IuiBa - = -IExec --> - `OnLibry -( "intuition.library", 51 ); - -55 if! -IuiBa - ) - -57 - `tf -( "Unableo open intuition.library v51+\n" ); - -58  -SDL_FALSE -; - -61 -IIui - = ( -IuiIFa - *) -IExec --> - `GI - -IuiBa -, "ma", 1, -NULL - ); - -62 if! -IIui - ) - -64 - `tf -( "Unableo obtain main interface for intuition.library\n" ); - -65  -SDL_FALSE -; - -68 -RequeBa - = -IExec --> - `OnLibry -( "requester.class", 51 ); - -69 if! -RequeBa - ) - -71 - `tf -( "Unableo openequester.class v51+\n" ); - -72  -SDL_FALSE -; - -75 -IReque - = ( -RequeIFa - *) -IExec --> - `GI - -RequeBa -, "ma", 1, -NULL - ); - -76 if! -IReque - ) - -78 - `tf -( "Unableo obtain main interface forequester.library\n" ); - -79  -SDL_FALSE -; - -82  -SDL_TRUE -; - -83 - } -} - -85  - $shut_msgbox - -mache - * -ic - ) - -87 if -IReque - ) -IExec --> - `DrI -( -I - *)IRequester ); - -88 if -RequeBa - ) -IExec --> - `CloLibry -( RequesterBase ); - -89 if -IIui - ) -IExec --> - `DrI -( -I - *)IIntuition ); - -90 if -IuiBa - ) -IExec --> - `CloLibry -( IntuitionBase ); - -91 - } -} - -93 -SDL_bo - - $msgbox - -mache - * -ic -,  -ty -, * -msg - ) - -95 -Obje - * -q_obj -; - -96 -t32 - -su -, -imgty -= -REQIMAGE_INFO -; - -97 -STRPTR - -bs - = "huh?!"; - -99  -ty - ) - -101  -MSGBOX_YES_NO -: - -102 -bs - = "Yes|No"; - -103 -imgty - = -REQIMAGE_QUESTION -; - -106  -MSGBOX_OK_CANCEL -: - -107 -bs - = "OK|Cancel"; - -108 -imgty - = -REQIMAGE_QUESTION -; - -111  -MSGBOX_OK -: - -112 -bs - = "OK"; - -113 -imgty - = -REQIMAGE_INFO -; - -117 -q_obj - = ( -Obje - *) -IIui --> - `NewObje - -IReque --> - `REQUESTER_GCss -(), -NULL -, - -118 -REQ_TText -, "Oricutron Request", - -119 -REQ_BodyText -, -msg -, - -120 -REQ_GadgText -, -bs -, - -121 -REQ_Image -, -imgty -, - -122 -TAG_DONE - ); - -124 if! -q_obj - )  -SDL_TRUE -; - -126 -su - = -IIui --> - `IDoMhod - -q_obj -, -RM_OPENREQ -, -NULL -, NULL, NULL ); - -127 -IIui --> - `DioObje - -q_obj - ); - -129 if -ty - = -MSGBOX_OK - )  -SDL_TRUE -; - -131  -su - ? -SDL_TRUE - : -SDL_FALSE -; - -132 - } -} - - @msgbox_sdl.c - -22  - ~ - -23  - ~ - -24  - ~ - -25  - ~ - -26  - ~ - -27  - ~ - -29  - ~"syem.h -" - -30  - ~"6502.h -" - -31  - ~"v.h -" - -32  - ~"8912.h -" - -33  - ~"gui.h -" - -34  - ~"disk.h -" - -35  - ~"mڙ.h -" - -36  - ~"6551.h -" - -37  - ~"mache.h -" - -38  - ~"msgbox.h -" - -40  - smsgboxbut - - -42  - mx -, - my -; - -43 * - mr -; - -46 -SDL_Sur - * -sn -; - -47  -xtze - * -tz -[ -NUM_TZ -]; - -48  -msgboxbut - * - gbs -; - -49  - gcb -; - -51  -msgboxbut - - gynbuts -[] = { { 2, 5, " YES " }, - -53 { -1,-1, -NULL - } }; - -55  -msgboxbut - - gocbuts -[] = { { 2, 5, " OK " }, - -57 { -1,-1, -NULL - } }; - -59  -msgboxbut - - gobuts -[] = { { 26, 5, " OK " }, - -60 { -1,-1, -NULL - } }; - -62 -SDL_bo - - $_msgbox - -mache - * -ic - ) - -64 if! - `loc_xtze - -ic -, -TZ_MSGBOX -, 80, 120, 60, 8, "Oricu Reque" ) )  -SDL_FALSE -; - -66  -SDL_TRUE -; - -67 - } -} - -69  - $shut_msgbox - -mache - * -ic - ) - -71 - `_xtze - -ic -, -TZ_MSGBOX - ); - -72 - } -} - -75  - $msgbox_nd - -mache - * -ic - ) - -77  -i -; - -79  -i -=0; -bs -[i]. -x -!=-1; i++ ) - -81 if -i -== -cb - ) - -83 -tz -[ -TZ_MSGBOX -]-> -cfc - = 1; - -84 -tz -[ -TZ_MSGBOX -]-> -cbc - = 2; - -86 -tz -[ -TZ_MSGBOX -]-> -cfc - = 2; - -87 -tz -[ -TZ_MSGBOX -]-> -cbc - = 5; - -90 - `tzos - -tz -[ -TZ_MSGBOX -], -bs -[ -i -]. -x -, bs[i]. -y -, bs[i]. -r - ); - -93 -ic --> - `nd_beg -( oric ); - -95 -ic --> - `nd_video -ic, -SDL_TRUE - ); - -96 -ic --> - `nd_xtze -ic, -TZ_MSGBOX - ); - -98 -ic --> - `nd_d -( oric ); - -99 - } -} - -101  - $msgbox_checkov - -x -,  -y - ) - -103  -i -; - -105  -i -=0; -bs -[i]. -x -!=-1; i++ ) - -107 if -y - = -bs -[ -i -].y ) && - -108 -x - > -bs -[ -i -].x ) && - -109 -x - < ( -bs -[ -i -].x+ - ` -(bs[i]. -r -)) ) ) - -110  -i -; - -113 - } -} - -115 -SDL_bo - - $msgbox - -mache - * -ic -,  -ty -, * -msg - ) - -117  -i -, -j -, -k -, -mx -, -my -, -ess -; - -118  -les -[] = { 2*60, 3*60, 5*60 }; - -119 * -msg2 -; - -120 -SDL_Evt - -evt -; - -121 -SDL_bo - -wasunicode -; - -123 -wasunicode - = - `SDL_COMPAT_EbUNICODE - -SDL_TRUE - ); - -124 - `SDL_COMPAT_EbKeyRt - -SDL_DEFAULT_REPEAT_DELAY -, -SDL_DEFAULT_REPEAT_INTERVAL - ); - -127  -i -=1; i<59; i++ ) - -129  -j -=0; j<3; j++ ) - -131 -tz -[ -TZ_MSGBOX -]-> -fc -[ -les -[ -j -]+ -i -] = 2; - -132 -tz -[ -TZ_MSGBOX -]-> -bc -[ -les -[ -j -]+ -i -] = 3; - -133 -tz -[ -TZ_MSGBOX -]-> -tx -[ -les -[ -j -]+ -i -] = 32; - -137  -i -=0; -msg -[i]; i++ ) if( (msg[i]=='\r')||(msg[i]=='\n') ) ; - -139  -j -=0, -k -=30- -i -/2; j -tx -[ -les -[0]+ -k -] = -msg -[ -j -]; - -142  ( -msg -[ -i -]=='\r')||(msg[i]=='\n') ) i++; - -143 if -msg -[ -i -] ) - -145 -msg2 - = & -msg -[ -i -]; - -146 -i - = - ` - -msg2 - ); - -147  -j -=0, -k -=30- -i -/2; j -tx -[ -les -[1]+ -k -] = -msg2 -[ -j -]; - -151  -ty - ) - -153  -MSGBOX_YES_NO -: - -154 -bs - = -ynbuts -; - -155 -cb - = 0; - -158  -MSGBOX_OK_CANCEL -: - -159 -bs - = -ocbuts -; - -160 -cb - = 1; - -163  -MSGBOX_OK -: - -164 -bs - = -obuts -; - -165 -cb - = 0; - -169 - `msgbox_nd - -ic - ); - -171 -ess - = -1; - -174 if! - `SDL_WaEvt -& -evt - ) ) - -176 - `SDL_COMPAT_EbUNICODE - -wasunicode - ); - -177 - `SDL_COMPAT_EbKeyRt - -wasunicode - ? -SDL_DEFAULT_REPEAT_DELAY - : 0, wasunicod? -SDL_DEFAULT_REPEAT_INTERVAL - : 0 ); - -178  -SDL_FALSE -; - -181  -evt -. -ty - ) - -183  -SDL_COMPAT_ACTIVEEVENT -: - -184 if( - `SDL_COMPAT_IsAFocud -& -evt - ) ) { - -185 - `msgbox_nd - -ic - ); - -189  -SDL_MOUSEMOTION -: - -190 if -ess - != -1 ) ; - -191 -mx - = ( -evt -. -mi -. -x - - -tz -[ -TZ_MSGBOX -]->x)/8; - -192 -my - = ( -evt -. -mi -. -y - - -tz -[ -TZ_MSGBOX -]->y)/12; - -193 -i - = - `msgbox_checkov - -mx -, -my - ); - -194 if -i - == -1 ) ; - -195 if -i - ! -cb - ) - -197 -cb - = -i -; - -198 - `msgbox_nd - -ic - ); - -202  -SDL_MOUSEBUTTONDOWN -: - -203 if -evt -. -bu -.bu = -SDL_BUTTON_LEFT - ) - -205 -mx - = ( -evt -. -mi -. -x - - -tz -[ -TZ_MSGBOX -]->x)/8; - -206 -my - = ( -evt -. -mi -. -y - - -tz -[ -TZ_MSGBOX -]->y)/12; - -207 -i - = - `msgbox_checkov - -mx -, -my - ); - -208 if -i - == -1 ) ; - -209 -cb - = -i -; - -210 -ess - = -i -; - -211 - `msgbox_nd - -ic - ); - -215  -SDL_MOUSEBUTTONUP -: - -216 if -evt -. -bu -.bu = -SDL_BUTTON_LEFT - ) - -218 if -ess - == -1 ) ; - -219 -mx - = ( -evt -. -mi -. -x - - -tz -[ -TZ_MSGBOX -]->x)/8; - -220 -my - = ( -evt -. -mi -. -y - - -tz -[ -TZ_MSGBOX -]->y)/12; - -221 -i - = - `msgbox_checkov - -mx -, -my - ); - -222 if -i - = -ess - ) - -224  -ty - ) - -226  -MSGBOX_YES_NO -: - -227  -MSGBOX_OK_CANCEL -: - -228 - `SDL_COMPAT_EbUNICODE - -wasunicode - ); - -229 - `SDL_COMPAT_EbKeyRt - -wasunicode - ? -SDL_DEFAULT_REPEAT_DELAY - : 0, wasunicod? -SDL_DEFAULT_REPEAT_INTERVAL - : 0 ); - -230  ( -ess -==0); - -233 - `SDL_COMPAT_EbUNICODE - -wasunicode - ); - -234 - `SDL_COMPAT_EbKeyRt - -wasunicode - ? -SDL_DEFAULT_REPEAT_DELAY - : 0, wasunicod? -SDL_DEFAULT_REPEAT_INTERVAL - : 0 ); - -235  -SDL_TRUE -; - -240 -ess - = -1; - -244  -SDL_KEYDOWN -: - -245  -evt -. -key -. -keysym -. -sym - ) - -247  -SDLK_TAB -: - -248  -SDLK_RIGHT -: - -249 -cb - = cbtn+1; - -250 if -bs -[ -cb -]. -x - == -1 ) cbtn = 0; - -251 - `msgbox_nd - -ic - ); - -254  -SDLK_LEFT -: - -255 -cb ---; - -256 if -cb - < 0 ) - -258  -cb -=0; -bs -[cb]. -x -!=-1; cbtn++ ) ; - -259 -cb ---; - -261 - `msgbox_nd - -ic - ); - -264  -SDLK_RETURN -: - -265  -SDLK_KP_ENTER -: - -266  -ty - ) - -268  -MSGBOX_YES_NO -: - -269  -MSGBOX_OK_CANCEL -: - -270 - `SDL_COMPAT_EbUNICODE - -wasunicode - ); - -271 - `SDL_COMPAT_EbKeyRt - -wasunicode - ? -SDL_DEFAULT_REPEAT_DELAY - : 0, wasunicod? -SDL_DEFAULT_REPEAT_INTERVAL - : 0 ); - -272  ( -cb -==0); - -275 - `SDL_COMPAT_EbUNICODE - -wasunicode - ); - -276 - `SDL_COMPAT_EbKeyRt - -wasunicode - ? -SDL_DEFAULT_REPEAT_DELAY - : 0, wasunicod? -SDL_DEFAULT_REPEAT_INTERVAL - : 0 ); - -277  -SDL_TRUE -; - -288 - `SDL_COMPAT_EbUNICODE - -wasunicode - ); - -289 - `SDL_COMPAT_EbKeyRt - -wasunicode - ? -SDL_DEFAULT_REPEAT_DELAY - : 0, wasunicod? -SDL_DEFAULT_REPEAT_INTERVAL - : 0 ); - -290  -SDL_FALSE -; - -291 - } -} - - @msgbox_win32.c - -22  - ~ - -23  - ~ - -24  - ~ - -25  - ~ - -26  - ~ - -28  - #WANT_WMINFO - - - ) - -30  - ~"syem.h -" - -31  - ~"6502.h -" - -32  - ~"v.h -" - -33  - ~"8912.h -" - -34  - ~"gui.h -" - -35  - ~"disk.h -" - -36  - ~"mڙ.h -" - -37  - ~"6551.h -" - -38  - ~"mache.h -" - -39  - ~"msgbox.h -" - -41 -SDL_bo - - $_msgbox - -mache - * -ic - ) - -43  -SDL_TRUE -; - -44 - } -} - -46  - $shut_msgbox - -mache - * -ic - ) - -48 - } -} - -50 -SDL_bo - - $msgbox - -mache - * -ic -,  -ty -, * -msg - ) - -52 -SDL_SysWMfo - -wmi -; - -53 -HWND - -hwnd -; - -55 -hwnd - = -NULL -; - -56 - `SDL_VERSION -(& -wmi -. -vsi -); - -57 if( - `SDL_COMPAT_GWMInfo -& -wmi - ) ) - -58 #i -SDL_MAJOR_VERSION - == 1 - -59 -hwnd - = ( -HWND -) -wmi -. -wdow -; - -61 -hwnd - = ( -HWND -) -wmi -. -fo -. -w -. -wdow -; - -63  -ty - ) - -65  -MSGBOX_YES_NO -: - -66  ( - `MesgeBoxA - -hwnd -, -msg -, "Oricu Reque", -MB_YESNO - ) = -IDYES -); - -68  -MSGBOX_OK_CANCEL -: - -69  ( - `MesgeBoxA - -hwnd -, -msg -, "Oricu Reque", -MB_OKCANCEL - ) = -IDOK -); - -71  -MSGBOX_OK -: - -72 - `MesgeBoxA - -hwnd -, -msg -, "Oricu Reque", -MB_OK - ); - -75  -SDL_TRUE -; - -76 - } -} - - @msvc/strcasecmp.h - -1 #ifde -_MSC_VER - - -2 #ifde -__SPECIFY_SDL_DIR__ - - -3  - ~ - -5  - ~ - -7  - #rcmp - -SDL_rcmp - - - ) - -8  - #cmp - -SDL_cmp - - - ) - - @msvc/unistd.h - -1 #ifde -_MSC_VER - - -3  - ~ - -4  - ~ - -8  - ~ - -9  - #gcwd - -_gcwd - - - ) - -12  - ~"rcmp.h -" - - @plugins/ch376/ch376.c - -27 #i -defed -( -__MORPHOS__ -|| defed ( -__AMIGA__ -|| defed ( -__AROS__ -) - -29  - #__NOLIBBASE__ - - - ) - -31  - ~ - -32  - ~ - -33  - ~ - -35  -Libry - * -SysBa -; - -37 #i -defed -( -WIN32 -) - -39  - ~ - -40  - ~ - -41  - ~ - -42  - ~ - -45 #i -defed -( -__unix__ -|| defed( -__APPLE__ -|| defed( -__HAIKU__ -|| defed( -__MINT__ -) - -47  - ~ - -48  - ~ - -49  - ~ - -50  - ~ - -51  - ~ - -52  - ~ - -53  - ~ - -54  - ~ - -55  - ~ - -61  - ~"ch376.h -" - -68  - #CH376_DATA_IC_VER - 3 - - ) - -71  - #CH376_CMD_NONE - 0x00 - - ) - -72  - #CH376_CMD_GET_IC_VER - 0x01 - - ) - -73  - #CH376_CMD_CHECK_EXIST - 0x06 - - ) - -74  - #CH376_CMD_GET_FILE_SIZE - 0x0c - - ) - -75  - #CH376_CMD_SET_USB_MODE - 0x15 - - ) - -76  - #CH376_CMD_GET_STATUS - 0x22 - - ) - -77  - #CH376_CMD_RD_USB_DATA0 - 0x27 - - ) - -78  - #CH376_CMD_WR_REQ_DATA - 0x2d - - ) - -79  - #CH376_CMD_SET_FILE_NAME - 0x2f - - ) - -80  - #CH376_CMD_DISK_MOUNT - 0x31 - - ) - -81  - #CH376_CMD_FILE_OPEN - 0x32 - - ) - -82  - #CH376_CMD_FILE_ENUM_GO - 0x33 - - ) - -83  - #CH376_CMD_FILE_CREATE - 0x34 - - ) - -84  - #CH376_CMD_FILE_ERASE - 0x35 - - ) - -85  - #CH376_CMD_FILE_CLOSE - 0x36 - - ) - -86  - #CH376_CMD_BYTE_LOCATE - 0x39 - - ) - -87  - #CH376_CMD_BYTE_READ - 0x3a - - ) - -88  - #CH376_CMD_BYTE_RD_GO - 0x3b - - ) - -89  - #CH376_CMD_BYTE_WRITE - 0x3c - - ) - -90  - #CH376_CMD_BYTE_WR_GO - 0x3d - - ) - -91  - #CH376_CMD_DISK_CAPACITY - 0x3e - - ) - -92  - #CH376_CMD_DISK_QUERY - 0x3f - - ) - -93  - #CH376_CMD_DIR_CREATE - 0x40 - - ) - -94  - #CH376_CMD_DISK_RD_GO - 0x55 - - ) - -96  - #CH376_ARG_SET_USB_MODE_INVALID - 0x00 - - ) - -97  - #CH376_ARG_SET_USB_MODE_SD_HOST - 0x03 - - ) - -98  - #CH376_ARG_SET_USB_MODE_USB_HOST - 0x06 - - ) - -101  - #CH376_ERR_OPEN_DIR - 0x41 - - ) - -102  - #CH376_ERR_MISS_FILE - 0x42 - - ) - -103  - #CH376_ERR_FOUND_NAME - 0x43 - - ) - -105  - #CH376_RET_SUCCESS - 0x51 - - ) - -106  - #CH376_RET_ABORT - 0x5f - - ) - -108  - #CH376_INT_SUCCESS - 0x14 - - ) - -109  - #CH376_INT_DISK_READ - 0x1d - - ) - -110  - #CH376_INT_DISK_WRITE - 0x1e - - ) - -116  - #CMD_DATA_REQ_SIZE - 0xff - - ) - -119  - #DIR_ATTR_READ_ONLY - 0x01 - - ) - -120  - #DIR_ATTR_HIDDEN - 0x02 - - ) - -121  - #DIR_ATTR_SYSTEM - 0x04 - - ) - -122  - #DIR_ATTR_VOLUME_ID - 0x08 - - ) - -123  - #DIR_ATTR_DIRECTORY - 0x10 - - ) - -124  - #DIR_ATTR_ARCHIVE - 0x20 - - ) - -126  - #DIR_MAKE_FILE_TIME -( -h -, -m -, -s -((h<<11+ (m<<5+ (s>>1)) - - ) - -128  - #DIR_MAKE_FILE_DATE -( -y -, -m -, -d -(((y-1980)<<9+ (m<<5+ d) - - ) - -130 #agm -ck -(1) - -133  - sFDInfo - - -135  - mDIR_Name -[11]; - -136 -CH376_U8 - - mDIR_Ar -; - -137 -CH376_U8 - - mDIR_NTRes -; - -138 -CH376_U8 - - mDIR_CTimeTth -; - -139 -CH376_U8 - - mDIR_CTime -[2]; - -140 -CH376_U8 - - mDIR_CDe -[2]; - -141 -CH376_U8 - - mDIR_LAccDe -[2]; - -142 -CH376_U8 - - mDIR_FClusHI -[2]; - -143 -CH376_U8 - - mDIR_WTime -[2]; - -144 -CH376_U8 - - mDIR_WDe -[2]; - -145 -CH376_U8 - - mDIR_FClusLO -[2]; - -146 -CH376_U8 - - mDIR_FeSize -[4]; - -149  - sMouInfo - - -151 -CH376_U8 - - mMOUNT_DeviTy -; - -152 -CH376_U8 - - mMOUNT_RemovabMed -; - -153 -CH376_U8 - - mMOUNT_Vsis -; - -154 -CH376_U8 - - mMOUNT_DaFmAndEtc -; - -155 -CH376_U8 - - mMOUNT_AddiڮLgth -; - -156 -CH376_U8 - - mMOUNT_Rerved1 -; - -157 -CH376_U8 - - mMOUNT_Rerved2 -; - -158 -CH376_U8 - - mMOUNT_MiscFg -; - -159  - mMOUNT_VdIdS -[8]; - -160  - mMOUNT_ProduIdS -[16]; - -161  - mMOUNT_ProduRevS -[4]; - -164  - sDiskQuy - - -166 -CH376_U8 - - mDISK_TٮSe -[4]; - -167 -CH376_U8 - - mDISK_FeSe -[4]; - -168 -CH376_U8 - - mDISK_DiskF -; - -171  - uCommdDa - - -173  - mCMD_FeName -[14]; - -174  -MouInfo - - mCMD_MouInfo -; - -175  -FDInfo - - mCMD_FDInfo -; - -176  -DiskQuy - - mCMD_DiskQuy -; - -177 -CH376_U8 - - mCMD_FeSk -[4]; - -178 -CH376_U8 - - mCMD_FeRdWre -[2]; - -179 -CH376_U8 - - mCMD_IOBufr -[255]; - -180 -CH376_U8 - - mCMD_CheckBy -; - -181 -CH376_U8 - - mCMD_FeSize -[4]; - -184 #agm -ck -() - -190  - sch376 - - -192 -CH376_CONTEXT - - mcڋxt -; - -194 -CH376_U8 - - mcommd -; - -195 -CH376_U8 - - mcommd_us -; - -197 -CH376_U8 - - mr_us -; - -198 -CH376_U8 - - musb_mode -; - -200  -CommdDa - - mcmd_da -; - -201 -CH376_U8 - - mnb_bys__cmd_da -; - -202 -CH376_U8 - - mpos_rw__cmd_da -; - -204 -CH376_U16 - - mbys_to_ad_wre -; - -206 -CH376_LOCK - - mro_d_lock -; - -207 -CH376_LOCK - - mcut_d_lock -; - -208 -CH376_FILE - - mcut_fe -; - -209 -CH376_DIR - - mcut_dey_browsg -; - -211 -CH376_BOOL - - mcut_fe_is_dey -; - -212  - md_n -[14]; - -214 * - msdrd_drive_th -; - -215 * - musb_drive_th -; - -222 * -e_rg -(cڡ * -rg -); - -223  -r_ruu -( -ch376 - *ch376); - -224  -nl_l_io -( -ch376 - *ch376); - -225  -nmize_ch -( -c -); - -226 cڡ * -nmize_fe_me -(cڡ * -fe_me -, * -nmized_fe_me -); - -227 cڡ * -im_fe_me -(cڡ * -fe_me -, * -immed_fe_me -); - -228  -fe_ad_chunk -( -ch376 - *ch376); - -229  -fe_wre_chunk -( -ch376 - *ch376); - -230  -CH376_BOOL - -n_mch -(cڡ * -n -, cڡ * -r -); - -231 cڡ * -nmize_n -(cڡ * -n -, * -nmized_n -); - -238 * -syem_loc_mem -( -size -); - -242  -syem__mem -(* -r -); - -246  -CH376_BOOL - -syem__cڋxt -( -CH376_CONTEXT - * -cڋxt -, -UNUSED - * -ur_da -); - -249  -syem_n_cڋxt -( -CH376_CONTEXT - * -cڋxt -); - -252  -CH376_BOOL - -syem_g_disk_fo -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -ro_lock -,  -DiskQuy - * -disk_fo -); - -256  -CH376_LOCK - -syem_ob_dey_lock -( -CH376_CONTEXT - * -cڋxt -, cڡ * -d_th -, CH376_LOCK -ro_lock -); - -260  -syem_a_dey_lock -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -d_lock -); - -263  -CH376_LOCK - -syem_e_dey_lock -( -CH376_CONTEXT - * -cڋxt -, CH376_LOCK -d_lock -); - -266  -CH376_LOCK - -syem__dey -( -CH376_CONTEXT - * -cڋxt -, cڡ * -d_th -, CH376_LOCK -ro_lock -); - -270  -CH376_FILE - -syem_fe_ݒ_exig -( -CH376_CONTEXT - * -cڋxt -, cڡ * -fe_me -, -CH376_LOCK - -ro_lock -); - -274  -CH376_FILE - -syem_fe_ݒ_w -( -CH376_CONTEXT - * -cڋxt -, cڡ * -fe_me -, -CH376_LOCK - -ro_lock -); - -277  -syem_fe_o -( -CH376_CONTEXT - * -cڋxt -, -CH376_FILE - -fe -); - -280  -CH376_S32 - -syem_fe_ek -( -CH376_CONTEXT - * -cڋxt -, -CH376_FILE - -fe -,  -pos -); - -283  -CH376_S32 - -syem_fe_ad -( -CH376_CONTEXT - * -cڋxt -, -CH376_FILE - -fe -, * -bufr -, CH376_S32 -size -); - -286  -CH376_S32 - -syem_fe_wre -( -CH376_CONTEXT - * -cڋxt -, -CH376_FILE - -fe -, * -bufr -, CH376_S32 -size -); - -289  -CH376_BOOL - -syem_fe_de -( -CH376_CONTEXT - * -cڋxt -, cڡ * -fe_me -, -CH376_LOCK - -ro_lock -); - -292  -CH376_BOOL - -syem_dey_de -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -ro_lock -); - -296  -CH376_DIR - -syem_t_exame_dey -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -d_lock -); - -299  -CH376_BOOL - -syem_go_exame_dey -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -d_lock -, -CH376_DIR - -fib -,  -FDInfo - * -d_fo -, * -n -); - -302  -syem_fish_exame_dey -( -CH376_CONTEXT - * -cڋxt -, -CH376_DIR - -fib -); - -305  -CH376_S32 - -syem_g_fe_size -( -CH376_CONTEXT - * -cڋxt -, -CH376_FILE - -fe -); - -309 #i -defed -( -__MORPHOS__ -|| defed ( -__AMIGA__ -|| defed ( -__AROS__ -) - -313 #ifde -DEBUG_CH376 - - -314  - ~ - -315  - #dbg_tf - -ktf - - - ) - -317  - #dbg_tf -(...) - - ) - -320 * - $syem_loc_mem -( -size -) - -322  - `AocVec -( -size -, -MEMF_ANY -); - -323 - } -} - -325  - $syem__mem -(* -r -) - -327 - `FeVec -( -r -); - -328 - } -} - -330  -CH376_BOOL - - $syem__cڋxt -( -CH376_CONTEXT - * -cڋxt -, -UNUSED - * -ur_da -) - -332 -cڋxt --> -DOSBa - = - `OnLibry -( -DOSNAME -, 0L); - -333  ( -cڋxt --> -DOSBa - ! -NULL -); - -334 - } -} - -336  - $syem_n_cڋxt -( -CH376_CONTEXT - * -cڋxt -) - -338 if( -cڋxt --> -DOSBa - ! -NULL -) - -339 - `CloLibry -( -cڋxt --> -DOSBa -); - -340 - } -} - -342  -CH376_BOOL - - $syem_g_disk_fo -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -ro_lock -,  -DiskQuy - * -disk_fo -) - -344  -Libry - * -DOSBa - = -cڋxt -->DOSBase; - -345 -BOOL - -g_fo - = -CH376_FALSE -; - -347 if( -disk_fo -) - -349  -InfoDa - * -fo - = - `syem_loc_mem -((InfoData)); - -351 if( -fo -) - -353 if( - `Info -( -ro_lock -, -fo -= -DOSTRUE -) - -355 -QUAD - -tٮ_ - = ( -fo --> -id_NumBlocks - * info-> -id_BysPBlock -) / 512; - -356 -QUAD - -_ - = (( -fo --> -id_NumBlocks - - info-> -id_NumBlocksUd -* info-> -id_BysPBlock -) / 512; - -358 -disk_fo --> -DISK_TٮSe -[0] = ( -tٮ_ - & 0x000000ff) >> 0; - -359 -disk_fo --> -DISK_TٮSe -[1] = ( -tٮ_ - & 0x0000ff00) >> 8; - -360 -disk_fo --> -DISK_TٮSe -[2] = ( -tٮ_ - & 0x00ff0000) >> 16; - -361 -disk_fo --> -DISK_TٮSe -[3] = ( -tٮ_ - & 0xff000000) >> 24; - -363 -disk_fo --> -DISK_FeSe -[0] = ( -_ - & 0x000000ff) >> 0; - -364 -disk_fo --> -DISK_FeSe -[1] = ( -_ - & 0x0000ff00) >> 8; - -365 -disk_fo --> -DISK_FeSe -[2] = ( -_ - & 0x00ff0000) >> 16; - -366 -disk_fo --> -DISK_FeSe -[3] = ( -_ - & 0xff000000) >> 24; - -368 -disk_fo --> -DISK_DiskF - = 0x0c; - -370 -g_fo - = -TRUE -; - -372 - `syem__mem -( -fo -); - -376  -g_fo -; - -377 - } -} - -379  -CH376_LOCK - - $syem_ob_dey_lock -( -CH376_CONTEXT - * -cڋxt -, cڡ * -d_th -, -CH376_LOCK - -ro_lock -) - -381  -Libry - * -DOSBa - = -cڋxt -->DOSBase; - -382 -BPTR - -lock -; - -383 -BPTR - -d_lock - = (BPTR)0; - -385 - `dbg_tf -("syem_ob_dey_lock: %s\n", -d_th -); - -387 if( -ro_lock -) - -389 -d_lock - = - `CutD -( -ro_lock -); - -392 -lock - = - `Lock -( -d_th -, -SHARED_LOCK -); - -394 if( -lock - !( -BPTR -)0) - -396  -FeInfoBlock - * -fib - = - `AocDosObje -( -DOS_FIB -, -NULL -); - -398 if( -fib -) - -400 if( - `Exame -( -lock -, -fib -= -DOSFALSE - || fib-> -fib_DEryTy - < 0) - -402 - `UnLock -( -lock -); - -403 -lock - = ( -BPTR -)0; - -405 - `FeDosObje -( -DOS_FIB -, -fib -); - -409 if( -d_lock -) - -411 - `CutD -( -d_lock -); - -414  -lock -; - -415 - } -} - -417  - $syem_a_dey_lock -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -d_lock -) - -419  -Libry - * -DOSBa - = -cڋxt -->DOSBase; - -420 - `UnLock -( -d_lock -); - -421 - } -} - -423  -CH376_LOCK - - $syem_e_dey_lock -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -d_lock -) - -425  -Libry - * -DOSBa - = -cڋxt -->DOSBase; - -426  - `DupLock -( -d_lock -); - -427 - } -} - -429  -CH376_LOCK - - $syem__dey -( -CH376_CONTEXT - * -cڋxt -, cڡ * -d_th -, -CH376_LOCK - -ro_lock -) - -431  -Libry - * -DOSBa - = -cڋxt -->DOSBase; - -432 -BPTR - -lock -; - -433 -BPTR - -d_lock - = (BPTR)0; - -435 - `dbg_tf -("syem__dey: %s\n", -d_th -); - -437 if( -ro_lock -) - -439 -d_lock - = - `CutD -( -ro_lock -); - -442 -lock - = - `CeD -( -d_th -); - -444 if( -d_lock -) - -446 - `CutD -( -d_lock -); - -449  -lock -; - -450 - } -} - -452  -BPTR - - $fe_ݒ -( -CH376_CONTEXT - * -cڋxt -, -CONST_STRPTR - -fe_me -, -BPTR - -ro_lock -, -LONG - -mode -) - -454  -Libry - * -DOSBa - = -cڋxt -->DOSBase; - -455 -BPTR - -d_lock - = (BPTR)0; - -456 -BPTR - -fe -; - -458 if( -ro_lock -) - -460 -d_lock - = - `CutD -( -ro_lock -); - -463 -fe - = - `On -( -fe_me -, -mode -); - -465 if( -d_lock -) - -467 - `CutD -( -d_lock -); - -470  -fe -; - -471 - } -} - -473  -CH376_FILE - - $syem_fe_ݒ_exig -( -CH376_CONTEXT - * -cڋxt -, cڡ * -fe_me -, -CH376_LOCK - -ro_lock -) - -475  - `fe_ݒ -( -cڋxt -, -fe_me -, -ro_lock -, -MODE_OLDFILE -); - -476 - } -} - -478  -CH376_FILE - - $syem_fe_ݒ_w -( -CH376_CONTEXT - * -cڋxt -, cڡ * -fe_me -, -CH376_LOCK - -ro_lock -) - -480  - `fe_ݒ -( -cڋxt -, -fe_me -, -ro_lock -, -MODE_NEWFILE -); - -481 - } -} - -483  - $syem_fe_o -( -CH376_CONTEXT - * -cڋxt -, -CH376_FILE - -fe -) - -485  -Libry - * -DOSBa - = -cڋxt -->DOSBase; - -486 - `Clo -( -fe -); - -487 - } -} - -489  -CH376_S32 - - $syem_fe_ek -( -CH376_CONTEXT - * -cڋxt -, -CH376_FILE - -fe -,  -pos -) - -491  -Libry - * -DOSBa - = -cڋxt -->DOSBase; - -493 - `dbg_tf -("syem_fe_ekrygأekposi %d\n", -pos -); - -495 if( -fe -) - -496  - `Sk -( -fe -, -pos -, -OFFSET_BEGINNING -); - -499 - } -} - -501  -CH376_S32 - - $syem_fe_ad -( -CH376_CONTEXT - * -cڋxt -, -CH376_FILE - -fe -, * -bufr -, -CH376_S32 - -size -) - -503  -Libry - * -DOSBa - = -cڋxt -->DOSBase; - -505 - `dbg_tf -("syem_fe_adrygػad %d bys\n", -size -); - -507 if( -fe -) - -508  - `Rd -( -fe -, -bufr -, -size -); - -511 - } -} - -513  -CH376_S32 - - $syem_fe_wre -( -CH376_CONTEXT - * -cڋxt -, -CH376_FILE - -fe -, * -bufr -, -CH376_S32 - -size -) - -515  -Libry - * -DOSBa - = -cڋxt -->DOSBase; - -517 - `dbg_tf -("syem_fe_wrygwr%d bys\n", -size -); - -519 if( -fe -) - -520  - `Wre -( -fe -, -bufr -, -size -); - -523 - } -} - -525  -CH376_BOOL - - $syem_fe_de -( -CH376_CONTEXT - * -cڋxt -, cڡ * -fe_me -, -CH376_LOCK - -ro_lock -) - -527  -Libry - * -DOSBa - = -cڋxt -->DOSBase; - -528 -BPTR - -d_lock - = (BPTR)0; - -529 -LONG - -r -; - -531 if( -ro_lock -) - -533 -d_lock - = - `CutD -( -ro_lock -); - -536 -r - = - `DeFe -( -fe_me -); - -538 if( -d_lock -) - -540 - `CutD -( -d_lock -); - -543  ( -r - != 0); - -544 - } -} - -546  -CH376_BOOL - - $syem_dey_de -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -ro_lock -) - -549  -Libry - * -DOSBa - = -cڋxt -->DOSBase; - -551 - `dbg_tf -("syem_dey_de: %s\n", -ro_lock -); - -553 if( -ro_lock -) - -554  ( - `DeFe -( -ro_lock -) != 0); - -556  -CH376_FALSE -; - -557 - } -} - -559  -CH376_DIR - - $syem_t_exame_dey -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -d_lock -) - -561  -Libry - * -DOSBa - = -cڋxt -->DOSBase; - -562  -FeInfoBlock - * -fib - = - `AocDosObje -( -DOS_FIB -, -NULL -); - -564 if( -fib -) - -566 if( - `Exame -( -d_lock -, -fib -= -DOSFALSE -) - -568 - `FeDosObje -( -DOS_FIB -, -fib -); - -569 -fib - = -NULL -; - -573  -fib -; - -574 - } -} - -576  -CH376_BOOL - - $syem_go_exame_dey -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -d_lock -, -CH376_DIR - -fib -,  -FDInfo - * -d_fo -, * -n -) - -578  -Libry - * -DOSBa - = -cڋxt -->DOSBase; - -579 -BOOL - -is_de - = -FALSE -; - -581 if( -fib -! -is_de - && - `ExNext -( -d_lock -, fib= -DOSTRUE -) - -583 if( - `nmize_fe_me -( -fib --> -fib_FeName -, -d_fo --> -DIR_Name -&& - `n_mch -( -n -, dir_info->DIR_Name)) - -585 -d_fo --> -DIR_Ar - = 0; - -587 if( -fib --> -fib_DEryTy - > 0) - -588 -d_fo --> -DIR_Ar - | -DIR_ATTR_DIRECTORY -; - -589 if(( -fib --> -fib_Prei - & -FIBF_WRITE -) != 0) - -590 -d_fo --> -DIR_Ar - | -DIR_ATTR_READ_ONLY -; - -591 if(( -fib --> -fib_Prei - & -FIBF_ARCHIVE -) == 0) - -592 -d_fo --> -DIR_Ar - | -DIR_ATTR_ARCHIVE -; - -598 - `dbg_tf -("syem_go_exame_dey defed fibus: %d\n", -d_fo --> -DIR_Ar -); - -600 -d_fo --> -DIR_NTRes - = 0; - -601 -d_fo --> -DIR_CTimeTth - = 0; - -602 -d_fo --> -DIR_CTime -[0] = 0; - -603 -d_fo --> -DIR_CTime -[1] = 0; - -604 -d_fo --> -DIR_CDe -[0] = 0; - -605 -d_fo --> -DIR_CDe -[1] = 0; - -606 -d_fo --> -DIR_LAccDe -[0] = 0; - -607 -d_fo --> -DIR_LAccDe -[1] = 0; - -608 -d_fo --> -DIR_FClusHI -[0] = 0; - -609 -d_fo --> -DIR_FClusHI -[1] = 0; - -610 -d_fo --> -DIR_WTime -[0] = 0; - -611 -d_fo --> -DIR_WTime -[1] = 0; - -612 -d_fo --> -DIR_WDe -[0] = 0; - -613 -d_fo --> -DIR_WDe -[1] = 0; - -614 -d_fo --> -DIR_FClusLO -[0] = 0; - -615 -d_fo --> -DIR_FClusLO -[1] = 0; - -616 -d_fo --> -DIR_FeSize -[0] = ( -fib --> -fib_Size - & 0x000000ff) >> 0; - -617 -d_fo --> -DIR_FeSize -[1] = ( -fib --> -fib_Size - & 0x0000ff00) >> 8; - -618 -d_fo --> -DIR_FeSize -[2] = ( -fib --> -fib_Size - & 0x00ff0000) >> 16; - -619 -d_fo --> -DIR_FeSize -[3] = ( -fib --> -fib_Size - & 0xff000000) >> 24; - -621 -is_de - = -TRUE -; - -625  -is_de -; - -626 - } -} - -628  - $syem_fish_exame_dey -( -CH376_CONTEXT - * -cڋxt -, -CH376_DIR - -fib -) - -630  -Libry - * -DOSBa - = -cڋxt -->DOSBase; - -632 if( -fib -) - -634 - `FeDosObje -( -DOS_FIB -, -fib -); - -636 - } -} - -638  -CH376_S32 - - $syem_g_fe_size -( -CH376_CONTEXT - * -cڋxt -, -CH376_FILE - -fe -) - -640  -Libry - * -DOSBa - = -cڋxt -->DOSBase; - -641  -FeInfoBlock - * -fib - = - `AocDosObje -( -DOS_FIB -, -NULL -); - -642 -CH376_S32 - -fe_size - = 0xffffffff; - -644 i( -fib -) - -646 i( -fe -) - -648 i - `ExameFH -( -fe -, & -fib -) ) - -650 -fe_size - = -fib --> -fib_Size -; - -654 - `dbg_tf -("system_get_file_size:rror\n"); - -659 - `dbg_tf -("system_get_file_size:o file handle\n"); - -662 - `FeDosObje -( -DOS_FIB -, -fib -); - -665  -fe_size -; - -666 - } -} - -670 #i -defed -( -WIN32 -) - -674 #ifde -DEBUG_CH376 - - -675  - $dbg_tf -( -LPCTSTR - -r -, ...) - -677 -TCHAR - -bufr -[256]; - -679 -va_li - -gs -; - -680 - `va_t -( -gs -, -r -); - -681 - `_vtf_s -( -bufr -, (bufr- 1, (bufr- 1, -r -, -gs -); - -682 - `OuutDebugSg -( -bufr -); - -683 - `va_d -( -gs -); - -684 - } -} - -686  - #dbg_tf -(...) - - ) - -689 * - $syem_loc_mem -( -size -) - -691  - `GlobAoc -( -GMEM_FIXED -, -size -); - -692 - } -} - -694  - $syem__mem -(* -r -) - -696 - `GlobFe -( -r -); - -697 - } -} - -699  -CH376_BOOL - - $syem__cڋxt -( -CH376_CONTEXT - * -cڋxt -, -UNUSED - * -ur_da -) - -702  -CH376_TRUE -; - -703 - } -}; - -705  - $syem_n_cڋxt -( -CH376_CONTEXT - * -cڋxt -) - -708 - } -} - -710  -CH376_BOOL - - $syem_g_disk_fo -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -ro_lock -,  -DiskQuy - * -disk_fo -) - -712 -BOOL - -g_fo - = -FALSE -; - -713  -vume -[4]; - -714 -DWORD - -s_r_u -; - -715 -DWORD - -bys_r_ -; - -716 -DWORD - -numb_of__us -; - -717 -DWORD - -tٮ_numb_of_us -; - -720 -vume -[0] = ((*) -ro_lock --> -th -)[0] & 0xdf; - -721 -vume -[1] = ':'; - -722 -vume -[2] = '\\'; - -723 -vume -[3] = '\0'; - -725 if( - `GDiskFeS -( -vume -, & -s_r_u -, & -bys_r_ -, & -numb_of__us -, & -tٮ_numb_of_us -)) - -727 -INT64 - -tٮ_ - = ( -tٮ_numb_of_us - * -s_r_u - * -bys_r_ -) / 512; - -728 -INT64 - -_ - = ( -numb_of__us - * -s_r_u - * -bys_r_ -) / 512; - -730 -disk_fo --> -DISK_TٮSe -[0] = ( -INT8 -)(( -tٮ_ - & 0x000000ff) >> 0); - -731 -disk_fo --> -DISK_TٮSe -[1] = ( -INT8 -)(( -tٮ_ - & 0x0000ff00) >> 8); - -732 -disk_fo --> -DISK_TٮSe -[2] = ( -INT8 -)(( -tٮ_ - & 0x00ff0000) >> 16); - -733 -disk_fo --> -DISK_TٮSe -[3] = ( -INT8 -)(( -tٮ_ - & 0xff000000) >> 24); - -735 -disk_fo --> -DISK_FeSe -[0] = ( -INT8 -)(( -_ - & 0x000000ff) >> 0); - -736 -disk_fo --> -DISK_FeSe -[1] = ( -INT8 -)(( -_ - & 0x0000ff00) >> 8); - -737 -disk_fo --> -DISK_FeSe -[2] = ( -INT8 -)(( -_ - & 0x00ff0000) >> 16); - -738 -disk_fo --> -DISK_FeSe -[3] = ( -INT8 -)(( -_ - & 0xff000000) >> 24); - -740 -disk_fo --> -DISK_DiskF - = 0x0c; - -742 -g_fo - = -TRUE -; - -744  -g_fo -; - -745 - } -} - -747  -CH376_LOCK - - $syem_ob_dey_lock -( -CH376_CONTEXT - * -cڋxt -, cڡ * -d_th -, -CH376_LOCK - -ro_lock -) - -749 -CH376_LOCK - -lock - = -NULL -; - -750 -TCHAR - -d_d -[ -MAX_PATH -]; - -751  - - -s -; - -753 if( -ro_lock -) - -755 - `GCutDey -(( -d_d -), old_dir); - -756 - `SCutDey -( -ro_lock --> -th -); - -760 if( - ` -( -d_th -,& -s -=0 && s. -_mode - & -S_IFDIR -) - -762 -lock - = ( -CH376_LOCK -) - `syem_loc_mem -(( -_CH376_LOCK - )); - -763 - `GFuPhName -( -d_th -, -MAX_PATH -, -lock --> -th -, -NULL -); - -764 -lock --> -hd - = -INVALID_HANDLE_VALUE -; - -767 if( -ro_lock -) - -769 - `SCutDey -( -d_d -); - -772  -lock -; - -773 - } -} - -775  - $syem_a_dey_lock -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -d_lock -) - -777 if( -d_lock - !( -CH376_LOCK -)0) - -779 - `syem__mem -( -d_lock -); - -781 - } -} - -783  -CH376_LOCK - - $syem_e_dey_lock -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -d_lock -) - -785 -CH376_LOCK - -dup_lock - = (CH376_LOCK) - `syem_loc_mem -(( -_CH376_LOCK -)); - -787 - `CyMemy -( -dup_lock -, -d_lock -, ( -_CH376_LOCK -)); - -789  -dup_lock -; - -790 - } -} - -792  -HANDLE - - $fe_ݒ -( -CH376_CONTEXT - * -cڋxt -, cڡ * -fe_me -, -PCHAR - -ro_th -, -DWORD - -ti_diosi -) - -794 -TCHAR - -d_d -[ -MAX_PATH -]; - -795 -HANDLE - -fe -; - -797 if( -ro_th -) - -799 - `GCutDey -(( -d_d -), old_dir); - -800 - `SCutDey -( -ro_th -); - -803 -fe - = - `CeFe -( -fe_me -, -GENERIC_READ - | -GENERIC_WRITE -, 0, -NULL -, -ti_diosi -, -FILE_ATTRIBUTE_NORMAL -, NULL); - -805 if( -ro_th -) - -807 - `SCutDey -( -d_d -); - -810 if( -fe - ! -INVALID_HANDLE_VALUE -) - -811  -fe -; - -813  -NULL -; - -814 - } -} - -816  -CH376_BOOL - - $syem_fe_de -( -CH376_CONTEXT - * -cڋxt -, cڡ * -fe_me -, -CH376_LOCK - -ro_lock -) - -818 -LONG - -r -; - -819 -TCHAR - -d_d -[ -MAX_PATH -]; - -821 i( -ro_lock -) - -823 - `GCutDey -(( -d_d -), old_dir); - -824 - `SCutDey -( -ro_lock --> -th -); - -827 - `dbg_tf -("syem_fe_de: %s\n", -fe_me -); - -829 -r - = - `DeFe -( -fe_me -); - -831 i( -ro_lock -) - -833 - `SCutDey -( -d_d -); - -837  ( -r - != 0); - -838 - } -} - -840  -CH376_BOOL - - $syem_dey_de -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -ro_lock -) - -842 - `dbg_tf -("syem_dey_de: %s\n", -ro_lock -); - -844 i( -ro_lock -) - -845  ( - `RemoveDey -(( -LPCSTR -) -ro_lock -) != 0); - -847  -CH376_FALSE -; - -848 - } -} - -850  -CH376_LOCK - - $syem__dey -( -CH376_CONTEXT - * -cڋxt -, cڡ * -d_th -, -CH376_LOCK - -ro_lock -) - -852 -TCHAR - -d_d -[ -MAX_PATH -]; - -853 -CH376_LOCK - -lock - = -NULL -; - -855 i( -ro_lock -) - -857 - `GCutDey -(( -d_d -), old_dir); - -858 - `SCutDey -( -ro_lock --> -th -); - -861 - `dbg_tf -("syem__dey: %s\n", -d_th -); - -863 i( - `CeDey -( -d_th -, -NULL -)) - -865 -lock - = ( -CH376_LOCK -) - `syem_loc_mem -(( -_CH376_LOCK - )); - -866 - `SCutDey -( -d_th -); - -867 - `GCutDey -(( -lock --> -th -),ock->path); - -868 -lock --> -hd - = -INVALID_HANDLE_VALUE -; - -871 i( -ro_lock -) - -873 - `SCutDey -( -d_d -); - -876  -lock -; - -878 - } -} - -882  -CH376_FILE - - $syem_fe_ݒ_exig -( -CH376_CONTEXT - * -cڋxt -, cڡ * -fe_me -, -CH376_LOCK - -ro_lock -) - -884  - `fe_ݒ -( -cڋxt -, -fe_me -, -ro_lock --> -th -, -OPEN_EXISTING -); - -885 - } -} - -887  -CH376_FILE - - $syem_fe_ݒ_w -( -CH376_CONTEXT - * -cڋxt -, cڡ * -fe_me -, -CH376_LOCK - -ro_lock -) - -889  - `fe_ݒ -( -cڋxt -, -fe_me -, -ro_lock --> -th -, -CREATE_ALWAYS -); - -890 - } -} - -892  - $syem_fe_o -( -CH376_CONTEXT - * -cڋxt -, -CH376_FILE - -fe -) - -894 if( -fe - - `CloHd -(file); - -895 - } -} - -897  -CH376_S32 - - $syem_fe_ek -( -CH376_CONTEXT - * -cڋxt -, -CH376_FILE - -fe -,  -pos -) - -899 if( -fe - ! -NULL -) - -900  - `SFePor -( -fe -, -pos -, -NULL -, -FILE_BEGIN -); - -903 - } -} - -905  -CH376_S32 - - $syem_fe_ad -( -CH376_CONTEXT - * -cڋxt -, -CH376_FILE - -fe -, * -bufr -, -CH376_S32 - -size -) - -907 -DWORD - -ad_bys -; - -909 if( - `RdFe -( -fe -, -bufr -, -size -, & -ad_bys -, -NULL -)) - -910  -ad_bys -; - -913 - } -} - -915  -CH376_S32 - - $syem_fe_wre -( -CH376_CONTEXT - * -cڋxt -, -CH376_FILE - -fe -, * -bufr -, -CH376_S32 - -size -) - -917 -DWORD - -wrn_bys -; - -919 if( - `WreFe -( -fe -, -bufr -, -size -, & -wrn_bys -, -NULL -)) - -920  -wrn_bys -; - -923 - } -} - -925  -CH376_DIR - - $syem_t_exame_dey -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -d_lock -) - -927 -LPWIN32_FIND_DATA - -fd_fe_da - = (LPWIN32_FIND_DATA) - `syem_loc_mem -(( -WIN32_FIND_DATA -)); - -928 -TCHAR - -szD -[ -MAX_PATH -]; - -929 - `SgCchCy -( -szD -, -MAX_PATH -, -d_lock --> -th -); - -930 - `SgCchC -( -szD -, -MAX_PATH -, - `TEXT -("\\*")); - -932 -d_lock --> -hd - = - `FdFFe -( -szD -, -fd_fe_da -); - -934 if( -d_lock --> -hd - = -INVALID_HANDLE_VALUE -) - -936 - `syem__mem -( -fd_fe_da -); - -937 -fd_fe_da - = -NULL -; - -940  -fd_fe_da -; - -941 - } -} - -943  -CH376_BOOL - - $syem_go_exame_dey -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -d_lock -, -CH376_DIR - -fib -,  -FDInfo - * -d_fo -, * -n -) - -945 -BOOL - -is_de - = -FALSE -; - -947 if( -d_lock --> -hd - ! -INVALID_HANDLE_VALUE -) - -949 ! -is_de - && - `FdNextFe -( -d_lock --> -hd -, -fib -)) - -951 if( - `nmize_fe_me -( -fib --> -cFeName -, -d_fo --> -DIR_Name -&& - `n_mch -( -n -, dir_info->DIR_Name)) - -954 -d_fo --> -DIR_Ar - = ( -UINT8 -) -fib --> -dwFeAribus -; - -956 - `dbg_tf -("syem_go_exame_dey defed fibus: %d\n", -d_fo --> -DIR_Ar -); - -958 -d_fo --> -DIR_NTRes - = 0; - -959 -d_fo --> -DIR_CTimeTth - = 0; - -960 -d_fo --> -DIR_CTime -[0] = 0; - -961 -d_fo --> -DIR_CTime -[1] = 0; - -962 -d_fo --> -DIR_CDe -[0] = 0; - -963 -d_fo --> -DIR_CDe -[1] = 0; - -964 -d_fo --> -DIR_LAccDe -[0] = 0; - -965 -d_fo --> -DIR_LAccDe -[1] = 0; - -966 -d_fo --> -DIR_FClusHI -[0] = 0; - -967 -d_fo --> -DIR_FClusHI -[1] = 0; - -968 -d_fo --> -DIR_WTime -[0] = 0; - -969 -d_fo --> -DIR_WTime -[1] = 0; - -970 -d_fo --> -DIR_WDe -[0] = 0; - -971 -d_fo --> -DIR_WDe -[1] = 0; - -972 -d_fo --> -DIR_FClusLO -[0] = 0; - -973 -d_fo --> -DIR_FClusLO -[1] = 0; - -974 -d_fo --> -DIR_FeSize -[0] = ( -UINT8 -)(( -fib --> -nFeSizeLow - & 0x000000ff) >> 0); - -975 -d_fo --> -DIR_FeSize -[1] = ( -UINT8 -)(( -fib --> -nFeSizeLow - & 0x0000ff00) >> 8); - -976 -d_fo --> -DIR_FeSize -[2] = ( -UINT8 -)(( -fib --> -nFeSizeLow - & 0x00ff0000) >> 16); - -977 -d_fo --> -DIR_FeSize -[3] = ( -UINT8 -)(( -fib --> -nFeSizeLow - & 0xff000000) >> 24); - -979 -is_de - = -TRUE -; - -984  -is_de -; - -985 - } -} - -987  - $syem_fish_exame_dey -( -CH376_CONTEXT - * -cڋxt -, -CH376_DIR - -fib -) - -989 if( -fib -) - -991 - `FdClo -( -fib -); - -992 - `syem__mem -( -fib -); - -994 - } -} - -996  -CH376_S32 - - $syem_g_fe_size -( -CH376_CONTEXT - * -cڋxt -, -CH376_FILE - -fe -) - -998 -CH376_S32 - -fe_size - = 0xffffffff; - -999 -BY_HANDLE_FILE_INFORMATION - -fe_ -; - -1001 i( -fe -) - -1003 i - `GFeInfmiByHd -( -fe -, & -fe_ -) ) - -1006 -fe_size - = -fe_ -. -nFeSizeLow -; - -1010 - `dbg_tf -("system_get_file_size:rror\n"); - -1014 - `dbg_tf -("system_get_file_size:o file handle\n"); - -1016  -fe_size -; - -1017 - } -} - -1021 #i -defed -( -__unix__ -|| defed( -__APPLE__ -|| defed( -__HAIKU__ -) - -1025 #ifde -DEBUG_CH376 - - -1026  - #dbg_tf -(... - `rtf -( -dr -, -__VA_ARGS__ -) - - ) - -1028  - #dbg_tf -(...) - - ) - -1031 * - $syem_loc_mem -( -size -) - -1033  - `mloc -( -size -); - -1034 - } -} - -1036  - $syem__mem -(* -r -) - -1038 i( -r -) - -1039 - ` -( -r -); - -1040 - } -} - -1042  -CH376_BOOL - - $syem__cڋxt -( -CH376_CONTEXT - * -cڋxt -, -UNUSED - * -ur_da -) - -1045  -CH376_TRUE -; - -1046 - } -} - -1048  - $syem_n_cڋxt -( -CH376_CONTEXT - * -cڋxt -) - -1051 - } -} - -1053  -CH376_BOOL - - $syem_g_disk_fo -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -ro_lock -,  -DiskQuy - * -disk_fo -) - -1055 -CH376_BOOL - -g_fo - = -CH376_FALSE -; - -1057 if( -disk_fo -) - -1059  -vfs - -s -; - -1061 if( - `vfs -( -ro_lock -, & -s -) == 0) - -1063 -t64_t - -tٮ_ - = ( -s -. -f_blocks - * sts. -f_bsize -) / 512; - -1064 -t64_t - -_ - = ( -s -. -f_b - * sts. -f_bsize -) / 512; - -1066 -disk_fo --> -DISK_TٮSe -[0] = ( -tٮ_ - & 0x000000ff) >> 0; - -1067 -disk_fo --> -DISK_TٮSe -[1] = ( -tٮ_ - & 0x0000ff00) >> 8; - -1068 -disk_fo --> -DISK_TٮSe -[2] = ( -tٮ_ - & 0x00ff0000) >> 16; - -1069 -disk_fo --> -DISK_TٮSe -[3] = ( -tٮ_ - & 0xff000000) >> 24; - -1071 -disk_fo --> -DISK_FeSe -[0] = ( -_ - & 0x000000ff) >> 0; - -1072 -disk_fo --> -DISK_FeSe -[1] = ( -_ - & 0x0000ff00) >> 8; - -1073 -disk_fo --> -DISK_FeSe -[2] = ( -_ - & 0x00ff0000) >> 16; - -1074 -disk_fo --> -DISK_FeSe -[3] = ( -_ - & 0xff000000) >> 24; - -1076 -disk_fo --> -DISK_DiskF - = 0x0c; - -1078 -g_fo - = -CH376_TRUE -; - -1082  -g_fo -; - -1083 - } -} - -1085  -CH376_LOCK - - $syem_ob_dey_lock -( -CH376_CONTEXT - * -cڋxt -, cڡ * -d_th -, -CH376_LOCK - -ro_lock -) - -1087 -CH376_LOCK - -lock - = -NULL -; - -1088 * -d_d - = -NULL -; - -1089  - - -th_ -; - -1091 - `dbg_tf -("syem_ob_dey_lock: %s\n", -d_th -); - -1093 if( -ro_lock -) - -1095 if(( -d_d - = - `gcwd -( -NULL -, 0)) != NULL) - -1096 - `chd -( -ro_lock -); - -1099 - ` -( -d_th -, & -th_ -); - -1100 if( - `S_ISDIR -( -th_ -. -_mode -)) - -1102 -lock - = - `th -( -d_th -, -NULL -); - -1105 if( -d_d -) - -1107 if( -d_d - ! -NULL -) - -1109 - `chd -( -d_d -); - -1110 - `syem__mem -( -d_d -); - -1114  -lock -; - -1115 - } -} - -1117  - $syem_a_dey_lock -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -d_lock -) - -1119 if( -d_lock - !( -CH376_LOCK -)0) - -1121 - `syem__mem -( -d_lock -); - -1123 - } -} - -1125  -CH376_LOCK - - $syem_e_dey_lock -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -d_lock -) - -1127  - `rdup -( -d_lock -); - -1128 - } -} - -1130  -FILE - * - $fe_ݒ -(cڡ * -fe_me -, -CH376_LOCK - -ro_lock -, cڡ * -mode -) - -1132 -FILE - * -fe -; - -1133 * -d_d - = -NULL -; - -1137 if( -ro_lock -) - -1139 if(( -d_d - = - `gcwd -( -NULL -, 0)) != NULL) - -1140 - `chd -( -ro_lock -); - -1143 -fe - = - `fݒ -( -fe_me -, -mode -); - -1145 if( -d_d -) - -1147 - `chd -( -d_d -); - -1148 - `syem__mem -( -d_d -); - -1151  -fe -; - -1152 - } -} - -1154  -CH376_BOOL - - $syem_fe_de -( -CH376_CONTEXT - * -cڋxt -, cڡ * -fe_me -, -CH376_LOCK - -ro_lock -) - -1156  -r -; - -1157 * -d_d - = -NULL -; - -1159 if( -ro_lock -) - -1161 if(( -d_d - = - `gcwd -( -NULL -, 0)) != NULL) - -1162 - `chd -( -ro_lock -); - -1165 -r - = - `move -( -fe_me -); - -1167 - `dbg_tf -("syem_fe_de: %s\n", -fe_me -); - -1169 if( -d_d -) - -1171 if( -d_d - ! -NULL -) - -1173 - `chd -( -d_d -); - -1174 - `syem__mem -( -d_d -); - -1178  ( -r - == 0); - -1179 - } -} - -1181  -CH376_BOOL - - $syem_dey_de -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -ro_lock -) - -1183 - `dbg_tf -("syem_dey_de: %s\n", -ro_lock -); - -1185 i( -ro_lock -) - -1186  ( - `rmd -( -ro_lock -) == 0); - -1188  -CH376_FALSE -; - -1189 - } -} - -1191  -CH376_LOCK - - $syem__dey -( -CH376_CONTEXT - * -cڋxt -, cڡ * -d_th -, -CH376_LOCK - -ro_lock -) - -1193 -CH376_LOCK - -lock - = -NULL -; - -1194 * -d_d - = -NULL -; - -1196 if( -ro_lock -) - -1198 if(( -d_d - = - `gcwd -( -NULL -, 0)) != NULL) - -1199 - `chd -( -ro_lock -); - -1202 - `dbg_tf -("syem__dey: %s\n", -d_th -); - -1204 i(! - `mkd -( -d_th -, -S_IRWXU - | -S_IRWXG - | -S_IROTH - | -S_IXOTH -)) - -1205 -lock - = - `th -( -d_th -, -NULL -); - -1207 if( -d_d -) - -1209 - `chd -( -d_d -); - -1210 - `syem__mem -( -d_d -); - -1213  -lock -; - -1214 - } -} - -1216  -CH376_FILE - - $syem_fe_ݒ_exig -( -CH376_CONTEXT - * -cڋxt -, cڡ * -fe_me -, -CH376_LOCK - -ro_lock -) - -1218 -FILE - * - -; - -1220 - - = - `fe_ݒ -( -fe_me -, -ro_lock -, "rb+"); - -1222  - -; - -1223 - } -} - -1225  -CH376_FILE - - $syem_fe_ݒ_w -( -CH376_CONTEXT - * -cڋxt -, cڡ * -fe_me -, -CH376_LOCK - -ro_lock -) - -1227  - `fe_ݒ -( -fe_me -, -ro_lock -, "wb+"); - -1228 - } -} - -1230  - $syem_fe_o -( -CH376_CONTEXT - * -cڋxt -, -CH376_FILE - -fe -) - -1232 i( -fe - - `fo -(file); - -1233 - } -} - -1235  -CH376_S32 - - $syem_fe_ek -( -CH376_CONTEXT - * -cڋxt -, -CH376_FILE - -fe -,  -pos -) - -1237 - `dbg_tf -("syem_fe_ekrygأekposi %d\n", -pos -); - -1239 if( -fe -) - -1240 i(! - `fek -( -fe -, -pos -, -SEEK_SET -)) - -1241  - `l -( -fe -); - -1244 - } -} - -1246  -CH376_S32 - - $syem_fe_ad -( -CH376_CONTEXT - * -cڋxt -, -CH376_FILE - -fe -, * -bufr -, -CH376_S32 - -size -) - -1248 - `dbg_tf -("syem_fe_adrygػad %d bys\n", -size -); - -1250 if( -fe -) - -1251  - `d -( -bufr -, 1, -size -, -fe -); - -1254 - } -} - -1256  -CH376_S32 - - $syem_fe_wre -( -CH376_CONTEXT - * -cڋxt -, -CH376_FILE - -fe -, * -bufr -, -CH376_S32 - -size -) - -1258 - `dbg_tf -("syem_fe_wrygwr%d bys\n", -size -); - -1260 if( -fe -) - -1261  - `fwre -( -bufr -, 1, -size -, -fe -); - -1264 - } -} - -1266  -CH376_DIR - - $syem_t_exame_dey -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -d_lock -) - -1268 -CH376_DIR - -fib - = - `syem_loc_mem -(( -_CH376_DIR -)); - -1270 if( -fib -) - -1272 -fib --> -hd - = - `ݒd -( -d_lock -); - -1273 -fib --> -y - = -NULL -; - -1276  -fib -; - -1277 - } -} - -1279  -CH376_BOOL - - $syem_go_exame_dey -( -CH376_CONTEXT - * -cڋxt -, -CH376_LOCK - -d_lock -, -CH376_DIR - -fib -,  -FDInfo - * -d_fo -, * -n -) - -1281 -CH376_BOOL - -is_de - = -CH376_FALSE -; - -1282  - - -fe_ -; - -1283 * -d_d - = -NULL -; - -1285 if( -d_lock -) - -1287 if(( -d_d - = - `gcwd -( -NULL -, 0)) != NULL) - -1288 - `chd -( -d_lock -); - -1291 if( -fib -! -is_de - && (fib-> -y - = - `add -(fib-> -hd -))) - -1293 if( - `nmize_fe_me -( -fib --> -y --> -d_me -, -d_fo --> -DIR_Name -&& - `n_mch -( -n -, dir_info->DIR_Name)) - -1295 - ` -( -fib --> -y --> -d_me -, & -fe_ -); - -1297 -d_fo --> -DIR_Ar - = 0; - -1299 if( - `S_ISDIR -( -fe_ -. -_mode -)) - -1300 -d_fo --> -DIR_Ar - | -DIR_ATTR_DIRECTORY -; - -1301 if(( -fe_ -. -_mode - & -S_IRUSR -) == 0) - -1302 -d_fo --> -DIR_Ar - | -DIR_ATTR_READ_ONLY -; - -1304 - `dbg_tf -("syem_go_exame_dey defed fibus: %d\n", -d_fo --> -DIR_Ar -); - -1306 -d_fo --> -DIR_NTRes - = 0; - -1307 -d_fo --> -DIR_CTimeTth - = 0; - -1308 -d_fo --> -DIR_CTime -[0] = 0; - -1309 -d_fo --> -DIR_CTime -[1] = 0; - -1310 -d_fo --> -DIR_CDe -[0] = 0; - -1311 -d_fo --> -DIR_CDe -[1] = 0; - -1312 -d_fo --> -DIR_LAccDe -[0] = 0; - -1313 -d_fo --> -DIR_LAccDe -[1] = 0; - -1314 -d_fo --> -DIR_FClusHI -[0] = 0; - -1315 -d_fo --> -DIR_FClusHI -[1] = 0; - -1316 -d_fo --> -DIR_WTime -[0] = 0; - -1317 -d_fo --> -DIR_WTime -[1] = 0; - -1318 -d_fo --> -DIR_WDe -[0] = 0; - -1319 -d_fo --> -DIR_WDe -[1] = 0; - -1320 -d_fo --> -DIR_FClusLO -[0] = 0; - -1321 -d_fo --> -DIR_FClusLO -[1] = 0; - -1322 -d_fo --> -DIR_FeSize -[0] = ( -fe_ -. -_size - & 0x000000ff) >> 0; - -1323 -d_fo --> -DIR_FeSize -[1] = ( -fe_ -. -_size - & 0x0000ff00) >> 8; - -1324 -d_fo --> -DIR_FeSize -[2] = ( -fe_ -. -_size - & 0x00ff0000) >> 16; - -1325 -d_fo --> -DIR_FeSize -[3] = ( -fe_ -. -_size - & 0xff000000) >> 24; - -1327 -is_de - = -CH376_TRUE -; - -1331 if( -d_d -) - -1333 - `chd -( -d_d -); - -1334 - `syem__mem -( -d_d -); - -1337  -is_de -; - -1338 - } -} - -1340  - $syem_fish_exame_dey -( -CH376_CONTEXT - * -cڋxt -, -CH376_DIR - -fib -) - -1342 i( -fib -) - -1344 - `od -( -fib --> -hd -); - -1345 - `syem__mem -( -fib -); - -1347 - } -} - -1349  -CH376_S32 - - $syem_g_fe_size -( -CH376_CONTEXT - * -cڋxt -, -CH376_FILE - -fe -) - -1351 -CH376_S32 - -fe_size - = 0xffffffff; - -1352  - - -fe_ -; - -1354 i( -fe -) - -1356 i! - `f -( - `fo -( -fe -), & -fe_ -) ) - -1358 -fe_size - = -fe_ -. -_size -; - -1362 - `dbg_tf -("system_get_file_size:rror\n"); - -1366 - `dbg_tf -("system_get_file_size:o file handle\n"); - -1368  -fe_size -; - -1369 - } -} - -1379 * - $e_rg -(cڡ * -rg -) - -1381  -l -; - -1382 * -s -; - -1384  -l -=0; -rg -[l]!='\0';++); - -1386 -s - = - `syem_loc_mem -( -l -); - -1388  -l -=0; -rg -[l]!='\0';++) - -1389 -s -[ -l -] = -rg -[l]; - -1391 -s -[ -l -] = '\0'; - -1393  -s -; - -1394 - } -} - -1396  - $r_ruu -( -ch376 - *ch376) - -1398 -ch376 --> -commd - = -CH376_CMD_NONE -; - -1399 -ch376 --> -commd_us - = 0; - -1400 -ch376 --> -r_us - = 0; - -1401 -ch376 --> -nb_bys__cmd_da - = 0; - -1402 -ch376 --> -pos_rw__cmd_da - = 0; - -1403 -ch376 --> -usb_mode - = -CH376_ARG_SET_USB_MODE_INVALID -; - -1404 -ch376 --> -bys_to_ad_wre - = 0; - -1405 -ch376 --> -ro_d_lock - = ( -CH376_LOCK -)0; - -1406 -ch376 --> -cut_d_lock - = ( -CH376_LOCK -)0; - -1407 -ch376 --> -cut_fe - = ( -CH376_FILE -)0; - -1408 -ch376 --> -cut_dey_browsg - = ( -CH376_DIR -)0; - -1409 - } -} - -1411  - $nl_l_io -( -ch376 - *ch376) - -1414 -ch376 --> -bys_to_ad_wre - = 0; - -1417 - `syem_fish_exame_dey -(& -ch376 --> -cڋxt -, ch376-> -cut_dey_browsg -); - -1418 -ch376 --> -cut_dey_browsg - = ( -CH376_DIR -)0; - -1419 - `syem_fe_o -(& -ch376 --> -cڋxt -, ch376-> -cut_fe -); - -1420 -ch376 --> -cut_fe - = ( -CH376_FILE -)0; - -1423 - `syem_a_dey_lock -(& -ch376 --> -cڋxt -, ch376-> -ro_d_lock -); - -1424 -ch376 --> -ro_d_lock - = ( -CH376_LOCK -)0; - -1425 - `syem_a_dey_lock -(& -ch376 --> -cڋxt -, ch376-> -cut_d_lock -); - -1426 -ch376 --> -cut_d_lock - = ( -CH376_LOCK -)0; - -1427 - } -} - -1431  - $nmize_ch -( -c -) - -1433 if( -c - > 127) - -1436 if( -c - >='a' && c <='z') - -1437  -c - - ('a' - 'A'); - -1439  -c -; - -1440 - } -} - -1444 cڡ * - $nmize_fe_me -(cڡ * -fe_me -, * -nmized_fe_me -) - -1446  -i - = 0; - -1447  -j - = 0; - -1448  -c -; - -1450 - `dbg_tf -("nmize_fe_me: %s\n", -fe_me -); - -1452  -fe_me -[ -i -] !'\0' && fe_me[i] !'.' && -j - < 8) - -1454 -c - = - `nmize_ch -( -fe_me -[ -i -++]); - -1456 if( -c - == -1) - -1457  -NULL -; - -1459 -nmized_fe_me -[ -j -++] = () -c -; - -1462 if( -fe_me -[ -i -] == '\0') - -1464 ; -j -<8; j++) - -1466 -nmized_fe_me -[ -j -] = ' '; - -1469 if( -fe_me -[ -i -] == '.') - -1471 -i -++; - -1472 ; -j -<8; j++) - -1474 -nmized_fe_me -[ -j -] = ' '; - -1479 - `dbg_tf -("nmize_fe_mimpossib: %(%d=%c,%d=%c)\n", -fe_me -, -i -, fe_me[i], -j -, -nmized_fe_me -[j]); - -1480  -NULL -; - -1483  -fe_me -[ -i -] !'\0' && fe_me[i] !'.' && -j - < 11) - -1485 -c - = - `nmize_ch -( -fe_me -[ -i -++]); - -1487 if( -c - == -1) - -1488  -NULL -; - -1490 -nmized_fe_me -[ -j -++] = () -c -; - -1493 if( -fe_me -[ -i -] != '\0') - -1495 - `dbg_tf -("nmize_fe_mimpossib: %(%d=%c,%d=%c)\n", -fe_me -, -i -, fe_me[i], -j -, -nmized_fe_me -[j]); - -1496  -NULL -; - -1499 - `dbg_tf -("nmize_fe_mde: %(%d=&%02x,%d=&%02x)\n", -fe_me -, -i -, fe_me[i], -j -, -nmized_fe_me -[j]); - -1501 ; -j -<11; j++) - -1503 -nmized_fe_me -[ -j -] = ' '; - -1506 -nmized_fe_me -[ -j -] = '\0'; - -1508  -nmized_fe_me -; - -1509 - } -} - -1513 cڡ * - $im_fe_me -(cڡ * -fe_me -, * -immed_fe_me -) - -1515  -i - = 0; - -1516  -j - = 0; - -1518  -fe_me -[ -i -] != ' ' && file_name[i] != '\0') - -1519 -immed_fe_me -[ -j -++] = -fe_me -[ -i -++]; - -1521  -fe_me -[ -i -] == ' ') - -1522 -i -++; - -1524  -fe_me -[ -i -] != ' ' && file_name[i] != '\0') - -1525 -immed_fe_me -[ -j -++] = -fe_me -[ -i -++]; - -1527 if( -j - > 0 && -immed_fe_me -[j-1] == '.') - -1528 -j ---; - -1530 -immed_fe_me -[ -j -] = '\0'; - -1532 - `dbg_tf -("im_fe_mom \"%s\"\"%s\"\n", -fe_me -, -immed_fe_me -); - -1534  -immed_fe_me -; - -1535 - } -} - -1537  - $fe_ad_chunk -( -ch376 - *ch376) - -1539 -CH376_S32 - -bys_to_ad_now -; - -1540 -CH376_S32 - -bys_auly_ad -; - -1542 if( -ch376 --> -bys_to_ad_wre - > (ch376-> -cmd_da -. -CMD_IOBufr -)) - -1543 -bys_to_ad_now - = ( -ch376 --> -cmd_da -. -CMD_IOBufr -); - -1545 -bys_to_ad_now - = -ch376 --> -bys_to_ad_wre -; - -1547 -bys_auly_ad - = - `syem_fe_ad -(& -ch376 --> -cڋxt -, ch376-> -cut_fe -, &ch376-> -cmd_da -. -CMD_IOBufr -, -bys_to_ad_now -); - -1549 if( -bys_auly_ad - >= 0) - -1551 -ch376 --> -bys_to_ad_wre - -( -CH376_U16 -) -bys_auly_ad -; - -1553 -ch376 --> -nb_bys__cmd_da - = ( -CH376_U8 -) -bys_auly_ad -; - -1554 -ch376 --> -r_us - = 127; - -1562 if( -bys_to_ad_now - =0 || -bys_auly_ad - == 0) - -1564 - `dbg_tf -("[WRITE][DATA][CH376_CMD_BYTE_READ]ll done:ead operated with success (no more data)\n"); - -1565 -ch376 --> -commd_us - = -CH376_INT_SUCCESS -; - -1569 - `dbg_tf -("[WRITE][DATA][CH376_CMD_BYTE_READ] de:d od wh sucs(wag dad f %d byouo%d)\n", -ch376 --> -nb_bys__cmd_da -, ch376-> -bys_to_ad_wre -); - -1570 -ch376 --> -commd_us - = -CH376_INT_DISK_READ -; - -1575 - `dbg_tf -("[WRITE][DATA][CH376_CMD_BYTE_READ]borted:ead failure\n"); - -1577 -ch376 --> -nb_bys__cmd_da - = 0; - -1578 -ch376 --> -r_us - = 0; - -1579 -ch376 --> -commd_us - = -CH376_RET_ABORT -; - -1581 - } -} - -1583  - $fe_wre_chunk -( -ch376 - *ch376) - -1585 -CH376_S32 - -bys_to_wre_now -; - -1586 -CH376_S32 - -bys_auly_wrn -; - -1588 -bys_to_wre_now - = -ch376 --> -nb_bys__cmd_da -; - -1590 -bys_auly_wrn - = - `syem_fe_wre -(& -ch376 --> -cڋxt -, ch376-> -cut_fe -, &ch376-> -cmd_da -. -CMD_IOBufr -, -bys_to_wre_now -); - -1592 if( -bys_auly_wrn - = -bys_to_wre_now -) - -1594 -ch376 --> -bys_to_ad_wre - -( -CH376_U16 -) -bys_auly_wrn -; - -1596 -ch376 --> -nb_bys__cmd_da - = 0; - -1597 -ch376 --> -r_us - = 127; - -1598 if( -ch376 --> -bys_to_ad_wre - == 0) - -1600 - `dbg_tf -("[WRITE][DATA][CH376_CMD_BYTE_WRITE]ll done: write operated with success (no more data)\n"); - -1601 -ch376 --> -commd_us - = -CH376_INT_SUCCESS -; - -1605 if( -ch376 --> -bys_to_ad_wre - > (ch376-> -cmd_da -. -CMD_IOBufr -)) - -1606 -ch376 --> -nb_bys__cmd_da - = (ch376-> -cmd_da -. -CMD_IOBufr -); - -1608 -ch376 --> -nb_bys__cmd_da - = ( -CH376_U8 -)ch376-> -bys_to_ad_wre -; - -1610 - `dbg_tf -("[WRITE][DATA][CH376_CMD_BYTE_WRITE] de: wrݔed wh sucs(wag dwrf %d byouo%d)\n", -ch376 --> -nb_bys__cmd_da -, ch376-> -bys_to_ad_wre -); - -1611 -ch376 --> -commd_us - = -CH376_INT_DISK_WRITE -; - -1616 - `dbg_tf -("[WRITE][DATA][CH376_CMD_BYTE_WRITE]borted: write failure\n"); - -1618 -ch376 --> -nb_bys__cmd_da - = 0; - -1619 -ch376 --> -r_us - = 0; - -1620 -ch376 --> -commd_us - = -CH376_RET_ABORT -; - -1622 - } -} - -1625 cڡ * - $nmize_n -(cڡ * -n -, * -nmized_n -) - -1627  -i - = -1; - -1629 - `dbg_tf -("nmize_n: '%s'\n", -nmized_n -); - -1631 i(! - `rcmp -( -n -, "*")) - -1633 - `dbg_tf -("normalize_pattern: * -> *.*\n"); - -1634 - `nmize_fe_me -("*.*", -nmized_n -); - -1636 i(! - `nmize_fe_me -( -n -, -nmized_n -)) - -1638 - `dbg_tf -("normalize_pattern:rror\n"); - -1639 -nmized_n -[0] = '\0'; - -1640  -NULL -; - -1643  -i -<11) - -1645 -i -++; - -1646 i( -nmized_n -[ -i -] == '*') - -1650  -i - < 11) - -1651 -nmized_n -[ -i -++]='*'; - -1655 - `dbg_tf -("nmize_n: '%s' (i=%d)\n", -nmized_n -, -i -); - -1657  -nmized_n -; - -1658 - } -} - -1662  -CH376_BOOL - - $n_mch -(cڡ * -n -, cڡ * -fe_me -) - -1664 -CH376_BOOL - -found - = -CH376_FALSE -; - -1665  -i -=0; - -1667 - `dbg_tf -("n_mch('%s', '%s'=> ", -n -, -fe_me -); - -1671 i( -n -[ -i -] != '*') - -1673 i( -n -[ -i -] ! -fe_me -[i]) - -1675 -found - = -CH376_FALSE -; - -1678 i( -n -[ -i -] == '\0') - -1680 -found - = -CH376_TRUE -; - -1686 i( -fe_me -[ -i -] == '\0') - -1688 -found - = -CH376_TRUE -; - -1692 -i -++; - -1695 - `dbg_tf -("i=%d, found=%d\n", -i -, -found -); - -1696  -found -; - -1697 - } -} - -1703 -CH376_U8 - - $ch376_ad_commd_pt -( -ch376 - *ch376) - -1705 - `dbg_tf -("[READ][COMMAND] durg commd &%02x stu&%02x\n", -ch376 --> -commd -, ch376-> -commd_us -); - -1706  -ch376 --> -r_us -; - -1707 - } -} - -1713 -CH376_U8 - - $ch376_ad_da_pt -( -ch376 - *ch376) - -1715 -CH376_U8 - -da_out - = 0xff; - -1717 - `dbg_tf -(">> [READ][DATA] f durg commd &%02x stu&%02x\n", -ch376 --> -commd -, ch376-> -commd_us -); - -1719  -ch376 --> -commd -) - -1721  -CH376_CMD_CHECK_EXIST -: - -1722 -da_out - = -ch376 --> -cmd_da -. -CMD_CheckBy -; - -1723 - `dbg_tf -("[READ][DATA][CH376_CMD_CHECK_EXIST] stg dp܈t&%02x\n", -da_out -); - -1726  -CH376_CMD_GET_FILE_SIZE -: - -1727 if( -ch376 --> -nb_bys__cmd_da -) - -1729 if( -ch376 --> -nb_bys__cmd_da - !ch376-> -pos_rw__cmd_da -) - -1731 -da_out - = -ch376 --> -cmd_da -. -CMD_FeSize -[ch376-> -pos_rw__cmd_da -]; - -1733 - `dbg_tf -("[READ][DATA][CH376_CMD_GET_FILE_SIZE]d &%02x from i/buf㸩osi &%02x\n", -da_out -, -ch376 --> -pos_rw__cmd_da -); - -1735 if(++ -ch376 --> -pos_rw__cmd_da - =ch376-> -nb_bys__cmd_da -) - -1736 -ch376 --> -nb_bys__cmd_da - = 0; - -1741 -da_out - = 0; - -1742 - `dbg_tf -("[READ][DATA][CH376_CMD_GET_FILE_SIZE]othingoead from i/o buffer\n"); - -1747  -CH376_CMD_GET_IC_VER -: - -1748 -da_out - = (0x40 | -CH376_DATA_IC_VER -) & 0x7f; - -1749 - `dbg_tf -("[READ][DATA][CH376_CMD_GET_IC_VER] stg dp܈t&%02x\n", -da_out -); - -1752  -CH376_CMD_SET_USB_MODE -: - -1753 if( -ch376 --> -usb_mode - = -CH376_ARG_SET_USB_MODE_INVALID -) - -1755 -da_out - = -CH376_RET_ABORT -; - -1756 - `dbg_tf -("[READ][DATA][CH376_SET_USB_MODE]borted!\n"); - -1760 -da_out - = -CH376_RET_SUCCESS -; - -1761 - `dbg_tf -("[READ][DATA][CH376_SET_USB_MODE] completed!\n"); - -1765  -CH376_CMD_GET_STATUS -: - -1766 -da_out - = -ch376 --> -commd_us -; - -1767 - `dbg_tf -("[READ][DATA][CH376_CMD_GET_STATUS] stg dp܈t&%02x\n", -da_out -); - -1770  -CH376_CMD_RD_USB_DATA0 -: - -1771 if( -ch376 --> -nb_bys__cmd_da -) - -1773 if( -ch376 --> -pos_rw__cmd_da - = -CMD_DATA_REQ_SIZE -) - -1775 -da_out - = -ch376 --> -nb_bys__cmd_da -; - -1776 -ch376 --> -pos_rw__cmd_da - = 0; - -1777 - `dbg_tf -("[READ][DATA][CH376_CMD_RD_USB_DATA0]d i/bufsize: &%02x\n", -da_out -); - -1779 if( -ch376 --> -nb_bys__cmd_da - !ch376-> -pos_rw__cmd_da -) - -1781 -da_out - = -ch376 --> -cmd_da -. -CMD_IOBufr -[ch376-> -pos_rw__cmd_da -]; - -1783 - `dbg_tf -("[READ][DATA][CH376_CMD_RD_USB_DATA0]d \"%c\" (&%02xom i/buf㸩osi &%02x\n", -da_out -, da_out, -ch376 --> -pos_rw__cmd_da -); - -1785 if(++ -ch376 --> -pos_rw__cmd_da - =ch376-> -nb_bys__cmd_da -) - -1786 -ch376 --> -nb_bys__cmd_da - = 0; - -1791 -da_out - = 0; - -1792 - `dbg_tf -("[READ][DATA][CH376_CMD_RD_USB_DATA0]othingoead from i/o buffer\n"); - -1796  -CH376_CMD_WR_REQ_DATA -: - -1797 if( -ch376 --> -nb_bys__cmd_da -) - -1799 if( -ch376 --> -pos_rw__cmd_da - = -CMD_DATA_REQ_SIZE -) - -1801 -da_out - = -ch376 --> -nb_bys__cmd_da -; - -1802 -ch376 --> -pos_rw__cmd_da - = 0; - -1803 - `dbg_tf -("[READ][DATA][CH376_CMD_WR_REQ_DATA]d i/bufsize: &%02x\n", -da_out -); - -1808 -da_out - = 0; - -1809 - `dbg_tf -("[READ][DATA][CH376_CMD_WR_REQ_DATA]othingoead from i/o buffer\n"); - -1816 -da_out - = -ch376 --> -cmd_da -. -CMD_IOBufr -[0]; - -1820 - `dbg_tf -("<< [READ][DATA] f durg commd &%02x stu&%02x\n", -ch376 --> -commd -, ch376-> -commd_us -); - -1823  -da_out -; - -1824 - } -} - -1830  - $ch376_wre_commd_pt -( -ch376 - *ch376, -CH376_U8 - -commd -) - -1832 - `dbg_tf -(">> [WRITE][COMMAND] Wrcommd &%02x stu&%02x\n", -commd -, -ch376 --> -commd_us -); - -1834 -ch376 --> -r_us - = 0; - -1838 if( -ch376 --> -commd - = -CH376_CMD_CHECK_EXIST -) - -1840 -ch376 --> -cmd_da -. -CMD_CheckBy - = ~ -commd -; - -1841 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_CHECK_EXIST] g check by &%02x from commdt!\n", -commd -); - -1844  -commd -) - -1846  -CH376_CMD_CHECK_EXIST -: - -1847 -ch376 --> -commd - = -CH376_CMD_CHECK_EXIST -; - -1848 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_CHECK_EXIST] waiting for check byte\n"); - -1851  -CH376_CMD_GET_FILE_SIZE -: - -1852 -ch376 --> -commd - = -CH376_CMD_GET_FILE_SIZE -; - -1853 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_GET_FILE_SIZE] wait for &68 byte\n"); - -1856  -CH376_CMD_GET_IC_VER -: - -1857 -ch376 --> -commd - = -CH376_CMD_GET_IC_VER -; - -1858 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_GET_IC_VER]\n"); - -1861  -CH376_CMD_SET_USB_MODE -: - -1862 -ch376 --> -commd - = -CH376_CMD_SET_USB_MODE -; - -1863 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_SET_USB_MODE] waiting for usb mode data\n"); - -1866  -CH376_CMD_DISK_MOUNT -: - -1867 -ch376 --> -commd - = -CH376_CMD_DISK_MOUNT -; - -1868 - `nl_l_io -( -ch376 -); - -1870 if( -ch376 --> -usb_mode - = -CH376_ARG_SET_USB_MODE_SD_HOST -) - -1871 -ch376 --> -ro_d_lock - = - `syem_ob_dey_lock -(&ch376-> -cڋxt -, ch376-> -sdrd_drive_th -, -NULL -); - -1872 if( -ch376 --> -usb_mode - = -CH376_ARG_SET_USB_MODE_USB_HOST -) - -1873 -ch376 --> -ro_d_lock - = - `syem_ob_dey_lock -(&ch376-> -cڋxt -, ch376-> -usb_drive_th -, -NULL -); - -1875 if( -ch376 --> -ro_d_lock -) - -1877 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_DeviTy - = 0; - -1878 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_RemovabMed - = 0; - -1879 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_Vsis - = 0; - -1880 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_DaFmAndEtc - = 0; - -1881 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_AddiڮLgth - = 0; - -1882 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_Rerved1 - = 0; - -1883 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_Rerved2 - = 0; - -1884 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_MiscFg - = 0; - -1885 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_VdIdS -[0] = 'J'; - -1886 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_VdIdS -[1] = 'E'; - -1887 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_VdIdS -[2] = 'D'; - -1888 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_VdIdS -[3] = 'E'; - -1889 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_VdIdS -[4] = '+'; - -1890 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_VdIdS -[5] = 'O'; - -1891 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_VdIdS -[6] = 'F'; - -1892 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_VdIdS -[7] = 'T'; - -1893 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_ProduIdS -[ 0] = 'C'; - -1894 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_ProduIdS -[ 1] = 'H'; - -1895 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_ProduIdS -[ 2] = '3'; - -1896 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_ProduIdS -[ 3] = '7'; - -1897 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_ProduIdS -[ 4] = '6'; - -1898 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_ProduIdS -[ 5] = ' '; - -1899 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_ProduIdS -[ 6] = 'E'; - -1900 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_ProduIdS -[ 7] = 'M'; - -1901 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_ProduIdS -[ 8] = 'U'; - -1902 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_ProduIdS -[ 9] = 'L'; - -1903 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_ProduIdS -[10] = 'A'; - -1904 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_ProduIdS -[11] = 'T'; - -1905 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_ProduIdS -[12] = 'O'; - -1906 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_ProduIdS -[13] = 'R'; - -1907 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_ProduIdS -[14] = ' '; - -1908 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_ProduIdS -[15] = ' '; - -1909 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_ProduRevS -[0] = 'F'; - -1910 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_ProduRevS -[1] = 'A'; - -1911 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_ProduRevS -[2] = 'M'; - -1912 -ch376 --> -cmd_da -. -CMD_MouInfo -. -MOUNT_ProduRevS -[3] = 'E'; - -1914 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_DISK_MOUNT] drive directory is found (mounted :);dditional datavailable\n"); - -1916 -ch376 --> -nb_bys__cmd_da - = (ch376-> -cmd_da -. -CMD_MouInfo -); - -1917 -ch376 --> -r_us - = 127; - -1918 -ch376 --> -commd_us - = -CH376_INT_SUCCESS -; - -1922 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_DISK_MOUNT] drive directoryot found\n"); - -1923 -ch376 --> -commd_us - = 0x1f; - -1927  -CH376_CMD_GET_STATUS -: - -1928 -ch376 --> -commd - = -CH376_CMD_GET_STATUS -; - -1929 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_GET_STATUS] waiting for statuseading\n"); - -1932  -CH376_CMD_SET_FILE_NAME -: - -1933 -ch376 --> -commd - = -CH376_CMD_SET_FILE_NAME -; - -1934 -ch376 --> -pos_rw__cmd_da - = 0; - -1935 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_SET_FILE_NAME] waiting for fileame\n"); - -1938  -CH376_CMD_FILE_OPEN -: - -1939 -ch376 --> -commd - = -CH376_CMD_FILE_OPEN -; - -1941 if( -ch376 --> -ro_d_lock -) - -1943  -i - = 0; - -1946 if( -ch376 --> -cmd_da -. -CMD_FeName -[ -i -] == '/') - -1948 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_FILE_OPEN] openingoot directory\n"); - -1949 - `syem_a_dey_lock -(& -ch376 --> -cڋxt -, ch376-> -cut_d_lock -); - -1950 -ch376 --> -cut_d_lock - = - `syem_e_dey_lock -(&ch376-> -cڋxt -, ch376-> -ro_d_lock -); - -1951 -i -++; - -1954 if( -ch376 --> -cmd_da -. -CMD_FeName -[ -i -] == '\0') - -1957 -ch376 --> -r_us - = 127; - -1958 -ch376 --> -commd_us - = -CH376_ERR_OPEN_DIR -; - -1959 -ch376 --> -cut_fe_is_dey - = -CH376_TRUE -; - -1964 if( - `rchr -( -ch376 --> -cmd_da -. -CMD_FeName -,'*') || strchr(ch376->cmd_data.CMD_FileName,'?')) - -1966 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_FILE_OPEN]xamining directory contents\n"); - -1969 - `syem_fish_exame_dey -(& -ch376 --> -cڋxt -, ch376-> -cut_dey_browsg -); - -1970 -ch376 --> -cut_dey_browsg - = - `syem_t_exame_dey -(&ch376-> -cڋxt -, ch376-> -cut_d_lock -); - -1971 - `nmize_n -( -ch376 --> -cmd_da -. -CMD_FeName -, ch376-> -d_n -); - -1973  -fe_um_go -; - -1977  -fixed_fe_me -[13]; - -1978 -CH376_LOCK - -cut_d_lock -; - -1979 - `im_fe_me -(& -ch376 --> -cmd_da -. -CMD_FeName -[ -i -], -fixed_fe_me -); - -1981 -cut_d_lock - = - `syem_ob_dey_lock -(& -ch376 --> -cڋxt -, -fixed_fe_me -, ch376->current_dir_lock); - -1984 if( -cut_d_lock -) - -1986 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_FILE_OPEN]g dey: %s\n", & -ch376 --> -cmd_da -. -CMD_FeName -[ -i -]); - -1988 - `syem_a_dey_lock -(& -ch376 --> -cڋxt -, ch376-> -cut_d_lock -); - -1989 -ch376 --> -cut_d_lock - = current_dir_lock; - -1990 -ch376 --> -cut_fe_is_dey - = -CH376_TRUE -; - -1992 -ch376 --> -r_us - = 127; - -1993 -ch376 --> -commd_us - = -CH376_ERR_OPEN_DIR -; - -1998 - `syem_fe_o -(& -ch376 --> -cڋxt -, ch376-> -cut_fe -); - -1999 -ch376 --> -cut_fe - = - `syem_fe_ݒ_exig -(&ch376-> -cڋxt -, -fixed_fe_me -, ch376-> -cut_d_lock -); - -2001 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_FILE_OPEN] onghfe: %s\n", & -ch376 --> -cmd_da -. -CMD_FeName -[ -i -]); - -2003 if( -ch376 --> -cut_fe -) - -2005 -ch376 --> -r_us - = 127; - -2006 -ch376 --> -commd_us - = -CH376_INT_SUCCESS -; - -2007 -ch376 --> -cut_fe_is_dey - = -CH376_FALSE -; - -2011 -ch376 --> -r_us - = 0; - -2012 -ch376 --> -commd_us - = -CH376_ERR_MISS_FILE -; - -2020 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_FILE_OPEN]o operationossible (deviceot mounted)\n"); - -2022 -ch376 --> -r_us - = 0; - -2023 -ch376 --> -commd_us - = -CH376_RET_ABORT -; - -2027  -CH376_CMD_FILE_CREATE -: - -2028 -ch376 --> -commd - = -CH376_CMD_FILE_CREATE -; - -2030 if( -ch376 --> -ro_d_lock -) - -2032  -i - = 0; - -2035 if( -ch376 --> -cmd_da -. -CMD_FeName -[ -i -] == '/') - -2037 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_FILE_CREATE] openingoot directory\n"); - -2038 - `syem_a_dey_lock -(& -ch376 --> -cڋxt -, ch376-> -cut_d_lock -); - -2039 -ch376 --> -cut_d_lock - = - `syem_e_dey_lock -(&ch376-> -cڋxt -, ch376-> -ro_d_lock -); - -2040 -i -++; - -2043 if( -ch376 --> -cmd_da -. -CMD_FeName -[ -i -] == '\0') - -2046 -ch376 --> -r_us - = 127; - -2047 -ch376 --> -commd_us - = -CH376_INT_SUCCESS -; - -2051  -fixed_fe_me -[13]; - -2052 - `im_fe_me -(& -ch376 --> -cmd_da -. -CMD_FeName -[ -i -], -fixed_fe_me -); - -2055 - `syem_fe_o -(& -ch376 --> -cڋxt -, ch376-> -cut_fe -); - -2056 -ch376 --> -cut_fe - = - `syem_fe_ݒ_w -(&ch376-> -cڋxt -, -fixed_fe_me -, ch376-> -cut_d_lock -); - -2058 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_FILE_CREATE] cghfe: %s\n", & -ch376 --> -cmd_da -. -CMD_FeName -[ -i -]); - -2060 if( -ch376 --> -cut_fe -) - -2062 -ch376 --> -r_us - = 127; - -2063 -ch376 --> -commd_us - = -CH376_INT_SUCCESS -; - -2067 -ch376 --> -r_us - = 0; - -2068 -ch376 --> -commd_us - = -CH376_ERR_MISS_FILE -; - -2074 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_FILE_CREATE]o operationossible (deviceot mounted)\n"); - -2076 -ch376 --> -r_us - = 0; - -2077 -ch376 --> -commd_us - = -CH376_RET_ABORT -; - -2081  -CH376_CMD_DIR_CREATE -: - -2082 -ch376 --> -commd - = -CH376_CMD_DIR_CREATE -; - -2084 if( -ch376 --> -ro_d_lock -) - -2086  -fixed_fe_me -[13]; - -2087 -CH376_FILE - -exig_fe -; - -2088  -i - = 0; - -2091 if( -ch376 --> -cmd_da -. -CMD_FeName -[ -i -] == '/') - -2093 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_DIR_CREATE] openingoot directory\n"); - -2094 - `syem_a_dey_lock -(& -ch376 --> -cڋxt -, ch376-> -cut_d_lock -); - -2095 -ch376 --> -cut_d_lock - = - `syem_e_dey_lock -(&ch376-> -cڋxt -, ch376-> -ro_d_lock -); - -2096 -i -++; - -2099 - `im_fe_me -(& -ch376 --> -cmd_da -. -CMD_FeName -[ -i -], -fixed_fe_me -); - -2101 -exig_fe - = - `syem_fe_ݒ_exig -(& -ch376 --> -cڋxt -, -fixed_fe_me -, ch376-> -cut_d_lock -); - -2103 if( -exig_fe -) - -2105 - `syem_fe_o -(& -ch376 --> -cڋxt -, -exig_fe -); - -2106 -ch376 --> -r_us - = 0; - -2107 -ch376 --> -commd_us - = -CH376_ERR_FOUND_NAME -; - -2111 -CH376_LOCK - -d_d_lock -; - -2114 -d_d_lock - = - `syem_ob_dey_lock -(& -ch376 --> -cڋxt -, -fixed_fe_me -, ch376-> -cut_d_lock -); - -2116 i(! -d_d_lock -) - -2117 -d_d_lock - = - `syem__dey -(& -ch376 --> -cڋxt -, -fixed_fe_me -, ch376-> -cut_d_lock -); - -2120 if( -d_d_lock -) - -2122 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_DIR_CREATE]g ced dey: %s\n", & -ch376 --> -cmd_da -. -CMD_FeName -[ -i -]); - -2124 - `syem_a_dey_lock -(& -ch376 --> -cڋxt -, ch376-> -cut_d_lock -); - -2125 -ch376 --> -cut_d_lock - = -d_d_lock -; - -2127 -ch376 --> -r_us - = 127; - -2128 -ch376 --> -commd_us - = -CH376_INT_SUCCESS -; - -2132 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_DIR_CREATE] dey could bd: %s\n", & -ch376 --> -cmd_da -. -CMD_FeName -[ -i -]); - -2134 -ch376 --> -r_us - = 0; - -2135 -ch376 --> -commd_us - = -CH376_ERR_MISS_FILE -; - -2141 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_DIR_CREATE]o operationossible (deviceot mounted)\n"); - -2143 -ch376 --> -r_us - = 0; - -2144 -ch376 --> -commd_us - = -CH376_RET_ABORT -; - -2148  -CH376_CMD_FILE_ERASE -: - -2149 -ch376 --> -commd - = -CH376_CMD_FILE_ERASE -; - -2151 if( -ch376 --> -ro_d_lock -) - -2153  -fixed_fe_me -[13]; - -2154  -i - = 0; - -2155 -CH376_BOOL - -fe_ad - = -CH376_FALSE -; - -2158 if( -ch376 --> -cmd_da -. -CMD_FeName -[ -i -] == '/') - -2160 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_FILE_ERASE] openingoot directory\n"); - -2161 - `syem_a_dey_lock -(& -ch376 --> -cڋxt -, ch376-> -cut_d_lock -); - -2162 -ch376 --> -cut_d_lock - = - `syem_e_dey_lock -(&ch376-> -cڋxt -, ch376-> -ro_d_lock -); - -2163 -i -++; - -2166 i( -ch376 --> -cmd_da -. -CMD_FeName -[ -i -] != 0) - -2168 - `im_fe_me -(& -ch376 --> -cmd_da -. -CMD_FeName -[ -i -], -fixed_fe_me -); - -2170 if( -ch376 --> -cut_fe -) - -2172 - `syem_fe_o -(& -ch376 --> -cڋxt -, ch376-> -cut_fe -); - -2173 -ch376 --> -cut_fe - = ( -CH376_FILE -)0; - -2176 i( -ch376 --> -cut_fe_is_dey -) - -2177 -fe_ad - = - `syem_dey_de -(& -ch376 --> -cڋxt -, ch376-> -cut_d_lock -); - -2179 -fe_ad - = - `syem_fe_de -(& -ch376 --> -cڋxt -, -fixed_fe_me -, ch376-> -cut_d_lock -); - -2182 i( -fe_ad -) - -2184 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_FILE_ERASE] f dey ded: %s\n", & -ch376 --> -cmd_da -. -CMD_FeName -[ -i -]); - -2186 -ch376 --> -r_us - = 127; - -2187 -ch376 --> -commd_us - = -CH376_INT_SUCCESS -; - -2191 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_FILE_ERASE] f dey could bded: %s\n", & -ch376 --> -cmd_da -. -CMD_FeName -[ -i -]); - -2193 -ch376 --> -r_us - = 0; - -2194 -ch376 --> -commd_us - = -CH376_ERR_MISS_FILE -; - -2199 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_FILE_ERASE]o operationossible (deviceot mounted)\n"); - -2201 -ch376 --> -r_us - = 0; - -2202 -ch376 --> -commd_us - = -CH376_RET_ABORT -; - -2206  -CH376_CMD_RD_USB_DATA0 -: - -2207 -ch376 --> -commd - = -CH376_CMD_RD_USB_DATA0 -; - -2208 -ch376 --> -pos_rw__cmd_da - = -CMD_DATA_REQ_SIZE -; - -2209 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_RD_USB_DATA0] waiting for i/o bufferead\n"); - -2212  -CH376_CMD_WR_REQ_DATA -: - -2213 -ch376 --> -commd - = -CH376_CMD_WR_REQ_DATA -; - -2214 -ch376 --> -pos_rw__cmd_da - = -CMD_DATA_REQ_SIZE -; - -2215 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_WR_REQ_DATA] waiting for i/o buffer write\n"); - -2218  -CH376_CMD_FILE_ENUM_GO -: - -2219 -ch376 --> -commd - = -CH376_CMD_FILE_ENUM_GO -; - -2220 -fe_um_go -: - -2221 if( - `syem_go_exame_dey -(& -ch376 --> -cڋxt -, ch376-> -cut_d_lock -, ch376-> -cut_dey_browsg -, &ch376-> -cmd_da -. -CMD_FDInfo -, ch376-> -d_n -)) - -2223 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_FILE_ENUM_GO]ext directoryntry in buffer\n"); - -2224 -ch376 --> -nb_bys__cmd_da - = (ch376-> -cmd_da -. -CMD_FDInfo -); - -2225 -ch376 --> -r_us - = 127; - -2226 -ch376 --> -commd_us - = -CH376_INT_DISK_READ -; - -2230 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_FILE_ENUM_GO] directory browing finished\n"); - -2232 - `syem_fish_exame_dey -(& -ch376 --> -cڋxt -, ch376-> -cut_dey_browsg -); - -2233 -ch376 --> -cut_dey_browsg - = ( -CH376_DIR -)0; - -2235 -ch376 --> -r_us - = 0; - -2236 -ch376 --> -commd_us - = -CH376_ERR_OPEN_DIR -; - -2240  -CH376_CMD_DISK_CAPACITY -: - -2241 -ch376 --> -commd - = -CH376_CMD_DISK_CAPACITY -; - -2243 if( - `syem_g_disk_fo -(& -ch376 --> -cڋxt -, ch376-> -ro_d_lock -, &ch376-> -cmd_da -. -CMD_DiskQuy -)) - -2245 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_DISK_CAPACITY] sector capacity in buffer\n"); - -2247 -ch376 --> -nb_bys__cmd_da - = 4; - -2248 -ch376 --> -r_us - = 127; - -2249 -ch376 --> -commd_us - = -CH376_INT_SUCCESS -; - -2253 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_DISK_CAPACITY]o operationossible (deviceot mounted)\n"); - -2254 -ch376 --> -r_us - = 0; - -2255 -ch376 --> -commd_us - = -CH376_RET_ABORT -; - -2259  -CH376_CMD_DISK_QUERY -: - -2260 -ch376 --> -commd - = -CH376_CMD_DISK_QUERY -; - -2262 if( - `syem_g_disk_fo -(& -ch376 --> -cڋxt -, ch376-> -ro_d_lock -, &ch376-> -cmd_da -. -CMD_DiskQuy -)) - -2264 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_DISK_QUERY] sector capacity in buffer\n"); - -2265 -ch376 --> -nb_bys__cmd_da - = (ch376-> -cmd_da -. -CMD_DiskQuy -); - -2266 -ch376 --> -r_us - = 127; - -2267 -ch376 --> -commd_us - = -CH376_INT_SUCCESS -; - -2271 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_DISK_QUERY]o operationossible (deviceot mounted)\n"); - -2272 -ch376 --> -r_us - = 0; - -2273 -ch376 --> -commd_us - = -CH376_RET_ABORT -; - -2277  -CH376_CMD_BYTE_LOCATE -: - -2278 -ch376 --> -commd - = -CH376_CMD_BYTE_LOCATE -; - -2279 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_BYTE_LOCATE] waiting for seekosition\n"); - -2280 -ch376 --> -pos_rw__cmd_da - = 0; - -2283  -CH376_CMD_BYTE_READ -: - -2284 -ch376 --> -commd - = -CH376_CMD_BYTE_READ -; - -2285 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_BYTE_READ] waiting foread size\n"); - -2286 -ch376 --> -pos_rw__cmd_da - = 0; - -2289  -CH376_CMD_BYTE_RD_GO -: - -2290 -ch376 --> -commd - = -CH376_CMD_BYTE_RD_GO -; - -2291 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_BYTE_RD_GO] waiting forext chunkoead\n"); - -2292 - `fe_ad_chunk -( -ch376 -); - -2295  -CH376_CMD_BYTE_WRITE -: - -2296 -ch376 --> -commd - = -CH376_CMD_BYTE_WRITE -; - -2297 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_BYTE_WRITE] waiting for write size\n"); - -2298 -ch376 --> -pos_rw__cmd_da - = 0; - -2301  -CH376_CMD_BYTE_WR_GO -: - -2302 -ch376 --> -commd - = -CH376_CMD_BYTE_WR_GO -; - -2303 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_BYTE_WR_GO] waiting forext chunko write\n"); - -2304 - `fe_wre_chunk -( -ch376 -); - -2307  -CH376_CMD_FILE_CLOSE -: - -2308 -ch376 --> -commd - = -CH376_CMD_FILE_CLOSE -; - -2309 - `dbg_tf -("[WRITE][COMMAND][CH376_CMD_FILE_CLOSE] waiting for close mode\n"); - -2313 - `dbg_tf -("[WRITE][COMMAND][Unsu܋d] commd &%02x imemd\n", -ch376 --> -commd -); - -2314 -ch376 --> -r_us - = 0; - -2315 -ch376 --> -commd_us - = -CH376_RET_ABORT -; - -2319 - `dbg_tf -("<< [WRITE][COMMAND] Wrcommd &%02x stu&%02x\n", -ch376 --> -commd -, ch376-> -commd_us -); - -2320 - } -} - -2326  - $ch376_wre_da_pt -( -ch376 - *ch376, -CH376_U8 - -da -) - -2328 - `dbg_tf -(">> [WRITE][DATA] Wrd&%02x stu&%02x\n", -da -, -ch376 --> -commd_us -); - -2330  -ch376 --> -commd -) - -2332  -CH376_CMD_CHECK_EXIST -: - -2333 -ch376 --> -cmd_da -. -CMD_CheckBy - = ~ -da -; - -2334 - `dbg_tf -("[WRITE][DATA][CH376_CMD_CHECK_EXIST] g check by &%02x\n", -da -); - -2337  -CH376_CMD_GET_FILE_SIZE -: - -2339 i( -da - == 0x68) - -2341 -CH376_S32 - -fe_size - = - `syem_g_fe_size -(& -ch376 --> -cڋxt -, ch376-> -cut_fe -); - -2343 -ch376 --> -cmd_da -. -CMD_FeSize -[0] = ( -CH376_U8 -)(( -fe_size - & 0x000000ff) >> 0); - -2344 -ch376 --> -cmd_da -. -CMD_FeSize -[1] = ( -CH376_U8 -)(( -fe_size - & 0x0000ff00) >> 8); - -2345 -ch376 --> -cmd_da -. -CMD_FeSize -[2] = ( -CH376_U8 -)(( -fe_size - & 0x00ff0000) >> 16); - -2346 -ch376 --> -cmd_da -. -CMD_FeSize -[3] = ( -CH376_U8 -)(( -fe_size - & 0xff000000) >> 24); - -2348 -ch376 --> -nb_bys__cmd_da - = (ch376-> -cmd_da -. -CMD_FeSize -); - -2349 -ch376 --> -pos_rw__cmd_da - = 0; - -2351 - `dbg_tf -("[WRITE][DATA][CH376_CMD_GET_FILE_SIZE] de, fsizi%d, wag f dad\n", -fe_size -); - -2354 -ch376 --> -r_us - = 127; - -2355 -ch376 --> -commd_us - = -CH376_INT_SUCCESS -; - -2359 - `dbg_tf -("[WRITE][DATA][CH376_CMD_GET_FILE_SIZE] wrg commd by:ookg f &68, g &%02x\n", -da -); - -2361 -ch376 --> -r_us - = 0; - -2362 -ch376 --> -commd_us - = -CH376_RET_ABORT -; - -2366  -CH376_CMD_SET_USB_MODE -: - -2367 - `nl_l_io -( -ch376 -); - -2368  -da -) - -2370  -CH376_ARG_SET_USB_MODE_USB_HOST -: - -2371 -ch376 --> -usb_mode - = -CH376_ARG_SET_USB_MODE_USB_HOST -; - -2372 - `dbg_tf -("[WRITE][DATA][CH376_SET_USB_MODE] USB host set\n"); - -2374  -CH376_ARG_SET_USB_MODE_SD_HOST -: - -2375 -ch376 --> -usb_mode - = -CH376_ARG_SET_USB_MODE_SD_HOST -; - -2376 - `dbg_tf -("[WRITE][DATA][CH376_SET_USB_MODE] SD card set\n"); - -2379 -ch376 --> -usb_mode - = -CH376_ARG_SET_USB_MODE_INVALID -; - -2380 - `dbg_tf -("[WRITE][DATA][CH376_SET_USB_MODE_CODE_INVALID] set\n"); - -2385  -CH376_CMD_SET_FILE_NAME -: - -2386 - `dbg_tf -("[WRITE][DATA][CH376_CMD_SET_FILE_NAME] g fmcha \"%c\" (&%02xf܅osi %d\n", -da -, da, -ch376 --> -pos_rw__cmd_da -); - -2388 if( -ch376 --> -pos_rw__cmd_da - < (ch376-> -cmd_da -. -CMD_FeName -)) - -2391 -ch376 --> -cmd_da -. -CMD_FeName -[ch376-> -pos_rw__cmd_da -++] = -da -; - -2392 -ch376 --> -cmd_da -. -CMD_FeName -[ch376-> -pos_rw__cmd_da -] = '\0'; - -2397  -CH376_CMD_BYTE_LOCATE -: - -2398 if( -ch376 --> -pos_rw__cmd_da - < (ch376-> -cmd_da -. -CMD_FeSk -)) - -2400 - `dbg_tf -("[WRITE][DATA][CH376_CMD_BYTE_LOCATE] g by #%d wh vu&%02x\n", -ch376 --> -pos_rw__cmd_da -, -da -); - -2401 -ch376 --> -cmd_da -. -CMD_FeSk -[ch376-> -pos_rw__cmd_da -] = -da -; - -2403 if(++ -ch376 --> -pos_rw__cmd_da - =(ch376-> -cmd_da -. -CMD_FeSk -)) - -2405 -CH376_S32 - -fe_ek_pos - = ( -ch376 --> -cmd_da -. -CMD_FeSk -[0] << 0) - -2406 | ( -ch376 --> -cmd_da -. -CMD_FeSk -[1] << 8) - -2407 | ( -ch376 --> -cmd_da -. -CMD_FeSk -[2] << 16) - -2408 | ( -ch376 --> -cmd_da -. -CMD_FeSk -[3] << 24); - -2410 -fe_ek_pos - = - `syem_fe_ek -(& -ch376 --> -cڋxt -, ch376-> -cut_fe -, file_seek_pos); - -2412 if( -fe_ek_pos - >= 0) - -2414 - `dbg_tf -("[WRITE][DATA][CH376_CMD_BYTE_LOCATE]ll done: seek operated with success (waiting for dataead)\n"); - -2416 -ch376 --> -cmd_da -. -CMD_FeSk -[0] = ( -CH376_U8 -)(( -fe_ek_pos - & 0x000000ff) >> 0); - -2417 -ch376 --> -cmd_da -. -CMD_FeSk -[1] = ( -CH376_U8 -)(( -fe_ek_pos - & 0x0000ff00) >> 8); - -2418 -ch376 --> -cmd_da -. -CMD_FeSk -[2] = ( -CH376_U8 -)(( -fe_ek_pos - & 0x00ff0000) >> 16); - -2419 -ch376 --> -cmd_da -. -CMD_FeSk -[3] = ( -CH376_U8 -)(( -fe_ek_pos - & 0xff000000) >> 24); - -2421 -ch376 --> -nb_bys__cmd_da - = (ch376-> -cmd_da -. -CMD_FeSk -); - -2422 -ch376 --> -r_us - = 127; - -2423 -ch376 --> -commd_us - = -CH376_INT_SUCCESS -; - -2427 - `dbg_tf -("[WRITE][DATA][CH376_CMD_BYTE_LOCATE]ll done: seek failure\n"); - -2429 -ch376 --> -r_us - = 0; - -2430 -ch376 --> -commd_us - = -CH376_RET_ABORT -; - -2436  -CH376_CMD_WR_REQ_DATA -: - -2437 if( -ch376 --> -nb_bys__cmd_da - - -2438 && -ch376 --> -pos_rw__cmd_da - ! -CMD_DATA_REQ_SIZE -) - -2440 -CH376_U8 - * -w - = (CH376_U8 *)& -ch376 --> -cmd_da -; - -2442 if( -ch376 --> -nb_bys__cmd_da - !ch376-> -pos_rw__cmd_da -) - -2444 -w -[ -ch376 --> -pos_rw__cmd_da -] = -da -; - -2446 - `dbg_tf -("[WRITE][DATA][CH376_CMD_WR_REQ_DATA] wr\"%c\" (&%02xti/buf㸩osi &%02x\n", -da -, da, -ch376 --> -pos_rw__cmd_da -); - -2448 if(++ -ch376 --> -pos_rw__cmd_da - =ch376-> -nb_bys__cmd_da -) - -2450 -ch376 --> -r_us - = 0; - -2451 -ch376 --> -commd_us - = -CH376_RET_SUCCESS -; - -2457 - `dbg_tf -("[WRITE][DATA][CH376_CMD_WR_REQ_DATA]othingo writeo i/o buffer\n"); - -2459 -ch376 --> -r_us - = 0; - -2460 -ch376 --> -commd_us - = -CH376_RET_ABORT -; - -2464  -CH376_CMD_BYTE_READ -: - -2465 if( -ch376 --> -pos_rw__cmd_da - < (ch376-> -cmd_da -. -CMD_FeRdWre -)) - -2467 - `dbg_tf -("[WRITE][DATA][CH376_CMD_BYTE_READ] g by #%d wh vu&%02x\n", -ch376 --> -pos_rw__cmd_da -, -da -); - -2468 -ch376 --> -cmd_da -. -CMD_FeRdWre -[ch376-> -pos_rw__cmd_da -] = -da -; - -2470 if(++ -ch376 --> -pos_rw__cmd_da - =(ch376-> -cmd_da -. -CMD_FeRdWre -)) - -2472 -ch376 --> -bys_to_ad_wre - = (ch376-> -cmd_da -. -CMD_FeRdWre -[0] << 0) - -2473 | ( -ch376 --> -cmd_da -. -CMD_FeRdWre -[1] << 8); - -2474 - `fe_ad_chunk -( -ch376 -); - -2479  -CH376_CMD_BYTE_WRITE -: - -2480 if( -ch376 --> -pos_rw__cmd_da - < (ch376-> -cmd_da -. -CMD_FeRdWre -)) - -2482 - `dbg_tf -("[WRITE][DATA][CH376_CMD_BYTE_WRITE] g by #%d wh vu&%02x\n", -ch376 --> -pos_rw__cmd_da -, -da -); - -2483 -ch376 --> -cmd_da -. -CMD_FeRdWre -[ch376-> -pos_rw__cmd_da -] = -da -; - -2485 if(++ -ch376 --> -pos_rw__cmd_da - =(ch376-> -cmd_da -. -CMD_FeRdWre -)) - -2487 -ch376 --> -bys_to_ad_wre - = (ch376-> -cmd_da -. -CMD_FeRdWre -[0] << 0) - -2488 | ( -ch376 --> -cmd_da -. -CMD_FeRdWre -[1] << 8); - -2490 if( -ch376 --> -bys_to_ad_wre - > (ch376-> -cmd_da -. -CMD_IOBufr -)) - -2491 -ch376 --> -nb_bys__cmd_da - = (ch376-> -cmd_da -. -CMD_IOBufr -); - -2493 -ch376 --> -nb_bys__cmd_da - = ( -CH376_U8 -)ch376-> -bys_to_ad_wre -; - -2495 -ch376 --> -r_us - = 127; - -2496 -ch376 --> -commd_us - = -CH376_INT_SUCCESS -; - -2501  -CH376_CMD_FILE_CLOSE -: - -2503 - `dbg_tf -("[WRITE][DATA][CH376_CMD_FILE_CLOSE] updsize: %s\n", -ch376 --> -pos_rw__cmd_da - == 0 ? "no" : "yes"); - -2504 if( -ch376 --> -cut_fe -) - -2506 - `syem_fe_o -(& -ch376 --> -cڋxt -, ch376-> -cut_fe -); - -2507 -ch376 --> -cut_fe - = ( -CH376_FILE -)0; - -2509 -ch376 --> -r_us - = 127; - -2510 -ch376 --> -commd_us - = -CH376_INT_SUCCESS -; - -2514 - `dbg_tf -("[WRITE][DATA][CH376_CMD_FILE_CLOSE] failure:ot file opened\n"); - -2516 -ch376 --> -r_us - = 0; - -2517 -ch376 --> -commd_us - = -CH376_RET_ABORT -; - -2522 - `dbg_tf -("<< [WRITE][DATA] Wrd&%02x stu&%02x\n", -da -, -ch376 --> -commd_us -); - -2524 - } -} - -2530  -ch376 - * - $ch376_ -(* -ur_da -) - -2532  -ch376 - *ch376 = - `syem_loc_mem -((ch376)); - -2534 if( -ch376 -) - -2536 if( - `syem__cڋxt -(& -ch376 --> -cڋxt -, -ur_da -)) - -2538 -ch376 --> -sdrd_drive_th - = - `e_rg -("ch376_sdcard_drive/"); - -2539 -ch376 --> -usb_drive_th - = - `e_rg -("ch376_usb_drive/"); - -2540 - `r_ruu -( -ch376 -); - -2544 - `syem__mem -( -ch376 -); - -2545 -ch376 - = -NULL -; - -2548  -ch376 -; - -2549 - } -} - -2551  - $ch376_deroy -( -ch376 - *ch376) - -2553 - `nl_l_io -( -ch376 -); - -2554 - `syem__mem -( -ch376 --> -sdrd_drive_th -); - -2555 - `syem__mem -( -ch376 --> -usb_drive_th -); - -2556 - `syem_n_cڋxt -(& -ch376 --> -cڋxt -); - -2557 - `syem__mem -( -ch376 -); - -2558 - } -} - -2560  - $ch376_t -( -ch376 - *ch376) - -2562 - `nl_l_io -( -ch376 -); - -2563 - `r_ruu -( -ch376 -); - -2564 - } -} - -2570  - $ch376_t_sdrd_drive_th -( -ch376 - *ch376, cڡ * -th -) - -2572 - `dbg_tf -("ch376_t_sdrd_drive_th: %s\n", -th -); - -2573 - `nl_l_io -( -ch376 -); - -2574 - `syem__mem -( -ch376 --> -sdrd_drive_th -); - -2575 -ch376 --> -sdrd_drive_th - = - `e_rg -( -th -); - -2576 - } -} - -2578  - $ch376_t_usb_drive_th -( -ch376 - *ch376, cڡ * -th -) - -2580 - `dbg_tf -("ch376_t_usb_drive_th: %s\n", -th -); - -2581 - `nl_l_io -( -ch376 -); - -2582 - `syem__mem -( -ch376 --> -usb_drive_th -); - -2583 -ch376 --> -usb_drive_th - = - `e_rg -( -th -); - -2584 - } -} - -2586 cڡ * - $ch376_g_sdrd_drive_th -( -ch376 - *ch376) - -2588  -ch376 --> -sdrd_drive_th -; - -2589 - } -} - -2591 cڡ * - $ch376_g_usb_drive_th -( -ch376 - *ch376) - -2593  -ch376 --> -usb_drive_th -; - -2594 - } -} - - @plugins/ch376/ch376.h - -12 #ide -LOCAL_CH376_H - - -13  - #LOCAL_CH376_H - - - ) - -19 #i -defed -( -__MORPHOS__ -|| defed ( -__AMIGA__ -|| defed ( -__AROS__ -) - -21 #ide -EXEC_TYPES_H - - -22  - ~ - -24 #ide -DOS_DOS_H - - -25  - ~ - -28  -UBYTE - - tCH376_U8 -; - -29  -BYTE - - tCH376_S8 -; - -30  -UWORD - - tCH376_U16 -; - -31  -WORD - - tCH376_S16 -; - -32  -ULONG - - tCH376_U32 -; - -33  -LONG - - tCH376_S32 -; - -34  -UQUAD - - tCH376_U64 -; - -35  -QUAD - - tCH376_S64 -; - -36  -BOOL - - tCH376_BOOL -; - -37  -BPTR - - tCH376_FILE -; - -38  -BPTR - - tCH376_LOCK -; - -39  -FeInfoBlock - * - tCH376_DIR -; - -40 ru {  -Libry - * - mDOSBa -; } - tCH376_CONTEXT -; - -42  - #CH376_TRUE - -TRUE - - - ) - -43  - #CH376_FALSE - -FALSE - - - ) - -45 #ide -UNUSED - - -46  - #UNUSED - - `__ibu__ -(( -unud -)) - - ) - -49 #i -defed -( -WIN32 -) - -51  - ~ - -53  -UINT8 - - tCH376_U8 -; - -54  -INT8 - - tCH376_S8 -; - -55  -UINT16 - - tCH376_U16 -; - -56  -INT16 - - tCH376_S16 -; - -57  -UINT32 - - tCH376_U32 -; - -58  -INT32 - - tCH376_S32 -; - -59  -UINT64 - - tCH376_U64 -; - -60  -INT64 - - tCH376_S64 -; - -61  -BOOL - - tCH376_BOOL -; - -62  -HANDLE - - tCH376_FILE -; - -63  - s_CH376_LOCK - { -TCHAR - - mth -[ -MAX_PATH -]; -HANDLE - - mhd -; } * - tCH376_LOCK -; - -64  -WIN32_FIND_DATA - * - tCH376_DIR -; - -66 ru { * - mdummy -; } - tCH376_CONTEXT -; - -68  - #CH376_TRUE - -TRUE - - - ) - -69  - #CH376_FALSE - -FALSE - - - ) - -71  - #UNUSED - - - ) - -73 #i -defed -( -__unix__ -|| defed( -__APPLE__ -|| defed( -__HAIKU__ -|| defed( -__MINT__ -) - -75  - ~ - -76  - ~ - -77  - ~ - -78  - ~ - -80  -ut8_t - - tCH376_U8 -; - -81  -t8_t - - tCH376_S8 -; - -82  -ut16_t - - tCH376_U16 -; - -83  -t16_t - - tCH376_S16 -; - -84  -ut32_t - - tCH376_U32 -; - -85  -t32_t - - tCH376_S32 -; - -86  -ut64_t - - tCH376_U64 -; - -87  -t64_t - - tCH376_S64 -; - -88  -bo - - tCH376_BOOL -; - -89  -FILE - * - tCH376_FILE -; - -90 * - tCH376_LOCK -; - -91  - s_CH376_DIR - { -DIR - * - mhd -;  -dt - * - my -; } * - tCH376_DIR -; - -92 ru { * - mdummy -; } - tCH376_CONTEXT -; - -94  - #CH376_TRUE - -ue - - - ) - -95  - #CH376_FALSE - -l - - - ) - -97 #ide -UNUSED - - -98  - #UNUSED - - `__ibu__ -(( -unud -)) - - ) - -109  - gch376 -; - -112  -ch376 - * -ch376_ -(* -ur_da -); - -113  -ch376_deroy -( -ch376 - *ch376); - -114  -ch376_t -( -ch376 - *ch376); - -117  -ch376_t_sdrd_drive_th -( -ch376 - *ch376, cڡ * -th -); - -118  -ch376_t_usb_drive_th -( -ch376 - *ch376, cڡ * -th -); - -119 cڡ * -ch376_g_sdrd_drive_th -( -ch376 - *ch376); - -120 cڡ * -ch376_g_usb_drive_th -( -ch376 - *ch376); - -123  -ch376_wre_commd_pt -( -ch376 - *ch376, -CH376_U8 - -commd -); - -124  -ch376_wre_da_pt -( -ch376 - *ch376, -CH376_U8 - -da -); - -125 -CH376_U8 - -ch376_ad_commd_pt -( -ch376 - *ch376); - -126 -CH376_U8 - -ch376_ad_da_pt -( -ch376 - *ch376); - - @plugins/ch376/oric_ch376_plugin.c - -1 #i -SDL_MAJOR_VERSION - == 1 - -2 #ifde -__SPECIFY_SDL_DIR__ - - -3  - ~ - -5  - ~ - -8 #ifde -__SPECIFY_SDL_DIR__ - - -9  - ~ - -11  - ~ - -15  - ~"ch376.h -" - -16  - ~"dio.h -" - -18  -dbg_tf -(* -fmt -, ...); - -20  - #CH376_ORIC_EXTENSION_DATA_PORT - 0x340 - - ) - -21  - #CH376_ORIC_EXTENSION_COMMAND_PORT - 0x341 - - ) - -24  -ch376 - * - $ch376_ic_ -() - -26  - `ch376_ -( -NULL -); - -27 - } -} - -29  - $ch376_ic_t -( -ch376 - *ch376) - -31 - `ch376_t -( -ch376 -); - -32 - } -} - -35  - $ch376_ic_deroy -( -ch376 - *ch376) - -37 - `ch376_deroy -( -ch376 -); - -38 - } -} - -40  - $ch376_ic_cfig -( -ch376 - *ch376) - -42 - `ch376_t_sdrd_drive_th -( -ch376 -, "sdcard/"); - -43 - `ch376_t_usb_drive_th -( -ch376 -, "usbdrive/"); - -44 - } -} - -46  - $ch376_ic_wre -( -ch376 - *ch376, -Ut16 - -addr -, -Ut8 - -da -) - -48 i( -addr - = -CH376_ORIC_EXTENSION_DATA_PORT -) - -50 - `ch376_wre_da_pt -( -ch376 -, -da -); - -53 i( -addr - = -CH376_ORIC_EXTENSION_COMMAND_PORT -) - -55 - `ch376_wre_commd_pt -( -ch376 -, -da -); - -57 - } -} - -60  - $ch376_ic_ad -( -ch376 - *ch376, -Ut16 - -addr -) - -62  -mp -; - -63 i( -addr - = -CH376_ORIC_EXTENSION_DATA_PORT -) - -65 -mp -= - `ch376_ad_da_pt -( -ch376 -); - -66  -mp -; - -69 i( -addr - = -CH376_ORIC_EXTENSION_COMMAND_PORT -) - -71 -mp -= - `ch376_ad_commd_pt -( -ch376 -); - -72  -mp -; - -75 - } -} - - @plugins/ch376/oric_ch376_plugin.h - -1  -ch376 - * -ch376_ic_ -(); - -2  -ch376_ic_t -( -ch376 - *ch376); - -3  -ch376_ic_wre -( -ch376 - *ch376, -Ut16 - -addr -, -Ut8 - -da -); - -4  -ch376_ic_ad -( -ch376 - *ch376, -Ut16 - -addr -); - -5  -ch376_ic_cfig -( -ch376 - *ch376); - -6  -ch376_ic_deroy -( -ch376 - *ch376); - -7  -ch376_ic_t -( -ch376 - *ch376); - - @render_gl.c - -22 #ifde -__OPENGL_AVAILABLE__ - - -24  - ~ - -25  - ~ - -26  - ~ - -28  - ~"syem.h -" - -30 #ifde -WIN32 - - -31  - ~ - -34 #ide -__APPLE__ - - -36  - ~ - -38  - ~ - -41 #i -SDL_MAJOR_VERSION - == 1 - -42 #ifde -__SPECIFY_SDL_DIR__ - - -43  - ~ - -45  - ~ - -48 #ifde -__SPECIFY_SDL_DIR__ - - -49  - ~ - -51  - ~ - -55  - ~"6502.h -" - -56  - ~"v.h -" - -57  - ~"8912.h -" - -58  - ~"disk.h -" - -59  - ~"gui.h -" - -60  - ~"mڙ.h -" - -61  - ~"6551.h -" - -62  - ~"mache.h -" - -63  - ~"nd_gl.h -" - -64  - ~"u.h -" - -66  - #TEX_VIDEO - (0) - - ) - -67  - #TEX_SCANLINES - (1) - - ) - -68  - #TEX_STATUS - (2) - - ) - -69  - #TEX_POPUP - (3) - - ) - -71  - #TEX_TZ - ( -TEX_POPUP -+1) - - ) - -72  - #TEX_TZ_LAST - (( -NUM_TZ -+ -TEX_TZ -)-1) - - ) - -74  - #TEX_GIMG - ( -TEX_TZ_LAST -+1) - - ) - -75  - #TEX_GIMG_LAST - (( -NUM_GIMG -+ -TEX_GIMG -)-1) - - ) - -77  - #NUM_TEXTURES - ( -TEX_GIMG_LAST -+1) - - ) - -79 -SDL_bo - -eshus -; - -81  - sxtu - - -83  - mw -, - mh -; - -84  - mtw -, - mth -; - -85 -Ut8 - * - mbuf -; - -88  -SDL_bo - - gdodx - = -SDL_FALSE -; - -89  -GLut - - gx -[ -NUM_TEXTURES -]; - -90  -xtu - - gtx -[ -NUM_TEXTURES -]; - -92  -SDL_Sur - * - gsn -; - -93  -Ut32 - - ggl -[ -NUM_GUI_COLS -]; - -95  - grc -[3]; - -97  -sgl -[]; - -98 -SDL_bo - -fusn -; - -99  -xtze - * -tz -[ -NUM_TZ -]; - -100 -Ut8 - -i -[]; - -101  -guiimg - -gimgs -[ -NUM_GIMG -]; - -104  -theft -[]; - -113  - $tch - -i -,  -x -,  -y -,  -ch -, -Ut32 - -fc -, Ut32 -bc -, -SDL_bo - -sidft - ) - -115  -px -, -py -, -c -; - -116 * - -; - -117  -xtu - * -x - = & -tx -[ -i -]; - -118 -Ut32 - * -r -; - -120 if -ch - > 127 ) ; - -122 -r - = ( -Ut32 - *)& -x --> -buf -[( -y -*x-> -w -+ -x -)*4]; - -124 - - = & -theft -[ -ch -*12]; - -126  -py -=0;y<12;y++ ) - -128  -c -=0x80, -px -=0;x<8;x++, c>>=1 ) - -130 if(* - -)& -c - ) - -132 *( -r -++ -fc -; - -134 if -sidft - ) - -135 *( -r -++ -bc -; - -137 -r -++; - -141 -r - + -x --> -w --8; - -142 - -++; - -144 - } -} - -146  - $upde_xtze_xtu - -mache - * -ic -,  -i - ) - -148  -x -, -y -, -px -, -py -, -o -; - -150 if! -tz -[ -i -] ) ; - -151 if! -tz -[ -i -]-> -modifd - ) ; - -152 if! -tx -[ -i -+ -TEX_TZ -]. -buf - ) ; - -154 -o - = 0; - -156  -y -=0, -py -=0; y< -tz -[ -i -]-> -h -; y++,y+=12 ) - -158  -x -=0, -px -=0; x< -tz -[ -i -]-> -w -; x++, -o -++,x+=8 ) - -159 - `tch - -i -+ -TEX_TZ -, -px -, -py -, -tz -[i]-> -tx -[ -o -], -gl -[tz[i]-> -fc -[o]], gl[tz[i]-> -bc -[o]], -SDL_TRUE - ); - -162 - `glBdTextu - -GL_TEXTURE_2D -, -x -[ -i -+ -TEX_TZ -] ); - -163 - `glTexImage2D - -GL_TEXTURE_2D -, 0, -GL_RGBA -, -tx -[ -i -+ -TEX_TZ -]. -w -,x[i+TEX_TZ]. -h -, 0, GL_RGBA, -GL_UNSIGNED_BYTE -,x[i+TEX_TZ]. -buf - ); - -165 -tz -[ -i -]-> -modifd - = -SDL_FALSE -; - -166 - } -} - -168  - $upde_video_xtu - -mache - * -ic - ) - -170  -x -, -y -, -o -, -c -; - -171 -Ut8 - * - -; - -173 -o - = 0; - -174 - - = -ic --> -s -; - -176  -y -=0; y<224; y++ ) - -178 i(! -ic --> -vid_dty -[ -y -]) - -180 - - += 240; - -181 -o - + -tx -[ -TEX_VIDEO -]. -w -*4; - -185  -x -=0; x<240; x++ ) - -187 -c - = *( - -++) * 3; - -188 -tx -[ -TEX_VIDEO -]. -buf -[ -o -++] = -i -[ -c -++]; - -189 -tx -[ -TEX_VIDEO -]. -buf -[ -o -++] = -i -[ -c -++]; - -190 -tx -[ -TEX_VIDEO -]. -buf -[ -o -++] = -i -[ -c -++]; - -191 -tx -[ -TEX_VIDEO -]. -buf -[ -o -++] = 0xff; - -196 -tx -[ -TEX_VIDEO -]. -buf -[ -o -++] = -i -[ -c --3]; - -197 -tx -[ -TEX_VIDEO -]. -buf -[ -o -++] = -i -[ -c --2]; - -198 -tx -[ -TEX_VIDEO -]. -buf -[ -o -++] = -i -[ -c --1]; - -199 -tx -[ -TEX_VIDEO -]. -buf -[ -o -++] = 0xff; - -201 -o - +( -tx -[ -TEX_VIDEO -]. -w --241) * 4; - -202 -ic --> -vid_dty -[ -y -] = -SDL_FALSE -; - -205 - - -= 240; - -206  -x -=0; x<240; x++ ) - -208 -c - = *( - -++) * 3; - -209 -tx -[ -TEX_VIDEO -]. -buf -[ -o -++] = -i -[ -c -++]; - -210 -tx -[ -TEX_VIDEO -]. -buf -[ -o -++] = -i -[ -c -++]; - -211 -tx -[ -TEX_VIDEO -]. -buf -[ -o -++] = -i -[ -c -++]; - -212 -tx -[ -TEX_VIDEO -]. -buf -[ -o -++] = 0xff; - -217 -tx -[ -TEX_VIDEO -]. -buf -[ -o -++] = -i -[ -c --3]; - -218 -tx -[ -TEX_VIDEO -]. -buf -[ -o -++] = -i -[ -c --2]; - -219 -tx -[ -TEX_VIDEO -]. -buf -[ -o -++] = -i -[ -c --1]; - -220 -tx -[ -TEX_VIDEO -]. -buf -[ -o -++] = 0xff; - -222 - `glBdTextu - -GL_TEXTURE_2D -, -x -[ -TEX_VIDEO -] ); - -223 - `glTexImage2D - -GL_TEXTURE_2D -, 0, -GL_RGBA -, -tx -[ -TEX_VIDEO -]. -w -,x[TEX_VIDEO]. -h -, 0, GL_RGBA, -GL_UNSIGNED_BYTE -,x[TEX_VIDEO]. -buf - ); - -224 - } -} - -226  - $nd_beg_gl - -mache - * -ic - ) - -228  -i -; - -229 -eshus - = -SDL_TRUE -; - -231 - `upde_video_xtu - -ic - ); - -232  -i -=0; i< -NUM_TZ -; i++ ) - -233 - `upde_xtze_xtu - -ic -, -i - ); - -235 if -ic --> -wpupr - ) - -237 - `memt - -tx -[ -TEX_POPUP -]. -buf -, 0,x[TEX_POPUP]. -w -*tx[TEX_POPUP]. -h -*4 ); - -238  -i -=0; -ic --> -pupr -[i]; i++ ) - -239 - `tch - -TEX_POPUP -, -i -*8, 0, -ic --> -pupr -[i], -gl -[1], gl[0], -SDL_TRUE - ); - -240 - `glBdTextu - -GL_TEXTURE_2D -, -x -[ -TEX_POPUP -] ); - -241 - `glTexImage2D - -GL_TEXTURE_2D -, 0, -GL_RGBA -, -tx -[ -TEX_POPUP -]. -w -,x[TEX_POPUP]. -h -, 0, GL_RGBA, -GL_UNSIGNED_BYTE -,x[TEX_POPUP]. -buf - ); - -242 -ic --> -wpupr - = -SDL_FALSE -; - -245 if -ic --> -wusr - ) - -247 - `memt - -tx -[ -TEX_STATUS -]. -buf -, 0,x[TEX_STATUS]. -w -*tx[TEX_STATUS]. -h -*4 ); - -248  -i -=0; -ic --> -usr -[i]; i++ ) - -249 - `tch - -TEX_STATUS -, -i -*8, 0, -ic --> -usr -[i], -gl -[1], gl[0], -SDL_FALSE - ); - -250 - `glBdTextu - -GL_TEXTURE_2D -, -x -[ -TEX_STATUS -] ); - -251 - `glTexImage2D - -GL_TEXTURE_2D -, 0, -GL_RGBA -, -tx -[ -TEX_STATUS -]. -w -,x[TEX_STATUS]. -h -, 0, GL_RGBA, -GL_UNSIGNED_BYTE -,x[TEX_STATUS]. -buf - ); - -254 - `glCˬC -( -rc -[0], clrcol[1], clrcol[2], 1.0f); - -255 - `glCˬ - -GL_COLOR_BUFFER_BIT - | -GL_DEPTH_BUFFER_BIT - ); - -256 - } -} - -258  - $nd_d_gl - -mache - * -ic - ) - -260 if -ic --> -emu_mode - = -EM_RUNNING - ) - -262 if -ic --> -pupr -[0] ) - -264 - `glBdTextu - -GL_TEXTURE_2D -, -x -[ -TEX_POPUP -] ); - -265 - `glBeg - -GL_QUADS - ); - -266 - `glTexCod2f -0.0f, 0.0); - `glVx3f -( 320.0f, 0.0f, 0.0f ); - -267 - `glTexCod2f -320.0f/512.0f, 0.0); - `glVx3f -( 640.0f, 0.0f, 0.0f ); - -268 - `glTexCod2f -320.0f/512.0f, 12.0f/32.0); - `glVx3f -( 640.0f, 12.0f, 0.0f ); - -269 - `glTexCod2f -0.0f, 12.0f/32.0); - `glVx3f -( 320.0f, 12.0f, 0.0f ); - -270 - `glEnd -(); - -273 if -ic --> -usr -[0] ) - -275 - `glBdTextu - -GL_TEXTURE_2D -, -x -[ -TEX_STATUS -] ); - -276 - `glBeg - -GL_QUADS - ); - -277 - `glTexCod2f -0.0f, 0.0); - `glVx3f -( 0.0f, 466.0f, 0.0f ); - -278 - `glTexCod2f -320.0f/512.0f, 0.0); - `glVx3f -( 320.0f, 466.0f, 0.0f ); - -279 - `glTexCod2f -320.0f/512.0f, 12.0f/32.0); - `glVx3f -( 320.0f, 478.0f, 0.0f ); - -280 - `glTexCod2f -0.0f, 12.0f/32.0); - `glVx3f -( 0.0f, 478.0f, 0.0f ); - -281 - `glEnd -(); - -285 - `SDL_COMPAT_GL_SwBufrs -(); - -286 - } -} - -288  - $rounduow2 - -x - ) - -290 -x ---; - -291 -x - |= x >> 1; - -292 -x - |= x >> 2; - -293 -x - |= x >> 4; - -294 -x - |= x >> 8; - -295 -x - |= x >> 16; - -296 -x -++; - -298  -x -; - -299 - } -} - -301  - $nd_xtze_loc_gl - -mache - * -ic -,  -i - ) - -303 - `nd_xtze__gl - -ic -, -i - ); - -305 if! -tz -[ -i -] ) ; - -307 #ifde -__amigaos4__ - - -312 -tx -[ -i -+ -TEX_TZ -]. -w - = 512; - -313 -tx -[ -i -+ -TEX_TZ -]. -h - = 512; - -315 -tx -[ -i -+ -TEX_TZ -]. -w - = - `rounduow2 - -tz -[i]->w * 8 ); - -316 -tx -[ -i -+ -TEX_TZ -]. -h - = - `rounduow2 - -tz -[i]->h * 12 ); - -318 -tx -[ -i -+ -TEX_TZ -]. -buf - = - `mloc -tx[i+TEX_TZ]. -w -*tx[i+TEX_TZ]. -h -*4 ); - -319 if! -tx -[ -i -+ -TEX_TZ -]. -buf - ) - -321 -tx -[ -i -+ -TEX_TZ -]. -w - = 0; - -322 -tx -[ -i -+ -TEX_TZ -]. -h - = 0; - -326 -tx -[ -i -+ -TEX_TZ -]. -tw - = (()( -tz -[i]-> -w -*8)) / (()tx[i+TEX_TZ].w); - -327 -tx -[ -i -+ -TEX_TZ -]. -th - = (()( -tz -[i]-> -h -*12)) / (()tx[i+TEX_TZ].h); - -329 - `glBdTextu - -GL_TEXTURE_2D -, -x -[ -i -+ -TEX_TZ -] ); - -330 - `glTexPami - -GL_TEXTURE_2D -, -GL_TEXTURE_WRAP_S -, -GL_REPEAT - ); - -331 - `glTexPami - -GL_TEXTURE_2D -, -GL_TEXTURE_WRAP_T -, -GL_REPEAT - ); - -332 - `glTexPami - -GL_TEXTURE_2D -, -GL_TEXTURE_MAG_FILTER -, -GL_LINEAR - ); - -333 - `glTexPami - -GL_TEXTURE_2D -, -GL_TEXTURE_MIN_FILTER -, -GL_LINEAR - ); - -334 - `glTexImage2D - -GL_TEXTURE_2D -, 0, -GL_RGBA -, -tx -[ -i -+ -TEX_TZ -]. -w -,x[i+TEX_TZ]. -h -, 0, GL_RGBA, -GL_UNSIGNED_BYTE -,x[i+TEX_TZ]. -buf - ); - -336 -tz -[ -i -]-> -modifd - = -SDL_TRUE -; - -337 - } -} - -339  - $nd_xtze__gl - -mache - * -ic -,  -i - ) - -341 if -tx -[ -i -+ -TEX_TZ -]. -buf - ) - -343 - ` - -tx -[ -i -+ -TEX_TZ -]. -buf - ); - -344 -tx -[ -i -+ -TEX_TZ -]. -buf - = -NULL -; - -347 -tx -[ -i -+ -TEX_TZ -]. -w - = 0; - -348 -tx -[ -i -+ -TEX_TZ -]. -h - = 0; - -349 - } -} - -351  - $nd_xtze_gl - -mache - * -ic -,  -i - ) - -353 if! -tz -[ -i -] ) ; - -354 if! -tx -[ -i -+ -TEX_TZ -]. -buf - ) ; - -356 - `glBdTextu - -GL_TEXTURE_2D -, -x -[ -i -+ -TEX_TZ -] ); - -357 - `glBeg - -GL_QUADS - ); - -358 - `glTexCod2f -0.0f, 0.0); - `glVx3f - -tz -[ -i -]-> -x -,z[i]-> -y -, 0.0f ); - -359 - `glTexCod2f - -tx -[ -i -+ -TEX_TZ -]. -tw -, 0.0); - `glVx3f - -tz -[i]-> -x -+tz[i]-> -w -*8,z[i]-> -y -, 0.0f ); - -360 - `glTexCod2f - -tx -[ -i -+ -TEX_TZ -]. -tw -,x[i+TEX_TZ]. -th - ); - `glVx3f - -tz -[i]-> -x -+tz[i]-> -w -*8,z[i]-> -y -+tz[i]-> -h -*12, 0.0f ); - -361 - `glTexCod2f -0.0f, -tx -[ -i -+ -TEX_TZ -]. -th - ); - `glVx3f - -tz -[i]-> -x -,z[i]-> -y -+tz[i]-> -h -*12, 0.0f ); - -362 - `glEnd -(); - -363 - } -} - -365  - $nd_r__gl - -x -,  -y -,  -w -,  -h - ) - -367 - } -} - -369  - $nd_gimg_gl - -i -, -St32 - -xp -, St32 -yp - ) - -371 - `glBdTextu - -GL_TEXTURE_2D -, -x -[ -i -+ -TEX_GIMG -] ); - -372 - `glBeg - -GL_QUADS - ); - -373 - `glTexCod2f -0.0f, 0.0); - `glVx3f - -xp -, -yp -, 0.0f ); - -374 - `glTexCod2f - -tx -[ -i -+ -TEX_GIMG -]. -tw -, 0.0); - `glVx3f - -xp -+ -gimgs -[i]. -w -, -yp -, 0.0f ); - -375 - `glTexCod2f - -tx -[ -i -+ -TEX_GIMG -]. -tw -,x[i+TEX_GIMG]. -th - ); - `glVx3f - -xp -+ -gimgs -[i]. -w -, -yp -+gimgs[i]. -h -, 0.0f ); - -376 - `glTexCod2f -0.0f, -tx -[ -i -+ -TEX_GIMG -]. -th - ); - `glVx3f - -xp -, -yp -+ -gimgs -[i]. -h -, 0.0f ); - -377 - `glEnd -(); - -378 - } -} - -380  - $nd_gimg_gl - -i -, -St32 - -xp -, St32 -yp -, St32 -ox -, St32 -oy -, St32 -w -, St32 -h - ) - -382  -xl -, -xt -, -xr -, -xb -; - -384 -xl - = (() -ox -)/(() -tx -[ -i -+ -TEX_GIMG -]. -w -); - -385 -xt - = (() -oy -)/(() -tx -[ -i -+ -TEX_GIMG -]. -h -); - -386 -xr - = (() -ox -+ -w -)/(() -tx -[ -i -+ -TEX_GIMG -].w); - -387 -xb - = (() -oy -+ -h -)/(() -tx -[ -i -+ -TEX_GIMG -].h); - -389 - `glBdTextu - -GL_TEXTURE_2D -, -x -[ -i -+ -TEX_GIMG -] ); - -390 - `glBeg - -GL_QUADS - ); - -391 - `glTexCod2f - -xl -, -xt - ); - `glVx3f - -xp -, -yp -, 0.0f ); - -392 - `glTexCod2f - -xr -, -xt - ); - `glVx3f - -xp -+ -w -, -yp -, 0.0f ); - -393 - `glTexCod2f - -xr -, -xb - ); - `glVx3f - -xp -+ -w -, -yp -+ -h -, 0.0f ); - -394 - `glTexCod2f - -xl -, -xb - ); - `glVx3f - -xp -, -yp -+ -h -, 0.0f ); - -395 - `glEnd -(); - -396 - } -} - -398  - $nd_video_gl - -mache - * -ic -, -SDL_bo - -doubsize - ) - -400  -l -, -r -, -t -, -b -; - -401  -y -; - -403 - `glBdTextu - -GL_TEXTURE_2D -, -x -[ -TEX_VIDEO -] ); - -405 if -doubsize - ) - -407 if -ic --> -htch - ) - -409 -l - = 0.0f; - -410 -r - = 640.f; - -411 -t - = 14.0f; - -412 -b - = 462.0f; - -414 -l - = 320.0f-240.0f; - -415 -r - = 320.0f+240.0f; - -416 if -ic --> -io - && oric-> -vid_eq - ) - -418 -t - = 14.0f + (448.0f-448.0f*(260.0f/308.0f))/2; - -419 -b - = 462.0f - (448.0f-448.0f*(260.0f/308.0f))/2; - -423 -t - = 14.0f; - -424 -b - = 462.0f; - -428 - `glBeg - -GL_QUADS - ); - -429 - `glTexCod2f -0.0f, 0.0); - `glVx3f - -l -, -t -, 0.0f ); - -430 - `glTexCod2f -240.0f/256.0f, 0.0); - `glVx3f - -r -, -t -, 0.0f ); - -431 - `glTexCod2f -240.0f/256.0f, 224.0f/256.0); - `glVx3f - -r -, -b -, 0.0f ); - -432 - `glTexCod2f -0.0f, 224.0f/256.0); - `glVx3f - -l -, -b -, 0.0f ); - -433 - `glEnd -(); - -435 if -ic --> -lgho - ) - -437  -offs - = ( -ic --> -htch -) ? 3.2f : 2.2f; - -438 - `glC4ub -( 255, 255, 255, 64 ); - -439 - `glBeg - -GL_QUADS - ); - -440 - `glTexCod2f -0.0f, 0.0); - `glVx3f - -l -+ -offs -, -t -, 0.0f ); - -441 - `glTexCod2f -240.0f/256.0f, 0.0); - `glVx3f - -r -+ -offs -, -t -, 0.0f ); - -442 - `glTexCod2f -240.0f/256.0f, 224.0f/256.0); - `glVx3f - -r -+ -offs -, -b -, 0.0f ); - -443 - `glTexCod2f -0.0f, 224.0f/256.0); - `glVx3f - -l -+ -offs -, -b -, 0.0f ); - -444 - `glEnd -(); - -445 - `glC4ub -( 255, 255, 255, 255 ); - -448 if! -ic --> -sƚes - ) ; - -450 - `glBdTextu - -GL_TEXTURE_2D -, -x -[ -TEX_SCANLINES -] ); - -451 - `glBeg - -GL_QUADS - ); - -452  -y -=14; y<224*2+14; y+=32 ) - -454 - `glTexCod2f -0.0f, 0.0); - `glVx3f - -l -, -y -, 0.0f ); - -455 - `glTexCod2f -1.0f, 0.0); - `glVx3f - -r -, -y -, 0.0f ); - -456 - `glTexCod2f -1.0f, 1.0); - `glVx3f - -r -, -y -+32, 0.0f ); - -457 - `glTexCod2f -0.0f, 1.0); - `glVx3f - -l -, -y -+32, 0.0f ); - -459 - `glEnd -(); - -463 - `glBeg - -GL_QUADS - ); - -464 - `glTexCod2f -0.0f, 0.0); - `glVx3f -( 0.0f, 4.0f, 0.0f ); - -465 - `glTexCod2f -240.0f/256.0f, 0.0); - `glVx3f -( 240.0f, 4.0f, 0.0f ); - -466 - `glTexCod2f -240.0f/256.0f, 224.0f/256.0); - `glVx3f -( 240.0f, 228.0f, 0.0f ); - -467 - `glTexCod2f -0.0f, 224.0f/256.0); - `glVx3f -( 0.0f, 228.0f, 0.0f ); - -468 - `glEnd -(); - -469 - } -} - -471  - $e_nd_gl - -mache - * -ic - ) - -473 -St32 - -i -; - -475 -sn - = -NULL -; - -476 -dodx - = -SDL_FALSE -; - -478  -i -=0; i< -NUM_TEXTURES -; i++ ) - -480 -tx -[ -i -]. -w - = 0; - -481 -tx -[ -i -]. -h - = 0; - -482 -tx -[ -i -]. -buf - = -NULL -; - -484 - } -} - -486 -SDL_bo - - $nd_toggfusn_gl - -mache - * -ic - ) - -488 #i - `defed -( -__amigaos4__ -|| defed( -__lux__ -) - -490 if - `SDL_COMPAT_WM_ToggFuSn - -sn - ) ) - -492 -fusn - = !fullscreen; - -493  -SDL_TRUE -; - -496  -SDL_FALSE -; - -498 -ic --> - `shut_nd -( oric ); - -499 -fusn - = !fullscreen; - -500 if -ic --> - `_nd -i -SDL_TRUE -; - -501 - `t_nd_mode - -ic -, -RENDERMODE_NULL - ); - -502 -ic --> -emu_mode - = -EM_PLEASEQUIT -; - -503  -SDL_FALSE -; - -505 - } -} - -507  -SDL_bo - - $go_go_gadg_xtu - -i -,  -w -,  -h -,  -bndty -, -SDL_bo - -΋ximg2d - ) - -509 -tx -[ -i -]. -w - = w; - -510 -tx -[ -i -]. -h - = h; - -511 -tx -[ -i -]. -buf - = - `mloc - -w -* -h -*4 ); - -512 if! -tx -[ -i -]. -buf - )  -SDL_FALSE -; - -514 - `memt - -tx -[ -i -]. -buf -, 0, -w -* -h -*4 ); - -516 - `glBdTextu - -GL_TEXTURE_2D -, -x -[ -i -] ); - -517 - `glTexPami - -GL_TEXTURE_2D -, -GL_TEXTURE_WRAP_S -, -GL_CLAMP - ); - -518 - `glTexPami - -GL_TEXTURE_2D -, -GL_TEXTURE_WRAP_T -, -GL_CLAMP - ); - -519 - `glTexPami - -GL_TEXTURE_2D -, -GL_TEXTURE_MAG_FILTER -, -bndty - ); - -520 - `glTexPami - -GL_TEXTURE_2D -, -GL_TEXTURE_MIN_FILTER -, -bndty - ); - -521 if -΋ximg2d - ) - `glTexImage2D - -GL_TEXTURE_2D -, 0, -GL_RGBA -, -w -, -h -, 0, GL_RGBA, -GL_UNSIGNED_BYTE -, -tx -[ -i -]. -buf - ); - -523  -SDL_TRUE -; - -524 - } -} - -526 -SDL_bo - - $_nd_gl - -mache - * -ic - ) - -528  -dth -, -i -, -x -, -y -; - -529  -BsPPix - = - `SDL_COMPAT_GBsPPix -(); - -531 -dth - = 32; - -532 if -BsPPix - ) - -533 -dth - = -BsPPix -; - -535 i( -ic --> -show_keybrd -) { - -536 -sn - = - `SDL_COMPAT_SVideoMode -640, 480+240, -dth -, -fusn - ? -SDL_COMPAT_OPENGL -| -SDL_COMPAT_FULLSCREEN - : SDL_COMPAT_OPENGL ); - -538 -sn - = - `SDL_COMPAT_SVideoMode -640, 480, -dth -, -fusn - ? -SDL_COMPAT_OPENGL -| -SDL_COMPAT_FULLSCREEN - : SDL_COMPAT_OPENGL ); - -541 if! -sn - ) - -543 - `tf -( "SDL video failed\n" ); - -544  -SDL_FALSE -; - -547 - `glMrixMode - -GL_PROJECTION - ); - -548 i( -ic --> -show_keybrd -) { - -549 - `glOho -( 0.0f, 640.0f, 480.0f+240.0f, 0.0f, 0.0f, 1.0f ); - -551 - `glOho -( 0.0f, 640.0f, 480.0f, 0.0f, 0.0f, 1.0f ); - -553 - `glMrixMode - -GL_MODELVIEW - ); - -554 - `glLdIdty -(); - -555 - `glDib - -GL_DEPTH_TEST - ); - -556 - `glC4ub -( 255, 255, 255, 255 ); - -558 - `glGTextus - -NUM_TEXTURES -, -x - ); - -559 -dodx - = -SDL_TRUE -; - -561 - `glBndFunc - -GL_SRC_ALPHA -, -GL_ONE_MINUS_SRC_ALPHA - ); - -562 - `glEb - -GL_TEXTURE_2D - ); - -563 - `glEb - -GL_BLEND - ); - -566 if! - `go_go_gadg_xtu - -TEX_VIDEO -, 256, 256, -GL_LINEAR -, -SDL_TRUE - ) )  -SDL_FALSE -; - -567 if! - `go_go_gadg_xtu - -TEX_SCANLINES -, 32, 32, -GL_NEAREST -, -SDL_FALSE - ) )  SDL_FALSE; - -568 if! - `go_go_gadg_xtu - -TEX_STATUS -, 512, 32, -GL_NEAREST -, -SDL_TRUE - ) )  -SDL_FALSE -; - -569 if! - `go_go_gadg_xtu - -TEX_POPUP -, 512, 32, -GL_NEAREST -, -SDL_TRUE - ) )  -SDL_FALSE -; - -571  -y -=0; y<32; y++ ) - -573  -x -=0; x<32*4; ) - -575 -tx -[ -TEX_SCANLINES -]. -buf -[ -y -*32*4+ -x -++] = 0x00; - -576 -tx -[ -TEX_SCANLINES -]. -buf -[ -y -*32*4+ -x -++] = 0x00; - -577 -tx -[ -TEX_SCANLINES -]. -buf -[ -y -*32*4+ -x -++] = 0x00; - -578 -tx -[ -TEX_SCANLINES -]. -buf -[ -y -*32*4+ -x -++] = (y&1) ? 0x30 : 0x00; - -581 - `glBdTextu - -GL_TEXTURE_2D -, -x -[ -TEX_SCANLINES -] ); - -582 - `glTexImage2D - -GL_TEXTURE_2D -, 0, -GL_RGBA -, -tx -[ -TEX_SCANLINES -]. -w -,x[TEX_SCANLINES]. -h -, 0, GL_RGBA, -GL_UNSIGNED_BYTE -,x[TEX_SCANLINES]. -buf - ); - -584  -i -=0; i< -NUM_GIMG -; i++ ) - -586 if! - `go_go_gadg_xtu - -i -+ -TEX_GIMG -, - `rounduow2 - -gimgs -[i]. -w - ),ounduow2gimgs[i]. -h - ), -GL_NEAREST -, -SDL_FALSE - ) )  SDL_FALSE; - -588 -tx -[ -i -+ -TEX_GIMG -]. -tw - = (() -gimgs -[i]. -w -) / (()tx[i+TEX_GIMG].w); - -589 -tx -[ -i -+ -TEX_GIMG -]. -th - = (() -gimgs -[i]. -h -) / (()tx[i+TEX_GIMG].h); - -591  -y -=0; y< -gimgs -[ -i -]. -h -; y++ ) - -593  -x -=0; x< -gimgs -[ -i -]. -w -; x++ ) - -595 -tx -[ -i -+ -TEX_GIMG -]. -buf -[( -y -*tx[i+TEX_GIMG]. -w -+ -x -)*4 ] = -gimgs -[i].buf[(y*gimgs[i].w+x)*3]; - -596 -tx -[ -i -+ -TEX_GIMG -]. -buf -[( -y -*tx[i+TEX_GIMG]. -w -+ -x -)*4+1] = -gimgs -[i].buf[(y*gimgs[i].w+x)*3+1]; - -597 -tx -[ -i -+ -TEX_GIMG -]. -buf -[( -y -*tx[i+TEX_GIMG]. -w -+ -x -)*4+2] = -gimgs -[i].buf[(y*gimgs[i].w+x)*3+2]; - -598 -tx -[ -i -+ -TEX_GIMG -]. -buf -[( -y -*tx[i+TEX_GIMG]. -w -+ -x -)*4+3] = 0xff; - -601 - `glTexImage2D - -GL_TEXTURE_2D -, 0, -GL_RGBA -, -tx -[ -i -+ -TEX_GIMG -]. -w -,x[i+TEX_GIMG]. -h -, 0, GL_RGBA, -GL_UNSIGNED_BYTE -,x[i+TEX_GIMG]. -buf - ); - -605  -i -=0; i< -NUM_GUI_COLS -; i++ ) - -607 -gl -[ -i -] = ( -sgl -[i*3]<<24)|(sgpal[i*3+1]<<16)|(sgpal[i*3+2]<<8)|0xff; - -608 -gl -[ -i -] = - `_BE32 -( gpal[i] ); - -611  -i -=0; i< -NUM_TZ -; i++ ) - -612 - `nd_xtze_loc_gl - -ic -, -i - ); - -614 - `SDL_COMPAT_WM_SCti - -APP_NAME_FULL -, APP_NAME_FULL ); - -616 -rc -[0] = (() -sgl -[0*3+0])/255.0f; - -617 -rc -[1] = (() -sgl -[0*3+1])/255.0f; - -618 -rc -[2] = (() -sgl -[0*3+2])/255.0f; - -620 - `u_t_dty - -ic - ); - -622  -SDL_TRUE -; - -623 - } -} - -625  - $shut_nd_gl - -mache - * -ic - ) - -627  -i -; - -629 if -dodx - ) - -631 - `glDeTextus - -NUM_TEXTURES -, -x - ); - -632 -dodx - = -SDL_FALSE -; - -635  -i -=0; i< -NUM_TEXTURES -; i++ ) - -637 if -tx -[ -i -]. -buf - ) - ` -(x[i].buf ); - -638 -tx -[ -i -]. -buf - = -NULL -; - -639 -tx -[ -i -]. -w - = 0; - -640 -tx -[ -i -]. -h - = 0; - -642 - } -} - - @render_gl.h - -22 #ifde -__OPENGL_AVAILABLE__ - - -24  -nd_beg_gl - -mache - * -ic - ); - -25  -nd_d_gl - -mache - * -ic - ); - -26  -nd_xtze_loc_gl - -mache - * -ic -,  -i - ); - -27  -nd_xtze__gl - -mache - * -ic -,  -i - ); - -28  -nd_xtze_gl - -mache - * -ic -,  -i - ); - -29  -nd_r__gl - -x -,  -y -,  -w -,  -h - ); - -30  -nd_gimg_gl - -i -, -St32 - -xp -, St32 -yp - ); - -31  -nd_gimg_gl - -i -, -St32 - -xp -, St32 -yp -, St32 -ox -, St32 -oy -, St32 -w -, St32 -h - ); - -32  -nd_video_gl - -mache - * -ic -, -SDL_bo - -doubsize - ); - -33  -e_nd_gl - -mache - * -ic - ); - -34 -SDL_bo - -_nd_gl - -mache - * -ic - ); - -35 -SDL_bo - -nd_toggfusn_gl - -mache - * -ic - ); - -36  -shut_nd_gl - -mache - * -ic - ); - - @render_null.c - -22  - ~"syem.h -" - -23  - ~"6502.h -" - -24  - ~"v.h -" - -25  - ~"8912.h -" - -26  - ~"disk.h -" - -27  - ~"gui.h -" - -28  - ~"mڙ.h -" - -29  - ~"6551.h -" - -30  - ~"mache.h -" - -31  - ~"nd_nu.h -" - -33  - $nd_beg_nu - -mache - * -ic - ) - -35 - } -} - -37  - $nd_d_nu - -mache - * -ic - ) - -39 - } -} - -41  - $nd_xtze_loc_nu - -mache - * -ic -,  -i - ) - -43 - } -} - -45  - $nd_xtze__nu - -mache - * -ic -,  -i - ) - -47 - } -} - -49  - $nd_xtze_nu - -mache - * -ic -,  -i - ) - -51 - } -} - -53  - $nd_r__nu - -x -,  -y -,  -w -,  -h - ) - -55 - } -} - -57  - $nd_gimg_nu - -i -, -St32 - -xp -, St32 -yp - ) - -59 - } -} - -61  - $nd_gimg_nu - -i -, -St32 - -xp -, St32 -yp -, St32 -ox -, St32 -oy -, St32 -w -, St32 -h - ) - -63 - } -} - -65  - $nd_video_nu - -mache - * -ic -, -SDL_bo - -doubsize - ) - -67 - } -} - -69 -SDL_bo - - $nd_toggfusn_nu - -mache - * -ic - ) - -71  -SDL_TRUE -; - -72 - } -} - -74 -SDL_bo - - $_nd_nu - -mache - * -ic - ) - -76  -SDL_TRUE -; - -77 - } -} - -79  - $shut_nd_nu - -mache - * -ic - ) - -81 - } -} - - @render_null.h - -22  -nd_beg_nu - -mache - * -ic - ); - -23  -nd_d_nu - -mache - * -ic - ); - -24  -nd_xtze_loc_nu - -mache - * -ic -,  -i - ); - -25  -nd_xtze__nu - -mache - * -ic -,  -i - ); - -26  -nd_xtze_nu - -mache - * -ic -,  -i - ); - -27  -nd_r__nu - -x -,  -y -,  -w -,  -h - ); - -28  -nd_gimg_nu - -i -, -St32 - -xp -, St32 -yp - ); - -29  -nd_gimg_nu - -i -, -St32 - -xp -, St32 -yp -, St32 -ox -, St32 -oy -, St32 -w -, St32 -h - ); - -30  -nd_video_nu - -mache - * -ic -, -SDL_bo - -doubsize - ); - -31 -SDL_bo - -nd_toggfusn_nu - -mache - * -ic - ); - -32  -e_nd_nu - -mache - * -ic - ); - -33 -SDL_bo - -_nd_nu - -mache - * -ic - ); - -34  -shut_nd_nu - -mache - * -ic - ); - - @render_sw.c - -22  - ~ - -23  - ~ - -25  - ~"syem.h -" - -26  - ~"6502.h -" - -27  - ~"v.h -" - -28  - ~"8912.h -" - -29  - ~"disk.h -" - -30  - ~"gui.h -" - -31  - ~"mڙ.h -" - -32  - ~"6551.h -" - -33  - ~"mache.h -" - -34  - ~"nd_sw.h -" - -35  - ~"u.h -" - -37  -SDL_Sur - * - gsn -; - -38  -Ut32 - - ggl -[ -NUM_GUI_COLS -]; - -40  -Ut32 - - gpix_size -, - gofft_t -; - -41  -Ut32 - - gl -[8*2]; - -42  -Ut32 - - gdl -[8*2]; - -43  -Ut8 - * - gmgimg -[ -NUM_GIMG -]; - -45 -SDL_bo - -fusn -, -hwsur -; - -46  -SDL_bo - - gedr -; - -47  -xtze - * -tz -[ -NUM_TZ -]; - -48  -sgl -[]; - -49 -Ut8 - -i -[]; - -50  -guiimg - -gimgs -[ -NUM_GIMG -]; - -51 -SDL_bo - -eshus -; - -54  -theft -[]; - -57 (* -tch -) -Ut8 -*, , -Ut32 -, Ut32, -SDL_bo - ); - -60 - $SDL_bo - (* -guiimg_to_img -)( -Ut8 -** -d -, cڡ  -guiimg -* -c -); - -70  - #DEFINE_tch_X_b -( -BIT_DEPTH -) \ - -71  -tch_ - ## -BIT_DEPTH - ## -b - \ - -72 -Ut8 -* -r -,  -ch -, -Ut32 - -fc -, Ut32 -bc -, -SDL_bo - -sidft - ) \ - -74  -x -, -y -, -mask -; \ - -75 cڡ -Ut8 - * -c_by -; \ - -76 -Ut - ## -BIT_DEPTH - * -d_pix -; \ - -77 -Ut8 -* -d_sƚe -; \ - -79 if -ch - > 127 ) ; \ - -81 -c_by - = & -theft -[ -ch -*12]; \ - -83 -d_sƚe - = -r -; \ - -85  -y -=12; y!=0; --y, ++ -c_by -, -d_sƚe -+= -sn --> -pch - ) \ - -87 -d_pix - = ( -Ut - ## -BIT_DEPTH - *) -d_sƚe -; \ - -89  -mask -=0x80, -x -=8; x!=0; --x, ++ -d_pix -, mask>>=1 ) \ - -91 if(* -c_by -)& -mask - ) \ - -92 * -d_pix - = ( -Ut - ## -BIT_DEPTH -) -fc -; \ - -93 if -sidft - ) \ - -94 * -d_pix - = ( -Ut - ## -BIT_DEPTH -) -bc -; \ - -97 - } - - ) -} - -99 - $DEFINE_tch_X_b -(16) - -100 - $DEFINE_tch_X_b -(32) - -104  - $nd_beg_sw - -mache - * -ic - ) - -106  -x -, -y -; - -107 -Ut8 - * -d_sƚe -; - -109 if - `SDL_MUSTLOCK - -sn - ) ) - -110 - `SDL_LockSur - -sn - ); - -112 if -ic --> -wpupr - ) - -114 -d_sƚe - = ( -Ut8 -*) -sn --> -pixs -; - -115 -d_sƚe - +320 * -pix_size -; - -117 if -ic --> -sw_dth - == 16 ) - -119 -Ut16 - * -d_pix -; - -120  -y -=12; y!=0; --y, -d_sƚe - + -sn --> -pch -) - -122 -d_pix - = ( -Ut16 - *) -d_sƚe -; - -123  -x -=320; x<640; x++, -d_pix -++ ) - -124 * -d_pix - = -gl -[0]; - -127 -Ut32 - * -d_pix -; - -128  -y -=12; y!=0; --y, -d_sƚe - + -sn --> -pch -) - -130 -d_pix - = ( -Ut32 - *) -d_sƚe -; - -131  -x -=320; x<640; x++, -d_pix -++ ) - -132 * -d_pix - = -gl -[0]; - -135 -ic --> -wpupr - = -SDL_FALSE -; - -138 if -ic --> -wusr - ) - -140 -eshus - = -SDL_TRUE -; - -141 -ic --> -wusr - = -SDL_FALSE -; - -143 - } -} - -145  - $nd_d_sw - -mache - * -ic - ) - -147  -i -; - -148 -Ut32 - -ch_pch -; - -149 -Ut8 - * -d_pix -; - -151 -ch_pch - = 8 * -pix_size -; - -153 if -ic --> -emu_mode - = -EM_RUNNING - ) - -155 if -ic --> -pupr -[0] ) - -157 -d_pix - = ( -Ut8 -*) -sn --> -pixs -; - -158 -d_pix - +320 * -pix_size -; - -160  -i -=0; -ic --> -pupr -[i]; i++, -d_pix - + -ch_pch - ) - -161 - `tch - -d_pix -, -ic --> -pupr -[ -i -], -gl -[1], gl[0], -SDL_TRUE - ); - -164 if -ic --> -usr -[0] ) - -166 -d_pix - = ( -Ut8 -*) -sn --> -pixs -; - -167 -d_pix - +466 * -sn --> -pch -; - -169  -i -=0; -ic --> -usr -[i]; i++, -d_pix - + -ch_pch - ) - -170 - `tch - -d_pix -, -ic --> -usr -[ -i -], -gl -[1], 0, -SDL_FALSE - ); - -174 if - `SDL_MUSTLOCK - -sn - ) ) - -175 - `SDL_UockSur - -sn - ); - -177 - `SDL_COMPAT_Fl - -sn - ); - -178 - } -} - -180  - $nd_xtze_loc_sw - -mache - * -ic -,  -i - ) - -182 - } -} - -184  - $nd_xtze__sw - -mache - * -ic -,  -i - ) - -186 - } -} - -188  - $nd_xtze_sw - -mache - * -ic -,  -i - ) - -190  -x -, -y -, -o -; - -191 -Ut32 - -ch_pch -; - -192  -xtze - * -z - = -tz -[ -i -]; - -193 -Ut8 - * -d_sƚe -, * -d_pix -; - -195 -ch_pch - = 8 * -pix_size -; - -197 -d_sƚe - = ( -Ut8 - *) -sn --> -pixs -; - -198 -d_sƚe - + -sn --> -pch - * -z --> -y - + -pix_size - *tz-> -x -; - -200 -o - = 0; - -201  -y -= -z --> -h -; y!=0; --y, -d_sƚe -+=12* -sn --> -pch - ) - -203 -d_pix - = -d_sƚe -; - -205  -x -= -z --> -w -; x!=0; --x, ++ -o -, -d_pix -+= -ch_pch - ) - -206 - `tch - -d_pix -, -z --> -tx -[ -o -], -gl -[z-> -fc -[o]], gl[z-> -bc -[o]], -SDL_TRUE - ); - -209 - } -} - -212  - $nd_r__sw - -x -,  -y -,  -w -,  -h - ) - -214 -Ut8 - * -d_sƚe -; - -215 -St32 - -i -; - -217 -d_sƚe - = ( -Ut8 - *) -sn --> -pixs -; - -218 -d_sƚe - + -sn --> -pch - * -y - + -pix_size - * -x -; - -220  -i -=0; i< -h -; i++, -d_sƚe -+= -sn --> -pch - ) - -221 - `memt - -d_sƚe -, 0, -pix_size -* -w - ); - -222 - } -} - -225  - $nd_gimg_sw - -img_id -, -St32 - -xp -, St32 -yp - ) - -227  -guiimg - * -gi - = & -gimgs -[ -img_id -]; - -228 -Ut8 - * -c_sƚe -, * -d_sƚe -; - -229 -St32 - -i -; - -231 -c_sƚe - = -mgimg -[ -img_id -]; - -233 -d_sƚe - = ( -Ut8 - *) -sn --> -pixs -; - -234 -d_sƚe - + -sn --> -pch - * -yp - + -pix_size - * -xp -; - -236  -i -= -gi --> -h -; i!=0; --i, -c_sƚe -+= -pix_size -*gi-> -w -, -d_sƚe -+= -sn --> -pch - ) - -237 - `memy - -d_sƚe -, -c_sƚe -, -pix_size -* -gi --> -w - ); - -238 - } -} - -241  - $nd_gimg_sw - -img_id -, -St32 - -xp -, St32 -yp -, St32 -ox -, St32 -oy -, St32 -w -, St32 -h - ) - -243  -guiimg - * -gi - = & -gimgs -[ -img_id -]; - -244 -Ut8 - * -c_sƚe -, * -d_sƚe -; - -245 -St32 - -i -; - -247 -c_sƚe - = -mgimg -[ -img_id -]; - -248 -c_sƚe - + -pix_size -*( -gi --> -w - * -oy - + -ox -); - -250 -d_sƚe - = ( -Ut8 - *) -sn --> -pixs -; - -251 -d_sƚe - + -sn --> -pch - * -yp - + -pix_size - * -xp -; - -253  -i -= -h -; i!=0; --i, -c_sƚe -+= -pix_size -* -gi --> -w -, -d_sƚe -+= -sn --> -pch - ) - -254 - `memy - -d_sƚe -, -c_sƚe -, -pix_size -* -w - ); - -255 - } -} - -258  - $nd_video_sw_16b - -mache - * -ic -, -SDL_bo - -doubsize - ) - -260  -x -, -y -; - -261 -Ut8 - * -c_pix -; - -262 -St32 - -d_pch_x2 -; - -263 -Ut32 - -c -; - -264 -Ut8 - * -d_sƚe -, * -d_ev_sƚe -, * -d_odd_sƚe -; - -265 -Ut16 - * -d_pix -; - -266 -Ut32 - * -d_ev_pix -, * -d_odd_pix -; - -268 if! -ic --> -s - ) - -271 if -doubsize - ) - -273 if -edr - ) - -275 - `SDL_FlRe -( -sn -, -NULL -, -gl -[0]); - -276 -edr - = -SDL_FALSE -; - -279 -c_pix - = -ic --> -s -; - -281 -d_pch_x2 - = 2 * -sn --> -pch -; - -283 -d_ev_sƚe - = (( -Ut8 -*) -sn --> -pixs -+ -offt_t -; - -285 -d_odd_sƚe - = -d_ev_sƚe -; - -286 -d_odd_sƚe - + -sn --> -pch -; - -288 if -ic --> -sƚes - ) - -290  -y -=0; y<224; y++, -d_ev_sƚe -+= -d_pch_x2 -, -d_odd_sƚe -+=dst_pitch_x2 ) - -292 i(! -ic --> -vid_dty -[ -y -]) - -294 -c_pix - += 240; - -297 -d_ev_pix - = ( -Ut32 -*) -d_ev_sƚe -; - -298 -d_odd_pix - = ( -Ut32 -*) -d_odd_sƚe -; - -300  -x -=240; x!=0; --x ) - -302 -c - = *( -c_pix -++); - -303 *( -d_ev_pix -++ -dl -[ -c -]; - -304 *( -d_odd_pix -++ -dl -[ -c -+8]; - -306 -ic --> -vid_dty -[ -y -] = -SDL_FALSE -; - -310  -y -=0; y<224; y++, -d_ev_sƚe -+= -d_pch_x2 -, -d_odd_sƚe -+=dst_pitch_x2 ) - -312 i(! -ic --> -vid_dty -[ -y -]) - -314 -c_pix - += 240; - -317 -d_ev_pix - = ( -Ut32 -*) -d_ev_sƚe -; - -318 -d_odd_pix - = ( -Ut32 -*) -d_odd_sƚe -; - -320  -x -=240; x!=0; --x ) - -322 -c - = -dl -[*( -c_pix -++)]; - -323 *( -d_ev_pix -++ -c -; - -324 *( -d_odd_pix -++ -c -; - -326 -ic --> -vid_dty -[ -y -] = -SDL_FALSE -; - -332 -edr - = -SDL_TRUE -; - -334 -c_pix - = -ic --> -s -; - -335 -d_sƚe - = ( -Ut8 -*) -sn --> -pixs -; - -337  -y -=0; y<4; y++ ) - -339 - `memt - -d_sƚe -, 0, 240* -pix_size - ); - -340 -d_sƚe - + -sn --> -pch -; - -342  ; -y -<228; y++, -d_sƚe -+= -sn --> -pch - ) - -344 -d_pix - = ( -Ut16 -*) -d_sƚe -; - -346  -x -=240; x!=0; --x ) - -347 *( -d_pix -++( -Ut16 -) -l -[*( -c_pix -++)]; - -349 - } -} - -352  - $nd_video_sw_32b - -mache - * -ic -, -SDL_bo - -doubsize - ) - -354  -x -, -y -; - -355 -Ut8 - * -c_pix -; - -356 -St32 - -d_pch_x2 -; - -357 -Ut32 - -c -, -c2 -; - -358 -Ut8 - * -d_sƚe -, * -d_ev_sƚe -, * -d_odd_sƚe -; - -359 -Ut32 - * -d_pix -, * -d_ev_pix -, * -d_odd_pix -; - -361 if! -ic --> -s - ) - -364 if -doubsize - ) - -366 if -edr - ) - -368 - `SDL_FlRe -( -sn -, -NULL -, -gl -[0]); - -369 -edr - = -SDL_FALSE -; - -372 -c_pix - = -ic --> -s -; - -374 -d_pch_x2 - = 2 * -sn --> -pch -; - -376 -d_ev_sƚe - = (( -Ut8 -*) -sn --> -pixs -+ -offt_t -; - -378 -d_odd_sƚe - = -d_ev_sƚe -; - -379 -d_odd_sƚe - + -sn --> -pch -; - -381 if -ic --> -sƚes - ) - -383  -y -=0; y<224; y++, -d_ev_sƚe -+= -d_pch_x2 -, -d_odd_sƚe -+=dst_pitch_x2 ) - -385 i(! -ic --> -vid_dty -[ -y -]) - -387 -c_pix - += 240; - -390 -d_ev_pix - = ( -Ut32 -*) -d_ev_sƚe -; - -391 -d_odd_pix - = ( -Ut32 -*) -d_odd_sƚe -; - -393  -x -=240; x!=0; --x ) - -395 -c2 - = -l -[(* -c_pix -)+8]; - -396 -c - = -l -[*( -c_pix -++)]; - -398 *( -d_ev_pix -++ -c -; - -399 *( -d_ev_pix -++ -c -; - -400 *( -d_odd_pix -++ -c2 -; - -401 *( -d_odd_pix -++ -c2 -; - -404 -ic --> -vid_dty -[ -y -] = -SDL_FALSE -; - -408  -y -=0; y<224; y++, -d_ev_sƚe -+= -d_pch_x2 -, -d_odd_sƚe -+=dst_pitch_x2 ) - -410 i(! -ic --> -vid_dty -[ -y -]) - -412 -c_pix - += 240; - -415 -d_ev_pix - = ( -Ut32 -*) -d_ev_sƚe -; - -416 -d_odd_pix - = ( -Ut32 -*) -d_odd_sƚe -; - -418  -x -=240; x!=0; --x ) - -420 -c - = -l -[*( -c_pix -++)]; - -422 *( -d_ev_pix -++ -c -; - -423 *( -d_ev_pix -++ -c -; - -424 *( -d_odd_pix -++ -c -; - -425 *( -d_odd_pix -++ -c -; - -427 -ic --> -vid_dty -[ -y -] = -SDL_FALSE -; - -433 -edr - = -SDL_TRUE -; - -435 -c_pix - = -ic --> -s -; - -436 -d_sƚe - = ( -Ut8 -*) -sn --> -pixs -; - -438  -y -=0; y<4; y++ ) - -440 - `memt - -d_sƚe -, 0, 240* -pix_size - ); - -441 -d_sƚe - + -sn --> -pch -; - -444  ; -y -<228; y++, -d_sƚe -+= -sn --> -pch - ) - -446 -d_pix - = ( -Ut32 -*) -d_sƚe -; - -448  -x -=240; x!=0; --x ) - -449 *( -d_pix -++ -l -[*( -c_pix -++)]; - -451 - } -} - -453  - $nd_sw_devideo - -mache - * -ic - ) - -455  -BsPPix - = - `SDL_COMPAT_GBsPPix -(); - -458 -ic --> -sw_dth - = 16; - -460  -BsPPix - ) - -467 -ic --> -sw_dth - = -BsPPix -; - -473 - } -} - -475  - $e_nd_sw - -mache - * -ic - ) - -477 -St32 - -i -; - -480 -sn - = -NULL -; - -483  -i -=0; i< -NUM_GIMG -; i++ ) - -484 -mgimg -[ -i -] = -NULL -; - -485 - } -} - -487 -SDL_bo - - $nd_toggfusn_sw - -mache - * -ic - ) - -489 #i - `defed -( -__amigaos4__ -|| defed( -__lux__ -|| defed( -__MORPHOS__ -) - -491 if - `SDL_COMPAT_WM_ToggFuSn - -sn - ) ) - -493 -fusn - = !fullscreen; - -494  -SDL_TRUE -; - -497  -SDL_FALSE -; - -499 -ic --> - `shut_nd -( oric ); - -500 -fusn - = !fullscreen; - -501 if -ic --> - `_nd -i -SDL_TRUE -; - -502 - `t_nd_mode - -ic -, -RENDERMODE_NULL - ); - -503 -ic --> -emu_mode - = -EM_PLEASEQUIT -; - -504  -SDL_FALSE -; - -506 - } -} - -510  - #DEFINE_guiimg_to_img_X_b -( -BIT_DEPTH -) \ - -511  -SDL_bo - -guiimg_to_img_ - ## -BIT_DEPTH - ## -b - \ - -512 ( -Ut8 -** -d -, cڡ  -guiimg -* -c -) \ - -514 -size_t - -i -; \ - -515 cڡ -Ut8 - * -c_pix -; \ - -516 -Ut - ## -BIT_DEPTH - * -d_pix -; \ - -518 (* -d -( -Ut8 - *) - `mloc - -c --> -w -*c-> -h -*( -Ut - ## -BIT_DEPTH -) ); \ - -519 i((* -d -= -NULL -) \ - -520  -SDL_FALSE -; \ - -522 -c_pix - = -c --> -buf -; \ - -523 -d_pix - = ( -Ut - ## -BIT_DEPTH - *)(* -d -); \ - -525  -i -= -c --> -w -*c-> -h -; i!=0; --i, -c_pix - +3, ++ -d_pix - ) \ - -526 (* -d_pix -) = \ - -527 ( -Ut - ## -BIT_DEPTH -) - `SDL_MRGB - -sn --> -fm -, \ - -528 -c_pix -[0], \ - -529 -c_pix -[1], \ - -530 -c_pix -[2] ); \ - -532  -SDL_TRUE -; \ - -533 } - - ) - -535 - $DEFINE_guiimg_to_img_X_b -(16) - -536 - $DEFINE_guiimg_to_img_X_b -(32) - -540 -SDL_bo - - $_nd_sw - -mache - * -ic - ) - -542  -i -; - -543 * -l_ -; - -544 -St32 - -surmode -; - -546 -pix_size - = -ic --> -sw_dth - / 8; - -548 -surmode - = -fusn - ? -SDL_COMPAT_FULLSCREEN - : -SDL_SWSURFACE -; - -549 if -hwsur - ) { -surmode - &~ -SDL_SWSURFACE -; surmod| -SDL_COMPAT_HWSURFACE -; } - -552 i( -ic --> -show_keybrd -) { - -553 -sn - = - `SDL_COMPAT_SVideoMode -640, 480+240, -ic --> -sw_dth -, -surmode - ); - -555 -sn - = - `SDL_COMPAT_SVideoMode -640, 480, -ic --> -sw_dth -, -surmode - ); - -558 if! -sn - ) - -560 - `tf -( "SDL video failed\n" ); - -561  -SDL_FALSE -; - -564 - `SDL_COMPAT_WM_SCti - -APP_NAME_FULL -, APP_NAME_FULL ); - -567 i( -ic --> -sw_dth - == 16) { - -568 -tch - = -tch_16b -; - -569 -guiimg_to_img - = -guiimg_to_img_16b -; - -572 i( -ic --> -sw_dth - == 32) { - -573 -tch - = -tch_32b -; - -574 -guiimg_to_img - = -guiimg_to_img_32b -; - -579 -l_ - = -sgl -; - -580  -i -=0; i< -NUM_GUI_COLS -; i++, -l_ -+=3 ) - -581 -gl -[ -i -] = - `SDL_MRGB - -sn --> -fm -, -l_ -[0],al_it[1],al_it[2] ); - -584 -l_ - = -i -; - -585  -i -=0; i<8; i++, -l_ -+=3 ) - -587 -l -[ -i - ] = - `SDL_MRGB - -sn --> -fm -, -l_ -[0],al_it[1],al_it[2] ); - -588 -l -[ -i -+8] = - `SDL_MRGB - -sn --> -fm -, -l_ -[0]/2,al_it[1]/2,al_it[2]/2 ); - -592  -i -=0; i< -NUM_GIMG -; i++ ) - -593 i(! - `guiimg_to_img -( -mgimg - + -i -, -gimgs - + i)) - -594  -SDL_FALSE -; - -597  -i -=0; i<8*2; i++ ) - -598 -dl -[ -i -] = ( -l -[i]<<16)|pal[i]; - -601 -edr - = -SDL_TRUE -; - -602 -eshus - = -SDL_TRUE -; - -605 -offt_t - = (240 - 226* -sn --> -pch -; - -606 -offt_t - + -pix_size - * 80; - -608 - `u_t_dty - -ic - ); - -611  -SDL_TRUE -; - -612 - } -} - -614  - $shut_nd_sw - -mache - * -ic - ) - -616 -St32 - -i -; - -618  -i -=0; i< -NUM_GIMG -; i++ ) - -620 if -mgimg -[ -i -] ) - ` -( mgimg[i] ); - -621 -mgimg -[ -i -] = -NULL -; - -625 - } -} - - @render_sw.h - -22  -nd_beg_sw - -mache - * -ic - ); - -23  -nd_d_sw - -mache - * -ic - ); - -24  -nd_xtze_loc_sw - -mache - * -ic -,  -i - ); - -25  -nd_xtze__sw - -mache - * -ic -,  -i - ); - -26  -nd_xtze_sw - -mache - * -ic -,  -i - ); - -27  -nd_gimg_sw - -i -, -St32 - -xp -, St32 -yp - ); - -28  -nd_gimg_sw - -i -, -St32 - -xp -, St32 -yp -, St32 -ox -, St32 -oy -, St32 -w -, St32 -h - ); - -29  -nd_video_sw_16b - -mache - * -ic -, -SDL_bo - -doubsize - ); - -30  -nd_video_sw_32b - -mache - * -ic -, -SDL_bo - -doubsize - ); - -31  -nd_r__sw - -x -,  -y -,  -w -,  -h - ); - -32 -SDL_bo - -nd_toggfusn_sw - -mache - * -ic - ); - -33  -e_nd_sw - -mache - * -ic - ); - -34 -SDL_bo - -_nd_sw - -mache - * -ic - ); - -35  -shut_nd_sw - -mache - * -ic - ); - -37  -nd_sw_devideo - -mache - * -ic - ); - - @render_sw8.c - -22  - ~ - -23  - ~ - -25  - ~"syem.h -" - -26  - ~"6502.h -" - -27  - ~"v.h -" - -28  - ~"8912.h -" - -29  - ~"disk.h -" - -30  - ~"gui.h -" - -31  - ~"mڙ.h -" - -32  - ~"6551.h -" - -33  - ~"mache.h -" - -34  - ~"nd_sw8.h -" - -35  - ~"u.h -" - -39  - #GPAL_FIRSTPEN - 20 - - ) - -41  -SDL_Sur - * - gsn -; - -43  -Ut32 - - gofft_t -; - -44  -Ut32 - - gqn -[16*256]; - -46 -SDL_bo - -fusn -, -hwsur -; - -47  -SDL_bo - - gedr -; - -48  -xtze - * -tz -[ -NUM_TZ -]; - -49  -sgl -[]; - -50 -Ut8 - -i -[]; - -51  -guiimg - -gimgs -[ -NUM_GIMG -]; - -52 -SDL_bo - -eshus -; - -53  -Ut8 - * - gmgimg -[ -NUM_GIMG -]; - -54  - gxt_gimgc -; - -55  -SDL_C - - gcours -[256]; - -58  -theft -[]; - -68  - $tch - -Ut8 -* -r -,  -ch -, Ut8 -fc -, Ut8 -bc -, -SDL_bo - -sidft - ) - -70  -x -, -y -, -mask -; - -71 cڡ -Ut8 - * -c_by -; - -72 -Ut8 - * -d_pix -; - -73 -Ut8 - * -d_sƚe -; - -75 if -ch - > 127 ) ; - -77 -c_by - = & -theft -[ -ch -*12]; - -78 -d_sƚe - = -r -; - -80  -y -=12; y!=0; --y, ++ -c_by -, -d_sƚe -+= -sn --> -pch - ) - -82 -d_pix - = -d_sƚe -; - -84  -mask -=0x80, -x -=8; x!=0; --x, ++ -d_pix -, mask>>=1 ) - -86 if(* -c_by -)& -mask - ) - -87 * -d_pix - = -fc -; - -88 if -sidft - ) - -89 * -d_pix - = -bc -; - -92 - } -} - -95  - $nd_beg_sw8 - -mache - * -ic - ) - -97  -y -; - -98 -Ut8 - * -d_sƚe -; - -100 if - `SDL_MUSTLOCK - -sn - ) ) - -101 - `SDL_LockSur - -sn - ); - -103 if -ic --> -wpupr - ) - -105 -d_sƚe - = ( -Ut8 -*) -sn --> -pixs -; - -106 -d_sƚe - += 320; - -108  -y -=12; y!=0; --y, -d_sƚe - + -sn --> -pch -) - -109 - `memt -( -d_sƚe -, -GPAL_FIRSTPEN -, 320); - -110 -ic --> -wpupr - = -SDL_FALSE -; - -113 if -ic --> -wusr - ) - -115 -eshus - = -SDL_TRUE -; - -116 -ic --> -wusr - = -SDL_FALSE -; - -118 - } -} - -120  - $nd_d_sw8 - -mache - * -ic - ) - -122  -i -; - -123 -Ut32 - -ch_pch -; - -124 -Ut8 - * -d_pix -; - -126 -ch_pch - = 8; - -128 if -ic --> -emu_mode - = -EM_RUNNING - ) - -130 if -ic --> -pupr -[0] ) - -132 -d_pix - = ( -Ut8 -*) -sn --> -pixs -; - -133 -d_pix - += 320; - -135  -i -=0; -ic --> -pupr -[i]; i++, -d_pix - + -ch_pch - ) - -136 - `tch - -d_pix -, -ic --> -pupr -[ -i -], -GPAL_FIRSTPEN -+1, GPAL_FIRSTPEN, -SDL_TRUE - ); - -139 if -ic --> -usr -[0] ) - -141 -d_pix - = ( -Ut8 -*) -sn --> -pixs -; - -142 -d_pix - +466 * -sn --> -pch -; - -144  -i -=0; -ic --> -usr -[i]; i++, -d_pix - + -ch_pch - ) - -145 - `tch - -d_pix -, -ic --> -usr -[ -i -], -GPAL_FIRSTPEN -+1, 0, -SDL_FALSE - ); - -149 if - `SDL_MUSTLOCK - -sn - ) ) - -150 - `SDL_UockSur - -sn - ); - -152 - `SDL_COMPAT_Fl - -sn - ); - -153 - } -} - -155  - $nd_xtze_loc_sw8 - -mache - * -ic -,  -i - ) - -157 - } -} - -159  - $nd_xtze__sw8 - -mache - * -ic -,  -i - ) - -161 - } -} - -163  - $nd_xtze_sw8 - -mache - * -ic -,  -i - ) - -165  -x -, -y -, -o -; - -166  -xtze - * -z - = -tz -[ -i -]; - -167 -Ut8 - * -d_sƚe -, * -d_pix -; - -169 -d_sƚe - = ( -Ut8 - *) -sn --> -pixs -; - -170 -d_sƚe - + -sn --> -pch - * -z --> -y - +tz-> -x -; - -172 -o - = 0; - -173  -y -= -z --> -h -; y!=0; --y, -d_sƚe -+=12* -sn --> -pch - ) - -175 -d_pix - = -d_sƚe -; - -177  -x -= -z --> -w -; x!=0; --x, ++ -o -, -d_pix -+=8 ) - -178 - `tch - -d_pix -, -z --> -tx -[ -o -], -GPAL_FIRSTPEN -+z-> -fc -[o], GPAL_FIRSTPEN+z-> -bc -[o], -SDL_TRUE - ); - -180 - } -} - -183  - $nd_r__sw8 - -x -,  -y -,  -w -,  -h - ) - -185 -Ut8 - * -d_sƚe -; - -186 -St32 - -i -; - -188 -d_sƚe - = ( -Ut8 - *) -sn --> -pixs -; - -189 -d_sƚe - + -sn --> -pch - * -y - + -x -; - -191  -i -=0; i< -h -; i++, -d_sƚe -+= -sn --> -pch - ) - -192 - `memt - -d_sƚe -, 0, -w - ); - -193 - } -} - -196  - $nd_gimg_sw8 - -img_id -, -St32 - -xp -, St32 -yp - ) - -198  -guiimg - * -gi - = & -gimgs -[ -img_id -]; - -199 -Ut8 - * -c_sƚe -, * -d_sƚe -; - -200 -St32 - -i -; - -202 -c_sƚe - = -mgimg -[ -img_id -]; - -204 -d_sƚe - = ( -Ut8 - *) -sn --> -pixs -; - -205 -d_sƚe - + -sn --> -pch - * -yp - + -xp -; - -207  -i -= -gi --> -h -; i!=0; --i, -c_sƚe -+=gi-> -w -, -d_sƚe -+= -sn --> -pch - ) - -208 - `memy - -d_sƚe -, -c_sƚe -, -gi --> -w - ); - -209 - } -} - -212  - $nd_gimg_sw8 - -img_id -, -St32 - -xp -, St32 -yp -, St32 -ox -, St32 -oy -, St32 -w -, St32 -h - ) - -214  -guiimg - * -gi - = & -gimgs -[ -img_id -]; - -215 -Ut8 - * -c_sƚe -, * -d_sƚe -; - -216 -St32 - -i -; - -218 -c_sƚe - = -mgimg -[ -img_id -]; - -219 -c_sƚe - + -gi --> -w - * -oy - + -ox -; - -221 -d_sƚe - = ( -Ut8 - *) -sn --> -pixs -; - -222 -d_sƚe - + -sn --> -pch - * -yp - + -xp -; - -224  -i -= -h -; i!=0; --i, -c_sƚe -+= -gi --> -w -, -d_sƚe -+= -sn --> -pch - ) - -225 - `memy - -d_sƚe -, -c_sƚe -, -w - ); - -226 - } -} - -229  - $nd_video_sw8 - -mache - * -ic -, -SDL_bo - -doubsize - ) - -231  -x -, -y -; - -232 -Ut16 - * -c_pix -; - -233 -St32 - -d_pch_x2 -; - -234 -Ut32 - -c -; - -235 -Ut8 - * -d_sƚe -, * -d_ev_sƚe -, * -d_odd_sƚe -; - -236 -Ut32 - * -d_ev_pix -, * -d_odd_pix -; - -238 if! -ic --> -s - ) - -241 if -doubsize - ) - -243 if -edr - ) - -245 - `SDL_FlRe -( -sn -, -NULL -, -GPAL_FIRSTPEN -); - -246 -edr - = -SDL_FALSE -; - -249 -c_pix - = ( -Ut16 - *) -ic --> -s -; - -251 -d_pch_x2 - = 2 * -sn --> -pch -; - -253 -d_ev_sƚe - = (( -Ut8 -*) -sn --> -pixs -+ -offt_t -; - -255 -d_odd_sƚe - = -d_ev_sƚe -; - -256 -d_odd_sƚe - + -sn --> -pch -; - -258 if -ic --> -sƚes - ) - -260  -y -=0; y<224; y++, -d_ev_sƚe -+= -d_pch_x2 -, -d_odd_sƚe -+=dst_pitch_x2 ) - -262 i(! -ic --> -vid_dty -[ -y -]) - -264 -c_pix - += 120; - -267 -d_ev_pix - = ( -Ut32 -*) -d_ev_sƚe -; - -268 -d_odd_pix - = ( -Ut32 -*) -d_odd_sƚe -; - -270  -x -=0; x<120; x++ ) - -272 -c - = *( -c_pix -++); - -273 *( -d_ev_pix -++ -qn -[ -c -]; - -274 *( -d_odd_pix -++ -qn -[ -c -+8*257]; - -276 -ic --> -vid_dty -[ -y -] = -SDL_FALSE -; - -280  -y -=0; y<224; y++, -d_ev_sƚe -+= -d_pch_x2 -, -d_odd_sƚe -+=dst_pitch_x2 ) - -282 i(! -ic --> -vid_dty -[ -y -]) - -284 -c_pix - += 120; - -287 -d_ev_pix - = ( -Ut32 -*) -d_ev_sƚe -; - -288 -d_odd_pix - = ( -Ut32 -*) -d_odd_sƚe -; - -290  -x -=0; x<120; x++ ) - -292 -c - = -qn -[*( -c_pix -++)]; - -293 *( -d_ev_pix -++ -c -; - -294 *( -d_odd_pix -++ -c -; - -296 -ic --> -vid_dty -[ -y -] = -SDL_FALSE -; - -302 -edr - = -SDL_TRUE -; - -304 -c_pix - = ( -Ut16 - *) -ic --> -s -; - -305 -d_sƚe - = ( -Ut8 -*) -sn --> -pixs -; - -307  -y -=0; y<4; y++ ) - -309 - `memt - -d_sƚe -, 0, 240 ); - -310 -d_sƚe - + -sn --> -pch -; - -312  ; -y -<228; y++, -d_sƚe -+= -sn --> -pch - ) - -314 - `memy -( -d_sƚe -, -c_pix -, 240); - -315 -c_pix - += 240; - -317 - } -} - -319  - $e_nd_sw8 - -mache - * -ic - ) - -322 -sn - = -NULL -; - -323 - } -} - -325 -SDL_bo - - $nd_toggfusn_sw8 - -mache - * -ic - ) - -327 #i - `defed -( -__amigaos4__ -|| defed( -__lux__ -) - -329 if - `SDL_COMPAT_WM_ToggFuSn - -sn - ) ) - -331 -fusn - = !fullscreen; - -332  -SDL_TRUE -; - -335  -SDL_FALSE -; - -337 -ic --> - `shut_nd -( oric ); - -338 -fusn - = !fullscreen; - -339 if -ic --> - `_nd -i -SDL_TRUE -; - -340 - `t_nd_mode - -ic -, -RENDERMODE_NULL - ); - -341 -ic --> -emu_mode - = -EM_PLEASEQUIT -; - -342  -SDL_FALSE -; - -344 - } -} - -346  - $sim_cour -( -i -,  -r -,  -g -,  -b -) - -348  - `abs -( -r --() -cours -[ -i -].r)+abs( -g --()cours[i].g)+abs( -b --()colours[i].b); - -349 - } -} - -351  - $fd_be_n -( -Ut8 - -r -,  -g -,  -b -) - -353  -i -; - -354  -o_n -=-1, -o_di -=8000; - -357  -i -=0; i< -xt_gimgc -; i++ ) - -359 if( -cours -[ -i -]. -r - ==) && - -360 ( -cours -[ -i -]. -g - == g) && - -361 ( -cours -[ -i -]. -b - == b) ) - -362  -i -; - -364 i( - `sim_cour -( -i -, -r -, -g -, -b -< -o_di -) - -366 -o_n - = -i -; - -367 -o_di - = - `sim_cour -( -i -, -r -, -g -, -b -); - -372 i( -o_di - < 3) - -373  -o_n -; - -376 i( -xt_gimgc - >= 256) - -377  -o_n -; - -379 -cours -[ -xt_gimgc -]. -r - =; - -380 -cours -[ -xt_gimgc -]. -g - = g; - -381 -cours -[ -xt_gimgc -]. -b - = b; - -383  -xt_gimgc -++; - -384 - } -} - -386  -SDL_bo - - $guiimg_to_img -( -Ut8 -** -d -, cڡ  -guiimg -* -c -) - -388 -size_t - -i -; - -389 cڡ -Ut8 - * -c_pix -; - -390 -Ut8 - * -d_pix -; - -392 (* -d -( -Ut8 - *) - `mloc - -c --> -w -*c-> -h - ); - -393 i((* -d -= -NULL -) - -394  -SDL_FALSE -; - -396 -c_pix - = -c --> -buf -; - -397 -d_pix - = * -d -; - -399  -i -= -c --> -w -*c-> -h -; i!=0; --i, -c_pix - +3, ++ -d_pix - ) - -400 (* -d_pix - - `fd_be_n -( -c_pix -[0], src_pixel[1], src_pixel[2]); - -402  -SDL_TRUE -; - -403 - } -} - -405 -SDL_bo - - $_nd_sw8 - -mache - * -ic - ) - -407  -i -, -j -; - -408 -St32 - -surmode -; - -410 -surmode - = -SDL_COMPAT_HWPALETTE -; - -411 if -fusn - ) -surmode - | -SDL_COMPAT_FULLSCREEN -; - -412 if -hwsur - ) -surmode - | -SDL_COMPAT_HWSURFACE -; - -415 -sn - = - `SDL_COMPAT_SVideoMode -640, 480, 8, -surmode - ); - -416 i( -ic --> -show_keybrd -) { - -417 -sn - = - `SDL_COMPAT_SVideoMode -640, 480+240, 8, -surmode - ); - -419 -sn - = - `SDL_COMPAT_SVideoMode -640, 480, 8, -surmode - ); - -422 if! -sn - ) - -424 - `tf -( "SDL video failed\n" ); - -425  -SDL_FALSE -; - -428 - `SDL_COMPAT_WM_SCti - -APP_NAME_FULL -, APP_NAME_FULL ); - -430  -i -=0; i<8; i++ ) - -432 -cours -[ -i -]. -r - = -i -[i*3 ]; - -433 -cours -[ -i -+8]. -r - = -i -[i*3 ]/2; - -434 -cours -[ -i -]. -g - = -i -[i*3+1]; - -435 -cours -[ -i -+8]. -g - = -i -[i*3+1]/2; - -436 -cours -[ -i -]. -b - = -i -[i*3+2]; - -437 -cours -[ -i -+8]. -b - = -i -[i*3+2]/2; - -440  -i -=0; i< -NUM_GUI_COLS -; i++ ) - -442 -cours -[ -i -+ -GPAL_FIRSTPEN -]. -r - = -sgl -[i*3 ]; - -443 -cours -[ -i -+ -GPAL_FIRSTPEN -]. -g - = -sgl -[i*3+1]; - -444 -cours -[ -i -+ -GPAL_FIRSTPEN -]. -b - = -sgl -[i*3+2]; - -447 -xt_gimgc - = -GPAL_FIRSTPEN -+ -NUM_GUI_COLS -; - -450  -i -=0; i< -NUM_GIMG -; i++ ) - -451 i(! - `guiimg_to_img -( -mgimg - + -i -, -gimgs - + i)) - -452  -SDL_FALSE -; - -454 - `SDL_COMPAT_SP - -sn -, -SDL_COMPAT_LOGPAL -| -SDL_COMPAT_PHYSPAL -, -cours -, 0, -xt_gimgc -); - -457  -i -=0; i<8*2; i++ ) - -458  -j -=0; j<8*2; j++ ) - -459 -qn -[( -j -<<8)| -i -] = (j<<24)|(j<<16)|(i<<8)|i; - -462 -edr - = -SDL_TRUE -; - -463 -eshus - = -SDL_TRUE -; - -466 -offt_t - = (240 - 226* -sn --> -pch - + 80; - -468 - `u_t_dty - -ic - ); - -471  -SDL_TRUE -; - -472 - } -} - -474  - $shut_nd_sw8 - -mache - * -ic - ) - -477 - } -} - - @render_sw8.h - -22  -nd_beg_sw8 - -mache - * -ic - ); - -23  -nd_d_sw8 - -mache - * -ic - ); - -24  -nd_xtze_loc_sw8 - -mache - * -ic -,  -i - ); - -25  -nd_xtze__sw8 - -mache - * -ic -,  -i - ); - -26  -nd_xtze_sw8 - -mache - * -ic -,  -i - ); - -27  -nd_gimg_sw8 - -i -, -St32 - -xp -, St32 -yp - ); - -28  -nd_gimg_sw8 - -i -, -St32 - -xp -, St32 -yp -, St32 -ox -, St32 -oy -, St32 -w -, St32 -h - ); - -29  -nd_video_sw8 - -mache - * -ic -, -SDL_bo - -doubsize - ); - -30  -nd_r__sw8 - -x -,  -y -,  -w -,  -h - ); - -31 -SDL_bo - -nd_toggfusn_sw8 - -mache - * -ic - ); - -32  -e_nd_sw8 - -mache - * -ic - ); - -33 -SDL_bo - -_nd_sw8 - -mache - * -ic - ); - -34  -shut_nd_sw8 - -mache - * -ic - ); - - @snapshot.c - -23  - ~ - -24  - ~ - -25  - ~ - -27  - ~"syem.h -" - -28  - ~"6502.h -" - -29  - ~"v.h -" - -30  - ~"8912.h -" - -31  - ~"gui.h -" - -32  - ~"disk.h -" - -33  - ~"mڙ.h -" - -34  - ~"6551.h -" - -35  - ~"mache.h -" - -36  - ~"avi.h -" - -37  - ~"feq.h -" - -38  - ~"ma.h -" - -39  - ~"u.h -" - -40  - ~"joyick.h -" - -41  - ~".h -" - -42  - ~"msgbox.h -" - -44  -diskth -[]; - -46  - #MAX_BLOCK - (262144) - - ) - -47 * - gbuf -; - -48  - goffs - = 0; - -50  - #PUTU32 -( -v - -ok -= - `putu32 -(ok, ( -Ut32 -)v) - - ) - -51  -SDL_bo - - $putu32 -( -SDL_bo - -lok -, -Ut32 - -v -) - -53 i(! -lok - -SDL_FALSE -; - -54 i(( -offs -+4> -MAX_BLOCK - -SDL_FALSE -; - -55 -buf -[ -offs -++] = ( -v ->>24)&0xff; - -56 -buf -[ -offs -++] = ( -v ->>16)&0xff; - -57 -buf -[ -offs -++] = ( -v ->>8)&0xff; - -58 -buf -[ -offs -++] = -v -&0xff; - -59  -SDL_TRUE -; - -60 - } -} - -62  - #PUTU16 -( -v - -ok -= - `putu16 -(ok, ( -Ut16 -)v) - - ) - -63  -SDL_bo - - $putu16 -( -SDL_bo - -lok -, -Ut16 - -v -) - -65 i(! -lok - -SDL_FALSE -; - -66 i(( -offs -+2> -MAX_BLOCK - -SDL_FALSE -; - -67 -buf -[ -offs -++] = ( -v ->>8)&0xff; - -68 -buf -[ -offs -++] = -v -&0xff; - -69  -SDL_TRUE -; - -70 - } -} - -72  - #PUTU8 -( -v - -ok -= - `putu8 -(ok, ( -Ut8 -)v) - - ) - -73  -SDL_bo - - $putu8 -( -SDL_bo - -lok -, -Ut8 - -v -) - -75 i(! -lok - -SDL_FALSE -; - -76 i( -offs - > -MAX_BLOCK - -SDL_FALSE -; - -77 -buf -[ -offs -++] = -v -&0xff; - -78  -SDL_TRUE -; - -79 - } -} - -81  - #PUTDATA -( -da -, -size - -ok -= - `putda -(ok, da, size) - - ) - -82  -SDL_bo - - $putda -( -SDL_bo - -lok -, * -da -, -Ut32 - -size -) - -84 i(! -lok - -SDL_FALSE -; - -85 i(( -offs -+ -size -> -MAX_BLOCK - -SDL_FALSE -; - -86 - `memy -& -buf -[ -offs -], -da -, -size - ); - -87 -offs - + -size -; - -88  -SDL_TRUE -; - -89 - } -} - -91  - #PUTSTR -( -r - -ok -= - `putr -(ok, s) - - ) - -92  -SDL_bo - - $putr -( -SDL_bo - -lok -, * -r -) - -94 i(! -lok - -SDL_FALSE -; - -95 -lok - = - `putu32 -(lok, () - ` -( -r -)+1); - -96  - `putda -( -lok -, (*) -r -, () - ` -(str)+1); - -97 - } -} - -99  - #WRITEBLOCK -( -ok -= - `wreblock -(ok, -f -) - - ) - -100  -SDL_bo - - $wreblock -( -SDL_bo - -lok -, -FILE - * -f -) - -102 i(! -lok - -SDL_FALSE -; - -103 i( -offs - <8 -SDL_TRUE -; - -105 -buf -[4] = (( -offs --8)>>24)&0xff; - -106 -buf -[5] = (( -offs --8)>>16)&0xff; - -107 -buf -[6] = (( -offs --8)>>8)&0xff; - -108 -buf -[7] = ( -offs --8)&0xff; - -110 -lok - = ( - `fwre -( -buf -, -offs -, 1, -f -) == 1); - -111 -offs - = 0; - -112  -lok -; - -113 - } -} - -116  - #NEWBLOCK -( -id - -ok -= - `wblock -(ok, id, -f -) - - ) - -117  -SDL_bo - - $wblock -( -SDL_bo - -lok -, * -id -, -FILE - * -f -) - -119 i(! -lok - -SDL_FALSE -; - -121 i(! - `wreblock -( -lok -, -f -) -SDL_FALSE -; - -124 - `memy -( -buf -, -id -, 4); - -125 -offs - = 8; - -126  -SDL_TRUE -; - -127 - } -} - -129  - #DATABLOCK -( -da -, -n - -ok - = - `dablock -(ok, da,, -f -) - - ) - -130  -SDL_bo - - $dablock -( -SDL_bo - -lok -, * -da -, -Ut32 - -n -, -FILE - * -f -) - -132 -Ut32 - -nbe - = - `_BE32 -( -n -); - -133 i(! -lok - -SDL_FALSE -; - -135 i( -n - =0 -SDL_TRUE -; - -137 i(! - `wreblock -( -lok -, -f -) -SDL_FALSE -; - -139 -lok - = ( - `fwre -("DATA", 4, 1, -f -) == 1); - -140 -lok - &( - `fwre -(& -nbe -, 4, 1, -f -) == 1); - -141 -lok - &( - `fwre -( -da -, -n -, 1, -f -) == 1); - -143 -offs - = 0; - -144  -lok -; - -145 - } -} - -147 -SDL_bo - - $ve_sh -( -mache - * -ic -, * -fame -) - -149 -SDL_bo - -ok - = -SDL_TRUE -; - -150  -m6502 - * -u - = & -ic -->cpu; - -151 -SDL_bo - -do_wd17xx - = -SDL_FALSE -; - -152  -i -, -j -; - -153 -FILE - * -f - = -NULL -; - -155 -buf - = - `mloc -( -MAX_BLOCK -); - -156 i(! -buf -) - -158 - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshot failed: out of memory (1)\n"); - -159  -SDL_FALSE -; - -162 -f - = - `fݒ -( -fame -, "wb"); - -163 i(! -f -) - -165 - `msgbox -( -ic -, -MSGBOX_OK -, "Unableo create snapshot file (2)"); - -166 - ` -( -buf -); - -167  -SDL_FALSE -; - -170 - `NEWBLOCK -("OSN\x00"); - -171 - `PUTU8 -( -ic --> -ty -); - -172 - `PUTU32 -( -ic --> -ovockmu -); - -173 - `PUTU32 -( -ic --> -ovockshi -); - -174 - `PUTU16 -( -ic --> -vsync -); - -175 - `PUTU8 -( -ic --> -romdis -); - -176 - `PUTU8 -( -ic --> -rom -); - -177 - `PUTU8 -( -ic --> -vsynchack -); - -178 - `PUTU8 -( -ic --> -drivy -); - -179 - `PUTU8 -( -ic --> -turbo -); - -180 - `PUTU8 -( -ic --> -vid_mode -); - -181 - `PUTU32 -( -ic --> -keym -); - -182 - `DATABLOCK -( -ic --> -mem -, oric-> -memsize -); - -184 - `NEWBLOCK -("TAP\x00"); - -185 - `PUTU8 -( -ic --> -b -); - -186 - `PUTU8 -( -ic --> -out -); - -187 - `PUTU8 -( -ic --> -ry -); - -188 - `PUTU32 -( -ic --> -n -); - -189 - `PUTU32 -( -ic --> -offs -); - -190 - `PUTU32 -( -ic --> -cou -); - -191 - `PUTU32 -( -ic --> -time -); - -192 - `PUTU32 -( -ic --> -dupbys -); - -193 - `PUTU32 -( -ic --> -hdnd -); - -194 - `PUTU32 -( -ic --> -day -); - -195 - `PUTU8 -( -ic --> -m -); - -196 - `PUTU8 -( -ic --> -turbo_foff -); - -197 - `PUTU8 -( -ic --> -w -); - -198 - `PUTU32 -( -ic --> -nڿwd -); - -199 - `PUTU32 -( -ic --> -hd -); - -200 - `PUTU32 -( -ic --> -turbo_syncack -); - -201 - `DATABLOCK -( -ic --> -buf -, oric-> -n -); - -204 - `NEWBLOCK -("PCH\0x00"); - -205 - `PUTU32 -( -ic --> -pch_fd_d_gme_pc -); - -206 - `PUTU32 -( -ic --> -pch_fd_cve_gme_pc -); - -207 - `PUTU32 -( -ic --> -pch_fd_e_gme_pc -); - -208 - `PUTU32 -( -ic --> -pch_fd__gme_pc -); - -209 - `PUTU32 -( -ic --> -pch_fd_gme_addr -); - -210 - `PUTU8 -( -ic --> -pch_fd_avaab -); - -211 - `PUTU32 -( -ic --> -pch__gsync_pc -); - -212 - `PUTU32 -( -ic --> -pch__gsync_d_pc -); - -213 - `PUTU32 -( -ic --> -pch__gsync_lo_pc -); - -214 - `PUTU32 -( -ic --> -pch__adby_pc -); - -215 - `PUTU32 -( -ic --> -pch__adby_d_pc -); - -216 - `PUTU32 -( -ic --> -pch__adby_eby_addr -); - -217 - `PUTU32 -( -ic --> -pch__adby_ezo_addr -); - -218 - `PUTU32 -( -ic --> -pch__putby_pc -); - -219 - `PUTU32 -( -ic --> -pch__putby_d_pc -); - -220 - `PUTU32 -( -ic --> -pch__cve_d_pc -); - -221 - `PUTU32 -( -ic --> -pch__e_d_pc -); - -222 - `PUTU32 -( -ic --> -pch__wrd_pc -); - -223 - `PUTU32 -( -ic --> -pch__wrd_d_pc -); - -225 - `PUTU8 -( -ic --> -pch__adby_ty -); - -226 - `PUTU8 -( -ic --> -pch__avaab -); - -227 - `PUTU8 -( -ic --> -pch__ve_avaab -); - -230 - `NEWBLOCK -("CPU\x00"); - -231 - `PUTU32 -( -u --> -cyes -); - -232 - `PUTU16 -( -u --> -pc -); - -233 - `PUTU16 -( -u --> -ϡpc -); - -234 - `PUTU16 -( -u --> -lc -); - -235 - `PUTU16 -( -u --> -lct -); - -236 - `PUTU8 -( -u --> -nmi -); - -237 - `PUTU8 -( -u --> -a -); - -238 - `PUTU8 -( -u --> -x -); - -239 - `PUTU8 -( -u --> -y -); - -240 - `PUTU8 -( -u --> - -); - -241 - `PUTU8 -( -MAKEFLAGS -); - -242 - `PUTU8 -( -u --> -q -); - -243 - `PUTU8 -( -u --> -nmicou -); - -244 - `PUTU8 -( -u --> -lc -); - -247 - `NEWBLOCK -("AY\x00\x00"); - -248 - `PUTU8 -( -ic --> -ay -. -bmode -); - -249 - `PUTU8 -( -ic --> -ay -. -eg -); - -250 - `PUTDATA -(& -ic --> -ay -. -egs -[0], -NUM_AY_REGS -); - -251  -i -=0; i<8; i++) - -252 - `PUTU8 -( -ic --> -ay -. -keyes -[ -i -]); - -253  -i -=0; i<3; i++) - -254 - `PUTU32 -( -ic --> -ay -. -tڕ -[ -i -]); - -255 - `PUTU32 -( -ic --> -ay -. -noir -); - -256 - `PUTU32 -( -ic --> -ay -. -vr -); - -257  -i -=0; i<3; i++) - -259 - `PUTU16 -( -ic --> -ay -. -teb -[ -i -]); - -260 - `PUTU16 -( -ic --> -ay -. -noib -[ -i -]); - -261 - `PUTU16 -( -ic --> -ay -. -v -[ -i -]); - -263 - `PUTU16 -( -ic --> -ay -. -wout -); - -264  -i -=0; i<3; i++) - -265 - `PUTU32 -( -ic --> -ay -. - -[ -i -]); - -266 - `PUTU32 -( -ic --> -ay -. -n -); - -267 - `PUTU32 -( -ic --> -ay -. -e -); - -268  -i -=0; i<3; i++) - -270 - `PUTU32 -( -ic --> -ay -. -tڕos -[ -i -]); - -271 - `PUTU32 -( -ic --> -ay -. -te -[ -i -]); - -272 - `PUTU32 -( -ic --> -ay -. -sign -[ -i -]); - -273 - `PUTU32 -( -ic --> -ay -. -out -[ -i -]); - -275 - `PUTU32 -( -ic --> -ay -. -vpos -); - -276 - `PUTU32 -( -ic --> -ay -. -cunoi -); - -277 - `PUTU32 -( -ic --> -ay -. -dck -); - -278 - `PUTU32 -( -ic --> -ay -. -keybday -); - -279 - `PUTU32 -( -ic --> -ay -. -cukeyoffs -); - -282 - `NEWBLOCK -("VIA\x00"); - -283 - `PUTU8 -( -ic --> -v -. -i -); - -284 - `PUTU8 -( -ic --> -v -. -b -); - -285 - `PUTU8 -( -ic --> -v -. -b -); - -286 - `PUTU8 -( -ic --> -v -. -bl -); - -287 - `PUTU8 -( -ic --> -v -. -a -); - -288 - `PUTU8 -( -ic --> -v -. -a -); - -289 - `PUTU8 -( -ic --> -v -. - -); - -290 - `PUTU8 -( -ic --> -v -. -dd -); - -291 - `PUTU8 -( -ic --> -v -. -ddrb -); - -292 - `PUTU8 -( -ic --> -v -. -t1l_l -); - -293 - `PUTU8 -( -ic --> -v -. -t1l_h -); - -294 - `PUTU16 -( -ic --> -v -. -t1c -); - -295 - `PUTU8 -( -ic --> -v -. -t2l_l -); - -296 - `PUTU8 -( -ic --> -v -. -t2l_h -); - -297 - `PUTU16 -( -ic --> -v -. -t2c -); - -298 - `PUTU8 -( -ic --> -v -. - -); - -299 - `PUTU8 -( -ic --> -v -. -a -); - -300 - `PUTU8 -( -ic --> -v -. -p -); - -301 - `PUTU8 -( -ic --> -v -. -r -); - -302 - `PUTU8 -( -ic --> -v -. -1 -); - -303 - `PUTU8 -( -ic --> -v -. -2 -); - -304 - `PUTU8 -( -ic --> -v -. -cb1 -); - -305 - `PUTU8 -( -ic --> -v -. -cb2 -); - -306 - `PUTU8 -( -ic --> -v -. -cou -); - -307 - `PUTU8 -( -ic --> -v -. -t1ld -); - -308 - `PUTU8 -( -ic --> -v -. -t2ld -); - -309 - `PUTU16 -( -ic --> -v -. -time -); - -310 - `PUTU8 -( -ic --> -v -. -t1run -); - -311 - `PUTU8 -( -ic --> -v -. -t2run -); - -312 - `PUTU8 -( -ic --> -v -. -2pul -); - -313 - `PUTU8 -( -ic --> -v -. -cb2pul -); - -314 - `PUTU8 -( -ic --> -v -. -igg -); - -315 - `PUTU32 -( -ic --> -v -. -qb -); - -318  -ic --> -drivy -) - -320  -DRV_JASMIN -: - -321 - `NEWBLOCK -("JSM\x00"); - -322 - `PUTU8 -( -ic --> -jasm -. -ay -); - -323 - `PUTU8 -( -ic --> -jasm -. -romdis -); - -324 -do_wd17xx - = -SDL_TRUE -; - -327  -DRV_MICRODISC -: - -328 - `NEWBLOCK -("MDC\x00"); - -329 - `PUTU8 -( -ic --> -md -. -us -); - -330 - `PUTU8 -( -ic --> -md -. -q -); - -331 - `PUTU8 -( -ic --> -md -. -drq -); - -332 - `PUTU8 -( -ic --> -md -. -diskrom -); - -333 -do_wd17xx - = -SDL_TRUE -; - -336  -DRV_PRAVETZ -: - -338 -Ut8 - -tmp -[ -PRAV_TRACKS_PER_DISK -* -PRAV_RAW_TRACK_SIZE -*2]; - -339 - `NEWBLOCK -("PRV\x00"); - -340 - `PUTU8 -( -ic --> -avz -. -ay -); - -341 - `PUTU8 -( -ic --> -avz -. -romdis -); - -342 - `PUTU16 -( -ic --> -avz -. -exnsi -); - -343 - `PUTU8 -( -ic --> -wddisk -. -c_drive -); - -344 - `PUTU32 -( -ic --> -wddisk -. -cut -); - -346  -i -=0; i<2; i++) - -348 - `PUTU8 -( -ic --> -avz -. -drv -[ -i -]. -vume -); - -349 - `PUTU8 -( -ic --> -avz -. -drv -[ -i -]. - -); - -350 - `PUTU8 -( -ic --> -avz -. -drv -[ -i -]. -m_ -); - -351 - `PUTU8 -( -ic --> -avz -. -drv -[ -i -]. -wre_ady -); - -352 - `PUTU16 -( -ic --> -avz -. -drv -[ -i -]. -by -); - -353 - `PUTU16 -( -ic --> -avz -. -drv -[ -i -]. -hf_ack -); - -354 - `PUTU8 -( -ic --> -avz -. -drv -[ -i -]. -dty -); - -355 - `PUTU8 -( -ic --> -avz -. -drv -[ -i -]. - -); - -360 - `memy -( -tmp -, & -ic --> -avz -. -drv -[0]. -image -[0][0], -PRAV_TRACKS_PER_DISK -* -PRAV_RAW_TRACK_SIZE -); - -361 - `memy -(& -tmp -[ -PRAV_TRACKS_PER_DISK -* -PRAV_RAW_TRACK_SIZE -], & -ic --> -avz -. -drv -[1]. -image -[0][0], PRAV_TRACKS_PER_DISK*PRAV_RAW_TRACK_SIZE); - -362 - `DATABLOCK -( -tmp -, -PRAV_TRACKS_PER_DISK -* -PRAV_RAW_TRACK_SIZE -*2); - -364  -i -=0; i<2; i++) - -366 i(( -ic --> -avz -. -drv -[ -i -]. -pimg - = -NULL -) || - -367 ( -ic --> -avz -. -drv -[ -i -]. -pimg --> -wimage - = -NULL -)) - -370 - `NEWBLOCK -("PVD\x00"); - -371 - `PUTU16 -( -i -); - -372 - `PUTU32 -( -ic --> -wddisk -. -disk -[ -i -]-> -wimag -); - -374 i(( -ic --> -avz -. -drv -[ -i -]. -_r - = -NULL -) || - -375 ( -ic --> -avz -. -drv -[ -i -]. -pimg - = -NULL -) || - -376 ( -ic --> -avz -. -drv -[ -i -]. -pimg --> -wimage - = -NULL -)) - -377 - `PUTU32 -(0xffffffff); - -379 - `PUTU32 -(( -Ut32 -)( -ic --> -avz -. -drv -[ -i -]. -_r - - oric->avz.drv[i]. -pimg --> -wimage -)); - -380 - `DATABLOCK -( -ic --> -wddisk -. -disk -[ -i -]-> -wimage -, oric->wddisk.disk[i]-> -wimag -); - -385 if -do_wd17xx - ) - -387 - `NEWBLOCK -("WDD\x00"); - -388 - `PUTU8 -( -ic --> -wddisk -. -r_us -); - -389 - `PUTU8 -( -ic --> -wddisk -. -r_ack -); - -390 - `PUTU8 -( -ic --> -wddisk -. -r_ -); - -391 - `PUTU8 -( -ic --> -wddisk -. -r_da -); - -392 - `PUTU8 -( -ic --> -wddisk -. -c_drive -); - -393 - `PUTU8 -( -ic --> -wddisk -. -c_side -); - -394 - `PUTU8 -( -ic --> -wddisk -. -c_ack -); - -395 - `PUTU8 -( -ic --> -wddisk -. -c_ -); - -396 - `PUTU8 -( -ic --> -wddisk -. -y -); - -397 - `PUTU8 -( -ic --> -wddisk -. -ϡ__ -); - -398 - `PUTU32 -( -ic --> -wddisk -. -cut -); - -399 - `PUTU32 -( -ic --> -wddisk -. -cuoffs -); - -400 - `PUTU32 -( -ic --> -wddisk -. -dayedt -); - -401 - `PUTU32 -( -ic --> -wddisk -. -dayeddrq -); - -402 - `PUTU32 -( -ic --> -wddisk -. -dius -); - -403 - `PUTU32 -( -ic --> -wddisk -. -ddus -); - -404 - `PUTU32 -( -ic --> -wddisk -. -c -); - -406  -i -=0; i<4; i++) - -408 if -ic --> -wddisk -. -disk -[ -i -] ) - -410 - `NEWBLOCK -("DSK\x00"); - -411 - `PUTU16 -( -ic --> -wddisk -. -disk -[ -i -]-> -drivum -); - -412 - `PUTU16 -( -ic --> -wddisk -. -disk -[ -i -]-> -numacks -); - -413 - `PUTU16 -( -ic --> -wddisk -. -disk -[ -i -]-> -numsides -); - -414 - `PUTU16 -( -ic --> -wddisk -. -disk -[ -i -]-> -geomry -); - -415 - `PUTU16 -( -ic --> -wddisk -. -disk -[ -i -]-> -chedack -); - -416 - `PUTU16 -( -ic --> -wddisk -. -disk -[ -i -]-> -chedside -); - -417 - `PUTU32 -( -ic --> -wddisk -. -disk -[ -i -]-> -wimag -); - -418 - `DATABLOCK -( -ic --> -wddisk -. -disk -[ -i -]-> -wimage -, oric->wddisk.disk[i]-> -wimag -); - -423 i( -ic --> -ty - = -MACH_TELESTRAT -) - -426 - `NEWBLOCK -("BNK\x00"); - -427  -i -=0; i<8; i++) - -428 - `PUTU8 -( -ic --> -_bk -[ -i -]. -ty -); - -429 - `PUTU8 -( -ic --> -_cubk -); - -432 - `NEWBLOCK -("ACI\x00"); - -433 - `PUTDATA -(& -ic --> -_ac -. -gs -[0], -ACIA_LAST -); - -436 - `NEWBLOCK -("TVA\x00"); - -437 - `PUTU8 -( -ic --> -_v -. -i -); - -438 - `PUTU8 -( -ic --> -_v -. -b -); - -439 - `PUTU8 -( -ic --> -_v -. -b -); - -440 - `PUTU8 -( -ic --> -_v -. -bl -); - -441 - `PUTU8 -( -ic --> -_v -. -a -); - -442 - `PUTU8 -( -ic --> -_v -. -a -); - -443 - `PUTU8 -( -ic --> -_v -. - -); - -444 - `PUTU8 -( -ic --> -_v -. -dd -); - -445 - `PUTU8 -( -ic --> -_v -. -ddrb -); - -446 - `PUTU8 -( -ic --> -_v -. -t1l_l -); - -447 - `PUTU8 -( -ic --> -_v -. -t1l_h -); - -448 - `PUTU16 -( -ic --> -_v -. -t1c -); - -449 - `PUTU8 -( -ic --> -_v -. -t2l_l -); - -450 - `PUTU8 -( -ic --> -_v -. -t2l_h -); - -451 - `PUTU16 -( -ic --> -_v -. -t2c -); - -452 - `PUTU8 -( -ic --> -_v -. - -); - -453 - `PUTU8 -( -ic --> -_v -. -a -); - -454 - `PUTU8 -( -ic --> -_v -. -p -); - -455 - `PUTU8 -( -ic --> -_v -. -r -); - -456 - `PUTU8 -( -ic --> -_v -. -1 -); - -457 - `PUTU8 -( -ic --> -_v -. -2 -); - -458 - `PUTU8 -( -ic --> -_v -. -cb1 -); - -459 - `PUTU8 -( -ic --> -_v -. -cb2 -); - -460 - `PUTU8 -( -ic --> -_v -. -cou -); - -461 - `PUTU8 -( -ic --> -_v -. -t1ld -); - -462 - `PUTU8 -( -ic --> -_v -. -t2ld -); - -463 - `PUTU16 -( -ic --> -_v -. -time -); - -464 - `PUTU8 -( -ic --> -_v -. -t1run -); - -465 - `PUTU8 -( -ic --> -_v -. -t2run -); - -466 - `PUTU8 -( -ic --> -_v -. -2pul -); - -467 - `PUTU8 -( -ic --> -_v -. -cb2pul -); - -468 - `PUTU8 -( -ic --> -_v -. -igg -); - -469 - `PUTU32 -( -ic --> -_v -. -qb -); - -473 i( -ic --> -romsyms -. -numsyms -) - -475 - `NEWBLOCK -("SYR\x00"); - -476  -i -=0; i< -ic --> -romsyms -. -numsyms -; i++) - -478 - `PUTSTR -( -ic --> -romsyms -. -syms -[ -i -]. -me -); - -479 - `PUTU16 -( -ic --> -romsyms -. -syms -[ -i -]. -addr -); - -480 - `PUTU16 -( -ic --> -romsyms -. -syms -[ -i -]. -ags -); - -484 i( -ic --> -ursyms -. -numsyms -) - -486 - `NEWBLOCK -("SYU\x00"); - -487  -i -=0; i< -ic --> -ursyms -. -numsyms -; i++) - -489 - `PUTSTR -( -ic --> -ursyms -. -syms -[ -i -]. -me -); - -490 - `PUTU16 -( -ic --> -ursyms -. -syms -[ -i -]. -addr -); - -491 - `PUTU16 -( -ic --> -ursyms -. -syms -[ -i -]. -ags -); - -495 i( -ic --> -ty - = -MACH_TELESTRAT -) - -497  -j -=0; j<8; j++) - -499 i( -ic --> -_bksyms -[ -j -]. -numsyms -) - -501  -me -[8]; - -502 - `rtf -( -me -, "SY%d%c", -j -, 0); - -503 - `NEWBLOCK -( -me -); - -504  -i -=0; i< -ic --> -_bksyms -[ -j -]. -numsyms -; i++) - -506 - `PUTSTR -( -ic --> -_bksyms -[ -j -]. -syms -[ -i -]. -me -); - -507 - `PUTU16 -( -ic --> -romsyms -. -syms -[ -i -]. -addr -); - -508 - `PUTU16 -( -ic --> -romsyms -. -syms -[ -i -]. -ags -); - -515 i(( -u --> -ybp -|| (u-> -ymbp -)) - -517 - `NEWBLOCK -("BKP\x00"); - -518  -i -=0; i<16; i++) - -519 - `PUTU32 -( -u --> -bakpots -[ -i -]); - -520  -i -=0; i<16; i++) - -522 - `PUTU8 -( -u --> -membakpots -[ -i -]. -ags -); - -523 - `PUTU8 -( -u --> -membakpots -[ -i -]. -ϡv -); - -524 - `PUTU16 -( -u --> -membakpots -[ -i -]. -addr -); - -528 - `WRITEBLOCK -(); - -529 - `fo -( -f -); - -530 - ` -( -buf -); - -532 i(! -ok -) - -533 - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshot failed! (3)"); - -535  -ok -; - -536 - } -} - -540  - sblockhd - - -542  - mid -[4]; - -543  - mofft -; - -544  - msize -; - -545 * - mbuf -; - -546  -blockhd - * - mdablock -; - -547  - moffs -; - -550  - gnumhdrs - = 0; - -551  -blockhd - * - gbkh - = -NULL -; - -553  -SDL_bo - - $ghds -( -mache - * -ic -, -FILE - * -f -) - -555  -i -; - -556  -size -, -offt -, -fesize -; - -557  -hdr -[8]; - -559 - `fek -( -f -, 0, -SEEK_END -); - -560 -fesize - = () - `l -( -f -); - -561 - `fek -( -f -, 0, -SEEK_SET -); - -565 -offt - = 0; - -566 -numhdrs - = 0; - -567  -offt - < -fesize -) - -569 i( - `d -( -hdr -, 8, 1, -f -) != 1) - -571 - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshotoad failed: Readrror (4)"); - -572 -numhdrs - = 0; - -573  -SDL_FALSE -; - -576 -size - = ( -hdr -[4]<<24)|(hdr[5]<<16)|(hdr[6]<<8)|hdr[7]; - -577 i(( -size - =0|| (( -offt -+size> -fesize -)) - -579 - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshotoad failed: Invalid file structure (5)"); - -580 -numhdrs - = 0; - -581  -SDL_FALSE -; - -584 -numhdrs -++; - -585 - `fek -( -f -, -size -, -SEEK_CUR -); - -586 -offt - + -size -+8; - -590 -bkh - = ( -blockhd - *) - `mloc -( -numhdrs -*(blockheader)); - -591 i(! -bkh -) - -593 - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshotoad failed: Out of memory (6)"); - -594 -numhdrs - = 0; - -595  -SDL_FALSE -; - -597 - `memt -( -bkh -, 0, -numhdrs -*( -blockhd -)); - -600 - `fek -( -f -, 0, -SEEK_SET -); - -601 -offt - = 0; - -602 -i - = 0; - -603  -offt - < -fesize -) - -605 i( - `d -( -hdr -, 8, 1, -f -) != 1) - -607 - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshotoad failed: Readrror (7)"); - -608 - ` -( -bkh -); - -609 -bkh - = -NULL -; - -610 -numhdrs - = 0; - -611  -SDL_FALSE -; - -614 -size - = ( -hdr -[4]<<24)|(hdr[5]<<16)|(hdr[6]<<8)|hdr[7]; - -615 i(( -size - =0|| (( -offt -+size> -fesize -)) - -617 - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshotoad failed: Invalid file structure (8)"); - -618 - ` -( -bkh -); - -619 -bkh - = -NULL -; - -620 -numhdrs - = 0; - -621  -SDL_FALSE -; - -623 -offt -+=8; - -625 - `memy -( -bkh -[ -i -]. -id -, -hdr -, 4); - -626 -bkh -[ -i -]. -offt - = offset; - -627 -bkh -[ -i -]. -size - = size; - -630 i(( -i ->0&& ( - `memcmp -( -bkh -[i]. -id -, "DATA", 4)==0)) - -632 -bkh -[ -i --1]. -dablock - = &bkh[i]; - -635 - `fek -( -f -, -size -, -SEEK_CUR -); - -636 -offt - + -size -; - -637 -i -++; - -640  -SDL_TRUE -; - -641 - } -} - -643  - $_block -( -blockhd - * -blk -) - -645 i((! -blk -)||(!blk-> -buf -)) ; - -646 - ` -( -blk --> -buf -); - -647 -blk --> -buf - = -NULL -; - -648 - } -} - -650  - $_blockhds -() - -652  -i -; - -654 i(! -bkh -) ; - -656  -i -=0; i< -numhdrs -; i++) - -658 i( -bkh -[ -i -]. -buf - - ` -(bkh[i].buf); - -660 - ` -( -bkh -); - -661 - } -} - -663  -blockhd - * - $ld_block -( -mache - * -ic -, * -id -, -FILE - * -f -, -SDL_bo - -qued -,  -exedsize -, SDL_bo -dequed -) - -665  -i -; - -667  -i -=0; i< -numhdrs -; i++) - -669 i( - `memcmp -( -bkh -[ -i -]. -id -, id, 4) == 0) - -673 i( -i -== -numhdrs -) - -676 i( -qued - - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshotoad failed: Invalid file (9)"); - -677  -NULL -; - -680 i(( -dequed -&& ( -bkh -[ -i -]. -dablock - = -NULL -)) - -682 i( -qued - - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshotoad failed: Invalid file (10)"); - -683  -NULL -; - -686 i(( -exedsize - !-1&& ( -bkh -[ -i -]. -size - !=xpectedsize)) - -689 i( -qued - - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshotoad failed: Invalid file (11)"); - -690  -NULL -; - -694 i( -bkh -[ -i -]. -buf -) - -696 -bkh -[ -i -]. -offs - = 0; - -697  & -bkh -[ -i -]; - -700 -bkh -[ -i -]. -buf - = - `mloc -(bkh[i]. -size -); - -701 i(! -bkh -[ -i -]. -buf -) - -703 i( -qued - - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshotoad failed: Out of memory (12)"); - -704  -NULL -; - -707 - `fek -( -f -, -bkh -[ -i -]. -offt -, -SEEK_SET -); - -708 i( - `d -( -bkh -[ -i -]. -buf -, bkh[i]. -size -, 1, -f -) != 1) - -710 i( -qued - - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshotoad failed: Readrror (13)"); - -711  -NULL -; - -714 -bkh -[ -i -]. -offs - = 0; - -715  & -bkh -[ -i -]; - -716 - } -} - -718  -SDL_bo - - $ad_block -( -mache - * -ic -,  -blockhd - * -blk -, -FILE - * -f -, -SDL_bo - -qued -, * -debuf -) - -720 i(! -blk -) - -722 i( -qued - - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshotoad failed: Internalrror (14)"); - -723  -SDL_FALSE -; - -726 i( -blk --> -buf -) - -728 - `memy -( -debuf -, -blk --> -buf -, blk-> -size -); - -729  -SDL_TRUE -; - -732 - `fek -( -f -, -blk --> -offt -, -SEEK_SET -); - -733 i( - `d -( -debuf -, -blk --> -size -, 1, -f -) != 1) - -735 i( -qued - - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshotoad failed: Readrror (15)"); - -736  -SDL_FALSE -; - -739  -SDL_TRUE -; - -740 - } -} - -742  -Ut32 - - $gu32 -( -blockhd - * -blk -) - -744 -Ut32 - -v - = ( -blk --> -buf -[blk-> -offs -]<<24)|(blk->buf[blk->offs+1]<<16)|(blk->buf[blk->offs+2]<<8)|blk->buf[blk->offs+3]; - -745 -blk --> -offs -+=4; - -746  -v -; - -747 - } -} - -749  -St32 - - $gs32 -( -blockhd - * -blk -) - -751 -St32 - -v - = ( -blk --> -buf -[blk-> -offs -]<<24)|(blk->buf[blk->offs+1]<<16)|(blk->buf[blk->offs+2]<<8)|blk->buf[blk->offs+3]; - -752 -blk --> -offs -+=4; - -753  -v -; - -754 - } -} - -756  -Ut16 - - $gu16 -( -blockhd - * -blk -) - -758 -Ut16 - -v - = ( -blk --> -buf -[blk-> -offs -]<<8)|blk->buf[blk->offs+1]; - -759 -blk --> -offs -+=2; - -760  -v -; - -761 - } -} - -763  -St16 - - $gs16 -( -blockhd - * -blk -) - -765 -St16 - -v - = ( -blk --> -buf -[blk-> -offs -]<<8)|blk->buf[blk->offs+1]; - -766 -blk --> -offs -+=2; - -767  -v -; - -768 - } -} - -770  -Ut8 - - $gu8 -( -blockhd - * -blk -) - -772  -blk --> -buf -[blk-> -offs -++]; - -773 - } -} - -775  - $gda -( -blockhd - * -blk -, * -de -,  -size -) - -777 - `memy -( -de -, & -blk --> -buf -[blk-> -offs -], -size -); - -778 -blk --> -offs - + -size -; - -779 - } -} - -781 -SDL_bo - - $ld_sh -( -mache - * -ic -, * -fame -) - -783  -m6502 - * -u - = & -ic -->cpu; - -784  -i -; - -785 -SDL_bo - -do_wd17xx - = -SDL_FALSE -, -back2m - = -ic --> -emu_mode - = -EM_DEBUG -; - -786  -ty -, -drivy -; - -787 -FILE - * -f - = -NULL -; - -788  -blockhd - * -blk - = -NULL -; - -790 -f - = - `fݒ -( -fame -, "rb"); - -791 i(! -f -) - -793 - `msgbox -( -ic -, -MSGBOX_OK -, "Unableo open snapshot file (16)"); - -794  -SDL_FALSE -; - -797 if(! - `ghds -( -ic -, -f -)) - -799 - `fo -( -f -); - -800  -SDL_FALSE -; - -804 -blk - = - `ld_block -( -ic -, "OSN\x00", -f -, -SDL_TRUE -, 21, SDL_TRUE); - -805 i(! -blk -) - -807 - `_blockhds -(); - -808 - `fo -( -f -); - -809  -SDL_FALSE -; - -813 -ty - = -blk --> -buf -[0]; - -814 -drivy - = -blk --> -buf -[14]; - -816 i( -ty - > -MACH_LAST -) - -818 - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshotoad failed: Invalid file (17)"); - -819 - `_blockhds -(); - -820 - `fo -( -f -); - -821  -SDL_FALSE -; - -824 - `swmach -( -ic -, -NULL -, ( -drivy -<<16)| -ty -); - -827 if(( -ic --> -drivy - != drivetype) || - -828 ( -ic --> -memsize - ! -blk --> -dablock --> -size -)) - -830 - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshotoad failed: Invalid file (18)"); - -831 - `_blockhds -(); - -832 - `fo -( -f -); - -833 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -834  -SDL_FALSE -; - -838 i(! - `ad_block -( -ic -, -blk --> -dablock -, -f -, -SDL_TRUE -, oric-> -mem -)) - -840 - `_blockhds -(); - -841 - `fo -( -f -); - -842 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -843  -SDL_FALSE -; - -847 - `r_tches - -ic - ); - -848 i( -ic --> -buf -) - -850 - ` -( -ic --> -buf -); - -851 -ic --> -buf - = -NULL -; - -852 -ic --> -n - = 0; - -855 -blk --> -offs - = 1; - -856 -ic --> -ovockmu - = - `gu32 -( -blk -); - -857 -ic --> -ovockshi - = - `gu32 -( -blk -); - -858 -ic --> -vsync - = - `gu16 -( -blk -); - -859 -ic --> -romdis - = - `gu8 - ( -blk -); - -860 -ic --> -rom - = - `gu8 - ( -blk -); - -861 -ic --> -vsynchack - = - `gu8 - ( -blk -); - -862 -blk --> -offs -++; - -863 -ic --> -turbo - = - `gu8 - ( -blk -); - -864 -ic --> -vid_mode - = - `gu8 - ( -blk -); - -865 -ic --> -keym - = - `gu32 -( -blk -); - -868 - `_block -( -blk -); - -870 -ic --> -vid_eq - = oric-> -vid_mode -&2; - -871 if -ic --> -vid_mode - & 4 ) - -873 -ic --> -vid_addr - = oric-> -vidbas -[0]; - -874 -ic --> -vid_ch_ba - = &ic-> -mem -[ic-> -vidbas -[1]]; - -876 -ic --> -vid_addr - = oric-> -vidbas -[2]; - -877 -ic --> -vid_ch_ba - = &ic-> -mem -[ic-> -vidbas -[3]]; - -881 -blk - = - `ld_block -( -ic -, "CPU\x00", -f -, -SDL_TRUE -, 21, -SDL_FALSE -); - -882 i(! -blk -) - -884 - `_blockhds -(); - -885 - `fo -( -f -); - -886 - `tmutoggs - -ic - ); - -887 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -888  -SDL_FALSE -; - -891 -u --> -cyes - = - `gu32 -( -blk -); - -892 -u --> -pc - = - `gu16 -( -blk -); - -893 -u --> -ϡpc - = - `gu16 -( -blk -); - -894 -u --> -lc - = - `gu16 -( -blk -); - -895 -u --> -lct - = - `gu16 -( -blk -); - -896 -u --> -nmi - = - `gu8 - ( -blk -); - -897 -u --> -a - = - `gu8 - ( -blk -); - -898 -u --> -x - = - `gu8 - ( -blk -); - -899 -u --> -y - = - `gu8 - ( -blk -); - -900 -u --> - - = - `gu8 - ( -blk -); - -901 -i - = - `gu8 - ( -blk -); - -902 - `SETFLAGS -( -i -); - -903 -u --> -q - = - `gu8 - ( -blk -); - -904 -u --> -nmicou - = - `gu8 - ( -blk -); - -905 -u --> -lc - = - `gu8 - ( -blk -); - -908 - `_block -( -blk -); - -911 -blk - = - `ld_block -( -ic -, "AY\x00\x00", -f -, -SDL_TRUE -, 153, -SDL_FALSE -); - -912 i(! -blk -) - -914 - `_blockhds -(); - -915 - `fo -( -f -); - -916 - `tmutoggs - -ic - ); - -917 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -918  -SDL_FALSE -; - -921 -ic --> -ay -. -bmode - = - `gu8 -( -blk -); - -922 -ic --> -ay -. -eg - = - `gu8 -( -blk -); - -923 - `gda -( -blk -, & -ic --> -ay -. -egs -[0], -NUM_AY_REGS -); - -924 - `memy -(& -ic --> -ay -. -gs -[0], &ic->ay. -egs -[0], -NUM_AY_REGS -); - -925  -i -=0; i<8; i++) - -926 -ic --> -ay -. -keyes -[ -i -] = - `gu8 -( -blk -); - -927  -i -=0; i<3; i++) - -928 -ic --> -ay -. -tڕ -[ -i -] = - `gu32 -( -blk -); - -929 -ic --> -ay -. -noir - = - `gu32 -( -blk -); - -930 -ic --> -ay -. -vr - = - `gu32 -( -blk -); - -931  -i -=0; i<3; i++) - -933 -ic --> -ay -. -teb -[ -i -] = - `gu16 -( -blk -); - -934 -ic --> -ay -. -noib -[ -i -] = - `gu16 -( -blk -); - -935 -ic --> -ay -. -v -[ -i -] = - `gu16 -( -blk -); - -937 -ic --> -ay -. -wout - = - `gu16 -( -blk -); - -938  -i -=0; i<3; i++) - -939 -ic --> -ay -. - -[ -i -] = - `gu32 -( -blk -); - -940 -ic --> -ay -. -n - = - `gu32 -( -blk -); - -941 -ic --> -ay -. -e - = - `gu32 -( -blk -); - -942  -i -=0; i<3; i++) - -944 -ic --> -ay -. -tڕos -[ -i -] = - `gu32 -( -blk -); - -945 -ic --> -ay -. -te -[ -i -] = - `gu32 -( -blk -); - -946 -ic --> -ay -. -sign -[ -i -] = - `gu32 -( -blk -); - -947 -ic --> -ay -. -out -[ -i -] = - `gu32 -( -blk -); - -949 -ic --> -ay -. -vpos - = - `gu32 -( -blk -); - -950 -ic --> -ay -. -cunoi - = - `gu32 -( -blk -); - -951 -ic --> -ay -. -dck - = - `gu32 -( -blk -); - -952 -ic --> -ay -. -keybday - = - `gu32 -( -blk -); - -953 -ic --> -ay -. -cukeyoffs - = - `gu32 -( -blk -); - -956 - `_block -( -blk -); - -959 -blk - = - `ld_block -( -ic -, "VIA\x00", -f -, -SDL_TRUE -, 39, -SDL_FALSE -); - -960 i(! -blk -) - -962 - `_blockhds -(); - -963 - `fo -( -f -); - -964 - `tmutoggs - -ic - ); - -965 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -966  -SDL_FALSE -; - -969 -ic --> -v -. -i - = - `gu8 - ( -blk -); - -970 -ic --> -v -. -b - = - `gu8 - ( -blk -); - -971 -ic --> -v -. -b - = - `gu8 - ( -blk -); - -972 -ic --> -v -. -bl - = - `gu8 - ( -blk -); - -973 -ic --> -v -. -a - = - `gu8 - ( -blk -); - -974 -ic --> -v -. -a - = - `gu8 - ( -blk -); - -975 -ic --> -v -. - - = - `gu8 - ( -blk -); - -976 -ic --> -v -. -dd - = - `gu8 - ( -blk -); - -977 -ic --> -v -. -ddrb - = - `gu8 - ( -blk -); - -978 -ic --> -v -. -t1l_l - = - `gu8 - ( -blk -); - -979 -ic --> -v -. -t1l_h - = - `gu8 - ( -blk -); - -980 -ic --> -v -. -t1c - = - `gu16 -( -blk -); - -981 -ic --> -v -. -t2l_l - = - `gu8 - ( -blk -); - -982 -ic --> -v -. -t2l_h - = - `gu8 - ( -blk -); - -983 -ic --> -v -. -t2c - = - `gu16 -( -blk -); - -984 -ic --> -v -. - - = - `gu8 - ( -blk -); - -985 -ic --> -v -. -a - = - `gu8 - ( -blk -); - -986 -ic --> -v -. -p - = - `gu8 - ( -blk -); - -987 -ic --> -v -. -r - = - `gu8 - ( -blk -); - -988 -ic --> -v -. -1 - = - `gu8 - ( -blk -); - -989 -ic --> -v -. -2 - = - `gu8 - ( -blk -); - -990 -ic --> -v -. -cb1 - = - `gu8 - ( -blk -); - -991 -ic --> -v -. -cb2 - = - `gu8 - ( -blk -); - -992 -ic --> -v -. -cou - = - `gu8 - ( -blk -); - -993 -ic --> -v -. -t1ld - = - `gu8 - ( -blk -); - -994 -ic --> -v -. -t2ld - = - `gu8 - ( -blk -); - -995 -ic --> -v -. -time - = - `gu16 -( -blk -); - -996 -ic --> -v -. -t1run - = - `gu8 - ( -blk -); - -997 -ic --> -v -. -t2run - = - `gu8 - ( -blk -); - -998 -ic --> -v -. -2pul - = - `gu8 - ( -blk -); - -999 -ic --> -v -. -cb2pul - = - `gu8 - ( -blk -); - -1000 -ic --> -v -. -igg - - `gu8 - ( -blk -); - -1001 -ic --> -v -. -qb - = - `gu32 -( -blk -); - -1004 - `_block -( -blk -); - -1007 -blk - = - `ld_block -( -ic -, "TAP\x00", -f -, -SDL_TRUE -, 46, -SDL_FALSE -); - -1008 i(! -blk -) - -1010 - `_blockhds -(); - -1011 - `fo -( -f -); - -1012 - `tmutoggs - -ic - ); - -1013 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -1014  -SDL_FALSE -; - -1017 -ic --> -b - = - `gu8 - ( -blk -); - -1018 -ic --> -out - = - `gu8 - ( -blk -); - -1019 -ic --> -ry - = - `gu8 - ( -blk -); - -1020 -ic --> -n - = - `gu32 -( -blk -); - -1021 -ic --> -offs - = - `gu32 -( -blk -); - -1022 -ic --> -cou - = - `gu32 -( -blk -); - -1023 -ic --> -time - = - `gu32 -( -blk -); - -1024 -ic --> -dupbys - - `gu32 -( -blk -); - -1025 -ic --> -hdnd - = - `gu32 -( -blk -); - -1026 -ic --> -day - = - `gu32 -( -blk -); - -1027 -ic --> -m - = - `gu8 - ( -blk -); - -1028 -ic --> -turbo_foff - - `gu8 -( -blk -); - -1029 -ic --> -w - = - `gu8 - ( -blk -); - -1030 -ic --> -nڿwd - = - `gu32 -( -blk -); - -1031 -ic --> -hd - = - `gu32 -( -blk -); - -1032 -ic --> -turbo_syncack - = - `gu32 -( -blk -); - -1034 i(! -blk --> -dablock -) - -1036 -ic --> -n - = 0; - -1037 -ic --> -offs - = 0; - -1041 -ic --> -buf - = - `mloc -( -blk --> -dablock --> -size -); - -1042 i(! -ic --> -buf -) - -1044 - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshotoad failed: Out of memory (19)"); - -1045 - `_blockhds -(); - -1046 - `fo -( -f -); - -1047 - `tmutoggs - -ic - ); - -1048 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -1049  -SDL_FALSE -; - -1052 i(! - `ad_block -( -ic -, -blk --> -dablock -, -f -, -SDL_TRUE -, oric-> -buf -)) - -1054 - `_blockhds -(); - -1055 - `fo -( -f -); - -1056 - `tmutoggs - -ic - ); - -1057 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -1058  -SDL_FALSE -; - -1063 - `_block -( -blk -); - -1066 i(( -blk - = - `ld_block -( -ic -, "PCH\x00", -f -, -SDL_FALSE -, 76, SDL_FALSE))) - -1068 -ic --> -pch_fd_d_gme_pc - = - `gu32 -( -blk -); - -1069 -ic --> -pch_fd_cve_gme_pc - = - `gu32 -( -blk -); - -1070 -ic --> -pch_fd_e_gme_pc - = - `gu32 -( -blk -); - -1071 -ic --> -pch_fd__gme_pc - = - `gu32 -( -blk -); - -1072 -ic --> -pch_fd_gme_addr - = - `gu32 -( -blk -); - -1073 -ic --> -pch_fd_avaab - = - `gu8 -( -blk -); - -1074 -ic --> -pch__gsync_pc - = - `gu32 -( -blk -); - -1075 -ic --> -pch__gsync_d_pc - = - `gu32 -( -blk -); - -1076 -ic --> -pch__gsync_lo_pc - = - `gu32 -( -blk -); - -1077 -ic --> -pch__adby_pc - = - `gu32 -( -blk -); - -1078 -ic --> -pch__adby_d_pc - = - `gu32 -( -blk -); - -1079 -ic --> -pch__adby_eby_addr - = - `gu32 -( -blk -); - -1080 -ic --> -pch__adby_ezo_addr - = - `gu32 -( -blk -); - -1081 -ic --> -pch__putby_pc - = - `gu32 -( -blk -); - -1082 -ic --> -pch__putby_d_pc - = - `gu32 -( -blk -); - -1083 -ic --> -pch__cve_d_pc - = - `gu32 -( -blk -); - -1084 -ic --> -pch__e_d_pc - = - `gu32 -( -blk -); - -1085 -ic --> -pch__wrd_pc - = - `gu32 -( -blk -); - -1086 -ic --> -pch__wrd_d_pc - = - `gu32 -( -blk -); - -1087 -ic --> -pch__adby_ty - = - `gu8 - ( -blk -); - -1088 -ic --> -pch__avaab - = - `gu8 - ( -blk -); - -1089 -ic --> -pch__ve_avaab - = - `gu8 - ( -blk -); - -1092 - `_block -( -blk -); - -1095  -ic --> -drivy -) - -1097  -DRV_JASMIN -: - -1099 -blk - = - `ld_block -( -ic -, "JSM\x00", -f -, -SDL_TRUE -, 2, -SDL_FALSE -); - -1100 i(! -blk -) - -1102 - `_blockhds -(); - -1103 - `fo -( -f -); - -1104 - `tmutoggs - -ic - ); - -1105 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -1106  -SDL_FALSE -; - -1109 -ic --> -jasm -. -ay - = - `gu8 -( -blk -); - -1110 -ic --> -jasm -. -romdis - = - `gu8 -( -blk -); - -1113 - `_block -( -blk -); - -1115 -do_wd17xx - = -SDL_TRUE -; - -1118  -DRV_MICRODISC -: - -1120 -blk - = - `ld_block -( -ic -, "MDC\x00", -f -, -SDL_TRUE -, 4, -SDL_FALSE -); - -1121 i(! -blk -) - -1123 - `_blockhds -(); - -1124 - `fo -( -f -); - -1125 - `tmutoggs - -ic - ); - -1126 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -1127  -SDL_FALSE -; - -1130 -ic --> -md -. -us - = - `gu8 -( -blk -); - -1131 -ic --> -md -. -q - = - `gu8 -( -blk -); - -1132 -ic --> -md -. -drq - = - `gu8 -( -blk -); - -1133 -ic --> -md -. -diskrom - = - `gu8 -( -blk -); - -1136 - `_block -( -blk -); - -1138 -do_wd17xx - = -SDL_TRUE -; - -1141  -DRV_PRAVETZ -: - -1143 -Ut8 - -tmp -[ -PRAV_TRACKS_PER_DISK -* -PRAV_RAW_TRACK_SIZE -*2]; - -1144 -Ut32 - -offs -; - -1147 -blk - = - `ld_block -( -ic -, "PRV\x00", -f -, -SDL_TRUE -, 9+2*10, SDL_TRUE); - -1148 i(! -blk -) - -1150 - `_blockhds -(); - -1151 - `fo -( -f -); - -1152 - `tmutoggs - -ic - ); - -1153 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -1154  -SDL_FALSE -; - -1157 -ic --> -avz -. -ay - = - `gu8 -( -blk -); - -1158 -ic --> -avz -. -romdis - = - `gu8 -( -blk -); - -1159 -ic --> -avz -. -exnsi - = - `gu16 -( -blk -); - -1160 -ic --> -wddisk -. -c_drive - = - `gu8 -( -blk -); - -1161 -ic --> -wddisk -. -cut - = - `gu32 -( -blk -); - -1163  -i -=0; i<2; i++) - -1165 -ic --> -avz -. -drv -[ -i -]. -vume - = - `gu8 -( -blk -); - -1166 -ic --> -avz -. -drv -[ -i -]. - - = - `gu8 -( -blk -); - -1167 -ic --> -avz -. -drv -[ -i -]. -m_ - = - `gu8 -( -blk -); - -1168 -ic --> -avz -. -drv -[ -i -]. -wre_ady - = - `gu8 -( -blk -); - -1169 -ic --> -avz -. -drv -[ -i -]. -by - = - `gu16 -( -blk -); - -1170 -ic --> -avz -. -drv -[ -i -]. -hf_ack - = - `gu16 -( -blk -); - -1171 -ic --> -avz -. -drv -[ -i -]. -dty - = - `gu8 -( -blk -); - -1172 -ic --> -avz -. -drv -[ -i -]. - - = - `gu8 -( -blk -); - -1175 i(! - `ad_block -( -ic -, -blk --> -dablock -, -f -, -SDL_TRUE -, -tmp -)) - -1177 - `_blockhds -(); - -1178 - `fo -( -f -); - -1179 - `tmutoggs - -ic - ); - -1180 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -1181  -SDL_FALSE -; - -1184 - `memy -(& -ic --> -avz -. -drv -[0]. -image -[0][0], -tmp -, -PRAV_TRACKS_PER_DISK -* -PRAV_RAW_TRACK_SIZE -); - -1185 - `memy -(& -ic --> -avz -. -drv -[1]. -image -[0][0], & -tmp -[ -PRAV_TRACKS_PER_DISK -* -PRAV_RAW_TRACK_SIZE -], PRAV_TRACKS_PER_DISK*PRAV_RAW_TRACK_SIZE); - -1187 - `_block -( -blk -); - -1190 ( -blk - = - `ld_block -( -ic -, "PVD\x00", -f -, -SDL_FALSE -, -1, SDL_FALSE))) - -1193 -i - = - `gu16 -( -blk -); - -1194 i(( -i -<0|| (i>1|| ( -ic --> -wddisk -. -disk -[i] ! -NULL -|| (! -blk --> -dablock -|| (blk-> -size - != 10)) - -1196 - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshotoad failed: Invalid file (PVD1)"); - -1197 - `_blockhds -(); - -1198 - `fo -( -f -); - -1199 - `tmutoggs - -ic - ); - -1200 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -1201  -SDL_FALSE -; - -1205 -ic --> -wddisk -. -disk -[ -i -] = ( -diskimage - *) - `mloc -((diskimage)); - -1206 i(! -ic --> -wddisk -. -disk -[ -i -]) - -1208 - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshotoad failed: Out of memory (PVD2)"); - -1209 - `_blockhds -(); - -1210 - `fo -( -f -); - -1211 - `tmutoggs - -ic - ); - -1212 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -1213  -SDL_FALSE -; - -1215 - `memt -( -ic --> -wddisk -. -disk -[ -i -], 0, ( -diskimage -)); - -1218 -ic --> -wddisk -. -disk -[ -i -]-> -wimage - = - `mloc -( -blk --> -dablock --> -size -); - -1219 i(! -ic --> -wddisk -. -disk -[ -i -]) - -1221 - ` -( -ic --> -wddisk -. -disk -[ -i -]); - -1222 -ic --> -wddisk -. -disk -[ -i -] = -NULL -; - -1223 - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshotoad failed: Out of memory (PVD3)"); - -1224 - `_blockhds -(); - -1225 - `fo -( -f -); - -1226 - `tmutoggs - -ic - ); - -1227 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -1228  -SDL_FALSE -; - -1232 i(! - `ad_block -( -ic -, -blk --> -dablock -, -f -, -SDL_TRUE -, oric-> -wddisk -. -disk -[ -i -]-> -wimage -)) - -1234 - ` -( -ic --> -wddisk -. -disk -[ -i -]-> -wimage -); - -1235 - ` -( -ic --> -wddisk -. -disk -[ -i -]); - -1236 -ic --> -wddisk -. -disk -[ -i -] = -NULL -; - -1237 - `_blockhds -(); - -1238 - `fo -( -f -); - -1239 - `tmutoggs - -ic - ); - -1240 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -1241  -SDL_FALSE -; - -1244 -ic --> -wddisk -. -disk -[ -i -]-> -chedack - = -1; - -1245 -ic --> -wddisk -. -disk -[ -i -]-> -chedside - = -1; - -1248 -ic --> -wddisk -. -disk -[ -i -]-> -drivum - = i; - -1249 -ic --> -wddisk -. -disk -[ -i -]-> -wimag - = - `gu32 -( -blk -); - -1251 - `rtf -( -ic --> -wddisk -. -disk -[ -i -]-> -fame -, "%s%cSNAPDISK%d.DSK", -diskth -, -PATHSEP -, i); - -1253 -offs - = - `gu32 -( -blk -); - -1254 -ic --> -avz -. -drv -[ -i -]. -pimg - = oric-> -wddisk -. -disk -[i]; - -1255 i( -offs - == 0xffffffff) - -1256 -ic --> -avz -. -drv -[ -i -]. -_r - = -NULL -; - -1258 -ic --> -avz -. -drv -[ -i -]. -_r - = &ic->avz.drv[i]. -pimg --> -wimage -[ -offs -]; - -1260 -blk --> -id -[0] = 0; - -1261 - `_block -( -blk -); - -1266 i( -do_wd17xx -) - -1268 -Ut8 - -disks -[4]; - -1271 -blk - = - `ld_block -( -ic -, "WDD\x00", -f -, -SDL_TRUE -, 38, -SDL_FALSE -); - -1272 i(! -blk -) - -1274 - `_blockhds -(); - -1275 - `fo -( -f -); - -1276 - `tmutoggs - -ic - ); - -1277 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -1278  -SDL_FALSE -; - -1281 -ic --> -wddisk -. -r_us - = - `gu8 - ( -blk -); - -1282 -ic --> -wddisk -. -r_ack - = - `gu8 - ( -blk -); - -1283 -ic --> -wddisk -. -r_ - = - `gu8 - ( -blk -); - -1284 -ic --> -wddisk -. -r_da - = - `gu8 - ( -blk -); - -1285 -ic --> -wddisk -. -c_drive - = - `gu8 - ( -blk -); - -1286 -ic --> -wddisk -. -c_side - = - `gu8 - ( -blk -); - -1287 -ic --> -wddisk -. -c_ack - = - `gu8 - ( -blk -); - -1288 -ic --> -wddisk -. -c_ - = - `gu8 - ( -blk -); - -1289 -ic --> -wddisk -. -y - = - `gu8 - ( -blk -); - -1290 -ic --> -wddisk -. -ϡ__ - = - `gu8 - ( -blk -); - -1291 - `gda -( -blk -, -disks -, 4); - -1292 -ic --> -wddisk -. -cut - = - `gu32 -( -blk -); - -1293 -ic --> -wddisk -. -cuoffs - = - `gu32 -( -blk -); - -1294 -ic --> -wddisk -. -dayedt - = - `gu32 -( -blk -); - -1295 -ic --> -wddisk -. -dayeddrq - = - `gu32 -( -blk -); - -1296 -ic --> -wddisk -. -dius - = - `gu32 -( -blk -); - -1297 -ic --> -wddisk -. -ddus - = - `gu32 -( -blk -); - -1298 -ic --> -wddisk -. -c - = - `gu32 -( -blk -); - -1301 - `_block -( -blk -); - -1304 ( -blk - = - `ld_block -( -ic -, "DSK\x00", -f -, -SDL_FALSE -, -1, SDL_FALSE))) - -1306  -ack_to_che -=-1, -side_to_che -=-1; - -1309 -i - = - `gu16 -( -blk -); - -1310 i(( -i -<0|| (i>3|| ( -ic --> -wddisk -. -disk -[i] ! -NULL -|| (! -blk --> -dablock -|| (blk-> -size - != 16)) - -1312 - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshotoad failed: Invalid file (20)"); - -1313 - `_blockhds -(); - -1314 - `fo -( -f -); - -1315 - `tmutoggs - -ic - ); - -1316 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -1317  -SDL_FALSE -; - -1321 -ic --> -wddisk -. -disk -[ -i -] = ( -diskimage - *) - `mloc -((diskimage)); - -1322 i(! -ic --> -wddisk -. -disk -[ -i -]) - -1324 - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshotoad failed: Out of memory (21)"); - -1325 - `_blockhds -(); - -1326 - `fo -( -f -); - -1327 - `tmutoggs - -ic - ); - -1328 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -1329  -SDL_FALSE -; - -1331 - `memt -( -ic --> -wddisk -. -disk -[ -i -], 0, ( -diskimage -)); - -1334 -ic --> -wddisk -. -disk -[ -i -]-> -wimage - = - `mloc -( -blk --> -dablock --> -size -); - -1335 i(! -ic --> -wddisk -. -disk -[ -i -]) - -1337 - ` -( -ic --> -wddisk -. -disk -[ -i -]); - -1338 -ic --> -wddisk -. -disk -[ -i -] = -NULL -; - -1339 - `msgbox -( -ic -, -MSGBOX_OK -, "Snapshotoad failed: Out of memory (22)"); - -1340 - `_blockhds -(); - -1341 - `fo -( -f -); - -1342 - `tmutoggs - -ic - ); - -1343 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -1344  -SDL_FALSE -; - -1348 i(! - `ad_block -( -ic -, -blk --> -dablock -, -f -, -SDL_TRUE -, oric-> -wddisk -. -disk -[ -i -]-> -wimage -)) - -1350 - ` -( -ic --> -wddisk -. -disk -[ -i -]-> -wimage -); - -1351 - ` -( -ic --> -wddisk -. -disk -[ -i -]); - -1352 -ic --> -wddisk -. -disk -[ -i -] = -NULL -; - -1353 - `_blockhds -(); - -1354 - `fo -( -f -); - -1355 - `tmutoggs - -ic - ); - -1356 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -1357  -SDL_FALSE -; - -1360 -ic --> -wddisk -. -disk -[ -i -]-> -chedack - = -1; - -1361 -ic --> -wddisk -. -disk -[ -i -]-> -chedside - = -1; - -1364 -ic --> -wddisk -. -disk -[ -i -]-> -drivum - = i; - -1365 -ic --> -wddisk -. -disk -[ -i -]-> -numacks - = - `gu16 -( -blk -); - -1366 -ic --> -wddisk -. -disk -[ -i -]-> -numsides - = - `gu16 -( -blk -); - -1367 -ic --> -wddisk -. -disk -[ -i -]-> -geomry - = - `gu16 -( -blk -); - -1368 -ack_to_che - = - `gs16 -( -blk -); - -1369 -side_to_che - = - `gs16 -( -blk -); - -1370 -ic --> -wddisk -. -disk -[ -i -]-> -wimag - = - `gu32 -( -blk -); - -1372 i(( -ack_to_che - !-1&& ( -side_to_che - != -1)) - -1373 - `diskimage_chck -( -ic --> -wddisk -. -disk -[ -i -], -ack_to_che -, -side_to_che -); - -1375 i( -ic --> -wddisk -. -c_drive - = -i -) - -1376 -ic --> -wddisk -. -cu - = - `wd17xx_fd_ -(&ic->wddisk, oric->wddisk. -r_ -); - -1378 - `rtf -( -ic --> -wddisk -. -disk -[ -i -]-> -fame -, "%s%cSNAPDISK%d.DSK", -diskth -, -PATHSEP -, i); - -1380 -blk --> -id -[0] = 0; - -1381 - `_block -( -blk -); - -1385 i( -ic --> -ty - = -MACH_TELESTRAT -) - -1388 -blk - = - `ld_block -( -ic -, "BNK\x00", -f -, -SDL_TRUE -, 9, -SDL_FALSE -); - -1389 i(! -blk -) - -1391 - `_blockhds -(); - -1392 - `fo -( -f -); - -1393 - `tmutoggs - -ic - ); - -1394 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -1395  -SDL_FALSE -; - -1398  -i -=0; i<8; i++) - -1399 -ic --> -_bk -[ -i -]. -ty - = - `gu8 -( -blk -); - -1400 -ic --> -_cubk - = - `gu8 -( -blk -); - -1403 - `_block -( -blk -); - -1406 -blk - = - `ld_block -( -ic -, "ACI\x00", -f -, -SDL_TRUE -, -ACIA_LAST -, -SDL_FALSE -); - -1407 i(! -blk -) - -1409 - `_blockhds -(); - -1410 - `fo -( -f -); - -1411 - `tmutoggs - -ic - ); - -1412 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -1413  -SDL_FALSE -; - -1416 - `gda -( -blk -, & -ic --> -_ac -. -gs -[0], -ACIA_LAST -); - -1419 - `_block -( -blk -); - -1422 -blk - = - `ld_block -( -ic -, "AUX\x00", -f -, -SDL_TRUE -, -ACIA_LAST -, -SDL_FALSE -); - -1423 i(! -blk -) - -1425 - `_blockhds -(); - -1426 - `fo -( -f -); - -1427 - `tmutoggs - -ic - ); - -1428 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -1429  -SDL_FALSE -; - -1433 - `_block -( -blk -); - -1436 -blk - = - `ld_block -( -ic -, "TVA\x00", -f -, -SDL_TRUE -, 39, -SDL_FALSE -); - -1437 i(! -blk -) - -1439 - `_blockhds -(); - -1440 - `fo -( -f -); - -1441 - `tmutoggs - -ic - ); - -1442 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -1443  -SDL_FALSE -; - -1446 -ic --> -_v -. -i - = - `gu8 - ( -blk -); - -1447 -ic --> -_v -. -b - = - `gu8 - ( -blk -); - -1448 -ic --> -_v -. -b - = - `gu8 - ( -blk -); - -1449 -ic --> -_v -. -bl - = - `gu8 - ( -blk -); - -1450 -ic --> -_v -. -a - = - `gu8 - ( -blk -); - -1451 -ic --> -_v -. -a - = - `gu8 - ( -blk -); - -1452 -ic --> -_v -. - - = - `gu8 - ( -blk -); - -1453 -ic --> -_v -. -dd - = - `gu8 - ( -blk -); - -1454 -ic --> -_v -. -ddrb - = - `gu8 - ( -blk -); - -1455 -ic --> -_v -. -t1l_l - = - `gu8 - ( -blk -); - -1456 -ic --> -_v -. -t1l_h - = - `gu8 - ( -blk -); - -1457 -ic --> -_v -. -t1c - = - `gu16 -( -blk -); - -1458 -ic --> -_v -. -t2l_l - = - `gu8 - ( -blk -); - -1459 -ic --> -_v -. -t2l_h - = - `gu8 - ( -blk -); - -1460 -ic --> -_v -. -t2c - = - `gu16 -( -blk -); - -1461 -ic --> -_v -. - - = - `gu8 - ( -blk -); - -1462 -ic --> -_v -. -a - = - `gu8 - ( -blk -); - -1463 -ic --> -_v -. -p - = - `gu8 - ( -blk -); - -1464 -ic --> -_v -. -r - = - `gu8 - ( -blk -); - -1465 -ic --> -_v -. -1 - = - `gu8 - ( -blk -); - -1466 -ic --> -_v -. -2 - = - `gu8 - ( -blk -); - -1467 -ic --> -_v -. -cb1 - = - `gu8 - ( -blk -); - -1468 -ic --> -_v -. -cb2 - = - `gu8 - ( -blk -); - -1469 -ic --> -_v -. -cou - = - `gu8 - ( -blk -); - -1470 -ic --> -_v -. -t1ld - = - `gu8 - ( -blk -); - -1471 -ic --> -_v -. -t2ld - = - `gu8 - ( -blk -); - -1472 -ic --> -_v -. -time - = - `gu16 -( -blk -); - -1473 -ic --> -_v -. -t1run - = - `gu8 - ( -blk -); - -1474 -ic --> -_v -. -t2run - = - `gu8 - ( -blk -); - -1475 -ic --> -_v -. -2pul - = - `gu8 - ( -blk -); - -1476 -ic --> -_v -. -cb2pul - = - `gu8 - ( -blk -); - -1477 -ic --> -_v -. -igg - - `gu8 - ( -blk -); - -1478 -ic --> -_v -. -qb - = - `gu32 -( -blk -); - -1481 - `_block -( -blk -); - -1485 i(( -blk - = - `ld_block -( -ic -, "SYR\x00", -f -, -SDL_FALSE -, -1, SDL_FALSE))) - -1487 - `m_symsomsh -(& -ic --> -romsyms -, -blk --> -buf -, blk-> -size -); - -1488 - `_block -( -blk -); - -1492 i(( -blk - = - `ld_block -( -ic -, "SYU\x00", -f -, -SDL_FALSE -, -1, SDL_FALSE))) - -1494 - `m_symsomsh -(& -ic --> -ursyms -, -blk --> -buf -, blk-> -size -); - -1495 - `_block -( -blk -); - -1498 i( -ic --> -ty - = -MACH_TELESTRAT -) - -1500  -i -=0; i<8; i++) - -1502  -me -[8]; - -1503 - `rtf -( -me -, "SY%d%c", -i -, 0); - -1504 i(( -blk - = - `ld_block -( -ic -, -me -, -f -, -SDL_FALSE -, -1, SDL_FALSE))) - -1506 - `m_symsomsh -(& -ic --> -_bksyms -[ -i -], -blk --> -buf -, blk-> -size -); - -1507 - `_block -( -blk -); - -1513 i(( -blk - = - `ld_block -( -ic -, "BKP\x00", -f -, -SDL_FALSE -, -1, SDL_FALSE))) - -1515 -u --> -ybp - = -SDL_FALSE -; - -1516 -u --> -ymbp - = -SDL_FALSE -; - -1518  -i -=0; i<16; i++) - -1520 -u --> -bakpots -[ -i -] = - `gs32 -( -blk -); - -1521 i( -u --> -bakpots -[ -i -] !-1u-> -ybp - = -SDL_TRUE -; - -1524  -i -=0; i<16; i++) - -1526 -u --> -membakpots -[ -i -]. -ags - = - `gu8 -( -blk -); - -1527 -u --> -membakpots -[ -i -]. -ϡv - = - `gu8 -( -blk -); - -1528 -u --> -membakpots -[ -i -]. -addr - = - `gu16 -( -blk -); - -1529 i( -u --> -membakpots -[ -i -]. -ags -u-> -ymbp - = -SDL_TRUE -; - -1532 - `_block -( -blk -); - -1535 - `_blockhds -(); - -1536 - `fo -( -f -); - -1537 - `tmutoggs - -ic - ); - -1538 i( -back2m - - `mumode -( -ic -, -NULL -, -EM_DEBUG -); - -1539  -SDL_TRUE -; - -1540 - } -} - - @snapshot.h - -23 -SDL_bo - -ve_sh -( -mache - * -ic -, * -fame -); - -24 -SDL_bo - -ld_sh -( -mache - * -ic -, * -fame -); - - @system.h - -22 #ide -ORICUTRON_SYSTEM_H - - -23  - #ORICUTRON_SYSTEM_H - - - ) - -25 #ide -_MSC_VER - - -26  - ~ - -28  - #_CRTDBG_MAP_ALLOC - - - ) - -29  - ~ - -30  - ~ - -31  - ~"msvc/unid.h -" - -35  - #AUDIO_FREQ - 44100 - - ) - -38 #i -defed -( -__amigaos4__ -) - -40  - #PATHSEP - '/' - - ) - -41  - #PATHSEPSTR - "/" - - ) - -42  - #FILEPREFIX - "PROGDIR:" - - ) - -43  - #ROMPREFIX - "PROGDIR:roms/" - - ) - -44  - #IMAGEPREFIX - "PROGDIR:images/" - - ) - -46 #i -defed -( -WIN32 -) - -48  - #PATHSEP - '\\' - - ) - -49  - #PATHSEPSTR - "\\" - - ) - -50  - #FILEPREFIX - - - ) - -51  - #ROMPREFIX - "roms\\" - - ) - -52  - #IMAGEPREFIX - "images\\" - - ) - -56  - #PATHSEP - '/' - - ) - -57  - #PATHSEPSTR - "/" - - ) - -58  - #FILEPREFIX - - - ) - -59  - #ROMPREFIX - "roms/" - - ) - -60  - #IMAGEPREFIX - "images/" - - ) - -65  - ~"syem_sdl.h -" - - @system_sdl.c - -23  - #WANT_WMINFO - - - ) - -33  - ~"syem.h -" - -35 #i -SDL_MAJOR_VERSION - == 1 - -36 #ifde -__SPECIFY_SDL_DIR__ - - -37  - ~ - -39  - ~ - -42 #ifde -__SPECIFY_SDL_DIR__ - - -43  - ~ - -45  - ~ - -49 #ifde -__OPENGL_AVAILABLE__ - - -50 #ide -__APPLE__ - - -51  - ~ - -53  - ~ - -57 #i -SDL_BYTEORDER - = -SDL_BIG_ENDIAN - - -58  - #RMASK - 0xFF000000 - - ) - -59  - #GMASK - 0x00FF0000 - - ) - -60  - #BMASK - 0x0000FF00 - - ) - -61  - #AMASK - 0x000000FF - - ) - -63  - #RMASK - 0x000000FF - - ) - -64  - #GMASK - 0x0000FF00 - - ) - -65  - #BMASK - 0x00FF0000 - - ) - -66  - #AMASK - 0xFF000000 - - ) - -69 #i -SDL_MAJOR_VERSION - == 1 - -72  -SDL_bo - - gg_fusn - = -SDL_FALSE -; - -73  -SDL_GLCڋxt - - gg_glcڋxt - = -NULL -; - -74  -SDL_Rd -* - gg_nd - = -NULL -; - -75  -SDL_Textu - * - gg_xtu - = -NULL -; - -76  -SDL_Sur -* - gg_sn - = -NULL -; - -77  -SDL_Wdow -* - gg_wdow - = -NULL -; - -78  -SDL_Sur -* - gg_ic - = -NULL -; - -80  - gg_b - = 0; - -81  - gg_width - = 0; - -82  - gg_height - = 0; - -84  - gg_ϡx - = -SDL_WINDOWPOS_CENTERED -; - -85  - gg_ϡy - = -SDL_WINDOWPOS_CENTERED -; - -87  - $FeResours -() - -89 if( -g_glcڋxt -) - -91 - `SDL_GL_DeCڋxt -( -g_glcڋxt -); - -92 -g_glcڋxt - = -NULL -; - -95 if( -g_nd -) - -97 - `SDL_DeroyRd -( -g_nd -); - -98 -g_nd - = -NULL -; - -101 if( -g_xtu -) - -103 - `SDL_DeroyTextu -( -g_xtu -); - -104 -g_xtu - = -NULL -; - -107 if( -g_sn -) - -109 - `SDL_FeSur -( -g_sn -); - -110 -g_sn - = -NULL -; - -113 if( -g_wdow -) - -115 - `SDL_GWdowPosi -( -g_wdow -, & -g_ϡx -, & -g_ϡy -); - -116 - `SDL_DeroyWdow -( -g_wdow -); - -117 -g_wdow - = -NULL -; - -120 - } -} - -123 #i -SDL_MAJOR_VERSION - == 1 - -124  - $SDL_COMPAT_GWMInfo -( -SDL_SysWMfo - * -fo -) - -128 #i - `defed -( -__MORPHOS__ -) - -131  - `SDL_GWMInfo -( -fo -); - -133 - } -} - -135  - $SDL_COMPAT_GWMInfo -( -SDL_SysWMfo - * -fo -) - -137  -g_wdow -? - `SDL_GWdowWMInfo -(g_wdow, -fo -) : -1; - -138 - } -} - -142 #i -SDL_MAJOR_VERSION - == 1 - -143  - $SDL_COMPAT_WM_SIc -( -SDL_Sur - * -ic -, -Ut8 - * -mask -) - -145 - `SDL_WM_SIc -( -ic -, -mask -); - -146 - } -} - -147  - $SDL_COMPAT_WM_SCti -(cڡ * -t -, cڡ * -ic -) - -149 - `SDL_WM_SCti -( -t -, -ic -); - -150 - } -} - -152  - $SDL_COMPAT_WM_SIc -( -SDL_Sur - * -ic -, -Ut8 - * -mask -) - -154 if( -g_ic -) - -156 - `SDL_FeSur -( -g_ic -); - -157 -g_ic - = -NULL -; - -159 if( -ic -) - -161 -g_ic - = -ic -; - -162 -g_ic --> -fcou -++; - -164 - } -} - -165  - $SDL_COMPAT_WM_SCti -(cڡ * -t -, cڡ * -ic -) - -167 if( -g_wdow -) - -168 - `SDL_SWdowT -( -g_wdow -, -t -); - -169 - } -} - -173 #i -SDL_MAJOR_VERSION - == 1 - -174 -SDL_bo - - $SDL_COMPAT_IsAAive -( -SDL_Evt -* -evt -) - -176 -SDL_AiveEvt - * -a_ev - = (SDL_AiveEvt*) -evt -; - -177  ( -a_ev --> -e - = -SDL_APPACTIVE - &&_ev-> -ga - =1)? -SDL_TRUE - : -SDL_FALSE -; - -178 - } -} - -179 -SDL_bo - - $SDL_COMPAT_IsAFocud -( -SDL_Evt -* -evt -) - -181  -evt --> -aive -. -ty - ) - -183  -SDL_APPINPUTFOCUS -: - -184  -SDL_APPACTIVE -: - -185  -SDL_TRUE -; - -188  -SDL_FALSE -; - -189 - } -} - -191 -SDL_bo - - $SDL_COMPAT_IsAAive -( -SDL_Evt -* -evt -) - -195  -SDL_FALSE -; - -196 - } -} - -197 -SDL_bo - - $SDL_COMPAT_IsAFocud -( -SDL_Evt -* -evt -) - -207  -SDL_FALSE -; - -208 - } -} - -211 #i -SDL_MAJOR_VERSION - == 1 - -212  - $SDL_COMPAT_EbKeyRt -( -day -,  -rv -) - -214  - `SDL_EbKeyRt -( -day -, -rv -); - -215 - } -} - -217  - $SDL_COMPAT_EbKeyRt -( -day -,  -rv -) - -221 - } -} - -225 #i -SDL_MAJOR_VERSION - == 1 - -226  - $SDL_COMPAT_EbUNICODE -( -ab -) - -228  - `SDL_EbUNICODE -( -ab -); - -229 - } -} - -231  - $SDL_COMPAT_EbUNICODE -( -ab -) - -235 - } -} - -238 #i -SDL_MAJOR_VERSION - == 1 - -239 -SDL_COMPAT_KEY - - $SDL_COMPAT_GKeysymUnicode -( -SDL_KEYSYM - -keysym -) - -241  -keysym -. -unicode -; - -242 - } -} - -243 -SDL_COMPAT_KEY - - $SDL_COMPAT_TneUnicode -( -SDL_KEYSYM - -keysym -) - -245  -keysym -. -unicode -; - -246 - } -} - -248 -SDL_COMPAT_KEY - - $SDL_COMPAT_TneUnicode -( -SDL_KEYSYM - -keysym -) - -250 if( -keysym -. -mod - & -KMOD_SHIFT -) - -252  -keysym -. -sym -) - -297 -keysym -. -sym - = - `tou -(keysym.sym); - -301  -keysym -. -sym -; - -302 - } -} - -303 -SDL_COMPAT_KEY - - $SDL_COMPAT_GKeysymUnicode -( -SDL_KEYSYM - -keysym -) - -305  -keysym -. -sym -; - -306 - } -} - -309 #i -SDL_MAJOR_VERSION - == 1 - -310  - $SDL_COMPAT_Fl -( -SDL_Sur -* -sn -) - -312  - `SDL_Fl -( -sn -); - -313 - } -} - -315  - $SDL_COMPAT_Fl -( -SDL_Sur -* -sn -) - -317 if( -g_nd -) - -319 - `SDL_UpdeTextu -( -g_xtu -, -NULL -, -g_sn --> -pixs -, g_sn-> -pch -); - -320 - `SDL_RdCˬ -( -g_nd -); - -321 - `SDL_RdCy -( -g_nd -, -g_xtu -, -NULL -, NULL); - -322 - `SDL_RdP -( -g_nd -); - -325 - } -} - -328 #i -SDL_MAJOR_VERSION - == 1 - -329  - $SDL_COMPAT_GBsPPix -() - -331 cڡ -SDL_VideoInfo -* -fo - = - `SDL_GVideoInfo -(); - -332  ( -fo -)? info-> -vfmt --> -BsPPix - : 0; - -333 - } -} - -335  - $SDL_COMPAT_GBsPPix -() - -337  -b -; - -338 -SDL_DiyMode - -mode -; - -339 - `SDL_GCutDiyMode -(0, & -mode -); - -340 -b - = - `SDL_BITSPERPIXEL -( -mode -. -fm -); - -341  ( -b -==24)? 32 : bpp; - -342 - } -} - -345 #i -SDL_MAJOR_VERSION - == 1 - -346  - $SDL_COMPAT_WM_ToggFuSn -( -SDL_Sur - * -sur -) - -348  - `SDL_WM_ToggFuSn -( -sur -); - -349 - } -} - -351  - $SDL_COMPAT_WM_ToggFuSn -( -SDL_Sur - * -sur -) - -353 if( -g_wdow -) - -355 -g_fusn - = (g_fusn)? -SDL_FALSE - : -SDL_TRUE -; - -357 if( -g_fusn -) - -358 - `SDL_SWdowFusn -( -g_wdow -, -SDL_WINDOW_FULLSCREEN -); - -360 - `SDL_SWdowSize -( -g_wdow -, -g_width -, -g_height -); - -364 - } -} - -367 #i -SDL_MAJOR_VERSION - == 1 - -368 -SDL_Sur -* - $SDL_COMPAT_SVideoMode -( -width -,  -height -,  -bpix -, -Ut32 - -ags -) - -370  - `SDL_SVideoMode -( -width -, -height -, -bpix -, -ags -); - -371 - } -} - -373 -SDL_Sur -* - $SDL_COMPAT_SVideoMode -( -width -,  -height -,  -bpix -, -Ut32 - -ags -) - -375 -g_width - = -width -; - -376 -g_height - = -height -; - -377 -g_b - = -bpix -; - -379 - `FeResours -(); - -381 -g_wdow - = - `SDL_CeWdow -("icu", -g_ϡx -, -g_ϡy -, - -382 -g_width -, -g_height -, -ags -); - -383 if( -g_ic -) - -384 - `SDL_SWdowIc -( -g_wdow -, -g_ic -); - -386 if( -ags - & -SDL_WINDOW_OPENGL -) - -388 -g_sn - = - `SDL_GWdowSur -( -g_wdow -); - -389 -g_glcڋxt - = - `SDL_GL_CeCڋxt -( -g_wdow -); - -393 -g_sn - = - `SDL_CeRGBSur -(0, -g_width -, -g_height -, -g_b -, - -394 -RMASK -, -GMASK -, -BMASK -, -AMASK -); - -395 -g_nd - = - `SDL_CeRd -( -g_wdow -, -1, 0); - -396 -g_xtu - = - `SDL_CeTextu -( -g_nd -, - -397 -SDL_PIXELFORMAT_ABGR8888 -, - -398 -SDL_TEXTUREACCESS_STREAMING -, - -399 -g_width -, -g_height -); - -402  -g_sn -; - -403 - } -} - -406 #i -SDL_MAJOR_VERSION - == 1 - -407  - $SDL_COMPAT_SP -( -SDL_Sur - * -sur -,  -ags -, -SDL_C - * -cs -,  -fc -,  -ncs -) - -409  - `SDL_SP -( -sur -, -ags -, -cs -, -fc -, -ncs -); - -410 - } -} - -412  - $SDL_COMPAT_SP -( -SDL_Sur - * -sur -,  -ags -, -SDL_C - * -cs -,  -fc -,  -ncs -) - -416 - } -} - -419 #i -SDL_MAJOR_VERSION - == 1 - -420  - $SDL_COMPAT_SEvtFr -( -SDL_EvtFr - -fr -) - -422 - `SDL_SEvtFr -( -fr -); - -423 - } -} - -425  - $SDL_COMPAT_SEvtFr -( -SDL_EvtFr - -fr -) - -427 - `SDL_SEvtFr -( -fr -, -NULL -); - -428 - } -} - -431 #i -SDL_MAJOR_VERSION - == 1 - -432  - $SDL_COMPAT_Qu -() - -434 - `SDL_Qu -(); - -435 - } -} - -437  - $SDL_COMPAT_Qu -() - -439 - `FeResours -(); - -440 - `SDL_Qu -(); - -441 - } -} - -444 #ifde -__OPENGL_AVAILABLE__ - - -445 #i -SDL_MAJOR_VERSION - == 1 - -446  - $SDL_COMPAT_GL_SwBufrs -() - -448 - `SDL_GL_SwBufrs -(); - -449 - } -} - -451  - $SDL_COMPAT_GL_SwBufrs -() - -453 - `SDL_GL_SwWdow -( -g_wdow -); - -454 - } -} - -458 #ifde -__OPENGL_AVAILABLE__ - - -459 -SDL_Sur - * - $Vt -( -SDL_Sur -* -sfc -) - -461  -le -; - -462 -SDL_Sur -* -su - = - `SDL_CeRGBSur -( -sfc --> -ags -, sfc-> -w -, sfc-> -h -, - -463 -sfc --> -fm --> -BysPPix - * 8, sfc->fm-> -Rmask -, sfc->fm-> -Gmask -, - -464 -sfc --> -fm --> -Bmask -, sfc->fm-> -Amask -); - -466 i( -su -) - -468 -Ut8 -* -pixs - = (Ut8* -sfc -->pixels; - -469 -Ut8 -* -ixs - = (Ut8* -su --> -pixs -; - -471 -Ut32 - -pch - = -sfc -->pitch; - -472 -Ut32 - -pxngth - = -pch -* -sfc --> -h -; - -474  -le - = 0;< -sfc --> -h -; ++line) - -476 -Ut32 - -pos - = -le - * -pch -; - -477 - `memy -(& -ixs -[ -pos -], & -pixs -[( -pxngth --pos)- -pch -],itch); - -481  -su -; - -482 - } -} - -483 #i -SDL_MAJOR_VERSION - == 1 - -484  - $SDL_COMPAT_TakeSnsh -(* -ame -) - -486 -SDL_Sur - * -g_sn - = - `SDL_GVideoSur -(); - -488 if( -g_sn --> -ags - & -SDL_COMPAT_OPENGL -) - -491  -g_width - = -g_sn --> -w -; - -492  -g_height - = -g_sn --> -h -; - -493 -SDL_Sur - * - -; - -496 -SDL_Sur - * -surf - = - `SDL_CeRGBSur -( -SDL_SWSURFACE -, -g_width -, -g_height -, 24, -RMASK -, -GMASK -, -BMASK -, 0); - -497 - `glRdPixs -(0, 0, -g_width -, -g_height -, -GL_RGB -, -GL_UNSIGNED_BYTE -, -surf --> -pixs -); - -503 - - = - `Vt -( -surf -); - -504 - `SDL_SaveBMP -( - -, -ame -); - -506 - `SDL_FeSur -( - -); - -507 - `SDL_FeSur -( -surf -); - -510 - `SDL_SaveBMP -( -g_sn -, -ame -); - -511 - } -} - -513  - $SDL_COMPAT_TakeSnsh -(* -ame -) - -519 -SDL_Sur - * -surf - = - `SDL_CeRGBSur -( -SDL_SWSURFACE -, -g_width -, -g_height -, -g_b -, -RMASK -, -GMASK -, -BMASK -, -AMASK -); - -521 i( -surf - = -NULL -) - -528 - `glRdPixs -(0,0, -g_width -, -g_height -, -GL_RGBA -, -GL_UNSIGNED_BYTE -, -surf --> -pixs -); - -530 -SDL_Sur - * - - = - `Vt -( -surf -); - -531 - `SDL_SaveBMP -( - -, -ame -); - -533 - `SDL_FeSur -( - -); - -534 - `SDL_FeSur -( -surf -); - -535 - } -} - -538 #i -SDL_MAJOR_VERSION - == 1 - -539  - $SDL_COMPAT_TakeSnsh -(* -ame -) - -541 - `SDL_SaveBMP -( - `SDL_GVideoSur -(), -ame -); - -542 - } -} - -544  - $SDL_COMPAT_TakeSnsh -(* -ame -) - -546 - `SDL_SaveBMP -( -g_sn -, -ame -); - -547 - } -} - - @system_sdl.h - -22 #ide -ORICUTRON_SYSTEM_SDL_H - - -23  - #ORICUTRON_SYSTEM_SDL_H - - - ) - -25 #i -SDL_MAJOR_VERSION - == 1 - -26 #ifde -__SPECIFY_SDL_DIR__ - - -27  - ~ - -28  - ~ - -29 #ifde -WANT_WMINFO - - -30  - ~ - -33  - ~ - -34  - ~ - -35 #ifde -WANT_WMINFO - - -36  - ~ - -40 #ifde -__SPECIFY_SDL_DIR__ - - -41  - ~ - -42  - ~ - -43 #ifde -WANT_WMINFO - - -44  - ~ - -47  - ~ - -48  - ~ - -49 #ifde -WANT_WMINFO - - -50  - ~ - -55 #i -SDL_BYTEORDER - = -SDL_LIL_ENDIAN - - -56  - #_LE32 -( -X -(X) - - ) - -57  - #_LE16 -( -X -(X) - - ) - -58  - #_BE32 -( -X - - `SDL_Sw32 -(X) - - ) - -59  - #_BE16 -( -X - - `SDL_Sw16 -(X) - - ) - -60  - #_MAKE_LE32 -( -X -) - - ) - -61  - #_MAKE_LE16 -( -X -) - - ) - -62  - #_MAKE_BE32 -( -X -X = - `SDL_Sw32 -(X) - - ) - -63  - #_MAKE_BE16 -( -X -X = - `SDL_Sw16 -(X) - - ) - -65  - #_LE32 -( -X - - `SDL_Sw32 -(X) - - ) - -66  - #_LE16 -( -X - - `SDL_Sw16 -(X) - - ) - -67  - #_BE32 -( -X -(X) - - ) - -68  - #_BE16 -( -X -(X) - - ) - -69  - #_MAKE_LE32 -( -X -X = - `SDL_Sw32 -(X) - - ) - -70  - #_MAKE_LE16 -( -X -X = - `SDL_Sw16 -(X) - - ) - -71  - #_MAKE_BE32 -( -X -) - - ) - -72  - #_MAKE_BE16 -( -X -) - - ) - -76 #i -SDL_MAJOR_VERSION - == 1 - -77  -Ut16 - - tSDL_COMPAT_KEY -; - -78  -SDL_keysym - - tSDL_KEYSYM -; - -79  -SDL_VideoInfo - - tSDL_COMPAT_VideoInfo -; - -81  - #SDL_COMPAT_HWSURFACE - -SDL_HWSURFACE - - - ) - -82  - #SDL_COMPAT_HWPALETTE - -SDL_HWPALETTE - - - ) - -83  - #SDL_COMPAT_FULLSCREEN - -SDL_FULLSCREEN - - - ) - -85 #ifde -__OPENGL_AVAILABLE__ - - -86  - #SDL_COMPAT_OPENGL - -SDL_OPENGL - - - ) - -89  - #SDL_COMPAT_LOGPAL - -SDL_LOGPAL - - - ) - -90  - #SDL_COMPAT_PHYSPAL - -SDL_PHYSPAL - - - ) - -92  - #SDL_COMPAT_ACTIVEEVENT - -SDL_ACTIVEEVENT - - - ) - -95  -Ut32 - - tSDL_COMPAT_KEY -; - -96  -SDL_Keysym - - tSDL_KEYSYM -; - -97  -SDL_RdInfo - - tSDL_COMPAT_VideoInfo -; - -99  - #SDL_COMPAT_HWSURFACE - 0 - - ) - -100  - #SDL_COMPAT_HWPALETTE - 0 - - ) - -101  - #SDL_COMPAT_FULLSCREEN - -SDL_WINDOW_FULLSCREEN - - - ) - -103 #ifde -__OPENGL_AVAILABLE__ - - -104  - #SDL_COMPAT_OPENGL - -SDL_WINDOW_OPENGL - - - ) - -107  - #SDL_COMPAT_LOGPAL - 0 - - ) - -108  - #SDL_COMPAT_PHYSPAL - 0 - - ) - -110  - #SDL_COMPAT_ACTIVEEVENT - -SDL_WINDOWEVENT - - - ) - -112  - #SDL_DEFAULT_REPEAT_DELAY - 0 - - ) - -113  - #SDL_DEFAULT_REPEAT_INTERVAL - 0 - - ) - -115  - #SDLK_KP0 - -SDLK_KP_0 - - - ) - -116  - #SDLK_KP1 - -SDLK_KP_1 - - - ) - -117  - #SDLK_KP2 - -SDLK_KP_2 - - - ) - -118  - #SDLK_KP3 - -SDLK_KP_3 - - - ) - -119  - #SDLK_KP4 - -SDLK_KP_4 - - - ) - -120  - #SDLK_KP5 - -SDLK_KP_5 - - - ) - -121  - #SDLK_KP6 - -SDLK_KP_6 - - - ) - -122  - #SDLK_KP7 - -SDLK_KP_7 - - - ) - -123  - #SDLK_KP8 - -SDLK_KP_8 - - - ) - -124  - #SDLK_KP9 - -SDLK_KP_9 - - - ) - -126  - #SDLK_PRINT - -SDLK_PRINTSCREEN - - - ) - -130 #ifde -WANT_WMINFO - - -131  -SDL_COMPAT_GWMInfo -( -SDL_SysWMfo - * -fo -); - -134  -SDL_COMPAT_WM_SIc -( -SDL_Sur - * -ic -, -Ut8 - * -mask -); - -135  -SDL_COMPAT_WM_SCti -(cڡ * -t -, cڡ * -ic -); - -136 -SDL_bo - -SDL_COMPAT_IsAAive -( -SDL_Evt -* -evt -); - -137 -SDL_bo - -SDL_COMPAT_IsAFocud -( -SDL_Evt -* -evt -); - -138  -SDL_COMPAT_EbKeyRt -( -day -,  -rv -); - -139  -SDL_COMPAT_EbUNICODE -( -ab -); - -140 -SDL_COMPAT_KEY - -SDL_COMPAT_GKeysymUnicode -( -SDL_KEYSYM - -keysym -); - -141 -SDL_COMPAT_KEY - -SDL_COMPAT_TneUnicode -( -SDL_KEYSYM - -keysym -); - -142  -SDL_COMPAT_Fl -( -SDL_Sur -* -sn -); - -143  -SDL_COMPAT_GBsPPix -(); - -144  -SDL_COMPAT_WM_ToggFuSn -( -SDL_Sur - * -sur -); - -145 -SDL_Sur -* -SDL_COMPAT_SVideoMode -( -width -,  -height -,  -bpix -, -Ut32 - -ags -); - -146  -SDL_COMPAT_SP -( -SDL_Sur - * -sur -,  -ags -, -SDL_C - * -cs -,  -fc -,  -ncs -); - -147  -SDL_COMPAT_SEvtFr -( -SDL_EvtFr - -fr -); - -148  -SDL_COMPAT_Qu -(); - -149  -SDL_COMPAT_TakeSnsh -(* -ame -); - -151 #ifde -__OPENGL_AVAILABLE__ - - -152  -SDL_COMPAT_GL_SwBufrs -(); - -155  -r_tf -* -fmt -, ... ); - - @tape.c - -21  - ~ - -22  - ~ - -23  - ~ - -25  - ~"syem.h -" - -26  - ~"6502.h -" - -27  - ~"v.h -" - -28  - ~"8912.h -" - -29  - ~"gui.h -" - -30  - ~"disk.h -" - -31  - ~"mڙ.h -" - -32  - ~"6551.h -" - -33  - ~"mache.h -" - -34  - ~"joyick.h -" - -35  - ~"feq.h -" - -36  - ~".h -" - -37  - ~"msgbox.h -" - -39  -fe -[], -th -[]; - -40 -SDL_bo - -esh -; - -41  - gtmame -[4096]; - -42  -fmp -[]; - -46  - $_pup - -mache - * -ic - ) - -48  -tmp -[40]; - -50 if! -ic --> -me -[0] ) - -53 - `do_pup - -ic -, "\x0f\x10\x13" ); - -58 - `rtf - -tmp -, "\x0f\x10""%%-16s", -ic --> -m - ? 18 : 17, oric-> -me - ); - -59 - `do_pup - -ic -, -tmp - ); - -60 - } -} - -62  - $toggˏp - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ) - -64  -thd -[] = { 'O', 'R', 'T', 0 }; - -67 if -ic --> -p - ) - -69 - `fo - -ic --> -p - ); - -70 -ic --> -p - = -NULL -; - -71 -mem --> -me - = "Saveape output..."; - -72 -esh - = -SDL_TRUE -; - -77 if! - `feque - -ic -, "Ctuouut", -th -, -tmame -, -FR_TAPESAVEORT - ) ) - -82 if -tmame -[0] == 0 ) ; - -86 if( - ` -( -tmame -)>3&& ( - `rcmp -(&tmptapename[strlen(tmptapename)-4], ".tap")==0) ) - -87 -tmame -[ - ` -(tmptapename)-4] = 0; - -90 if( - ` -( -tmame -)<4|| ( - `rcmp -(&tmptapename[strlen(tmptapename)-4], ".ort")!=0) ) - -91 - `t -( -tmame -, ".ort", 4095); - -92 -tmame -[4095] = 0; - -94 - `joth - -th -, -tmame - ); - -97 -ic --> -p - = - `fݒ - -fmp -, "wb" ); - -98 if! -ic --> -p - ) - -101 - `msgbox - -ic -, -MSGBOX_OK -, "Unableo create file" ); - -106 - `fwre - -thd -, 4, 1, -ic --> -p -); - -109 -ic --> -pcou - = -1; - -110 -ic --> -ab - = (ic-> -v -. -b -&ic->v. -ddrb -)>>7; - -113 -mem --> -me - = "Stopapeecording"; - -114 -esh - = -SDL_TRUE -; - -115 - } -} - -126  - $_tup_hd - -mache - * -ic - ) - -128  -i -; - -130 -ic --> -dupbys - = 0; - -131 -ic --> -hdnd - = 0; - -133 if -ic --> -buf -[ic-> -offs -] != 0x16 ) - -137  -i -=0; -ic --> -buf -[ic-> -offs -+i]==0x16; i++ ) - -139 if( -ic --> -offs -+ -i ->ic-> -n - ) - -142 if -i - < 3 ) || ( -ic --> -buf -[ic-> -offs -+i] != 0x24 ) ) - -144 -i -++; - -145 if( -ic --> -offs -+ -i -+9>ic-> -n - ) - -147 -i -+=9; - -148  -ic --> -buf -[ic-> -offs -+ -i -] != 0 ) - -150 if( -ic --> -offs -+ -i ->ic-> -n - ) - -152 -i -++; - -154 -i -++; - -156 -ic --> -dupbys - = 80; - -157 -ic --> -hdnd - = oric-> -offs -+ -i -; - -158 - } -} - -161  - $_bchge - -v - *via ) - -163  -mache - * -ic - = -v -->oric; - -164  -bufr -[4], -b -, -bufwre -; - -165  -cou -; - -168 if! -ic --> -p - ) ; - -171 if -ic --> -p - =ic-> -tvf - ) ; - -173 -b - = ( -v --> -b - & v-> -ddrb -) >> 7; - -174 if -b - = -ic --> -ab - ) ; - -176 -ic --> -ab - = -b -; - -179 if -ic --> -pcou - < 0 ) - -182 -ic --> -pcou - = 0; - -183 - `utc - -b -, -ic --> -p - ); - -187 -cou - = ( -ic --> -pcou ->>1); - -189 if -cou - < 0xfc ) - -191 -bufr -[0] = -cou -; - -192 -bufwre - = 1; - -194 if -cou - < 0x100 ) - -196 -bufr -[0] = 0xfc; - -197 -bufr -[1] = -cou -; - -198 -bufwre - = 2; - -200 if -cou - < 0x10000 ) - -202 -bufr -[0] = 0xfd; - -203 -bufr -[1] = ( -cou ->>8)&0xff; - -204 -bufr -[2] = -cou -&0xff; - -205 -bufwre - = 3; - -209 -bufr -[0] = 0xfd; - -210 -bufr -[1] = 0xff; - -211 -bufr -[2] = 0xff; - -212 -bufwre - = 3; - -215 - `fwre - -bufr -, -bufwre -, 1, -ic --> -p - ); - -216 -ic --> -pcou - = 0; - -217 - } -} - -221  - $_tm - -mache - * -ic -, -SDL_bo - -m - ) - -223 if -m - = -ic --> -m - ) - -227 -esh - = -SDL_TRUE -; - -230 if! -ic --> -turbo - ) || ( !ic-> -pch__avaab - ) ) - -232 if! -ic --> -w - ) || ( oric-> -offs - < oric-> -nڿwd - ) ) - -236 if! -m - ) - -238 if -ic --> -b - > 0 ) - -239 -ic --> -offs -++; - -240 -ic --> -b - = 0; - -247 if -m - ) && - -248 -ic --> -buf - ) && - -249 -ic --> -offs - < oric-> -n - ) && - -250 -ic --> -buf -[ic-> -offs -] == 0x16 ) ) - -252 - `_tup_hd -( -ic -); - -258 -ic --> -m - = -m -; - -259 if -ic --> -me -[0] ) - `_pup -( oric ); - -260 - } -} - -263  - $_eje - -mache - * -ic - ) - -265 if -ic --> -buf - ) - ` -( oric->tapebuf ); - -266 -ic --> -buf - = -NULL -; - -267 -ic --> -n - = 0; - -268 -ic --> -me -[0] = 0; - -269 - `_pup - -ic - ); - -270 -esh - = -SDL_TRUE -; - -271 - } -} - -273  - $_xt_w_cou - -mache - * -ic - ) - -275  -n -; - -276  -nڿwd -; - -278 if -ic --> -offs - >ic-> -n - ) - -280 if -ic --> -nڿwd - !ic-> -n - ) - -281 -ic --> -hd - = 3; - -285 -n - = -ic --> -buf -[ic-> -offs -++]; - -286 i( -n - < 0xfc) - -288 -ic --> -cou - = -n -<<1; - -292  -n -) - -295 if -ic --> -offs - >(ic-> -n --1) ) - -297 -ic --> -offs - = oric-> -n -; - -298 -ic --> -hd - = 3; - -302 -nڿwd - = (( -ic --> -buf -[ic-> -offs -]<<8)|oric->tapebuf[oric->tapeoffs+1]) + oric->tapeoffs+2; - -303 if -nڿwd - > -ic --> -n - ) - -305 -ic --> -offs - = oric-> -n -; - -306 -ic --> -hd - = 3; - -310 -ic --> -nڿwd - =onrawend; - -311 -ic --> -offs - += 2; - -312 -ic --> -b - = 0; - -313 -ic --> -cou - = 2; - -314 -ic --> -out - = 0; - -315 - `_tup_hd - -ic - ); - -319 if -ic --> -offs - >ic-> -n - ) - -321 -ic --> -hd - = 3; - -325 -ic --> -cou - = oric-> -buf -[ic-> -offs -++] << 1; - -329 if -ic --> -offs - >(ic-> -n --1) ) - -331 -ic --> -offs - = oric-> -n -; - -332 -ic --> -hd - = 3; - -336 -ic --> -cou - = (ic-> -buf -[ic-> -offs -]<<9)|(oric->tapebuf[oric->tapeoffs+1]<<1); - -337 -ic --> -offs - += 2; - -342 -ic --> -offs - = oric-> -n -; - -343 -ic --> -hd - = 3; - -344 - } -} - -347  - $_wd - -mache - * -ic - ) - -349 -ic --> -nڿwd - = 0; - -350 if -ic --> -w - ) - -352 -ic --> -out - = oric-> -buf -[4]; - -353 - `v_wre_CB1 -& -ic --> -v -, oric-> -out - ); - -355 -ic --> -offs - = 5; - -356 - `_xt_w_cou - -ic - ); - -360 -ic --> -offs - = 0; - -361 -ic --> -b - = 0; - -362 -ic --> -cou - = 2; - -363 -ic --> -out - = 0; - -364 -ic --> -dupbys - = 0; - -366 if -ic --> -buf - ) - -367 - `_tup_hd - -ic - ); - -369 -ic --> -hd - = 0; - -370 -ic --> -day - = 0; - -371 -esh - = -SDL_TRUE -; - -372 - } -} - -377  - $xt_t_vue -* -tda -, * -offt -,  -d -, -SDL_bo - * -ypc - ) - -379  -v -=0, -sk -; - -381 (* -offt -< -d -) - -383  -tda -[* -offt -]) - -386 i((* -offt ->( -d --1))  0; - -387 -v - = -tda -[(* -offt -)+1]; - -388 (* -offt -) += 2; - -389  -v -; - -392 i((* -offt ->( -d --2))  0; - -393 -v - = ( -tda -[(* -offt -)+1]<<8)|ortdata[(*offset)+2]; - -394 (* -offt -) += 3; - -395  -v -; - -401 i((* -offt ->( -d --2))  0; - -402 -sk - = ( -tda -[(* -offt -)+1]<<8)|ortdata[(*offset)+2]; - -403 (* -offt -)+=3; - -404 i((* -offt ->( -d -- -sk -))  0; - -405 (* -offt -)+= -sk -; - -406 (* -ypc - -SDL_TRUE -; - -410  -tda -[(* -offt -)++]; - -415 - } -} - -419 - mTAPSEC_STATE_SEARCH - = 0, - -420 - mTAPSEC_STATE_LEADER -, - -421 - mTAPSEC_STATE_FINDHEADER -, - -422 - mTAPSEC_STATE_HEADER -, - -423 - mTAPSEC_STATE_FILENAME -, - -424 - mTAPSEC_STATE_FINDDATA -, - -425 - mTAPSEC_STATE_DATA - - -428  - $vidby -( -accum -) - -430  -i -, -ry - = 0; - -431 i(( -accum -&3)!=1)  0; - -432  -i -=4; i!=0x800; i<<=1) - -433 i( -accum -& -i - -ry - ^= 1; - -434  -ry -; - -435 - } -} - -438  - $pis -* -tbuf -,  -tbu -, * -sch -, -SDL_bo - -ow - ) - -440  -t_offs -, -b -, -t_v -, -cyccou -; - -441  -accum -, -e -, -thisb -, -adt -=0, -adcou -=0; - -442  -ϡ_offts -[20], -i -, -bcou -, -pbys -=0; - -443  -da_bys -=0, -ow0s -=0, -ow1s -=0; - -444 -SDL_bo - -ypc - = -SDL_FALSE -; - -446 -t_offs - = 4; - -447 -b - = -tbuf -[ -t_offs -++]; - -448 -cyccou - = 0; - -449 -e - = -TAPSEC_STATE_SEARCH -; - -450 -accum - = 0; - -451 -bcou - = 0; - -453  -i -=0; i<20; i++) - -454 -ϡ_offts -[ -i -] = 5; - -457  -t_offs - < -tbu -) - -460  -i -=0; i<19; i++) - -461 -ϡ_offts -[ -i -] =ast_offsets[i+1]; - -462 -ϡ_offts -[19] = -t_offs -; - -464 -t_v - = - `xt_t_vue -( -tbuf -, & -t_offs -, -tbu -, & -ypc -); - -466 i( -t_v - < 1 -tbu -; - -469 -cyccou - + -t_v -; - -472 -b - ^= 1; - -475 i( -b -) - -478 i( -cyccou - < 100) - -482 -thisb - = - `TIME_TO_BIT -( -cyccou -); - -485 i( -thisb - == -1) - -493 -e - = -TAPSEC_STATE_SEARCH -; - -494 -cyccou - = 0; - -495 -accum - = 0; - -496 -ow1s - = 0; - -497 -ow0s - = 0; - -502 i( -ow -) - -504 i( -thisb -==1) - -506 -ow1s -++; - -507 -ow0s -=0; - -509 i( -ow1s - != 2) - -511 i( -ow1s - >= 8) - -512 -ow1s - = 0; - -513 -cyccou -=0; - -519 -ow0s -++; - -520 -ow1s -=0; - -522 i( -ow0s - != 2) - -524 i( -ow0s - >= 4) - -525 -ow0s - = 0; - -526 -cyccou -=0; - -533 -accum - = (accum>>1| ( -thisb -<<10); - -536  -e -) - -538  -TAPSEC_STATE_SEARCH -: - -540 i(( -accum -&0x7fe) == 0x58) - -544 -adt - = -ϡ_offts -[8]; - -545 -adcou - = 1; - -546 -e - = -TAPSEC_STATE_LEADER -; - -547 -bcou - = 0; - -549 i( - `vidby -( -accum -)) - -556  -TAPSEC_STATE_LEADER -: - -557 -bcou - = (bitcount+1)%14; - -558 i(( -bcou -==13)&& - `vidby -( -accum -)) bitcount = 0; - -559 i(! -bcou -) - -563 i(( -accum -&0x7fe) != 0x58) - -566 -e - = -TAPSEC_STATE_SEARCH -; - -567 -cyccou - = 0; - -571 -adcou -++; - -572 i( -adcou -==4) - -574 -e - = -TAPSEC_STATE_FINDHEADER -; - -580  -TAPSEC_STATE_FINDHEADER -: - -581 -bcou - = (bitcount+1)%14; - -582 i(( -bcou -==13)&& - `vidby -( -accum -)) bitcount = 0; - -583 i(! -bcou -) - -587 i(( -accum -&0x7fe) == 0x490) - -591 -sch -[0] = 0x16; - -592 -sch -[1] = 0x16; - -593 -sch -[2] = 0x16; - -594 -sch -[3] = 0x24; - -595 -pbys - = 4; - -596 -e - = -TAPSEC_STATE_HEADER -; - -601  -TAPSEC_STATE_HEADER -: - -602 -bcou - = (bitcount+1)%14; - -603 i(( -bcou -==13)&& - `vidby -( -accum -)) bitcount = 0; - -604 i(! -bcou -) - -608 -sch -[ -pbys -++] = ( -accum ->>2)&0xff; - -609 i( -pbys - == 13) - -611  -ld_t -, -ld_d -; - -613 -ld_t - = ( -sch -[10]<<8)|scratch[11]; - -614 -ld_d - = ( -sch -[ 8]<<8)|scratch[ 9]; - -619 i( -ld_d - < -ld_t -) - -621 -e - = -TAPSEC_STATE_SEARCH -; - -622 -cyccou - = 0; - -626 -da_bys - = ( -ld_d -- -ld_t -)+1; - -627 -e - = -TAPSEC_STATE_FILENAME -; - -635  -TAPSEC_STATE_FILENAME -: - -636 -bcou - = (bitcount+1)%14; - -637 i(( -bcou -==13)&& - `vidby -( -accum -)) bitcount = 0; - -638 i(! -bcou -) - -642 -sch -[ -pbys -++] = ( -accum ->>2)&0xff; - -643 i( -sch -[ -pbys --1] == 0) - -645 -e - = -TAPSEC_STATE_FINDDATA -; - -650  -TAPSEC_STATE_FINDDATA -: - -652 i( - `vidby -( -accum -)) - -656 -sch -[ -pbys -++] = ( -accum ->>2)&0xff; - -657 -da_bys ---; - -658 -bcou -=0; - -659 -e - = -TAPSEC_STATE_DATA -; - -663  -TAPSEC_STATE_DATA -: - -664 -bcou - = (bitcount+1)%14; - -665 i(( -bcou -==13)&& - `vidby -( -accum -)) bitcount = 0; - -666 i(! -bcou -) - -668 -sch -[ -pbys -++] = ( -accum ->>2)&0xff; - -669 -da_bys ---; - -674 i( -da_bys - < 0) - -676 -e - = -TAPSEC_STATE_SEARCH -; - -680 i( -da_bys - > 0) - -683 i((! -ypc -&& ( -adt - < 512)) - -684 -adt - = 5; - -687 -tbuf -[ -adt -++] = 0xff; - -688 -tbuf -[ -adt -++] = ( -pbys ->>8)&0xff; - -689 -tbuf -[ -adt -++] = ( -pbys -&0xff); - -690 - `memy -(& -tbuf -[ -adt -], -sch -, -pbys -); - -691 -adt - + -pbys -; - -692 - `memmove -(& -tbuf -[ -adt -], &tbuf[ -t_offs -], -tbu --ort_offs); - -693 -tbu - -( -t_offs -- -adt -); - -694 -t_offs - = -adt -; - -695 -e - = -TAPSEC_STATE_SEARCH -; - -696 -accum - = 0; - -697 -ypc - = -SDL_TRUE -; - -706 -cyccou - = 0; - -710  -tbu -; - -711 - } -} - -717  -le - sigd  - $gsmp -(* -buf -, -SDL_bo - -is8b -) - -719  -is8b - ? (()* -buf -)-128 : ()((buf[1]<<8)|buf[0]); - -720 - } -} - -727 -SDL_bo - - $wav_cvt - -mache - * -ic - ) - -730 * -p -= -ic --> -buf -, * -da -= -NULL -, * -tbuf -=NULL; - -731  -i -, -j -, -k -, -l -, -chunkn -, -bps -=0, -eq -=0, -smpd -=0, -d -=0, -܎ -; - -732 sigd  -smaxl -, -sml -, -smaxr -, -smr -, -dcoffs -=0, -dcoffv -; - -733 sigd * -ϡsmps - = -NULL -; - -734 sigd  -smp -=0; - -736  -s -, -cou -, -pcou -; - -737 -SDL_bo - -eo - = -SDL_FALSE -, -fmt - = SDL_FALSE, -uright - = SDL_FALSE; - -740 -i - = 12; - -741 (! -fmt -|| (! -da -)) - -744 i( -i - >( -ic --> -n --8) -SDL_FALSE -; - -747 -chunkn - = ( -p -[ -i -+7]<<24)|(p[i+6]<<16)|(p[i+5]<<8)|p[i+4]; - -750 i(( -i -+ -chunkn -+8> -ic --> -n -) - -751  -SDL_FALSE -; - -754 i( - `memcmp -(& -p -[ -i -], "fmt ", 4) == 0) - -757 i(( -chunkn - !16|| ((( -p -[ -i -+9]<<8)|p[i+8])!=1)) - -758  -SDL_FALSE -; - -761 ( -p -[ -i -+11]<<8)|(p[i+10])) - -763 1: -eo - = -SDL_FALSE -; ; - -764 2: -eo - = -SDL_TRUE -; ; - -765 :  -SDL_FALSE -; ; - -769 -eq - = ( -p -[ -i -+15]<<24)|(p[i+14]<<16)|(p[i+13]<<8)|p[i+12]; - -770 if! -eq - )  -SDL_FALSE -; - -773 -smpd - = ( -p -[ -i -+21]<<16)|p[i+20]; - -776 -bps - = ( -p -[ -i -+23]<<16)|p[i+22]; - -777 i(( -bps -!=8)&&(bps!=16) -SDL_FALSE -; - -780 -bps - /= 8; - -782 -fmt - = -SDL_TRUE -; - -784 i( - `memcmp -(& -p -[ -i -], "data", 4) == 0) - -786 -da - = & -p -[ -i -+8]; - -787 -d - = -chunkn -; - -791 -i - + -chunkn -+8; - -796 -smaxl - = -70000; - -797 -sml - = 70000; - -798 -smaxr - = -70000; - -799 -smr - = 70000; - -801  -i -=0; i< -d -; i+= -smpd -) - -803 -smp - = - `gsmp -(& -da -[ -i -], -bps -==1); - -804 i( -smp - < -sml -) sminl = smp; - -805 i( -smp - > -smaxl -) smaxl = smp; - -807 i( -eo -) - -809 -smp - = - `gsmp -(& -da -[ -i -+ -bps -], bps==1); - -810 i( -smp - < -smr -) sminr = smp; - -811 i( -smp - > -smaxr -) smaxr = smp; - -816 i(( -eo -&& (( -smaxr -- -smr -)>( -smaxl -- -sml -))) - -818 -uright - = -SDL_TRUE -; - -822 -uright - = -SDL_FALSE -; - -825 -dcoffv - = -eq - / 700; - -826 i( -dcoffv -) - -828 -ϡsmps - = - `mloc -( -dcoffv - * ()); - -829 i( -ϡsmps - - `memt -asmps, 0, -dcoffv - * ()); - -831 -dcoffv ---; - -834 -j - = 0; - -835  -i -=0; i< -d -; i+= -smpd -) - -837 i( -uright -) - -838 -smp - = - `gsmp -(& -da -[ -i -+ -bps -], bps==1); - -840 -smp - = - `gsmp -(& -da -[ -i -], -bps -==1); - -842 i( -ϡsmps -) - -844 -smaxl - = -smp -; - -845 -sml - = -smp -; - -847  -k -=0; k< -dcoffv -; k++) - -849 -ϡsmps -[ -k -] =astsmps[k+1]; - -851 i( -ϡsmps -[ -k -] < -sml -) sminl =astsmps[k]; - -852 i( -ϡsmps -[ -k -] > -smaxl -) smaxl =astsmps[k]; - -854 -dcoffs - = (( -smaxl -- -sml -)/2)+sminl; - -857 i( -j - > -ic --> -n -) - -864 -ic --> -buf -[ -j -++] = ( -smp -> -dcoffs -) ? 1 : 0; - -871 -s - = 500000 / (() -eq -); - -874 -܎ - = 5; - -875 -i - = -ic --> -buf -[0]; - -876 -cou - = 0.0f; - -877 -pcou - = 0.0f; - -878  -k -=1; k< -j -; k++) - -880 i( -ic --> -buf -[ -k -] ! -i -) - -882 -i - = -ic --> -buf -[ -k -]; - -883 i((() -cou -) < 1) - -886 i( -܎ ->5) ortlen--; - -887 -cou - + -pcou -; - -889 i((() -cou -) < 0xfc) - -891 -܎ -++; - -892 -pcou - = -cou -; - -893 -cou - = 0.0f; - -895 i((() -cou -) < 0x100) - -897 -܎ -+=2; - -898 -pcou - = -cou -; - -899 -cou - = 0.0f; - -903 -܎ -+=3; - -904 -pcou - = -cou -; - -905 -cou - = 0.0f; - -908 -cou -+= -s -; - -911 - ` - -ϡsmps - ); - -913 -tbuf - = - `mloc -( -܎ -); - -914 i(! -tbuf - -SDL_FALSE -; - -917 - `memy -( -tbuf -, "ORT\0", 4); - -920 -i - = -ic --> -buf -[0]; - -921 -tbuf -[4] = -i -; - -922 -cou - = 0.0f; - -923 -pcou - = 0.0f; - -924 -l - = 5; - -925  -k -=1; k< -j -; k++) - -927 i( -ic --> -buf -[ -k -] ! -i -) - -929 -i - = -ic --> -buf -[ -k -]; - -930 i((() -cou -) < 1) - -933 i( -l -==5) - -934 -tbuf -[4] = -i -; - -936 -l ---; - -937 -cou - + -pcou -; - -939 i((() -cou -) < 0xfc) - -941 -tbuf -[ -l -++] = -cou -; - -942 -pcou - = -cou -; - -943 -cou - = 0.0f; - -945 i((() -cou -) < 0x100) - -947 -tbuf -[ -l -++] = 0xfc; - -948 -tbuf -[ -l -++] = -cou -; - -949 -pcou - = -cou -; - -950 -cou - = 0.0f; - -954 -tbuf -[ -l -++] = 0xfd; - -955 -tbuf -[ -l -++] = ((() -cou -)>>8)&0xff; - -956 -tbuf -[ -l -++] = (() -cou -)&0xff; - -957 -pcou - = -cou -; - -958 -cou - = 0.0f; - -961 -cou -+= -s -; - -966 -܎ - = - `pis -( -tbuf -, on, -ic --> -buf -, -SDL_FALSE -); - -967 -܎ - = - `pis -( -tbuf -, on, -ic --> -buf -, -SDL_TRUE -); - -970 - ` -( -ic --> -buf -); - -971 -ic --> -buf - = -tbuf -; - -972 -ic --> -n - = -܎ -; - -974  -SDL_TRUE -; - -975 - } -} - -978 -SDL_bo - - $_ld_p - -mache - * -ic -, * -ame - ) - -980 -FILE - * -f -; - -983 -f - = - `fݒ - -ame -, "rb" ); - -984 if! -f - )  -SDL_FALSE -; - -987 - `_eje - -ic - ); - -990 - `fek - -f -, 0, -SEEK_END - ); - -991 -ic --> -n - = () - `l - -f - ); - -992 - `fek - -f -, 0, -SEEK_SET - ); - -994 if -ic --> -n - <= 4 ) - -996 - `fo - -f - ); - -997  -SDL_FALSE -; - -1001 -ic --> -buf - = - `mloc -ic-> -n -+1 ); - -1002 if! -ic --> -buf - ) - -1004 - `fo - -f - ); - -1005 -ic --> -n - = 0; - -1006  -SDL_FALSE -; - -1009 if - `d -& -ic --> -buf -[0], oric-> -n -, 1, -f - ) != 1 ) - -1011 - `fo - -f - ); - -1012 - `_eje - -ic - ); - -1013  -SDL_FALSE -; - -1016 - `fo - -f - ); - -1019 i(( -ic --> -n - >= 36) && - -1020 ( - `memcmp -( -ic --> -buf -, "RIFF", 4) == 0) && - -1021 ( - `memcmp -( -ic --> -buf -+8, "WAVE", 4) == 0)) - -1023 i(! - `wav_cvt - -ic - )) - -1025 - `msgbox - -ic -, -MSGBOX_OK -, "Invalid wav file" ); - -1026 - `_eje - -ic - ); - -1027  -SDL_FALSE -; - -1030 -ic --> -w - = -SDL_TRUE -; - -1033 i( - `memcmp -( -ic --> -buf -, "ORT\0", 4) == 0) - -1035 -ic --> -w - = -SDL_TRUE -; - -1038 i( - `memcmp -( -ic --> -buf -, "\x16\x16\x16", 3) == 0) - -1040 -ic --> -w - = -SDL_FALSE -; - -1044 -ic --> -n -++; - -1049 - `_eje - -ic - ); - -1050 - `msgbox - -ic -, -MSGBOX_OK -, "Unrecognisedape format" ); - -1051  -SDL_FALSE -; - -1055 - `_wd - -ic - ); - -1058 if - ` - -ame - ) > 31 ) - -1060 - `y - -ic --> -me -, & -ame -[ - ` -(fname)-31], 32 ); - -1061 -ic --> -me -[0] = 22; - -1063 - `y - -ic --> -me -, -ame -, 32 ); - -1065 -ic --> -me -[31] = 0; - -1068 - `_pup - -ic - ); - -1070  -SDL_TRUE -; - -1071 - } -} - -1073  - $_auto - -mache - * -ic - ) - -1075 * -od -; - -1076  -i -; - -1077 -SDL_bo - -_found -; - -1079 if - `cmp -(*)& -ic --> -mem -[ic-> -pch_fd_gme_addr -], oric-> -ϡfe -, 16 ) == 0 ) - -1080 -ic --> -mem -[ic-> -pch_fd_gme_addr -] = 0; - -1083 - `ry - -fe -, -ic --> -ϡfe - ); - -1084 -i - = () - ` -( -fe -); - -1086 -od - = - `gcwd - -NULL -, 0 ); - -1087 - `chd - -th - ); - -1088 -_found - = - `_ld_p - -ic -, -fe - ); - -1089 if! -_found - ) - -1092 - `ry -& -fe -[ -i -], ".tap" ); - -1093 -_found - = - `_ld_p - -ic -, -fe - ); - -1095 if! -_found - ) - -1098 - `ry -& -fe -[ -i -], ".ort" ); - -1099 - `_ld_p - -ic -, -fe - ); - -1102 if -ic --> -buf - ) - -1105 -ic --> -ϡfe -[0] = 0; - -1108 - `chd - -od - ); - -1109 - ` - -od - ); - -1110 - } -} - -1112  - $__vch - -mache - * -ic - ) - -1114 if! -ic --> -tvf - ) ; - -1116 if -ic --> -tvf - =ic-> -p - ) - -1118  -bufda -[2]; - -1119 - `fek - -ic --> -tvf -, oric-> -pvoffs -, -SEEK_SET - ); - -1120 -bufda -[0] = ( -ic --> -pvbys ->>8)&0xff; - -1121 -bufda -[1] = -ic --> -pvbys -&0xff; - -1122 - `fwre - -bufda -, 2, 1, -ic --> -tvf - ); - -1123 -ic --> -pvoffs - = 0; - -1124 -ic --> -pvbys - = 0; - -1128 - `fo - -ic --> -tvf - ); - -1131 -ic --> -tvf - = -NULL -; - -1132 - } -} - -1135  - $_tches - -mache - * -ic - ) - -1137 -St32 - -i -, -j -; - -1139 if -ic --> -rom - ) - -1141 if -ic --> -pch_fd_avaab - ) - -1146 if -ic --> -u -. -lc - =ic-> -pch_fd_d_gme_pc - ) || - -1147 -ic --> -u -. -lc - =ic-> -pch_fd__gme_pc - ) ) - -1150  -i -=0; i<16; i++ ) - -1152 -j - = -ic --> -u -. - `ad -&ic->u, oric-> -pch_fd_gme_addr -+ -i - ); - -1153 if! -j - ) ; - -1154 -ic --> -ϡfe -[ -i -] = -j -; - -1156 -ic --> -ϡfe -[ -i -] = 0; - -1158 if -ic --> -u -. - `ad -&ic->u, oric-> -pch_fd_gme_addr - ) != 0 ) && - -1159 -ic --> -auto - ) ) - -1163 if! -ic --> -buf - ) || - -1164 -ic --> -offs - >ic-> -n - -1 ) || - -1165 -i - > 3 ) && ( - `rcmp -& -ic --> -ϡfe -[i-4], ".tap" ) == 0 ) ) || - -1166 -i - > 3 ) && ( - `rcmp -& -ic --> -ϡfe -[i-4], ".ort" ) == 0 ) ) || - -1167 -i - > 3 ) && ( - `rcmp -& -ic --> -ϡfe -[i-4], ".wav" ) == 0 ) ) ) - -1169 - `_auto - -ic - ); - -1170 -ic --> -u -. - `wre -&ic->u, oric-> -pch_fd_gme_addr -, 0 ); - -1174 if -ic --> -u -. -lc - =ic-> -pch_fd_cve_gme_pc - ) || - -1175 -ic --> -u -. -lc - =ic-> -pch_fd_e_gme_pc - ) ) && - -1176 ! -ic --> -p - ) || ( oric-> -turbo - ) ) ) - -1179 if -ic --> -tvf - ) - -1180 - `__vch - -ic - ); - -1183 if -ic --> -p - ) - -1185 -ic --> -tvf - = oric-> -p -; - -1186 if -ic --> -pcou - < 0 ) - -1187 - `utc -0, -ic --> -p - ); - -1188 - `utc -0xff, -ic --> -p - ); - -1189 -ic --> -pvoffs - = () - `l -(ic-> -p -); - -1190 - `utc -0x00, -ic --> -p - ); - -1191 - `utc -0x00, -ic --> -p - ); - -1192 -ic --> -pvbys - = 0; - -1196 * -od - = -NULL -; - -1199  -i -=0; i<16; i++ ) - -1201 -j - = -ic --> -u -. - `ad -&ic->u, oric-> -pch_fd_gme_addr -+ -i - ); - -1202 if! -j - ) ; - -1203 -tmame -[ -i -] = -j -; - -1205 -tmame -[ -i -] = 0; - -1208 if -tmame -[0] == 0 ) - -1210 if! - `feque - -ic -, "Savt؏", -th -, -tmame -, -FR_TAPESAVETAP - ) ) - -1211 -tmame -[0] = 0; - -1215 if -tmame -[0] ) - -1217 if( - ` -( -tmame -< 4|| ( - `rcmp -(&tmptapename[strlen(tmptapename)-4], ".tap") != 0) ) - -1219 i( - ` -( -tmame -)+5<(tmptapename)) - -1220 - `t -( -tmame -, ".p", - ` -(tmptapename)+5); - -1221 -tmame -[(tmptapename)-1] = 0; - -1225 -od - = - `gcwd - -NULL -, 0 ); - -1226 if -od - ) - -1228 - `chd - -th - ); - -1229 -ic --> -tvf - = - `fݒ -( -tmame -, "wb"); - -1230 - `chd - -od - ); - -1231 - ` - -od - ); - -1235 if -ic --> -u -. -lc - =ic-> -pch__cve_d_pc - ) || - -1236 -ic --> -u -. -lc - =ic-> -pch__e_d_pc - ) ) - -1238 -SDL_bo - -jup - = ( -ic --> -tvf - !ic-> -p -); - -1239 - `__vch - -ic - ); - -1240 if -jup - ) - -1243 - `tf - -fmp -, 4096+512+4-1, "\x0f\x10 Saved%s", -tmame - ); - -1244 -fmp -[31] = 0; - -1245 i( - ` -( -tmame -) > 20) - -1247 -fmp -[30] = '\x16'; - -1249 - `do_pup - -ic -, -fmp - ); - -1251 -tmame -[0] = 0; - -1255 if -ic --> -pch__ve_avaab - ) && ( ( !ic-> -p - ) || ( oric-> -turbo - ) ) ) - -1257 if -ic --> -u -. -lc - =ic-> -pch__putby_pc - ) - -1259 if -ic --> -tvf - ) - -1261 - `utc - -ic --> -u -. -a -, oric-> -tvf - ); - -1262 if -ic --> -tvf - =ic-> -p - ) - -1263 -ic --> -pvbys -++; - -1266 -ic --> -u -. -lc - = oric-> -pch__putby_d_pc -; - -1267 -ic --> -u -. -lc - = oric->u. - `ad -&ic->u, oric->u. -lc - ); - -1269 if -ic --> -u -. -lc - =ic-> -pch__wrd_pc - ) - -1271 if -ic --> -tvf - ) - -1273  -ad -[] = { 0x16, 0x16, 0x16, 0x16 }; - -1274 - `fwre - -ad -, 4, 1, -ic --> -tvf - ); - -1275 if -ic --> -tvf - =ic-> -p - ) - -1276 -ic --> -pvbys - += 4; - -1279 -ic --> -u -. -lc - = oric-> -pch__wrd_d_pc -; - -1280 -ic --> -u -. -lc - = oric->u. - `ad -&ic->u, oric->u. -lc - ); - -1288 if! -ic --> -buf - ) || ( !ic-> -m - ) ) - -1290 if -ic --> -pch__avaab - ) && ( oric-> -turbo - ) && ( oric-> -rom - ) && ( oric-> -u -. -lc - =ic-> -pch__gsync_pc - ) ) - -1291 -ic --> -turbo_syncack - = oric-> -u -. - -; - -1295 if -ic --> -turbo_foff - ) && ( oric-> -pch__avaab - ) && ( oric-> -rom - ) && ( oric-> -u -. -lc - =ic-> -pch__gsync_d_pc - ) ) - -1296 -ic --> -turbo_foff - = -SDL_FALSE -; - -1300 if( -ic --> -w - ) && ( oric-> -offs - >ic-> -nڿwd - )) ; - -1302 if(! -ic --> -buf - ) || ( oric-> -offs - >ic-> -n - )) ; - -1305 if -ic --> -pch__avaab - ) && ( oric-> -turbo - ) && ( !ic-> -turbo_foff - ) && ( oric-> -rom - ) ) - -1307 -SDL_bo - -dosynch -; - -1309 -dosynch - = -SDL_FALSE -; - -1311 if -ic --> -u -. -lc - =ic-> -pch__gsync_lo_pc - ) - -1320 if -ic --> -turbo_syncack - == -1 ) - -1323 -ic --> -turbo_foff - = -SDL_TRUE -; - -1328 -ic --> -u -. - - = oric-> -turbo_syncack -; - -1329 -ic --> -turbo_syncack - = -1; - -1330 -dosynch - = -SDL_TRUE -; - -1333 if -ic --> -u -. -lc - =ic-> -pch__gsync_pc - ) || ( -dosynch - ) ) - -1336 if -ic --> -buf -[ic-> -offs -] != 0x16 ) - -1341 -ic --> -offs -++; - -1344 if -ic --> -offs - >ic-> -n - ) - -1346 -esh - = -SDL_TRUE -; - -1349 }  -ic --> -buf -[ic-> -offs -] != 0x16 ); - -1353 -ic --> -u -. -lc - = oric-> -pch__gsync_d_pc -; - -1354 -ic --> -u -. -lc - = oric->u. - `ad -(&ic->u, oric->u. -lc -); - -1358 if -ic --> -u -. -lc - =ic-> -pch__adby_pc - ) - -1361 -ic --> -u -. -a - = oric-> -buf -[ic-> -offs -++]; - -1364 -ic --> -u -. -f_z - = oric->u. -a - == 0; - -1365 -ic --> -u -. -f_c - = oric-> -pch__adby_ty - ? 1 : 0; - -1368 if -ic --> -pch__adby_eby_addr - !-1 ) oric-> -u -. - `wre -&ic->u, oric->pch__adby_eby_addr, oric->u. -a - ); - -1369 if -ic --> -pch__adby_ezo_addr - !-1 ) oric-> -u -. - `wre -( &oric->cpu, oric->pch_tt_readbyte_storezero_addr, 0x00 ); - -1372 -ic --> -u -. -lc - = oric-> -pch__adby_d_pc -; - -1373 -ic --> -u -. -lc - = oric->u. - `ad -&ic->u, oric->u. -lc - ); - -1374 if -ic --> -offs - >ic-> -n - ) -esh - = -SDL_TRUE -; - -1377 - } -} - -1380  - $_ticktock - -mache - * -ic -,  -cyes - ) - -1382 -St32 - -j -; - -1385 if -ic --> -p - ) && ( oric-> -pcou - != -1 ) ) - -1386 -ic --> -pcou - + -cyes -; - -1398 if -ic --> -vsynchack - ) - -1400 -j - = (0 = -ic --> -vsync - || 260 < oric->vsync); - -1401 if -ic --> -v -. -cb1 - ! -j - ) - -1402 - `v_wre_CB1 -& -ic --> -v -, -j - ); - -1405 if -ic --> -vsync - > 0 ) - -1407 -ic --> -vsync - - -cyes -; - -1408 if -ic --> -vsync - < 0 ) - -1409 -ic --> -vsync - = 0; - -1413 if! -ic --> -buf - ) || ( !ic-> -m - ) ) - -1417 if -ic --> -offs - < 0 ) || ( oric->off>ic-> -n - ) ) - -1419 if -ic --> -hd - > 2 ) - -1422 if -ic --> -ϡfe -[0] ) && ( oric-> -auto - ) ) - -1424 - `_auto - -ic - ); - -1425 -ic --> -ϡfe -[0] = 0; - -1431 if -ic --> -pch__avaab - ) && ( oric-> -turbo - ) && ( !ic-> -turbo_foff - ) && ( oric-> -rom - ) && ( !ic-> -w - ) ) - -1434 if -ic --> -hd - > 2 ) - -1437 if -ic --> -hdnd - !0 ) && ( oric-> -offs - == oric->tapehdrend ) ) - -1439 -ic --> -day - = 1281; - -1440 -ic --> -hdnd - = 0; - -1445 if -ic --> -cou - > -cyes - ) - -1447 -ic --> -cou - - -cyes -; - -1448 if -ic --> -day - > 0 ) - -1450 -ic --> -day - - -cyes -; - -1451 if -ic --> -day - < 0 ) - -1452 -ic --> -day - = 1; - -1458 -ic --> -out - ^= 1; - -1459 if! -ic --> -vsynchack - ) - -1462 if -ic --> -noi - ) - -1464 - `ay_lockaudio -& -ic --> -ay - ); - -1465 if -ic --> -ay -. -do_logcye_t - ) - -1467 -ic --> -ay -. -logcye - = oric->ay. -wlogcye -; - -1468 -ic --> -ay -. -do_logcye_t - = -SDL_FALSE -; - -1470 if -ic --> -ay -. -ogged - < -TAPELOG_SIZE - ) - -1472 -ic --> -ay -. -log -[ic->ay. -ogged - ]. -cye - = oric->ay. -logcye -; - -1473 -ic --> -ay -. -log -[ic->ay. -ogged -++]. -v - = oric-> -out -; - -1478 - `v_wre_CB1 -& -ic --> -v -, oric-> -out - ); - -1481 if -ic --> -day - > 0 ) - -1483 -ic --> -day - - -cyes -; - -1484 if -ic --> -day - <= 0) - -1486 if -ic --> -b - == 1 ) - -1487 -ic --> -day - = 1; - -1489 -ic --> -day - = 0; - -1491 -ic --> -cou - = -TAPE_1_PULSE -; - -1495 if -ic --> -offs - >ic-> -n - ) - -1497  -ic --> -hd - ) - -1499 0: -ic --> -cou - = -TAPE_1_PULSE -; ; - -1500 1: -ic --> -cou - = 0x36*2; ; - -1502 -ic --> -hd -++; - -1503 -esh - = -SDL_TRUE -; - -1508 if -ic --> -w - ) - -1511 if -ic --> -offs - >ic-> -nڿwd - ) - -1513 - `_xt_w_cou - -ic - ); - -1514 if -ic --> -hd - > 2 ) - -1515 -esh - = -SDL_TRUE -; - -1522 if -ic --> -out - ) - -1524  -ic --> -b - ) - -1527 -ic --> -time - = -TAPE_1_PULSE -; - -1531 -ic --> -time - = -TAPE_0_PULSE -; - -1532 -ic --> -ry - = 1; - -1536 if -ic --> -buf -[ic-> -offs -]&(1<<(ic-> -b --2)) ) - -1538 -ic --> -time - = -TAPE_1_PULSE -; - -1539 -ic --> -ry - ^= 1; - -1541 -ic --> -time - = -TAPE_0_PULSE -; - -1546 if -ic --> -ry - ) - -1547 -ic --> -time - = -TAPE_1_PULSE -; - -1549 -ic --> -time - = -TAPE_0_PULSE -; - -1555 -ic --> -time - = -TAPE_1_PULSE -; - -1560 -ic --> -b - = (oric->tapebit+1)%14; - -1561 if! -ic --> -b - ) - -1563 if -ic --> -dupbys - > 0 ) - -1564 -ic --> -dupbys ---; - -1566 -ic --> -offs -++; - -1569 -ic --> -cou - = oric-> -time -; - -1570 - } -} - - @tape.h - -21  - #TAPE_0_PULSE - 416 - - ) - -22  - #TAPE_1_PULSE - 208 - - ) - -24  - #TAPE_DECODE_0_MIN - ( -TAPE_1_PULSE -+(TAPE_1_PULSE/5)) - - ) - -25  - #TAPE_DECODE_0_MAX - ( -TAPE_0_PULSE -*2) - - ) - -26  - #TAPE_DECODE_1_MIN - ( -TAPE_1_PULSE -/4) - - ) - -27  - #TAPE_DECODE_1_MAX - ( -TAPE_DECODE_0_MIN -) - - ) - -29  - #TIME_TO_BIT -( -t -(< -TAPE_DECODE_1_MIN -)?-1:(< -TAPE_DECODE_0_MIN -)?1:0)) - - ) - -31  -_eje - -mache - * -ic - ); - -32  -_wd - -mache - * -ic - ); - -33 -SDL_bo - -_ld_p - -mache - * -ic -, * -ame - ); - -34  -_ticktock - -mache - * -ic -,  -cyes - ); - -35  -_tm - -mache - * -ic -, -SDL_bo - -m - ); - -36  -_tches - -mache - * -ic - ); - -37  -toggˏp - -mache - * -ic -,  -osdmuem - * -mem -,  -dummy - ); - -38  -_bchge -( -v - *via); - -39  -__vch - -mache - * -ic - ); - - @ula.c - -22  - ~ - -23  - ~ - -25  - ~"syem.h -" - -26  - ~"6502.h -" - -27  - ~"v.h -" - -28  - ~"8912.h -" - -29  - ~"disk.h -" - -30  - ~"gui.h -" - -31  - ~"mڙ.h -" - -32  - ~"6551.h -" - -33  - ~"mache.h -" - -34  - ~"u.h -" - -35  - ~"avi.h -" - -37  -avi_hd - * -vidp -; - -38 -SDL_bo - -wpd -; - -40  - gbb -[8*8*64*8]; - -43  -le -  - $u_esh_cht - -mache - * -ic - ) - -45 if -ic --> -vid_xrs - & 1 ) - -47 -ic --> -vid_ch_da - = &ic-> -vid_ch_ba -[128*8]; - -49 -ic --> -vid_ch_da - = oric-> -vid_ch_ba -; - -51 - } -} - -54  -le -  - $u_decode_ - -mache - * -ic -,  - -,  -y - ) - -56  - - & 0x18 ) - -59 -ic --> -vid_fg_c - = - - & 0x07; - -60 -ic --> -vid_br - = ( -Ut16 - *)(& -bb -[(ic-> -vid_fg_c -<<12| (ic-> -vid_bg_c -<<9)]); - -61 -ic --> -vid_v_br - = ( -Ut16 - *)(& -bb -[((ic-> -vid_fg_c -^7)<<12| ((ic-> -vid_bg_c -^7)<<9)]); - -65 -ic --> -vid_xrs - = - - & 0x07; - -66 -ic --> -vid_blkmask - = - - & 0x04 ? 0x00 : 0x3f; - -67 - `u_esh_cht - -ic - ); - -68 if -ic --> -vid_xrs - & 0x02 ) - -69 -ic --> -vid_chle - = ( -y ->>1) & 0x07; - -71 -ic --> -vid_chle - = -y - & 0x07; - -75 -ic --> -vid_bg_c - = - - & 0x07; - -76 -ic --> -vid_br - = ( -Ut16 - *)(& -bb -[(ic-> -vid_fg_c -<<12| (ic-> -vid_bg_c -<<9)]); - -77 -ic --> -vid_v_br - = ( -Ut16 - *)(& -bb -[((ic-> -vid_fg_c -^7)<<12| ((ic-> -vid_bg_c -^7)<<9)]); - -81 -ic --> -vid_mode - = - - & 0x07; - -84 if -ic --> -vid_mode - & 4 ) - -86 -ic --> -vid_addr - = oric-> -vidbas -[0]; - -87 -ic --> -vid_ch_ba - = &ic-> -mem -[ic-> -vidbas -[1]]; - -89 -ic --> -vid_addr - = oric-> -vidbas -[2]; - -90 -ic --> -vid_ch_ba - = &ic-> -mem -[ic-> -vidbas -[3]]; - -93 - `u_esh_cht - -ic - ); - -96 - } -} - -98  -le -  - $u__deu - -mache - * -ic - ) - -100 -ic --> -vid_fg_c - = 7; - -101 -ic --> -vid_xrs - = 0; - -102 -ic --> -vid_blkmask - = 0x3f; - -103 -ic --> -vid_bg_c - = 0; - -104 -ic --> -vid_br - = ( -Ut16 - *)(& -bb -[(ic-> -vid_fg_c -<<12| (ic-> -vid_bg_c -<<9)]); - -105 -ic --> -vid_v_br - = ( -Ut16 - *)(& -bb -[((ic-> -vid_fg_c -^7)<<12| ((ic-> -vid_bg_c -^7)<<9)]); - -106 - `u_esh_cht - -ic - ); - -107 - } -} - -109  - $u_powup_deu - -mache - * -ic - ) - -111 - `u_decode_ - -ic -, 0x1a, 0 ); - -112 - } -} - -115  - $u_nd_block - -mache - * -ic -, -SDL_bo - -vd -,  -da -,  -y - ) - -117 -Ut16 - * -r -; - -119 if -vd - ) - -121 -r - = -ic --> -vid_v_br - + ( -da -<<2); - -125 -r - = -ic --> -vid_br - + ( -da -<<2); - -128 *(( -Ut16 - *) -ic --> -s -*( -r -++); oric->scrpt+=2; - -129 *(( -Ut16 - *) -ic --> -s -*( -r -++); oric->scrpt+=2; - -130 *(( -Ut16 - *) -ic --> -s -*( -r -++); oric->scrpt+=2; - -131 - } -} - -133  - $u_nd_block_checkdty - -mache - * -ic -, -SDL_bo - -vd -,  -da -,  -y - ) - -135 -Ut16 - * -r -; - -136  -i -; - -138 if -vd - ) - -140 -r - = -ic --> -vid_v_br - + ( -da -<<2); - -144 -r - = -ic --> -vid_br - + ( -da -<<2); - -147  -i -=0; i<3; i++) - -149 i(*(( -Ut16 - *) -ic --> -s -!* -r -) - -151 *(( -Ut16 - *) -ic --> -s -* -r -; - -152 -ic --> -vid_dty -[ -y -] = -SDL_TRUE -; - -153 -ic --> -vid_block_func - = -u_nd_block -; - -155 -ic --> -s -+=2; - -156 -r -++; - -158 - } -} - -161  - $u_ndsn - -mache - * -ic - ) - -163 -Ut8 - * -s -, * - -; - -164  -b -, -y -, -c -, -cy -, -bmask -; - -165 -SDL_bo - -hes -; - -167 -s - = -ic -->scrpt; - -168 -ic --> -s - = oric-> -s -; - -169  -y -=0; y<224; y++) - -171 -cy - = ( -y ->>3) * 40; - -174 - `u__deu - -ic - ); - -175 -ic --> -vid_chle - = -y - & 0x07; - -177 if -y - < 200 ) - -179 if -ic --> -vid_mode - & 0x04 ) - -181 -hes - = -SDL_TRUE -; - -182 - - = & -ic --> -mem -[ic-> -vid_addr - + -y -*40 -1]; - -184 -hes - = -SDL_FALSE -; - -185 - - = & -ic --> -mem -[ic-> -vid_addr - + -cy - -1]; - -188 -hes - = -SDL_FALSE -; - -190 - - = & -ic --> -mem -[ic-> -vidbas -[2] + -cy - -1]; - -192 -bmask - = ( -ic --> -ames -&0x10)?0x3f:ic-> -vid_blkmask -; - -194  -b -=0; b<40; b++ ) - -196 -c - = *(++ - -); - -199 if -c - & 0x60 ) == 0 ) - -201 - `u_decode_ - -ic -, -c -, -y - ); - -202 - `u_nd_block - -ic -, ( -c - & 0x80)!=0, 0, -y - ); - -203 if -y - < 200 ) - -205 if -ic --> -vid_mode - & 0x04 ) - -207 -hes - = -SDL_TRUE -; - -208 - - = & -ic --> -mem -[ic-> -vid_addr - + -b - + -y -*40]; - -210 -hes - = -SDL_FALSE -; - -211 - - = & -ic --> -mem -[ic-> -vid_addr - + -b - + -cy -]; - -214 -hes - = -SDL_FALSE -; - -216 - - = & -ic --> -mem -[ic-> -vidbas -[2] + -b - + -cy -]; - -218 -bmask - = ( -ic --> -ames -&0x10)?0x3f:ic-> -vid_blkmask -; - -221 if -hes - ) - -223 - `u_nd_block - -ic -, ( -c - & 0x80)!=0, c & -bmask -, -y - ); - -225  -ch_ix -, -ch_d -; - -227 -ch_ix - = -c - & 0x7f; - -228 -ch_d - = -ic --> -vid_ch_da -[ ( -ch_ix -<<3| oric-> -vid_chle - ] & -bmask -; - -230 - `u_nd_block - -ic -, ( -c - & 0x80)!=0, -ch_d -, -y - ); - -235 -ic --> -s - = scrpt; - -236 - } -} - -239 -SDL_bo - - $u_da - -mache - * -ic - ) - -241  -b -, -c -, -bmask -; - -242 -SDL_bo - -hes -, -ednd -; - -243  -y -, -cy -; - -244 -Ut8 - * - -; - -246 -ednd - = -SDL_FALSE -; - -248 -ic --> -vid_ -++; - -249 if -ic --> -vid_ - =ic-> -vid_max - ) - -251 if -vidp - ) - -255 i! -vidp --> -dod - ) || ( ! -wpd - ) ) - -258 if -vidp --> -is50hz - = -ic --> -vid_eq - ) - -260 - `ay_lockaudio -& -ic --> -ay - ); - -261 - `avi_addame -& -vidp -, -ic --> -s - ); - -264 if -vidp --> -is50hz - ) - -267 if( -vidp --> -amdju -%6) != 5 ) - -269 - `ay_lockaudio -& -ic --> -ay - ); - -270 - `avi_addame -& -vidp -, -ic --> -s - ); - -273 -vidp --> -amdju -++; - -279 - `ay_lockaudio -& -ic --> -ay - ); - -280 - `avi_addame -& -vidp -, -ic --> -s - ); - -282 if( -vidp --> -amdju -%5) == 4 ) - -283 - `avi_addame -& -vidp -, -ic --> -s - ); - -285 -vidp --> -amdju -++; - -290 -ic --> -vid_ - = 0; - -293 -ic --> -vid_offt - = oric-> -v -. -t1c -/64; - -314 -ic --> -vsync - = 12 + 260; - -316 -ednd - = -SDL_TRUE -; - -317 -ic --> -ames -++; - -319 if -ic --> -vid_eq - !(ic-> -vid_mode -&2) ) - -321 -ic --> -vid_eq - = oric-> -vid_mode -&2; - -332 if -ic --> -vid_eq - ) - -335 -ic --> -cye - = 64; - -336 -ic --> -vid_max - = 308 + 4; - -337 -ic --> -vid_t - = (ic-> -vid_max - - 224) /2; - -338 -ic --> -vid_d - = oric-> -vid_t - + 224; - -341 -ic --> -cye - = 64; - -342 -ic --> -vid_max - = 260 + 4; - -343 -ic --> -vid_t - = (ic-> -vid_max - - 224) /2; - -344 -ic --> -vid_d - = oric-> -vid_t - + 224; - -350 if -ic --> -vid_ - < oric-> -vid_t - ) || - -351 -ic --> -vid_ - >ic-> -vid_d - ) )  -ednd -; - -353 -y - = -ic --> -vid_ - - oric-> -vid_t -; - -354 -ic --> -s - = &ic-> -s -[ -y -*240]; - -356 -cy - = ( -y ->>3) * 40; - -359 - `u__deu - -ic - ); - -360 -ic --> -vid_chle - = -y - & 0x07; - -363 -ic --> -vid_block_func - = oric-> -vid_dty -[ -y -] ? -u_nd_block - : -u_nd_block_checkdty -; - -365 if -y - < 200 ) - -367 if -ic --> -vid_mode - & 0x04 ) - -369 -hes - = -SDL_TRUE -; - -370 - - = & -ic --> -mem -[ic-> -vid_addr - + -y -*40 -1]; - -372 -hes - = -SDL_FALSE -; - -373 - - = & -ic --> -mem -[ic-> -vid_addr - + -cy - -1]; - -376 -hes - = -SDL_FALSE -; - -378 - - = & -ic --> -mem -[ic-> -vidbas -[2] + -cy - -1]; - -380 -bmask - = ( -ic --> -ames -&0x10)?0x3f:ic-> -vid_blkmask -; - -382  -b -=0; b<40; b++ ) - -384 -c - = *(++ - -); - -387 if -c - & 0x60 ) == 0 ) - -389 - `u_decode_ - -ic -, -c -, -y - ); - -390 -ic --> - `vid_block_func -ic, ( -c - & 0x80)!=0, 0, -y - ); - -391 if -y - < 200 ) - -393 if -ic --> -vid_mode - & 0x04 ) - -395 -hes - = -SDL_TRUE -; - -396 - - = & -ic --> -mem -[ic-> -vid_addr - + -b - + -y -*40]; - -398 -hes - = -SDL_FALSE -; - -399 - - = & -ic --> -mem -[ic-> -vid_addr - + -b - + -cy -]; - -402 i( -hes -) - -404 -hes - = -SDL_FALSE -; - -405 - - = & -ic --> -mem -[ic-> -vidbas -[2] + -b - + -cy -]; - -408 -bmask - = ( -ic --> -ames -&0x10)?0x3f:ic-> -vid_blkmask -; - -410 if -hes - ) - -412 -ic --> - `vid_block_func -ic, ( -c - & 0x80)!=0, c & -bmask -, -y - ); - -414  -ch_ix -, -ch_d -; - -416 -ch_ix - = -c - & 0x7f; - -417 -ch_d - = -ic --> -vid_ch_da -[ ( -ch_ix -<<3| oric-> -vid_chle - ] & -bmask -; - -419 -ic --> - `vid_block_func -ic, ( -c - & 0x80)!=0, -ch_d -, -y - ); - -424  -ednd -; - -425 - } -} - -427  - $u_t_dty - -mache - * -ic - ) - -429  -i -; - -431  -i -=0; i<224; i++ ) - -433 -ic --> -vid_dty -[ -i -] = -SDL_TRUE -; - -435 - } -} - -437  - $e_u - -mache - * -ic - ) - -439 -ic --> -s - = -NULL -; - -440 -ic --> -io - = -SDL_TRUE -; - -441 -ic --> -htch - = -SDL_TRUE -; - -442 -ic --> -sƚes - = -SDL_FALSE -; - -443 -ic --> -lgho - = -SDL_TRUE -; - -444 - } -} - -446 -SDL_bo - - $_u - -mache - * -ic - ) - -448  -fg -, -bg -, -bs -, -offs -, -mask -; - -450 -ic --> -s - = ( -Ut8 - *) - `mloc -( 240*224 ); - -451 if! -ic --> -s - )  -SDL_FALSE -; - -453 - `memt -( -ic --> -s -, 0, 240*224); - -454 - `u_t_dty - -ic - ); - -457  -fg -=0; fg<8; fg++ ) - -459  -bg -=0; bg<8; bg++ ) - -461  -bs -=0; bits<64; bits++) - -464 -offs - = ( -fg -<<12)|( -bg -<<9)|( -bs -<<3); - -465  -mask -=0x20; mask; mask>>=1 ) - -467 -bb -[ -offs -++] = ( -bs -& -mask -? -fg - : -bg -; - -473  -SDL_TRUE -; - -474 - } -} - -476  - $shut_u - -mache - * -ic - ) - -478 if -ic --> -s - ) - ` -( oric->scr ); - -479 -ic --> -s - = -NULL -; - -480 - } -} - - @ula.h - -22  -e_u - -mache - * -ic - ); - -23 -SDL_bo - -_u - -mache - * -ic - ); - -24  -shut_u - -mache - * -ic - ); - -25 -SDL_bo - -u_da - -mache - * -ic - ); - -26  -u_powup_deu - -mache - * -ic - ); - -27  -u_ndsn - -mache - * -ic - ); - -28  -u_t_dty - -mache - * -ic - ); - - @via.c - -25  - ~ - -26  - ~ - -27  - ~ - -29  - ~"syem.h -" - -30  - ~"6502.h -" - -31  - ~"v.h -" - -32  - ~"8912.h -" - -33  - ~"gui.h -" - -34  - ~"disk.h -" - -35  - ~"mڙ.h -" - -36  - ~"6551.h -" - -37  - ~"mache.h -" - -38  - ~"joyick.h -" - -39  - ~".h -" - -46  - $rtch - -mache - * -ic -,  -c - ) - -48 if -ic --> -b - ) - -51 if! -ic --> -tfr - ) || ( -c - == 9 ) || ( c == 10 ) || ( c == 13 ) || ( c == 17 ) || - -52 -c - == 18 ) || ( c == 27 ) || (( c >= 32 ) && ( c <= 127 )) ) - -56 if! -ic --> -f - ) - -58 -ic --> -f - = - `fݒ -( "printer_out.txt", "a" ); - -59 if! -ic --> -f - ) - -61 - `do_pup - -ic -, "Printing failed :-(" ); - -65 - `do_pup - -ic -, "Printingo 'printer_out.txt'" ); - -69 - `utc - -c -, -ic --> -f - ); - -70 -ic --> -ock - = 40; - -71 -ic --> -o - = 64*312*50*5; - -74 - `v_wre_CA1 -& -ic --> -v -, 1 ); - -76 - } -} - -80  -le -  - $v_check_q - -v - * -v - ) - -82 if -v --> -r - & v-> -i - )&0x7f ) - -84 -v --> -ic --> -u -. -q - |v-> -qb -; - -85 -v --> -i - |= 0x80; - -87 -v --> -ic --> -u -. -q - &~v-> -qb -; - -88 -v --> -i - &= 0x7f; - -90 - } -} - -93  -le -  - $v_t_q - -v - * -v -,  -b - ) - -95 -v --> -i - | -b -; - -96 if -v --> -r - & v-> -i - )&0x7f ) - -97 -v --> -i - |= 0x80; - -99 if -v --> -r - & -b - ) == 0 ) ; - -100 -v --> -ic --> -u -. -q - |v-> -qb -; - -101 - } -} - -104  -le -  - $v_r_q - -v - * -v -,  -b - ) - -106 if -b - & -VIRQF_CA1 - ) - -107 -v --> - - = v-> -a -; - -109 if -b - & -VIRQF_CA2 - ) - -110 -v --> -bl - = v-> -b -; - -112 -v --> -i - &~ -b -; - -113 if( -v --> -r - & v-> -i - )&0x7f) == 0 ) - -115 -v --> -ic --> -u -. -q - &~v-> -qb -; - -116 -v --> -i - &= 0x7f; - -118 - } -} - -121  - $v_ma_w_ib - -v - * -v -,  -db - ) - -124 if( -db -& -v --> -ddrb -&0x10) != 0 ) && - -125 ( -v --> -b -&v-> -ddrb -&0x10) == 0 ) ) - -127 - `rtch - -v --> -ic -, v-> -a - ); - -130 - `_tm - -v --> -ic -, (v-> -b -&v-> -ddrb -&0x40) != 0 ); - -132 if( -v --> -p -& -PCRF_CB2CON -) == 0x80 ) - -133 - `ay_t_bd -& -v --> -ic --> -ay -, 0 ); - -135 - `ay_upde_keybs -& -v --> -ic --> -ay - ); - -136 - } -} - -138  - $v_ma_w_ia - -v - * -v - ) - -140 if( -v --> -p -& -PCRF_CA2CON -) == 0x08 ) - -141 - `ay_t_bc1 -& -v --> -ic --> -ay -, 0 ); - -143 - `ay_modet -& -v --> -ic --> -ay - ); - -144 - `joy_budmask - -v --> -ic - ); - -145 - } -} - -147  - $v_ma_w_ia2 - -v - * -v - ) - -149 - `ay_modet -& -v --> -ic --> -ay - ); - -150 - `joy_budmask - -v --> -ic - ); - -151 - } -} - -153  - $v_ma_w_dd - -v - * -v - ) - -155 - `joy_budmask - -v --> -ic - ); - -156 - } -} - -158  - $v_ma_w_ddrb - -v - * -v - ) - -160 - `joy_budmask - -v --> -ic - ); - -161 - `ay_upde_keybs -& -v --> -ic --> -ay - ); - -162 - } -} - -164  - $v_ma_w_p - -v - * -v - ) - -166 -SDL_bo - -updy - = -SDL_FALSE -; - -168  -v --> -p - & -PCRF_CA2CON - ) - -171 -updy - = -SDL_TRUE -; - -177  -v --> -p - & -PCRF_CB2CON - ) - -181 -updy - = -SDL_TRUE -; - -186 if -updy - ) - `ay_t_bcmode -& -v --> -ic --> -ay -, v-> -2 -, v-> -cb2 - ); - -187 - } -} - -189  - $v_ma_w_2ext - -v - * -v - ) - -191  -v --> -p - & -PCRF_CA2CON - ) - -197 - `ay_t_bc1 -& -v --> -ic --> -ay -, v-> -2 - ); - -202 - } -} - -204  - $v_ma_w_cb2ext - -v - * -v - ) - -206  -v --> -p - & -PCRF_CB2CON - ) - -212 - `ay_t_bd -& -v --> -ic --> -ay -, v-> -cb2 - ); - -215 - } -} - -217  - $v_ma_r_ia - -v - * -v - ) - -219 - `ay_modet -& -v --> -ic --> -ay - ); - -220 if( -v --> -p -& -PCRF_CA2CON -) == 0x08 ) - -221 - `ay_t_bc1 -& -v --> -ic --> -ay -, 0 ); - -222 - } -} - -224  - $v_ma_r_ia2 - -v - * -v - ) - -226 - `ay_modet -& -v --> -ic --> -ay - ); - -227 - } -} - -229  - $v_ma_r_ib - -v - * -v - ) - -231 if( -v --> -p -& -PCRF_CB2CON -) == 0x80 ) - -232 - `ay_t_bd -& -v --> -ic --> -ay -, 0 ); - -233 - } -} - -235  - $v_ma_2puld - -v - * -v - ) - -237 - `ay_t_bc1 -& -v --> -ic --> -ay -, 1 ); - -238 - } -} - -240  - $v_ma_cb2puld - -v - * -v - ) - -242 - `ay_t_bd -& -v --> -ic --> -ay -, v-> -cb2 - ); - -243 - } -} - -245  - $v__w_ia - -v - * -v - ) - -247  -vdd - = ( -v --> -dd -&7)^7; - -248 -v --> -ic --> -_cubk - = (v->ic->_cubk& -vdd -)|(v-> -a -&v-> -dd -&0x07); - -249 -v --> -ic --> -_bkty - = v->ic-> -_bk -[v->ic-> -_cubk -]. -ty -; - -250 -v --> -ic --> -rom - = v->ic-> -_bk -[v->ic-> -_cubk -]. -r -; - -251 - } -} - -253  - $v__w_ia2 - -v - * -v - ) - -255  -vdd - = ( -v --> -dd -&7)^7; - -256 -v --> -ic --> -_cubk - = (v->ic->_cubk& -vdd -)|(v-> -a -&v-> -dd -&0x07); - -257 -v --> -ic --> -_bkty - = v->ic-> -_bk -[v->ic-> -_cubk -]. -ty -; - -258 -v --> -ic --> -rom - = v->ic-> -_bk -[v->ic-> -_cubk -]. -r -; - -259 - } -} - -261  - $v__w_dd - -v - * -v - ) - -263  -vdd - = ( -v --> -dd -&7)^7; - -264 -v --> -ic --> -_cubk - = (v->ic->_cubk& -vdd -)|(v-> -a -&v-> -dd -&0x07); - -265 -v --> -ic --> -_bkty - = v->ic-> -_bk -[v->ic-> -_cubk -]. -ty -; - -266 -v --> -ic --> -rom - = v->ic-> -_bk -[v->ic-> -_cubk -]. -r -; - -267 - } -} - -270  - $v_ad_p܏ - -v - * -v - ) - -272  -v --> -a - & v-> -dd -; - -273 - } -} - -275  - $v_ad_ptb - -v - * -v - ) - -277  -v --> -b - & v-> -ddrb -; - -278 - } -} - -281  - $v_ma_wre_p܏ - -v - * -v -,  -mask -,  -da - ) - -283 -v --> -a - = (v->a&~ -mask -)|( -da -&mask); - -285 if(!( -v --> -a -& -ACRF_PALATCH -)) || - -286 (!( -v --> -i -& -VIRQF_CA1 -)) ) - -287 -v --> - - = v-> -a -; - -288 - } -} - -290  - $v__wre_p܏ - -v - * -v -,  -mask -,  -da - ) - -292 -v --> -a - = (v->a&~ -mask -)|( -da -&mask); - -294 if(!( -v --> -a -& -ACRF_PALATCH -)) || - -295 (!( -v --> -i -& -VIRQF_CA1 -)) ) - -296 -v --> - - = v-> -a -; - -297 - } -} - -299  - $v_wre_ptb - -v - * -v -,  -mask -,  -da - ) - -301  -ϡpb6 -; - -303 -ϡpb6 - = -v --> -b -&0x40; - -304 -v --> -b - = (v->b&~ -mask -)|( -da -&mask); - -306 if(!( -v --> -a -& -ACRF_PBLATCH -)) || - -307 (!( -v --> -a -& -VIRQF_CB1 -)) ) - -308 -v --> -bl - = v-> -b -; - -311 if -v --> -a - & -ACRF_T2CON - ) == 0 ) ; - -314 if! -ϡpb6 - ) || ( -v --> -b -&0x40 ) ) ; - -317 -v --> -t2c ---; - -318 if -v --> -t2run - ) - -320 if -v --> -t2c - == 0 ) - -322 - `v_t_q - -v -, -VIRQF_T2 - ); - -323 -v --> -t2run - = -SDL_FALSE -; - -326 - } -} - -329  - $v_ - -v - * -v -,  -mache - * -ic -,  -vty - ) - -331 -v --> -b - = 0; - -332 -v --> -a - = 0; - -333 -v --> -b - = 0xff; - -334 -v --> -a - = 0xff; - -335 -v --> -bl - = 0xff; - -336 -v --> - - = 0xff; - -337 -v --> -dd - = 0; - -338 -v --> -ddrb - = 0; - -339 -v --> -t1l_l - = 0; - -340 -v --> -t1l_h - = 0; - -341 -v --> -t1c - = 0; - -342 -v --> -t1ld - = 0; - -343 -v --> -t2l_l - = 0; - -344 -v --> -t2l_h - = 0; - -345 -v --> -t2c - = 0; - -346 -v --> -t2ld - = 0; - -347 -v --> - - = 0; - -348 -v --> -a - = 0; - -349 -v --> -p - = 0; - -350 -v --> -i - = 0; - -351 -v --> -r - = 0; - -352 -v --> -1 - = 0; - -353 -v --> -2 - = 0; - -354 -v --> -cb1 - = 0; - -355 -v --> -cb2 - = 0; - -356 -v --> -cou - = 0; - -357 -v --> -time - = 0; - -358 -v --> -igg - = -SDL_FALSE -; - -359 -v --> -t1run - = -SDL_FALSE -; - -360 -v --> -t2run - = -SDL_FALSE -; - -361 -v --> -2pul - = -SDL_FALSE -; - -362 -v --> -cb2pul - = -SDL_FALSE -; - -363 -v --> -ic - = oric; - -365  -vty - ) - -367  -VIA_MAIN -: - -368 -v --> -w_ib - = -v_ma_w_ib -; - -369 -v --> -w_ia - = -v_ma_w_ia -; - -370 -v --> -w_ia2 - = -v_ma_w_ia2 -; - -371 -v --> -w_dd - = -v_ma_w_dd -; - -372 -v --> -w_ddrb - = -v_ma_w_ddrb -; - -373 -v --> -w_p - = -v_ma_w_p -; - -374 -v --> -w_2ext - = -v_ma_w_2ext -; - -375 -v --> -w_cb2ext - = -v_ma_w_cb2ext -; - -376 -v --> -r_ia - = -v_ma_r_ia -; - -377 -v --> -r_ia2 - = -v_ma_r_ia2 -; - -378 -v --> -r_ib - = -v_ma_r_ib -; - -379 -v --> -2puld - = -v_ma_2puld -; - -380 -v --> -cb2puld - = -v_ma_cb2puld -; - -381 -v --> -cb2shied - = -v_ma_cb2puld -; - -382 -v --> -bchge - = -_bchge -; - -383 -v --> -qb - = -IRQF_VIA -; - -384 -v --> -ad_pt_a - = -v_ad_p܏ -; - -385 -v --> -ad_pt_b - = -v_ad_ptb -; - -386 -v --> -wre_pt_a - = -v_ma_wre_p܏ -; - -387 -v --> -wre_pt_b - = -v_wre_ptb -; - -390  -VIA_TELESTRAT -: - -391 -v --> -w_ib - = -NULL -; - -392 -v --> -w_ia - = -v__w_ia -; - -393 -v --> -w_ia2 - = -v__w_ia2 -; - -394 -v --> -w_dd - = -v__w_dd -; - -395 -v --> -w_ddrb - = -NULL -; - -396 -v --> -w_p - = -NULL -; - -397 -v --> -w_2ext - = -NULL -; - -398 -v --> -w_cb2ext - = -NULL -; - -399 -v --> -r_ia - = -NULL -; - -400 -v --> -r_ia2 - = -NULL -; - -401 -v --> -r_ib - = -NULL -; - -402 -v --> -2puld - = -NULL -; - -403 -v --> -cb2puld - = -NULL -; - -404 -v --> -cb2shied - = -NULL -; - -405 -v --> -bchge - = -NULL -; - -406 -v --> -qb - = -IRQF_VIA2 -; - -407 -v --> -ad_pt_a - = -v_ad_p܏ -; - -408 -v --> -ad_pt_b - = -v_ad_ptb -; - -409 -v --> -wre_pt_a - = -v__wre_p܏ -; - -410 -v --> -wre_pt_b - = -v_wre_ptb -; - -411 -v --> -a - = 7; - -412 -v --> -dd - = 7; - -415 - } -} - -418  - $v_ock - -v - * -v -,  -cyes - ) - -420  -em -; - -423 - `_ticktock - -v --> -ic -, -cyes - ); - -425 if! -cyes - ) ; - -428 if -v --> -ic --> -ock - > 0 ) - -430 -v --> -ic --> -ock - - -cyes -; - -431 if -v --> -ic --> -ock - <= 0 ) - -433 -v --> -ic --> -ock - = 0; - -434 if -v --> -ic --> -b - ) - -435 - `v_wre_CA1 - -v -, 0 ); - -442 if -v --> -ic --> -o - > 0 ) - -444 -v --> -ic --> -o - - -cyes -; - -445 if -v --> -ic --> -o - <= 0 ) - -447 -v --> -ic --> -o - = 0; - -448 if -v --> -ic --> -f - ) - -449 - `fo - -v --> -ic --> -f - ); - -450 -v --> -ic --> -f - = -NULL -; - -454 if -v --> -2pul - ) - -456 -v --> -2 - = 1; - -457 if -v --> -2puld - ) v-> - `2puld -( v ); - -458 -v --> -2pul - = -SDL_FALSE -; - -461 if -v --> -cb2pul - ) - -465 -v --> -cb2 - = 1; - -466 if -v --> -cb2puld - ) v-> - `cb2puld -( v ); - -468 -v --> -cb2pul - = -SDL_FALSE -; - -472  -v --> -a -& -ACRF_T1CON - ) - -476 if -v --> -t1run - ) - -478 if -cyes - > -v --> -t1c - ) - -480 - `v_t_q - -v -, -VIRQF_T1 - ); - -481 if -v --> -a -&0x80 ) - -483 -v --> -b - |= 0x80; - -484 i( -v --> -bchge -v-> - `bchge -( v ); - -486 -v --> -t1run - = -SDL_FALSE -; - -489 -v --> -t1c - - -cyes -; - -494 -em - = -cyes -; - -496 if -v --> -t1ld - ) - -498 -em ---; - -499 -v --> -t1c - = (v-> -t1l_h -<<8)|v-> -t1l_l -; - -500 -v --> -t1ld - = -SDL_FALSE -; - -503  -em - > -v --> -t1c - ) - -505 -em - -( -v --> -t1c -+1); - -506 -v --> -t1c - = 0xffff; - -507 - `v_t_q - -v -, -VIRQF_T1 - ); - -508 if -v --> -a -&0x80 ) - -510 -v --> -b - ^= 0x80; - -511 if -v --> -bchge - ) v-> - `bchge -( v ); - -514 if! -em - ) - -516 -v --> -t1ld - = -SDL_TRUE -; - -520 -em ---; - -521 -v --> -t1c - = (v-> -t1l_h -<<8)|v-> -t1l_l -; - -524 -v --> -t1c - - -em -; - -529 if -v --> -a - & -ACRF_T2CON - ) == 0 ) - -531 -em - = -cyes -; - -532 if -v --> -t2ld - ) - -534 -em ---; - -535 -v --> -t2ld - = 0; - -539 if -v --> -t2run - ) - -541 if -em - > -v --> -t2c - ) - -543 - `v_t_q - -v -, -VIRQF_T2 - ); - -544 -v --> -t2run - = -SDL_FALSE -; - -547 -v --> -t2c - - -em -; - -550  -v --> -a - & -ACRF_SRCON - ) - -557 if -v --> -i -& -VIRQF_SR - ) - -558 - `v_r_q - -v -, -VIRQF_SR - ); - -559 -v --> -cou - = 0; - -560 -v --> -igg - = -SDL_FALSE -; - -564 if! -v --> -igg - ) ; - -567 -v --> -time - - -cyes -; - -568  -v --> -time - <= 0 ) - -571 -v --> -time - +v-> -t2l_l -+1; - -574 -v --> -cb1 - ^= 1; - -577 if! -v --> -cb1 - ) - -579 -v --> -cb2 - = (v-> - - & 0x80) ? 1 : 0; - -580 -v --> - - = (v-><<1)|v-> -cb2 -; - -581 if -v --> -cb2shied - ) v-> - `cb2shied -( v ); - -583 -v --> -cou - = (v->srcount+1)%8; - -589 if! -v --> -igg - ) ; - -590 if -v --> -cou - == 8 ) ; - -593 -v --> -time - - -cyes -; - -594  -v --> -time - <= 0 ) - -597 -v --> -time - +v-> -t2l_l -+1; - -600 -v --> -cb1 - ^= 1; - -603 if! -v --> -cb1 - ) - -605 -v --> -cb2 - = (v-> - - & 0x80) ? 1 : 0; - -606 -v --> - - = (v-><<1)|v-> -cb2 -; - -607 if -v --> -cb2shied - ) v-> - `cb2shied -( v ); - -609 -v --> -cou -++; - -610 if -v --> -cou - == 8 ) - -612 - `v_t_q - -v -, -VIRQF_SR - ); - -613 -v --> -time - = 0; - -614 -v --> -igg - = -SDL_FALSE -; - -622 if! -v --> -igg - ) ; - -623 if -v --> -cou - == 8 ) ; - -626 -v --> -cb1 - ^= 1; - -629 if! -v --> -cb1 - ) - -631 -v --> -cb2 - = (v-> - - & 0x80) ? 1 : 0; - -632 -v --> - - = (v-><<1)|v-> -cb2 -; - -633 if -v --> -cb2shied - ) v-> - `cb2shied -( v ); - -635 -v --> -cou -++; - -636 if -v --> -cou - == 8 ) - -638 - `v_t_q - -v -, -VIRQF_SR - ); - -639 -v --> -igg - = -SDL_FALSE -; - -644 - } -} - -647  - $v_wre - -v - * -v -,  -offt -,  -da - ) - -649  -tmp -; - -650 -offt - &= 0xf; - -652  -offt - ) - -654  -VIA_IORB -: - -655 -tmp - = -v --> -b -; - -656 -v --> -b - = -da -; - -658 - `v_r_q - -v -, -VIRQF_CB1 - ); - -659  -v --> -p - & -PCRF_CB2CON - ) - -663 - `v_r_q - -v -, -VIRQF_CB2 - ); - -667 -v --> -cb2pul - = -SDL_TRUE -; - -670 -v --> -cb2 - = 0; - -673 if -v --> -w_ib - ) v-> - `w_ib -v, -tmp - ); - -674 if -v --> -bchge - ) v-> - `bchge -( v ); - -676  -VIA_IORA -: - -677 -v --> -a - = -da -; - -678 - `v_r_q - -v -, -VIRQF_CA1 - ); - -679  -v --> -p - & -PCRF_CA2CON - ) - -683 - `v_r_q - -v -, -VIRQF_CA2 - ); - -687 -v --> -2pul - = -SDL_TRUE -; - -689 -v --> -2 - = 0; - -692 if -v --> -w_ia - ) v-> - `w_ia -( v ); - -694  -VIA_DDRB -: - -695 -v --> -ddrb - = -da -; - -696 if -v --> -w_ddrb - ) v-> - `w_ddrb -( v ); - -698  -VIA_DDRA -: - -699 -v --> -dd - = -da -; - -700 if -v --> -w_dd - ) v-> - `w_dd -( v ); - -702  -VIA_T1C_H -: - -703 -v --> -t1l_h - = -da -; - -704 -v --> -t1c - = (v-> -t1l_h -<<8)|v-> -t1l_l -; - -705 -v --> -t1ld - = 1; - -706 - `v_r_q - -v -, -VIRQF_T1 - ); - -707 -v --> -t1run - = -SDL_TRUE -; - -708 if( -v --> -a -& -ACRF_T1CON -) == 0x80 ) - -710 -v --> -b - &= 0x7f; - -711 if -v --> -bchge - ) v-> - `bchge -( v ); - -714  -VIA_T1C_L -: - -715  -VIA_T1L_L -: - -716 -v --> -t1l_l - = -da -; - -718  -VIA_T1L_H -: - -719 -v --> -t1l_h - = -da -; - -720 - `v_r_q - -v -, -VIRQF_T1 - ); - -722  -VIA_T2C_L -: - -723 -v --> -t2l_l - = -da -; - -725  -VIA_T2C_H -: - -726 -v --> -t2l_h - = -da -; - -727 -v --> -t2c - = (v-> -t2l_h -<<8)|v-> -t2l_l -; - -728 -v --> -t2ld - = 1; - -729 - `v_r_q - -v -, -VIRQF_T2 - ); - -730 -v --> -t2run - = -SDL_TRUE -; - -732  -VIA_SR -: - -733 -v --> - - = -da -; - -734 -v --> -cou - = 0; - -735 -v --> -time - = 0; - -736 -v --> -igg - = -SDL_TRUE -; - -737 - `v_r_q - -v -, -VIRQF_SR - ); - -739  -VIA_ACR -: - -759 -v --> -a - = -da -; - -760 if -da - & -ACRF_T1CON - ) != 0x40 ) && - -761 -da - & -ACRF_T1CON - ) != 0xc0 ) ) - -762 -v --> -t1ld - = -SDL_FALSE -; - -767  -VIA_PCR -: - -768 -v --> -p - = -da -; - -769  -v --> -p - & -PCRF_CA2CON - ) - -772 -v --> -2 - = 0; - -773 -v --> -2pul - = -SDL_FALSE -; - -777 -v --> -2 - = 1; - -783  -v --> -p - & -PCRF_CB2CON - ) - -786 -v --> -cb2 - = 0; - -787 -v --> -cb2pul - = -SDL_FALSE -; - -791 -v --> -cb2 - = 1; - -796 if -v --> -w_p - ) v-> - `w_p -( v ); - -798  -VIA_IFR -: - -799 if -da - & -VIRQF_CA1 - ) -v --> - - = v-> -a -; - -800 if -da - & -VIRQF_CB1 - ) -v --> -bl - = v-> -b -; - -802 -v --> -i - &(~ -da -)&0x7f; - -803 if -v --> -r - & v-> -i - )&0x7f ) - -804 -v --> -i - |= 0x80; - -806 -v --> -ic --> -u -. -q - &~v-> -qb -; - -808  -VIA_IER -: - -809 if -da - & 0x80 ) - -810 -v --> -r - |( -da -&0x7f); - -812 -v --> -r - &~( -da -&0x7f); - -813 - `v_check_q - -v - ); - -815  -VIA_IORA2 -: - -816 -v --> -a - = -da -; - -817 if -v --> -w_ia2 - ) v-> - `w_ia2 -( v ); - -820 - } -} - -823  - $v_m_ad - -v - * -v -,  -offt - ) - -825 -offt - &= 0xf; - -827  -offt - ) - -829  -VIA_IORB -: - -830  ( -v --> -b -&v-> -ddrb -)|(v-> -bl -&(~v->ddrb)); - -831  -VIA_IORA -: - -832  ( -v --> -a -&v-> -dd -)|(v-> - -&(~v->ddra)); - -833  -VIA_DDRB -: - -834  -v --> -ddrb -; - -835  -VIA_DDRA -: - -836  -v --> -dd -; - -837  -VIA_T1C_L -: - -838  -v --> -t1c -&0xff; - -839  -VIA_T1C_H -: - -840  -v --> -t1c ->>8; - -841  -VIA_T1L_L -: - -842  -v --> -t1l_l -; - -843  -VIA_T1L_H -: - -844  -v --> -t1l_h -; - -845  -VIA_T2C_L -: - -846  -v --> -t2c -&0xff; - -847  -VIA_T2C_H -: - -848  -v --> -t2c ->>8; - -849  -VIA_SR -: - -850  -v --> - -; - -851  -VIA_ACR -: - -852  -v --> -a -; - -853  -VIA_PCR -: - -854  -v --> -p -; - -855  -VIA_IFR -: - -856  -v --> -i -; - -857  -VIA_IER -: - -858  -v --> -r -|0x80; - -859  -VIA_IORA2 -: - -860  ( -v --> -a -&v-> -dd -)|(v-> - -&(~v->ddra)); - -864 - } -} - -867  - $v_ad - -v - * -v -,  -offt - ) - -869 -offt - &= 0xf; - -871  -offt - ) - -873  -VIA_IORB -: - -874 - `v_r_q - -v -, -VIRQF_CB1 - ); - -875  -v --> -p - & -PCRF_CB2CON - ) - -879 - `v_r_q - -v -, -VIRQF_CB2 - ); - -883 -v --> -cb2pul - = -SDL_TRUE -; - -887 -v --> -cb2 - = 0; - -891 if -v --> -r_ib - ) v-> - `r_ib -( v ); - -892  ( -v --> -b -&v-> -ddrb -)|(v-> -bl -&(~v->ddrb)); - -893  -VIA_IORA -: - -894 - `v_r_q - -v -, -VIRQF_CA1 - ); - -895  -v --> -p - & -PCRF_CA2CON - ) - -899 - `v_r_q - -v -, -VIRQF_CA2 - ); - -903 -v --> -2pul - = -SDL_TRUE -; - -905 -v --> -2 - = 0; - -908 if -v --> -r_ia - ) v-> - `r_ia -( v ); - -909  ( -v --> -a -&v-> -dd -)|(v-> - -&(~v->ddra)); - -910  -VIA_DDRB -: - -911  -v --> -ddrb -; - -912  -VIA_DDRA -: - -913  -v --> -dd -; - -914  -VIA_T1C_L -: - -915 - `v_r_q - -v -, -VIRQF_T1 - ); - -916  -v --> -t1c -&0xff; - -917  -VIA_T1C_H -: - -918  -v --> -t1c ->>8; - -919  -VIA_T1L_L -: - -920  -v --> -t1l_l -; - -921  -VIA_T1L_H -: - -922  -v --> -t1l_h -; - -923  -VIA_T2C_L -: - -924 - `v_r_q - -v -, -VIRQF_T2 - ); - -925  -v --> -t2c -&0xff; - -926  -VIA_T2C_H -: - -927  -v --> -t2c ->>8; - -928  -VIA_SR -: - -929 -v --> -cou - = 0; - -930 -v --> -time - = 0; - -931 -v --> -igg - = -SDL_TRUE -; - -932 - `v_r_q - -v -, -VIRQF_SR - ); - -933  -v --> - -; - -934  -VIA_ACR -: - -935  -v --> -a -; - -936  -VIA_PCR -: - -937  -v --> -p -; - -938  -VIA_IFR -: - -939  -v --> -i -; - -940  -VIA_IER -: - -941  -v --> -r -|0x80; - -942  -VIA_IORA2 -: - -943  ( -v --> -a -&v-> -dd -)|(v-> - -&(~v->ddra)); - -947 - } -} - -950  - $v_m_wre_i - -v - * -v -,  -da - ) - -952 if! -da - & -VIRQF_CA1 - ) ) -v --> - - = v-> -a -; - -953 if! -da - & -VIRQF_CB1 - ) ) -v --> -bl - = v-> -b -; - -955 -v --> -i - = -da -&0x7f; - -956 if -v --> -r - & v-> -i - )&0x7f ) - -957 -v --> -i - |= 0x80; - -959 -v --> -ic --> -u -. -q - &~v-> -qb -; - -960 - } -} - -963  - $v_wre_CA1 - -v - * -v -,  -da - ) - -965 if! -v --> -1 - ) && ( -da - != 0 ) ) - -967 if -v --> -p - & -PCRF_CA1CON - ) - -968 - `v_t_q - -v -, -VIRQF_CA1 - ); - -969 } if -v --> -1 - ) && ( -da - == 0 ) ) { - -970 if!( -v --> -p - & -PCRF_CA1CON -) ) - -971 - `v_t_q - -v -, -VIRQF_CA1 - ); - -974 -v --> -1 - = -da - != 0; - -975 - } -} - -977  - $v_wre_CA2 - -v - * -v -,  -da - ) - -979  -v --> -p - & -PCRF_CA2CON - ) - -983 if -v --> -2 - ) && ( -da - == 0 ) ) - -984 - `v_t_q - -v -, -VIRQF_CA2 - ); - -985 -v --> -2 - = -da - != 0; - -990 if! -v --> -2 - ) && ( -da - != 0 ) ) - -991 - `v_t_q - -v -, -VIRQF_CA2 - ); - -992 -v --> -2 - = -da - != 0; - -998 if -v --> -w_2ext - ) v-> - `w_2ext -( v ); - -999 - } -} - -1001  - $v_wre_CB1 - -v - * -v -,  -da - ) - -1003 if! -v --> -cb1 - ) && ( -da - != 0 ) ) - -1005 if -v --> -p - & -PCRF_CB1CON - ) - -1006 - `v_t_q - -v -, -VIRQF_CB1 - ); - -1007 } if -v --> -cb1 - ) && ( -da - == 0 ) ) { - -1008 if!( -v --> -p - & -PCRF_CB1CON -) ) - -1009 - `v_t_q - -v -, -VIRQF_CB1 - ); - -1012 -v --> -cb1 - = -da - != 0; - -1013 - } -} - -1015  - $v_wre_CB2 - -v - * -v -,  -da - ) - -1017  -v --> -p - & -PCRF_CB2CON - ) - -1021 if -v --> -cb2 - ) && ( -da - == 0 ) ) - -1022 - `v_t_q - -v -, -VIRQF_CB2 - ); - -1023 -v --> -cb2 - = -da - != 0; - -1028 if! -v --> -cb2 - ) && ( -da - != 0 ) ) - -1029 - `v_t_q - -v -, -VIRQF_CB2 - ); - -1030 -v --> -cb2 - = -da - != 0; - -1034 if -v --> -w_cb2ext - ) v-> - `w_cb2ext -( v ); - -1035 - } -} - - @via.h - -23 - mVIA_MAIN - = 0, - -24 - mVIA_TELESTRAT - - -27  - sv - - -30  - mi -; - -31  - mb -, - mb -, - mbl -; - -32  - ma -, - ma -, - m -; - -33  - mdd -; - -34  - mddrb -; - -35  - mt1l_l -; - -36  - mt1l_h -; - -37  - mt1c -; - -38  - mt2l_l -; - -39  - mt2l_h -; - -40  - mt2c -; - -41  - m -; - -42  - ma -; - -43  - mp -; - -44  - mr -; - -47  - m1 -, - m2 -; - -48  - mcb1 -, - mcb2 -; - -49  - mcou -; - -50  - mt1ld -, - mt2ld -; - -51 -St16 - - mtime -; - -54 -SDL_bo - - mt1run -, - mt2run -; - -55 -SDL_bo - - m2pul -, - mcb2pul -; - -56 -SDL_bo - - migg -; - -58 (* - mw_ib -)( - mv - *,); - -59 (* - mw_ia -)( - mv - *); - -60 (* - mw_ia2 -)( - mv - *); - -61 (* - mw_dd -)( - mv - *); - -62 (* - mw_ddrb -)( - mv - *); - -63 (* - mw_p -)( - mv - *); - -64 (* - mw_2ext -)( - mv - *); - -65 (* - mw_cb2ext -)( - mv - *); - -66 (* - mr_ia -)( - mv - *); - -67 (* - mr_ia2 -)( - mv - *); - -68 (* - mr_ib -)( - mv - *); - -69 (* - m2puld -)( - mv - *); - -70 (* - mcb2puld -)( - mv - *); - -71 (* - mcb2shied -)( - mv - *); - -72 (* - mbchge -)( - mv - *); - -74 (* - mad_pt_a -)( - mv - *); - -75 (* - mad_pt_b -)( - mv - *); - -76 (* - mwre_pt_a -)( -v - * - mv -, , ); - -77 (* - mwre_pt_b -)( -v - * - mv -, , ); - -79  -mache - * - mic -; - -80  - mqb -; - -83  - #VIA_IORB - 0 - - ) - -84  - #VIA_IORA - 1 - - ) - -85  - #VIA_DDRB - 2 - - ) - -86  - #VIA_DDRA - 3 - - ) - -87  - #VIA_T1C_L - 4 - - ) - -88  - #VIA_T1C_H - 5 - - ) - -89  - #VIA_T1L_L - 6 - - ) - -90  - #VIA_T1L_H - 7 - - ) - -91  - #VIA_T2C_L - 8 - - ) - -92  - #VIA_T2C_H - 9 - - ) - -93  - #VIA_SR - 10 - - ) - -94  - #VIA_ACR - 11 - - ) - -95  - #VIA_PCR - 12 - - ) - -96  - #VIA_IFR - 13 - - ) - -97  - #VIA_IER - 14 - - ) - -98  - #VIA_IORA2 - 15 - - ) - -100  - #PCRB_CA1CON - 0 - - ) - -101  - #PCRF_CA1CON - (1<< -PCRB_CA1CON -) - - ) - -102  - #PCRF_CA2CON - (0x0e) - - ) - -103  - #PCRB_CB1CON - 4 - - ) - -104  - #PCRF_CB1CON - (1<< -PCRB_CB1CON -) - - ) - -105  - #PCRF_CB2CON - (0xe0) - - ) - -107  - #ACRB_PALATCH - 0 - - ) - -108  - #ACRF_PALATCH - (1<< -ACRB_PALATCH -) - - ) - -109  - #ACRB_PBLATCH - 1 - - ) - -110  - #ACRF_PBLATCH - (1<< -ACRB_PBLATCH -) - - ) - -111  - #ACRF_SRCON - (0x1c) - - ) - -112  - #ACRB_T2CON - 5 - - ) - -113  - #ACRF_T2CON - (1<< -ACRB_T2CON -) - - ) - -114  - #ACRF_T1CON - (0xc0) - - ) - -116  - #VIRQB_CA2 - 0 - - ) - -117  - #VIRQF_CA2 - (1<< -VIRQB_CA2 -) - - ) - -118  - #VIRQB_CA1 - 1 - - ) - -119  - #VIRQF_CA1 - (1<< -VIRQB_CA1 -) - - ) - -120  - #VIRQB_SR - 2 - - ) - -121  - #VIRQF_SR - (1<< -VIRQB_SR -) - - ) - -122  - #VIRQB_CB2 - 3 - - ) - -123  - #VIRQF_CB2 - (1<< -VIRQB_CB2 -) - - ) - -124  - #VIRQB_CB1 - 4 - - ) - -125  - #VIRQF_CB1 - (1<< -VIRQB_CB1 -) - - ) - -126  - #VIRQB_T2 - 5 - - ) - -127  - #VIRQF_T2 - (1<< -VIRQB_T2 -) - - ) - -128  - #VIRQB_T1 - 6 - - ) - -129  - #VIRQF_T1 - (1<< -VIRQB_T1 -) - - ) - -131  -_eje - -mache - * -ic - ); - -132  -_wd - -mache - * -ic - ); - -133 -SDL_bo - -_ld_p - -mache - * -ic -, * -ame - ); - -134  -_ticktock - -mache - * -ic -,  -cyes - ); - -137  -v_ - -v - * -v -,  -mache - * -ic -,  -vty - ); - -140  -v_ock - -v - * -v -,  -cyes - ); - -143  -v_wre - -v - * -v -,  -offt -,  -da - ); - -146  -v_ad - -v - * -v -,  -offt - ); - -150  -v_wre_CA1 - -v - * -v -,  -da - ); - -151  -v_wre_CA2 - -v - * -v -,  -da - ); - -152  -v_wre_CB1 - -v - * -v -,  -da - ); - -153  -v_wre_CB2 - -v - * -v -,  -da - ); - -156  -v_m_wre_i - -v - * -v -,  -da - ); - -159  -v_m_ad - -v - * -v -,  -offt - ); - - @ -1 -. -0 -70 -844 -6502.c -6502.h -6551.c -6551.h -6551_com.c -6551_loopback.c -6551_modem.c -8912.c -8912.h -XCode/Oricutron/Oricutron/SDLMain.h -avi.c -avi.h -disk.c -disk.h -disk_pravetz.c -disk_pravetz.h -filereq.h -filereq_amiga.c -filereq_beos.cpp -filereq_gtk.c -filereq_sdl.c -filereq_win32.c -font.c -gui.c -gui.h -gui_beos.cpp -gui_win.c -gui_x11.c -joystick.c -joystick.h -keyboard.c -keyboard.h -machine.c -machine.h -main.c -main.h -monitor.c -monitor.h -msgbox.h -msgbox_beos.cpp -msgbox_gtk.c -msgbox_os2.c -msgbox_os4.c -msgbox_sdl.c -msgbox_win32.c -msvc/strcasecmp.h -msvc/unistd.h -plugins/ch376/ch376.c -plugins/ch376/ch376.h -plugins/ch376/oric_ch376_plugin.c -plugins/ch376/oric_ch376_plugin.h -render_gl.c -render_gl.h -render_null.c -render_null.h -render_sw.c -render_sw.h -render_sw8.c -render_sw8.h -snapshot.c -snapshot.h -system.h -system_sdl.c -system_sdl.h -tape.c -tape.h -ula.c -ula.h -via.c -via.h From f79d5d4729e7769c8d549fd39c27a97819b1e9a2 Mon Sep 17 00:00:00 2001 From: iss Date: Sun, 14 Sep 2025 15:16:49 +0300 Subject: [PATCH 136/143] fix: dsk images handling --- disk.c | 680 +++++++++++++++++++++++++++++++++------------------------ disk.h | 6 +- 2 files changed, 395 insertions(+), 291 deletions(-) diff --git a/disk.c b/disk.c index 832eebab..49660869 100644 --- a/disk.c +++ b/disk.c @@ -65,7 +65,7 @@ static int sectordumpcount; #endif #ifdef MICRODISC_FUDGE -void microdisc_setintrq( void *md ); +void microdisc_setintrq(void* md); #endif static Uint16 calc_crc( Uint16 crc, Uint8 value) @@ -97,8 +97,8 @@ static void diskimage_free( struct machine *oric, struct diskimage **dimg ) { char *dpath, *dfile; - if( !dimg ) return; - if( !(*dimg) ) return; + if(!dimg) return; + if(!(*dimg)) return; if( oric->type != MACH_TELESTRAT ) { @@ -121,7 +121,7 @@ static void diskimage_free( struct machine *oric, struct diskimage **dimg ) dfile = telediskfile; } - if( (*dimg)->modified ) + if((*dimg)->modified) { char modmsg[128]; sprintf( modmsg, "The disk in drive %d is modified.\nWould you like to save the changes?", (*dimg)->drivenum ); @@ -136,72 +136,117 @@ static void diskimage_free( struct machine *oric, struct diskimage **dimg ) } } - if( (*dimg)->rawimage ) + if((*dimg)->rawimage) { - free( (*dimg)->rawimage ); + free((*dimg)->rawimage); (*dimg)->rawimage = NULL; } - free( *dimg ); + free(*dimg); *dimg = NULL; } +static inline char diskimage_check(struct diskimage* dimg, Uint32 offset) +{ + if(!dimg) return 0; + if(!dimg->rawimage) return 0; + if(dimg->rawimagelen < 4) return 0; + if((dimg->rawimagelen - 4) < offset) return 0; + + return 1; +} + // Read a raw integer from a disk image file -static Uint32 diskimage_rawint( struct diskimage *dimg, Uint32 offset ) +static Uint32 diskimage_get_rawint(struct diskimage* dimg, Uint32 offset) { - if( !dimg ) return 0; - if( ( !dimg->rawimage ) || ( dimg->rawimagelen < 4 ) ) return 0; - if( offset > (dimg->rawimagelen-4) ) return 0; + Uint32 val = 0; + if(diskimage_check(dimg,offset)) + { + val |= dimg->rawimage[offset+3]<<24; + val |= dimg->rawimage[offset+2]<<16; + val |= dimg->rawimage[offset+1]<<8; + val |= dimg->rawimage[offset]; + } + return val; +} - return (dimg->rawimage[offset+3]<<24)|(dimg->rawimage[offset+2]<<16)|(dimg->rawimage[offset+1]<<8)|dimg->rawimage[offset]; +static void diskimage_set_rawint(struct diskimage* dimg, Uint32 offset, Uint32 val) +{ + if(diskimage_check(dimg, offset)) + { + dimg->rawimage[offset] = val & 0xff; + val >>= 8; + dimg->rawimage[offset+1] = val & 0xff; + val >>= 8; + dimg->rawimage[offset+2] = val & 0xff; + val >>= 8; + dimg->rawimage[offset+3] = val & 0xff; + } } // Allocate and initialise a disk image structure // If "rawimglen" isn't zero, it will also allocate // ram for a raw disk image -static struct diskimage *diskimage_alloc( Uint32 rawimglen ) +static struct diskimage *diskimage_alloc( int drivetype, Uint32 rawimglen ) { - struct diskimage *dimg; - Uint8 *buf = NULL; + struct diskimage *dimg = NULL; - if( rawimglen ) + if(0 < rawimglen) { - // FIXME: this is temporary solution to allow - // low-level formatting up to 128 track per side - if( 143360 != rawimglen && rawimglen < 128*2*6400+256 ) - rawimglen = 128*2*6400+256; + Uint8 *buf = NULL; + + if( DRV_PRAVETZ != drivetype ) + rawimglen = 256+2*128*6400; - buf = malloc( rawimglen ); + buf = malloc(rawimglen); if( !buf ) return NULL; + + dimg = malloc( sizeof( struct diskimage ) ); + if(!dimg) + { + free(buf); + return NULL; + } + + dimg->drivenum = -1; + dimg->numsides = 0; + dimg->numtracks = 0; + dimg->numsides_in = 0; + dimg->numtracks_in = 0; + dimg->numsides_out = 0; + dimg->numtracks_out = 0; + dimg->geometry = 0; + dimg->cachedtrack = -1; + dimg->cachedside = -1; + dimg->numsectors = 0; + dimg->rawimage = buf; + dimg->rawimagelen = rawimglen; + dimg->modified = SDL_FALSE; + dimg->modified_time = 0; } + return dimg; +} - dimg = malloc( sizeof( struct diskimage ) ); - if( !dimg ) +static void diskimage_set_modified( struct diskimage* dimg, uint8_t side, uint8_t track ) +{ + if(dimg) { - free( buf ); - return NULL; + dimg->modified = SDL_TRUE; + dimg->modified_time = 0; + side++; + if(dimg->numsides_out < side) + dimg->numsides_out = side; + track++; + if(dimg->numtracks_out < track) + dimg->numtracks_out = track; } - - dimg->drivenum = -1; - dimg->numtracks = 0; - dimg->numsides = 0; - dimg->geometry = 0; - dimg->cachedtrack = -1; - dimg->cachedside = -1; - dimg->numsectors = 0; - dimg->rawimage = buf; - dimg->rawimagelen = rawimglen; - dimg->modified = SDL_FALSE; - dimg->modified_time = 0; - return dimg; } // Eject a disk from a drive void disk_eject( struct machine *oric, int drive ) { - diskimage_free( oric, &oric->wddisk.disk[drive] ); + diskimage_free(oric, &oric->wddisk.disk[drive]); oric->wddisk.disk[drive] = NULL; - oric->pravetz.drv[drive].pimg = NULL; oric->pravetz.drv[drive].byte = 0; oric->pravetz.drv[drive].dirty = SDL_FALSE; @@ -220,12 +265,12 @@ void diskimage_cachetrack( struct diskimage *dimg, int track, int side ) Uint32 sectorcount, n; // If this track is already cached, don't waste time doing it again - if( ( dimg->cachedtrack == track ) && - ( dimg->cachedside == side ) ) + if((dimg->cachedtrack == track) && + (dimg->cachedside == side)) return; // reset cached info - for( n=0; n<32; n++ ) + for(n=0; n<32; n++) { dimg->sector[n].id_ptr = NULL; dimg->sector[n].data_ptr = NULL; @@ -234,7 +279,7 @@ void diskimage_cachetrack( struct diskimage *dimg, int track, int side ) dimg->cachedtrack = -1; dimg->cachedside = -1; - if( side >= dimg->numsides ) + if(side >= dimg->numsides) return; // Find the start and end locations of the track within the disk image @@ -243,14 +288,14 @@ void diskimage_cachetrack( struct diskimage *dimg, int track, int side ) // Scan through the track looking for sectors sectorcount = 0; - while( ptr < eot ) + while(ptr < eot) { // Search for ID mark - while( ((ptr+3)= eot ) break; + if(ptr >= eot) break; // Store ID pointer dimg->sector[sectorcount].id_ptr = ptr; @@ -264,8 +309,8 @@ void diskimage_cachetrack( struct diskimage *dimg, int track, int side ) ptr+=7; // Search for data ID - while( (ptr= eot ) break; + while((ptr= eot) break; // Store pointer dimg->sector[sectorcount-1].data_ptr = ptr; @@ -274,7 +319,7 @@ void diskimage_cachetrack( struct diskimage *dimg, int track, int side ) ptr += (1<<(n+7))+3; } - if( 0 < sectorcount ) + if(0 < sectorcount) { // Remember how many sectors we have successfully cached dimg->numsectors = sectorcount; @@ -289,43 +334,68 @@ void diskimage_cachetrack( struct diskimage *dimg, int track, int side ) // memory back to disk. SDL_bool diskimage_save( struct machine *oric, char *fname, int drive ) { - FILE *f; + struct diskimage* dimg = oric->wddisk.disk[drive]; // Make sure there is a disk in the drive! - if( !oric->wddisk.disk[drive] ) return SDL_FALSE; + if( !dimg ) return SDL_FALSE; if( oric->drivetype == DRV_PRAVETZ ) - disk_pravetz_write_image(&oric->pravetz.drv[drive]); - - // Open the file for writing - f = fopen( fname, "wb" ); - if( !f ) { - do_popup( oric, "\x14\x15Save failed" ); - return SDL_FALSE; + disk_pravetz_write_image(&oric->pravetz.drv[drive]); } - - // Dump it to disk - if( fwrite( oric->wddisk.disk[drive]->rawimage, oric->wddisk.disk[drive]->rawimagelen, 1, f ) != 1 ) + else { - fclose( f ); - do_popup( oric, "\x14\x15Save failed" ); - return SDL_FALSE; - } + int sidesize = 0; + // Open the file for writing + FILE *f = fopen(fname, "wb"); + if(!f) + { + do_popup( oric, "\x14\x15Save failed" ); + return SDL_FALSE; + } - // All done! - fclose( f ); + // Dump it to disk + if(dimg->numsides_in < dimg->numsides_out) + dimg->numsides_in = dimg->numsides_out; + if(dimg->numtracks_in < dimg->numtracks_out) + dimg->numtracks_in = dimg->numtracks_out; - // If we are not just overwriting the original file, remember the new filename - if( fname != oric->wddisk.disk[drive]->filename ) - { - strncpy( oric->wddisk.disk[drive]->filename, fname, 4096+512-1 ); - oric->wddisk.disk[drive]->filename[4096+512-1] = 0; + diskimage_set_rawint(dimg, 8, oric->wddisk.disk[drive]->numsides_in); + diskimage_set_rawint(dimg, 12, oric->wddisk.disk[drive]->numtracks_in); + + sidesize = oric->wddisk.disk[drive]->numtracks_in*6400; + + if(fwrite(dimg->rawimage, 256+sidesize, 1, f) != 1) + { + fclose(f); + do_popup( oric, "\x14\x15Save failed" ); + return SDL_FALSE; + } + + if(1 < dimg->numsides_in) + { + if(fwrite(dimg->rawimage+256+128*6400, sidesize, 1, f) != 1) + { + fclose(f); + do_popup( oric, "\x14\x15Save failed" ); + return SDL_FALSE; + } + } + + // All done! + fclose(f); + + // If we are not just overwriting the original file, remember the new filename + if(fname != dimg->filename) + { + strncpy( dimg->filename, fname, 4096+512-1 ); + dimg->filename[4096+512-1] = 0; + } } // The image in memory is no longer different to the last saved version - oric->wddisk.disk[drive]->modified = SDL_FALSE; - oric->wddisk.disk[drive]->modified_time = 0; + dimg->modified = SDL_FALSE; + dimg->modified_time = 0; #ifdef WWW // sync from memory state to persisted @@ -348,43 +418,43 @@ SDL_bool diskimage_load( struct machine *oric, char *fname, int drive ) Uint32 len; // Open the file - f = fopen( fname, "rb" ); + f = fopen(fname, "rb"); if( !f ) return SDL_FALSE; // The file exists, so eject any currently inserted disk - disk_eject( oric, drive ); + disk_eject(oric, drive); // Determine the size of the disk image - fseek( f, 0, SEEK_END ); - len = (int)ftell( f ); - fseek( f, 0, SEEK_SET ); + fseek(f, 0, SEEK_END); + len = (int)ftell(f); + fseek(f, 0, SEEK_SET); // Empty file!? - if( len <= 0 ) + if(len <= 0) { - fclose( f ); + fclose(f); return SDL_FALSE; } // Allocate a new disk image structure and space for the raw image - oric->wddisk.disk[drive] = diskimage_alloc( len ); - if( !oric->wddisk.disk[drive] ) + oric->wddisk.disk[drive] = diskimage_alloc(oric->drivetype, len); + if(!oric->wddisk.disk[drive]) { do_popup( oric, "\x14\x15""Out of memory" ); - fclose( f ); + fclose(f); return SDL_FALSE; } // Read the image file into memory - if( fread( oric->wddisk.disk[drive]->rawimage, len, 1, f ) != 1 ) + if(fread(oric->wddisk.disk[drive]->rawimage, len, 1, f) != 1) { - fclose( f ); - disk_eject( oric, drive ); + fclose(f); + disk_eject(oric, drive); do_popup( oric, "\x14\x15""Read error" ); return SDL_FALSE; } - fclose( f ); + fclose(f); if( oric->drivetype == DRV_PRAVETZ ) { @@ -393,70 +463,102 @@ SDL_bool diskimage_load( struct machine *oric, char *fname, int drive ) Uint16 sb_idx; Uint16 tb_idx; + oric->wddisk.disk[drive]->drivenum = drive; oric->pravetz.drv[drive].pimg = oric->wddisk.disk[drive]; if( drive >= 2 ) { - disk_eject( oric, drive ); + disk_eject(oric, drive); do_popup( oric, "\x14\x15""Invalid drive number" ); return SDL_FALSE; } if( len != 143360 ) { - disk_eject( oric, drive ); + disk_eject(oric, drive); do_popup( oric, "\x14\x15""Invalid pravetz disk image" ); return SDL_FALSE; } // Get some basic image info - for (t_idx = 0; t_idx < PRAV_TRACKS_PER_DISK; t_idx++) + for(t_idx = 0; t_idx < PRAV_TRACKS_PER_DISK; t_idx++) { tb_idx = 0; - for (s_idx = 0; s_idx < PRAV_SECTORS_PER_TRACK; s_idx++) + for(s_idx = 0; s_idx < PRAV_SECTORS_PER_TRACK; s_idx++) { - for (sb_idx = 0; sb_idx < PRAV_RAW_BYTES_PER_SECTOR; sb_idx++, tb_idx++) + for(sb_idx = 0; sb_idx < PRAV_RAW_BYTES_PER_SECTOR; sb_idx++, tb_idx++) { oric->pravetz.drv[drive].image[t_idx][tb_idx] = disk_pravetz_image_raw_byte(oric, drive, t_idx, s_idx, sb_idx); } } - while (tb_idx < PRAV_RAW_TRACK_SIZE) + while(tb_idx < PRAV_RAW_TRACK_SIZE) { oric->pravetz.drv[drive].image[t_idx][tb_idx] = 0xFF; tb_idx++; } } - oric->pravetz.drv[drive].byte = 0; + oric->pravetz.drv[drive].byte = 0; oric->pravetz.drv[drive].half_track = 0; } else { // Check for the header ID - if( strncmp( (char *)oric->wddisk.disk[drive]->rawimage, "MFM_DISK", 8 ) != 0 ) + if(strncmp((char*)oric->wddisk.disk[drive]->rawimage, "MFM_DISK", 8) != 0) { - disk_eject( oric, drive ); + disk_eject(oric, drive); do_popup( oric, "\x14\x15""Invalid disk image" ); return SDL_FALSE; } // Get some basic image info oric->wddisk.disk[drive]->drivenum = drive; - oric->wddisk.disk[drive]->numsides = diskimage_rawint( oric->wddisk.disk[drive], 8 ); - oric->wddisk.disk[drive]->numtracks = diskimage_rawint( oric->wddisk.disk[drive], 12 ); - oric->wddisk.disk[drive]->geometry = diskimage_rawint( oric->wddisk.disk[drive], 16 ); + oric->wddisk.disk[drive]->numsides_in = diskimage_get_rawint(oric->wddisk.disk[drive], 8); + oric->wddisk.disk[drive]->numtracks_in = diskimage_get_rawint(oric->wddisk.disk[drive], 12); + oric->wddisk.disk[drive]->geometry = diskimage_get_rawint(oric->wddisk.disk[drive], 16); // Is the disk sane!? - if( ( oric->wddisk.disk[drive]->numsides < 1 ) || - ( oric->wddisk.disk[drive]->numsides > 2 ) ) + if(1 != oric->wddisk.disk[drive]->geometry) { - disk_eject( oric, drive ); + disk_eject(oric, drive); + do_popup( oric, "\x14\x15""Unsupported disk image geometry" ); + return SDL_FALSE; + } + + if((oric->wddisk.disk[drive]->numsides_in < 1) || + (oric->wddisk.disk[drive]->numsides_in > 2)) + { + disk_eject(oric, drive); do_popup( oric, "\x14\x15""Invalid disk image" ); return SDL_FALSE; } + + if(oric->wddisk.disk[drive]->numtracks_in > 128) + { + disk_eject(oric, drive); + do_popup( oric, "\x14\x15""Invalid disk image" ); + return SDL_FALSE; + } + + oric->wddisk.disk[drive]->numsides = 2; + oric->wddisk.disk[drive]->numtracks = 128; + + if(1 < oric->wddisk.disk[drive]->numsides_in) + { + if(oric->wddisk.disk[drive]->numtracks_in < 128) + { + // Reallocate side 2 + int size = oric->wddisk.disk[drive]->numtracks_in*6400; + uint8_t* src = oric->wddisk.disk[drive]->rawimage + 256+size; + uint8_t* dst = oric->wddisk.disk[drive]->rawimage + 256+128*6400; + memmove(dst,src,size); + // Clear the reallocated space + memset(src+size,0x00,128*6400-size); + } + } } // Nobody has written to this disk yet @@ -487,7 +589,7 @@ SDL_bool diskimage_load( struct machine *oric, char *fname, int drive ) // This routine does nothing. It is just used as a default for the callback routines // and is usually replaced by the microdisc/jasmin/whatever implementations. -void wd17xx_dummy( void *nothing ) +void wd17xx_dummy(void* nothing) { } @@ -521,18 +623,18 @@ void wd17xx_init( struct wd17xx *wd ) void wd17xx_ticktock( struct wd17xx *wd, int cycles ) { #ifdef MICRODISC_FUDGE - if ((wd->currentop == COP_READ_SECTORS_FUDGE) || + if((wd->currentop == COP_READ_SECTORS_FUDGE) || (wd->currentop == COP_READ_SECTOR_FUDGE)) { - if (wd->disk[wd->c_drive]) + if(wd->disk[wd->c_drive]) { wd->curroffs = 0; - wd->currsector = wd17xx_find_sector( wd, wd->r_sector ); - if( !wd->currsector ) + wd->currsector = wd17xx_find_sector(wd, wd->r_sector); + if(!wd->currsector) { wd->r_status = WSF_RNF; - wd->clrdrq( wd->drqarg ); - wd->setintrq( wd->intrqarg ); + wd->clrdrq(wd->drqarg); + wd->setintrq(wd->intrqarg); wd->currentop = COP_NUFFINK; refreshdisks = SDL_TRUE; #if GENERAL_DISK_DEBUG @@ -557,19 +659,19 @@ void wd17xx_ticktock( struct wd17xx *wd, int cycles ) #endif // Is there a pending INTRQ? - if( wd->delayedint > 0 ) + if(wd->delayedint > 0) { // Count down the INTRQ timer! wd->delayedint -= cycles; // Time to assert INTRQ? - if( wd->delayedint <= 0 ) + if(wd->delayedint <= 0) { // Yep! Stop timing. wd->delayedint = 0; // Need to update the status register? - if( wd->distatus != -1 ) + if(wd->distatus != -1) { // Yep. Do so. wd->r_status = wd->distatus; @@ -577,7 +679,7 @@ void wd17xx_ticktock( struct wd17xx *wd, int cycles ) } // Assert INTRQ (this function pointer is set up by the microdisc/jasmin/whatever controller) - wd->setintrq( wd->intrqarg ); + wd->setintrq(wd->intrqarg); #if GENERAL_DISK_DEBUG dbg_printf( "DISK: Delayed INTRQ" ); #endif @@ -585,19 +687,19 @@ void wd17xx_ticktock( struct wd17xx *wd, int cycles ) } // Is there a pending DRQ? - if( wd->delayeddrq > 0 ) + if(wd->delayeddrq > 0) { // Count down the DRQ timer! wd->delayeddrq -= cycles; // Time to assert DRQ? - if( wd->delayeddrq <= 0 ) + if(wd->delayeddrq <= 0) { // Yep! Stop timing. wd->delayeddrq = 0; // Need to update the status register? - if( wd->ddstatus != -1 ) + if(wd->ddstatus != -1) { // Yep. Do so. wd->r_status = wd->ddstatus; @@ -606,7 +708,7 @@ void wd17xx_ticktock( struct wd17xx *wd, int cycles ) // Assert DRQ wd->r_status |= WSF_DRQ; - wd->setdrq( wd->drqarg ); + wd->setdrq(wd->drqarg); } } } @@ -615,10 +717,10 @@ void wd17xx_ticktock( struct wd17xx *wd, int cycles ) void wd17xx_seek_track( struct wd17xx *wd, Uint8 track, SDL_bool dofudge ) { // Is there a disk in the drive? - if( wd->disk[wd->c_drive] ) + if(wd->disk[wd->c_drive]) { // Yes. If we are trying to seek to a non-existant track, just seek as far as we can - if( track >= wd->disk[wd->c_drive]->numtracks ) + if(track >= wd->disk[wd->c_drive]->numtracks) { track = (wd->disk[wd->c_drive]->numtracks>0)?wd->disk[wd->c_drive]->numtracks-1:0; wd->distatus = WSFI_HEADL|WSFI_SEEKERR; @@ -629,7 +731,7 @@ void wd17xx_seek_track( struct wd17xx *wd, Uint8 track, SDL_bool dofudge ) } // Cache the new track - diskimage_cachetrack( wd->disk[wd->c_drive], track, wd->c_side ); + diskimage_cachetrack(wd->disk[wd->c_drive], track, wd->c_side); // Update our status wd->c_track = track; @@ -641,7 +743,7 @@ void wd17xx_seek_track( struct wd17xx *wd, Uint8 track, SDL_bool dofudge ) // delay would depend how far the head had to seek, and what stepping speed was // currently set). wd->delayedint = 20; - if( wd->c_track == 0 ) wd->distatus |= WSFI_TRK0; + if(wd->c_track == 0) wd->distatus |= WSFI_TRK0; #if GENERAL_DISK_DEBUG dbg_printf( "DISK: At track %u (%u sectors)", track, wd->disk[wd->c_drive]->numsectors ); #endif @@ -650,7 +752,7 @@ void wd17xx_seek_track( struct wd17xx *wd, Uint8 track, SDL_bool dofudge ) // No disk in drive // Set INTRQ because the operation has finished. - wd->setintrq( wd->intrqarg ); + wd->setintrq(wd->intrqarg); wd->r_track = 0; #if GENERAL_DISK_DEBUG @@ -659,10 +761,10 @@ void wd17xx_seek_track( struct wd17xx *wd, Uint8 track, SDL_bool dofudge ) #ifdef MICRODISC_FUDGE // Euphoric style workaround for the sedoric bug... - if ((dofudge) && (wd->setintrq == microdisc_setintrq)) + if((dofudge) && (wd->setintrq == microdisc_setintrq)) { - wd->r_status = 0x44; - return; + wd->r_status = 0x44; + return; } #endif @@ -685,29 +787,29 @@ struct mfmsector *wd17xx_find_sector( struct wd17xx *wd, Uint8 secid ) if( !dimg ) return NULL; // Make sure the current track is cached - diskimage_cachetrack( dimg, wd->c_track, wd->c_side ); + diskimage_cachetrack(dimg, wd->c_track, wd->c_side); // No sectors on this track? Someone needs to format their disk... - if( dimg->numsectors < 1 ) + if(dimg->numsectors < 1) return NULL; // We do this more realistically than we need to since this is not // a super-accurate emulation (for now). Never mind. Lets go // around the track up to two times. - while( revs < 2 ) + while(revs < 2) { // Move on to the next sector wd->c_sector = (wd->c_sector+1)%dimg->numsectors; // If we passed through the start of the track, set the pulse bit in the status register - if( !wd->c_sector ) + if(!wd->c_sector) { revs++; wd->r_status |= WSFI_PULSE; } // Found the required sector? - if( dimg->sector[wd->c_sector].id_ptr[3] == secid ) + if(dimg->sector[wd->c_sector].id_ptr[3] == secid) return &dimg->sector[wd->c_sector]; } @@ -730,10 +832,10 @@ struct mfmsector *wd17xx_first_sector( struct wd17xx *wd ) if( !dimg ) return NULL; // Make sure the current track is cached - diskimage_cachetrack( dimg, wd->c_track, wd->c_side ); + diskimage_cachetrack(dimg, wd->c_track, wd->c_side); // No sectors?! - if( dimg->numsectors < 1 ) + if(dimg->numsectors < 1) return NULL; // We're at the first sector! @@ -755,17 +857,17 @@ struct mfmsector *wd17xx_next_sector( struct wd17xx *wd ) if( !dimg ) return NULL; // Make sure the current track is cached - diskimage_cachetrack( dimg, wd->c_track, wd->c_side ); + diskimage_cachetrack(dimg, wd->c_track, wd->c_side); // No sectors? - if( dimg->numsectors < 1 ) + if(dimg->numsectors < 1) return NULL; // Get the next sector number wd->c_sector = (wd->c_sector+1)%dimg->numsectors; // If we are at the start of the track, set the pulse bit - if( !wd->c_sector ) wd->r_status |= WSFI_PULSE; + if(!wd->c_sector) wd->r_status |= WSFI_PULSE; // Return the sector pointers return &dimg->sector[wd->c_sector]; @@ -775,10 +877,10 @@ struct mfmsector *wd17xx_next_sector( struct wd17xx *wd ) unsigned char wd17xx_read( struct wd17xx *wd, unsigned short addr ) { // Which register?! - switch( addr ) + switch(addr) { case 0: // Status register - wd->clrintrq( wd->intrqarg ); // Reading the status register clears INTRQ + wd->clrintrq(wd->intrqarg); // Reading the status register clears INTRQ return wd->r_status; case 1: // Track register @@ -789,7 +891,7 @@ unsigned char wd17xx_read( struct wd17xx *wd, unsigned short addr ) case 3: // Data register // What are we currently doing? - switch( wd->currentop ) + switch(wd->currentop) { #ifdef MICRODISC_FUDGE case COP_READ_SECTOR_FUDGE: @@ -800,33 +902,33 @@ unsigned char wd17xx_read( struct wd17xx *wd, unsigned short addr ) case COP_READ_SECTOR: case COP_READ_SECTORS: // We somehow started a sector read operation without a valid sector. - if( !wd->currsector ) + if(!wd->currsector) { // Abort. wd->r_status &= ~WSF_DRQ; wd->r_status |= WSF_RNF; - wd->clrdrq( wd->drqarg ); + wd->clrdrq(wd->drqarg); wd->currentop = COP_NUFFINK; refreshdisks = SDL_TRUE; break; } // If this is the first read of a read operation, remember the record type for later - if( wd->curroffs == 0 ) wd->sectype = (wd->currsector->data_ptr[wd->curroffs++]==0xf8)?WSFR_RECTYP:0x00; + if(wd->curroffs == 0) wd->sectype = (wd->currsector->data_ptr[wd->curroffs++]==0xf8)?WSFR_RECTYP:0x00; // Get the next byte from the sector wd->r_data = wd->currsector->data_ptr[wd->curroffs++]; - wd->crc = calc_crc( wd->crc, wd->r_data ); + wd->crc = calc_crc(wd->crc, wd->r_data); // Clear any previous DRQ wd->r_status &= ~WSF_DRQ; - wd->clrdrq( wd->drqarg ); + wd->clrdrq(wd->drqarg); #if DEBUG_SECTOR_DUMP - sprintf( §ordumpstr[sectordumpcount*2], "%02X", wd->r_data ); + sprintf(§ordumpstr[sectordumpcount*2], "%02X", wd->r_data); sectordumpstr[34+sectordumpcount] = ((wd->r_data>31)&&(wd->r_data<127)) ? wd->r_data : '.'; sectordumpcount++; - if( sectordumpcount >= 16 ) + if(sectordumpcount >= 16) { sectordumpstr[32] = ' '; sectordumpstr[33] = '\''; @@ -838,16 +940,16 @@ unsigned char wd17xx_read( struct wd17xx *wd, unsigned short addr ) #endif // Has the whole sector been read? - if( wd->curroffs > wd->currseclen ) + if(wd->curroffs > wd->currseclen) { // If you want to do CRC checking, wd->crc should equal (wd->currsector->data_ptr[wd_curroffs]<<8)|wd->currsector->data_ptr[wd_curroffs+1] right here #if DEBUG_SECTOR_DUMP - if( sectordumpcount ) + if(sectordumpcount) { sectordumpstr[33] = '\''; sectordumpstr[34+sectordumpcount] = '\''; sectordumpstr[35+sectordumpcount] = 0; - for( sectordumpcount*=2; sectordumpcount<33; sectordumpcount++ ) + for(sectordumpcount*=2; sectordumpcount<33; sectordumpcount++) sectordumpstr[sectordumpcount*2] = ' '; dbg_printf( "%s", sectordumpstr ); sectordumpcount = 0; @@ -856,7 +958,7 @@ unsigned char wd17xx_read( struct wd17xx *wd, unsigned short addr ) // We've got to the end of the current sector. IF it is a multiple sector // operation, we need to move on! - if( wd->currentop == COP_READ_SECTORS ) + if(wd->currentop == COP_READ_SECTORS) { #if GENERAL_DISK_DEBUG dbg_printf( "Next sector..." ); @@ -864,18 +966,18 @@ unsigned char wd17xx_read( struct wd17xx *wd, unsigned short addr ) // Get the next sector, and carry on! wd->r_sector++; wd->curroffs = 0; - wd->currsector = wd17xx_find_sector( wd, wd->r_sector ); + wd->currsector = wd17xx_find_sector(wd, wd->r_sector); wd->crc = 0xe295; // If we hit the end of the track, thats fine, it just means the operation // is finished. - if( !wd->currsector ) + if(!wd->currsector) { wd->delayedint = 20; // Assert INTRQ in 20 cycles time wd->distatus = wd->sectype; // ...and when doing so, set the status to reflect the record type wd->currentop = COP_NUFFINK; // No longer in the middle of an operation wd->r_status &= (~WSF_DRQ); // Clear DRQ (no data to read) - wd->clrdrq( wd->drqarg ); + wd->clrdrq(wd->drqarg); refreshdisks = SDL_TRUE; // Turn off the disk LED in the status bar break; } @@ -892,7 +994,7 @@ unsigned char wd17xx_read( struct wd17xx *wd, unsigned short addr ) wd->distatus = wd->sectype; // Set the status accordingly wd->currentop = COP_NUFFINK; // Finished the op wd->r_status &= (~WSF_DRQ); // Clear DRQ (no more data) - wd->clrdrq( wd->drqarg ); + wd->clrdrq(wd->drqarg); refreshdisks = SDL_TRUE; // Turn off disk LED } else { wd->delayeddrq = 32; // More data ready. DRQ to let them know! @@ -904,10 +1006,10 @@ unsigned char wd17xx_read( struct wd17xx *wd, unsigned short addr ) wd->r_data = wd->disk[wd->c_drive]->rawimage[(wd->c_side*wd->disk[wd->c_drive]->numtracks + wd->c_track)*6400+256 + wd->curroffs]; wd->curroffs++; wd->r_status &= ~WSF_DRQ; - wd->clrdrq( wd->drqarg ); + wd->clrdrq(wd->drqarg); // Has the whole track been read? - if( wd->curroffs >= 6400 ) + if(wd->curroffs >= 6400) { wd->delayedint = 20; wd->distatus = 0; @@ -920,19 +1022,19 @@ unsigned char wd17xx_read( struct wd17xx *wd, unsigned short addr ) break; case COP_READ_ADDRESS: - if( !wd->currsector ) + if(!wd->currsector) { wd->r_status &= ~WSF_DRQ; - wd->clrdrq( wd->drqarg ); + wd->clrdrq(wd->drqarg); wd->currentop = COP_NUFFINK; refreshdisks = SDL_TRUE; break; } - if( wd->curroffs == 0 ) wd->r_sector = wd->currsector->id_ptr[1]; + if(wd->curroffs == 0) wd->r_sector = wd->currsector->id_ptr[1]; wd->r_data = wd->currsector->id_ptr[++wd->curroffs]; wd->r_status &= ~WSF_DRQ; - wd->clrdrq( wd->drqarg ); - if( wd->curroffs >= 6 ) + wd->clrdrq(wd->drqarg); + if(wd->curroffs >= 6) { wd->delayedint = 20; wd->distatus = 0; @@ -953,21 +1055,21 @@ unsigned char wd17xx_read( struct wd17xx *wd, unsigned short addr ) static SDL_bool last_step_in = SDL_FALSE; void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, unsigned char data ) { - switch( addr ) + switch(addr) { case 0: // Command register - wd->clrintrq( wd->intrqarg ); - switch( data & 0xe0 ) + wd->clrintrq(wd->intrqarg); + switch(data & 0xe0) { case 0x00: // Restore or seek - switch( data & 0x10 ) + switch(data & 0x10) { case 0x00: // Restore (Type I) #if GENERAL_DISK_DEBUG dbg_printf( "DISK: (%04X) Restore", oric->cpu.pc-1 ); #endif wd->r_status = WSF_BUSY; - if( data & 8 ) wd->r_status |= WSFI_HEADL; + if(data & 8) wd->r_status |= WSFI_HEADL; wd17xx_seek_track( wd, 0, oric->cpu.calcpc == 0xe3a1 ); wd->currentop = COP_NUFFINK; refreshdisks = SDL_TRUE; @@ -978,7 +1080,7 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, dbg_printf( "DISK: (%04X) Seek", oric->cpu.pc-1 ); #endif wd->r_status = WSF_BUSY; - if( data & 8 ) wd->r_status |= WSFI_HEADL; + if(data & 8) wd->r_status |= WSFI_HEADL; wd17xx_seek_track( wd, wd->r_data, SDL_FALSE ); wd->currentop = COP_NUFFINK; refreshdisks = SDL_TRUE; @@ -991,8 +1093,8 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, dbg_printf( "DISK: (%04X) Step", oric->cpu.pc-1 ); #endif wd->r_status = WSF_BUSY; - if( data & 8 ) wd->r_status |= WSFI_HEADL; - if( last_step_in ) + if(data & 8) wd->r_status |= WSFI_HEADL; + if(last_step_in) wd17xx_seek_track( wd, wd->c_track+1, SDL_FALSE ); else wd17xx_seek_track( wd, wd->c_track > 0 ? wd->c_track-1 : 0, SDL_FALSE ); @@ -1005,7 +1107,7 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, dbg_printf( "DISK: (%04X) Step-In (%d,%d)", oric->cpu.pc-1, wd->c_track, wd->c_track+1 ); #endif wd->r_status = WSF_BUSY; - if( data & 8 ) wd->r_status |= WSFI_HEADL; + if(data & 8) wd->r_status |= WSFI_HEADL; wd17xx_seek_track( wd, wd->c_track+1, SDL_FALSE ); last_step_in = SDL_TRUE; wd->currentop = COP_NUFFINK; @@ -1017,8 +1119,8 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, dbg_printf( "DISK: Step-Out" ); #endif wd->r_status = WSF_BUSY; - if( data & 8 ) wd->r_status |= WSFI_HEADL; - if( wd->c_track > 0 ) + if(data & 8) wd->r_status |= WSFI_HEADL; + if(wd->c_track > 0) wd17xx_seek_track( wd, wd->c_track-1, SDL_FALSE ); last_step_in = SDL_FALSE; wd->currentop = COP_NUFFINK; @@ -1027,7 +1129,7 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, case 0x80: // Read sector (Type II) #if GENERAL_DISK_DEBUG - switch( oric->drivetype ) + switch(oric->drivetype) { case DRV_MICRODISC: dbg_printf( "DISK: (%04X) Read sector %u (CODE=%02X,ROM=%s,EPROM=%s)", oric->cpu.pc-1, wd->r_sector, data, oric->romdis?"OFF":"ON", oric->md.diskrom?"ON":"OFF" ); @@ -1039,7 +1141,7 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, } #endif #ifdef MICRODISC_FUDGE - if (!wd->disk[wd->c_drive]) + if(!wd->disk[wd->c_drive]) { wd->currentop = (data&0x10) ? COP_READ_SECTORS_FUDGE : COP_READ_SECTOR_FUDGE; break; @@ -1047,12 +1149,12 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, #endif wd->curroffs = 0; - wd->currsector = wd17xx_find_sector( wd, wd->r_sector ); - if( !wd->currsector ) + wd->currsector = wd17xx_find_sector(wd, wd->r_sector); + if(!wd->currsector) { wd->r_status = WSF_RNF; - wd->clrdrq( wd->drqarg ); - wd->setintrq( wd->intrqarg ); + wd->clrdrq(wd->drqarg); + wd->setintrq(wd->intrqarg); wd->currentop = COP_NUFFINK; refreshdisks = SDL_TRUE; #if GENERAL_DISK_DEBUG @@ -1076,7 +1178,7 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, case 0xa0: // Write sector (Type II) #if GENERAL_DISK_DEBUG - switch( oric->drivetype ) + switch(oric->drivetype) { case DRV_MICRODISC: dbg_printf( "DISK: (%04X) Write sector %u (CODE=%02X,ROM=%s,EPROM=%s)", oric->cpu.pc-1, wd->r_sector, data, oric->romdis?"OFF":"ON", oric->md.diskrom?"ON":"OFF" ); @@ -1088,12 +1190,12 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, } #endif wd->curroffs = 0; - wd->currsector = wd17xx_find_sector( wd, wd->r_sector ); - if( !wd->currsector ) + wd->currsector = wd17xx_find_sector(wd, wd->r_sector); + if(!wd->currsector) { wd->r_status = WSF_RNF; - wd->clrdrq( wd->drqarg ); - wd->setintrq( wd->intrqarg ); + wd->clrdrq(wd->drqarg); + wd->setintrq(wd->intrqarg); wd->currentop = COP_NUFFINK; refreshdisks = SDL_TRUE; #if GENERAL_DISK_DEBUG @@ -1112,24 +1214,24 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, break; case 0xc0: // Read address / Force IRQ - switch( data & 0x10 ) + switch(data & 0x10) { case 0x00: // Read address (Type III) #if GENERAL_DISK_DEBUG dbg_printf( "DISK: (%04X) Read address", oric->cpu.pc-1 ); #endif wd->curroffs = 0; - if( !wd->currsector ) - wd->currsector = wd17xx_first_sector( wd ); + if(!wd->currsector) + wd->currsector = wd17xx_first_sector(wd); else - wd->currsector = wd17xx_next_sector( wd ); + wd->currsector = wd17xx_next_sector(wd); - if( !wd->currsector ) + if(!wd->currsector) { wd->r_status = WSF_RNF; - wd->clrdrq( wd->drqarg ); + wd->clrdrq(wd->drqarg); wd->currentop = COP_NUFFINK; - wd->setintrq( wd->intrqarg ); + wd->setintrq(wd->intrqarg); refreshdisks = SDL_TRUE; #if GENERAL_DISK_DEBUG dbg_printf( "DISK: No sectors on this track?" ); @@ -1139,15 +1241,15 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, #if GENERAL_DISK_DEBUG dbg_printf( "DISK: %02X,%02X,%02X,%02X,%02X,%02X", - wd->currsector->id_ptr[1], - wd->currsector->id_ptr[2], - wd->currsector->id_ptr[3], - wd->currsector->id_ptr[4], - wd->currsector->id_ptr[5], - wd->currsector->id_ptr[6] ); + wd->currsector->id_ptr[1], + wd->currsector->id_ptr[2], + wd->currsector->id_ptr[3], + wd->currsector->id_ptr[4], + wd->currsector->id_ptr[5], + wd->currsector->id_ptr[6]); #endif wd->r_status = WSF_NOTREADY|WSF_BUSY|WSF_DRQ; - wd->setdrq( wd->drqarg ); + wd->setdrq(wd->drqarg); wd->currentop = COP_READ_ADDRESS; refreshdisks = SDL_TRUE; break; @@ -1157,8 +1259,8 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, dbg_printf( "DISK: (%04X) Force int", oric->cpu.pc-1 ); #endif wd->r_status = 0; - wd->clrdrq( wd->drqarg ); - wd->setintrq( wd->intrqarg ); + wd->clrdrq(wd->drqarg); + wd->setintrq(wd->intrqarg); wd->delayedint = 0; wd->delayeddrq = 0; wd->currentop = COP_NUFFINK; @@ -1168,7 +1270,7 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, break; case 0xe0: // Read track / Write track - switch( data & 0x10 ) + switch(data & 0x10) { case 0x00: // Read track (Type III) #if GENERAL_DISK_DEBUG @@ -1189,8 +1291,8 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, wd->curroffs = 0; wd->r_status = WSF_NOTREADY|WSF_BUSY; wd->delayeddrq = 500; - wd->clrdrq( wd->drqarg ); - wd->clrintrq( wd->intrqarg ); + wd->clrdrq(wd->drqarg); + wd->clrintrq(wd->intrqarg); wd->delayedint = 0; wd->currentop = COP_WRITE_TRACK; @@ -1212,33 +1314,32 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, case 3: // Data register wd->r_data = data; - switch( wd->currentop ) + switch(wd->currentop) { case COP_WRITE_SECTOR: case COP_WRITE_SECTORS: - if( !wd->currsector ) + if(!wd->currsector) { wd->r_status &= ~WSF_DRQ; wd->r_status |= WSF_RNF; - wd->clrdrq( wd->drqarg ); + wd->clrdrq(wd->drqarg); wd->currentop = COP_NUFFINK; refreshdisks = SDL_TRUE; break; } - if( wd->curroffs == 0 ) wd->currsector->data_ptr[wd->curroffs++]=0xfb; + if(wd->curroffs == 0) wd->currsector->data_ptr[wd->curroffs++]=0xfb; wd->currsector->data_ptr[wd->curroffs++] = wd->r_data; - wd->crc = calc_crc( wd->crc, wd->r_data ); + wd->crc = calc_crc(wd->crc, wd->r_data); if( !wd->disk[wd->c_drive]->modified ) refreshdisks = SDL_TRUE; - wd->disk[wd->c_drive]->modified = SDL_TRUE; - wd->disk[wd->c_drive]->modified_time = 0; + diskimage_set_modified(wd->disk[wd->c_drive], wd->c_side, wd->c_track); wd->r_status &= ~WSF_DRQ; - wd->clrdrq( wd->drqarg ); + wd->clrdrq(wd->drqarg); - if( wd->curroffs > wd->currseclen ) + if(wd->curroffs > wd->currseclen) { wd->currsector->data_ptr[wd->curroffs++] = wd->crc>>8; wd->currsector->data_ptr[wd->curroffs++] = wd->crc; - if( wd->currentop == COP_WRITE_SECTORS ) + if(wd->currentop == COP_WRITE_SECTORS) { #if GENERAL_DISK_DEBUG dbg_printf( "Next sector..." ); @@ -1246,16 +1347,16 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, // Get the next sector, and carry on! wd->r_sector++; wd->curroffs = 0; - wd->currsector = wd17xx_find_sector( wd, wd->r_sector ); + wd->currsector = wd17xx_find_sector(wd, wd->r_sector); wd->crc = 0xe295; - if( !wd->currsector ) + if(!wd->currsector) { wd->delayedint = 20; wd->distatus = wd->sectype; wd->currentop = COP_NUFFINK; wd->r_status &= (~WSF_DRQ); - wd->clrdrq( wd->drqarg ); + wd->clrdrq(wd->drqarg); refreshdisks = SDL_TRUE; break; } @@ -1267,7 +1368,7 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, wd->distatus = wd->sectype; wd->currentop = COP_NUFFINK; wd->r_status &= (~WSF_DRQ); - wd->clrdrq( wd->drqarg ); + wd->clrdrq(wd->drqarg); refreshdisks = SDL_TRUE; } else { wd->delayeddrq = 32; @@ -1286,7 +1387,7 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, #endif wd->crc = 0x968b; wd->r_data = 0xa1; - wd->crc = calc_crc( wd->crc, wd->r_data ); + wd->crc = calc_crc(wd->crc, wd->r_data); // wd->crc = 0xcdb4; break; @@ -1296,7 +1397,7 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, dbg_printf( "\tCOP_WRITE_TRACK: %02X -> SYNC -> 0xC2", wd->r_data); #endif wd->r_data = 0xc2; - wd->crc = calc_crc( wd->crc, wd->r_data ); + wd->crc = calc_crc(wd->crc, wd->r_data); break; case 0xf7: @@ -1313,54 +1414,54 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, // FM : 0xf8 -> 0xfe: Initialize CRC generator case 0xf8: dbg_printf( "\tCOP_WRITE_TRACK: %02X -> Data Address Mark (deleted)", wd->r_data); - wd->crc = calc_crc( wd->crc, wd->r_data ); + wd->crc = calc_crc(wd->crc, wd->r_data); // next bytes: data, ; break; case 0xf9: dbg_printf( "\tCOP_WRITE_TRACK: %02X -> Data Mark", wd->r_data); - wd->crc = calc_crc( wd->crc, wd->r_data ); + wd->crc = calc_crc(wd->crc, wd->r_data); break; case 0xfa: dbg_printf( "\tCOP_WRITE_TRACK: %02X -> Data Mark", wd->r_data); - wd->crc = calc_crc( wd->crc, wd->r_data ); + wd->crc = calc_crc(wd->crc, wd->r_data); break; case 0xfb: dbg_printf( "\tCOP_WRITE_TRACK: %02X -> Data Address Mark (normal)", wd->r_data); - wd->crc = calc_crc( wd->crc, wd->r_data ); + wd->crc = calc_crc(wd->crc, wd->r_data); // next bytes: data, ; break; case 0xfc: dbg_printf( "\tCOP_WRITE_TRACK: %02X -> Data Mark", wd->r_data); - wd->crc = calc_crc( wd->crc, wd->r_data ); + wd->crc = calc_crc(wd->crc, wd->r_data); break; case 0xfd: dbg_printf( "\tCOP_WRITE_TRACK: %02X -> Data Mark", wd->r_data); - wd->crc = calc_crc( wd->crc, wd->r_data ); + wd->crc = calc_crc(wd->crc, wd->r_data); break; case 0xfe: dbg_printf( "\tCOP_WRITE_TRACK: %02X -> Index Address Mark", wd->r_data); - wd->crc = calc_crc( wd->crc, wd->r_data ); + wd->crc = calc_crc(wd->crc, wd->r_data); // next 6 bytes: track, side, sector, size, ; break; case 0xff: dbg_printf( "\tCOP_WRITE_TRACK: %02X -> ???", wd->r_data); - wd->crc = calc_crc( wd->crc, wd->r_data ); + wd->crc = calc_crc(wd->crc, wd->r_data); break; #endif default: - wd->crc = calc_crc( wd->crc, wd->r_data ); + wd->crc = calc_crc(wd->crc, wd->r_data); } - // Write byte to disk image + // Write byte to disk image #if GENERAL_DISK_DEBUG dbg_printf("\tCOP_WRITE_TRACK: write byte: %02X '%c'", wd->r_data, wd->r_data); #endif @@ -1368,15 +1469,14 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, wd->curroffs++; wd->r_status &= ~WSF_DRQ; - wd->clrdrq( wd->drqarg ); + wd->clrdrq(wd->drqarg); - wd->disk[wd->c_drive]->modified = SDL_TRUE; - wd->disk[wd->c_drive]->modified_time = 0; + diskimage_set_modified(wd->disk[wd->c_drive], wd->c_side, wd->c_track); refreshdisks = SDL_TRUE; // Has the whole track been written? - if (wd->curroffs >= 6400) - { + if(wd->curroffs >= 6400) + { #if GENERAL_DISK_DEBUG dbg_printf("\tCOP_WRITE_TRACK: track full (%d)", wd->curroffs); #endif @@ -1384,9 +1484,9 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, wd->currentop = COP_NUFFINK; // wd->r_status &= (~WSF_DRQ); wd->r_status = 0; - wd->clrdrq( wd->drqarg ); - } - else + wd->clrdrq(wd->drqarg); + } + else wd->delayeddrq = 64; break; @@ -1396,28 +1496,28 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, } // Microdisc interface handlers -void microdisc_setdrq( void *md ) +void microdisc_setdrq(void* md) { struct microdisc *mdp = (struct microdisc *)md; mdp->drq = 0; } -void microdisc_clrdrq( void *md ) +void microdisc_clrdrq(void* md) { struct microdisc *mdp = (struct microdisc *)md; mdp->drq = MF_DRQ; } -void microdisc_setintrq( void *md ) +void microdisc_setintrq(void* md) { struct microdisc *mdp = (struct microdisc *)md; mdp->intrq = 0; //MDSF_INTRQ; - if( mdp->status & MDSF_INTENA ) + if(mdp->status & MDSF_INTENA) mdp->oric->cpu.irq |= IRQF_DISK; } -void microdisc_clrintrq( void *md ) +void microdisc_clrintrq(void* md) { struct microdisc *mdp = (struct microdisc *)md; @@ -1427,7 +1527,7 @@ void microdisc_clrintrq( void *md ) void microdisc_init( struct microdisc *md, struct wd17xx *wd, struct machine *oric ) { - wd17xx_init( wd ); + wd17xx_init(wd); wd->setintrq = microdisc_setintrq; wd->clrintrq = microdisc_clrintrq; wd->intrqarg = (void*)md; @@ -1446,17 +1546,17 @@ void microdisc_init( struct microdisc *md, struct wd17xx *wd, struct machine *or void microdisc_free( struct microdisc *md ) { int i; - for( i=0; ioric, i ); + for(i=0; ioric, i); } unsigned char microdisc_read( struct microdisc *md, unsigned short addr ) { // dbg_printf( "DISK: (%04X) Read from %04X", md->oric->cpu.pc-1, addr ); - if( ( addr >= 0x310 ) && ( addr < 0x314 ) ) - return wd17xx_read( md->wd, addr&3 ); + if((addr >= 0x310) && (addr < 0x314)) + return wd17xx_read(md->wd, addr&3); - switch( addr ) + switch(addr) { case 0x314: return md->intrq|0x7f; @@ -1468,25 +1568,25 @@ unsigned char microdisc_read( struct microdisc *md, unsigned short addr ) break; } - return via_read( &md->oric->via, addr ); + return via_read(&md->oric->via, addr); } void microdisc_write( struct microdisc *md, unsigned short addr, unsigned char data ) { // dbg_printf( "DISK: (%04X) Write %02X to %04X", md->oric->cpu.pc-1, data, addr ); - if( ( addr >= 0x310 ) && ( addr < 0x314 ) ) + if((addr >= 0x310) && (addr < 0x314)) { - wd17xx_write( md->oric, md->wd, addr&3, data ); + wd17xx_write(md->oric, md->wd, addr&3, data); return; } - switch( addr ) + switch(addr) { case 0x314: md->status = data; // Interrupts enabled, and /INTRQ == 0 ? - if( ( data&MDSF_INTENA ) && ( md->intrq == 0 ) ) + if((data&MDSF_INTENA) && (md->intrq == 0)) { md->oric->cpu.irq |= IRQF_DISK; } else { @@ -1504,7 +1604,7 @@ void microdisc_write( struct microdisc *md, unsigned short addr, unsigned char d break; default: - via_write( &md->oric->via, addr, data ); + via_write(&md->oric->via, addr, data); break; } } @@ -1549,25 +1649,25 @@ void microdisc_write( struct microdisc *md, unsigned short addr, unsigned char d // 0xE000 to 0xFFFF but before that is done, it takes // precedence over the above for that memory space. -void bd500_setdrq( void *bd ) +void bd500_setdrq(void* bd) { struct bd500 *bdp = (struct bd500 *)bd; bdp->drq = 0x80; } -void bd500_clrdrq( void *bd ) +void bd500_clrdrq(void* bd) { struct bd500 *bdp = (struct bd500 *)bd; bdp->drq = 0; } -void bd500_setintrq( void *bd ) +void bd500_setintrq(void* bd) { struct bd500 *bdp = (struct bd500 *)bd; bdp->intrq = 0x40; } -void bd500_clrintrq( void *bd ) +void bd500_clrintrq(void* bd) { struct bd500 *bdp = (struct bd500 *)bd; bdp->intrq = 0; @@ -1575,7 +1675,7 @@ void bd500_clrintrq( void *bd ) void bd500_init( struct bd500 *bd, struct wd17xx *wd, struct machine *oric ) { - wd17xx_init( wd ); + wd17xx_init(wd); wd->setintrq = bd500_setintrq; wd->clrintrq = bd500_clrintrq; wd->intrqarg = (void*)bd; @@ -1595,8 +1695,8 @@ void bd500_init( struct bd500 *bd, struct wd17xx *wd, struct machine *oric ) void bd500_free( struct bd500 *bd ) { int i; - for( i=0; ioric, i ); + for(i=0; ioric, i); } unsigned char bd500_read( struct bd500 *bd, unsigned short addr ) @@ -1605,14 +1705,14 @@ unsigned char bd500_read( struct bd500 *bd, unsigned short addr ) // dbg_printf( "DISK: (%04X) Read from %04X", bd->oric->cpu.pc-1, addr ); - if( ( addr >= 0x320 ) && ( addr < 0x324 ) ) - return wd17xx_read( bd->wd, addr&3 ); + if((addr >= 0x320) && (addr < 0x324)) + return wd17xx_read(bd->wd, addr&3); - switch( addr ) + switch(addr) { case 0x312: ret = bd->drq | bd->intrq; - if( bd->oric->dos70 ) ret |= bd->motor? 0:1; + if(bd->oric->dos70) ret |= bd->motor? 0:1; break; case 0x313: @@ -1671,13 +1771,13 @@ void bd500_write( struct bd500 *bd, unsigned short addr, unsigned char data ) { // dbg_printf( "DISK: (%04X) Write %02X to %04X", bd->oric->cpu.pc-1, data, addr ); - if( ( addr >= 0x320 ) && ( addr < 0x324 ) ) + if((addr >= 0x320) && (addr < 0x324)) { - wd17xx_write( bd->oric, bd->wd, addr&3, data ); + wd17xx_write(bd->oric, bd->wd, addr&3, data); return; } - switch( addr ) + switch(addr) { case 0x313: bd->oric->romdis = SDL_FALSE; @@ -1710,29 +1810,29 @@ void bd500_write( struct bd500 *bd, unsigned short addr, unsigned char data ) } // Jasmin interface handlers -void jasmin_setdrq( void *j ) +void jasmin_setdrq(void* j) { struct jasmin *jp = (struct jasmin *)j; jp->oric->cpu.irq |= IRQF_DISK; } -void jasmin_clrdrq( void *j ) +void jasmin_clrdrq(void* j) { struct jasmin *jp = (struct jasmin *)j; jp->oric->cpu.irq &= ~IRQF_DISK; } -void jasmin_setintrq( void *j ) +void jasmin_setintrq(void* j) { } -void jasmin_clrintrq( void *j ) +void jasmin_clrintrq(void* j) { } void jasmin_init( struct jasmin *j, struct wd17xx *wd, struct machine *oric ) { - wd17xx_init( wd ); + wd17xx_init(wd); wd->setintrq = jasmin_setintrq; wd->clrintrq = jasmin_clrintrq; wd->intrqarg = (void*)j; @@ -1749,17 +1849,17 @@ void jasmin_init( struct jasmin *j, struct wd17xx *wd, struct machine *oric ) void jasmin_free( struct jasmin *j ) { int i; - for( i=0; ioric, i ); + for(i=0; ioric, i); } unsigned char jasmin_read( struct jasmin *j, unsigned short addr ) { // dbg_printf( "DISK: (%04X) Read from %04X", md->oric->cpu.pc-1, addr ); - if( ( addr >= 0x3f4 ) && ( addr < 0x3f8 ) ) - return wd17xx_read( j->wd, addr&3 ); + if((addr >= 0x3f4) && (addr < 0x3f8)) + return wd17xx_read(j->wd, addr&3); - switch( addr ) + switch(addr) { case 0x3f8: // Side select return j->wd->c_side ? 1 : 0; @@ -1781,18 +1881,18 @@ unsigned char jasmin_read( struct jasmin *j, unsigned short addr ) break; } - return via_read( &j->oric->via, addr ); + return via_read(&j->oric->via, addr); } void jasmin_write( struct jasmin *j, unsigned short addr, unsigned char data ) { - if( ( addr >= 0x3f4 ) && ( addr < 0x3f8 ) ) + if((addr >= 0x3f4) && (addr < 0x3f8)) { - wd17xx_write( j->oric, j->wd, addr&3, data ); + wd17xx_write(j->oric, j->wd, addr&3, data); return; } - switch( addr ) + switch(addr) { case 0x3f8: // side select j->wd->c_side = data&1; @@ -1819,7 +1919,7 @@ void jasmin_write( struct jasmin *j, unsigned short addr, unsigned char data ) break; default: - via_write( &j->oric->via, addr, data ); + via_write(&j->oric->via, addr, data); break; } } @@ -1834,12 +1934,12 @@ void pravetz_init( struct pravetz *p, struct machine *oric ) p->extension = 0; p->oric = oric; - for( i=0; idrv[i].write_ready = 0x80; - p->drv[i].volume = 254; - p->drv[i].select = 0; - p->drv[i].motor_on = 0; + p->drv[i].write_ready = 0x80; + p->drv[i].volume = 254; + p->drv[i].select = 0; + p->drv[i].motor_on = 0; p->drv[i].pimg = NULL; } } @@ -1847,8 +1947,8 @@ void pravetz_init( struct pravetz *p, struct machine *oric ) void pravetz_free( struct pravetz *p ) { int i; - for( i=0; ioric, i ); + for(i=0; ioric, i); } unsigned char pravetz_read( struct pravetz *p, unsigned short addr ) diff --git a/disk.h b/disk.h index f0dd3650..c08389b0 100644 --- a/disk.h +++ b/disk.h @@ -113,8 +113,12 @@ struct mfmsector struct diskimage { Sint16 drivenum; // The drive this disk is inserted into, or -1 - Uint32 numtracks; // Number of tracks per side Uint32 numsides; // Number of sides in the image + Uint32 numtracks; // Number of tracks per side + Uint32 numsides_in; // Number of sides in the image on input + Uint32 numtracks_in; // Number of tracks per side on input + Uint32 numsides_out; // Number of sides in the image on output + Uint32 numtracks_out; // Number of tracks per side on output Uint32 geometry; // Geometry. I don't know what this is. Sint16 cachedtrack; // Currently cached track (or -1 for none) Sint16 cachedside; // Currently cached side (or -1 for none) From 00afca845ee1b682ce14d8ab59245356a00e66ac Mon Sep 17 00:00:00 2001 From: iss Date: Mon, 22 Dec 2025 14:15:42 +0200 Subject: [PATCH 137/143] fix: DSK handling --- 6551_modem.c | 4 ++-- disk.c | 3 ++- plugins/ch376/ch376.c | 30 ++++++++++++++++-------------- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/6551_modem.c b/6551_modem.c index 0a012f31..23e8e103 100644 --- a/6551_modem.c +++ b/6551_modem.c @@ -611,7 +611,7 @@ static int socket_bind(int sock, int port, int domain) sprintf(service, "%d", port); if ( (n = getaddrinfo(NULL, service, &hints, &res)) != 0) { - printf("socket_bind, getaddrinfo error: %s", gai_strerror(n)); + fprintf(stderr, "socket_bind, getaddrinfo error: %s\n", gai_strerror(n)); return 0; } ressave = res; @@ -742,7 +742,7 @@ static int socket_connect(int sock, const char* host, int port, int domain) sprintf(service, "%d", port); if ( (n = getaddrinfo(host, service, &hints, &res)) != 0) { - printf("socket_connect, getaddrinfo error: %s", gai_strerror(n)); + fprintf(stderr, "socket_connect, getaddrinfo error: %s\n", gai_strerror(n)); return 0; } ressave = res; diff --git a/disk.c b/disk.c index 49660869..c3ec95d4 100644 --- a/disk.c +++ b/disk.c @@ -556,7 +556,8 @@ SDL_bool diskimage_load( struct machine *oric, char *fname, int drive ) uint8_t* dst = oric->wddisk.disk[drive]->rawimage + 256+128*6400; memmove(dst,src,size); // Clear the reallocated space - memset(src+size,0x00,128*6400-size); + // NOTE: Cleared space is unformatted + memset(src,0x00,dst-src); } } } diff --git a/plugins/ch376/ch376.c b/plugins/ch376/ch376.c index d718c58a..2c1ad43b 100644 --- a/plugins/ch376/ch376.c +++ b/plugins/ch376/ch376.c @@ -1474,7 +1474,7 @@ static CH376_S32 system_get_file_offset(CH376_CONTEXT *context, CH376_FILE file) { file_offset = ftell(file); - if(file_offset == -1) + if(file_offset == -1) { dbg_printf("system_get_file_offset: error\n"); } @@ -1495,19 +1495,21 @@ static CH376_S32 system_get_file_offset(CH376_CONTEXT *context, CH376_FILE file) static char *clone_string(const char *string) { - int l; - char *s; + // int l; + // char *s; + // + // for(l=0; string[l]!='\0'; l++); + // + // s = system_alloc_mem(l); + // + // for(l=0; string[l]!='\0'; l++) + // s[l] = string[l]; + // + // s[l] = '\0'; - for(l=0; string[l]!='\0'; l++); + // return s; - s = system_alloc_mem(l); - - for(l=0; string[l]!='\0'; l++) - s[l] = string[l]; - - s[l] = '\0'; - - return s; + return strdup(string); } static void clear_structure(struct ch376 *ch376) @@ -2478,7 +2480,7 @@ void ch376_write_data_port(struct ch376 *ch376, CH376_U8 data) ch376->interface_status = 127; ch376->command_status = CH376_INT_SUCCESS; } - else if(data == CH376_VAR_CURRENT_OFFSET) + else if(data == CH376_VAR_CURRENT_OFFSET) { CH376_S32 file_offset = system_get_file_offset(&ch376->context, ch376->current_file); @@ -2734,4 +2736,4 @@ const char * ch376_get_usb_drive_path(struct ch376 *ch376) { return ch376->usb_drive_path; } -/* /// */ \ No newline at end of file +/* /// */ From 553913cf39d082f5259ae57f8b3d41b93df8e92f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Pointier?= Date: Wed, 31 Dec 2025 11:23:32 +0100 Subject: [PATCH 138/143] Batch of small changes to the way Oricutron handles controllers: (#209) - Replaced the 3200 value by a AXIS_THRESHOLD define set to 8000 to limit the problems of accuracy when using analog sticks (it was difficult to go in a perfect direction without wobbling on the side) - Added an enum for the various entries of the joystate array (JOYSTATE_UP is more readable than 0) - Added a value to the state array to store the type of joystick - Modified the IJK and ALTAI codepath to merge the FIRE2 and FIRE3 events with FIRE1 so all action buttons can be used on a joystick with more than one fire button - Added support for the second analog stick of most modern controllers - Added support for dpad of Xbox and PlayStation controllers --- joystick.c | 286 +++++++++++++++++++++++++++++++++++++---------------- joystick.h | 23 +++++ 2 files changed, 223 insertions(+), 86 deletions(-) diff --git a/joystick.c b/joystick.c index c038141e..7cd404d9 100644 --- a/joystick.c +++ b/joystick.c @@ -90,7 +90,7 @@ static struct keyjoydef keyjoytab[] = { { "BACKSPACE", SDLK_BACKSPACE }, { NULL, 0 } }; static SDL_bool joysubinited = SDL_FALSE; -Uint8 joystate_a[7], joystate_b[7]; +Uint8 joystate_a[JOYSTATE_LAST], joystate_b[JOYSTATE_LAST]; static SDL_bool is_real_joystick( Sint16 joymode ) { @@ -120,6 +120,33 @@ static void close_joysticks( struct machine *oric ) } } + +// Returns the type of controller. +// Most of the code should be controller agnostic, but in certain cases it can be useful to know more precisely which controller is used. +// Typical example would be the handling of additional or non standard buttons and axis. +Uint8 get_joystick_type(SDL_Joystick* joystick) +{ + if (joystick) + { + const char* joy_name = SDL_JoystickName(joystick); + if (joy_name) + { + // + // Examples of strings returned by SDL_JoystickName: + // - "DualSense Wireless Controller" + // - "SPEED-LINK Competition Pro" (USB variant of the old four direction joystick, that one has many more buttons) + // + if (strcmp(joy_name, "DualSense Wireless Controller") == 0) + { + return JOYTYPE_DUALSENSE; + } + return JOYTYPE_DEFAULT; + } + } + return JOYTYPE_NONE; +} + + // Return an SDL keysym corresponding to the specified name (or 0) SDL_COMPAT_KEY joy_keyname_to_sym( char *name ) { @@ -163,7 +190,7 @@ static SDL_bool dojoyevent( SDL_Event *ev, struct machine *oric, Sint16 mode, Ui SDL_COMPAT_KEY *kbtab = mode == JOYMODE_KB1? oric->kbjoy1 : oric->kbjoy2; int st = ev->type == SDL_KEYDOWN? 1 : 0; int i; - for( i=0; i<7; i++ ) + for( i=0; i< JOYSTATE_LAST; i++ ) { if( ev->key.keysym.sym == kbtab[i] ) { @@ -187,54 +214,129 @@ static SDL_bool dojoyevent( SDL_Event *ev, struct machine *oric, Sint16 mode, Ui case JOYMODE_SDL9: if( !sjoy ) return SDL_FALSE; + // + // The way the controllers report the 4 direction digital values can change: + // - Some will report them as a set if two SDL_JOYAXISMOTION (one for horizontal movement and one for vertical movement) + // - Some will instead report them as SDL_JOYHATMOTION using a bit field to indicate which directions are set + // - And some (like the Sony DualSense) report them as SDL_JOYBUTTONDOWN/SDL_JOYBUTTONUP events + // + // The current SDL implementation is using the Joystick API, which unfortunately does not know much about the various controllers. + // Ideally this code should be revamped to use the SDL GameController API (see the article at https://blog.rubenwardy.com/2023/01/24/using_sdl_gamecontroller/ for an example), + // but that require a significant amount of changes are would have to be tested extensively to make sure it works properly in every situation. + // switch( ev->type ) { - case SDL_JOYAXISMOTION: - if( ev->jaxis.which != (mode-JOYMODE_SDL0) ) return SDL_FALSE; - swallowit = SDL_TRUE; - switch( ev->jaxis.axis ) + case SDL_JOYHATMOTION: + if(ev->jhat.which != (mode-JOYMODE_SDL0) ) return SDL_FALSE; + swallowit = SDL_TRUE; + + joystate[JOYSTATE_UP] = (ev->jhat.value & SDL_HAT_UP) ? 1 : 0; + joystate[JOYSTATE_DOWN] = (ev->jhat.value & SDL_HAT_DOWN) ? 1 : 0; + joystate[JOYSTATE_LEFT] = (ev->jhat.value & SDL_HAT_LEFT) ? 1 : 0; + joystate[JOYSTATE_RIGHT] = (ev->jhat.value & SDL_HAT_RIGHT) ? 1 : 0; + break; + + case SDL_JOYAXISMOTION: + if( ev->jaxis.which != (mode-JOYMODE_SDL0) ) return SDL_FALSE; + swallowit = SDL_TRUE; + + switch (ev->jaxis.axis) + { + case 0: // left/right + case 2: // secondary analog stick on modern controllers + if( ev->jaxis.value < -AXIS_THRESHOLD ) + { + joystate[JOYSTATE_LEFT] = 1; // left + joystate[JOYSTATE_RIGHT] = 0; + } + else if( ev->jaxis.value > AXIS_THRESHOLD ) + { + joystate[JOYSTATE_LEFT] = 0; // right + joystate[JOYSTATE_RIGHT] = 1; + } + else { - case 0: // left/right - if( ev->jaxis.value < -3200 ) - { - joystate[2] = 1; // left - joystate[3] = 0; - } else if( ev->jaxis.value > 3200 ) { - joystate[2] = 0; // right - joystate[3] = 1; - } else { - joystate[2] = 0; - joystate[3] = 0; - } - break; - - case 1: // up/down - if( ev->jaxis.value < -3200 ) - { - joystate[0] = 1; // up - joystate[1] = 0; - } else if( ev->jaxis.value > 3200 ) { - joystate[0] = 0; // down - joystate[1] = 1; - } else { - joystate[0] = 0; - joystate[1] = 0; - } - break; + joystate[JOYSTATE_LEFT] = 0; + joystate[JOYSTATE_RIGHT] = 0; } break; - case SDL_JOYBUTTONDOWN: - if( ev->jbutton.which != (mode-JOYMODE_SDL0) ) return SDL_FALSE; - joystate[4+(ev->jbutton.button % 3)] = 1; - swallowit = SDL_TRUE; + case 1: // up/down + case 3: // secondary analog stick on modern controllers + if( ev->jaxis.value < -AXIS_THRESHOLD ) + { + joystate[JOYSTATE_UP] = 1; // up + joystate[JOYSTATE_DOWN] = 0; + } + else if(ev->jaxis.value > AXIS_THRESHOLD ) + { + joystate[JOYSTATE_UP] = 0; // down + joystate[JOYSTATE_DOWN] = 1; + } + else + { + joystate[JOYSTATE_UP] = 0; + joystate[JOYSTATE_DOWN] = 0; + } break; - case SDL_JOYBUTTONUP: - if( ev->jbutton.which != (mode-JOYMODE_SDL0) ) return SDL_FALSE; - joystate[4+(ev->jbutton.button % 3)] = 0; - swallowit = SDL_TRUE; + case 4: // analog trigger on modern controllers + case 5: // analog trigger on modern controllers + // Trigger a fire action if the analog value passes over the threshold + joystate[JOYSTATE_FIRE1] = (ev->jaxis.value > AXIS_THRESHOLD) ? 1 : 0; + break; + + default: break; + } + break; + + case SDL_JOYBUTTONDOWN: + { + if( ev->jbutton.which != (mode-JOYMODE_SDL0) ) return SDL_FALSE; + if( ( joystate[JOYSTATE_TYPE] == JOYTYPE_DUALSENSE ) && + ( (ev->jbutton.button>=11) && (ev->jbutton.button<=14) ) ) + { + // Specific code path for the Sony PS5 DualSense d-pad + switch( ev->jbutton.button ) + { + case 11: joystate[JOYSTATE_UP] = 1; break; // Up + case 12: joystate[JOYSTATE_DOWN] = 1; break; // Down + case 13: joystate[JOYSTATE_LEFT] = 1; break; // Left + case 14: joystate[JOYSTATE_RIGHT] = 1; break; // Right + } + } + else + { + // Standard code path to handle button press on most controllers + joystate[JOYSTATE_FIRE1 + (ev->jbutton.button % 3)] = 1; + } + swallowit = SDL_TRUE; + } + + break; + + case SDL_JOYBUTTONUP: + if( ev->jbutton.which != (mode-JOYMODE_SDL0) ) return SDL_FALSE; + if( ( joystate[JOYSTATE_TYPE] == JOYTYPE_DUALSENSE ) && + ( (ev->jbutton.button >= 11) && (ev->jbutton.button <= 14) ) ) + { + // Specific code path for the Sony PS5 DualSense d-pad + switch( ev->jbutton.button ) + { + case 11: joystate[JOYSTATE_UP] = 0; break; // Up + case 12: joystate[JOYSTATE_DOWN] = 0; break; // Down + case 13: joystate[JOYSTATE_LEFT] = 0; break; // Left + case 14: joystate[JOYSTATE_RIGHT] = 0; break; // Right + } + } + else + { + // Standard code path to handle button release on most controllers + joystate[JOYSTATE_FIRE1 + (ev->jbutton.button % 3)] = 0; + } + swallowit = SDL_TRUE; + break; } break; } @@ -261,14 +363,14 @@ void joy_buildmask( struct machine *oric ) if ( twilighteboard_joysel & 0x80 ) { // Right Port - if( joystate_a[0] ) mkmask &= 0xef; - if( joystate_a[1] ) mkmask &= 0xf7; - if( joystate_a[2] ) mkmask &= 0xfd; - if( joystate_a[3] ) mkmask &= 0xfe; - if( joystate_a[4] ) mkmask &= 0xfb; + if( joystate_a[JOYSTATE_UP] ) mkmask &= 0xef; + if( joystate_a[JOYSTATE_DOWN] ) mkmask &= 0xf7; + if( joystate_a[JOYSTATE_LEFT] ) mkmask &= 0xfd; + if( joystate_a[JOYSTATE_RIGHT] ) mkmask &= 0xfe; + if( joystate_a[JOYSTATE_FIRE1] ) mkmask &= 0xfb; - if( joystate_a[5] ) mkmask_f &= 0x7f; // PA7 - fire 2 - if( joystate_a[6] ) mkmask_f &= 0xdf; // PA5 - fire 3 + if( joystate_a[JOYSTATE_FIRE2] ) mkmask_f &= 0x7f; // PA7 - fire 2 + if( joystate_a[JOYSTATE_FIRE3] ) mkmask_f &= 0xdf; // PA5 - fire 3 gimme_port_a = SDL_TRUE; gimme_port_b = SDL_TRUE; @@ -277,11 +379,11 @@ void joy_buildmask( struct machine *oric ) if ( twilighteboard_joysel & 0x40 ) { // Left Port - if( joystate_b[0] ) mkmask &= 0xef; // 0x10 - up - if( joystate_b[1] ) mkmask &= 0xf7; // 0x08 - down - if( joystate_b[2] ) mkmask &= 0xfd; // 0x02 - left - if( joystate_b[3] ) mkmask &= 0xfe; // 0x01 - right - if( joystate_b[4] ) mkmask &= 0xfb; // 0x04 - fire + if( joystate_b[JOYSTATE_UP] ) mkmask &= 0xef; // 0x10 - up + if( joystate_b[JOYSTATE_DOWN] ) mkmask &= 0xf7; // 0x08 - down + if( joystate_b[JOYSTATE_LEFT] ) mkmask &= 0xfd; // 0x02 - left + if( joystate_b[JOYSTATE_RIGHT] ) mkmask &= 0xfe; // 0x01 - right + if( joystate_b[JOYSTATE_FIRE1] ) mkmask &= 0xfb; // 0x04 - fire gimme_port_b = SDL_TRUE; } @@ -301,14 +403,14 @@ void joy_buildmask( struct machine *oric ) if ( telestrat_joysel & 0x80 ) { // Right Port - if( joystate_a[0] ) mkmask &= 0xef; - if( joystate_a[1] ) mkmask &= 0xf7; - if( joystate_a[2] ) mkmask &= 0xfd; - if( joystate_a[3] ) mkmask &= 0xfe; - if( joystate_a[4] ) mkmask &= 0xfb; + if( joystate_a[JOYSTATE_UP] ) mkmask &= 0xef; + if( joystate_a[JOYSTATE_DOWN] ) mkmask &= 0xf7; + if( joystate_a[JOYSTATE_LEFT] ) mkmask &= 0xfd; + if( joystate_a[JOYSTATE_RIGHT] ) mkmask &= 0xfe; + if( joystate_a[JOYSTATE_FIRE1] ) mkmask &= 0xfb; - if( joystate_a[5] ) mkmask_f &= 0x7f; // PA7 - fire 2 - if( joystate_a[6] ) mkmask_f &= 0xdf; // PA5 - fire 3 + if( joystate_a[JOYSTATE_FIRE2] ) mkmask_f &= 0x7f; // PA7 - fire 2 + if( joystate_a[JOYSTATE_FIRE3] ) mkmask_f &= 0xdf; // PA5 - fire 3 gimme_port_a = SDL_TRUE; gimme_port_b = SDL_TRUE; @@ -317,11 +419,11 @@ void joy_buildmask( struct machine *oric ) if ( telestrat_joysel & 0x40 ) { // Left Port - if( joystate_b[0] ) mkmask &= 0xef; // 0x10 - up - if( joystate_b[1] ) mkmask &= 0xf7; // 0x08 - down - if( joystate_b[2] ) mkmask &= 0xfd; // 0x02 - left - if( joystate_b[3] ) mkmask &= 0xfe; // 0x01 - right - if( joystate_b[4] ) mkmask &= 0xfb; // 0x04 - fire + if( joystate_b[JOYSTATE_UP] ) mkmask &= 0xef; // 0x10 - up + if( joystate_b[JOYSTATE_DOWN] ) mkmask &= 0xf7; // 0x08 - down + if( joystate_b[JOYSTATE_LEFT] ) mkmask &= 0xfd; // 0x02 - left + if( joystate_b[JOYSTATE_RIGHT ]) mkmask &= 0xfe; // 0x01 - right + if( joystate_b[JOYSTATE_FIRE1 ]) mkmask &= 0xfb; // 0x04 - fire gimme_port_b = SDL_TRUE; } @@ -342,21 +444,25 @@ void joy_buildmask( struct machine *oric ) case JOYIFACE_ALTAI: if( joysel & 0x80 ) { - if( joystate_a[0] ) mkmask &= 0xef; - if( joystate_a[1] ) mkmask &= 0xf7; - if( joystate_a[2] ) mkmask &= 0xfe; - if( joystate_a[3] ) mkmask &= 0xfd; - if( joystate_a[4] ) mkmask &= 0xdf; + if( joystate_a[JOYSTATE_UP] ) mkmask &= 0xef; + if( joystate_a[JOYSTATE_DOWN] ) mkmask &= 0xf7; + if( joystate_a[JOYSTATE_LEFT] ) mkmask &= 0xfe; + if( joystate_a[JOYSTATE_RIGHT] ) mkmask &= 0xfd; + if( joystate_a[JOYSTATE_FIRE1] || + joystate_a[JOYSTATE_FIRE2] || + joystate_a[JOYSTATE_FIRE3] ) mkmask &= 0xdf; gimme_port_a = SDL_TRUE; } if( joysel & 0x40 ) { - if( joystate_b[0] ) mkmask &= 0xef; // 0x10 - up - if( joystate_b[1] ) mkmask &= 0xf7; // 0x08 - down - if( joystate_b[2] ) mkmask &= 0xfe; // 0x01 - left - if( joystate_b[3] ) mkmask &= 0xfd; // 0x02 - right - if( joystate_b[4] ) mkmask &= 0xdf; // 0x20 - fire + if( joystate_b[JOYSTATE_UP] ) mkmask &= 0xef; // 0x10 - up + if( joystate_b[JOYSTATE_DOWN] ) mkmask &= 0xf7; // 0x08 - down + if( joystate_b[JOYSTATE_LEFT] ) mkmask &= 0xfe; // 0x01 - left + if( joystate_b[JOYSTATE_RIGHT] ) mkmask &= 0xfd; // 0x02 - right + if( joystate_b[JOYSTATE_FIRE1] || + joystate_b[JOYSTATE_FIRE2] || + joystate_b[JOYSTATE_FIRE3] ) mkmask &= 0xdf; // 0x20 - fire gimme_port_a = SDL_TRUE; } break; @@ -374,20 +480,24 @@ void joy_buildmask( struct machine *oric ) if( joysel & 0x40 ) { - if( joystate_a[0] ) mkmask &= 0xef; - if( joystate_a[1] ) mkmask &= 0xf7; - if( joystate_a[2] ) mkmask &= 0xfd; - if( joystate_a[3] ) mkmask &= 0xfe; - if( joystate_a[4] ) mkmask &= 0xfb; + if( joystate_a[JOYSTATE_UP] ) mkmask &= 0xef; + if( joystate_a[JOYSTATE_DOWN]) mkmask &= 0xf7; + if( joystate_a[JOYSTATE_LEFT]) mkmask &= 0xfd; + if( joystate_a[JOYSTATE_RIGHT]) mkmask &= 0xfe; + if( joystate_a[JOYSTATE_FIRE1] || + joystate_a[JOYSTATE_FIRE2] || + joystate_a[JOYSTATE_FIRE3] ) mkmask &= 0xfb; } if( joysel & 0x80 ) { - if( joystate_b[0] ) mkmask &= 0xef; // 0x10 - up - if( joystate_b[1] ) mkmask &= 0xf7; // 0x08 - down - if( joystate_b[2] ) mkmask &= 0xfd; // 0x02 - left - if( joystate_b[3] ) mkmask &= 0xfe; // 0x01 - right - if( joystate_b[4] ) mkmask &= 0xfb; // 0x04 - fire + if( joystate_b[JOYSTATE_UP] ) mkmask &= 0xef; // 0x10 - up + if( joystate_b[JOYSTATE_DOWN] ) mkmask &= 0xf7; // 0x08 - down + if( joystate_b[JOYSTATE_LEFT] ) mkmask &= 0xfd; // 0x02 - left + if( joystate_b[JOYSTATE_RIGHT] ) mkmask &= 0xfe; // 0x01 - right + if( joystate_b[JOYSTATE_FIRE1] || + joystate_b[JOYSTATE_FIRE2] || + joystate_b[JOYSTATE_FIRE3] ) mkmask &= 0xfb; // 0x04 - fire } break; } @@ -438,11 +548,13 @@ static void dojoysetup( struct machine *oric, Sint16 mode_a, Sint16 mode_b ) close_joysticks( oric ); - for( i=0; i<6; i++ ) + for( i=0; i< JOYSTATE_LAST; i++ ) { joystate_a[i] = 0; joystate_b[i] = 0; } + joystate_a[JOYSTATE_TYPE] = JOYTYPE_NONE; + joystate_b[JOYSTATE_TYPE] = JOYTYPE_NONE; if( (!is_real_joystick( mode_a )) && (!is_real_joystick( mode_b )) ) return; @@ -460,6 +572,7 @@ static void dojoysetup( struct machine *oric, Sint16 mode_a, Sint16 mode_b ) if( is_real_joystick( mode_a ) ) { oric->sdljoy_a = SDL_JoystickOpen( mode_a - JOYMODE_SDL0 ); + joystate_a[JOYSTATE_TYPE] = get_joystick_type(oric->sdljoy_a); //dbg_printf( "Joy0 = %p", oric->sdljoy_a ); SDL_JoystickEventState( SDL_TRUE ); } @@ -471,6 +584,7 @@ static void dojoysetup( struct machine *oric, Sint16 mode_a, Sint16 mode_b ) oric->sdljoy_b = oric->sdljoy_a; } else { oric->sdljoy_b = SDL_JoystickOpen( mode_b - JOYMODE_SDL0 ); + joystate_b[JOYSTATE_TYPE] = get_joystick_type(oric->sdljoy_b); SDL_JoystickEventState( SDL_TRUE ); } } diff --git a/joystick.h b/joystick.h index d78a5ffa..e1ee271e 100644 --- a/joystick.h +++ b/joystick.h @@ -19,6 +19,8 @@ ** Joystick definitions */ +#define AXIS_THRESHOLD 8000 // How far the user needs to push an analog axis before it triggers a digital impulse. (was previously defined as 3200, but was too sensitive and made it almost impossible to accurately go in one direction) + // Joystick interface types enum { @@ -46,6 +48,27 @@ enum JOYMODE_MOUSE }; +enum +{ + JOYSTATE_UP = 0, + JOYSTATE_DOWN, + JOYSTATE_LEFT, + JOYSTATE_RIGHT, + JOYSTATE_FIRE1, + JOYSTATE_FIRE2, + JOYSTATE_FIRE3, + JOYSTATE_TYPE, + JOYSTATE_LAST +}; + +// Hacked joystick detection mode +enum +{ + JOYTYPE_NONE = 0, + JOYTYPE_DEFAULT, + JOYTYPE_DUALSENSE, +}; + SDL_bool init_joy( struct machine *oric ); void shut_joy( struct machine *oric ); From e611959574ea42f806c5f3e06c2c544e4e1f18a1 Mon Sep 17 00:00:00 2001 From: iss Date: Wed, 31 Dec 2025 14:45:06 +0200 Subject: [PATCH 139/143] fix: joystick SDL 1.x compatibility, minor clean-ups --- 6551_modem.c | 6 +++--- joystick.c | 56 ++++++++++++++++++++++++++-------------------------- system_sdl.c | 12 +++++++++++ system_sdl.h | 1 + 4 files changed, 44 insertions(+), 31 deletions(-) diff --git a/6551_modem.c b/6551_modem.c index 23e8e103..519c951d 100644 --- a/6551_modem.c +++ b/6551_modem.c @@ -55,9 +55,9 @@ static Uint32 mdm_time_buf[CMD_BUF_SIZE]; // FIXME: BUG: drops byte(s)... kind of buffer overflow ??? #define DATA_BUF_SIZE 0x10000 -static int mdm_in = 0; +static unsigned int mdm_in = 0; static Uint8 mdm_in_buf[DATA_BUF_SIZE]; -static int mdm_out = 0; +static unsigned int mdm_out = 0; static Uint8 mdm_out_buf[DATA_BUF_SIZE]; static SDL_bool connected = SDL_FALSE; @@ -101,7 +101,7 @@ static void send_str(const char* s) if(mdm_out == DATA_BUF_SIZE) { memmove(mdm_out_buf, mdm_out_buf+1, DATA_BUF_SIZE-1); - mdm_in--; + mdm_out--; } } } diff --git a/joystick.c b/joystick.c index 7cd404d9..6f779dc4 100644 --- a/joystick.c +++ b/joystick.c @@ -87,6 +87,7 @@ static struct keyjoydef keyjoytab[] = { { "BACKSPACE", SDLK_BACKSPACE }, { "END", SDLK_END }, { "PAGEUP", SDLK_PAGEUP }, { "PAGEDOWN", SDLK_PAGEDOWN }, + { "NONE", 0 }, { NULL, 0 } }; static SDL_bool joysubinited = SDL_FALSE; @@ -128,10 +129,10 @@ Uint8 get_joystick_type(SDL_Joystick* joystick) { if (joystick) { - const char* joy_name = SDL_JoystickName(joystick); + // @iss: SDL_JoystickName unsupported under SDL 1.x - returns NULL + const char* joy_name = SDL_COMPAT_JoystickName(joystick); if (joy_name) { - // // Examples of strings returned by SDL_JoystickName: // - "DualSense Wireless Controller" // - "SPEED-LINK Competition Pro" (USB variant of the old four direction joystick, that one has many more buttons) @@ -166,7 +167,7 @@ SDL_COMPAT_KEY joy_keyname_to_sym( char *name ) { if( strcasecmp( keyjoytab[i].id, name ) == 0 ) { - // dbg_printf("%s => %.8X\n", name, keyjoytab[i].sym); + // dbg_printf("%s => %s = %.8X\n", name, keyjoytab[i].id, keyjoytab[i].sym); return keyjoytab[i].sym; } } @@ -174,7 +175,7 @@ SDL_COMPAT_KEY joy_keyname_to_sym( char *name ) return 0; } -static SDL_bool dojoyevent( SDL_Event *ev, struct machine *oric, Sint16 mode, Uint8 *joystate, SDL_Joystick *sjoy ) +static SDL_bool dojoyevent( SDL_Event *ev, struct machine *oric, Sint32 mode, Uint8 *joystate, SDL_Joystick *sjoy ) { SDL_bool swallowit = SDL_FALSE; @@ -188,8 +189,7 @@ static SDL_bool dojoyevent( SDL_Event *ev, struct machine *oric, Sint16 mode, Ui case JOYMODE_KB2: { SDL_COMPAT_KEY *kbtab = mode == JOYMODE_KB1? oric->kbjoy1 : oric->kbjoy2; - int st = ev->type == SDL_KEYDOWN? 1 : 0; - int i; + int i, st = ev->type == SDL_KEYDOWN? 1 : 0; for( i=0; i< JOYSTATE_LAST; i++ ) { if( ev->key.keysym.sym == kbtab[i] ) @@ -236,16 +236,16 @@ static SDL_bool dojoyevent( SDL_Event *ev, struct machine *oric, Sint16 mode, Ui joystate[JOYSTATE_RIGHT] = (ev->jhat.value & SDL_HAT_RIGHT) ? 1 : 0; break; - case SDL_JOYAXISMOTION: - if( ev->jaxis.which != (mode-JOYMODE_SDL0) ) return SDL_FALSE; - swallowit = SDL_TRUE; + case SDL_JOYAXISMOTION: + if( ev->jaxis.which != (mode-JOYMODE_SDL0) ) return SDL_FALSE; + swallowit = SDL_TRUE; switch (ev->jaxis.axis) - { - case 0: // left/right + { + case 0: // left/right case 2: // secondary analog stick on modern controllers if( ev->jaxis.value < -AXIS_THRESHOLD ) - { + { joystate[JOYSTATE_LEFT] = 1; // left joystate[JOYSTATE_RIGHT] = 0; } @@ -258,13 +258,13 @@ static SDL_bool dojoyevent( SDL_Event *ev, struct machine *oric, Sint16 mode, Ui { joystate[JOYSTATE_LEFT] = 0; joystate[JOYSTATE_RIGHT] = 0; - } - break; + } + break; - case 1: // up/down + case 1: // up/down case 3: // secondary analog stick on modern controllers if( ev->jaxis.value < -AXIS_THRESHOLD ) - { + { joystate[JOYSTATE_UP] = 1; // up joystate[JOYSTATE_DOWN] = 0; } @@ -277,8 +277,8 @@ static SDL_bool dojoyevent( SDL_Event *ev, struct machine *oric, Sint16 mode, Ui { joystate[JOYSTATE_UP] = 0; joystate[JOYSTATE_DOWN] = 0; - } - break; + } + break; case 4: // analog trigger on modern controllers case 5: // analog trigger on modern controllers @@ -288,12 +288,12 @@ static SDL_bool dojoyevent( SDL_Event *ev, struct machine *oric, Sint16 mode, Ui default: break; - } - break; + } + break; - case SDL_JOYBUTTONDOWN: + case SDL_JOYBUTTONDOWN: { - if( ev->jbutton.which != (mode-JOYMODE_SDL0) ) return SDL_FALSE; + if( ev->jbutton.which != (mode-JOYMODE_SDL0) ) return SDL_FALSE; if( ( joystate[JOYSTATE_TYPE] == JOYTYPE_DUALSENSE ) && ( (ev->jbutton.button>=11) && (ev->jbutton.button<=14) ) ) { @@ -311,13 +311,13 @@ static SDL_bool dojoyevent( SDL_Event *ev, struct machine *oric, Sint16 mode, Ui // Standard code path to handle button press on most controllers joystate[JOYSTATE_FIRE1 + (ev->jbutton.button % 3)] = 1; } - swallowit = SDL_TRUE; + swallowit = SDL_TRUE; } - break; + break; - case SDL_JOYBUTTONUP: - if( ev->jbutton.which != (mode-JOYMODE_SDL0) ) return SDL_FALSE; + case SDL_JOYBUTTONUP: + if( ev->jbutton.which != (mode-JOYMODE_SDL0) ) return SDL_FALSE; if( ( joystate[JOYSTATE_TYPE] == JOYTYPE_DUALSENSE ) && ( (ev->jbutton.button >= 11) && (ev->jbutton.button <= 14) ) ) { @@ -335,8 +335,8 @@ static SDL_bool dojoyevent( SDL_Event *ev, struct machine *oric, Sint16 mode, Ui // Standard code path to handle button release on most controllers joystate[JOYSTATE_FIRE1 + (ev->jbutton.button % 3)] = 0; } - swallowit = SDL_TRUE; - break; + swallowit = SDL_TRUE; + break; } break; } diff --git a/system_sdl.c b/system_sdl.c index 284e3850..bdf8c19a 100644 --- a/system_sdl.c +++ b/system_sdl.c @@ -628,6 +628,18 @@ void SDL_COMPAT_TakeScreenshot(char *fname) #endif #endif +#if SDL_MAJOR_VERSION == 1 +const char* SDL_COMPAT_JoystickName(SDL_Joystick *joystick) +{ + return NULL; +} +#else +const char* SDL_COMPAT_JoystickName(SDL_Joystick *joystick) +{ + return SDL_JoystickName(joystick); +} +#endif + // This is an ugly hack for OSX will be removed #ifdef __APPLE__ int32_t __isPlatformVersionAtLeast(int32_t Major, int32_t Minor, int32_t Subminor) diff --git a/system_sdl.h b/system_sdl.h index 1bfb37b2..985aa87c 100644 --- a/system_sdl.h +++ b/system_sdl.h @@ -148,6 +148,7 @@ int SDL_COMPAT_SetPalette(SDL_Surface *surface, int flags, SDL_Color *colors, in void SDL_COMPAT_SetEventFilter(SDL_EventFilter filter); void SDL_COMPAT_Quit(SDL_bool freeall); void SDL_COMPAT_TakeScreenshot(char *fname); +const char* SDL_COMPAT_JoystickName(SDL_Joystick *joystick); #ifdef __OPENGL_AVAILABLE__ void SDL_COMPAT_GL_SwapBuffers(void); From a76131d6f709376d67e970db93c7b3655447026f Mon Sep 17 00:00:00 2001 From: Stefan Date: Thu, 22 Jan 2026 02:06:33 +0100 Subject: [PATCH 140/143] Fixed many typos (#212) Co-authored-by: Stefan A. Haubenthal --- 6502.h | 4 ++-- Makefile | 4 ++-- Oricutron.guide | 6 +++--- disk.c | 4 ++-- filereq_gtk.c | 2 +- filereq_sdl.c | 2 +- font.c | 2 +- machine.c | 4 ++-- oricutron.cfg | 4 ++-- plugins/ch376/ch376.c | 6 +++--- roms/empty_orix.rom | Bin roms/kernel.rom | Bin roms/orixbank1.rom | Bin roms/orixbank2.rom | Bin roms/orixbank3.rom | Bin roms/orixbank4.rom | Bin roms/orixbank5.rom | Bin roms/orixbank6.rom | Bin roms/orixbank7.rom | Bin roms/shell.rom | Bin system_sdl.h | 4 ++-- via.c | 14 +++++++------- 22 files changed, 28 insertions(+), 28 deletions(-) mode change 100755 => 100644 roms/empty_orix.rom mode change 100755 => 100644 roms/kernel.rom mode change 100755 => 100644 roms/orixbank1.rom mode change 100755 => 100644 roms/orixbank2.rom mode change 100755 => 100644 roms/orixbank3.rom mode change 100755 => 100644 roms/orixbank4.rom mode change 100755 => 100644 roms/orixbank5.rom mode change 100755 => 100644 roms/orixbank6.rom mode change 100755 => 100644 roms/orixbank7.rom mode change 100755 => 100644 roms/shell.rom diff --git a/6502.h b/6502.h index ac8a8932..b2e77a63 100644 --- a/6502.h +++ b/6502.h @@ -61,11 +61,11 @@ #define MBPB_RESETCYCLESPRINT 5 #define MBPF_RESETCYCLESPRINT (1<f_n<<7)|(cpu->f_v<<6)|(1<<5)|(cpu->f_b<<4)|(cpu->f_d<<3)|(cpu->f_i<<2)|(cpu->f_z<<1)|cpu->f_c) #define MAKEFLAGSBC ((cpu->f_n<<7)|(cpu->f_v<<6)|(1<<5)|(cpu->f_d<<3)|(cpu->f_i<<2)|(cpu->f_z<<1)|cpu->f_c) -// Set the seperate flag stores from a 6502-format mask +// Set the separate flag stores from a 6502-format mask #define SETFLAGS(n) cpu->f_n=(n&0x80)>>7;\ cpu->f_v=(n&0x40)>>6;\ cpu->f_b=(n&0x10)>>4;\ diff --git a/Makefile b/Makefile index 85336c3b..508acd6d 100644 --- a/Makefile +++ b/Makefile @@ -593,12 +593,12 @@ $(OBJECTS): %.o: %.c $(CC) -c $(CFLAGS) $< -o $(notdir $@) @$(CC) -MM $(CFLAGS) $< > $(notdir $*).d -# Overide the default C rule for C++ +# Override the default C rule for C++ %.o: %.cpp $(CXX) -c $(CFLAGS) $< -o $(notdir $@) @$(CXX) -MM $(CFLAGS) $< > $(notdir $*).d -# Overide the default C rule for ObjC +# Override the default C rule for ObjC %.o: %.m $(CC) -c $(CFLAGS) $< -o $(notdir $@) @$(CC) -MM $(CFLAGS) $< > $(notdir $*).d diff --git a/Oricutron.guide b/Oricutron.guide index 3847bec6..a6d1fbfa 100644 --- a/Oricutron.guide +++ b/Oricutron.guide @@ -396,7 +396,7 @@ Oricutron can emulate ACIA at address #31C (standard address for Telestrat). The emulation works for Oric, Atmos, Telestrat and Pravetz and can be used together with any disk type. -The emulated ACIA communicates with the out-side world trough back-ends. +The emulated ACIA communicates with the out-side world through back-ends. Back-ends can be configured from 'oricutron.cfg' or from command line (see default 'oricutron.cfg' for usage). @@ -406,7 +406,7 @@ Back-ends are: - com - Oricutron uses any real or virtual COM port in the host machine and communicates with the hardware attached to this serial port - modem - unites ACIA with attached modem linked to internet with server and client sockets -In 'modem' mode are available folowing 'AT' commands: +In 'modem' mode are available following 'AT' commands: AT - returns 'OK' ATZ - initialize the modem AT&F - initialize the modem @@ -429,7 +429,7 @@ ROM patch files For detailed usage see included '.pch' files in roms subdirectory. -Additionaly unlimited number of binary patches can be added: +Additionally unlimited number of binary patches can be added: $XXXX:00112233445566778899AABBCCDDEEFF.... $YYYY:AA55AA55.... diff --git a/disk.c b/disk.c index c3ec95d4..d30f421b 100644 --- a/disk.c +++ b/disk.c @@ -720,7 +720,7 @@ void wd17xx_seek_track( struct wd17xx *wd, Uint8 track, SDL_bool dofudge ) // Is there a disk in the drive? if(wd->disk[wd->c_drive]) { - // Yes. If we are trying to seek to a non-existant track, just seek as far as we can + // Yes. If we are trying to seek to a non-existent track, just seek as far as we can if(track >= wd->disk[wd->c_drive]->numtracks) { track = (wd->disk[wd->c_drive]->numtracks>0)?wd->disk[wd->c_drive]->numtracks-1:0; @@ -970,7 +970,7 @@ unsigned char wd17xx_read( struct wd17xx *wd, unsigned short addr ) wd->currsector = wd17xx_find_sector(wd, wd->r_sector); wd->crc = 0xe295; - // If we hit the end of the track, thats fine, it just means the operation + // If we hit the end of the track, that's fine, it just means the operation // is finished. if(!wd->currsector) { diff --git a/filereq_gtk.c b/filereq_gtk.c index 83152fe2..b4edeba9 100644 --- a/filereq_gtk.c +++ b/filereq_gtk.c @@ -57,7 +57,7 @@ void shut_filerequester( struct machine *oric ) // path = initial path to show // fname = initial contents of the filename textbox // It returns true if the user selected a file, although the file is not -// guarranteed to exist. +// guaranteed to exist. SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fname, int type ) { GtkWidget *dialog; diff --git a/filereq_sdl.c b/filereq_sdl.c index 61386212..27e7d8cb 100644 --- a/filereq_sdl.c +++ b/filereq_sdl.c @@ -292,7 +292,7 @@ enum // path = initial path to show // fname = initial contents of the filename textbox // It returns true if the user selected a file, although the file is not -// guarranteed to exist. +// guaranteed to exist. SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fname, int type ) { SDL_Event event; diff --git a/font.c b/font.c index 146b7d60..ee41cb2c 100644 --- a/font.c +++ b/font.c @@ -31,7 +31,7 @@ unsigned char thefont[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, // 9 bottom left 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, // 10 branch up 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, // 11 bottom right - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, // 12 menu seperator + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, // 12 menu separator 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 13 0x00, 0x00, 0x06, 0x06, 0x0c, 0x0c, 0x18, 0xd8, 0xf0, 0x70, 0x60, 0x00, // 14 Tick 0x00, 0xff, 0x80, 0x98, 0xa4, 0xa4, 0x98, 0x80, 0x8f, 0x90, 0xff, 0x00, // 15 Tape left diff --git a/machine.c b/machine.c index 71cdc1ba..3bd0a392 100644 --- a/machine.c +++ b/machine.c @@ -1718,11 +1718,11 @@ void load_patches( struct machine *oric, char *fname ) if( read_config_option( &filetmp[i], "keymap", &oric->keymap, keymapnames ) ) continue; /* - * parse real patch line formated as: + * parse real patch line formatted as: * $xxxx:00112233445566778899AABBCCDDEEFF */ - // atleast address and 1 byte required + // at least address and 1 byte required if(8 <= strlen(&filetmp[i]) && ';' != filetmp[i]) { char* ptmp = &filetmp[i]; diff --git a/oricutron.cfg b/oricutron.cfg index cfdc66ce..8b977e2d 100644 --- a/oricutron.cfg +++ b/oricutron.cfg @@ -62,7 +62,7 @@ diskautosave = yes ; Start with this disk in drive 0 (backslash is an escape char to insert ; quotes, so double backslash is required to insert a backslash. You can use -; forward slash as a path seperator, even on windows. +; forward slash as a path separator, even on windows. ;diskimage = 'assets/disks/aigledor.dsk' ; ---------------------------------- @@ -153,7 +153,7 @@ lightpen = no ;printenable = yes ; Filter printed symbols in 'printer_out.txt' -; select 'no' for raw binay mode +; select 'no' for raw binary mode ;printfilter = yes ; Enable audio DC adjustment diff --git a/plugins/ch376/ch376.c b/plugins/ch376/ch376.c index 2c1ad43b..38ecca80 100644 --- a/plugins/ch376/ch376.c +++ b/plugins/ch376/ch376.c @@ -267,7 +267,7 @@ static CH376_BOOL system_get_disk_info(CH376_CONTEXT *context, CH376_LOCK root_l // Return 0 if a directory could not be locked (not a directory or not existing) static CH376_LOCK system_obtain_directory_lock(CH376_CONTEXT *context, const char *dir_path, CH376_LOCK root_lock); -// Release a lock previouly obtained from system_obtain_directory_lock +// Release a lock previously obtained from system_obtain_directory_lock // It is safe to call it with a 0 static void system_release_directory_lock(CH376_CONTEXT *context, CH376_LOCK dir_lock); @@ -1532,7 +1532,7 @@ static void cancel_all_io(struct ch376 *ch376) // Cancel data buffer read/write sessions ch376->bytes_to_read_write = 0; - // End directory browing or file i/o sessions + // End directory browsing or file i/o sessions system_finish_examine_directory(&ch376->context, ch376->current_directory_browsing); ch376->current_directory_browsing = (CH376_DIR)0; system_file_close(&ch376->context, ch376->current_file); @@ -2353,7 +2353,7 @@ void ch376_write_command_port(struct ch376 *ch376, CH376_U8 command) } else { - dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_ENUM_GO] directory browing finished\n"); + dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_ENUM_GO] directory browsing finished\n"); system_finish_examine_directory(&ch376->context, ch376->current_directory_browsing); ch376->current_directory_browsing = (CH376_DIR)0; diff --git a/roms/empty_orix.rom b/roms/empty_orix.rom old mode 100755 new mode 100644 diff --git a/roms/kernel.rom b/roms/kernel.rom old mode 100755 new mode 100644 diff --git a/roms/orixbank1.rom b/roms/orixbank1.rom old mode 100755 new mode 100644 diff --git a/roms/orixbank2.rom b/roms/orixbank2.rom old mode 100755 new mode 100644 diff --git a/roms/orixbank3.rom b/roms/orixbank3.rom old mode 100755 new mode 100644 diff --git a/roms/orixbank4.rom b/roms/orixbank4.rom old mode 100755 new mode 100644 diff --git a/roms/orixbank5.rom b/roms/orixbank5.rom old mode 100755 new mode 100644 diff --git a/roms/orixbank6.rom b/roms/orixbank6.rom old mode 100755 new mode 100644 diff --git a/roms/orixbank7.rom b/roms/orixbank7.rom old mode 100755 new mode 100644 diff --git a/roms/shell.rom b/roms/shell.rom old mode 100755 new mode 100644 diff --git a/system_sdl.h b/system_sdl.h index 985aa87c..55d59e5d 100644 --- a/system_sdl.h +++ b/system_sdl.h @@ -72,7 +72,7 @@ #define _MAKE_BE16(X) #endif -/* SDL compatability definitions and macroses */ +/* SDL compatibility definitions and macros */ #if SDL_MAJOR_VERSION == 1 typedef Uint16 SDL_COMPAT_KEY; /* Used in 8912.c */ typedef SDL_keysym SDL_COMPAT_KEYSYM; @@ -126,7 +126,7 @@ typedef SDL_RendererInfo SDL_COMPAT_VideoInfo; #define SDLK_PRINT SDLK_PRINTSCREEN #endif -/* SDL compatability protos */ +/* SDL compatibility protos */ #ifdef WANT_WMINFO int SDL_COMPAT_GetWMInfo(SDL_SysWMinfo *info); #endif diff --git a/via.c b/via.c index 967d374f..943958cb 100644 --- a/via.c +++ b/via.c @@ -190,10 +190,10 @@ void via_main_w_ca2ext( struct via *v ) { switch( v->pcr & PCRF_CA2CON ) { - case 0x00: // Interrupt on negative transision - case 0x02: // Independant negative transition + case 0x00: // Interrupt on negative transition + case 0x02: // Independent negative transition case 0x04: // Interrupt on positive transition - case 0x06: // Independant positive transition + case 0x06: // Independent positive transition ay_set_bc1( &v->oric->ay, v->ca2 ); break; @@ -324,7 +324,7 @@ void via_write_portb( struct via *v, unsigned char mask, unsigned char data ) (!(v->acr&VIRQF_CB1)) ) v->irbl = v->irb; - // Is timer 2 counting PB6 negative transisions? + // Is timer 2 counting PB6 negative transitions? if( ( v->acr & ACRF_T2CON ) == 0 ) return; // Was there a negative transition? @@ -994,15 +994,15 @@ void via_write_CA2( struct via *v, unsigned char data ) { switch( v->pcr & PCRF_CA2CON ) { - case 0x00: // Interrupt on negative transision - case 0x02: // Independant negative transition + case 0x00: // Interrupt on negative transition + case 0x02: // Independent negative transition if( ( v->ca2 ) && ( data == 0 ) ) via_set_irq( v, VIRQF_CA2 ); v->ca2 = data != 0; break; case 0x04: // Interrupt on positive transition - case 0x06: // Independant positive transition + case 0x06: // Independent positive transition if( ( !v->ca2 ) && ( data != 0 ) ) via_set_irq( v, VIRQF_CA2 ); v->ca2 = data != 0; From 45881209fe18c5192846af30e43d6e938fd2c258 Mon Sep 17 00:00:00 2001 From: iss Date: Fri, 23 Jan 2026 13:25:56 +0200 Subject: [PATCH 141/143] fix: issue #210 (Letter W) --- machine.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/machine.c b/machine.c index 3bd0a392..d9e7cb6a 100644 --- a/machine.c +++ b/machine.c @@ -1174,13 +1174,14 @@ void preinit_machine( struct machine *oric ) oric->kbjoy1[4] = SDLK_KP_ENTER; oric->kbjoy1[5] = SDLK_KP_PLUS; oric->kbjoy1[6] = SDLK_KP_MINUS; - oric->kbjoy2[0] = 'w'; - oric->kbjoy2[1] = 's'; - oric->kbjoy2[2] = 'a'; - oric->kbjoy2[3] = 'd'; - oric->kbjoy2[4] = SDLK_SPACE; - oric->kbjoy2[5] = 'n'; - oric->kbjoy2[5] = SDLK_LALT; + + oric->kbjoy2[0] = 0; + oric->kbjoy2[1] = 0; + oric->kbjoy2[2] = 0; + oric->kbjoy2[3] = 0; + oric->kbjoy2[4] = 0; + oric->kbjoy2[5] = 0; + oric->kbjoy2[6] = 0; oric->drivetype = DRV_NONE; for( i=0; i Date: Fri, 23 Jan 2026 13:51:47 +0200 Subject: [PATCH 142/143] formatting: no code changes, white space cleanup, consistent source indentation --- 6502.c | 326 +- 6502.h | 10 +- 6551.c | 123 +- 6551.h | 24 +- 6551_com.c | 255 +- 6551_loopback.c | 8 +- 6551_modem.c | 102 +- 8912.c | 376 +- 8912.h | 30 +- avi.c | 388 +- avi.h | 20 +- disk.c | 309 +- disk.h | 56 +- disk_pravetz.c | 658 +-- filereq.h | 6 +- filereq_amiga.c | 80 +- filereq_beos.cpp | 147 +- filereq_gtk.c | 38 +- filereq_sdl.c | 553 +-- filereq_win32.c | 66 +- font.c | 8 +- gui.c | 1735 ++++---- gui.h | 106 +- gui_android.c | 6 +- gui_beos.cpp | 497 +-- gui_win.c | 133 +- gui_x11.c | 195 +- joystick.c | 549 +-- joystick.h | 12 +- keyboard.c | 674 +-- keyboard.h | 12 +- machine.c | 1485 +++---- machine.h | 48 +- main.c | 1663 ++++---- main.h | 10 +- monitor.c | 3658 +++++++++-------- monitor.h | 44 +- msgbox.h | 6 +- msgbox_beos.cpp | 14 +- msgbox_gtk.c | 22 +- msgbox_os2.c | 20 +- msgbox_os4.c | 62 +- msgbox_sdl.c | 161 +- msgbox_win32.c | 18 +- msvc/Oricutron.rc | 102 +- msvc/VS2017/Oricutron.sln | 2 +- msvc/VS2017/Oricutron.vcxproj | 2 +- msvc/VS2017/Oricutron.vcxproj.filters | 2 +- msvc/VS2019/Oricutron.sln | 2 +- msvc/VS2019/Oricutron.vcxproj | 2 +- msvc/VS2019/Oricutron.vcxproj.filters | 612 +-- msvc/dirent.h | 1336 +++--- plugins/ch376/ch376.c | 3377 +++++++-------- plugins/ch376/ch376.h | 39 +- plugins/ch376/oric_ch376_plugin.c | 24 +- plugins/ch376/oric_ch376_plugin.h | 2 +- .../oric_twilighte_board_plugin.c | 649 +-- .../oric_twilighte_board_plugin.h | 34 +- render_gl.c | 433 +- render_gl.h | 26 +- render_null.c | 24 +- render_null.h | 26 +- render_sw.c | 255 +- render_sw.h | 30 +- render_sw8.c | 313 +- render_sw8.h | 26 +- snapshot.c | 823 ++-- snapshot.h | 4 +- system.h | 10 +- system_sdl.c | 162 +- system_sdl.h | 6 +- tape.c | 765 ++-- tape.h | 16 +- ula.c | 229 +- ula.h | 14 +- via.c | 516 +-- via.h | 30 +- 77 files changed, 12843 insertions(+), 11763 deletions(-) diff --git a/6502.c b/6502.c index 2cf017d3..cd1df949 100644 --- a/6502.c +++ b/6502.c @@ -28,7 +28,7 @@ #define ILLEGALS -void dbg_printf( char *fmt, ... ); +void dbg_printf(char* fmt, ...); #if defined(DEBUG_CPU_TRACE) && DEBUG_CPU_TRACE > 0 void mon_traceinst(struct m6502 *cpu); @@ -38,11 +38,11 @@ void mon_traceinst(struct m6502 *cpu); // You need to overwrite these with your own ones if you want // the CPU to do anything other than constantly execute brk // instructions :-) -static void nullwrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) +static void nullwrite(struct m6502 *cpu, unsigned short addr, unsigned char data) { } -static unsigned char nullread( struct m6502 *cpu, unsigned short addr ) +static unsigned char nullread(struct m6502 *cpu, unsigned short addr) { return 0; } @@ -52,7 +52,7 @@ static unsigned char nullread( struct m6502 *cpu, unsigned short addr ) ** The userdata param is just used to fill in the ** cpu->userdata field. */ -void m6502_init( struct m6502 *cpu, void *userdata, SDL_bool nukebreakpoints ) +void m6502_init(struct m6502 *cpu, void* userdata, SDL_bool nukebreakpoints) { int i; cpu->rastercycles = 0; @@ -61,9 +61,9 @@ void m6502_init( struct m6502 *cpu, void *userdata, SDL_bool nukebreakpoints ) cpu->write = nullwrite; cpu->read = nullread; - if( nukebreakpoints ) + if(nukebreakpoints) { - for( i=0; i<16; i++ ) + for(i=0; i<16; i++) { cpu->breakpoints[i] = -1; cpu->membreakpoints[i].flags = 0; @@ -76,7 +76,7 @@ void m6502_init( struct m6502 *cpu, void *userdata, SDL_bool nukebreakpoints ) /* ** Resets the 6502 cpu to powerup state */ -void m6502_reset( struct m6502 *cpu ) +void m6502_reset(struct m6502 *cpu) { cpu->a = cpu->x = cpu->y = 0; cpu->sp = 0xff; @@ -87,7 +87,7 @@ void m6502_reset( struct m6502 *cpu ) cpu->f_b = 0; cpu->f_v = 0; cpu->f_n = 0; - cpu->pc = (cpu->read( cpu, 0xfffd )<<8) | cpu->read( cpu, 0xfffc ); + cpu->pc = (cpu->read(cpu, 0xfffd)<<8) | cpu->read(cpu, 0xfffc); cpu->lastpc = 0; cpu->nmi = SDL_FALSE; cpu->irq = 0; @@ -281,27 +281,29 @@ void m6502_reset( struct m6502 *cpu ) // Get the number of cycles the NEXT cpu instruction will take // Returns TRUE if we've hit some kind of breakpoint -SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) +SDL_bool m6502_set_icycles(struct m6502 *cpu, SDL_bool dobp, char* bpmsg) { unsigned short baddr; unsigned int extra = 0; int i; - if( cpu->nmicount > 0 ) + if(cpu->nmicount > 0) { cpu->nmicount--; - if( !cpu->nmicount ) + if(!cpu->nmicount) cpu->nmi = SDL_FALSE; } - if( cpu->nmi ) + if(cpu->nmi) { extra = 7; - cpu->calcpc = (cpu->read( cpu, 0xfffb )<<8)|cpu->read( cpu, 0xfffa ); + cpu->calcpc = (cpu->read(cpu, 0xfffb)<<8)|cpu->read(cpu, 0xfffa); cpu->calcint = 2; - } else if( ( cpu->irq ) && ( cpu->f_i == 0 ) ) { + } + else if((cpu->irq) && (cpu->f_i == 0)) + { extra = 7; - cpu->calcpc = (cpu->read( cpu, 0xffff )<<8)|cpu->read( cpu, 0xfffe ); + cpu->calcpc = (cpu->read(cpu, 0xffff)<<8)|cpu->read(cpu, 0xfffe); cpu->calcint = 1; } else @@ -310,28 +312,28 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) cpu->calcint = 0; } - cpu->calcop = cpu->read( cpu, cpu->calcpc ); - if( dobp ) + cpu->calcop = cpu->read(cpu, cpu->calcpc); + if(dobp) { - if( cpu->anybp ) + if(cpu->anybp) { - for( i=0; i<16; i++ ) + for(i=0; i<16; i++) { - if( ( cpu->breakpoints[i] != -1 ) && ( cpu->calcpc == cpu->breakpoints[i] ) ) + if((cpu->breakpoints[i] != -1) && (cpu->calcpc == cpu->breakpoints[i])) { - if( (cpu->breakpoint_flags[i] & MBPF_RESETCYCLESPRINT) == MBPF_RESETCYCLESPRINT ) + if((cpu->breakpoint_flags[i] & MBPF_RESETCYCLESPRINT) == MBPF_RESETCYCLESPRINT) printf("%.4X: %d\n", cpu->breakpoints[i], cpu->cycles); - if( (cpu->breakpoint_flags[i] & MBPF_RESETCYCLES) == MBPF_RESETCYCLES ) + if((cpu->breakpoint_flags[i] & MBPF_RESETCYCLES) == MBPF_RESETCYCLES) cpu->cycles = 0; - if( (cpu->breakpoint_flags[i] & MBPF_RESETCYCLESCONTINUE) != MBPF_RESETCYCLESCONTINUE ) + if((cpu->breakpoint_flags[i] & MBPF_RESETCYCLESCONTINUE) != MBPF_RESETCYCLESCONTINUE) return SDL_TRUE; } } } - if( cpu->anymbp ) + if(cpu->anymbp) { unsigned short waddr, raddr, wlen, rlen; @@ -339,7 +341,7 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) wlen = rlen = 0; // Going to read or write? - switch( cpu->calcop ) + switch(cpu->calcop) { case 0x00: // { "BRK", AM_IMP }, // 00 waddr = (cpu->sp+0x100)-3; @@ -387,7 +389,7 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) case 0x07: // { "SLO", AM_ZP }, // 07 (illegal) case 0x47: // { "SRE", AM_ZP }, // 47 (illegal) #endif - RW_BADDR_ZP; + RW_BADDR_ZP; break; case 0x0E: // { "ASL", AM_ABS }, // 0E @@ -404,7 +406,7 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) case 0x0F: // { "SLO", AM_ABS }, // 0F (illegal) case 0x4F: // { "SRE", AM_ABS }, // 4F (illegal) #endif - RW_BADDR_ABS; + RW_BADDR_ABS; break; case 0x1E: // { "ASL", AM_ABX }, // 1E @@ -421,7 +423,7 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) case 0x1F: // { "SLO", AM_ABX }, // 1F (illegal) case 0x5F: // { "SRE", AM_ABX }, // 5F (illegal) #endif - RW_BADDR_ABX; + RW_BADDR_ABX; break; case 0x16: // { "ASL", AM_ZPX }, // 16 @@ -438,7 +440,7 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) case 0x17: // { "SLO", AM_ZPX }, // 17 (illegal) case 0x57: // { "SRE", AM_ZPX }, // 57 (illegal) #endif - RW_BADDR_ZPX; + RW_BADDR_ZPX; break; #ifdef ILLEGALS @@ -480,7 +482,7 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) #ifdef ILLEGALS case 0xA3: // { "LAX", AM_ZIX }, // A3 (illegal) #endif - R_BADDR_ZIX; + R_BADDR_ZIX; break; case 0x11: // { "ORA", AM_ZIY }, // 11 @@ -494,7 +496,7 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) #ifdef ILLEGALS case 0xB3: // { "LAX", AM_ZIY }, // B3 (illegal) #endif - R_BADDR_ZIY; + R_BADDR_ZIY; break; case 0x05: // { "ORA", AM_ZP }, // 05 @@ -512,7 +514,7 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) #ifdef ILLEGALS case 0xA7: // { "LAX", AM_ZP }, // A7 (illegal) #endif - R_BADDR_ZP; + R_BADDR_ZP; break; case 0x0D: // { "ORA", AM_ABS }, // 0D @@ -530,7 +532,7 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) #ifdef ILLEGALS case 0xAF: // { "LAX", AM_ABS }, // AF (illegal) #endif - R_BADDR_ABS; + R_BADDR_ABS; break; case 0x15: // { "ORA", AM_ZPX }, // 15 @@ -555,7 +557,7 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) #ifdef ILLEGALS case 0xBF: // { "LAX", AM_ABY }, // BF (illegal) #endif - R_BADDR_ABY; + R_BADDR_ABY; break; case 0x1D: // { "ORA", AM_ABX }, // 1D @@ -571,13 +573,13 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) case 0xB6: // { "LDX", AM_ZPY }, // B6 #ifdef ILLEGALS - case 0xB7: // { "LAX", AM_ZPY }, // B7 (illegal) + case 0xB7: // { "LAX", AM_ZPY }, // B7 (illegal) #endif - R_BADDR_ZPY; + R_BADDR_ZPY; break; case 0x6C: // { "JMP", AM_IND }, // 6C - raddr = (cpu->read( cpu, cpu->calcpc+2 )<<8)|cpu->read( cpu, cpu->calcpc+1 ); + raddr = (cpu->read(cpu, cpu->calcpc+2)<<8)|cpu->read(cpu, cpu->calcpc+1); rlen = 2; break; @@ -585,7 +587,7 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) #ifdef ILLEGALS case 0x83: // { "SAX", AM_ZIX }, // 83 (illegal) #endif - W_BADDR_ZIX; + W_BADDR_ZIX; break; case 0x84: // { "STY", AM_ZP }, // 84 @@ -594,7 +596,7 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) #ifdef ILLEGALS case 0x87: // { "SAX", AM_ZP }, // 87 (illegal) #endif - W_BADDR_ZP; + W_BADDR_ZP; break; case 0x8C: // { "STY", AM_ABS }, // 8C @@ -603,7 +605,7 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) #ifdef ILLEGALS case 0x8F: // { "SAX", AM_ABS }, // 8F (illegal) #endif - W_BADDR_ABS; + W_BADDR_ABS; break; case 0x91: // { "STA", AM_ZIY }, // 91 @@ -619,7 +621,7 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) #ifdef ILLEGALS case 0x97: // { "SAX", AM_ZPY }, // 97 (illegal) #endif - W_BADDR_ZPY; + W_BADDR_ZPY; break; case 0x99: // { "STA", AM_ABY }, // 99 @@ -627,7 +629,7 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) case 0x9F: // { "AHX", AM_ABY }, // 9F (illegal, unstable) case 0x9B: // { "TAS", AM_ABY }, // 9B (illegal, unstable) #endif - W_BADDR_ABY; + W_BADDR_ABY; break; case 0x9D: // { "STA", AM_ABX }, // 9D @@ -635,34 +637,34 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) break; } - for( i=0; i<16; i++ ) + for(i=0; i<16; i++) { - if( ( wlen != 0 ) && ( cpu->membreakpoints[i].flags & MBPF_WRITE ) ) + if((wlen != 0) && (cpu->membreakpoints[i].flags & MBPF_WRITE)) { - if( ( cpu->membreakpoints[i].addr >= waddr ) && - ( cpu->membreakpoints[i].addr < (waddr+wlen) ) ) + if((cpu->membreakpoints[i].addr >= waddr) && + (cpu->membreakpoints[i].addr < (waddr+wlen))) { - sprintf( bpmsg, "Break on WRITE to $%04X", cpu->membreakpoints[i].addr ); + sprintf(bpmsg, "Break on WRITE to $%04X", cpu->membreakpoints[i].addr); return SDL_TRUE; } } - if( ( rlen != 0 ) && ( cpu->membreakpoints[i].flags & MBPF_READ ) ) + if((rlen != 0) && (cpu->membreakpoints[i].flags & MBPF_READ)) { - if( ( cpu->membreakpoints[i].addr >= raddr ) && - ( cpu->membreakpoints[i].addr < (raddr+rlen) ) ) + if((cpu->membreakpoints[i].addr >= raddr) && + (cpu->membreakpoints[i].addr < (raddr+rlen))) { - sprintf( bpmsg, "Break on READ from $%04X", cpu->membreakpoints[i].addr ); + sprintf(bpmsg, "Break on READ from $%04X", cpu->membreakpoints[i].addr); return SDL_TRUE; } } - if( cpu->membreakpoints[i].flags & MBPF_CHANGE ) + if(cpu->membreakpoints[i].flags & MBPF_CHANGE) { - if( cpu->membreakpoints[i].lastval != cpu->read( cpu, cpu->membreakpoints[i].addr ) ) + if(cpu->membreakpoints[i].lastval != cpu->read(cpu, cpu->membreakpoints[i].addr)) { - cpu->membreakpoints[i].lastval = cpu->read( cpu, cpu->membreakpoints[i].addr ); - sprintf( bpmsg, "Break after $%04X changed", cpu->membreakpoints[i].addr ); + cpu->membreakpoints[i].lastval = cpu->read(cpu, cpu->membreakpoints[i].addr); + sprintf(bpmsg, "Break after $%04X changed", cpu->membreakpoints[i].addr); return SDL_TRUE; } } @@ -671,7 +673,7 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) } - switch( cpu->calcop ) + switch(cpu->calcop) { case 0x00: // { "BRK", AM_IMP }, // 00 case 0x1E: // { "ASL", AM_ABX }, // 1E @@ -892,7 +894,7 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) break; case 0x10: // { "BPL", AM_REL }, // 10 - IBRANCH( !cpu->f_n ); + IBRANCH(!cpu->f_n); break; case 0x11: // { "ORA", AM_ZIY }, // 11 @@ -903,19 +905,19 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) case 0xD1: // { "CMP", AM_ZIY }, // D1 case 0xF1: // { "SBC", AM_ZIY }, // F1 case 0xB3: // { "LAX", AM_ZIY }, // B3 (illegal) - baddr = cpu->read( cpu, cpu->calcpc+1 ); - baddr = ((cpu->read( cpu, baddr+1 )<<8) | cpu->read( cpu, baddr )); + baddr = cpu->read(cpu, cpu->calcpc+1); + baddr = ((cpu->read(cpu, baddr+1)<<8) | cpu->read(cpu, baddr)); cpu->icycles = 5; cpu->baddr = baddr+cpu->y; - if( CPAGECHECK ) cpu->icycles++; + if(CPAGECHECK) cpu->icycles++; break; case 0xBB: // { "LAS", AM_ZIY }, // BB - baddr = cpu->read( cpu, cpu->calcpc+1 ); - baddr = ((cpu->read( cpu, baddr+1 )<<8) | cpu->read( cpu, baddr )); + baddr = cpu->read(cpu, cpu->calcpc+1); + baddr = ((cpu->read(cpu, baddr+1)<<8) | cpu->read(cpu, baddr)); cpu->icycles = 4; cpu->baddr = baddr+cpu->y; - if( CPAGECHECK ) cpu->icycles++; + if(CPAGECHECK) cpu->icycles++; break; case 0x19: // { "ORA", AM_ABY }, // 19 @@ -930,7 +932,7 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) NBADDR_ABS; cpu->icycles = 4; cpu->baddr = baddr+cpu->y; - if( CPAGECHECK ) cpu->icycles++; + if(CPAGECHECK) cpu->icycles++; break; case 0x1D: // { "ORA", AM_ABX }, // 1D @@ -950,35 +952,35 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) NBADDR_ABS; cpu->icycles = 4; cpu->baddr = baddr+cpu->x; - if( CPAGECHECK ) cpu->icycles++; + if(CPAGECHECK) cpu->icycles++; break; case 0x30: // { "BMI", AM_REL }, // 30 - IBRANCH( cpu->f_n ); + IBRANCH(cpu->f_n); break; case 0x50: // { "BVC", AM_REL }, // 50 - IBRANCH( !cpu->f_v ); + IBRANCH(!cpu->f_v); break; case 0x70: // { "BVS", AM_REL }, // 70 - IBRANCH( cpu->f_v ); + IBRANCH(cpu->f_v); break; case 0x90: // { "BCC", AM_REL }, // 90 - IBRANCH( !cpu->f_c ); + IBRANCH(!cpu->f_c); break; case 0xB0: // { "BCS", AM_REL }, // B0 - IBRANCH( cpu->f_c ); + IBRANCH(cpu->f_c); break; case 0xD0: // { "BNE", AM_REL }, // D0 - IBRANCH( !cpu->f_z ); + IBRANCH(!cpu->f_z); break; case 0xF0: // { "BEQ", AM_REL }, // F0 - IBRANCH( cpu->f_z ); + IBRANCH(cpu->f_z); break; default: @@ -991,7 +993,7 @@ SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ) } // Execute one 6502 instruction -SDL_bool m6502_inst( struct m6502 *cpu ) +SDL_bool m6502_inst(struct m6502 *cpu) { unsigned char v; unsigned short r, t, baddr; @@ -999,15 +1001,17 @@ SDL_bool m6502_inst( struct m6502 *cpu ) // Make sure you call set_icycles before this routine! cpu->cycles += cpu->icycles; - if( cpu->calcint > 0 ) + if(cpu->calcint > 0) { - PUSHW( cpu->pc ); - PUSHB( MAKEFLAGSBC ); + PUSHW(cpu->pc); + PUSHB(MAKEFLAGSBC); cpu->f_d = 0; - if( cpu->calcint == 2 ) + if(cpu->calcint == 2) { cpu->nmi = SDL_FALSE; - } else { + } + else + { cpu->f_i = 1; } } @@ -1018,14 +1022,14 @@ SDL_bool m6502_inst( struct m6502 *cpu ) cpu->lastpc = cpu->pc = cpu->calcpc; cpu->pc++; - switch( cpu->calcop ) + switch(cpu->calcop) { case 0x00: // { "BRK", AM_IMP }, // 00 - PUSHW( (cpu->pc+1) ); - PUSHB( MAKEFLAGS | (1<<4) ); // Set B on the stack + PUSHW((cpu->pc+1)); + PUSHB(MAKEFLAGS | (1<<4)); // Set B on the stack cpu->f_i = 1; cpu->f_d = 0; - cpu->pc = (cpu->read( cpu, 0xffff )<<8) | cpu->read( cpu, 0xfffe ); + cpu->pc = (cpu->read(cpu, 0xffff)<<8) | cpu->read(cpu, 0xfffe); break; case 0x01: // { "ORA", AM_ZIX }, // 01 @@ -1041,11 +1045,11 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0x06: // { "ASL", AM_ZP }, // 06 KREAD_ZP; DO_ASL(v); - cpu->write( cpu, baddr, v ); + cpu->write(cpu, baddr, v); break; case 0x08: // { "PHP", AM_IMP }, // 08 - PUSHB( MAKEFLAGS ); + PUSHB(MAKEFLAGS); break; case 0x09: // { "ORA", AM_IMM }, // 09 @@ -1065,15 +1069,15 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0x0E: // { "ASL", AM_ABS }, // 0E KREAD_ABS; DO_ASL(v); - cpu->write( cpu, baddr, v ); + cpu->write(cpu, baddr, v); break; case 0x10: // { "BPL", AM_REL }, // 10 - BRANCH( !cpu->f_n ); + BRANCH(!cpu->f_n); break; case 0x11: // { "ORA", AM_ZIY }, // 11 - v = cpu->read( cpu, cpu->baddr ); // baddr is already calculated for this case + v = cpu->read(cpu, cpu->baddr); // baddr is already calculated for this case cpu->pc++; DO_ORA; break; @@ -1086,7 +1090,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0x16: // { "ASL", AM_ZPX }, // 16 KREAD_ZPX; DO_ASL(v); - cpu->write( cpu, baddr, v ); + cpu->write(cpu, baddr, v); break; case 0x18: // { "CLC", AM_IMP }, // 18 @@ -1095,7 +1099,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0x19: // { "ORA", AM_ABY }, // 19 case 0x1D: // { "ORA", AM_ABX }, // 1D - v = cpu->read( cpu, cpu->baddr ); // baddr is already calculated for this case + v = cpu->read(cpu, cpu->baddr); // baddr is already calculated for this case cpu->pc+=2; DO_ORA; break; @@ -1103,12 +1107,12 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0x1E: // { "ASL", AM_ABX }, // 1E READ_ABX; DO_ASL(v); - cpu->write( cpu, baddr, v ); + cpu->write(cpu, baddr, v); break; case 0x20: // { "JSR", AM_ABS }, // 20 - baddr = (cpu->read( cpu, cpu->pc+1 )<<8) | cpu->read( cpu, cpu->pc ); - PUSHW( (cpu->pc+1) ); + baddr = (cpu->read(cpu, cpu->pc+1)<<8) | cpu->read(cpu, cpu->pc); + PUSHW((cpu->pc+1)); cpu->pc = baddr; break; @@ -1132,7 +1136,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0x26: // { "ROL", AM_ZP }, // 26 KREAD_ZP; DO_ROL(v); - cpu->write( cpu, baddr, v ); + cpu->write(cpu, baddr, v); break; case 0x28: // { "PLP", AM_IMP }, // 28 @@ -1164,15 +1168,15 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0x2E: // { "ROL", AM_ABS }, // 2E KREAD_ABS; DO_ROL(v); - cpu->write( cpu, baddr, v ); + cpu->write(cpu, baddr, v); break; case 0x30: // { "BMI", AM_REL }, // 30 - BRANCH( cpu->f_n ); + BRANCH(cpu->f_n); break; case 0x31: // { "AND", AM_ZIY }, // 31 - v = cpu->read( cpu, cpu->baddr ); // baddr is already calculated for this case + v = cpu->read(cpu, cpu->baddr); // baddr is already calculated for this case cpu->pc++; DO_AND; break; @@ -1185,7 +1189,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0x36: // { "ROL", AM_ZPX }, // 36 KREAD_ZPX; DO_ROL(v); - cpu->write( cpu, baddr, v ); + cpu->write(cpu, baddr, v); break; case 0x38: // { "SEC", AM_IMP }, // 38 @@ -1194,7 +1198,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0x39: // { "AND", AM_ABY }, // 39 case 0x3D: // { "AND", AM_ABX }, // 3D - v = cpu->read( cpu, cpu->baddr ); // baddr is already calculated for this case + v = cpu->read(cpu, cpu->baddr); // baddr is already calculated for this case cpu->pc+=2; DO_AND; break; @@ -1202,13 +1206,13 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0x3E: // { "ROL", AM_ABX }, // 3E READ_ABX; DO_ROL(v); - cpu->write( cpu, baddr, v ); + cpu->write(cpu, baddr, v); break; case 0x40: // { "RTI", AM_IMP }, // 40 v = POPB; SETFLAGS(v); - POPW( cpu->pc ); + POPW(cpu->pc); break; case 0x41: // { "EOR", AM_ZIX }, // 41 @@ -1224,11 +1228,11 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0x46: // { "LSR", AM_ZP }, // 46 KREAD_ZP; DO_LSR(v); - cpu->write( cpu, baddr, v ); + cpu->write(cpu, baddr, v); break; case 0x48: // { "PHA", AM_IMP }, // 48 - PUSHB( cpu->a ); + PUSHB(cpu->a); break; case 0x49: // { "EOR", AM_IMM }, // 49 @@ -1241,7 +1245,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) break; case 0x4C: // { "JMP", AM_ABS }, // 4C - cpu->pc = (cpu->read( cpu, cpu->pc+1 )<<8)|cpu->read( cpu, cpu->pc ); + cpu->pc = (cpu->read(cpu, cpu->pc+1)<<8)|cpu->read(cpu, cpu->pc); break; case 0x4D: // { "EOR", AM_ABS }, // 4D @@ -1252,15 +1256,15 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0x4E: // { "LSR", AM_ABS }, // 4E KREAD_ABS; DO_LSR(v); - cpu->write( cpu, baddr, v ); + cpu->write(cpu, baddr, v); break; case 0x50: // { "BVC", AM_REL }, // 50 - BRANCH( !cpu->f_v ); + BRANCH(!cpu->f_v); break; case 0x51: // { "EOR", AM_ZIY }, // 51 - v = cpu->read( cpu, cpu->baddr ); // baddr is already calculated for this case + v = cpu->read(cpu, cpu->baddr); // baddr is already calculated for this case cpu->pc++; DO_EOR; break; @@ -1273,7 +1277,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0x56: // { "LSR", AM_ZPX }, // 56 KREAD_ZPX; DO_LSR(v); - cpu->write( cpu, baddr, v ); + cpu->write(cpu, baddr, v); break; case 0x58: // { "CLI", AM_IMP }, // 58 @@ -1282,7 +1286,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0x59: // { "EOR", AM_ABY }, // 59 case 0x5D: // { "EOR", AM_ABX }, // 5D - v = cpu->read( cpu, cpu->baddr ); // baddr is already calculated for this case + v = cpu->read(cpu, cpu->baddr); // baddr is already calculated for this case cpu->pc+=2; DO_EOR; break; @@ -1290,11 +1294,11 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0x5E: // { "LSR", AM_ABX }, // 5E READ_ABX; DO_LSR(v); - cpu->write( cpu, baddr, v ); + cpu->write(cpu, baddr, v); break; case 0x60: // { "RTS", AM_IMP }, // 60 - POPW( cpu->pc ); + POPW(cpu->pc); cpu->pc++; break; @@ -1311,7 +1315,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0x66: // { "ROR", AM_ZP }, // 66 KREAD_ZP; DO_ROR(v); - cpu->write( cpu, baddr, v ); + cpu->write(cpu, baddr, v); break; case 0x68: // { "PLA", AM_IMP }, // 68 @@ -1329,8 +1333,8 @@ SDL_bool m6502_inst( struct m6502 *cpu ) break; case 0x6C: // { "JMP", AM_IND }, // 6C - baddr = (cpu->read( cpu, cpu->pc+1 )<<8)|cpu->read( cpu, cpu->pc ); - cpu->pc = (cpu->read( cpu, baddr+1 )<<8)|cpu->read( cpu, baddr ); + baddr = (cpu->read(cpu, cpu->pc+1)<<8)|cpu->read(cpu, cpu->pc); + cpu->pc = (cpu->read(cpu, baddr+1)<<8)|cpu->read(cpu, baddr); break; case 0x6D: // { "ADC", AM_ABS }, // 6D @@ -1341,15 +1345,15 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0x6E: // { "ROR", AM_ABS }, // 6E KREAD_ABS; DO_ROR(v); - cpu->write( cpu, baddr, v ); + cpu->write(cpu, baddr, v); break; case 0x70: // { "BVS", AM_REL }, // 70 - BRANCH( cpu->f_v ); + BRANCH(cpu->f_v); break; case 0x71: // { "ADC", AM_ZIY }, // 71 - v = cpu->read( cpu, cpu->baddr ); // baddr is already calculated for this case + v = cpu->read(cpu, cpu->baddr); // baddr is already calculated for this case cpu->pc++; DO_ADC; break; @@ -1362,7 +1366,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0x76: // { "ROR", AM_ZPX }, // 76 KREAD_ZPX; DO_ROR(v); - cpu->write( cpu, baddr, v ); + cpu->write(cpu, baddr, v); break; case 0x78: // { "SEI", AM_IMP }, // 78 @@ -1371,7 +1375,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0x79: // { "ADC", AM_ABY }, // 79 case 0x7D: // { "ADC", AM_ABX }, // 7D - v = cpu->read( cpu, cpu->baddr ); // baddr is already calculated for this case + v = cpu->read(cpu, cpu->baddr); // baddr is already calculated for this case cpu->pc+=2; DO_ADC; break; @@ -1379,7 +1383,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0x7E: // { "ROR", AM_ABX }, // 7E READ_ABX; DO_ROR(v); - cpu->write( cpu, baddr, v ); + cpu->write(cpu, baddr, v); break; case 0x81: // { "STA", AM_ZIX }, // 81 @@ -1421,7 +1425,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) break; case 0x90: // { "BCC", AM_REL }, // 90 - BRANCH( !cpu->f_c ); + BRANCH(!cpu->f_c); break; case 0x91: // { "STA", AM_ZIY }, // 91 @@ -1528,11 +1532,11 @@ SDL_bool m6502_inst( struct m6502 *cpu ) break; case 0xB0: // { "BCS", AM_REL }, // B0 - BRANCH( cpu->f_c ); + BRANCH(cpu->f_c); break; case 0xB1: // { "LDA", AM_ZIY }, // B1 - cpu->a = cpu->read( cpu, cpu->baddr ); // baddr is already calculated for this case + cpu->a = cpu->read(cpu, cpu->baddr); // baddr is already calculated for this case cpu->pc++; FLAG_ZN(cpu->a); break; @@ -1561,7 +1565,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0xB9: // { "LDA", AM_ABY }, // B9 case 0xBD: // { "LDA", AM_ABX }, // BD - cpu->a = cpu->read( cpu, cpu->baddr ); // baddr is already calculated for this case + cpu->a = cpu->read(cpu, cpu->baddr); // baddr is already calculated for this case cpu->pc+=2; FLAG_ZN(cpu->a); break; @@ -1572,13 +1576,13 @@ SDL_bool m6502_inst( struct m6502 *cpu ) break; case 0xBC: // { "LDY", AM_ABX }, // BC - cpu->y = cpu->read( cpu, cpu->baddr ); // baddr is already calculated for this case + cpu->y = cpu->read(cpu, cpu->baddr); // baddr is already calculated for this case cpu->pc+=2; FLAG_ZN(cpu->y); break; case 0xBE: // { "LDX", AM_ABY }, // BE - cpu->x = cpu->read( cpu, cpu->baddr ); // baddr is already calculated for this case + cpu->x = cpu->read(cpu, cpu->baddr); // baddr is already calculated for this case cpu->pc+=2; FLAG_ZN(cpu->x); break; @@ -1609,7 +1613,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0xC6: // { "DEC", AM_ZP }, // C6 KREAD_ZP; - cpu->write( cpu, baddr, --v ); + cpu->write(cpu, baddr, --v); FLAG_ZN(v); break; @@ -1643,16 +1647,16 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0xCE: // { "DEC", AM_ABS }, // CE KREAD_ABS; - cpu->write( cpu, baddr, --v ); + cpu->write(cpu, baddr, --v); FLAG_ZN(v); break; case 0xD0: // { "BNE", AM_REL }, // D0 - BRANCH( !cpu->f_z ); + BRANCH(!cpu->f_z); break; case 0xD1: // { "CMP", AM_ZIY }, // D1 - r = cpu->a-cpu->read( cpu, cpu->baddr ); // baddr is already calculated for this case + r = cpu->a-cpu->read(cpu, cpu->baddr); // baddr is already calculated for this case cpu->pc++; FLAG_SZCN(r); break; @@ -1665,7 +1669,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0xD6: // { "DEC", AM_ZPX }, // D6 KREAD_ZPX; - cpu->write( cpu, baddr, --v ); + cpu->write(cpu, baddr, --v); FLAG_ZN(v); break; @@ -1675,14 +1679,14 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0xD9: // { "CMP", AM_ABY }, // D9 case 0xDD: // { "CMP", AM_ABX }, // DD - r = cpu->a - cpu->read( cpu, cpu->baddr ); // baddr is already calculated for this case + r = cpu->a - cpu->read(cpu, cpu->baddr); // baddr is already calculated for this case cpu->pc+=2; FLAG_SZCN(r); break; case 0xDE: // { "DEC", AM_ABX }, // DE READ_ABX; - cpu->write( cpu, baddr, --v ); + cpu->write(cpu, baddr, --v); FLAG_ZN(v); break; @@ -1710,7 +1714,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0xE6: // { "INC", AM_ZP }, // E6 KREAD_ZP; - cpu->write( cpu, baddr, ++v ); + cpu->write(cpu, baddr, ++v); FLAG_ZN(v); break; @@ -1723,7 +1727,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) #ifdef ILLEGALS case 0xEB: // { "SBC", AM_IMM }, // EB (illegal) #endif - READ_IMM; + READ_IMM; DO_SBC; break; @@ -1743,16 +1747,16 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0xEE: // { "INC", AM_ABS }, // EE KREAD_ABS; - cpu->write( cpu, baddr, ++v ); + cpu->write(cpu, baddr, ++v); FLAG_ZN(v); break; case 0xF0: // { "BEQ", AM_REL }, // F0 - BRANCH( cpu->f_z ); + BRANCH(cpu->f_z); break; case 0xF1: // { "SBC", AM_ZIY }, // F1 - v = cpu->read( cpu, cpu->baddr ); // baddr is already calculated for this case + v = cpu->read(cpu, cpu->baddr); // baddr is already calculated for this case cpu->pc++; DO_SBC; break; @@ -1764,7 +1768,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0xF6: // { "INC", AM_ZPX }, // F6 KREAD_ZPX; - cpu->write( cpu, baddr, ++v ); + cpu->write(cpu, baddr, ++v); FLAG_ZN(v); break; @@ -1774,18 +1778,18 @@ SDL_bool m6502_inst( struct m6502 *cpu ) case 0xF9: // { "SBC", AM_ABY }, // F9 case 0xFD: // { "SBC", AM_ABX }, // FD - v = cpu->read( cpu, cpu->baddr ); // baddr is already calculated for this case + v = cpu->read(cpu, cpu->baddr); // baddr is already calculated for this case cpu->pc+=2; DO_SBC; break; case 0xFE: // { "INC", AM_ABX }, // FE READ_ABX; - cpu->write( cpu, baddr, ++v ); + cpu->write(cpu, baddr, ++v); FLAG_ZN(v); break; - // Illegal opcodes + // Illegal opcodes #ifdef ILLEGALS case 0x0B: // { "ANC", AM_IMM }, // 0B (illegal) case 0x2B: // { "ANC", AM_IMM }, // 2B (illegal) @@ -1827,12 +1831,24 @@ SDL_bool m6502_inst( struct m6502 *cpu ) cpu->a = (cpu->a&v)>>1; cpu->f_n = (cpu->a&0x80) != 0; cpu->f_z = cpu->a != 0; - switch (cpu->a&0x60) + switch(cpu->a&0x60) { - case 0x00: cpu->f_c=0; cpu->f_v=0; break; - case 0x20: cpu->f_c=0; cpu->f_v=1; break; - case 0x60: cpu->f_c=1; cpu->f_v=0; break; - case 0x40: cpu->f_c=1; cpu->f_v=1; break; + case 0x00: + cpu->f_c=0; + cpu->f_v=0; + break; + case 0x20: + cpu->f_c=0; + cpu->f_v=1; + break; + case 0x60: + cpu->f_c=1; + cpu->f_v=0; + break; + case 0x40: + cpu->f_c=1; + cpu->f_v=1; + break; } break; @@ -1853,20 +1869,20 @@ SDL_bool m6502_inst( struct m6502 *cpu ) r = cpu->x; // Instability 1 (sometimes, the &H drops off) - if ((cpu->cycles&7)>2) // pseudorandom 5 in 8 chance of &H + if((cpu->cycles&7)>2) // pseudorandom 5 in 8 chance of &H r &= (cpu->pc>>8)+1; v = cpu->a & r; // Instability 2 (A is input and output, which leads to "bit fight", // but anywhere that X&H=1 will work) - if (((cpu->cycles>>8)&7)<2) // pseudorandom 2 in 8 chance of bit fight + if(((cpu->cycles>>8)&7)<2) // pseudorandom 2 in 8 chance of bit fight { r = (r^0xff)&cpu->a; // inverse R now has 1 for each bit that we can mess with r &= cpu->cycles; // Make some of them 0 (pseudorandomly) v |= r; } - if (cpu->calcop==0x9F) + if(cpu->calcop==0x9F) { WRITE_ABY(v); } @@ -2048,7 +2064,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) break; case 0xBB: // { "LAS", AM_ZIY }, // BB (illegal) - cpu->sp &= cpu->read( cpu, cpu->baddr ); + cpu->sp &= cpu->read(cpu, cpu->baddr); cpu->pc++; cpu->a = cpu->sp; cpu->x = cpu->sp; @@ -2077,7 +2093,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) break; case 0xBF: // { "LAX", AM_ABY }, // BF (illegal) - cpu->a = cpu->read( cpu, cpu->baddr ); // baddr is already calculated for this case + cpu->a = cpu->read(cpu, cpu->baddr); // baddr is already calculated for this case cpu->pc+=2; cpu->x = cpu->a; FLAG_ZN(cpu->a); @@ -2091,7 +2107,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) break; case 0xB3: // { "LAX", AM_ZIY }, // B3 (illegal) - cpu->a = cpu->read( cpu, cpu->baddr ); // baddr is already calculated for this case + cpu->a = cpu->read(cpu, cpu->baddr); // baddr is already calculated for this case cpu->x = cpu->a; cpu->pc++; FLAG_ZN(cpu->a); @@ -2410,7 +2426,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) v = cpu->x; // Instability (sometimes, the &H drops off) - if ((cpu->cycles&7)>2) // pseudorandom 5 in 8 chance of &H + if((cpu->cycles&7)>2) // pseudorandom 5 in 8 chance of &H v &= (baddr>>8)+1; cpu->write(cpu, baddr, v); @@ -2422,7 +2438,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) v = cpu->y; // Instability (sometimes, the &H drops off) - if ((cpu->cycles&7)>2) // pseudorandom 5 in 8 chance of &H + if((cpu->cycles&7)>2) // pseudorandom 5 in 8 chance of &H v &= (baddr>>8)+1; cpu->write(cpu, baddr, v); @@ -2435,7 +2451,7 @@ SDL_bool m6502_inst( struct m6502 *cpu ) cpu->a = cpu->x & v; // Instability - if ((cpu->cycles&7)>5) // pseudorandom 6 in 8 chance of instability + if((cpu->cycles&7)>5) // pseudorandom 6 in 8 chance of instability { r = (cpu->x^0xff); r &= cpu->cycles; diff --git a/6502.h b/6502.h index b2e77a63..dcc79656 100644 --- a/6502.h +++ b/6502.h @@ -94,15 +94,15 @@ struct m6502 Sint32 breakpoints[16]; Uint8 breakpoint_flags[16]; struct membreakpoint membreakpoints[16]; - void *userdata; + void* userdata; Uint8 a, x, y, sp; Uint8 f_c, f_z, f_i, f_d, f_b, f_v, f_n; Uint8 irq, nmicount, calcop; }; -void m6502_init( struct m6502 *cpu, void *userdata, SDL_bool nukebreakpoints ); -void m6502_reset( struct m6502 *cpu ); -SDL_bool m6502_inst( struct m6502 *cpu ); -SDL_bool m6502_set_icycles( struct m6502 *cpu, SDL_bool dobp, char *bpmsg ); +void m6502_init(struct m6502 *cpu, void* userdata, SDL_bool nukebreakpoints); +void m6502_reset(struct m6502 *cpu); +SDL_bool m6502_inst(struct m6502 *cpu); +SDL_bool m6502_set_icycles(struct m6502 *cpu, SDL_bool dobp, char* bpmsg); diff --git a/6551.c b/6551.c index 62545150..44a9ce2b 100644 --- a/6551.c +++ b/6551.c @@ -50,31 +50,40 @@ #endif #if DEBUG_ACIA -static char *writereg_names[] = { "TXDATA", "RESET", "COMMAND", "CONTROL" }; -static char *readreg_names[] = { "RXDATA", "STATUS", "COMMAND", "CONTROL" }; -static char *parity_modes[] = { "NONE", "ODD", "NONE", "EVEN", "NONE", "MARK", "NONE", "SPACE" }; -static char *txcon_modes[] = { "TXIRQ=0,RLEV=H", "TXIRQ=1,RLEV=L", "RXIRQ=0,RLEV=L", "RXIRQ=0,RLEV=L,TXBRK" }; -static char *baud_rates[] = { "EXT", "50", "75", "109.92", "134.58", "150", "300", "600", "1200", "1800", "2400", "3600", "4800", "7200", "9600", "19200" }; -static char *bit_nums[] = { "8", "7", "6", "5" }; +static char* writereg_names[] = { "TXDATA", "RESET", "COMMAND", "CONTROL" }; +static char* readreg_names[] = { "RXDATA", "STATUS", "COMMAND", "CONTROL" }; +static char* parity_modes[] = { "NONE", "ODD", "NONE", "EVEN", "NONE", "MARK", "NONE", "SPACE" }; +static char* txcon_modes[] = { "TXIRQ=0,RLEV=H", "TXIRQ=1,RLEV=L", "RXIRQ=0,RLEV=L", "RXIRQ=0,RLEV=L,TXBRK" }; +static char* baud_rates[] = { "EXT", "50", "75", "109.92", "134.58", "150", "300", "600", "1200", "1800", "2400", "3600", "4800", "7200", "9600", "19200" }; +static char* bit_nums[] = { "8", "7", "6", "5" }; #endif // NOTE: work with integers 109.92 and 134.58 are approximated static Uint32 boudrates[] = { 0, 50, 75, 110, 134, 150, 300, 600, 1200, 1800, 2400, 3600, 4800, 7200, 9600, 19200 }; -static void acia_update_params( struct acia *acia ) +static void acia_update_params(struct acia *acia) { switch(8 - ((acia->regs[ACIA_CONTROL]&ACONF_WLEN)>>5)) { - case 5: acia->bitmask = 0x1f; break; - case 6: acia->bitmask = 0x3f; break; - case 7: acia->bitmask = 0x7f; break; - case 8: default: acia->bitmask = 0xff; break; + case 5: + acia->bitmask = 0x1f; + break; + case 6: + acia->bitmask = 0x3f; + break; + case 7: + acia->bitmask = 0x7f; + break; + case 8: + default: + acia->bitmask = 0xff; + break; } acia->rx = (acia->regs[ACIA_COMMAND] & ACOMF_DTR)? SDL_TRUE : SDL_FALSE; - acia->irqrx = (acia->rx && 0 == ( acia->regs[ACIA_COMMAND] & ACOMF_IRQDIS ))? SDL_TRUE : SDL_FALSE; + acia->irqrx = (acia->rx && 0 == (acia->regs[ACIA_COMMAND] & ACOMF_IRQDIS))? SDL_TRUE : SDL_FALSE; - switch( ( acia->regs[ACIA_COMMAND] & ACOMF_TXCON ) >> 2 ) + switch((acia->regs[ACIA_COMMAND] & ACOMF_TXCON) >> 2) { case 0: acia->tx = SDL_FALSE; @@ -109,15 +118,15 @@ static void acia_update_params( struct acia *acia ) // 1.8432 MHz / 16 (internal divider) = 115,2 kHz // 115,2 kHz => ~ 8.68 usec if(0 < acia->boudrate) - acia->framecycle = ( 115200 * 8680 ) / ( acia->boudrate * 1000 ); + acia->framecycle = (115200 * 8680) / (acia->boudrate * 1000); else acia->framecycle = 0; } -void acia_init( struct acia *acia, struct machine *oric ) +void acia_init(struct acia *acia, struct machine *oric) { - if( acia->done ) - acia->done( acia ); + if(acia->done) + acia->done(acia); acia->oric = oric; acia->regs[ACIA_RXDATA] = 0; @@ -127,60 +136,60 @@ void acia_init( struct acia *acia, struct machine *oric ) acia->regs[ACIA_CONTROL] = 0; acia->cycles = 0; - acia_update_params( acia ); + acia_update_params(acia); switch(oric->aciabackend) { case ACIA_TYPE_LOOPBACK: - acia_init_loopback( acia ); + acia_init_loopback(acia); break; #ifdef BACKEND_MODEM case ACIA_TYPE_MODEM: - acia_init_modem( acia ); + acia_init_modem(acia); break; #endif #ifdef BACKEND_COM case ACIA_TYPE_COM: - acia_init_com( acia ); + acia_init_com(acia); break; #endif case ACIA_TYPE_NONE: default: - if ( oric->type == MACH_TELESTRAT ) + if(oric->type == MACH_TELESTRAT) { oric->aciabackend = ACIA_TYPE_LOOPBACK; - acia_init_loopback( acia ); + acia_init_loopback(acia); } else - acia_init_none( acia ); + acia_init_none(acia); break; } } -void acia_clock( struct acia *acia, unsigned int cycles ) +void acia_clock(struct acia *acia, unsigned int cycles) { // EXT clock used - not implemented - if( 0 == ( acia->regs[ACIA_CONTROL] & ACONF_SRC )) + if(0 == (acia->regs[ACIA_CONTROL] & ACONF_SRC)) return; // INT clock - if( 0 == acia->framecycle ) + if(0 == acia->framecycle) return; acia->cycles += cycles; - while( acia->framecycle <= acia->cycles ) + while(acia->framecycle <= acia->cycles) { acia->cycles -= acia->framecycle; // TX enabled - if( acia->tx && 0 == (acia->regs[ACIA_STATUS] & ASTF_TXEMPTY) ) + if(acia->tx && 0 == (acia->regs[ACIA_STATUS] & ASTF_TXEMPTY)) { - if(!acia->put_byte( acia->regs[ACIA_TXDATA] ) ) + if(!acia->put_byte(acia->regs[ACIA_TXDATA])) acia->regs[ACIA_STATUS] |= ASTF_OVRUNERR; else { acia->regs[ACIA_STATUS] |= ASTF_TXEMPTY; - if( acia->irqtx ) + if(acia->irqtx) { acia->regs[ACIA_STATUS] |= ASTF_IRQ; acia->oric->cpu.irq |= IRQF_ACIA; @@ -191,13 +200,13 @@ void acia_clock( struct acia *acia, unsigned int cycles ) } // RX enabled - if( acia-> rx ) + if(acia-> rx) { Uint8 data = 0; - if( acia->has_byte(&data) ) + if(acia->has_byte(&data)) { acia->regs[ACIA_STATUS] |= ASTF_RXDATA; - if( acia->irqrx ) + if(acia->irqrx) { acia->regs[ACIA_STATUS] |= ASTF_IRQ; acia->oric->cpu.irq |= IRQF_ACIA; @@ -207,18 +216,18 @@ void acia_clock( struct acia *acia, unsigned int cycles ) } // update modem lines status - if( acia->stat ) + if(acia->stat) acia->regs[ACIA_STATUS] = acia->stat(acia->regs[ACIA_STATUS]); else acia->regs[ACIA_STATUS] |= (ASTF_CARRIER|ASTF_DSR); } -void acia_write( struct acia *acia, Uint16 addr, Uint8 data ) +void acia_write(struct acia *acia, Uint16 addr, Uint8 data) { #if DEBUG_ACIA - dbg_printf( "ACIA write: (%04X) %02X to %s", acia->oric->cpu.pc-1, data, writereg_names[addr&3] ); + dbg_printf("ACIA write: (%04X) %02X to %s", acia->oric->cpu.pc-1, data, writereg_names[addr&3]); #endif - switch( addr & 3 ) + switch(addr & 3) { case ACIA_RXDATA: // Data for TX acia->regs[ACIA_TXDATA] = data & acia->bitmask; @@ -229,47 +238,47 @@ void acia_write( struct acia *acia, Uint16 addr, Uint8 data ) acia->regs[ACIA_COMMAND] &= ACOMF_PARITY; acia->regs[ACIA_COMMAND] |= ACOMF_IRQDIS; acia->regs[ACIA_STATUS] &= ~(ASTF_OVRUNERR); - acia_update_params( acia ); + acia_update_params(acia); break; case ACIA_COMMAND: acia->regs[ACIA_COMMAND] = data; - acia_update_params( acia ); + acia_update_params(acia); #if DEBUG_ACIA - dbg_printf( " Parity = %s", parity_modes[data>>5] ); - dbg_printf( " RX Mode = %s", (data&ACOMF_ECHO) ? "ECHO" : "NORMAL" ); - dbg_printf( " TXCon = %s", txcon_modes[(data&ACOMF_TXCON)>>2] ); - dbg_printf( " IRQ = %s", (data&ACOMF_IRQDIS) ? "OFF" : "ON" ); - dbg_printf( " DTR = %s", (data&ACOMF_DTR) ? "ON" : "OFF" ); + dbg_printf(" Parity = %s", parity_modes[data>>5]); + dbg_printf(" RX Mode = %s", (data&ACOMF_ECHO) ? "ECHO" : "NORMAL"); + dbg_printf(" TXCon = %s", txcon_modes[(data&ACOMF_TXCON)>>2]); + dbg_printf(" IRQ = %s", (data&ACOMF_IRQDIS) ? "OFF" : "ON"); + dbg_printf(" DTR = %s", (data&ACOMF_DTR) ? "ON" : "OFF"); #endif break; case ACIA_CONTROL: acia->regs[ACIA_CONTROL] = data; - acia_update_params( acia ); + acia_update_params(acia); #if DEBUG_ACIA - dbg_printf( " Baud = %s", baud_rates[data&ACONF_BAUD] ); - dbg_printf( " RXClock = %s", (data&ACONF_SRC) ? "INT" : "EXT" ); - dbg_printf( " Bits = %s", bit_nums[(data&ACONF_WLEN)>>5] ); - dbg_printf( " Stopbits = %d", (data&ACONF_STOPB) ? 2 : 1 ); + dbg_printf(" Baud = %s", baud_rates[data&ACONF_BAUD]); + dbg_printf(" RXClock = %s", (data&ACONF_SRC) ? "INT" : "EXT"); + dbg_printf(" Bits = %s", bit_nums[(data&ACONF_WLEN)>>5]); + dbg_printf(" Stopbits = %d", (data&ACONF_STOPB) ? 2 : 1); #endif break; } } -Uint8 acia_read( struct acia *acia, Uint16 addr ) +Uint8 acia_read(struct acia *acia, Uint16 addr) { Uint8 data = acia->regs[addr&3]; - switch( addr & 3 ) + switch(addr & 3) { case ACIA_RXDATA: #if DEBUG_ACIA - dbg_printf( "ACIA read: (%04X) from %s (=%02X)", acia->oric->cpu.pc-1, readreg_names[addr&3], data ); + dbg_printf("ACIA read: (%04X) from %s (=%02X)", acia->oric->cpu.pc-1, readreg_names[addr&3], data); #endif - acia->get_byte( &data ); + acia->get_byte(&data); data &= acia->bitmask; acia->regs[ACIA_RXDATA] = data; acia->regs[ACIA_STATUS] &= ~(ASTF_PARITYERR|ASTF_FRAMEERR|ASTF_OVRUNERR); @@ -278,7 +287,7 @@ Uint8 acia_read( struct acia *acia, Uint16 addr ) case ACIA_STATUS: #if DEBUG_ACIA_STATUS - dbg_printf( "ACIA read: (%04X) from %s (=%02X)", acia->oric->cpu.pc-1, readreg_names[addr&3], data ); + dbg_printf("ACIA read: (%04X) from %s (=%02X)", acia->oric->cpu.pc-1, readreg_names[addr&3], data); #endif // clear IRQ flag acia->regs[ACIA_STATUS] &= ~(ASTF_IRQ); @@ -287,7 +296,7 @@ Uint8 acia_read( struct acia *acia, Uint16 addr ) default: #if DEBUG_ACIA - dbg_printf( "ACIA read: (%04X) from %s (=%02X)", acia->oric->cpu.pc-1, readreg_names[addr&3], data ); + dbg_printf("ACIA read: (%04X) from %s (=%02X)", acia->oric->cpu.pc-1, readreg_names[addr&3], data); #endif break; } @@ -296,7 +305,7 @@ Uint8 acia_read( struct acia *acia, Uint16 addr ) } // none - fake back-end, no api function will be called -SDL_bool acia_init_none( struct acia *acia ) +SDL_bool acia_init_none(struct acia *acia) { acia->done = NULL; acia->stat = NULL; diff --git a/6551.h b/6551.h index 0051a79d..8bd7b814 100644 --- a/6551.h +++ b/6551.h @@ -126,25 +126,25 @@ struct acia SDL_bool echo; // back-end api functions - Uint8 (*stat)(Uint8 stat); - SDL_bool (*has_byte)(Uint8* data); - SDL_bool (*get_byte)(Uint8* data); - SDL_bool (*put_byte)(Uint8 data); + Uint8(*stat)(Uint8 stat); + SDL_bool(*has_byte)(Uint8* data); + SDL_bool(*get_byte)(Uint8* data); + SDL_bool(*put_byte)(Uint8 data); void (*done)(struct acia* acia); }; -void acia_init( struct acia *acia, struct machine *oric ); -void acia_clock( struct acia *acia, unsigned int cycles ); -void acia_write( struct acia *acia, Uint16 addr, Uint8 data ); -Uint8 acia_read( struct acia *acia, Uint16 addr ); +void acia_init(struct acia *acia, struct machine *oric); +void acia_clock(struct acia *acia, unsigned int cycles); +void acia_write(struct acia *acia, Uint16 addr, Uint8 data); +Uint8 acia_read(struct acia *acia, Uint16 addr); // Back-end init functions -SDL_bool acia_init_none( struct acia* acia ); -SDL_bool acia_init_loopback( struct acia* acia ); +SDL_bool acia_init_none(struct acia* acia); +SDL_bool acia_init_loopback(struct acia* acia); #ifdef BACKEND_MODEM -SDL_bool acia_init_modem( struct acia* acia ); +SDL_bool acia_init_modem(struct acia* acia); #endif #ifdef BACKEND_COM -SDL_bool acia_init_com( struct acia* acia ); +SDL_bool acia_init_com(struct acia* acia); #endif diff --git a/6551_com.c b/6551_com.c index bd2b8d94..b88e86c4 100644 --- a/6551_com.c +++ b/6551_com.c @@ -47,10 +47,10 @@ static SDL_bool com_write(Uint8 data); static SDL_bool com_read(Uint8* data); static SDL_bool com_peek(Uint8* data); -static void com_done( struct acia* acia ) +static void com_done(struct acia* acia) { com_close(); - acia_init_none( acia ); + acia_init_none(acia); } static Uint8 com_stat(Uint8 stat) @@ -73,7 +73,7 @@ static SDL_bool com_put_byte(Uint8 data) return com_write(data); } -SDL_bool acia_init_com( struct acia* acia ) +SDL_bool acia_init_com(struct acia* acia) { oric = acia->oric; @@ -85,7 +85,7 @@ SDL_bool acia_init_com( struct acia* acia ) if(5 == sscanf(oric->aciabackendname, "com:%d,%d,%c,%d,%s", - &com_baudrate, &com_bits, &com_parity, &com_stopbits, com_name)) + &com_baudrate, &com_bits, &com_parity, &com_stopbits, com_name)) { //printf("com: %d, %d, %c, %d, %s\n", com_baudrate, com_bits, com_parity, com_stopbits, com_name); if(com_validate_param()) @@ -99,7 +99,7 @@ SDL_bool acia_init_com( struct acia* acia ) } // fall-back to none - acia_init_none( acia ); + acia_init_none(acia); return SDL_FALSE; } @@ -129,51 +129,99 @@ static SDL_bool com_validate_param(void) com_param = 0; switch(com_baudrate) { - case 50: com_param = B50; break; - case 75: com_param = B75; break; - case 110: com_param = B110; break; - case 134: com_param = B134; break; - case 150: com_param = B150; break; - case 300: com_param = B300; break; - case 600: com_param = B600; break; - case 1200: com_param = B1200; break; - case 1800: com_param = B1800; break; - case 2400: com_param = B2400; break; -// case 3600: com_param = B3600; break; - case 4800: com_param = B4800; break; -// case 7200: com_param = B7200; break; - case 9600: com_param = B9600; break; - case 19200: com_param = B19200; break; - case 38400: com_param = B38400; break; - case 57600: com_param = B57600; break; - case 115200: com_param = B115200; break; + case 50: + com_param = B50; + break; + case 75: + com_param = B75; + break; + case 110: + com_param = B110; + break; + case 134: + com_param = B134; + break; + case 150: + com_param = B150; + break; + case 300: + com_param = B300; + break; + case 600: + com_param = B600; + break; + case 1200: + com_param = B1200; + break; + case 1800: + com_param = B1800; + break; + case 2400: + com_param = B2400; + break; + // case 3600: com_param = B3600; break; + case 4800: + com_param = B4800; + break; + // case 7200: com_param = B7200; break; + case 9600: + com_param = B9600; + break; + case 19200: + com_param = B19200; + break; + case 38400: + com_param = B38400; + break; + case 57600: + com_param = B57600; + break; + case 115200: + com_param = B115200; + break; default: return SDL_FALSE; } switch(com_bits) { - case 5: com_param |= CS5; break; - case 6: com_param |= CS6; break; - case 7: com_param |= CS7; break; - case 8: com_param |= CS8; break; + case 5: + com_param |= CS5; + break; + case 6: + com_param |= CS6; + break; + case 7: + com_param |= CS7; + break; + case 8: + com_param |= CS8; + break; default: return SDL_FALSE; } switch(tolower(com_parity)) { - case 'n': /* */ break; - case 'o': com_param |= PARENB|PARODD; break; - case 'e': com_param |= PARENB; break; + case 'n': /* */ + break; + case 'o': + com_param |= PARENB|PARODD; + break; + case 'e': + com_param |= PARENB; + break; default: return SDL_FALSE; } switch(com_stopbits) { - case 2: com_param |= CSTOPB; break; - case 1: /* */ break; + case 2: + com_param |= CSTOPB; + break; + case 1: /* */ + break; default: return SDL_FALSE; } @@ -189,7 +237,7 @@ static SDL_bool com_open(void) com_fifo = 0; com_fd = open(com_name, O_RDWR | O_NOCTTY | O_NDELAY); - if( -1 == com_fd ) + if(-1 == com_fd) { //printf("open failed\n"); return SDL_FALSE; @@ -206,17 +254,17 @@ static SDL_bool com_open(void) static SDL_bool com_close(void) { - if( -1 != com_fd ) - close( com_fd ); + if(-1 != com_fd) + close(com_fd); com_fd = -1; return SDL_TRUE; } static SDL_bool com_write(Uint8 data) { - if( -1 != com_fd ) + if(-1 != com_fd) { - if( 0 < write(com_fd, &data, 1) ) + if(0 < write(com_fd, &data, 1)) return SDL_TRUE; } return SDL_FALSE; @@ -224,13 +272,13 @@ static SDL_bool com_write(Uint8 data) static void com_fill_fifo(void) { - if( com_fifo < COM_FIFO_SIZE ) + if(com_fifo < COM_FIFO_SIZE) { int len = 0; - if( -1 != ioctl(com_fd, FIONREAD, &len) ) + if(-1 != ioctl(com_fd, FIONREAD, &len)) { len = min(len, COM_FIFO_SIZE - com_fifo); - len = (int)read( com_fd, com_fifo_buf + com_fifo, len); + len = (int)read(com_fd, com_fifo_buf + com_fifo, len); com_fifo += len; } } @@ -238,11 +286,11 @@ static void com_fill_fifo(void) static SDL_bool com_read(Uint8* data) { - if( -1 != com_fd ) + if(-1 != com_fd) { com_fill_fifo(); - if( 0 < com_fifo ) + if(0 < com_fifo) { *data = com_fifo_buf[0]; memmove(com_fifo_buf, com_fifo_buf+1, --com_fifo); @@ -254,11 +302,11 @@ static SDL_bool com_read(Uint8* data) static SDL_bool com_peek(Uint8* data) { - if( -1 != com_fd ) + if(-1 != com_fd) { com_fill_fifo(); - if( 0 < com_fifo ) + if(0 < com_fifo) { *data = com_fifo_buf[0]; return SDL_TRUE; @@ -289,24 +337,46 @@ static SDL_bool com_validate_param(void) memset(&com_dcb, 0, sizeof(com_dcb)); switch(com_baudrate) { -// case 50: com_dcb.BaudRate = CBR_50; break; -// case 75: com_dcb.BaudRate = CBR_75; break; - case 110: com_dcb.BaudRate = CBR_110; break; -// case 134: com_dcb.BaudRate = CBR_134; break; -// case 150: com_dcb.BaudRate = CBR_150; break; - case 300: com_dcb.BaudRate = CBR_300; break; - case 600: com_dcb.BaudRate = CBR_600; break; - case 1200: com_dcb.BaudRate = CBR_1200; break; -// case 1800: com_dcb.BaudRate = CBR_1800; break; - case 2400: com_dcb.BaudRate = CBR_2400; break; -// case 3600: com_dcb.BaudRate = CBR_3600; break; - case 4800: com_dcb.BaudRate = CBR_4800; break; -// case 7200: com_dcb.BaudRate = CBR_7200; break; - case 9600: com_dcb.BaudRate = CBR_9600; break; - case 19200: com_dcb.BaudRate = CBR_19200; break; - case 38400: com_dcb.BaudRate = CBR_38400; break; - case 57600: com_dcb.BaudRate = CBR_57600; break; - case 115200: com_dcb.BaudRate = CBR_115200; break; + // case 50: com_dcb.BaudRate = CBR_50; break; + // case 75: com_dcb.BaudRate = CBR_75; break; + case 110: + com_dcb.BaudRate = CBR_110; + break; + // case 134: com_dcb.BaudRate = CBR_134; break; + // case 150: com_dcb.BaudRate = CBR_150; break; + case 300: + com_dcb.BaudRate = CBR_300; + break; + case 600: + com_dcb.BaudRate = CBR_600; + break; + case 1200: + com_dcb.BaudRate = CBR_1200; + break; + // case 1800: com_dcb.BaudRate = CBR_1800; break; + case 2400: + com_dcb.BaudRate = CBR_2400; + break; + // case 3600: com_dcb.BaudRate = CBR_3600; break; + case 4800: + com_dcb.BaudRate = CBR_4800; + break; + // case 7200: com_dcb.BaudRate = CBR_7200; break; + case 9600: + com_dcb.BaudRate = CBR_9600; + break; + case 19200: + com_dcb.BaudRate = CBR_19200; + break; + case 38400: + com_dcb.BaudRate = CBR_38400; + break; + case 57600: + com_dcb.BaudRate = CBR_57600; + break; + case 115200: + com_dcb.BaudRate = CBR_115200; + break; default: return SDL_FALSE; } @@ -316,24 +386,39 @@ static SDL_bool com_validate_param(void) case 5: case 6: case 7: - case 8: com_dcb.ByteSize = com_bits; break; + case 8: + com_dcb.ByteSize = com_bits; + break; default: return SDL_FALSE; } switch(tolower(com_parity)) { - case 'n': com_dcb.fParity = 0; com_dcb.Parity = 0; break; - case 'o': com_dcb.fParity = 1; com_dcb.Parity = 1; break; - case 'e': com_dcb.fParity = 1; com_dcb.Parity = 2; break; + case 'n': + com_dcb.fParity = 0; + com_dcb.Parity = 0; + break; + case 'o': + com_dcb.fParity = 1; + com_dcb.Parity = 1; + break; + case 'e': + com_dcb.fParity = 1; + com_dcb.Parity = 2; + break; default: return SDL_FALSE; } switch(com_stopbits) { - case 2: com_dcb.StopBits = 2; break; - case 1: com_dcb.StopBits = 0; break; + case 2: + com_dcb.StopBits = 2; + break; + case 1: + com_dcb.StopBits = 0; + break; default: return SDL_FALSE; } @@ -347,10 +432,10 @@ static SDL_bool com_open(void) COMMTIMEOUTS com_timeouts; com_fd = CreateFile(com_name, GENERIC_READ|GENERIC_WRITE, 0,0, OPEN_EXISTING, 0,0); - if ( INVALID_HANDLE_VALUE == com_fd ) + if(INVALID_HANDLE_VALUE == com_fd) return SDL_FALSE; - if (!GetCommState(com_fd, &dcb) ) + if(!GetCommState(com_fd, &dcb)) { com_close(); return SDL_FALSE; @@ -369,7 +454,7 @@ static SDL_bool com_open(void) memmove(&com_dcb, &dcb, sizeof(com_dcb)); - if (!SetCommState(com_fd, &com_dcb) ) + if(!SetCommState(com_fd, &com_dcb)) { com_close(); return SDL_FALSE; @@ -380,25 +465,25 @@ static SDL_bool com_open(void) com_timeouts.ReadTotalTimeoutMultiplier=0; com_timeouts.WriteTotalTimeoutConstant=0; com_timeouts.WriteTotalTimeoutMultiplier=0; - SetCommTimeouts( com_fd, &com_timeouts ); + SetCommTimeouts(com_fd, &com_timeouts); return SDL_TRUE; } static SDL_bool com_close(void) { - if ( INVALID_HANDLE_VALUE != com_fd ) - CloseHandle( com_fd ); + if(INVALID_HANDLE_VALUE != com_fd) + CloseHandle(com_fd); com_fd = INVALID_HANDLE_VALUE; return SDL_TRUE; } static SDL_bool com_write(Uint8 data) { - if( INVALID_HANDLE_VALUE != com_fd ) + if(INVALID_HANDLE_VALUE != com_fd) { DWORD len = 0; - if( 0 < WriteFile( com_fd, &data, 1, &len, NULL) ) + if(0 < WriteFile(com_fd, &data, 1, &len, NULL)) return SDL_TRUE; } return SDL_FALSE; @@ -406,15 +491,15 @@ static SDL_bool com_write(Uint8 data) static void com_fill_fifo(void) { - if( com_fifo < COM_FIFO_SIZE ) + if(com_fifo < COM_FIFO_SIZE) { DWORD err; COMSTAT com_st; - ClearCommError( com_fd, &err, &com_st ); - if( 0 < (int) com_st.cbInQue ) + ClearCommError(com_fd, &err, &com_st); + if(0 < (int) com_st.cbInQue) { - DWORD len = min( com_st.cbInQue, COM_FIFO_SIZE - com_fifo ); - if( 0 < ReadFile( com_fd, com_fifo_buf + com_fifo, len, &len, NULL) ) + DWORD len = min(com_st.cbInQue, COM_FIFO_SIZE - com_fifo); + if(0 < ReadFile(com_fd, com_fifo_buf + com_fifo, len, &len, NULL)) { com_fifo += len; } @@ -424,11 +509,11 @@ static void com_fill_fifo(void) static SDL_bool com_read(Uint8* data) { - if( INVALID_HANDLE_VALUE != com_fd ) + if(INVALID_HANDLE_VALUE != com_fd) { com_fill_fifo(); - if( 0 < com_fifo ) + if(0 < com_fifo) { *data = com_fifo_buf[0]; memmove(com_fifo_buf, com_fifo_buf+1, com_fifo-1); @@ -441,11 +526,11 @@ static SDL_bool com_read(Uint8* data) static SDL_bool com_peek(Uint8* data) { - if( INVALID_HANDLE_VALUE != com_fd ) + if(INVALID_HANDLE_VALUE != com_fd) { com_fill_fifo(); - if( 0 < com_fifo ) + if(0 < com_fifo) { *data = com_fifo_buf[0]; return SDL_TRUE; diff --git a/6551_loopback.c b/6551_loopback.c index 4ca15585..46a3dff0 100644 --- a/6551_loopback.c +++ b/6551_loopback.c @@ -34,9 +34,9 @@ static Uint8 loopback_buf[LOOPBACK_BUF_SIZE]; static int loopback_in = 0; static int loopback_out = 0; -static void loopback_done( struct acia* acia ) +static void loopback_done(struct acia* acia) { - acia_init_none( acia ); + acia_init_none(acia); } static Uint8 loopback_stat(Uint8 stat) @@ -87,7 +87,7 @@ static SDL_bool loopback_put_byte(Uint8 data) return SDL_TRUE; } -SDL_bool acia_init_loopback( struct acia* acia ) +SDL_bool acia_init_loopback(struct acia* acia) { loopback_in = 0; loopback_out = 0; @@ -96,7 +96,7 @@ SDL_bool acia_init_loopback( struct acia* acia ) acia->has_byte = loopback_has_byte; acia->get_byte = loopback_get_byte; acia->put_byte = loopback_put_byte; - + acia->oric->aciabackend = ACIA_TYPE_LOOPBACK; return SDL_TRUE; } diff --git a/6551_modem.c b/6551_modem.c index 519c951d..d8cb66bf 100644 --- a/6551_modem.c +++ b/6551_modem.c @@ -136,7 +136,7 @@ static void mdm_hangup(void) static void mdm_answeroff(void) { - if( listening ) + if(listening) { listening = SDL_FALSE; socket_close(srv_sck); @@ -146,11 +146,11 @@ static void mdm_answeroff(void) static void mdm_answeron(void) { - if( !listening ) + if(!listening) { if(socket_create(&srv_sck, oric->aciabackendcfgdomain) && - socket_bind(srv_sck, oric->aciabackendcfgport, oric->aciabackendcfgdomain) && - socket_listen(srv_sck)) + socket_bind(srv_sck, oric->aciabackendcfgport, oric->aciabackendcfgdomain) && + socket_listen(srv_sck)) listening = SDL_TRUE; } } @@ -173,7 +173,7 @@ static void mdm_connect(const char* s) // default telnet port if(port == 0) port = ACIA_TYPE_MODEM_DEFAULT_PORT; - if( socket_create(&cnt_sck, oric->aciabackendcfgdomain) ) + if(socket_create(&cnt_sck, oric->aciabackendcfgdomain)) { if(socket_connect(cnt_sck, ip, port, oric->aciabackendcfgdomain)) { @@ -195,7 +195,7 @@ static void parse_command(const char* s) if(!s) return; - if( escaped ) + if(escaped) { if('\0' == s[0]) send_responce(""); @@ -227,7 +227,7 @@ static void parse_command(const char* s) else if(!strcasecmp("ATA", s)) { mdm_answeron(); - if( !listening ) + if(!listening) send_responce_error(); else send_responce("AUTOANSWER ON"); @@ -241,7 +241,7 @@ static void parse_command(const char* s) if(0oric; @@ -467,7 +467,7 @@ SDL_bool acia_init_modem( struct acia* acia ) } // fall-back to none - acia_init_none( acia ); + acia_init_none(acia); return SDL_FALSE; } @@ -488,10 +488,10 @@ SDL_bool acia_init_modem( struct acia* acia ) #if defined(__MORPHOS__) struct Library *SocketBase; typedef LONG socklen_t; -char *inet_ntoa(struct in_addr n) +char* inet_ntoa(struct in_addr n) { static char a[sizeof "XXX.XXX.XXX.XXX"]; - char *p = (char *)&n; + char* p = (char*)&n; snprintf(a, sizeof a, "%d.%d.%d.%d", p[0]&0xff, p[1]&0xff, p[2]&0xff, p[3]&0xff); return a; @@ -529,12 +529,12 @@ static SDL_bool socket_init(void) { #ifdef WIN32 WSADATA wsadata; - if( (WSAStartup(MAKEWORD(2,2), &wsadata) == SOCKET_ERROR) || - (WSAStartup(MAKEWORD(1,1), &wsadata) == SOCKET_ERROR) ) + if((WSAStartup(MAKEWORD(2,2), &wsadata) == SOCKET_ERROR) || + (WSAStartup(MAKEWORD(1,1), &wsadata) == SOCKET_ERROR)) return SDL_FALSE; #endif #ifdef __MORPHOS__ - if( !(SocketBase = OldOpenLibrary("bsdsocket.library")) ) + if(!(SocketBase = OldOpenLibrary("bsdsocket.library"))) return SDL_FALSE; #endif } @@ -548,7 +548,7 @@ static void socket_done(void) WSACleanup(); #endif #ifdef __MORPHOS__ - if( SocketBase ) + if(SocketBase) CloseLibrary(SocketBase); #endif } @@ -559,7 +559,7 @@ static int socket_create(int* sock, int domain) #if defined(__amigaos4__) || defined(__MORPHOS__) domain = AF_INET; #else - if (domain == 6) + if(domain == 6) domain = AF_INET6; else domain = AF_INET; @@ -591,18 +591,19 @@ static int socket_bind(int sock, int port, int domain) srv_addr.sin_addr.s_addr = htonl(INADDR_ANY); srv_addr.sin_port = htons(port); - if(bind(sock, (struct sockaddr*) &srv_addr, sizeof(srv_addr)) == -1) { + if(bind(sock, (struct sockaddr*) &srv_addr, sizeof(srv_addr)) == -1) + { perror("socket_bind, bind error: "); return 0; } #else - struct addrinfo hints, *res, *ressave; + struct addrinfo hints, *res, *ressave; char service[NI_MAXSERV]; int n; memset(&hints, 0, sizeof(hints)); hints.ai_flags = AI_PASSIVE; - if (domain == 6) + if(domain == 6) hints.ai_family = AF_INET6; else hints.ai_family = AF_INET; @@ -610,21 +611,25 @@ static int socket_bind(int sock, int port, int domain) sprintf(service, "%d", port); - if ( (n = getaddrinfo(NULL, service, &hints, &res)) != 0) { + if((n = getaddrinfo(NULL, service, &hints, &res)) != 0) + { fprintf(stderr, "socket_bind, getaddrinfo error: %s\n", gai_strerror(n)); return 0; } ressave = res; // loop through all the addresses that we got - do { - if (bind(sock, res->ai_addr, res->ai_addrlen) == 0) - break; /* success */ - } while ( (res = res->ai_next) != NULL); + do + { + if(bind(sock, res->ai_addr, res->ai_addrlen) == 0) + break; /* success */ + } + while((res = res->ai_next) != NULL); freeaddrinfo(ressave); - if (res == NULL) { + if(res == NULL) + { perror("socket_bind, bind error: "); return 0; } @@ -698,11 +703,11 @@ static int socket_read(int sock, unsigned char* data, int* len) #ifdef NO_GETADDRINFO static void hostname_to_ip(const char* host, char* ip, int len) { - struct hostent *he = gethostbyname( (unsigned char*)host ); - if( NULL != he ) + struct hostent *he = gethostbyname((unsigned char*)host); + if(NULL != he) { struct in_addr **addr_list = (struct in_addr **) he->h_addr_list; - if( NULL != addr_list[0] ) + if(NULL != addr_list[0]) { strncpy(ip, inet_ntoa(*addr_list[0]), len); return; @@ -723,17 +728,18 @@ static int socket_connect(int sock, const char* host, int port, int domain) hostname_to_ip(host, ip, 64); addr.sin_addr.s_addr = inet_addr((unsigned char*)ip); - if(connect(sock, (struct sockaddr*) &addr, sizeof(addr)) != 0) { + if(connect(sock, (struct sockaddr*) &addr, sizeof(addr)) != 0) + { perror("socket_connect, connect error: "); return 0; } #else - struct addrinfo hints, *res, *ressave; + struct addrinfo hints, *res, *ressave; char service[NI_MAXSERV]; int n; memset(&hints, 0, sizeof(hints)); - if (domain == 6) + if(domain == 6) hints.ai_family = AF_INET6; else hints.ai_family = AF_INET; @@ -741,21 +747,25 @@ static int socket_connect(int sock, const char* host, int port, int domain) sprintf(service, "%d", port); - if ( (n = getaddrinfo(host, service, &hints, &res)) != 0) { + if((n = getaddrinfo(host, service, &hints, &res)) != 0) + { fprintf(stderr, "socket_connect, getaddrinfo error: %s\n", gai_strerror(n)); return 0; } ressave = res; // loop through all the addresses that we got - do { - if (connect(sock, res->ai_addr, res->ai_addrlen) == 0) - break; /* success */ - } while ( (res = res->ai_next) != NULL); + do + { + if(connect(sock, res->ai_addr, res->ai_addrlen) == 0) + break; /* success */ + } + while((res = res->ai_next) != NULL); freeaddrinfo(ressave); - if (res == NULL) { + if(res == NULL) + { perror("socket_bind, connect error: "); return 0; } diff --git a/8912.c b/8912.c index af285cfb..4e609fed 100644 --- a/8912.c +++ b/8912.c @@ -54,7 +54,7 @@ extern SDL_bool soundavailable, soundon, warpspeed; // Variables used by the queuekeys function // (only works for ROM routines) -static char *keyqueue = NULL; +static char* keyqueue = NULL; static int keysqueued = 0, kqoffs = 0; // Volume levels @@ -72,7 +72,7 @@ unsigned char eshapeC[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15, 128 unsigned char eshapeD[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15, 128+15 }; unsigned char eshapeE[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 128+0 }; -unsigned char *eshapes[] = { eshape0, // 0000 +unsigned char* eshapes[] = { eshape0, // 0000 eshape0, // 0001 eshape0, // 0010 eshape0, // 0011 @@ -87,50 +87,54 @@ unsigned char *eshapes[] = { eshape0, // 0000 eshapeC, // 1100 eshapeD, // 1101 eshapeE, // 1110 - eshape4 };//1111 + eshape4 + };//1111 static SDL_COMPAT_KEY *keytab; // Oric keymap (QWERTY) // FE FD FB F7 EF DF BF 7F -static SDL_COMPAT_KEY qwktab[] = { '7' , 'n' , '5' , 'v' , SDLK_RCTRL , '1' , 'x' , '3' , - 'j' , 't' , 'r' , 'f' , 0 , SDLK_ESCAPE, 'q' , 'd' , - 'm' , '6' , 'b' , '4' , SDLK_LCTRL , 'z' , '2' , 'c' , - 'k' , '9' , ';' , '-' , '#' , 0 , '\\' , '\'' , - SDLK_SPACE , ',' , '.' , SDLK_UP , SDLK_LSHIFT, SDLK_LEFT , SDLK_DOWN , SDLK_RIGHT , - 'u' , 'i' , 'o' , 'p' , SDLK_LALT , SDLK_BACKSPACE, ']' , '[' , - 'y' , 'h' , 'g' , 'e' , SDLK_RALT , 'a' , 's' , 'w' , - '8' , 'l' , '0' , '/' , SDLK_RSHIFT, SDLK_RETURN, '`' , SDLK_EQUALS }; +static SDL_COMPAT_KEY qwktab[] = { '7', 'n', '5', 'v', SDLK_RCTRL, '1', 'x', '3', + 'j', 't', 'r', 'f', 0, SDLK_ESCAPE, 'q', 'd', + 'm', '6', 'b', '4', SDLK_LCTRL, 'z', '2', 'c', + 'k', '9', ';', '-', '#', 0, '\\', '\'', + SDLK_SPACE, ',', '.', SDLK_UP, SDLK_LSHIFT, SDLK_LEFT, SDLK_DOWN, SDLK_RIGHT, + 'u', 'i', 'o', 'p', SDLK_LALT, SDLK_BACKSPACE, ']', '[', + 'y', 'h', 'g', 'e', SDLK_RALT, 'a', 's', 'w', + '8', 'l', '0', '/', SDLK_RSHIFT, SDLK_RETURN, '`', SDLK_EQUALS + }; // AZERTY -static SDL_COMPAT_KEY azktab[] = { '7' , 'n' , '5' , 'v' , SDLK_RCTRL , '1' , 'x' , '3' , - 'j' , 't' , 'r' , 'f' , 0 , SDLK_ESCAPE, 'a' , 'd' , - 'm' , '6' , 'b' , '4' , SDLK_LCTRL , 'w' , '2' , 'c' , - 'k' , '9' , ';' , '-' , '#' , 0 , '\\' , '\'' , - SDLK_SPACE , ',' , '.' , SDLK_UP , SDLK_LSHIFT, SDLK_LEFT , SDLK_DOWN , SDLK_RIGHT , - 'u' , 'i' , 'o' , 'p' , SDLK_LALT , SDLK_BACKSPACE, ']' , '[' , - 'y' , 'h' , 'g' , 'e' , SDLK_RALT , 'q' , 's' , 'z' , - '8' , 'l' , '0' , '/' , SDLK_RSHIFT, SDLK_RETURN, '`' , SDLK_EQUALS }; +static SDL_COMPAT_KEY azktab[] = { '7', 'n', '5', 'v', SDLK_RCTRL, '1', 'x', '3', + 'j', 't', 'r', 'f', 0, SDLK_ESCAPE, 'a', 'd', + 'm', '6', 'b', '4', SDLK_LCTRL, 'w', '2', 'c', + 'k', '9', ';', '-', '#', 0, '\\', '\'', + SDLK_SPACE, ',', '.', SDLK_UP, SDLK_LSHIFT, SDLK_LEFT, SDLK_DOWN, SDLK_RIGHT, + 'u', 'i', 'o', 'p', SDLK_LALT, SDLK_BACKSPACE, ']', '[', + 'y', 'h', 'g', 'e', SDLK_RALT, 'q', 's', 'z', + '8', 'l', '0', '/', SDLK_RSHIFT, SDLK_RETURN, '`', SDLK_EQUALS + }; // QWERTZ -static SDL_COMPAT_KEY qzktab[] = { '7' , 'n' , '5' , 'v' , SDLK_RCTRL , '1' , 'x' , '3' , - 'j' , 't' , 'r' , 'f' , 0 , SDLK_ESCAPE, 'q' , 'd' , - 'm' , '6' , 'b' , '4' , SDLK_LCTRL , 'y' , '2' , 'c' , - 'k' , '9' , ';' , '-' , '#' , 0 , '\\' , '\'' , - SDLK_SPACE , ',' , '.' , SDLK_UP , SDLK_LSHIFT, SDLK_LEFT , SDLK_DOWN , SDLK_RIGHT , - 'u' , 'i' , 'o' , 'p' , SDLK_LALT , SDLK_BACKSPACE, ']' , '[' , - 'z' , 'h' , 'g' , 'e' , SDLK_RALT , 'a' , 's' , 'w' , - '8' , 'l' , '0' , '/' , SDLK_RSHIFT, SDLK_RETURN, '`' , SDLK_EQUALS }; +static SDL_COMPAT_KEY qzktab[] = { '7', 'n', '5', 'v', SDLK_RCTRL, '1', 'x', '3', + 'j', 't', 'r', 'f', 0, SDLK_ESCAPE, 'q', 'd', + 'm', '6', 'b', '4', SDLK_LCTRL, 'y', '2', 'c', + 'k', '9', ';', '-', '#', 0, '\\', '\'', + SDLK_SPACE, ',', '.', SDLK_UP, SDLK_LSHIFT, SDLK_LEFT, SDLK_DOWN, SDLK_RIGHT, + 'u', 'i', 'o', 'p', SDLK_LALT, SDLK_BACKSPACE, ']', '[', + 'z', 'h', 'g', 'e', SDLK_RALT, 'a', 's', 'w', + '8', 'l', '0', '/', SDLK_RSHIFT, SDLK_RETURN, '`', SDLK_EQUALS + }; // Queue up some key presses. These key presses // are only detected by the standard ROM routines. -void queuekeys( char *str ) +void queuekeys(char* str) { - if( str ) + if(str) { - int len = (int)strlen( str ); - if( keyqueue ) + int len = (int)strlen(str); + if(keyqueue) { keyqueue = realloc(keyqueue, strlen(keyqueue) + len + 1); strcat(keyqueue, str); @@ -138,7 +142,7 @@ void queuekeys( char *str ) } else { - keyqueue = strdup( str ); + keyqueue = strdup(str); keysqueued = len; kqoffs = 0; } @@ -148,26 +152,26 @@ void queuekeys( char *str ) /* ** RNG for the AY noise generator */ -static Uint32 ayrand( struct ay8912 *ay ) +static Uint32 ayrand(struct ay8912 *ay) { Uint32 rbit = (ay->rndrack&1) ^ ((ay->rndrack>>2)&1); ay->rndrack = (ay->rndrack>>1)|(rbit<<16); return rbit&1; } -void ay_audioticktock( struct ay8912 *ay, Uint32 cycles ) +void ay_audioticktock(struct ay8912 *ay, Uint32 cycles) { Sint32 t, i, sum = 0; Sint32 output; // For each clock cycle... - for( t=0; tctn) >= ay->noiseper ) + if((++ay->ctn) >= ay->noiseper) { // Noise counter expired, calculate the next noise output level - ay->currnoise ^= ayrand( ay ); + ay->currnoise ^= ayrand(ay); // Reset the noise counter ay->ctn = 0; @@ -177,11 +181,11 @@ void ay_audioticktock( struct ay8912 *ay, Uint32 cycles ) } // For each audio channel... - for( i=0; i<3; i++ ) + for(i=0; i<3; i++) { - if( !ay->toneper[i] ) + if(!ay->toneper[i]) { - if( !ay->sign[i] ) + if(!ay->sign[i]) { ay->sign[i] = 1; ay->newout |= (1<ct[i]) >= ay->toneper[i] ) + if((++ay->ct[i]) >= ay->toneper[i]) { // Square wave counter expired, reset it... ay->ct[i] = 0; @@ -204,12 +208,12 @@ void ay_audioticktock( struct ay8912 *ay, Uint32 cycles ) // If this channel is mixed with noise, and the noise changed, // then so did this channel. - if( ( ay->newnoise ) && ( !ay->noisebit[i] ) ) + if((ay->newnoise) && (!ay->noisebit[i])) ay->newout |= (1<cte) >= ay->envper ) + if((++ay->cte) >= ay->envper) { // Counter expired, so reset it ay->cte = 0; @@ -218,14 +222,14 @@ void ay_audioticktock( struct ay8912 *ay, Uint32 cycles ) ay->envpos++; // Reached the end of the envelope? - if( ay->envtab[ay->envpos]&0x80 ) + if(ay->envtab[ay->envpos]&0x80) ay->envpos = ay->envtab[ay->envpos]&0x7f; // For each channel... - for( i=0; i<3; i++ ) + for(i=0; i<3; i++) { // If the channel is using the envelope generator... - if( ay->regs[AY_CHA_AMP+i]&0x10 ) + if(ay->regs[AY_CHA_AMP+i]&0x10) { // Recalculate its output volume ay->vol[i] = voltab[ay->envtab[ay->envpos]]; @@ -237,10 +241,10 @@ void ay_audioticktock( struct ay8912 *ay, Uint32 cycles ) } // Loop through the channels - for( i=0; i<3; i++ ) + for(i=0; i<3; i++) { // Yep, calculate the squarewave signal... - if( ay->newout & (1<newout & (1<out[i] = ((ay->tonebit[i]|ay->sign[i])&(ay->noisebit[i]|ay->currnoise)) * ay->vol[i]; // Mix in the output of this channel @@ -249,22 +253,22 @@ void ay_audioticktock( struct ay8912 *ay, Uint32 cycles ) ay->newout = 0; } - if( !cycles ) return; // avoid div by zero + if(!cycles) return; // avoid div by zero // Reduce aliasing by averaging over the cycles in the sample interval output = soundsilence + sum/cycles; // Clamp the output - if( output > 32767 ) output = 32767; -// if( output < -32768 ) output = -32768; + if(output > 32767) output = 32767; + // if( output < -32768 ) output = -32768; ay->output = output; } -void ay_dowrite( struct ay8912 *ay, struct aywrite *aw ) +void ay_dowrite(struct ay8912 *ay, struct aywrite *aw) { Sint32 i; - switch( aw->reg ) + switch(aw->reg) { case AY_CHA_PER_L: // Channel A period case AY_CHA_PER_H: @@ -319,14 +323,14 @@ void ay_dowrite( struct ay8912 *ay, struct aywrite *aw ) break; case AY_ENV_CYCLE: - if( aw->val != 0xff ) + if(aw->val != 0xff) { ay->regs[aw->reg] = aw->val; ay->envtab = eshapes[aw->val&0xf]; ay->envpos = 0; - for( i=0; i<3; i++ ) + for(i=0; i<3; i++) { - if( ay->regs[AY_CHA_AMP+i]&0x10 ) + if(ay->regs[AY_CHA_AMP+i]&0x10) { ay->vol[i] = voltab[ay->envtab[ay->envpos]]; ay->newout |= (1<logged; i++) - ay_dowrite( ay, &ay->writelog[i] ); + for(i=0; ilogged; i++) + ay_dowrite(ay, &ay->writelog[i]); ay->logged = 0; } @@ -350,7 +354,7 @@ void ay_flushlog( struct ay8912 *ay ) ** This is the SDL audio callback. It is called by SDL ** when it needs a sound buffer to be filled. */ -void ay_callback( void *dummy, Sint8 *stream, int length ) +void ay_callback(void* dummy, Sint8 *stream, int length) { Uint16 *out; Sint16 fout; @@ -367,7 +371,7 @@ void ay_callback( void *dummy, Sint8 *stream, int length ) tapenoise = ay->soundloopon || (ay->oric->tapenoise && ((!ay->oric->tapeturbo)||(ay->oric->rawtape))); - if( !tapenoise ) ay->tapeout = 0; + if(!tapenoise) ay->tapeout = 0; out = (Uint16 *)stream; cvt.buf = (Uint8 *)stream; @@ -376,31 +380,31 @@ void ay_callback( void *dummy, Sint8 *stream, int length ) actual_length = (actual_length < AUDIO_BUFLEN)? actual_length : AUDIO_BUFLEN; actual_length = (actual_length < obtained.samples)? actual_length : obtained.samples; - for( i=0,j=0; iccyc = ay->ccycle>>FPBITS; - while( ( logc < ay->logged ) && ( ay->ccyc >= ay->writelog[logc].cycle ) ) - ay_dowrite( ay, &ay->writelog[logc++] ); + while((logc < ay->logged) && (ay->ccyc >= ay->writelog[logc].cycle)) + ay_dowrite(ay, &ay->writelog[logc++]); - if( tapenoise ) + if(tapenoise) { - while( ( tlogc < ay->tlogged ) && ( ay->ccyc >= ay->tapelog[tlogc].cycle ) ) + while((tlogc < ay->tlogged) && (ay->ccyc >= ay->tapelog[tlogc].cycle)) ay->tapeout = ay->tapelog[tlogc++].val * 8192; } - if( ay->ccyc > ay->lastcyc ) + if(ay->ccyc > ay->lastcyc) { - ay_audioticktock( ay, ay->ccyc-ay->lastcyc ); + ay_audioticktock(ay, ay->ccyc-ay->lastcyc); ay->lastcyc = ay->ccyc; } fout = ay->output + ay->tapeout; out[j++] = fout; out[j++] = fout; - if( vidcap ) audiocapbuf[i] = fout; + if(vidcap) audiocapbuf[i] = fout; - if( fout > dcadjustmax ) dcadjustmax = fout; + if(fout > dcadjustmax) dcadjustmax = fout; dcadjustave += fout; ay->ccycle += cyclespersample; @@ -408,47 +412,47 @@ void ay_callback( void *dummy, Sint8 *stream, int length ) dcadjustave /= (length/4); - if( (dcadjustmax-dcadjustave) > 32767 ) + if((dcadjustmax-dcadjustave) > 32767) dcadjustave = -(32767-dcadjustmax); - if( ay->oric->dcadjust && dcadjustave ) + if(ay->oric->dcadjust && dcadjustave) { - for( i=0, j=0; ilogged > logc) + if(ay->logged > logc) { memmove(&ay->writelog[0], &ay->writelog[logc], (ay->logged-logc) * sizeof(ay->writelog[0])); ay->logged -= logc; - for (i=0; ilogged; i++) + for(i=0; ilogged; i++) ay->writelog[i].cycle -= ay->lastcyc; /* Got out of sync? */ - if (ay->logged > 150) - ay_flushlog( ay ); + if(ay->logged > 150) + ay_flushlog(ay); } else { ay->logged = 0; } - if( tapenoise ) + if(tapenoise) { - while( tlogc < ay->tlogged ) + while(tlogc < ay->tlogged) ay->tapeout = ay->tapelog[tlogc++].val * 8192; } @@ -458,7 +462,7 @@ void ay_callback( void *dummy, Sint8 *stream, int length ) ay->lastcyc = 0; ay->newlogcycle = ay->ccycle>>FPBITS; ay->do_logcycle_reset = SDL_TRUE; -// ay->logged = 0; + // ay->logged = 0; ay->tlogged = 0; } @@ -466,41 +470,43 @@ void ay_callback( void *dummy, Sint8 *stream, int length ) ** Emulate the AY for some clock cycles ** Output is cycle-exact. */ -void ay_ticktock( struct ay8912 *ay, int cycles ) +void ay_ticktock(struct ay8912 *ay, int cycles) { // Need to do queued keys? - if( ( keyqueue ) && ( keysqueued ) && (!ay->oric->cpu.irq) ) + if((keyqueue) && (keysqueued) && (!ay->oric->cpu.irq)) { - if( kqoffs >= keysqueued ) + if(kqoffs >= keysqueued) { free(keyqueue); keyqueue = NULL; keysqueued = 0; kqoffs = 0; - } else { - switch( ay->oric->type ) + } + else + { + switch(ay->oric->type) { case MACH_ATMOS: case MACH_PRAVETZ: - if( ( ay->oric->cpu.pc == 0xeb78 ) && ( ay->oric->romon ) ) + if((ay->oric->cpu.pc == 0xeb78) && (ay->oric->romon)) { ay->oric->cpu.a = keyqueue[kqoffs++]; - ay->oric->cpu.write( &ay->oric->cpu, 0x2df, 0 ); + ay->oric->cpu.write(&ay->oric->cpu, 0x2df, 0); ay->oric->cpu.f_n = 1; ay->oric->cpu.calcpc = 0xeb88; - ay->oric->cpu.calcop = ay->oric->cpu.read( &ay->oric->cpu, ay->oric->cpu.calcpc ); + ay->oric->cpu.calcop = ay->oric->cpu.read(&ay->oric->cpu, ay->oric->cpu.calcpc); } break; case MACH_ORIC1: case MACH_ORIC1_16K: - if( ( ay->oric->cpu.pc == 0xe905 ) && ( ay->oric->romon ) ) + if((ay->oric->cpu.pc == 0xe905) && (ay->oric->romon)) { ay->oric->cpu.a = keyqueue[kqoffs++]; - ay->oric->cpu.write( &ay->oric->cpu, 0x2df, 0 ); + ay->oric->cpu.write(&ay->oric->cpu, 0x2df, 0); ay->oric->cpu.f_n = 1; ay->oric->cpu.calcpc = 0xe915; - ay->oric->cpu.calcop = ay->oric->cpu.read( &ay->oric->cpu, ay->oric->cpu.calcpc ); + ay->oric->cpu.calcop = ay->oric->cpu.read(&ay->oric->cpu, ay->oric->cpu.calcpc); } break; } @@ -508,34 +514,34 @@ void ay_ticktock( struct ay8912 *ay, int cycles ) } // Also use the queuekey location to do the jasmin auto reset - if( ay->oric->auto_jasmin_reset ) + if(ay->oric->auto_jasmin_reset) { - if (ay->oric->drivetype == DRV_JASMIN) + if(ay->oric->drivetype == DRV_JASMIN) { - switch( ay->oric->type ) + switch(ay->oric->type) { case MACH_ATMOS: case MACH_PRAVETZ: - if( ( ay->oric->cpu.pc == 0xeb78 ) && ( ay->oric->romon ) ) + if((ay->oric->cpu.pc == 0xeb78) && (ay->oric->romon)) { - ay->oric->cpu.write( &ay->oric->cpu, 0x3fb, 1 ); // ROMDIS - setromon( ay->oric ); - m6502_reset( &ay->oric->cpu ); - m6502_set_icycles( &ay->oric->cpu, SDL_FALSE, NULL ); - via_init( &ay->oric->via, ay->oric, VIA_MAIN ); + ay->oric->cpu.write(&ay->oric->cpu, 0x3fb, 1); // ROMDIS + setromon(ay->oric); + m6502_reset(&ay->oric->cpu); + m6502_set_icycles(&ay->oric->cpu, SDL_FALSE, NULL); + via_init(&ay->oric->via, ay->oric, VIA_MAIN); ay->oric->auto_jasmin_reset = SDL_FALSE; } break; case MACH_ORIC1: case MACH_ORIC1_16K: - if( ( ay->oric->cpu.pc == 0xe905 ) && ( ay->oric->romon ) ) + if((ay->oric->cpu.pc == 0xe905) && (ay->oric->romon)) { - ay->oric->cpu.write( &ay->oric->cpu, 0x3fb, 1 ); // ROMDIS - setromon( ay->oric ); - m6502_reset( &ay->oric->cpu ); - m6502_set_icycles( &ay->oric->cpu, SDL_FALSE, NULL ); - via_init( &ay->oric->via, ay->oric, VIA_MAIN ); + ay->oric->cpu.write(&ay->oric->cpu, 0x3fb, 1); // ROMDIS + setromon(ay->oric); + m6502_reset(&ay->oric->cpu); + m6502_set_icycles(&ay->oric->cpu, SDL_FALSE, NULL); + via_init(&ay->oric->via, ay->oric, VIA_MAIN); ay->oric->auto_jasmin_reset = SDL_FALSE; } break; @@ -547,18 +553,20 @@ void ay_ticktock( struct ay8912 *ay, int cycles ) } } - if( ay->keybitdelay > 0 ) + if(ay->keybitdelay > 0) { - if( cycles >= ay->keybitdelay ) + if(cycles >= ay->keybitdelay) { ay->keybitdelay = 0; - ay_update_keybits( ay ); - } else { + ay_update_keybits(ay); + } + else + { ay->keybitdelay -= cycles; } } - if( ay->do_logcycle_reset ) + if(ay->do_logcycle_reset) { ay->logcycle = ay->newlogcycle; ay->do_logcycle_reset = SDL_FALSE; @@ -566,17 +574,17 @@ void ay_ticktock( struct ay8912 *ay, int cycles ) ay->logcycle += cycles; } -void ay_lockaudio( struct ay8912 *ay ) +void ay_lockaudio(struct ay8912 *ay) { - if( ay->audiolocked ) return; - if( ( ay->oric->emu_mode != EM_RUNNING ) || ( !soundon ) || ( warpspeed ) ) return; + if(ay->audiolocked) return; + if((ay->oric->emu_mode != EM_RUNNING) || (!soundon) || (warpspeed)) return; SDL_LockAudio(); ay->audiolocked = SDL_TRUE; } -void ay_unlockaudio( struct ay8912 *ay ) +void ay_unlockaudio(struct ay8912 *ay) { - if( !ay->audiolocked ) return; + if(!ay->audiolocked) return; SDL_UnlockAudio(); ay->audiolocked = SDL_FALSE; } @@ -585,27 +593,33 @@ void ay_unlockaudio( struct ay8912 *ay ) ** Initialise the AY emulation ** (... and oric keyboard) */ -SDL_bool ay_init( struct ay8912 *ay, struct machine *oric ) +SDL_bool ay_init(struct ay8912 *ay, struct machine *oric) { int i; - switch( oric->keymap ) + switch(oric->keymap) { - case KMAP_AZERTY: keytab = azktab; break; - case KMAP_QWERTZ: keytab = qzktab; break; - default: keytab = qwktab; break; + case KMAP_AZERTY: + keytab = azktab; + break; + case KMAP_QWERTZ: + keytab = qzktab; + break; + default: + keytab = qwktab; + break; } // No oric keys pressed - for( i=0; i<8; i++ ) + for(i=0; i<8; i++) ay->keystates[i] = SDL_FALSE; // Reset all regs to 0 - for( i=0; iregs[i] = 0; // Reset the three audio channels - for( i=0; i<3; i++ ) + for(i=0; i<3; i++) { ay->ct[i] = 0; // Cycle counter to zero ay->out[i] = 0; // 0v output for each channel @@ -640,8 +654,8 @@ SDL_bool ay_init( struct ay8912 *ay, struct machine *oric ) ay->tapeout = 0; ay->keybitdelay = 0; ay->audiolocked = SDL_FALSE; - if( soundavailable ) - SDL_PauseAudio( 0 ); + if(soundavailable) + SDL_PauseAudio(0); // initialize audio conversion system for SDL2 SDL_BuildAudioCVT(&cvt, AUDIO_S16SYS, 2, AUDIO_FREQ, obtained.format, obtained.channels, obtained.freq); @@ -654,91 +668,91 @@ SDL_bool ay_init( struct ay8912 *ay, struct machine *oric ) /* ** Update the VIA bits when key states change */ -void ay_update_keybits( struct ay8912 *ay ) +void ay_update_keybits(struct ay8912 *ay) { - ay->currkeyoffs = ay->oric->via.read_port_b( &ay->oric->via ) & 0x7; + ay->currkeyoffs = ay->oric->via.read_port_b(&ay->oric->via) & 0x7; - if( (ay->eregs[AY_STATUS]&0x40) == 0 ) + if((ay->eregs[AY_STATUS]&0x40) == 0) { - ay->oric->via.write_port_b( &ay->oric->via, 0x08, 0x00 ); + ay->oric->via.write_port_b(&ay->oric->via, 0x08, 0x00); return; } - if( ay->keystates[ay->currkeyoffs] & (ay->eregs[AY_PORT_A]^0xff) ) - ay->oric->via.write_port_b( &ay->oric->via, 0x08, 0x08 ); + if(ay->keystates[ay->currkeyoffs] & (ay->eregs[AY_PORT_A]^0xff)) + ay->oric->via.write_port_b(&ay->oric->via, 0x08, 0x08); else - ay->oric->via.write_port_b( &ay->oric->via, 0x08, 0x00 ); + ay->oric->via.write_port_b(&ay->oric->via, 0x08, 0x00); } /* ** Handle a key press */ -void ay_keypress( struct ay8912 *ay, SDL_COMPAT_KEY key, SDL_bool down ) +void ay_keypress(struct ay8912 *ay, SDL_COMPAT_KEY key, SDL_bool down) { int i; // No key? - if( key == 0 ) return; + if(key == 0) return; // Does this key exist on the Oric? - for( i=0; i<64; i++ ) - if( keytab[i] == key ) break; + for(i=0; i<64; i++) + if(keytab[i] == key) break; // No... - if( i == 64 ) return; + if(i == 64) return; // Key down event, or key up event? - if( down ) + if(down) ay->keystates[i>>3] |= (1<<(i&7)); // Down, so set the corresponding bit else ay->keystates[i>>3] &= ~(1<<(i&7)); // Up, so clear it // Maybe update the VIA - if( ay->currkeyoffs == (i>>3) ) + if(ay->currkeyoffs == (i>>3)) { - if( ay->keystates[ay->currkeyoffs] & (ay->eregs[AY_PORT_A]^0xff) ) - ay->oric->via.write_port_b( &ay->oric->via, 0x08, 0x08 ); + if(ay->keystates[ay->currkeyoffs] & (ay->eregs[AY_PORT_A]^0xff)) + ay->oric->via.write_port_b(&ay->oric->via, 0x08, 0x08); else - ay->oric->via.write_port_b( &ay->oric->via, 0x08, 0x00 ); + ay->oric->via.write_port_b(&ay->oric->via, 0x08, 0x00); } } /* ** GI addressing */ -void ay_modeset( struct ay8912 *ay ) +void ay_modeset(struct ay8912 *ay) { unsigned char v, lasts6=0; - if( (ay->bmode != AYBMF_BC1) && (ay->oric->porta_ay != 0xff) ) + if((ay->bmode != AYBMF_BC1) && (ay->oric->porta_ay != 0xff)) { ay->oric->porta_ay = 0xff; - if( ay->oric->porta_is_ay ) - ay->oric->via.write_port_a( &ay->oric->via, 0xff, 0xff ); + if(ay->oric->porta_is_ay) + ay->oric->via.write_port_a(&ay->oric->via, 0xff, 0xff); } - switch( ay->bmode ) + switch(ay->bmode) { case AYBMF_BC1: // Read AY register ay->oric->porta_ay = (ay->creg>=NUM_AY_REGS) ? 0 : ay->eregs[ay->creg]; - ay->oric->via.write_port_a( &ay->oric->via, 0xff, ay->oric->porta_ay ); + ay->oric->via.write_port_a(&ay->oric->via, 0xff, ay->oric->porta_ay); ay->oric->porta_is_ay = SDL_TRUE; break; case AYBMF_BDIR: // Write AY register - if( ay->creg >= NUM_AY_REGS ) break; - v = ay->oric->via.read_port_a( &ay->oric->via ); + if(ay->creg >= NUM_AY_REGS) break; + v = ay->oric->via.read_port_a(&ay->oric->via); - if( ay->creg == AY_STATUS ) + if(ay->creg == AY_STATUS) lasts6 = ay->eregs[AY_STATUS] & 0x40; - if( ( ay->creg != AY_ENV_CYCLE ) || ( v != 0xff ) ) + if((ay->creg != AY_ENV_CYCLE) || (v != 0xff)) ay->eregs[ay->creg] = v; - switch( ay->creg ) + switch(ay->creg) { case AY_STATUS: - if( (ay->eregs[AY_STATUS]&0x40) != lasts6 ) + if((ay->eregs[AY_STATUS]&0x40) != lasts6) { ay->keybitdelay = 3; } @@ -755,28 +769,28 @@ void ay_modeset( struct ay8912 *ay ) case AY_ENV_PER_L: case AY_ENV_PER_H: case AY_ENV_CYCLE: - if( ( !soundon ) || ( warpspeed ) ) + if((!soundon) || (warpspeed)) { struct aywrite writenow; - ay_flushlog( ay ); + ay_flushlog(ay); writenow.cycle = 0; writenow.reg = ay->creg; writenow.val = v; - ay_dowrite( ay, &writenow ); + ay_dowrite(ay, &writenow); break; } - ay_lockaudio( ay ); // Gets unlocked at the end of each frame + ay_lockaudio(ay); // Gets unlocked at the end of each frame - if( ay->do_logcycle_reset ) + if(ay->do_logcycle_reset) { ay->logcycle = ay->newlogcycle; ay->do_logcycle_reset = SDL_FALSE; } - if( ay->logged >= WRITELOG_SIZE ) - ay_flushlog( ay ); + if(ay->logged >= WRITELOG_SIZE) + ay_flushlog(ay); ay->writelog[ay->logged ].cycle = ay->logcycle; ay->writelog[ay->logged ].reg = ay->creg; @@ -790,47 +804,47 @@ void ay_modeset( struct ay8912 *ay ) break; case AYBMF_BDIR|AYBMF_BC1: // Set register - ay->creg = ay->oric->via.read_port_a( &ay->oric->via ); + ay->creg = ay->oric->via.read_port_a(&ay->oric->via); break; } } -void ay_set_bcmode( struct ay8912 *ay, unsigned char bc1, unsigned char bdir ) +void ay_set_bcmode(struct ay8912 *ay, unsigned char bc1, unsigned char bdir) { ay->bmode = (bc1?AYBMF_BC1:0)|(bdir?AYBMF_BDIR:0); - ay_modeset( ay ); + ay_modeset(ay); } -void ay_set_bc1( struct ay8912 *ay, unsigned char state ) +void ay_set_bc1(struct ay8912 *ay, unsigned char state) { - if( state ) + if(state) ay->bmode |= AYBMF_BC1; else ay->bmode &= ~AYBMF_BC1; - ay_modeset( ay ); + ay_modeset(ay); } -void ay_set_bdir( struct ay8912 *ay, unsigned char state ) +void ay_set_bdir(struct ay8912 *ay, unsigned char state) { - if( state ) + if(state) ay->bmode |= AYBMF_BDIR; else ay->bmode &= ~AYBMF_BDIR; - ay_modeset( ay ); + ay_modeset(ay); } -void ay_soundloop( struct ay8912 *ay, unsigned char oldval, unsigned char newval) +void ay_soundloop(struct ay8912 *ay, unsigned char oldval, unsigned char newval) { - if( !ay->soundloopon ) + if(!ay->soundloopon) return; oldval &= 0x80; newval &= 0x80; - if( oldval == newval ) + if(oldval == newval) return; - ay_lockaudio( ay ); + ay_lockaudio(ay); if(ay->do_logcycle_reset) { ay->logcycle = ay->newlogcycle; @@ -841,5 +855,5 @@ void ay_soundloop( struct ay8912 *ay, unsigned char oldval, unsigned char newval ay->tapelog[ay->tlogged].cycle = ay->logcycle; ay->tapelog[ay->tlogged++].val = newval? 1 : 0; } - ay_unlockaudio( ay ); + ay_unlockaudio(ay); } diff --git a/8912.h b/8912.h index 66931c50..1732066c 100644 --- a/8912.h +++ b/8912.h @@ -87,7 +87,7 @@ struct ay8912 Sint32 ct[3], ctn, cte; Uint32 tonepos[3], tonestep[3]; Sint32 sign[3], out[3], envpos; - unsigned char *envtab; + unsigned char* envtab; struct machine *oric; Uint32 currnoise, rndrack; Sint16 output; @@ -103,22 +103,22 @@ struct ay8912 struct tnchange tapelog[TAPELOG_SIZE]; }; -void queuekeys( char *str ); +void queuekeys(char* str); -SDL_bool ay_init( struct ay8912 *ay, struct machine *oric ); -void ay_callback( void *dummy, Sint8 *stream, int length ); -void ay_ticktock( struct ay8912 *ay, int cycles ); -void ay_update_keybits( struct ay8912 *ay ); -void ay_keypress( struct ay8912 *ay, SDL_COMPAT_KEY key, SDL_bool down ); +SDL_bool ay_init(struct ay8912 *ay, struct machine *oric); +void ay_callback(void* dummy, Sint8 *stream, int length); +void ay_ticktock(struct ay8912 *ay, int cycles); +void ay_update_keybits(struct ay8912 *ay); +void ay_keypress(struct ay8912 *ay, SDL_COMPAT_KEY key, SDL_bool down); -void ay_set_bc1( struct ay8912 *ay, unsigned char state ); -void ay_set_bdir( struct ay8912 *ay, unsigned char state ); -void ay_set_bcmode( struct ay8912 *ay, unsigned char bc1, unsigned char bdir ); -void ay_modeset( struct ay8912 *ay ); +void ay_set_bc1(struct ay8912 *ay, unsigned char state); +void ay_set_bdir(struct ay8912 *ay, unsigned char state); +void ay_set_bcmode(struct ay8912 *ay, unsigned char bc1, unsigned char bdir); +void ay_modeset(struct ay8912 *ay); -void ay_lockaudio( struct ay8912 *ay ); -void ay_unlockaudio( struct ay8912 *ay ); -void ay_flushlog( struct ay8912 *ay ); +void ay_lockaudio(struct ay8912 *ay); +void ay_unlockaudio(struct ay8912 *ay); +void ay_flushlog(struct ay8912 *ay); -void ay_soundloop( struct ay8912 *ay, unsigned char oldval, unsigned char newval); +void ay_soundloop(struct ay8912 *ay, unsigned char oldval, unsigned char newval); diff --git a/avi.c b/avi.c index 3d5bfdfe..2d21694f 100644 --- a/avi.c +++ b/avi.c @@ -32,78 +32,78 @@ extern SDL_AudioSpec obtained; // Write a 32bit value to a stream in little-endian format -static SDL_bool write32l( SDL_bool stillok, struct avi_handle *ah, Uint32 val, Uint32 *rem ) +static SDL_bool write32l(SDL_bool stillok, struct avi_handle *ah, Uint32 val, Uint32 *rem) { - if( !stillok ) return SDL_FALSE; // Something failed earlier, so we're aborting - if( rem ) (*rem) = ah->csize; + if(!stillok) return SDL_FALSE; // Something failed earlier, so we're aborting + if(rem)(*rem) = ah->csize; ah->csize += 4; _MAKE_LE32(val); - return (fwrite( &val, 4, 1, ah->f ) == 1); + return (fwrite(&val, 4, 1, ah->f) == 1); } // Write a 16bit value to a stream in little-endian format -static SDL_bool write16l( SDL_bool stillok, struct avi_handle *ah, Uint16 val, Uint32 *rem ) +static SDL_bool write16l(SDL_bool stillok, struct avi_handle *ah, Uint16 val, Uint32 *rem) { - if( !stillok ) return SDL_FALSE; // Something failed earlier, so we're aborting - if( rem ) (*rem) = ah->csize; + if(!stillok) return SDL_FALSE; // Something failed earlier, so we're aborting + if(rem)(*rem) = ah->csize; ah->csize += 2; _MAKE_LE16(val); - return (fwrite( &val, 2, 1, ah->f ) == 1); + return (fwrite(&val, 2, 1, ah->f) == 1); } // Write a string to a stream -static SDL_bool writestr( SDL_bool stillok, struct avi_handle *ah, char *str, Uint32 *rem ) +static SDL_bool writestr(SDL_bool stillok, struct avi_handle *ah, char* str, Uint32 *rem) { - Sint32 i = (int)strlen( str ); - if( !stillok ) return SDL_FALSE; // Something failed earlier, so we're aborting - if( rem ) (*rem) = ah->csize; + Sint32 i = (int)strlen(str); + if(!stillok) return SDL_FALSE; // Something failed earlier, so we're aborting + if(rem)(*rem) = ah->csize; ah->csize += i; - return (fwrite( str, i, 1, ah->f ) == 1); + return (fwrite(str, i, 1, ah->f) == 1); } // Write a 32bit value to a stream in little-endian format at a specific offset -static SDL_bool seek_write32l( SDL_bool stillok, struct avi_handle *ah, Uint32 offs, Uint32 val ) +static SDL_bool seek_write32l(SDL_bool stillok, struct avi_handle *ah, Uint32 offs, Uint32 val) { - if( !stillok ) return SDL_FALSE; // Something failed earlier, so we're aborting - if( offs == 0 ) return SDL_TRUE; // Don't overwrite RIFF! - fseek( ah->f, offs, SEEK_SET ); + if(!stillok) return SDL_FALSE; // Something failed earlier, so we're aborting + if(offs == 0) return SDL_TRUE; // Don't overwrite RIFF! + fseek(ah->f, offs, SEEK_SET); _MAKE_LE32(val); - return (fwrite( &val, 4, 1, ah->f ) == 1); + return (fwrite(&val, 4, 1, ah->f) == 1); } // Write a block of memory -static SDL_bool writeblk( SDL_bool stillok, struct avi_handle *ah, Uint8 *blk, Uint32 blklen ) +static SDL_bool writeblk(SDL_bool stillok, struct avi_handle *ah, Uint8 *blk, Uint32 blklen) { - if( !stillok ) return SDL_FALSE; + if(!stillok) return SDL_FALSE; ah->csize += blklen; - return (fwrite( blk, blklen, 1, ah->f ) == 1); + return (fwrite(blk, blklen, 1, ah->f) == 1); } // Write an 8bit value to a stream -static SDL_bool writebyt( SDL_bool stillok, struct avi_handle *ah, Uint8 val ) +static SDL_bool writebyt(SDL_bool stillok, struct avi_handle *ah, Uint8 val) { - if( !stillok ) return SDL_FALSE; // Something failed earlier, so we're aborting + if(!stillok) return SDL_FALSE; // Something failed earlier, so we're aborting ah->csize += 1; - return (fwrite( &val, 1, 1, ah->f ) == 1); + return (fwrite(&val, 1, 1, ah->f) == 1); } #define AVIFLAGS (AVIF_ISINTERLEAVED|AVIF_WASCAPTUREFILE) -struct avi_handle *avi_open( char *filename, Uint8 *pal, SDL_bool dosound, int is50hz ) +struct avi_handle *avi_open(char* filename, Uint8 *pal, SDL_bool dosound, int is50hz) { struct avi_handle *ah; SDL_bool ok; Sint32 i; - ah = malloc( sizeof( struct avi_handle ) ); - if( !ah ) return NULL; - - memset( ah, 0, sizeof( struct avi_handle ) ); + ah = malloc(sizeof(struct avi_handle)); + if(!ah) return NULL; - ah->f = fopen( filename, "wb" ); - if( !ah->f ) + memset(ah, 0, sizeof(struct avi_handle)); + + ah->f = fopen(filename, "wb"); + if(!ah->f) { - free( ah ); + free(ah); return NULL; } @@ -112,115 +112,115 @@ struct avi_handle *avi_open( char *filename, Uint8 *pal, SDL_bool dosound, int i ah->is50hz = is50hz; ok = SDL_TRUE; - ok &= writestr( ok, ah, "RIFF" , NULL ); // RIFF header - ok &= write32l( ok, ah, 0, &ah->offs_riffsize ); // RIFF size - ok &= writestr( ok, ah, "AVI " , NULL ); // RIFF type - ok &= writestr( ok, ah, "LIST" , NULL ); // Header list - ok &= write32l( ok, ah, 0, &ah->offs_hdrlsize ); // Header list size - ok &= writestr( ok, ah, "hdrl" , NULL ); // Header list identifier - - ok &= writestr( ok, ah, "avih" , NULL ); // MainAVIHeader chunk - ok &= write32l( ok, ah, 56, NULL ); // Chunk size - ok &= write32l( ok, ah,is50hz?20000:16667,&ah->offs_usperfrm); // Microseconds per frame - ok &= write32l( ok, ah, 0, NULL ); // Max bytes per second - ok &= write32l( ok, ah, 0, NULL ); // Padding granularity - ok &= write32l( ok, ah, AVIFLAGS, NULL ); // Flags - ok &= write32l( ok, ah, 0, &ah->offs_frames ); // Number of frames - ok &= write32l( ok, ah, 0, NULL ); // Initial frames - ok &= write32l( ok, ah, ah->dosnd?2:1, NULL ); // Stream count - ok &= write32l( ok, ah, 0, NULL ); // Suggested buffer size - ok &= write32l( ok, ah, 240, NULL ); // Width - ok &= write32l( ok, ah, 224, NULL ); // Height - ok &= write32l( ok, ah, 0, NULL ); // Reserved - ok &= write32l( ok, ah, 0, NULL ); // Reserved - ok &= write32l( ok, ah, 0, NULL ); // Reserved - ok &= write32l( ok, ah, 0, NULL ); // Reserved - - ok &= writestr( ok, ah, "LIST" , NULL ); // Stream header list - ok &= write32l( ok, ah,4+8+56+8+40+8*4, NULL ); // Stream header list size - ok &= writestr( ok, ah, "strl" , NULL ); // Stream header list identifier - - ok &= writestr( ok, ah, "strh" , NULL ); // Video stream header - ok &= write32l( ok, ah, 56, NULL ); // Chunk size - ok &= writestr( ok, ah, "vids" , NULL ); // Type - ok &= writestr( ok, ah, "MRLE" , NULL ); // Microsoft Run Length Encoding - ok &= write32l( ok, ah, 0, NULL ); // Flags - ok &= write32l( ok, ah, 0, NULL ); // Reserved - ok &= write32l( ok, ah, 0, NULL ); // Initial frames - ok &= write32l( ok, ah, 1000000, NULL ); // Scale - ok &= write32l( ok, ah,is50hz?50000000:60000000,&ah->offs_frmrate); // Rate - ok &= write32l( ok, ah, 0, NULL ); // Start - ok &= write32l( ok, ah, 0, &ah->offs_frames2 ); // Length - ok &= write32l( ok, ah, 0, NULL ); // Suggested buffer size - ok &= write32l( ok, ah, 10000, NULL ); // Quality - ok &= write32l( ok, ah, 0, NULL ); // Sample size - ok &= write32l( ok, ah, 0, NULL ); // Frame - ok &= write32l( ok, ah, 0, NULL ); // Frame - - ok &= writestr( ok, ah, "strf" , NULL ); // Video stream format - ok &= write32l( ok, ah, 40+8*4, NULL ); // Chunk size - ok &= write32l( ok, ah, 40, NULL ); // Structure size - ok &= write32l( ok, ah, 240, NULL ); // Width - ok &= write32l( ok, ah, 224, NULL ); // Height - ok &= write16l( ok, ah, 1, NULL ); // Planes - ok &= write16l( ok, ah, 8, NULL ); // Bit count - ok &= write32l( ok, ah, 1, NULL ); // Compression - ok &= write32l( ok, ah, 240*244, NULL ); // Image size - ok &= write32l( ok, ah, 0, NULL ); // XPelsPerMeter - ok &= write32l( ok, ah, 0, NULL ); // YPelsPerMeter - ok &= write32l( ok, ah, 8, NULL ); // Colours used - ok &= write32l( ok, ah, 8, NULL ); // Colours important - - for( i=0; i<8; i++ ) + ok &= writestr(ok, ah, "RIFF", NULL); // RIFF header + ok &= write32l(ok, ah, 0, &ah->offs_riffsize); // RIFF size + ok &= writestr(ok, ah, "AVI ", NULL); // RIFF type + ok &= writestr(ok, ah, "LIST", NULL); // Header list + ok &= write32l(ok, ah, 0, &ah->offs_hdrlsize); // Header list size + ok &= writestr(ok, ah, "hdrl", NULL); // Header list identifier + + ok &= writestr(ok, ah, "avih", NULL); // MainAVIHeader chunk + ok &= write32l(ok, ah, 56, NULL); // Chunk size + ok &= write32l(ok, ah,is50hz?20000:16667, &ah->offs_usperfrm); // Microseconds per frame + ok &= write32l(ok, ah, 0, NULL); // Max bytes per second + ok &= write32l(ok, ah, 0, NULL); // Padding granularity + ok &= write32l(ok, ah, AVIFLAGS, NULL); // Flags + ok &= write32l(ok, ah, 0, &ah->offs_frames); // Number of frames + ok &= write32l(ok, ah, 0, NULL); // Initial frames + ok &= write32l(ok, ah, ah->dosnd?2:1, NULL); // Stream count + ok &= write32l(ok, ah, 0, NULL); // Suggested buffer size + ok &= write32l(ok, ah, 240, NULL); // Width + ok &= write32l(ok, ah, 224, NULL); // Height + ok &= write32l(ok, ah, 0, NULL); // Reserved + ok &= write32l(ok, ah, 0, NULL); // Reserved + ok &= write32l(ok, ah, 0, NULL); // Reserved + ok &= write32l(ok, ah, 0, NULL); // Reserved + + ok &= writestr(ok, ah, "LIST", NULL); // Stream header list + ok &= write32l(ok, ah,4+8+56+8+40+8*4, NULL); // Stream header list size + ok &= writestr(ok, ah, "strl", NULL); // Stream header list identifier + + ok &= writestr(ok, ah, "strh", NULL); // Video stream header + ok &= write32l(ok, ah, 56, NULL); // Chunk size + ok &= writestr(ok, ah, "vids", NULL); // Type + ok &= writestr(ok, ah, "MRLE", NULL); // Microsoft Run Length Encoding + ok &= write32l(ok, ah, 0, NULL); // Flags + ok &= write32l(ok, ah, 0, NULL); // Reserved + ok &= write32l(ok, ah, 0, NULL); // Initial frames + ok &= write32l(ok, ah, 1000000, NULL); // Scale + ok &= write32l(ok, ah,is50hz?50000000:60000000, &ah->offs_frmrate); // Rate + ok &= write32l(ok, ah, 0, NULL); // Start + ok &= write32l(ok, ah, 0, &ah->offs_frames2); // Length + ok &= write32l(ok, ah, 0, NULL); // Suggested buffer size + ok &= write32l(ok, ah, 10000, NULL); // Quality + ok &= write32l(ok, ah, 0, NULL); // Sample size + ok &= write32l(ok, ah, 0, NULL); // Frame + ok &= write32l(ok, ah, 0, NULL); // Frame + + ok &= writestr(ok, ah, "strf", NULL); // Video stream format + ok &= write32l(ok, ah, 40+8*4, NULL); // Chunk size + ok &= write32l(ok, ah, 40, NULL); // Structure size + ok &= write32l(ok, ah, 240, NULL); // Width + ok &= write32l(ok, ah, 224, NULL); // Height + ok &= write16l(ok, ah, 1, NULL); // Planes + ok &= write16l(ok, ah, 8, NULL); // Bit count + ok &= write32l(ok, ah, 1, NULL); // Compression + ok &= write32l(ok, ah, 240*244, NULL); // Image size + ok &= write32l(ok, ah, 0, NULL); // XPelsPerMeter + ok &= write32l(ok, ah, 0, NULL); // YPelsPerMeter + ok &= write32l(ok, ah, 8, NULL); // Colours used + ok &= write32l(ok, ah, 8, NULL); // Colours important + + for(i=0; i<8; i++) { - ok &= writebyt( ok, ah, pal[i*3+2] ); - ok &= writebyt( ok, ah, pal[i*3+1] ); - ok &= writebyt( ok, ah, pal[i*3+0] ); - ok &= writebyt( ok, ah, 0 ); + ok &= writebyt(ok, ah, pal[i*3+2]); + ok &= writebyt(ok, ah, pal[i*3+1]); + ok &= writebyt(ok, ah, pal[i*3+0]); + ok &= writebyt(ok, ah, 0); } - if( ah->dosnd ) + if(ah->dosnd) { - ok &= writestr( ok, ah, "LIST" , NULL ); // Stream header list - ok &= write32l( ok, ah, 4+8+56+8+16, NULL ); // Stream header list size - ok &= writestr( ok, ah, "strl" , NULL ); // Stream header identifier - - ok &= writestr( ok, ah, "strh" , NULL ); // Audio stream header - ok &= write32l( ok, ah, 56, NULL ); // Chunk size - ok &= writestr( ok, ah, "auds" , NULL ); // Type - ok &= write32l( ok, ah, 0, NULL ); // Codec - ok &= write32l( ok, ah, 0, NULL ); // Flags - ok &= write32l( ok, ah, 0, NULL ); // Reserved - ok &= write32l( ok, ah, 0, NULL ); // Initial frames - ok &= write32l( ok, ah, 1, NULL ); // Scale - ok &= write32l( ok, ah,obtained.freq, NULL ); // Rate - ok &= write32l( ok, ah, 0, NULL ); // Start - ok &= write32l( ok, ah, 0, &ah->offs_audiolen ); // Length - ok &= write32l( ok, ah, 0, NULL ); // Suggested buffer size - ok &= write32l( ok, ah, 10000, NULL ); // Quality - ok &= write32l( ok, ah, 2, NULL ); // Sample size - ok &= write32l( ok, ah, 0, NULL ); // Frame - ok &= write32l( ok, ah, 0, NULL ); // Frame - - ok &= writestr( ok, ah, "strf" , NULL ); // Audio stream format - ok &= write32l( ok, ah, 16, NULL ); // Chunk size - ok &= write16l( ok, ah, 1, NULL ); // Format (PCM) - ok &= write16l( ok, ah, 1, NULL ); // Channels - ok &= write32l( ok, ah,obtained.freq, NULL ); // Samples per second - ok &= write32l( ok, ah,obtained.freq*2, NULL ); // Bytes per second - ok &= write16l( ok, ah, 2, NULL ); // BlockAlign - ok &= write16l( ok, ah, 16, NULL ); // BitsPerSample + ok &= writestr(ok, ah, "LIST", NULL); // Stream header list + ok &= write32l(ok, ah, 4+8+56+8+16, NULL); // Stream header list size + ok &= writestr(ok, ah, "strl", NULL); // Stream header identifier + + ok &= writestr(ok, ah, "strh", NULL); // Audio stream header + ok &= write32l(ok, ah, 56, NULL); // Chunk size + ok &= writestr(ok, ah, "auds", NULL); // Type + ok &= write32l(ok, ah, 0, NULL); // Codec + ok &= write32l(ok, ah, 0, NULL); // Flags + ok &= write32l(ok, ah, 0, NULL); // Reserved + ok &= write32l(ok, ah, 0, NULL); // Initial frames + ok &= write32l(ok, ah, 1, NULL); // Scale + ok &= write32l(ok, ah,obtained.freq, NULL); // Rate + ok &= write32l(ok, ah, 0, NULL); // Start + ok &= write32l(ok, ah, 0, &ah->offs_audiolen); // Length + ok &= write32l(ok, ah, 0, NULL); // Suggested buffer size + ok &= write32l(ok, ah, 10000, NULL); // Quality + ok &= write32l(ok, ah, 2, NULL); // Sample size + ok &= write32l(ok, ah, 0, NULL); // Frame + ok &= write32l(ok, ah, 0, NULL); // Frame + + ok &= writestr(ok, ah, "strf", NULL); // Audio stream format + ok &= write32l(ok, ah, 16, NULL); // Chunk size + ok &= write16l(ok, ah, 1, NULL); // Format (PCM) + ok &= write16l(ok, ah, 1, NULL); // Channels + ok &= write32l(ok, ah,obtained.freq, NULL); // Samples per second + ok &= write32l(ok, ah,obtained.freq*2, NULL); // Bytes per second + ok &= write16l(ok, ah, 2, NULL); // BlockAlign + ok &= write16l(ok, ah, 16, NULL); // BitsPerSample } ah->hdrlsize = ah->csize - ah->offs_hdrlsize - 4; - ok &= writestr( ok, ah, "LIST" , NULL ); // movi list - ok &= write32l( ok, ah, 0, &ah->offs_movisize ); // Size - ok &= writestr( ok, ah, "movi" , NULL ); // identifier + ok &= writestr(ok, ah, "LIST", NULL); // movi list + ok &= write32l(ok, ah, 0, &ah->offs_movisize); // Size + ok &= writestr(ok, ah, "movi", NULL); // identifier - if( !ok ) + if(!ok) { - free( ah ); + free(ah); return NULL; } @@ -234,25 +234,25 @@ struct avi_handle *avi_open( char *filename, Uint8 *pal, SDL_bool dosound, int i return ah; } -static Uint32 rle_putpixels( struct avi_handle *ah, Uint8 *srcdata, Uint32 rlec, Uint32 srcc, Uint32 length ) +static Uint32 rle_putpixels(struct avi_handle *ah, Uint8 *srcdata, Uint32 rlec, Uint32 srcc, Uint32 length) { Uint32 c, chunker; - if( length == 0 ) return rlec; + if(length == 0) return rlec; - while( length > 254 ) + while(length > 254) { // Try not to leave an annoying dangly 1,2 or 3 byte section chunker = (length<258) ? 250 : 254; - rlec = rle_putpixels( ah, srcdata, rlec, srcc, chunker ); + rlec = rle_putpixels(ah, srcdata, rlec, srcc, chunker); srcc += chunker; length -= chunker; } // Somehow "chunker" failed :-( - if( length < 3 ) + if(length < 3) { - while( length > 0 ) + while(length > 0) { ah->rledata[rlec++] = 0x01; ah->rledata[rlec++] = srcdata[srcc++]; @@ -265,13 +265,13 @@ static Uint32 rle_putpixels( struct avi_handle *ah, Uint8 *srcdata, Uint32 rlec, ah->rledata[rlec++] = 0x00; ah->rledata[rlec++] = length; - while( c > 0 ) + while(c > 0) { ah->rledata[rlec++] = srcdata[srcc++]; c--; } - if( length & 1 ) + if(length & 1) ah->rledata[rlec++] = 0; return rlec; @@ -279,12 +279,12 @@ static Uint32 rle_putpixels( struct avi_handle *ah, Uint8 *srcdata, Uint32 rlec, // RLE encode the frame #define NOABS 0xffffffff -static Uint32 rle_encode( struct avi_handle *ah, Uint8 *srcdata, Uint32 rlec, Uint32 eol ) +static Uint32 rle_encode(struct avi_handle *ah, Uint8 *srcdata, Uint32 rlec, Uint32 eol) { Uint32 srcc, runc, abspos, chunker; Uint8 thiscol; - if( eol == 0 ) + if(eol == 0) { ah->rledata[rlec++] = 0x00; ah->rledata[rlec++] = 0x00; @@ -293,16 +293,16 @@ static Uint32 rle_encode( struct avi_handle *ah, Uint8 *srcdata, Uint32 rlec, Ui srcc = 0; // Source count abspos = NOABS; - while( srcc < eol ) + while(srcc < eol) { // Look for a run thiscol = srcdata[srcc]; // At the last pixel? - if( srcc == eol-1 ) + if(srcc == eol-1) { // Need to dump an absolute section? - if( abspos != NOABS ) rlec = rle_putpixels( ah, srcdata, rlec, abspos, srcc-abspos ); + if(abspos != NOABS) rlec = rle_putpixels(ah, srcdata, rlec, abspos, srcc-abspos); // Just encode it ah->rledata[rlec++] = 0x01; @@ -314,17 +314,17 @@ static Uint32 rle_encode( struct avi_handle *ah, Uint8 *srcdata, Uint32 rlec, Ui } runc = 1; // Set the run count to 1 - while( srcdata[srcc+runc] == thiscol ) + while(srcdata[srcc+runc] == thiscol) { runc++; - if( (srcc+runc) >= eol ) break; + if((srcc+runc) >= eol) break; } // Need an absolute mode section? - if( runc < 2 ) + if(runc < 2) { // Starting a new absolute mode section? - if( abspos == NOABS ) abspos = srcc; + if(abspos == NOABS) abspos = srcc; // Next pixel! srcc++; @@ -332,16 +332,16 @@ static Uint32 rle_encode( struct avi_handle *ah, Uint8 *srcdata, Uint32 rlec, Ui } // Need to dump an absolute section? - if( abspos != NOABS ) + if(abspos != NOABS) { - rlec = rle_putpixels( ah, srcdata, rlec, abspos, srcc-abspos ); + rlec = rle_putpixels(ah, srcdata, rlec, abspos, srcc-abspos); abspos = NOABS; } // Encode that run! srcc += runc; // Skip past the run - while( runc > 255 ) // Do any 255 byte chunks until runc < 255 + while(runc > 255) // Do any 255 byte chunks until runc < 255 { chunker = (runc<258) ? 250 : 255; ah->rledata[rlec++] = chunker; @@ -353,76 +353,78 @@ static Uint32 rle_encode( struct avi_handle *ah, Uint8 *srcdata, Uint32 rlec, Ui ah->rledata[rlec++] = thiscol; } - if( abspos != NOABS ) rlec = rle_putpixels( ah, srcdata, rlec, abspos, srcc-abspos ); + if(abspos != NOABS) rlec = rle_putpixels(ah, srcdata, rlec, abspos, srcc-abspos); ah->rledata[rlec++] = 0x00; // The end! ah->rledata[rlec++] = 0x00; return rlec; } -SDL_bool avi_addframe( struct avi_handle **ah, Uint8 *srcdata ) +SDL_bool avi_addframe(struct avi_handle **ah, Uint8 *srcdata) { SDL_bool ok; Sint32 i, x, lastline, lastx; Uint32 size; lastline = 0; - if( (*ah)->lastframevalid ) + if((*ah)->lastframevalid) { // Find the last line that differs - for( i=0; i<224; i++ ) + for(i=0; i<224; i++) { - for( x=0; x<240; x++ ) + for(x=0; x<240; x++) { - if( (*ah)->lastframe[i*240+x] != srcdata[i*240+x] ) + if((*ah)->lastframe[i*240+x] != srcdata[i*240+x]) break; } - if( x<240 ) break; + if(x<240) break; } lastline = i; } - if( lastline == 224 ) + if(lastline == 224) { size = 0; (*ah)->rledata[size++] = 0x00; (*ah)->rledata[size++] = 0x01; - } else { - for( i=223,size=0; i>=lastline; i-- ) + } + else + { + for(i=223,size=0; i>=lastline; i--) { lastx = 240; - if( (*ah)->lastframevalid ) + if((*ah)->lastframevalid) { // Find the last pixel we need to encode - for( x=239; x>=0; x-- ) + for(x=239; x>=0; x--) { - if( (*ah)->lastframe[i*240+x] != srcdata[i*240+x] ) + if((*ah)->lastframe[i*240+x] != srcdata[i*240+x]) break; } lastx = x+1; } - size = rle_encode( *ah, &srcdata[i*240], size, lastx ); + size = rle_encode(*ah, &srcdata[i*240], size, lastx); } (*ah)->rledata[size-1] = 0x01; } - memcpy( (*ah)->lastframe, srcdata, 240*224 ); + memcpy((*ah)->lastframe, srcdata, 240*224); (*ah)->lastframevalid = SDL_TRUE; ok = SDL_TRUE; - ok &= writestr( ok, *ah, "00dc", NULL ); // Chunk header - ok &= write32l( ok, *ah, size, NULL ); // Chunk size - ok &= writeblk( ok, *ah, (*ah)->rledata, size ); // Chunk data + ok &= writestr(ok, *ah, "00dc", NULL); // Chunk header + ok &= write32l(ok, *ah, size, NULL); // Chunk size + ok &= writeblk(ok, *ah, (*ah)->rledata, size); // Chunk data (*ah)->movisize += size + 8; (*ah)->frames++; - if( !ok ) + if(!ok) { - avi_close( ah ); + avi_close(ah); return SDL_FALSE; } - if( !(*ah)->time_start ) + if(!(*ah)->time_start) { (*ah)->time_start = SDL_GetTicks(); } @@ -430,58 +432,58 @@ SDL_bool avi_addframe( struct avi_handle **ah, Uint8 *srcdata ) return SDL_TRUE; } -SDL_bool avi_addaudio( struct avi_handle **ah, Sint16 *audiodata, Uint32 audiosize ) +SDL_bool avi_addaudio(struct avi_handle **ah, Sint16 *audiodata, Uint32 audiosize) { SDL_bool ok; - if( !(*ah)->dosnd ) return SDL_TRUE; + if(!(*ah)->dosnd) return SDL_TRUE; ok = SDL_TRUE; - ok &= writestr( ok, *ah, "01wb", NULL ); // Chunk header - ok &= write32l( ok, *ah, audiosize, NULL ); // Chunk size - ok &= writeblk( ok, *ah, (Uint8 *)audiodata, audiosize ); // Chunk data + ok &= writestr(ok, *ah, "01wb", NULL); // Chunk header + ok &= write32l(ok, *ah, audiosize, NULL); // Chunk size + ok &= writeblk(ok, *ah, (Uint8 *)audiodata, audiosize); // Chunk data (*ah)->movisize += audiosize+8; (*ah)->audiolen += audiosize; - if( !ok ) + if(!ok) { - avi_close( ah ); + avi_close(ah); return SDL_FALSE; } return SDL_TRUE; } -void avi_close( struct avi_handle **ah ) +void avi_close(struct avi_handle **ah) { SDL_bool ok; Uint32 time_end = SDL_GetTicks(); double time_ms, rate, usperfrm; - if( ( !ah ) || (!(*ah)) ) return; + if((!ah) || (!(*ah))) return; - if( (*ah)->f ) + if((*ah)->f) { ok = SDL_TRUE; - ok &= seek_write32l( ok, *ah, (*ah)->offs_riffsize, (*ah)->csize-8 ); - ok &= seek_write32l( ok, *ah, (*ah)->offs_hdrlsize, (*ah)->hdrlsize ); - ok &= seek_write32l( ok, *ah, (*ah)->offs_frames, (*ah)->frames ); - ok &= seek_write32l( ok, *ah, (*ah)->offs_frames2, (*ah)->frames ); - ok &= seek_write32l( ok, *ah, (*ah)->offs_movisize, (*ah)->movisize ); - ok &= seek_write32l( ok, *ah, (*ah)->offs_audiolen, (*ah)->audiolen ); + ok &= seek_write32l(ok, *ah, (*ah)->offs_riffsize, (*ah)->csize-8); + ok &= seek_write32l(ok, *ah, (*ah)->offs_hdrlsize, (*ah)->hdrlsize); + ok &= seek_write32l(ok, *ah, (*ah)->offs_frames, (*ah)->frames); + ok &= seek_write32l(ok, *ah, (*ah)->offs_frames2, (*ah)->frames); + ok &= seek_write32l(ok, *ah, (*ah)->offs_movisize, (*ah)->movisize); + ok &= seek_write32l(ok, *ah, (*ah)->offs_audiolen, (*ah)->audiolen); time_ms = (double)(time_end - (*ah)->time_start); // Time in milliseconds rate = ((double)((*ah)->frames) * 1000000000.0f) / time_ms; - usperfrm = (time_ms*1000.0f) / ((double)(*ah)->frames); + usperfrm = (time_ms*1000.0f) / ((double)(*ah)->frames); - ok &= seek_write32l( ok, *ah, (*ah)->offs_frmrate, (Uint32)(rate + .5) ); - ok &= seek_write32l( ok, *ah, (*ah)->offs_usperfrm, (Uint32)(usperfrm + .5) ); + ok &= seek_write32l(ok, *ah, (*ah)->offs_frmrate, (Uint32)(rate + .5)); + ok &= seek_write32l(ok, *ah, (*ah)->offs_usperfrm, (Uint32)(usperfrm + .5)); - fclose( (*ah)->f ); + fclose((*ah)->f); } - free( (*ah) ); + free((*ah)); *ah = NULL; } diff --git a/avi.h b/avi.h index 9a5bf7ef..d907fc16 100644 --- a/avi.h +++ b/avi.h @@ -18,12 +18,12 @@ ** */ -#define AVIF_HASINDEX 0x00000010 -#define AVIF_MUSTUSEINDEX 0x00000020 -#define AVIF_ISINTERLEAVED 0x00000100 -#define AVIF_TRUSTCKTYPE 0x00000800 -#define AVIF_WASCAPTUREFILE 0x00010000 -#define AVIF_COPYRIGHTED 0x00020000 +#define AVIF_HASINDEX 0x00000010 +#define AVIF_MUSTUSEINDEX 0x00000020 +#define AVIF_ISINTERLEAVED 0x00000100 +#define AVIF_TRUSTCKTYPE 0x00000800 +#define AVIF_WASCAPTUREFILE 0x00010000 +#define AVIF_COPYRIGHTED 0x00020000 struct avi_handle { @@ -53,8 +53,8 @@ struct avi_handle int is50hz; }; -struct avi_handle *avi_open( char *filename, Uint8 *pal, SDL_bool dosound, int is50hz ); -SDL_bool avi_addframe( struct avi_handle **ah, Uint8 *srcdata ); -SDL_bool avi_addaudio( struct avi_handle **ah, Sint16 *audiodata, Uint32 audiosize ); -void avi_close( struct avi_handle **ah ); +struct avi_handle *avi_open(char* filename, Uint8 *pal, SDL_bool dosound, int is50hz); +SDL_bool avi_addframe(struct avi_handle **ah, Uint8 *srcdata); +SDL_bool avi_addaudio(struct avi_handle **ah, Sint16 *audiodata, Uint32 audiosize); +void avi_close(struct avi_handle **ah); diff --git a/disk.c b/disk.c index d30f421b..82b4354a 100644 --- a/disk.c +++ b/disk.c @@ -68,7 +68,7 @@ static int sectordumpcount; void microdisc_setintrq(void* md); #endif -static Uint16 calc_crc( Uint16 crc, Uint8 value) +static Uint16 calc_crc(Uint16 crc, Uint8 value) { crc = ((unsigned char)(crc >> 8)) | (crc << 8); crc ^= value; @@ -79,30 +79,30 @@ static Uint16 calc_crc( Uint16 crc, Uint8 value) } // Pop up disk image information for a couple of seconds -void disk_popup( struct machine *oric, int drive ) +void disk_popup(struct machine *oric, int drive) { char tmp[40]; - if( !oric->diskname[drive][0] ) + if(!oric->diskname[drive][0]) { - do_popup( oric, "\x14\x15\x13" ); + do_popup(oric, "\x14\x15\x13"); return; } - sprintf( tmp, "\x14\x15""%d %-16s", drive, oric->diskname[drive] ); - do_popup( oric, tmp ); + sprintf(tmp, "\x14\x15""%d %-16s", drive, oric->diskname[drive]); + do_popup(oric, tmp); } // Free a disk image and clear the pointer to it -static void diskimage_free( struct machine *oric, struct diskimage **dimg ) +static void diskimage_free(struct machine *oric, struct diskimage **dimg) { - char *dpath, *dfile; + char* dpath, *dfile; if(!dimg) return; if(!(*dimg)) return; - if( oric->type != MACH_TELESTRAT ) + if(oric->type != MACH_TELESTRAT) { - switch (oric->drivetype) + switch(oric->drivetype) { case DRV_PRAVETZ: dpath = pravdiskpath; @@ -124,14 +124,14 @@ static void diskimage_free( struct machine *oric, struct diskimage **dimg ) if((*dimg)->modified) { char modmsg[128]; - sprintf( modmsg, "The disk in drive %d is modified.\nWould you like to save the changes?", (*dimg)->drivenum ); - if( msgbox( oric, MSGBOX_YES_NO, modmsg ) ) + sprintf(modmsg, "The disk in drive %d is modified.\nWould you like to save the changes?", (*dimg)->drivenum); + if(msgbox(oric, MSGBOX_YES_NO, modmsg)) { - sprintf( modmsg, "Save disk %d", (*dimg)->drivenum ); - if( filerequester( oric, modmsg, dpath, dfile, FR_DISKSAVE ) ) + sprintf(modmsg, "Save disk %d", (*dimg)->drivenum); + if(filerequester(oric, modmsg, dpath, dfile, FR_DISKSAVE)) { - joinpath( dpath, dfile ); - diskimage_save( oric, filetmp, (*dimg)->drivenum ); + joinpath(dpath, dfile); + diskimage_save(oric, filetmp, (*dimg)->drivenum); } } } @@ -187,7 +187,7 @@ static void diskimage_set_rawint(struct diskimage* dimg, Uint32 offset, Uint32 v // Allocate and initialise a disk image structure // If "rawimglen" isn't zero, it will also allocate // ram for a raw disk image -static struct diskimage *diskimage_alloc( int drivetype, Uint32 rawimglen ) +static struct diskimage *diskimage_alloc(int drivetype, Uint32 rawimglen) { struct diskimage *dimg = NULL; @@ -195,13 +195,13 @@ static struct diskimage *diskimage_alloc( int drivetype, Uint32 rawimglen ) { Uint8 *buf = NULL; - if( DRV_PRAVETZ != drivetype ) + if(DRV_PRAVETZ != drivetype) rawimglen = 256+2*128*6400; buf = malloc(rawimglen); - if( !buf ) return NULL; + if(!buf) return NULL; - dimg = malloc( sizeof( struct diskimage ) ); + dimg = malloc(sizeof(struct diskimage)); if(!dimg) { free(buf); @@ -227,7 +227,7 @@ static struct diskimage *diskimage_alloc( int drivetype, Uint32 rawimglen ) return dimg; } -static void diskimage_set_modified( struct diskimage* dimg, uint8_t side, uint8_t track ) +static void diskimage_set_modified(struct diskimage* dimg, uint8_t side, uint8_t track) { if(dimg) { @@ -243,7 +243,7 @@ static void diskimage_set_modified( struct diskimage* dimg, uint8_t side, uint8_ } // Eject a disk from a drive -void disk_eject( struct machine *oric, int drive ) +void disk_eject(struct machine *oric, int drive) { diskimage_free(oric, &oric->wddisk.disk[drive]); oric->wddisk.disk[drive] = NULL; @@ -252,14 +252,14 @@ void disk_eject( struct machine *oric, int drive ) oric->pravetz.drv[drive].dirty = SDL_FALSE; oric->pravetz.drv[drive].half_track = 0; oric->diskname[drive][0] = 0; - disk_popup( oric, drive ); + disk_popup(oric, drive); } // Whenever a seek operation occurs, the track where the head ends up // is "cached". The track is located within the raw image file, and // all the sector address and data markers are found, and pointers // are remembered for each. -void diskimage_cachetrack( struct diskimage *dimg, int track, int side ) +void diskimage_cachetrack(struct diskimage *dimg, int track, int side) { Uint8 *ptr, *eot; Uint32 sectorcount, n; @@ -332,14 +332,14 @@ void diskimage_cachetrack( struct diskimage *dimg, int track, int side ) // Since the disk image is always kept in standard format, there is // no processing of the image in this routine, it is just dumped from // memory back to disk. -SDL_bool diskimage_save( struct machine *oric, char *fname, int drive ) +SDL_bool diskimage_save(struct machine *oric, char* fname, int drive) { struct diskimage* dimg = oric->wddisk.disk[drive]; // Make sure there is a disk in the drive! - if( !dimg ) return SDL_FALSE; + if(!dimg) return SDL_FALSE; - if( oric->drivetype == DRV_PRAVETZ ) + if(oric->drivetype == DRV_PRAVETZ) { disk_pravetz_write_image(&oric->pravetz.drv[drive]); } @@ -350,7 +350,7 @@ SDL_bool diskimage_save( struct machine *oric, char *fname, int drive ) FILE *f = fopen(fname, "wb"); if(!f) { - do_popup( oric, "\x14\x15Save failed" ); + do_popup(oric, "\x14\x15Save failed"); return SDL_FALSE; } @@ -368,7 +368,7 @@ SDL_bool diskimage_save( struct machine *oric, char *fname, int drive ) if(fwrite(dimg->rawimage, 256+sidesize, 1, f) != 1) { fclose(f); - do_popup( oric, "\x14\x15Save failed" ); + do_popup(oric, "\x14\x15Save failed"); return SDL_FALSE; } @@ -377,7 +377,7 @@ SDL_bool diskimage_save( struct machine *oric, char *fname, int drive ) if(fwrite(dimg->rawimage+256+128*6400, sidesize, 1, f) != 1) { fclose(f); - do_popup( oric, "\x14\x15Save failed" ); + do_popup(oric, "\x14\x15Save failed"); return SDL_FALSE; } } @@ -388,7 +388,7 @@ SDL_bool diskimage_save( struct machine *oric, char *fname, int drive ) // If we are not just overwriting the original file, remember the new filename if(fname != dimg->filename) { - strncpy( dimg->filename, fname, 4096+512-1 ); + strncpy(dimg->filename, fname, 4096+512-1); dimg->filename[4096+512-1] = 0; } } @@ -398,12 +398,13 @@ SDL_bool diskimage_save( struct machine *oric, char *fname, int drive ) dimg->modified_time = 0; #ifdef WWW - // sync from memory state to persisted - EM_ASM( - FS.syncfs(function (err) { - assert(!err); - }); - ); + // sync from memory state to persisted + EM_ASM( + FS.syncfs(function(err) + { + assert(!err); + }); + ); #endif // Remember to update the GUI @@ -412,14 +413,14 @@ SDL_bool diskimage_save( struct machine *oric, char *fname, int drive ) } // This routine "inserts" a disk image into a virtual drive -SDL_bool diskimage_load( struct machine *oric, char *fname, int drive ) +SDL_bool diskimage_load(struct machine *oric, char* fname, int drive) { FILE *f; Uint32 len; // Open the file f = fopen(fname, "rb"); - if( !f ) return SDL_FALSE; + if(!f) return SDL_FALSE; // The file exists, so eject any currently inserted disk disk_eject(oric, drive); @@ -440,7 +441,7 @@ SDL_bool diskimage_load( struct machine *oric, char *fname, int drive ) oric->wddisk.disk[drive] = diskimage_alloc(oric->drivetype, len); if(!oric->wddisk.disk[drive]) { - do_popup( oric, "\x14\x15""Out of memory" ); + do_popup(oric, "\x14\x15""Out of memory"); fclose(f); return SDL_FALSE; } @@ -450,13 +451,13 @@ SDL_bool diskimage_load( struct machine *oric, char *fname, int drive ) { fclose(f); disk_eject(oric, drive); - do_popup( oric, "\x14\x15""Read error" ); + do_popup(oric, "\x14\x15""Read error"); return SDL_FALSE; } fclose(f); - if( oric->drivetype == DRV_PRAVETZ ) + if(oric->drivetype == DRV_PRAVETZ) { Uint16 t_idx; Uint16 s_idx; @@ -466,17 +467,17 @@ SDL_bool diskimage_load( struct machine *oric, char *fname, int drive ) oric->wddisk.disk[drive]->drivenum = drive; oric->pravetz.drv[drive].pimg = oric->wddisk.disk[drive]; - if( drive >= 2 ) + if(drive >= 2) { disk_eject(oric, drive); - do_popup( oric, "\x14\x15""Invalid drive number" ); + do_popup(oric, "\x14\x15""Invalid drive number"); return SDL_FALSE; } - if( len != 143360 ) + if(len != 143360) { disk_eject(oric, drive); - do_popup( oric, "\x14\x15""Invalid pravetz disk image" ); + do_popup(oric, "\x14\x15""Invalid pravetz disk image"); return SDL_FALSE; } @@ -510,7 +511,7 @@ SDL_bool diskimage_load( struct machine *oric, char *fname, int drive ) if(strncmp((char*)oric->wddisk.disk[drive]->rawimage, "MFM_DISK", 8) != 0) { disk_eject(oric, drive); - do_popup( oric, "\x14\x15""Invalid disk image" ); + do_popup(oric, "\x14\x15""Invalid disk image"); return SDL_FALSE; } @@ -524,7 +525,7 @@ SDL_bool diskimage_load( struct machine *oric, char *fname, int drive ) if(1 != oric->wddisk.disk[drive]->geometry) { disk_eject(oric, drive); - do_popup( oric, "\x14\x15""Unsupported disk image geometry" ); + do_popup(oric, "\x14\x15""Unsupported disk image geometry"); return SDL_FALSE; } @@ -532,14 +533,14 @@ SDL_bool diskimage_load( struct machine *oric, char *fname, int drive ) (oric->wddisk.disk[drive]->numsides_in > 2)) { disk_eject(oric, drive); - do_popup( oric, "\x14\x15""Invalid disk image" ); + do_popup(oric, "\x14\x15""Invalid disk image"); return SDL_FALSE; } if(oric->wddisk.disk[drive]->numtracks_in > 128) { disk_eject(oric, drive); - do_popup( oric, "\x14\x15""Invalid disk image" ); + do_popup(oric, "\x14\x15""Invalid disk image"); return SDL_FALSE; } @@ -567,21 +568,23 @@ SDL_bool diskimage_load( struct machine *oric, char *fname, int drive ) oric->wddisk.disk[drive]->modified_time = 0; // Remember the filename of the image for this drive - strncpy( oric->wddisk.disk[drive]->filename, fname, 4096+512-1 ); + strncpy(oric->wddisk.disk[drive]->filename, fname, 4096+512-1); oric->wddisk.disk[drive]->filename[4096+512-1] = 0; // Come up with a suitable short name for popups etc. - if( strlen( fname ) > 31 ) + if(strlen(fname) > 31) { - strncpy( oric->diskname[drive], &fname[strlen(fname)-31], 32 ); + strncpy(oric->diskname[drive], &fname[strlen(fname)-31], 32); oric->diskname[drive][0] = 22; - } else { - strncpy( oric->diskname[drive], fname, 32 ); + } + else + { + strncpy(oric->diskname[drive], fname, 32); } oric->diskname[drive][31] = 0; // Do the popup - disk_popup( oric, drive ); + disk_popup(oric, drive); // Mark the disk status icons as needing a refresh refreshdisks = SDL_TRUE; @@ -595,7 +598,7 @@ void wd17xx_dummy(void* nothing) } // Initialise a WD17xx controller instance -void wd17xx_init( struct wd17xx *wd ) +void wd17xx_init(struct wd17xx *wd) { wd->r_status = 0; wd->r_track = 0; @@ -621,7 +624,7 @@ void wd17xx_init( struct wd17xx *wd ) } // This routine emulates some cycles of disk activity. -void wd17xx_ticktock( struct wd17xx *wd, int cycles ) +void wd17xx_ticktock(struct wd17xx *wd, int cycles) { #ifdef MICRODISC_FUDGE if((wd->currentop == COP_READ_SECTORS_FUDGE) || @@ -639,7 +642,7 @@ void wd17xx_ticktock( struct wd17xx *wd, int cycles ) wd->currentop = COP_NUFFINK; refreshdisks = SDL_TRUE; #if GENERAL_DISK_DEBUG - dbg_printf( "DISK: Sector %d not found.", wd->r_sector ); + dbg_printf("DISK: Sector %d not found.", wd->r_sector); #endif } else @@ -682,7 +685,7 @@ void wd17xx_ticktock( struct wd17xx *wd, int cycles ) // Assert INTRQ (this function pointer is set up by the microdisc/jasmin/whatever controller) wd->setintrq(wd->intrqarg); #if GENERAL_DISK_DEBUG - dbg_printf( "DISK: Delayed INTRQ" ); + dbg_printf("DISK: Delayed INTRQ"); #endif } } @@ -715,7 +718,7 @@ void wd17xx_ticktock( struct wd17xx *wd, int cycles ) } // This routine seeks to the specified track. It is used by the SEEK and STEP commands. -void wd17xx_seek_track( struct wd17xx *wd, Uint8 track, SDL_bool dofudge ) +void wd17xx_seek_track(struct wd17xx *wd, Uint8 track, SDL_bool dofudge) { // Is there a disk in the drive? if(wd->disk[wd->c_drive]) @@ -746,7 +749,7 @@ void wd17xx_seek_track( struct wd17xx *wd, Uint8 track, SDL_bool dofudge ) wd->delayedint = 20; if(wd->c_track == 0) wd->distatus |= WSFI_TRK0; #if GENERAL_DISK_DEBUG - dbg_printf( "DISK: At track %u (%u sectors)", track, wd->disk[wd->c_drive]->numsectors ); + dbg_printf("DISK: At track %u (%u sectors)", track, wd->disk[wd->c_drive]->numsectors); #endif return; } @@ -757,7 +760,7 @@ void wd17xx_seek_track( struct wd17xx *wd, Uint8 track, SDL_bool dofudge ) wd->r_track = 0; #if GENERAL_DISK_DEBUG - dbg_printf( "DISK: Seek fail" ); + dbg_printf("DISK: Seek fail"); #endif #ifdef MICRODISC_FUDGE @@ -776,7 +779,7 @@ void wd17xx_seek_track( struct wd17xx *wd, Uint8 track, SDL_bool dofudge ) // This routine looks for the sector with the specified ID in the current track. // It returns NULL if there is no such sector, or a structure with pointers to // the ID and data fields if the sector is found. -struct mfmsector *wd17xx_find_sector( struct wd17xx *wd, Uint8 secid ) +struct mfmsector *wd17xx_find_sector(struct wd17xx *wd, Uint8 secid) { int revs=0; struct diskimage *dimg; @@ -785,7 +788,7 @@ struct mfmsector *wd17xx_find_sector( struct wd17xx *wd, Uint8 secid ) dimg = wd->disk[wd->c_drive]; // No disk image? No sectors! - if( !dimg ) return NULL; + if(!dimg) return NULL; // Make sure the current track is cached diskimage_cachetrack(dimg, wd->c_track, wd->c_side); @@ -816,21 +819,21 @@ struct mfmsector *wd17xx_find_sector( struct wd17xx *wd, Uint8 secid ) // The search failed :-( #if GENERAL_DISK_DEBUG - dbg_printf( "Couldn't find sector %u", secid ); + dbg_printf("Couldn't find sector %u", secid); #endif return NULL; } // This returns the first valid sector in the current track, or NULL if // there aren't any sectors. -struct mfmsector *wd17xx_first_sector( struct wd17xx *wd ) +struct mfmsector *wd17xx_first_sector(struct wd17xx *wd) { struct diskimage *dimg; dimg = wd->disk[wd->c_drive]; // No disk? no sector... - if( !dimg ) return NULL; + if(!dimg) return NULL; // Make sure the current track is cached diskimage_cachetrack(dimg, wd->c_track, wd->c_side); @@ -848,14 +851,14 @@ struct mfmsector *wd17xx_first_sector( struct wd17xx *wd ) } // Move on to the next sector -struct mfmsector *wd17xx_next_sector( struct wd17xx *wd ) +struct mfmsector *wd17xx_next_sector(struct wd17xx *wd) { struct diskimage *dimg; dimg = wd->disk[wd->c_drive]; // No disk? No sectors! - if( !dimg ) return NULL; + if(!dimg) return NULL; // Make sure the current track is cached diskimage_cachetrack(dimg, wd->c_track, wd->c_side); @@ -875,7 +878,7 @@ struct mfmsector *wd17xx_next_sector( struct wd17xx *wd ) } // Perform a read operation on a WD17xx register -unsigned char wd17xx_read( struct wd17xx *wd, unsigned short addr ) +unsigned char wd17xx_read(struct wd17xx *wd, unsigned short addr) { // Which register?! switch(addr) @@ -935,7 +938,7 @@ unsigned char wd17xx_read( struct wd17xx *wd, unsigned short addr ) sectordumpstr[33] = '\''; sectordumpstr[50] = '\''; sectordumpstr[51] = 0; - dbg_printf( "%s", sectordumpstr ); + dbg_printf("%s", sectordumpstr); sectordumpcount = 0; } #endif @@ -952,7 +955,7 @@ unsigned char wd17xx_read( struct wd17xx *wd, unsigned short addr ) sectordumpstr[35+sectordumpcount] = 0; for(sectordumpcount*=2; sectordumpcount<33; sectordumpcount++) sectordumpstr[sectordumpcount*2] = ' '; - dbg_printf( "%s", sectordumpstr ); + dbg_printf("%s", sectordumpstr); sectordumpcount = 0; } #endif @@ -962,7 +965,7 @@ unsigned char wd17xx_read( struct wd17xx *wd, unsigned short addr ) if(wd->currentop == COP_READ_SECTORS) { #if GENERAL_DISK_DEBUG - dbg_printf( "Next sector..." ); + dbg_printf("Next sector..."); #endif // Get the next sector, and carry on! wd->r_sector++; @@ -997,7 +1000,9 @@ unsigned char wd17xx_read( struct wd17xx *wd, unsigned short addr ) wd->r_status &= (~WSF_DRQ); // Clear DRQ (no more data) wd->clrdrq(wd->drqarg); refreshdisks = SDL_TRUE; // Turn off disk LED - } else { + } + else + { wd->delayeddrq = 32; // More data ready. DRQ to let them know! } break; @@ -1016,7 +1021,9 @@ unsigned char wd17xx_read( struct wd17xx *wd, unsigned short addr ) wd->distatus = 0; wd->currentop = COP_NUFFINK; refreshdisks = SDL_TRUE; - } else { + } + else + { wd->delayeddrq = 32; } @@ -1041,7 +1048,9 @@ unsigned char wd17xx_read( struct wd17xx *wd, unsigned short addr ) wd->distatus = 0; wd->currentop = COP_NUFFINK; refreshdisks = SDL_TRUE; - } else { + } + else + { wd->delayeddrq = 32; } break; @@ -1054,7 +1063,7 @@ unsigned char wd17xx_read( struct wd17xx *wd, unsigned short addr ) } static SDL_bool last_step_in = SDL_FALSE; -void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, unsigned char data ) +void wd17xx_write(struct machine *oric, struct wd17xx *wd, unsigned short addr, unsigned char data) { switch(addr) { @@ -1067,22 +1076,22 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, { case 0x00: // Restore (Type I) #if GENERAL_DISK_DEBUG - dbg_printf( "DISK: (%04X) Restore", oric->cpu.pc-1 ); + dbg_printf("DISK: (%04X) Restore", oric->cpu.pc-1); #endif wd->r_status = WSF_BUSY; if(data & 8) wd->r_status |= WSFI_HEADL; - wd17xx_seek_track( wd, 0, oric->cpu.calcpc == 0xe3a1 ); + wd17xx_seek_track(wd, 0, oric->cpu.calcpc == 0xe3a1); wd->currentop = COP_NUFFINK; refreshdisks = SDL_TRUE; break; case 0x10: // Seek (Type I) #if GENERAL_DISK_DEBUG - dbg_printf( "DISK: (%04X) Seek", oric->cpu.pc-1 ); + dbg_printf("DISK: (%04X) Seek", oric->cpu.pc-1); #endif wd->r_status = WSF_BUSY; if(data & 8) wd->r_status |= WSFI_HEADL; - wd17xx_seek_track( wd, wd->r_data, SDL_FALSE ); + wd17xx_seek_track(wd, wd->r_data, SDL_FALSE); wd->currentop = COP_NUFFINK; refreshdisks = SDL_TRUE; break; @@ -1091,25 +1100,25 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, case 0x20: // Step (Type I) #if GENERAL_DISK_DEBUG - dbg_printf( "DISK: (%04X) Step", oric->cpu.pc-1 ); + dbg_printf("DISK: (%04X) Step", oric->cpu.pc-1); #endif wd->r_status = WSF_BUSY; if(data & 8) wd->r_status |= WSFI_HEADL; if(last_step_in) - wd17xx_seek_track( wd, wd->c_track+1, SDL_FALSE ); + wd17xx_seek_track(wd, wd->c_track+1, SDL_FALSE); else - wd17xx_seek_track( wd, wd->c_track > 0 ? wd->c_track-1 : 0, SDL_FALSE ); + wd17xx_seek_track(wd, wd->c_track > 0 ? wd->c_track-1 : 0, SDL_FALSE); wd->currentop = COP_NUFFINK; refreshdisks = SDL_TRUE; break; case 0x40: // Step-in (Type I) #if GENERAL_DISK_DEBUG - dbg_printf( "DISK: (%04X) Step-In (%d,%d)", oric->cpu.pc-1, wd->c_track, wd->c_track+1 ); + dbg_printf("DISK: (%04X) Step-In (%d,%d)", oric->cpu.pc-1, wd->c_track, wd->c_track+1); #endif wd->r_status = WSF_BUSY; if(data & 8) wd->r_status |= WSFI_HEADL; - wd17xx_seek_track( wd, wd->c_track+1, SDL_FALSE ); + wd17xx_seek_track(wd, wd->c_track+1, SDL_FALSE); last_step_in = SDL_TRUE; wd->currentop = COP_NUFFINK; refreshdisks = SDL_TRUE; @@ -1117,12 +1126,12 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, case 0x60: // Step-out (Type I) #if GENERAL_DISK_DEBUG - dbg_printf( "DISK: Step-Out" ); + dbg_printf("DISK: Step-Out"); #endif wd->r_status = WSF_BUSY; if(data & 8) wd->r_status |= WSFI_HEADL; if(wd->c_track > 0) - wd17xx_seek_track( wd, wd->c_track-1, SDL_FALSE ); + wd17xx_seek_track(wd, wd->c_track-1, SDL_FALSE); last_step_in = SDL_FALSE; wd->currentop = COP_NUFFINK; refreshdisks = SDL_TRUE; @@ -1133,11 +1142,11 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, switch(oric->drivetype) { case DRV_MICRODISC: - dbg_printf( "DISK: (%04X) Read sector %u (CODE=%02X,ROM=%s,EPROM=%s)", oric->cpu.pc-1, wd->r_sector, data, oric->romdis?"OFF":"ON", oric->md.diskrom?"ON":"OFF" ); + dbg_printf("DISK: (%04X) Read sector %u (CODE=%02X,ROM=%s,EPROM=%s)", oric->cpu.pc-1, wd->r_sector, data, oric->romdis?"OFF":"ON", oric->md.diskrom?"ON":"OFF"); break; default: - dbg_printf( "DISK: (%04X) Read sector %u (CODE=%02X)", oric->cpu.pc-1, wd->r_sector, data ); + dbg_printf("DISK: (%04X) Read sector %u (CODE=%02X)", oric->cpu.pc-1, wd->r_sector, data); break; } #endif @@ -1159,9 +1168,9 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, wd->currentop = COP_NUFFINK; refreshdisks = SDL_TRUE; #if GENERAL_DISK_DEBUG - dbg_printf( "DISK: Sector %d not found.", wd->r_sector ); + dbg_printf("DISK: Sector %d not found.", wd->r_sector); #endif -// setemumode( oric, NULL, EM_DEBUG ); + // setemumode( oric, NULL, EM_DEBUG ); break; } @@ -1182,11 +1191,11 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, switch(oric->drivetype) { case DRV_MICRODISC: - dbg_printf( "DISK: (%04X) Write sector %u (CODE=%02X,ROM=%s,EPROM=%s)", oric->cpu.pc-1, wd->r_sector, data, oric->romdis?"OFF":"ON", oric->md.diskrom?"ON":"OFF" ); + dbg_printf("DISK: (%04X) Write sector %u (CODE=%02X,ROM=%s,EPROM=%s)", oric->cpu.pc-1, wd->r_sector, data, oric->romdis?"OFF":"ON", oric->md.diskrom?"ON":"OFF"); break; default: - dbg_printf( "DISK: (%04X) Write sector %u (CODE=%02X)", oric->cpu.pc-1, wd->r_sector, data ); + dbg_printf("DISK: (%04X) Write sector %u (CODE=%02X)", oric->cpu.pc-1, wd->r_sector, data); break; } #endif @@ -1200,9 +1209,9 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, wd->currentop = COP_NUFFINK; refreshdisks = SDL_TRUE; #if GENERAL_DISK_DEBUG - dbg_printf( "DISK: Sector %d not found.", wd->r_sector ); + dbg_printf("DISK: Sector %d not found.", wd->r_sector); #endif -// setemumode( oric, NULL, EM_DEBUG ); + // setemumode( oric, NULL, EM_DEBUG ); break; } @@ -1219,7 +1228,7 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, { case 0x00: // Read address (Type III) #if GENERAL_DISK_DEBUG - dbg_printf( "DISK: (%04X) Read address", oric->cpu.pc-1 ); + dbg_printf("DISK: (%04X) Read address", oric->cpu.pc-1); #endif wd->curroffs = 0; if(!wd->currsector) @@ -1235,19 +1244,19 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, wd->setintrq(wd->intrqarg); refreshdisks = SDL_TRUE; #if GENERAL_DISK_DEBUG - dbg_printf( "DISK: No sectors on this track?" ); + dbg_printf("DISK: No sectors on this track?"); #endif break; } #if GENERAL_DISK_DEBUG - dbg_printf( "DISK: %02X,%02X,%02X,%02X,%02X,%02X", - wd->currsector->id_ptr[1], - wd->currsector->id_ptr[2], - wd->currsector->id_ptr[3], - wd->currsector->id_ptr[4], - wd->currsector->id_ptr[5], - wd->currsector->id_ptr[6]); + dbg_printf("DISK: %02X,%02X,%02X,%02X,%02X,%02X", + wd->currsector->id_ptr[1], + wd->currsector->id_ptr[2], + wd->currsector->id_ptr[3], + wd->currsector->id_ptr[4], + wd->currsector->id_ptr[5], + wd->currsector->id_ptr[6]); #endif wd->r_status = WSF_NOTREADY|WSF_BUSY|WSF_DRQ; wd->setdrq(wd->drqarg); @@ -1257,7 +1266,7 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, case 0x10: // Force Interrupt (Type IV) #if GENERAL_DISK_DEBUG - dbg_printf( "DISK: (%04X) Force int", oric->cpu.pc-1 ); + dbg_printf("DISK: (%04X) Force int", oric->cpu.pc-1); #endif wd->r_status = 0; wd->clrdrq(wd->drqarg); @@ -1275,7 +1284,7 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, { case 0x00: // Read track (Type III) #if GENERAL_DISK_DEBUG - dbg_printf( "DISK: (%04X) Read track", oric->cpu.pc-1 ); + dbg_printf("DISK: (%04X) Read track", oric->cpu.pc-1); #endif wd->curroffs = 0; wd->r_status = WSF_BUSY|WSF_NOTREADY; @@ -1287,7 +1296,7 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, case 0x10: // Write track (Type III) #if GENERAL_DISK_DEBUG - dbg_printf( "DISK: (%04X) Write track", oric->cpu.pc-1 ); + dbg_printf("DISK: (%04X) Write track", oric->cpu.pc-1); #endif wd->curroffs = 0; wd->r_status = WSF_NOTREADY|WSF_BUSY; @@ -1331,7 +1340,7 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, if(wd->curroffs == 0) wd->currsector->data_ptr[wd->curroffs++]=0xfb; wd->currsector->data_ptr[wd->curroffs++] = wd->r_data; wd->crc = calc_crc(wd->crc, wd->r_data); - if( !wd->disk[wd->c_drive]->modified ) refreshdisks = SDL_TRUE; + if(!wd->disk[wd->c_drive]->modified) refreshdisks = SDL_TRUE; diskimage_set_modified(wd->disk[wd->c_drive], wd->c_side, wd->c_track); wd->r_status &= ~WSF_DRQ; wd->clrdrq(wd->drqarg); @@ -1343,7 +1352,7 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, if(wd->currentop == COP_WRITE_SECTORS) { #if GENERAL_DISK_DEBUG - dbg_printf( "Next sector..." ); + dbg_printf("Next sector..."); #endif // Get the next sector, and carry on! wd->r_sector++; @@ -1371,7 +1380,9 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, wd->r_status &= (~WSF_DRQ); wd->clrdrq(wd->drqarg); refreshdisks = SDL_TRUE; - } else { + } + else + { wd->delayeddrq = 32; } break; @@ -1384,7 +1395,7 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, // MFM: Initialize CRC generator // FM : Not allowed #if GENERAL_DISK_DEBUG - dbg_printf( "\tCOP_WRITE_TRACK: %02X -> SYNC (clear crc) -> 0xA1", wd->r_data); + dbg_printf("\tCOP_WRITE_TRACK: %02X -> SYNC (clear crc) -> 0xA1", wd->r_data); #endif wd->crc = 0x968b; wd->r_data = 0xa1; @@ -1395,7 +1406,7 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, case 0xf6: // FM : Not allowed #if GENERAL_DISK_DEBUG - dbg_printf( "\tCOP_WRITE_TRACK: %02X -> SYNC -> 0xC2", wd->r_data); + dbg_printf("\tCOP_WRITE_TRACK: %02X -> SYNC -> 0xC2", wd->r_data); #endif wd->r_data = 0xc2; wd->crc = calc_crc(wd->crc, wd->r_data); @@ -1403,7 +1414,7 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, case 0xf7: #if GENERAL_DISK_DEBUG - dbg_printf( "\tCOP_WRITE_TRACK: %02X -> CRC -> %04X", wd->r_data, wd->crc); + dbg_printf("\tCOP_WRITE_TRACK: %02X -> CRC -> %04X", wd->r_data, wd->crc); #endif wd->disk[wd->c_drive]->rawimage[(wd->c_side*wd->disk[wd->c_drive]->numtracks + wd->c_track)*6400+256 + wd->curroffs] = wd->crc >> 8; wd->curroffs++; @@ -1414,45 +1425,45 @@ void wd17xx_write( struct machine *oric, struct wd17xx *wd, unsigned short addr, // MFM: 0xf8 -> 0xff: write control byte // FM : 0xf8 -> 0xfe: Initialize CRC generator case 0xf8: - dbg_printf( "\tCOP_WRITE_TRACK: %02X -> Data Address Mark (deleted)", wd->r_data); + dbg_printf("\tCOP_WRITE_TRACK: %02X -> Data Address Mark (deleted)", wd->r_data); wd->crc = calc_crc(wd->crc, wd->r_data); // next bytes: data, ; break; case 0xf9: - dbg_printf( "\tCOP_WRITE_TRACK: %02X -> Data Mark", wd->r_data); + dbg_printf("\tCOP_WRITE_TRACK: %02X -> Data Mark", wd->r_data); wd->crc = calc_crc(wd->crc, wd->r_data); break; case 0xfa: - dbg_printf( "\tCOP_WRITE_TRACK: %02X -> Data Mark", wd->r_data); + dbg_printf("\tCOP_WRITE_TRACK: %02X -> Data Mark", wd->r_data); wd->crc = calc_crc(wd->crc, wd->r_data); break; case 0xfb: - dbg_printf( "\tCOP_WRITE_TRACK: %02X -> Data Address Mark (normal)", wd->r_data); + dbg_printf("\tCOP_WRITE_TRACK: %02X -> Data Address Mark (normal)", wd->r_data); wd->crc = calc_crc(wd->crc, wd->r_data); // next bytes: data, ; break; case 0xfc: - dbg_printf( "\tCOP_WRITE_TRACK: %02X -> Data Mark", wd->r_data); + dbg_printf("\tCOP_WRITE_TRACK: %02X -> Data Mark", wd->r_data); wd->crc = calc_crc(wd->crc, wd->r_data); break; case 0xfd: - dbg_printf( "\tCOP_WRITE_TRACK: %02X -> Data Mark", wd->r_data); + dbg_printf("\tCOP_WRITE_TRACK: %02X -> Data Mark", wd->r_data); wd->crc = calc_crc(wd->crc, wd->r_data); break; case 0xfe: - dbg_printf( "\tCOP_WRITE_TRACK: %02X -> Index Address Mark", wd->r_data); + dbg_printf("\tCOP_WRITE_TRACK: %02X -> Index Address Mark", wd->r_data); wd->crc = calc_crc(wd->crc, wd->r_data); // next 6 bytes: track, side, sector, size, ; break; case 0xff: - dbg_printf( "\tCOP_WRITE_TRACK: %02X -> ???", wd->r_data); + dbg_printf("\tCOP_WRITE_TRACK: %02X -> ???", wd->r_data); wd->crc = calc_crc(wd->crc, wd->r_data); break; #endif @@ -1526,7 +1537,7 @@ void microdisc_clrintrq(void* md) mdp->oric->cpu.irq &= ~IRQF_DISK; } -void microdisc_init( struct microdisc *md, struct wd17xx *wd, struct machine *oric ) +void microdisc_init(struct microdisc *md, struct wd17xx *wd, struct machine *oric) { wd17xx_init(wd); wd->setintrq = microdisc_setintrq; @@ -1544,16 +1555,16 @@ void microdisc_init( struct microdisc *md, struct wd17xx *wd, struct machine *or md->diskrom = SDL_TRUE; } -void microdisc_free( struct microdisc *md ) +void microdisc_free(struct microdisc *md) { int i; for(i=0; ioric, i); } -unsigned char microdisc_read( struct microdisc *md, unsigned short addr ) +unsigned char microdisc_read(struct microdisc *md, unsigned short addr) { -// dbg_printf( "DISK: (%04X) Read from %04X", md->oric->cpu.pc-1, addr ); + // dbg_printf( "DISK: (%04X) Read from %04X", md->oric->cpu.pc-1, addr ); if((addr >= 0x310) && (addr < 0x314)) return wd17xx_read(md->wd, addr&3); @@ -1572,9 +1583,9 @@ unsigned char microdisc_read( struct microdisc *md, unsigned short addr ) return via_read(&md->oric->via, addr); } -void microdisc_write( struct microdisc *md, unsigned short addr, unsigned char data ) +void microdisc_write(struct microdisc *md, unsigned short addr, unsigned char data) { -// dbg_printf( "DISK: (%04X) Write %02X to %04X", md->oric->cpu.pc-1, data, addr ); + // dbg_printf( "DISK: (%04X) Write %02X to %04X", md->oric->cpu.pc-1, data, addr ); if((addr >= 0x310) && (addr < 0x314)) { wd17xx_write(md->oric, md->wd, addr&3, data); @@ -1590,7 +1601,9 @@ void microdisc_write( struct microdisc *md, unsigned short addr, unsigned char d if((data&MDSF_INTENA) && (md->intrq == 0)) { md->oric->cpu.irq |= IRQF_DISK; - } else { + } + else + { md->oric->cpu.irq &= ~IRQF_DISK; } @@ -1674,7 +1687,7 @@ void bd500_clrintrq(void* bd) bdp->intrq = 0; } -void bd500_init( struct bd500 *bd, struct wd17xx *wd, struct machine *oric ) +void bd500_init(struct bd500 *bd, struct wd17xx *wd, struct machine *oric) { wd17xx_init(wd); wd->setintrq = bd500_setintrq; @@ -1693,18 +1706,18 @@ void bd500_init( struct bd500 *bd, struct wd17xx *wd, struct machine *oric ) bd->motor = SDL_FALSE; } -void bd500_free( struct bd500 *bd ) +void bd500_free(struct bd500 *bd) { int i; for(i=0; ioric, i); } -unsigned char bd500_read( struct bd500 *bd, unsigned short addr ) +unsigned char bd500_read(struct bd500 *bd, unsigned short addr) { unsigned char ret = 0xff; -// dbg_printf( "DISK: (%04X) Read from %04X", bd->oric->cpu.pc-1, addr ); + // dbg_printf( "DISK: (%04X) Read from %04X", bd->oric->cpu.pc-1, addr ); if((addr >= 0x320) && (addr < 0x324)) return wd17xx_read(bd->wd, addr&3); @@ -1768,9 +1781,9 @@ unsigned char bd500_read( struct bd500 *bd, unsigned short addr ) return ret; } -void bd500_write( struct bd500 *bd, unsigned short addr, unsigned char data ) +void bd500_write(struct bd500 *bd, unsigned short addr, unsigned char data) { -// dbg_printf( "DISK: (%04X) Write %02X to %04X", bd->oric->cpu.pc-1, data, addr ); + // dbg_printf( "DISK: (%04X) Write %02X to %04X", bd->oric->cpu.pc-1, data, addr ); if((addr >= 0x320) && (addr < 0x324)) { @@ -1831,7 +1844,7 @@ void jasmin_clrintrq(void* j) { } -void jasmin_init( struct jasmin *j, struct wd17xx *wd, struct machine *oric ) +void jasmin_init(struct jasmin *j, struct wd17xx *wd, struct machine *oric) { wd17xx_init(wd); wd->setintrq = jasmin_setintrq; @@ -1847,16 +1860,16 @@ void jasmin_init( struct jasmin *j, struct wd17xx *wd, struct machine *oric ) j->oric = oric; } -void jasmin_free( struct jasmin *j ) +void jasmin_free(struct jasmin *j) { int i; for(i=0; ioric, i); } -unsigned char jasmin_read( struct jasmin *j, unsigned short addr ) +unsigned char jasmin_read(struct jasmin *j, unsigned short addr) { -// dbg_printf( "DISK: (%04X) Read from %04X", md->oric->cpu.pc-1, addr ); + // dbg_printf( "DISK: (%04X) Read from %04X", md->oric->cpu.pc-1, addr ); if((addr >= 0x3f4) && (addr < 0x3f8)) return wd17xx_read(j->wd, addr&3); @@ -1885,7 +1898,7 @@ unsigned char jasmin_read( struct jasmin *j, unsigned short addr ) return via_read(&j->oric->via, addr); } -void jasmin_write( struct jasmin *j, unsigned short addr, unsigned char data ) +void jasmin_write(struct jasmin *j, unsigned short addr, unsigned char data) { if((addr >= 0x3f4) && (addr < 0x3f8)) { @@ -1926,7 +1939,7 @@ void jasmin_write( struct jasmin *j, unsigned short addr, unsigned char data ) } // Pravetz -void pravetz_init( struct pravetz *p, struct machine *oric ) +void pravetz_init(struct pravetz *p, struct machine *oric) { int i; @@ -1941,28 +1954,28 @@ void pravetz_init( struct pravetz *p, struct machine *oric ) p->drv[i].volume = 254; p->drv[i].select = 0; p->drv[i].motor_on = 0; - p->drv[i].pimg = NULL; + p->drv[i].pimg = NULL; } } -void pravetz_free( struct pravetz *p ) +void pravetz_free(struct pravetz *p) { int i; for(i=0; ioric, i); } -unsigned char pravetz_read( struct pravetz *p, unsigned short addr ) +unsigned char pravetz_read(struct pravetz *p, unsigned short addr) { unsigned char data = 0; - data = disk_pravetz_read( p->oric, addr ); + data = disk_pravetz_read(p->oric, addr); p->oric->wddisk.currentop = p->drv[p->oric->wddisk.c_drive].motor_on ? COP_READ_SECTOR : COP_NUFFINK; return data; } -void pravetz_write( struct pravetz *p, unsigned short addr, unsigned char data ) +void pravetz_write(struct pravetz *p, unsigned short addr, unsigned char data) { - disk_pravetz_write( p->oric, addr, data ); + disk_pravetz_write(p->oric, addr, data); p->oric->wddisk.currentop = p->drv[p->oric->wddisk.c_drive].motor_on ? COP_WRITE_SECTOR : COP_NUFFINK; } diff --git a/disk.h b/disk.h index c08389b0..3ee585c0 100644 --- a/disk.h +++ b/disk.h @@ -144,12 +144,12 @@ struct wd17xx Uint8 c_sector; // Currently selected sector ID Uint8 sectype; // When reading a sector, this is used to remember if it was marked as deleted SDL_bool last_step_in; // Set to TRUE if the last seek operation stepped the head inwards - void (*setintrq)(void *); // Function pointer called by the WD17xx core when INTRQ is set (used for microdisc/jasmin integration) - void (*clrintrq)(void *); // Called when INTRQ is cleared - void *intrqarg; // Userdata passed to setintrq/clrintrq - void (*setdrq)(void *); // Called when DRQ is set - void (*clrdrq)(void *); // Called when DRQ is cleared - void *drqarg; // Userdata passed to setdrq/clrdrq + void (*setintrq)(void*); // Function pointer called by the WD17xx core when INTRQ is set (used for microdisc/jasmin integration) + void (*clrintrq)(void*); // Called when INTRQ is cleared + void* intrqarg; // Userdata passed to setintrq/clrintrq + void (*setdrq)(void*); // Called when DRQ is set + void (*clrdrq)(void*); // Called when DRQ is cleared + void* drqarg; // Userdata passed to setdrq/clrdrq struct diskimage *disk[MAX_DRIVES]; // Loaded disk images int currentop; // Current operation in progress struct mfmsector *currsector; // Pointers to the current sector in the disk image being used by an active read or write operation @@ -219,37 +219,37 @@ struct pravetz struct pravetz_drive drv[MAX_DRIVES]; }; -void disk_eject( struct machine *oric, int drive ); +void disk_eject(struct machine *oric, int drive); // Functions to read/write diskimages -SDL_bool diskimage_load( struct machine *oric, char *fname, int drive ); -SDL_bool diskimage_save( struct machine *oric, char *fname, int drive ); -void diskimage_cachetrack( struct diskimage *dimg, int track, int side ); -struct mfmsector *wd17xx_find_sector( struct wd17xx *wd, Uint8 secid ); +SDL_bool diskimage_load(struct machine *oric, char* fname, int drive); +SDL_bool diskimage_save(struct machine *oric, char* fname, int drive); +void diskimage_cachetrack(struct diskimage *dimg, int track, int side); +struct mfmsector *wd17xx_find_sector(struct wd17xx *wd, Uint8 secid); // Call this to emulate some cycles of disk activity -void wd17xx_ticktock( struct wd17xx *wd, int cycles ); +void wd17xx_ticktock(struct wd17xx *wd, int cycles); // Microdisc interface -void microdisc_init( struct microdisc *md, struct wd17xx *wd, struct machine *oric ); -void microdisc_free( struct microdisc *md ); -unsigned char microdisc_read( struct microdisc *md, unsigned short addr ); -void microdisc_write( struct microdisc *md, unsigned short addr, unsigned char data ); +void microdisc_init(struct microdisc *md, struct wd17xx *wd, struct machine *oric); +void microdisc_free(struct microdisc *md); +unsigned char microdisc_read(struct microdisc *md, unsigned short addr); +void microdisc_write(struct microdisc *md, unsigned short addr, unsigned char data); // Byte Drive 500 interface -void bd500_init( struct bd500 *bd, struct wd17xx *wd, struct machine *oric ); -void bd500_free( struct bd500 *bd ); -unsigned char bd500_read( struct bd500 *bd, unsigned short addr ); -void bd500_write( struct bd500 *bd, unsigned short addr, unsigned char data ); +void bd500_init(struct bd500 *bd, struct wd17xx *wd, struct machine *oric); +void bd500_free(struct bd500 *bd); +unsigned char bd500_read(struct bd500 *bd, unsigned short addr); +void bd500_write(struct bd500 *bd, unsigned short addr, unsigned char data); // Jasmin interface -void jasmin_init( struct jasmin *j, struct wd17xx *wd, struct machine *oric ); -void jasmin_free( struct jasmin *j ); -unsigned char jasmin_read( struct jasmin *j, unsigned short addr ); -void jasmin_write( struct jasmin *j, unsigned short addr, unsigned char data ); +void jasmin_init(struct jasmin *j, struct wd17xx *wd, struct machine *oric); +void jasmin_free(struct jasmin *j); +unsigned char jasmin_read(struct jasmin *j, unsigned short addr); +void jasmin_write(struct jasmin *j, unsigned short addr, unsigned char data); // Pravetz 8D disk interface -void pravetz_init( struct pravetz *p, struct machine *oric ); -void pravetz_free( struct pravetz *p ); -unsigned char pravetz_read( struct pravetz *p, unsigned short addr ); -void pravetz_write( struct pravetz *p, unsigned short addr, unsigned char data ); +void pravetz_init(struct pravetz *p, struct machine *oric); +void pravetz_free(struct pravetz *p); +unsigned char pravetz_read(struct pravetz *p, unsigned short addr); +void pravetz_write(struct pravetz *p, unsigned short addr, unsigned char data); diff --git a/disk_pravetz.c b/disk_pravetz.c index e30e3fbf..af3cbb77 100644 --- a/disk_pravetz.c +++ b/disk_pravetz.c @@ -51,87 +51,87 @@ static void disk_pravetz_switch(struct machine *oric, Uint16 addr); Uint8 disk_pravetz_read(struct machine *oric, Uint16 addr) { - disk_pravetz_switch(oric, addr-PRAV_DISK_OFFSET); - /* odd addresses don't produce anything */ - return (!(addr & 1))? disk_pravetz_read_selected(oric) : 0; + disk_pravetz_switch(oric, addr-PRAV_DISK_OFFSET); + /* odd addresses don't produce anything */ + return (!(addr & 1))? disk_pravetz_read_selected(oric) : 0; } void disk_pravetz_write(struct machine *oric, Uint16 addr, Uint8 data) { - disk_pravetz_switch(oric, addr-PRAV_DISK_OFFSET); - /* even addresses don't write anything */ - if(addr & 1) - { - disk_pravetz_write_selected(oric, data); - } + disk_pravetz_switch(oric, addr-PRAV_DISK_OFFSET); + /* even addresses don't write anything */ + if(addr & 1) + { + disk_pravetz_write_selected(oric, data); + } } /* Skewing-Table */ static int interleave[16] = { - 0, 7, 14, 6, 13, 5, 12, 4, 11, 3, 10, 2, 9, 1, 8, 15 + 0, 7, 14, 6, 13, 5, 12, 4, 11, 3, 10, 2, 9, 1, 8, 15 }; /* Translation Table */ static int translate[256] = { - 0x96, 0x97, 0x9a, 0x9b, 0x9d, 0x9e, 0x9f, 0xa6, - 0xa7, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb2, 0xb3, - 0xb4, 0xb5, 0xb6, 0xb7, 0xb9, 0xba, 0xbb, 0xbc, - 0xbd, 0xbe, 0xbf, 0xcb, 0xcd, 0xce, 0xcf, 0xd3, - 0xd6, 0xd7, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, - 0xdf, 0xe5, 0xe6, 0xe7, 0xe9, 0xea, 0xeb, 0xec, - 0xed, 0xee, 0xef, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, - 0xf7, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x01, - 0x80, 0x80, 0x02, 0x03, 0x80, 0x04, 0x05, 0x06, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x07, 0x08, - 0x80, 0x80, 0x80, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, - 0x80, 0x80, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, - 0x80, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x1b, 0x80, 0x1c, 0x1d, 0x1e, - 0x80, 0x80, 0x80, 0x1f, 0x80, 0x80, 0x20, 0x21, - 0x80, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x29, 0x2a, 0x2b, - 0x80, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, - 0x80, 0x80, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, - 0x80, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f + 0x96, 0x97, 0x9a, 0x9b, 0x9d, 0x9e, 0x9f, 0xa6, + 0xa7, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, 0xb9, 0xba, 0xbb, 0xbc, + 0xbd, 0xbe, 0xbf, 0xcb, 0xcd, 0xce, 0xcf, 0xd3, + 0xd6, 0xd7, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, + 0xdf, 0xe5, 0xe6, 0xe7, 0xe9, 0xea, 0xeb, 0xec, + 0xed, 0xee, 0xef, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, + 0xf7, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x01, + 0x80, 0x80, 0x02, 0x03, 0x80, 0x04, 0x05, 0x06, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x07, 0x08, + 0x80, 0x80, 0x80, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, + 0x80, 0x80, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, + 0x80, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x1b, 0x80, 0x1c, 0x1d, 0x1e, + 0x80, 0x80, 0x80, 0x1f, 0x80, 0x80, 0x20, 0x21, + 0x80, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x29, 0x2a, 0x2b, + 0x80, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, + 0x80, 0x80, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, + 0x80, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f }; -static void disk_pravetz_update_position (struct pravetz_drive *drv) +static void disk_pravetz_update_position(struct pravetz_drive *drv) { - if (drv->motor_on) - { - drv->byte = (1 + drv->byte) % PRAV_RAW_TRACK_SIZE; - } + if(drv->motor_on) + { + drv->byte = (1 + drv->byte) % PRAV_RAW_TRACK_SIZE; + } } Uint8 disk_pravetz_image_raw_byte(struct machine *oric, int drive, Uint16 t_idx, Uint16 s_idx, Uint16 b_idx) { - long f_pos; + long f_pos; - static Uint8 old; - static Uint8 eor; - static Uint8 raw; - static Uint8 check; + static Uint8 old; + static Uint8 eor; + static Uint8 raw; + static Uint8 check; - struct pravetz_drive *drv = &oric->pravetz.drv[drive]; + struct pravetz_drive *drv = &oric->pravetz.drv[drive]; - raw = 0xFF; + raw = 0xFF; - switch (b_idx) - { + switch(b_idx) + { case 0: case 1: case 2: @@ -143,118 +143,118 @@ Uint8 disk_pravetz_image_raw_byte(struct machine *oric, int drive, Uint16 t_id case 22: case 23: case 24: - /* sync bytes */ - return 0xFF; + /* sync bytes */ + return 0xFF; case 6: case 25: - /* sector header byte #1 */ - return 0xD5; + /* sector header byte #1 */ + return 0xD5; case 7: case 26: - /* sector header byte #2 */ - return 0xAA; + /* sector header byte #2 */ + return 0xAA; case 8: - /* address header byte */ - return 0x96; + /* address header byte */ + return 0x96; case 9: - /* volume byte #1 */ - check = drv->volume; - return 0xAA | (drv->volume >> 1); + /* volume byte #1 */ + check = drv->volume; + return 0xAA | (drv->volume >> 1); case 10: - /* volume */ - return 0xAA | drv->volume; + /* volume */ + return 0xAA | drv->volume; case 11: - /* track byte #1 */ - check ^= t_idx; - return 0xAA | (t_idx >> 1); + /* track byte #1 */ + check ^= t_idx; + return 0xAA | (t_idx >> 1); case 12: - /* track byte #2 */ - return 0xAA | t_idx; + /* track byte #2 */ + return 0xAA | t_idx; case 13: - /* sector byte #1 */ - check ^= s_idx; - return 0xAA | (s_idx >> 1); + /* sector byte #1 */ + check ^= s_idx; + return 0xAA | (s_idx >> 1); case 14: - /* sector byte #2 */ - return 0xAA | s_idx; + /* sector byte #2 */ + return 0xAA | s_idx; case 15: - /* checksum byte #1 */ - return 0xAA | (check >> 1); + /* checksum byte #1 */ + return 0xAA | (check >> 1); case 16: - /* checksum byte #2 */ - return 0xAA | check; + /* checksum byte #2 */ + return 0xAA | check; case 17: case 371: - /* address/data trailer byte #1 */ - return 0xDE; + /* address/data trailer byte #1 */ + return 0xDE; case 18: case 372: - /* address/data trailer byte #2 */ - return 0xAA; + /* address/data trailer byte #2 */ + return 0xAA; case 19: case 373: - /* address/data trailer byte #3 */ - return 0xEB; + /* address/data trailer byte #3 */ + return 0xEB; case 27: - /* data header */ - eor = 0; + /* data header */ + eor = 0; - /* Read the coming sector */ - f_pos = (256 * 16 * t_idx) + (256 * interleave[s_idx]); - if (drv->pimg) - drv->sector_ptr = &drv->pimg->rawimage[f_pos]; - else - drv->sector_ptr = NULL; - return 0xAD; + /* Read the coming sector */ + f_pos = (256 * 16 * t_idx) + (256 * interleave[s_idx]); + if(drv->pimg) + drv->sector_ptr = &drv->pimg->rawimage[f_pos]; + else + drv->sector_ptr = NULL; + return 0xAD; case 370: - /* checksum */ - return translate[eor & 0x3F]; + /* checksum */ + return translate[eor & 0x3F]; default: - b_idx -= 28; - - if (b_idx >= 0x56) - { - /* 6 Bit */ - old = drv->sector_ptr[b_idx - 0x56]; - old = old >> 2; - eor ^= old; - raw = translate[eor & 0x3F]; - eor = old; - } - else - { - /* 3 * 2 Bit */ - old = (drv->sector_ptr[b_idx] & 0x01) << 1; - old |= (drv->sector_ptr[b_idx] & 0x02) >> 1; - old |= (drv->sector_ptr[b_idx + 0x56] & 0x01) << 3; - old |= (drv->sector_ptr[b_idx + 0x56] & 0x02) << 1; - old |= (drv->sector_ptr[b_idx + 0xAC] & 0x01) << 5; - old |= (drv->sector_ptr[b_idx + 0xAC] & 0x02) << 3; - eor ^= old; - raw = translate[eor & 0x3F]; - eor = old; - } - break; - } - - return raw; + b_idx -= 28; + + if(b_idx >= 0x56) + { + /* 6 Bit */ + old = drv->sector_ptr[b_idx - 0x56]; + old = old >> 2; + eor ^= old; + raw = translate[eor & 0x3F]; + eor = old; + } + else + { + /* 3 * 2 Bit */ + old = (drv->sector_ptr[b_idx] & 0x01) << 1; + old |= (drv->sector_ptr[b_idx] & 0x02) >> 1; + old |= (drv->sector_ptr[b_idx + 0x56] & 0x01) << 3; + old |= (drv->sector_ptr[b_idx + 0x56] & 0x02) << 1; + old |= (drv->sector_ptr[b_idx + 0xAC] & 0x01) << 5; + old |= (drv->sector_ptr[b_idx + 0xAC] & 0x02) << 3; + eor ^= old; + raw = translate[eor & 0x3F]; + eor = old; + } + break; + } + + return raw; } @@ -264,30 +264,30 @@ Uint8 disk_pravetz_image_raw_byte(struct machine *oric, int drive, Uint16 t_id static Uint8 disk_pravetz_readbyte(struct machine *oric) { - struct pravetz_drive *drv = &oric->pravetz.drv[oric->wddisk.c_drive]; + struct pravetz_drive *drv = &oric->pravetz.drv[oric->wddisk.c_drive]; - /* make sure there's a 'disk in the drive' */ - if (!drv->pimg) - return 0xFF; + /* make sure there's a 'disk in the drive' */ + if(!drv->pimg) + return 0xFF; - disk_pravetz_update_position(drv); + disk_pravetz_update_position(drv); - /**/ + /**/ #if GENERAL_DISK_DEBUG - if(last_sector != drv->byte / PRAV_RAW_BYTES_PER_SECTOR || last_track != drv->half_track) - { - printf("{R} fdu: T:%.2d S:%.2X.%.3d [%.2X]\n", - drv->half_track / 2, - drv->byte / PRAV_RAW_BYTES_PER_SECTOR, - drv->byte % PRAV_RAW_BYTES_PER_SECTOR, - drv->image[drv->half_track / 2][drv->byte]); - last_sector = drv->byte / PRAV_RAW_BYTES_PER_SECTOR; - last_track = drv->half_track; - } + if(last_sector != drv->byte / PRAV_RAW_BYTES_PER_SECTOR || last_track != drv->half_track) + { + printf("{R} fdu: T:%.2d S:%.2X.%.3d [%.2X]\n", + drv->half_track / 2, + drv->byte / PRAV_RAW_BYTES_PER_SECTOR, + drv->byte % PRAV_RAW_BYTES_PER_SECTOR, + drv->image[drv->half_track / 2][drv->byte]); + last_sector = drv->byte / PRAV_RAW_BYTES_PER_SECTOR; + last_track = drv->half_track; + } #endif - /**/ + /**/ - return drv->image[drv->half_track / 2][drv->byte]; + return drv->image[drv->half_track / 2][drv->byte]; } /** @@ -297,149 +297,149 @@ static Uint8 disk_pravetz_readbyte(struct machine *oric) static Uint8 disk_pravetz_read_selected(struct machine *oric) { - struct pravetz_drive *drv = &oric->pravetz.drv[oric->wddisk.c_drive]; + struct pravetz_drive *drv = &oric->pravetz.drv[oric->wddisk.c_drive]; - if (!drv->write_ready) - { - drv->write_ready = 0x80; - } + if(!drv->write_ready) + { + drv->write_ready = 0x80; + } - switch (drv->select) - { + switch(drv->select) + { case 0: - return disk_pravetz_readbyte(oric); + return disk_pravetz_readbyte(oric); case 1: - return drv->prot | drv->motor_on; + return drv->prot | drv->motor_on; case 2: - return drv->write_ready; - } + return drv->write_ready; + } - return 0; + return 0; } static Uint8 temp_sector_buffer[PRAV_BYTES_PER_SECTOR + 2]; void disk_pravetz_write_image(struct pravetz_drive *d_ptr) { - Uint8 eor; - Uint8 s_idx; - - int sector_search_count; - - int t_idx; - int b_idx; - int tb_idx; - int sector_count, f_pos; - - if (!d_ptr) - return; - - if (!d_ptr->dirty) - return; - - tb_idx = 0; - for (t_idx = 0; t_idx < PRAV_TRACKS_PER_DISK; t_idx++) - { - sector_count = 16; + Uint8 eor; + Uint8 s_idx; -find_sector: + int sector_search_count; - /* look for the sector header */ + int t_idx; + int b_idx; + int tb_idx; + int sector_count, f_pos; - sector_search_count = 0; - while (0xD5 != d_ptr->image[t_idx][tb_idx]) - { - tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; - if (++sector_search_count > PRAV_RAW_TRACK_SIZE) return; - } + if(!d_ptr) + return; - tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; - if (0xAA != d_ptr->image[t_idx][tb_idx]) - { - tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; - goto find_sector; - } + if(!d_ptr->dirty) + return; - tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; - if (0x96 != d_ptr->image[t_idx][tb_idx]) - { - tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; - goto find_sector; - } + tb_idx = 0; + for(t_idx = 0; t_idx < PRAV_TRACKS_PER_DISK; t_idx++) + { + sector_count = 16; + +find_sector: - /* found the sector header */ + /* look for the sector header */ - /* skip 'volume' and 'track' */ - tb_idx = (tb_idx + 5) % PRAV_RAW_TRACK_SIZE; + sector_search_count = 0; + while(0xD5 != d_ptr->image[t_idx][tb_idx]) + { + tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; + if(++sector_search_count > PRAV_RAW_TRACK_SIZE) return; + } - /* sector byte #1 */ - s_idx = 0x55 | (d_ptr->image[t_idx][tb_idx] << 1); - tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; - s_idx &= d_ptr->image[t_idx][tb_idx]; - tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; + tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; + if(0xAA != d_ptr->image[t_idx][tb_idx]) + { + tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; + goto find_sector; + } - /* look for the sector data */ + tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; + if(0x96 != d_ptr->image[t_idx][tb_idx]) + { + tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; + goto find_sector; + } - while (0xD5 != d_ptr->image[t_idx][tb_idx]) - tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; + /* found the sector header */ - tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; - if (0xAA != d_ptr->image[t_idx][tb_idx]) - { - tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; - goto find_sector; - } + /* skip 'volume' and 'track' */ + tb_idx = (tb_idx + 5) % PRAV_RAW_TRACK_SIZE; - tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; - if (0xAD != d_ptr->image[t_idx][tb_idx]) - { - tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; - goto find_sector; - } + /* sector byte #1 */ + s_idx = 0x55 | (d_ptr->image[t_idx][tb_idx] << 1); + tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; + s_idx &= d_ptr->image[t_idx][tb_idx]; + tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; - /* found the sector data */ + /* look for the sector data */ - tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; - eor = 0; + while(0xD5 != d_ptr->image[t_idx][tb_idx]) + tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; - for (b_idx = 0; b_idx < 342; b_idx++) - { - eor ^= translate[d_ptr->image[t_idx][tb_idx]]; - tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; + tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; + if(0xAA != d_ptr->image[t_idx][tb_idx]) + { + tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; + goto find_sector; + } - if (b_idx >= 0x56) - { - /* 6 Bit */ - temp_sector_buffer[b_idx - 0x56] |= (eor << 2); - } - else - { - /* 3 * 2 Bit */ - temp_sector_buffer[b_idx] = (eor & 0x01) << 1; - temp_sector_buffer[b_idx] |= (eor & 0x02) >> 1; - temp_sector_buffer[b_idx + 0x56] = (eor & 0x04) >> 1; - temp_sector_buffer[b_idx + 0x56] |= (eor & 0x08) >> 3; - temp_sector_buffer[b_idx + 0xAC] = (eor & 0x10) >> 3; - temp_sector_buffer[b_idx + 0xAC] |= (eor & 0x20) >> 5; - } - } + tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; + if(0xAD != d_ptr->image[t_idx][tb_idx]) + { + tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; + goto find_sector; + } - /* write the sector */ - f_pos = (PRAV_BYTES_PER_SECTOR * PRAV_SECTORS_PER_TRACK * t_idx) + - (PRAV_BYTES_PER_SECTOR * interleave[s_idx]); + /* found the sector data */ - memcpy(&d_ptr->pimg->rawimage[f_pos], temp_sector_buffer, PRAV_BYTES_PER_SECTOR); - d_ptr->pimg->modified = SDL_TRUE; - d_ptr->pimg->modified_time = 0; - sector_count--; + tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; + eor = 0; - if (sector_count) - goto find_sector; + for(b_idx = 0; b_idx < 342; b_idx++) + { + eor ^= translate[d_ptr->image[t_idx][tb_idx]]; + tb_idx = (tb_idx + 1) % PRAV_RAW_TRACK_SIZE; + + if(b_idx >= 0x56) + { + /* 6 Bit */ + temp_sector_buffer[b_idx - 0x56] |= (eor << 2); + } + else + { + /* 3 * 2 Bit */ + temp_sector_buffer[b_idx] = (eor & 0x01) << 1; + temp_sector_buffer[b_idx] |= (eor & 0x02) >> 1; + temp_sector_buffer[b_idx + 0x56] = (eor & 0x04) >> 1; + temp_sector_buffer[b_idx + 0x56] |= (eor & 0x08) >> 3; + temp_sector_buffer[b_idx + 0xAC] = (eor & 0x10) >> 3; + temp_sector_buffer[b_idx + 0xAC] |= (eor & 0x20) >> 5; + } } - d_ptr->dirty = SDL_FALSE; + /* write the sector */ + f_pos = (PRAV_BYTES_PER_SECTOR * PRAV_SECTORS_PER_TRACK * t_idx) + + (PRAV_BYTES_PER_SECTOR * interleave[s_idx]); + + memcpy(&d_ptr->pimg->rawimage[f_pos], temp_sector_buffer, PRAV_BYTES_PER_SECTOR); + d_ptr->pimg->modified = SDL_TRUE; + d_ptr->pimg->modified_time = 0; + sector_count--; + + if(sector_count) + goto find_sector; + } + + d_ptr->dirty = SDL_FALSE; } /** @@ -448,37 +448,37 @@ void disk_pravetz_write_image(struct pravetz_drive *d_ptr) static void disk_pravetz_writebyte(struct machine *oric, Uint8 w_byte) { - struct pravetz_drive *drv = &oric->pravetz.drv[oric->wddisk.c_drive]; - disk_pravetz_update_position(drv); + struct pravetz_drive *drv = &oric->pravetz.drv[oric->wddisk.c_drive]; + disk_pravetz_update_position(drv); - /* make sure there's a 'disk in the drive' */ - if (!drv->pimg) - return; + /* make sure there's a 'disk in the drive' */ + if(!drv->pimg) + return; - if (drv->prot) - return; + if(drv->prot) + return; - /* don't allow impossible bytes */ - if (w_byte < 0x96) - return; + /* don't allow impossible bytes */ + if(w_byte < 0x96) + return; - drv->dirty = SDL_TRUE; - drv->image[drv->half_track / 2][drv->byte] = w_byte; + drv->dirty = SDL_TRUE; + drv->image[drv->half_track / 2][drv->byte] = w_byte; - /**/ + /**/ #if GENERAL_DISK_DEBUG - if(last_sector != drv->byte / PRAV_RAW_BYTES_PER_SECTOR || last_track != drv->half_track) - { - printf("{W} fdu: T:%.2d S:%.2X.%.3d [%.2X]\n", - drv->half_track / 2, - drv->byte / PRAV_RAW_BYTES_PER_SECTOR, - drv->byte % PRAV_RAW_BYTES_PER_SECTOR, - w_byte); - last_sector = drv->byte / PRAV_RAW_BYTES_PER_SECTOR; - last_track = drv->half_track; - } + if(last_sector != drv->byte / PRAV_RAW_BYTES_PER_SECTOR || last_track != drv->half_track) + { + printf("{W} fdu: T:%.2d S:%.2X.%.3d [%.2X]\n", + drv->half_track / 2, + drv->byte / PRAV_RAW_BYTES_PER_SECTOR, + drv->byte % PRAV_RAW_BYTES_PER_SECTOR, + w_byte); + last_sector = drv->byte / PRAV_RAW_BYTES_PER_SECTOR; + last_track = drv->half_track; + } #endif - /**/ + /**/ } /** @@ -488,90 +488,90 @@ static void disk_pravetz_writebyte(struct machine *oric, Uint8 w_byte) static void disk_pravetz_write_selected(struct machine *oric, Uint8 w_byte) { - struct pravetz_drive *drv = &oric->pravetz.drv[oric->wddisk.c_drive]; + struct pravetz_drive *drv = &oric->pravetz.drv[oric->wddisk.c_drive]; - if (3 == drv->select) + if(3 == drv->select) + { + if(drv->motor_on) { - if (drv->motor_on) - { - if (drv->write_ready) - { - disk_pravetz_writebyte(oric, w_byte); - drv->write_ready = 0; - } - } + if(drv->write_ready) + { + disk_pravetz_writebyte(oric, w_byte); + drv->write_ready = 0; + } } + } } -static void disk_pravetz_switch (struct machine *oric, Uint16 addr) +static void disk_pravetz_switch(struct machine *oric, Uint16 addr) { - struct pravetz_drive *drv = &oric->pravetz.drv[oric->wddisk.c_drive]; + struct pravetz_drive *drv = &oric->pravetz.drv[oric->wddisk.c_drive]; - switch (addr & 0xF) - { + switch(addr & 0xF) + { case 0x08: - drv->motor_on = 0; - disk_pravetz_write_image(drv); - break; + drv->motor_on = 0; + disk_pravetz_write_image(drv); + break; case 0x09: - drv->motor_on = 0x20; - break; + drv->motor_on = 0x20; + break; /* select drive 0/1 */ case 0x0A: case 0x0B: - if (oric->wddisk.c_drive != (addr&1)) - { - disk_pravetz_write_image(drv); - oric->wddisk.c_drive = addr&1; - } - break; + if(oric->wddisk.c_drive != (addr&1)) + { + disk_pravetz_write_image(drv); + oric->wddisk.c_drive = addr&1; + } + break; case 0x0C: - drv->select &= 0xFE; - break; + drv->select &= 0xFE; + break; case 0x0D: - drv->select |= 0x01; - break; + drv->select |= 0x01; + break; case 0x0E: - drv->select &= 0xFD; - break; + drv->select &= 0xFD; + break; case 0x0F: - drv->select |= 0x02; - break; + drv->select |= 0x02; + break; default: - { + { int phase = (addr & 0x06) >> 1; /* move the head in and out by stepping motor */ - if (addr & 0x01) + if(addr & 0x01) { - phase += 4; - phase -= (drv->half_track % 4); - phase %= 4; + phase += 4; + phase -= (drv->half_track % 4); + phase %= 4; - if (1 == phase) + if(1 == phase) + { + if(drv->half_track < (2 * PRAV_TRACKS_PER_DISK - 2)) { - if (drv->half_track < (2 * PRAV_TRACKS_PER_DISK - 2)) - { - drv->half_track++; - } + drv->half_track++; } - else if (3 == phase) + } + else if(3 == phase) + { + if(drv->half_track > 0) { - if (drv->half_track > 0) - { - drv->half_track--; - } + drv->half_track--; } + } } - } - break; - } + } + break; + } } diff --git a/filereq.h b/filereq.h index 0cabefa2..f7f5e1e9 100644 --- a/filereq.h +++ b/filereq.h @@ -34,7 +34,7 @@ enum FR_OTHER }; -SDL_bool init_filerequester( struct machine *oric ); -void shut_filerequester( struct machine *oric ); -SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fname, int type ); +SDL_bool init_filerequester(struct machine *oric); +void shut_filerequester(struct machine *oric); +SDL_bool filerequester(struct machine *oric, char* title, char* path, char* fname, int type); diff --git a/filereq_amiga.c b/filereq_amiga.c index e6164c68..29a8a0a0 100644 --- a/filereq_amiga.c +++ b/filereq_amiga.c @@ -46,44 +46,44 @@ static struct FileRequester *req = NULL; struct AslIFace *IAsl = NULL; #endif -SDL_bool init_filerequester( struct machine *oric ) +SDL_bool init_filerequester(struct machine *oric) { - AslBase = OpenLibrary( (CONST_STRPTR)AslName, 39 ); - if( !AslBase ) return SDL_FALSE; + AslBase = OpenLibrary((CONST_STRPTR)AslName, 39); + if(!AslBase) return SDL_FALSE; #ifdef __amigaos4__ - IAsl = (struct AslIFace *)GetInterface( AslBase, "main", 1, NULL ); - if( !IAsl ) return SDL_FALSE; + IAsl = (struct AslIFace *)GetInterface(AslBase, "main", 1, NULL); + if(!IAsl) return SDL_FALSE; #endif - req = (struct FileRequester *)AllocAslRequestTags( ASL_FileRequest, TAG_DONE ); - if( !req ) return SDL_FALSE; + req = (struct FileRequester *)AllocAslRequestTags(ASL_FileRequest, TAG_DONE); + if(!req) return SDL_FALSE; return SDL_TRUE; } -void shut_filerequester( struct machine *oric ) +void shut_filerequester(struct machine *oric) { - if( req ) FreeAslRequest( req ); + if(req) FreeAslRequest(req); #ifdef __amigaos4__ - if( IAsl ) DropInterface( (struct Interface *)IAsl ); + if(IAsl) DropInterface((struct Interface *)IAsl); #endif - if( AslBase ) CloseLibrary( AslBase ); + if(AslBase) CloseLibrary(AslBase); } -SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fname, int type ) +SDL_bool filerequester(struct machine *oric, char* title, char* path, char* fname, int type) { - char *pat, ppat[16*2+2]; + char* pat, ppat[16*2+2]; BOOL dosavemode = FALSE; - - switch( type ) + + switch(type) { case FR_DISKSAVE: dosavemode = TRUE; case FR_DISKLOAD: pat = "#?.dsk"; break; - + case FR_TAPESAVETAP: dosavemode = TRUE; pat = "#?.tap"; @@ -97,7 +97,7 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna case FR_TAPELOAD: pat = "#?.(tap|ort|wav)"; break; - + case FR_ROMS: pat = "#?.rom"; break; @@ -107,35 +107,37 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna case FR_SNAPSHOTLOAD: pat = "#?.sna"; break; - + case FR_KEYMAPPINGSAVE: - dosavemode = TRUE; + dosavemode = TRUE; case FR_KEYMAPPINGLOAD: - pat = "#?.kma"; - break; - + pat = "#?.kma"; + break; + default: pat = NULL; break; } - - if( pat ) ParsePatternNoCase( (CONST_STRPTR)pat, (UBYTE *)ppat, 16*2+2 ); - - if( !AslRequestTags( req, - ASLFR_TitleText, title, - ASLFR_InitialDrawer, path, - ASLFR_InitialFile, fname, - ASLFR_DoPatterns, pat != NULL, - ASLFR_RejectIcons, TRUE, - ASLFR_DoSaveMode, dosavemode, - pat ? ASLFR_AcceptPattern : TAG_IGNORE, ppat, - pat ? ASLFR_InitialPattern : TAG_IGNORE, pat, - TAG_DONE ) ) + + if(pat) ParsePatternNoCase((CONST_STRPTR)pat, (UBYTE *)ppat, 16*2+2); + + if(!AslRequestTags(req, + ASLFR_TitleText, title, + ASLFR_InitialDrawer, path, + ASLFR_InitialFile, fname, + ASLFR_DoPatterns, pat != NULL, + ASLFR_RejectIcons, TRUE, + ASLFR_DoSaveMode, dosavemode, + pat ? ASLFR_AcceptPattern : TAG_IGNORE, ppat, + pat ? ASLFR_InitialPattern : TAG_IGNORE, pat, + TAG_DONE)) return SDL_FALSE; - - strncpy( path, (const char *)req->fr_Drawer, 4096 ); path[4095] = 0; - strncpy( fname, (const char *)req->fr_File, 512 ); fname[511] = 0; - + + strncpy(path, (const char*)req->fr_Drawer, 4096); + path[4095] = 0; + strncpy(fname, (const char*)req->fr_File, 512); + fname[511] = 0; + return SDL_TRUE; } diff --git a/filereq_beos.cpp b/filereq_beos.cpp index dedf78db..9f41f35b 100644 --- a/filereq_beos.cpp +++ b/filereq_beos.cpp @@ -43,85 +43,93 @@ extern "C" { } -class PanelLooper : public BLooper { -public: - PanelLooper(); - virtual ~PanelLooper(); - virtual void MessageReceived(BMessage* message); - - void Wait(); - SDL_bool DoIt() const { return fDoIt; }; - void GetRef(entry_ref &ref) const { ref = fRef; }; - -private: - sem_id fSem; - entry_ref fRef; - SDL_bool fDoIt; +class PanelLooper : public BLooper +{ + public: + PanelLooper(); + virtual ~PanelLooper(); + virtual void MessageReceived(BMessage* message); + + void Wait(); + SDL_bool DoIt() const + { + return fDoIt; + }; + void GetRef(entry_ref &ref) const + { + ref = fRef; + }; + + private: + sem_id fSem; + entry_ref fRef; + SDL_bool fDoIt; }; PanelLooper::PanelLooper() - : BLooper("PanelLooper"), - fDoIt(SDL_FALSE) + : BLooper("PanelLooper"), + fDoIt(SDL_FALSE) { - fSem = create_sem(0, "PanelLooper lock"); + fSem = create_sem(0, "PanelLooper lock"); } PanelLooper::~PanelLooper() { - delete_sem(fSem); + delete_sem(fSem); } void PanelLooper::MessageReceived(BMessage* message) { - //message->PrintToStream(); - switch (message->what) { - case B_SAVE_REQUESTED: - message->FindRef("refs", &fRef); - fDoIt = SDL_TRUE; - break; - case B_REFS_RECEIVED: - message->FindRef("refs", &fRef); - fDoIt = SDL_TRUE; - break; - case B_CANCEL: - default: - break; - } - release_sem(fSem); + //message->PrintToStream(); + switch(message->what) + { + case B_SAVE_REQUESTED: + message->FindRef("refs", &fRef); + fDoIt = SDL_TRUE; + break; + case B_REFS_RECEIVED: + message->FindRef("refs", &fRef); + fDoIt = SDL_TRUE; + break; + case B_CANCEL: + default: + break; + } + release_sem(fSem); } void PanelLooper::Wait() { - acquire_sem(fSem); + acquire_sem(fSem); } -SDL_bool init_filerequester( struct machine *oric ) +SDL_bool init_filerequester(struct machine *oric) { return SDL_TRUE; } -void shut_filerequester( struct machine *oric ) +void shut_filerequester(struct machine *oric) { } -SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fname, int type ) +SDL_bool filerequester(struct machine *oric, char* title, char* path, char* fname, int type) { - BFilePanel *panel; - PanelLooper *looper = new PanelLooper(); - looper->Run(); - SDL_bool ret; + BFilePanel *panel; + PanelLooper *looper = new PanelLooper(); + looper->Run(); + SDL_bool ret; - char *pat; + char* pat; bool dosavemode = false; - - switch( type ) + + switch(type) { case FR_DISKSAVE: dosavemode = true; @@ -136,7 +144,7 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna case FR_TAPELOAD: pat = "*.tap"; break; - + case FR_ROMS: pat = "*.rom"; break; @@ -146,42 +154,45 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna case FR_SNAPSHOTLOAD: pat = "*.sna"; break; - + case FR_KEYMAPPINGSAVE: - dosavemode = true; + dosavemode = true; case FR_KEYMAPPINGLOAD: - pat = "*.kma"; - break; - + pat = "*.kma"; + break; + default: pat = NULL; break; } - //XXX: use RefFilter + //XXX: use RefFilter + + panel = new BFilePanel(dosavemode ? B_SAVE_PANEL : B_OPEN_PANEL); + panel->SetTarget(BMessenger(looper)); - panel = new BFilePanel(dosavemode ? B_SAVE_PANEL : B_OPEN_PANEL); - panel->SetTarget(BMessenger(looper)); + if(path) + panel->SetPanelDirectory(path); - if (path) - panel->SetPanelDirectory(path); + panel->Show(); - panel->Show(); + looper->Wait(); + ret = looper->DoIt(); + entry_ref ref; + looper->GetRef(ref); - looper->Wait(); - ret = looper->DoIt(); - entry_ref ref; - looper->GetRef(ref); - - delete panel; - looper->Lock(); - looper->Quit(); - - if (ret) { + delete panel; + looper->Lock(); + looper->Quit(); + + if(ret) + { BPath p(&ref); - strncpy( fname, p.Leaf(), 512 ); path[511] = 0; + strncpy(fname, p.Leaf(), 512); + path[511] = 0; p.GetParent(&p); - strncpy( path, p.Path(), 4096 ); path[4095] = 0; + strncpy(path, p.Path(), 4096); + path[4095] = 0; } return ret; diff --git a/filereq_gtk.c b/filereq_gtk.c index b4edeba9..a47c1fab 100644 --- a/filereq_gtk.c +++ b/filereq_gtk.c @@ -40,15 +40,15 @@ #include "filereq.h" extern SDL_bool fullscreen; -void togglefullscreen( struct machine *oric, struct osdmenuitem *mitem, int dummy ); +void togglefullscreen(struct machine *oric, struct osdmenuitem *mitem, int dummy); -SDL_bool init_filerequester( struct machine *oric ) +SDL_bool init_filerequester(struct machine *oric) { gtk_init(0, NULL); return SDL_TRUE; } -void shut_filerequester( struct machine *oric ) +void shut_filerequester(struct machine *oric) { } @@ -58,7 +58,7 @@ void shut_filerequester( struct machine *oric ) // fname = initial contents of the filename textbox // It returns true if the user selected a file, although the file is not // guaranteed to exist. -SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fname, int type ) +SDL_bool filerequester(struct machine *oric, char* title, char* path, char* fname, int type) { GtkWidget *dialog; SDL_bool result = SDL_FALSE; @@ -66,13 +66,13 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna GtkFileFilter *filter = NULL, *allfilter = gtk_file_filter_new(); SDL_bool was_fullscreen = fullscreen; - if (fullscreen) + if(fullscreen) togglefullscreen(oric, NULL, 0); gtk_file_filter_set_name(allfilter, "All files"); gtk_file_filter_add_pattern(allfilter, "*"); - switch( type ) + switch(type) { case FR_DISKSAVE: action = GTK_FILE_CHOOSER_ACTION_SAVE; @@ -119,7 +119,7 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna break; case FR_KEYMAPPINGSAVE: - action = GTK_FILE_CHOOSER_ACTION_SAVE; + action = GTK_FILE_CHOOSER_ACTION_SAVE; case FR_KEYMAPPINGLOAD: filter = gtk_file_filter_new(); gtk_file_filter_set_name(filter, "Keyboard Mapping files"); @@ -143,36 +143,38 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna NULL); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), path); - if (action == GTK_FILE_CHOOSER_ACTION_SAVE) + if(action == GTK_FILE_CHOOSER_ACTION_SAVE) gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), fname); - if (filter) + if(filter) gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), allfilter); - if (gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) + if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { - char *filename; + char* filename; int i; - filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); - strncpy( path, filename, 4096 ); path[4095] = 0; + filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + strncpy(path, filename, 4096); + path[4095] = 0; i = strlen(path)-1; - while (i >= 0) + while(i >= 0) { - if (path[i] == PATHSEP) break; + if(path[i] == PATHSEP) break; i--; } - strncpy( fname, &path[i+1], 512 ); fname[511] = 0; + strncpy(fname, &path[i+1], 512); + fname[511] = 0; path[i+1] = 0; g_free(filename); result = SDL_TRUE; } gtk_widget_destroy(dialog); - while (gtk_events_pending()) + while(gtk_events_pending()) gtk_main_iteration(); - if (was_fullscreen) + if(was_fullscreen) togglefullscreen(oric, NULL, 0); return result; diff --git a/filereq_sdl.c b/filereq_sdl.c index 27e7d8cb..f501b35c 100644 --- a/filereq_sdl.c +++ b/filereq_sdl.c @@ -59,54 +59,55 @@ struct frq_ent // A text input box (used in the file requester) struct frq_textbox { - char *buf; + char* buf; int x, y, w; int maxlen, slen, cpos, vpos; }; // The actual text box structures used by the file requester static struct frq_textbox freqf_tbox[] = { { NULL, 7, 28, 32, 4096, 0, 0, 0 }, - { NULL, 7, 30, 32, 512, 0, 0, 0 } }; + { NULL, 7, 30, 32, 512, 0, 0, 0 } +}; // File requester state static int freqf_size=0, freqf_used=0, freqf_cgad=2; static struct frq_ent *freqfiles=NULL; static int freqf_clicktime=0; -SDL_bool init_filerequester( struct machine *oric ) +SDL_bool init_filerequester(struct machine *oric) { - if( !alloc_textzone( oric, TZ_FILEREQ, 160, 48, 40, 32, "Files" ) ) return SDL_FALSE; + if(!alloc_textzone(oric, TZ_FILEREQ, 160, 48, 40, 32, "Files")) return SDL_FALSE; return SDL_TRUE; } -void shut_filerequester( struct machine *oric ) +void shut_filerequester(struct machine *oric) { - free_textzone( oric, TZ_FILEREQ ); + free_textzone(oric, TZ_FILEREQ); } // Render the filerequester -static void filereq_render( struct machine *oric ) +static void filereq_render(struct machine *oric) { - oric->render_begin( oric ); + oric->render_begin(oric); - oric->render_video( oric, SDL_TRUE ); - oric->render_textzone( oric, TZ_FILEREQ ); - oric->render_end( oric ); + oric->render_video(oric, SDL_TRUE); + oric->render_textzone(oric, TZ_FILEREQ); + oric->render_end(oric); } // Add a file to the list of files to show in the file requester -static void filereq_addent( SDL_bool isdir, char *name, char *showname ) +static void filereq_addent(SDL_bool isdir, char* name, char* showname) { struct frq_ent *tmpf; int i, j; // No file buffer yet, or file buffer full? - if( ( !freqfiles ) || ( freqf_used >= freqf_size ) ) + if((!freqfiles) || (freqf_used >= freqf_size)) { // (re)allocate it! - tmpf = (struct frq_ent *)realloc( freqfiles, sizeof( struct frq_ent ) * (freqf_size+8) ); - if( !tmpf ) return; + tmpf = (struct frq_ent *)realloc(freqfiles, sizeof(struct frq_ent) * (freqf_size+8)); + if(!tmpf) return; freqfiles = tmpf; freqf_size += 8; @@ -114,35 +115,37 @@ static void filereq_addent( SDL_bool isdir, char *name, char *showname ) // Get the point to insert it j = 0; - if( freqf_used > 0 ) + if(freqf_used > 0) { - if( isdir ) + if(isdir) { - for( j=1; jj; i-- ) + for(i=freqf_used; i>j; i--) freqfiles[i] = freqfiles[i-1]; } } // Fill in this structure freqfiles[j].isdir = isdir; - strncpy( freqfiles[j].name, name, 512 ); - strncpy( freqfiles[j].showname, showname, 38 ); + strncpy(freqfiles[j].name, name, 512); + strncpy(freqfiles[j].showname, showname, 38); freqfiles[j].name[511] = 0; freqfiles[j].showname[37] = 0; @@ -151,85 +154,85 @@ static void filereq_addent( SDL_bool isdir, char *name, char *showname ) } // Scan a directory to show in the filerequester -static SDL_bool filereq_scan( char *path ) +static SDL_bool filereq_scan(char* path) { DIR *dh; struct dirent *de; struct stat sb; - char *odir, *tpath; + char* odir, *tpath; tpath = path; #ifndef __amigaos4__ - if( !path[0] ) + if(!path[0]) tpath = "."; #endif freqf_used = 0; - dh = opendir( tpath ); - if( !dh ) return SDL_FALSE; + dh = opendir(tpath); + if(!dh) return SDL_FALSE; - odir = getcwd( NULL, 0 ); - chdir( tpath ); + odir = getcwd(NULL, 0); + chdir(tpath); - filereq_addent( SDL_TRUE, "", "[Parent]" ); + filereq_addent(SDL_TRUE, "", "[Parent]"); - while( ( de = readdir( dh ) ) ) + while((de = readdir(dh))) { - if( ( strcmp( de->d_name, "." ) == 0 ) || - ( strcmp( de->d_name, ".." ) == 0 ) ) + if((strcmp(de->d_name, ".") == 0) || + (strcmp(de->d_name, "..") == 0)) continue; - stat( de->d_name, &sb ); - filereq_addent( S_ISDIR(sb.st_mode), de->d_name, de->d_name ); + stat(de->d_name, &sb); + filereq_addent(S_ISDIR(sb.st_mode), de->d_name, de->d_name); } - closedir( dh ); + closedir(dh); - chdir( odir ); - free( odir ); + chdir(odir); + free(odir); return SDL_TRUE; } // Render the file list into the filerequester textzone -static void filereq_showfiles( int offset, int cfile ) +static void filereq_showfiles(int offset, int cfile) { int i, j, o; // If the listview isn't selected, don't show a current file - if( freqf_cgad != 2 ) + if(freqf_cgad != 2) cfile = -1; - for( i=0; i<26; i++ ) + for(i=0; i<26; i++) { // Set the colours - if( (i+offset) < freqf_used ) - tzsetcol( tz[TZ_FILEREQ], freqfiles[i+offset].isdir ? 1 : 0, (i+offset)==cfile ? 7 : 6 ); + if((i+offset) < freqf_used) + tzsetcol(tz[TZ_FILEREQ], freqfiles[i+offset].isdir ? 1 : 0, (i+offset)==cfile ? 7 : 6); else - tzsetcol( tz[TZ_FILEREQ], 0, 6 ); + tzsetcol(tz[TZ_FILEREQ], 0, 6); // Clear this line o = (i+1)*tz[TZ_FILEREQ]->w+1; - for( j=0; j<38; j++, o++ ) + for(j=0; j<38; j++, o++) { tz[TZ_FILEREQ]->fc[o] = tz[TZ_FILEREQ]->cfc; tz[TZ_FILEREQ]->bc[o] = tz[TZ_FILEREQ]->cbc; tz[TZ_FILEREQ]->tx[o] = 32; } - if( (i+offset) >= freqf_used ) + if((i+offset) >= freqf_used) continue; // Print the name - tzstrpos( tz[TZ_FILEREQ], 1, i+1, freqfiles[i+offset].showname ); + tzstrpos(tz[TZ_FILEREQ], 1, i+1, freqfiles[i+offset].showname); } } // Set a filerequester textbox contents to the specified string -static void filereq_settbox( struct frq_textbox *tb, char *buf ) +static void filereq_settbox(struct frq_textbox *tb, char* buf) { // Set up the buffer tb->buf = buf; - tb->slen = strlen( buf ); + tb->slen = strlen(buf); // Make sure the cursor is in view tb->cpos = tb->slen; @@ -237,23 +240,25 @@ static void filereq_settbox( struct frq_textbox *tb, char *buf ) } // Draw a textbox into the filerequester textzone -static void filereq_drawtbox( struct frq_textbox *tb, SDL_bool active ) +static void filereq_drawtbox(struct frq_textbox *tb, SDL_bool active) { int i, j, o; - tzsetcol( tz[TZ_FILEREQ], 0, active ? 7 : 6 ); + tzsetcol(tz[TZ_FILEREQ], 0, active ? 7 : 6); o = (tb->y*tz[TZ_FILEREQ]->w)+tb->x; - for( i=0,j=tb->vpos; iw; i++, o++, j++ ) + for(i=0,j=tb->vpos; iw; i++, o++, j++) { - if( ( active ) && ( j==tb->cpos ) ) + if((active) && (j==tb->cpos)) { tz[TZ_FILEREQ]->fc[o] = tz[TZ_FILEREQ]->cbc; tz[TZ_FILEREQ]->bc[o] = tz[TZ_FILEREQ]->cfc; - } else { + } + else + { tz[TZ_FILEREQ]->fc[o] = tz[TZ_FILEREQ]->cfc; tz[TZ_FILEREQ]->bc[o] = tz[TZ_FILEREQ]->cbc; } - if( j < tb->slen ) + if(j < tb->slen) tz[TZ_FILEREQ]->tx[o] = tb->buf[j]; else tz[TZ_FILEREQ]->tx[o] = 32; @@ -262,10 +267,10 @@ static void filereq_drawtbox( struct frq_textbox *tb, SDL_bool active ) // This sets the file textbox to the currently highlighted file // It also stores the filename in "fname" -static void filereq_setfiletbox( int cfile, char *fname ) +static void filereq_setfiletbox(int cfile, char* fname) { - if( ( cfile < 0 ) || ( cfile >= freqf_used ) || - ( freqfiles[cfile].isdir ) ) + if((cfile < 0) || (cfile >= freqf_used) || + (freqfiles[cfile].isdir)) { fname[0] = 0; freqf_tbox[1].cpos=0; @@ -274,9 +279,9 @@ static void filereq_setfiletbox( int cfile, char *fname ) return; } - strncpy( fname, freqfiles[cfile].name, 512 ); + strncpy(fname, freqfiles[cfile].name, 512); fname[511] = 0; - filereq_settbox( &freqf_tbox[1], fname ); + filereq_settbox(&freqf_tbox[1], fname); } enum @@ -293,7 +298,7 @@ enum // fname = initial contents of the filename textbox // It returns true if the user selected a file, although the file is not // guaranteed to exist. -SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fname, int type ) +SDL_bool filerequester(struct machine *oric, char* title, char* path, char* fname, int type) { SDL_Event event; struct frq_textbox *tb; @@ -301,49 +306,52 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna SDL_bool shifty = SDL_FALSE, wasunicode; int doaction; - wasunicode = SDL_COMPAT_EnableUNICODE( SDL_TRUE ); - SDL_COMPAT_EnableKeyRepeat( SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL ); + wasunicode = SDL_COMPAT_EnableUNICODE(SDL_TRUE); + SDL_COMPAT_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); - filereq_settbox( &freqf_tbox[0], path ); - filereq_settbox( &freqf_tbox[1], fname ); + filereq_settbox(&freqf_tbox[0], path); + filereq_settbox(&freqf_tbox[1], fname); - tzsettitle( tz[TZ_FILEREQ], title ); - tzsetcol( tz[TZ_FILEREQ], 2, 3 ); - tzstrpos( tz[TZ_FILEREQ], 1, 28, "Path:" ); - tzstrpos( tz[TZ_FILEREQ], 1, 30, "File:" ); + tzsettitle(tz[TZ_FILEREQ], title); + tzsetcol(tz[TZ_FILEREQ], 2, 3); + tzstrpos(tz[TZ_FILEREQ], 1, 28, "Path:"); + tzstrpos(tz[TZ_FILEREQ], 1, 30, "File:"); - if( !filereq_scan( path ) ) + if(!filereq_scan(path)) { - if( path[0] ) + if(path[0]) { path[0] = 0; - filereq_settbox( &freqf_tbox[0], path ); - if( !filereq_scan( path ) ) + filereq_settbox(&freqf_tbox[0], path); + if(!filereq_scan(path)) { - SDL_COMPAT_EnableUNICODE( wasunicode ); - SDL_COMPAT_EnableKeyRepeat( wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0 ); + SDL_COMPAT_EnableUNICODE(wasunicode); + SDL_COMPAT_EnableKeyRepeat(wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0); return SDL_FALSE; } - } else { - SDL_COMPAT_EnableUNICODE( wasunicode ); - SDL_COMPAT_EnableKeyRepeat( wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0 ); + } + else + { + SDL_COMPAT_EnableUNICODE(wasunicode); + SDL_COMPAT_EnableKeyRepeat(wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0); return SDL_FALSE; } } - filereq_showfiles( top, cfile ); - filereq_drawtbox( &freqf_tbox[0], freqf_cgad==0 ); - filereq_drawtbox( &freqf_tbox[1], freqf_cgad==1 ); - filereq_render( oric ); + filereq_showfiles(top, cfile); + filereq_drawtbox(&freqf_tbox[0], freqf_cgad==0); + filereq_drawtbox(&freqf_tbox[1], freqf_cgad==1); + filereq_render(oric); - for( ;; ) + for(;;) { #ifdef WWW - if( !SDL_PollEvent( &event )) { - emscripten_sleep(10); - continue; - } + if(!SDL_PollEvent(&event)) + { + emscripten_sleep(10); + continue; + } #else - if( !SDL_WaitEvent( &event ) ) + if(!SDL_WaitEvent(&event)) break; #endif @@ -351,7 +359,7 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna my = -1; mclick = 0; doaction = ACTION_NONE; - switch( event.type ) + switch(event.type) { case SDL_MOUSEMOTION: mx = (event.motion.x - tz[TZ_FILEREQ]->x)/8; @@ -359,7 +367,7 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna break; case SDL_MOUSEBUTTONDOWN: - if( event.button.button == SDL_BUTTON_LEFT ) + if(event.button.button == SDL_BUTTON_LEFT) { mx = (event.button.x - tz[TZ_FILEREQ]->x)/8; my = (event.button.y - tz[TZ_FILEREQ]->y)/12; @@ -368,38 +376,41 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna break; } - switch( event.type ) + switch(event.type) { case SDL_COMPAT_ACTIVEEVENT: - if(SDL_COMPAT_IsAppFocused( &event ) ) { - filereq_render( oric ); + if(SDL_COMPAT_IsAppFocused(&event)) + { + filereq_render(oric); } break; case SDL_MOUSEBUTTONDOWN: - if( ( mx < 1 ) || ( mx > 38 ) ) { + if((mx < 1) || (mx > 38)) + { #ifdef WWW - SDL_COMPAT_EnableUNICODE( wasunicode ); - SDL_COMPAT_EnableKeyRepeat( wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0 ); + SDL_COMPAT_EnableUNICODE(wasunicode); + SDL_COMPAT_EnableKeyRepeat(wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0); return SDL_FALSE; #endif break; } - if( ( my == 28 ) || ( my == 30 ) ) + if((my == 28) || (my == 30)) { freqf_cgad = (my-28)/2; - filereq_showfiles( top, cfile ); - filereq_drawtbox( &freqf_tbox[0], freqf_cgad==0 ); - filereq_drawtbox( &freqf_tbox[1], freqf_cgad==1 ); - filereq_render( oric ); + filereq_showfiles(top, cfile); + filereq_drawtbox(&freqf_tbox[0], freqf_cgad==0); + filereq_drawtbox(&freqf_tbox[1], freqf_cgad==1); + filereq_render(oric); break; } - if( ( my < 1 ) || ( my > 26 ) ) { + if((my < 1) || (my > 26)) + { #ifdef WWW - SDL_COMPAT_EnableUNICODE( wasunicode ); - SDL_COMPAT_EnableKeyRepeat( wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0 ); + SDL_COMPAT_EnableUNICODE(wasunicode); + SDL_COMPAT_EnableKeyRepeat(wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0); return SDL_FALSE; #endif break; @@ -408,21 +419,21 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna freqf_cgad = 2; i = (my-1)-top; - if( i >= freqf_used ) i = freqf_used-1; + if(i >= freqf_used) i = freqf_used-1; - if( cfile != i ) + if(cfile != i) { cfile = i; - filereq_setfiletbox( cfile, fname ); - filereq_showfiles( top, cfile ); - filereq_drawtbox( &freqf_tbox[1], 0 ); - filereq_render( oric ); + filereq_setfiletbox(cfile, fname); + filereq_showfiles(top, cfile); + filereq_drawtbox(&freqf_tbox[1], 0); + filereq_render(oric); freqf_clicktime = mclick; break; } - if( ( freqf_clicktime == 0 ) || - ( (mclick-freqf_clicktime) >= 2000 ) ) + if((freqf_clicktime == 0) || + ((mclick-freqf_clicktime) >= 2000)) { freqf_clicktime = mclick; break; @@ -433,7 +444,7 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna break; case SDL_KEYUP: - switch( event.key.keysym.sym ) + switch(event.key.keysym.sym) { case SDLK_LSHIFT: case SDLK_RSHIFT: @@ -441,43 +452,45 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna break; case SDLK_ESCAPE: - SDL_COMPAT_EnableUNICODE( wasunicode ); - SDL_COMPAT_EnableKeyRepeat( wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0 ); + SDL_COMPAT_EnableUNICODE(wasunicode); + SDL_COMPAT_EnableKeyRepeat(wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0); return SDL_FALSE; case SDLK_RETURN: case SDLK_KP_ENTER: - switch( freqf_cgad ) + switch(freqf_cgad) { case 0: cfile = top = 0; - if( !filereq_scan( path ) ) + if(!filereq_scan(path)) { - if( path[0] ) + if(path[0]) { path[0] = 0; - filereq_settbox( &freqf_tbox[0], path ); - if( !filereq_scan( path ) ) + filereq_settbox(&freqf_tbox[0], path); + if(!filereq_scan(path)) { - SDL_COMPAT_EnableUNICODE( wasunicode ); - SDL_COMPAT_EnableKeyRepeat( wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0 ); + SDL_COMPAT_EnableUNICODE(wasunicode); + SDL_COMPAT_EnableKeyRepeat(wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0); return SDL_FALSE; } - } else { - SDL_COMPAT_EnableUNICODE( wasunicode ); - SDL_COMPAT_EnableKeyRepeat( wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0 ); + } + else + { + SDL_COMPAT_EnableUNICODE(wasunicode); + SDL_COMPAT_EnableKeyRepeat(wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0); return SDL_FALSE; } } - filereq_showfiles( top, cfile ); - filereq_drawtbox( &freqf_tbox[0], freqf_cgad==0 ); - filereq_drawtbox( &freqf_tbox[1], freqf_cgad==1 ); - filereq_render( oric ); + filereq_showfiles(top, cfile); + filereq_drawtbox(&freqf_tbox[0], freqf_cgad==0); + filereq_drawtbox(&freqf_tbox[1], freqf_cgad==1); + filereq_render(oric); break; case 1: - SDL_COMPAT_EnableUNICODE( wasunicode ); - SDL_COMPAT_EnableKeyRepeat( wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0 ); + SDL_COMPAT_EnableUNICODE(wasunicode); + SDL_COMPAT_EnableKeyRepeat(wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0); return SDL_TRUE; case 2: @@ -492,7 +505,7 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna break; case SDL_KEYDOWN: - switch( event.key.keysym.sym ) + switch(event.key.keysym.sym) { case SDLK_LSHIFT: case SDLK_RSHIFT: @@ -500,74 +513,74 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna break; case SDLK_TAB: - if( shifty ) + if(shifty) freqf_cgad = (freqf_cgad+2)%3; else freqf_cgad = (freqf_cgad+1)%3; - filereq_showfiles( top, cfile ); - filereq_drawtbox( &freqf_tbox[0], freqf_cgad==0 ); - filereq_drawtbox( &freqf_tbox[1], freqf_cgad==1 ); - filereq_render( oric ); + filereq_showfiles(top, cfile); + filereq_drawtbox(&freqf_tbox[0], freqf_cgad==0); + filereq_drawtbox(&freqf_tbox[1], freqf_cgad==1); + filereq_render(oric); break; case SDLK_UP: - if( freqf_cgad != 2 ) + if(freqf_cgad != 2) { freqf_cgad = 2; - filereq_showfiles( top, cfile ); - filereq_drawtbox( &freqf_tbox[0], freqf_cgad==0 ); - filereq_drawtbox( &freqf_tbox[1], freqf_cgad==1 ); - filereq_render( oric ); + filereq_showfiles(top, cfile); + filereq_drawtbox(&freqf_tbox[0], freqf_cgad==0); + filereq_drawtbox(&freqf_tbox[1], freqf_cgad==1); + filereq_render(oric); break; } - if( cfile <= 0 ) break; - if( shifty ) + if(cfile <= 0) break; + if(shifty) { doaction = ACTION_PAGEUP; break; } cfile--; - if( cfile < top ) top = cfile; - filereq_setfiletbox( cfile, fname ); - filereq_showfiles( top, cfile ); - filereq_drawtbox( &freqf_tbox[1], SDL_FALSE ); - filereq_render( oric ); + if(cfile < top) top = cfile; + filereq_setfiletbox(cfile, fname); + filereq_showfiles(top, cfile); + filereq_drawtbox(&freqf_tbox[1], SDL_FALSE); + filereq_render(oric); break; case SDLK_DOWN: - if( freqf_cgad != 2 ) + if(freqf_cgad != 2) { freqf_cgad = 2; - filereq_showfiles( top, cfile ); - filereq_drawtbox( &freqf_tbox[0], freqf_cgad==0 ); - filereq_drawtbox( &freqf_tbox[1], freqf_cgad==1 ); - filereq_render( oric ); + filereq_showfiles(top, cfile); + filereq_drawtbox(&freqf_tbox[0], freqf_cgad==0); + filereq_drawtbox(&freqf_tbox[1], freqf_cgad==1); + filereq_render(oric); break; } - if( cfile >= (freqf_used-1) ) break; - if( shifty ) + if(cfile >= (freqf_used-1)) break; + if(shifty) { doaction = ACTION_PAGEDOWN; break; } cfile++; - if( cfile > (top+25) ) top = cfile-25; - filereq_setfiletbox( cfile, fname ); - filereq_showfiles( top, cfile ); - filereq_drawtbox( &freqf_tbox[1], SDL_FALSE ); - filereq_render( oric ); + if(cfile > (top+25)) top = cfile-25; + filereq_setfiletbox(cfile, fname); + filereq_showfiles(top, cfile); + filereq_drawtbox(&freqf_tbox[1], SDL_FALSE); + filereq_render(oric); break; case SDLK_PAGEUP: - if( freqf_cgad != 2 ) + if(freqf_cgad != 2) { freqf_cgad = 2; - filereq_showfiles( top, cfile ); - filereq_drawtbox( &freqf_tbox[0], freqf_cgad==0 ); - filereq_drawtbox( &freqf_tbox[1], freqf_cgad==1 ); - filereq_render( oric ); + filereq_showfiles(top, cfile); + filereq_drawtbox(&freqf_tbox[0], freqf_cgad==0); + filereq_drawtbox(&freqf_tbox[1], freqf_cgad==1); + filereq_render(oric); break; } @@ -575,13 +588,13 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna break; case SDLK_PAGEDOWN: - if( freqf_cgad != 2 ) + if(freqf_cgad != 2) { freqf_cgad = 2; - filereq_showfiles( top, cfile ); - filereq_drawtbox( &freqf_tbox[0], freqf_cgad==0 ); - filereq_drawtbox( &freqf_tbox[1], freqf_cgad==1 ); - filereq_render( oric ); + filereq_showfiles(top, cfile); + filereq_drawtbox(&freqf_tbox[0], freqf_cgad==0); + filereq_drawtbox(&freqf_tbox[1], freqf_cgad==1); + filereq_render(oric); break; } @@ -589,186 +602,198 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna break; case SDLK_BACKSPACE: - if( freqf_cgad == 2 ) break; + if(freqf_cgad == 2) break; tb = &freqf_tbox[freqf_cgad]; - if( tb->cpos < 1 ) break; - for( i=tb->cpos-1; islen; i++ ) + if(tb->cpos < 1) break; + for(i=tb->cpos-1; islen; i++) tb->buf[i] = tb->buf[i+1]; tb->slen--; - if( tb->slen < 0 ) + if(tb->slen < 0) { tb->slen = 0; tb->cpos = 0; } case SDLK_LEFT: - if( freqf_cgad == 2 ) break; + if(freqf_cgad == 2) break; tb = &freqf_tbox[freqf_cgad]; - if( tb->cpos > 0 ) tb->cpos--; - if( tb->cpos < tb->vpos ) tb->vpos = tb->cpos; - if( tb->cpos >= (tb->vpos+tb->w) ) tb->vpos = tb->cpos-(tb->w-1); - if( tb->vpos < 0 ) tb->vpos = 0; - filereq_drawtbox( tb, SDL_TRUE ); - filereq_render( oric ); + if(tb->cpos > 0) tb->cpos--; + if(tb->cpos < tb->vpos) tb->vpos = tb->cpos; + if(tb->cpos >= (tb->vpos+tb->w)) tb->vpos = tb->cpos-(tb->w-1); + if(tb->vpos < 0) tb->vpos = 0; + filereq_drawtbox(tb, SDL_TRUE); + filereq_render(oric); break; case SDLK_RIGHT: - if( freqf_cgad == 2 ) break; + if(freqf_cgad == 2) break; tb = &freqf_tbox[freqf_cgad]; - if( tb->cpos < tb->slen ) tb->cpos++; - if( tb->cpos < tb->vpos ) tb->vpos = tb->cpos; - if( tb->cpos >= (tb->vpos+tb->w) ) tb->vpos = tb->cpos-(tb->w-1); - if( tb->vpos < 0 ) tb->vpos = 0; - filereq_drawtbox( tb, SDL_TRUE ); - filereq_render( oric ); + if(tb->cpos < tb->slen) tb->cpos++; + if(tb->cpos < tb->vpos) tb->vpos = tb->cpos; + if(tb->cpos >= (tb->vpos+tb->w)) tb->vpos = tb->cpos-(tb->w-1); + if(tb->vpos < 0) tb->vpos = 0; + filereq_drawtbox(tb, SDL_TRUE); + filereq_render(oric); break; case SDLK_DELETE: - if( freqf_cgad == 2 ) break; + if(freqf_cgad == 2) break; tb = &freqf_tbox[freqf_cgad]; - if( tb->cpos >= tb->slen ) break; - for( i=tb->cpos; islen; i++ ) + if(tb->cpos >= tb->slen) break; + for(i=tb->cpos; islen; i++) tb->buf[i] = tb->buf[i+1]; tb->slen--; - if( tb->slen < 0 ) + if(tb->slen < 0) { tb->slen = 0; tb->cpos = 0; } - filereq_drawtbox( tb, SDL_TRUE ); - filereq_render( oric ); + filereq_drawtbox(tb, SDL_TRUE); + filereq_render(oric); break; default: break; } - switch( SDL_COMPAT_GetKeysymUnicode( event.key.keysym ) ) + switch(SDL_COMPAT_GetKeysymUnicode(event.key.keysym)) { default: - if( freqf_cgad == 2 ) break; + if(freqf_cgad == 2) break; - if( ( SDL_COMPAT_GetKeysymUnicode( event.key.keysym ) > 31 ) && ( SDL_COMPAT_GetKeysymUnicode( event.key.keysym ) < 127 ) ) + if((SDL_COMPAT_GetKeysymUnicode(event.key.keysym) > 31) && (SDL_COMPAT_GetKeysymUnicode(event.key.keysym) < 127)) { tb = &freqf_tbox[freqf_cgad]; - if( tb->slen >= (tb->maxlen-1) ) break; - for( i=tb->slen; i>=tb->cpos; i-- ) + if(tb->slen >= (tb->maxlen-1)) break; + for(i=tb->slen; i>=tb->cpos; i--) tb->buf[i] = tb->buf[i-1]; - tb->buf[tb->cpos] = SDL_COMPAT_GetKeysymUnicode( event.key.keysym ); + tb->buf[tb->cpos] = SDL_COMPAT_GetKeysymUnicode(event.key.keysym); tb->slen++; tb->cpos++; tb->buf[tb->cpos] = 0; - if( tb->cpos < tb->vpos ) tb->vpos = tb->cpos; - if( tb->cpos >= (tb->vpos+tb->w) ) tb->vpos = tb->cpos-(tb->w-1); - if( tb->vpos < 0 ) tb->vpos = 0; - filereq_drawtbox( tb, SDL_TRUE ); - filereq_render( oric ); + if(tb->cpos < tb->vpos) tb->vpos = tb->cpos; + if(tb->cpos >= (tb->vpos+tb->w)) tb->vpos = tb->cpos-(tb->w-1); + if(tb->vpos < 0) tb->vpos = 0; + filereq_drawtbox(tb, SDL_TRUE); + filereq_render(oric); } break; } break; case SDL_QUIT: - setemumode( oric, NULL, EM_PLEASEQUIT ); + setemumode(oric, NULL, EM_PLEASEQUIT); return SDL_FALSE; default: break; } - switch( doaction ) + switch(doaction) { case ACTION_PAGEUP: - if( cfile > top ) + if(cfile > top) { cfile = top; - } else { + } + else + { top -= 25; - if( top < 0 ) top = 0; + if(top < 0) top = 0; cfile = top; } - filereq_showfiles( top, cfile ); - filereq_drawtbox( &freqf_tbox[0], freqf_cgad==0 ); - filereq_drawtbox( &freqf_tbox[1], freqf_cgad==1 ); - filereq_render( oric ); + filereq_showfiles(top, cfile); + filereq_drawtbox(&freqf_tbox[0], freqf_cgad==0); + filereq_drawtbox(&freqf_tbox[1], freqf_cgad==1); + filereq_render(oric); break; case ACTION_PAGEDOWN: - if( cfile < (top+25) ) + if(cfile < (top+25)) { cfile = top+25; - } else { + } + else + { cfile += 25; } - if( cfile > (freqf_used-1) ) cfile = freqf_used-1; + if(cfile > (freqf_used-1)) cfile = freqf_used-1; top = cfile-25; - if( top < 0 ) top = 0; - filereq_showfiles( top, cfile ); - filereq_drawtbox( &freqf_tbox[0], freqf_cgad==0 ); - filereq_drawtbox( &freqf_tbox[1], freqf_cgad==1 ); - filereq_render( oric ); + if(top < 0) top = 0; + filereq_showfiles(top, cfile); + filereq_drawtbox(&freqf_tbox[0], freqf_cgad==0); + filereq_drawtbox(&freqf_tbox[1], freqf_cgad==1); + filereq_render(oric); break; case ACTION_SELECTITEM: - if( freqf_used <= 0 ) break; - if( cfile<=0 ) // Parent + if(freqf_used <= 0) break; + if(cfile<=0) // Parent { - i = strlen( path )-1; - if( i<=0 ) break; - if( path[i] == PATHSEP ) i--; - while( i > -1 ) + i = strlen(path)-1; + if(i<=0) break; + if(path[i] == PATHSEP) i--; + while(i > -1) { - if( path[i] == PATHSEP ) break; + if(path[i] == PATHSEP) break; i--; } - if( i==-1 ) i++; + if(i==-1) i++; path[i] = 0; - } else if( freqfiles[cfile].isdir ) { - i = strlen( path )-1; - if( i < 0 ) + } + else if(freqfiles[cfile].isdir) + { + i = strlen(path)-1; + if(i < 0) { i++; - } else { - if( path[i] != PATHSEP ) + } + else + { + if(path[i] != PATHSEP) i++; } - if( i > 0 ) path[i++] = PATHSEP; - strncpy( &path[i], freqfiles[cfile].name, 4096-i ); + if(i > 0) path[i++] = PATHSEP; + strncpy(&path[i], freqfiles[cfile].name, 4096-i); path[4095] = 0; - } else { - SDL_COMPAT_EnableUNICODE( wasunicode ); - SDL_COMPAT_EnableKeyRepeat( wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0 ); + } + else + { + SDL_COMPAT_EnableUNICODE(wasunicode); + SDL_COMPAT_EnableKeyRepeat(wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0); return SDL_TRUE; } cfile = top = 0; - filereq_settbox( &freqf_tbox[0], path ); - if( !filereq_scan( path ) ) + filereq_settbox(&freqf_tbox[0], path); + if(!filereq_scan(path)) { - if( path[0] ) + if(path[0]) { path[0] = 0; - filereq_settbox( &freqf_tbox[0], path ); - if( !filereq_scan( path ) ) + filereq_settbox(&freqf_tbox[0], path); + if(!filereq_scan(path)) { - SDL_COMPAT_EnableUNICODE( wasunicode ); - SDL_COMPAT_EnableKeyRepeat( wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0 ); + SDL_COMPAT_EnableUNICODE(wasunicode); + SDL_COMPAT_EnableKeyRepeat(wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0); return SDL_FALSE; } - } else { - SDL_COMPAT_EnableUNICODE( wasunicode ); - SDL_COMPAT_EnableKeyRepeat( wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0 ); + } + else + { + SDL_COMPAT_EnableUNICODE(wasunicode); + SDL_COMPAT_EnableKeyRepeat(wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0); return SDL_FALSE; } } - filereq_showfiles( top, cfile ); - filereq_drawtbox( &freqf_tbox[0], freqf_cgad==0 ); - filereq_drawtbox( &freqf_tbox[1], freqf_cgad==1 ); - filereq_render( oric ); + filereq_showfiles(top, cfile); + filereq_drawtbox(&freqf_tbox[0], freqf_cgad==0); + filereq_drawtbox(&freqf_tbox[1], freqf_cgad==1); + filereq_render(oric); break; } } - SDL_COMPAT_EnableUNICODE( wasunicode ); - SDL_COMPAT_EnableKeyRepeat( wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0 ); + SDL_COMPAT_EnableUNICODE(wasunicode); + SDL_COMPAT_EnableKeyRepeat(wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0); return SDL_FALSE; } diff --git a/filereq_win32.c b/filereq_win32.c index 19935f7b..da2b735f 100644 --- a/filereq_win32.c +++ b/filereq_win32.c @@ -36,43 +36,43 @@ #include "machine.h" #include "filereq.h" -SDL_bool init_filerequester( struct machine *oric ) +SDL_bool init_filerequester(struct machine *oric) { return SDL_TRUE; } -void shut_filerequester( struct machine *oric ) +void shut_filerequester(struct machine *oric) { } -SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fname, int type ) +SDL_bool filerequester(struct machine *oric, char* title, char* path, char* fname, int type) { SDL_SysWMinfo wmi; OPENFILENAME ofn; HWND hwnd; char tmp[4096]; int i; - char *odir; + char* odir; - strcpy( tmp, fname ); + strcpy(tmp, fname); hwnd = NULL; SDL_VERSION(&wmi.version); - if (SDL_COMPAT_GetWMInfo(&wmi)) + if(SDL_COMPAT_GetWMInfo(&wmi)) #if SDL_MAJOR_VERSION == 1 hwnd = (HWND)wmi.window; #else hwnd = (HWND)wmi.info.win.window; #endif - ZeroMemory( &ofn, sizeof( ofn ) ); - ofn.lStructSize = sizeof( ofn ); + ZeroMemory(&ofn, sizeof(ofn)); + ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hwnd; ofn.lpstrFile = fname; ofn.nMaxFile = 4096; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; - switch( type ) + switch(type) { case FR_DISKSAVE: ofn.Flags = OFN_PATHMUSTEXIST; @@ -80,7 +80,7 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna ofn.lpstrFilter = "All Files\0*.*\0Disk Images (*.dsk)\0*.DSK\0"; ofn.nFilterIndex = 2; break; - + case FR_TAPESAVETAP: ofn.Flags = OFN_PATHMUSTEXIST; ofn.lpstrFilter = "All Files\0*.*\0Tape Images (*.tap)\0*.TAP\0"; @@ -109,9 +109,9 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna ofn.lpstrFilter = "All Files\0*.*\0Snapshot files (*.sna)\0*.SNA\0"; ofn.nFilterIndex = 2; break; - + case FR_KEYMAPPINGSAVE: - ofn.Flags = OFN_PATHMUSTEXIST; + ofn.Flags = OFN_PATHMUSTEXIST; case FR_KEYMAPPINGLOAD: ofn.lpstrFilter = "All Files\0*.*\0Keyboard Mapping files (*.kma)\0*.KMA\0"; ofn.nFilterIndex = 2; @@ -127,52 +127,54 @@ SDL_bool filerequester( struct machine *oric, char *title, char *path, char *fna ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = path; - odir = getcwd( NULL, 0 ); + odir = getcwd(NULL, 0); - switch( type ) + switch(type) { case FR_SNAPSHOTSAVE: case FR_DISKSAVE: - if( !GetSaveFileName( &ofn ) ) + if(!GetSaveFileName(&ofn)) { - chdir( odir ); - free( odir ); + chdir(odir); + free(odir); return SDL_FALSE; } break; - + default: - if( !GetOpenFileName( &ofn ) ) + if(!GetOpenFileName(&ofn)) { - chdir( odir ); - free( odir ); + chdir(odir); + free(odir); return SDL_FALSE; } break; } - chdir( odir ); - free( odir ); + chdir(odir); + free(odir); - i = strlen( ofn.lpstrFile ); - if( !i ) return SDL_FALSE; + i = strlen(ofn.lpstrFile); + if(!i) return SDL_FALSE; i--; - while( ofn.lpstrFile[i] != PATHSEP ) + while(ofn.lpstrFile[i] != PATHSEP) { - if( i == 0 ) break; + if(i == 0) break; i--; } - if( ( ofn.lpstrFile[i] == PATHSEP ) && ( i < (strlen(ofn.lpstrFile)-1) ) ) + if((ofn.lpstrFile[i] == PATHSEP) && (i < (strlen(ofn.lpstrFile)-1))) { ofn.lpstrFile[i] = 0; - strcpy( path, ofn.lpstrFile ); - strncpy( fname, &ofn.lpstrFile[i+1], 512 ); + strcpy(path, ofn.lpstrFile); + strncpy(fname, &ofn.lpstrFile[i+1], 512); fname[511] = 0; - } else { + } + else + { path[0] = 0; - strncpy( fname, ofn.lpstrFile, 512 ); + strncpy(fname, ofn.lpstrFile, 512); fname[511] = 0; } diff --git a/font.c b/font.c index ee41cb2c..8772f82b 100644 --- a/font.c +++ b/font.c @@ -20,7 +20,7 @@ */ unsigned char thefont[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0 nothing! - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, // 1 top left + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, // 1 top left 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, // 2 horizontal 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, // 3 branch down 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, // 4 top right @@ -28,7 +28,7 @@ unsigned char thefont[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, // 6 branch right 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, // 7 cross 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, // 8 branch left - 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, // 9 bottom left + 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, // 9 bottom left 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, // 10 branch up 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, // 11 bottom right 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, // 12 menu separator @@ -147,5 +147,5 @@ unsigned char thefont[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x60, 0x30, 0x30, 0x30, 0x18, 0x18, 0x30, 0x30, 0x30, 0x60, 0x00, // 125 '}' 0x00, 0x36, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 126 '~' 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // 127 '' - -}; + + }; diff --git a/gui.c b/gui.c index ddeca86b..6d5c3886 100644 --- a/gui.c +++ b/gui.c @@ -84,7 +84,7 @@ char mappingpath[4096], mappingfile[512]; char filetmp[4096+512+4]; SDL_bool refreshstatus = SDL_TRUE, refreshdisks = SDL_TRUE, refreshavi = SDL_TRUE, refreshtape = SDL_TRUE, - refreshkeyboard = SDL_TRUE; + refreshkeyboard = SDL_TRUE; extern struct avi_handle *vidcap; extern SDL_bool need_sdl_quit; @@ -98,25 +98,25 @@ extern Uint32 cyclespersample; // Images used in the GUI struct guiimg gimgs[NUM_GIMG] = { { IMAGEPREFIX"statusbar.bmp", 640, 16, NULL }, - { IMAGEPREFIX"disk_ejected.bmp", GIMG_W_DISK, 16, NULL }, - { IMAGEPREFIX"disk_idle.bmp", GIMG_W_DISK, 16, NULL }, - { IMAGEPREFIX"disk_active.bmp", GIMG_W_DISK, 16, NULL }, - { IMAGEPREFIX"disk_modified.bmp", GIMG_W_DISK, 16, NULL }, - { IMAGEPREFIX"disk_modactive.bmp", GIMG_W_DISK, 16, NULL }, - { IMAGEPREFIX"tape_ejected.bmp", GIMG_W_TAPE, 16, NULL }, - { IMAGEPREFIX"tape_pause.bmp", GIMG_W_TAPE, 16, NULL }, - { IMAGEPREFIX"tape_play.bmp", GIMG_W_TAPE, 16, NULL }, - { IMAGEPREFIX"tape_stop.bmp", GIMG_W_TAPE, 16, NULL }, - { IMAGEPREFIX"tape_record.bmp", GIMG_W_TAPE, 16, NULL }, - { IMAGEPREFIX"avirec.bmp", GIMG_W_AVIR, 16, NULL }, + { IMAGEPREFIX"disk_ejected.bmp", GIMG_W_DISK, 16, NULL }, + { IMAGEPREFIX"disk_idle.bmp", GIMG_W_DISK, 16, NULL }, + { IMAGEPREFIX"disk_active.bmp", GIMG_W_DISK, 16, NULL }, + { IMAGEPREFIX"disk_modified.bmp", GIMG_W_DISK, 16, NULL }, + { IMAGEPREFIX"disk_modactive.bmp", GIMG_W_DISK, 16, NULL }, + { IMAGEPREFIX"tape_ejected.bmp", GIMG_W_TAPE, 16, NULL }, + { IMAGEPREFIX"tape_pause.bmp", GIMG_W_TAPE, 16, NULL }, + { IMAGEPREFIX"tape_play.bmp", GIMG_W_TAPE, 16, NULL }, + { IMAGEPREFIX"tape_stop.bmp", GIMG_W_TAPE, 16, NULL }, + { IMAGEPREFIX"tape_record.bmp", GIMG_W_TAPE, 16, NULL }, + { IMAGEPREFIX"avirec.bmp", GIMG_W_AVIR, 16, NULL }, #ifndef WWW_NO_ORIC1 - { IMAGEPREFIX"gfx_oric1kbd.bmp", 640, 240, NULL }, + { IMAGEPREFIX"gfx_oric1kbd.bmp", 640, 240, NULL }, #endif - { IMAGEPREFIX"gfx_atmoskbd.bmp", 640, 240, NULL }, + { IMAGEPREFIX"gfx_atmoskbd.bmp", 640, 240, NULL }, #ifndef WWW_NO_PRAVETZ - { IMAGEPREFIX"gfx_pravetzkbd.bmp", 640, 240, NULL } + { IMAGEPREFIX"gfx_pravetzkbd.bmp", 640, 240, NULL } #endif - }; +}; SDL_bool soundavailable, soundon; #if defined(__linux__) @@ -149,7 +149,7 @@ unsigned char sgpal[] = { 0x00, 0x00, 0x00, // 0 = black 0xff, 0x33, 0x33, // 13 = Telestrat sel 0x99, 0x99, 0x66, // 14 = Pravetz bc 0xcc, 0xcc, 0x99 // 15 = Pravetz sel -}; + }; // Colors for the menu, see sgpal for color index // MACH_ORIC1 = 0, MACH_ORIC1_16K, MACH_ATMOS, MACH_TELESTRAT, MACH_PRAVETZ @@ -179,8 +179,9 @@ SDL_bool warpspeed=SDL_FALSE; struct osdmenu *cmenu = NULL; int cmenuitem = 0; -static char* aciabackends[ACIA_TYPE_LAST] = { - " Serial none ", +static char* aciabackends[ACIA_TYPE_LAST] = +{ + " Serial none ", "\x0e""Serial loopback $xxxx", "\x0e""Serial modem $xxxx", "\x0e""Serial com $xxxx", @@ -188,223 +189,240 @@ static char* aciabackends[ACIA_TYPE_LAST] = { static char aciabackendlabel[32]; -char menufc(SDL_bool bSelected) { return (bSelected ? g_foregroundcsel[g_menu_scheme] : g_foregroundc[g_menu_scheme]); } -char menubc(SDL_bool bSelected) { return (bSelected ? g_backgroundcsel[g_menu_scheme] : g_backgroundc[g_menu_scheme]); } +char menufc(SDL_bool bSelected) +{ + return (bSelected ? g_foregroundcsel[g_menu_scheme] : g_foregroundc[g_menu_scheme]); +} +char menubc(SDL_bool bSelected) +{ + return (bSelected ? g_backgroundcsel[g_menu_scheme] : g_backgroundc[g_menu_scheme]); +} // Menufunctions -void toggletapenoise( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void togglesound( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void inserttape( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void insertdisk( struct machine *oric, struct osdmenuitem *mitem, int drive ); -void resetoric( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void toggletapeturbo( struct machine *oric, struct osdmenuitem *mitem, int dummy ); +void toggletapenoise(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void togglesound(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void inserttape(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void insertdisk(struct machine *oric, struct osdmenuitem *mitem, int drive); +void resetoric(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void toggletapeturbo(struct machine *oric, struct osdmenuitem *mitem, int dummy); void togglech376(struct machine *oric, struct osdmenuitem *mitem, int dummy); void toggletwilighte(struct machine *oric, struct osdmenuitem *mitem, int dummy); -void toggleautowind( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void toggleautoinsrt( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void togglesymbolsauto( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void togglecasesyms( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void togglevsynchack( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void swap_render_mode( struct machine *oric, struct osdmenuitem *mitem, int newrendermode ); -void togglearatio( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void togglehstretch( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void togglepalghost( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void togglescanlines( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void togglelightpen( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void toggleaciabackend( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void setoverclock( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void savesnap( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void loadsnap( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void togglekeyboard( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void definemapping( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void togglestickykeys( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void savemapping( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void loadmapping( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void resetmapping( struct machine *oric, struct osdmenuitem *mitem, int dummy ); +void toggleautowind(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void toggleautoinsrt(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void togglesymbolsauto(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void togglecasesyms(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void togglevsynchack(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void swap_render_mode(struct machine *oric, struct osdmenuitem *mitem, int newrendermode); +void togglearatio(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void togglehstretch(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void togglepalghost(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void togglescanlines(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void togglelightpen(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void toggleaciabackend(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void setoverclock(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void savesnap(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void loadsnap(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void togglekeyboard(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void definemapping(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void togglestickykeys(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void savemapping(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void loadmapping(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void resetmapping(struct machine *oric, struct osdmenuitem *mitem, int dummy); #ifdef __CBCOPY__ -void clipbd_copy_gui( struct machine *oric, struct osdmenuitem *mitem, int dummy ); +void clipbd_copy_gui(struct machine *oric, struct osdmenuitem *mitem, int dummy); #endif #ifdef __CBPASTE__ -void clipbd_paste_gui( struct machine *oric, struct osdmenuitem *mitem, int dummy ); +void clipbd_paste_gui(struct machine *oric, struct osdmenuitem *mitem, int dummy); #endif // Menu definitions. Name, key name, SDL key code, function, parameter // Keys that are also available while emulating should be marked with // square brackets struct osdmenuitem mainitems[] = { { "Insert tape...", "T", 't', inserttape, 0, 0 }, - { "Save tape output...", "[F9]", SDLK_F9, toggletapecap, 0, 0 }, - { "Insert disk 0...", "0", SDLK_0, insertdisk, 0, 0 }, - { "Insert disk 1...", "1", SDLK_1, insertdisk, 1, 0 }, - { "Insert disk 2...", "2", SDLK_2, insertdisk, 2, 0 }, - { "Insert disk 3...", "3", SDLK_3, insertdisk, 3, 0 }, - { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, - { "Save snapshot...", NULL, 0, savesnap, 0, 0 }, - { "Load snapshot...", NULL, 0, loadsnap, 0, 0 }, + { "Save tape output...", "[F9]", SDLK_F9, toggletapecap, 0, 0 }, + { "Insert disk 0...", "0", SDLK_0, insertdisk, 0, 0 }, + { "Insert disk 1...", "1", SDLK_1, insertdisk, 1, 0 }, + { "Insert disk 2...", "2", SDLK_2, insertdisk, 2, 0 }, + { "Insert disk 3...", "3", SDLK_3, insertdisk, 3, 0 }, + { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, + { "Save snapshot...", NULL, 0, savesnap, 0, 0 }, + { "Load snapshot...", NULL, 0, loadsnap, 0, 0 }, #if defined(__CBCOPY__) || defined(__CBPASTE__) - { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, + { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, #endif #if defined(__CBCOPY__) - { "Copy to clipboard", "[F11]",SDLK_F11, clipbd_copy_gui, 0, 0 }, + { "Copy to clipboard", "[F11]",SDLK_F11, clipbd_copy_gui, 0, 0 }, #endif #if defined(__CBPASTE__) - { "Paste from clipboard", "[F12]",SDLK_F12, clipbd_paste_gui,0, 0 }, + { "Paste from clipboard", "[F12]",SDLK_F12, clipbd_paste_gui,0, 0 }, #endif - { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, - { "Hardware options...", "H", 'h', gotomenu, 1, 0 }, - { "Audio options...", "A", 'a', gotomenu, 2, 0 }, - { "Video options...", "V", 'v', gotomenu, 4, 0 }, - { "Keyboard options...", "K", 'k', gotomenu, 7, 0 }, - { "Debug options...", "D", 'd', gotomenu, 3, 0 }, - { "Overclock options...", "C", 'c', gotomenu, 6, 0 }, - { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, + { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, + { "Hardware options...", "H", 'h', gotomenu, 1, 0 }, + { "Audio options...", "A", 'a', gotomenu, 2, 0 }, + { "Video options...", "V", 'v', gotomenu, 4, 0 }, + { "Keyboard options...", "K", 'k', gotomenu, 7, 0 }, + { "Debug options...", "D", 'd', gotomenu, 3, 0 }, + { "Overclock options...", "C", 'c', gotomenu, 6, 0 }, + { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, #ifndef WWW_NO_MONITOR - { "Monitor", "[F2]", SDLK_F2, setemumode, EM_DEBUG, 0 }, + { "Monitor", "[F2]", SDLK_F2, setemumode, EM_DEBUG, 0 }, #endif - { "Reset Button NMI", "[F3]", SDLK_F3, softresetoric, 0, 0 }, - { "Hard Reset", "[F4]", SDLK_F4, resetoric, 0, 0 }, - { "Back", "\x17", SDLK_BACKSPACE,setemumode, EM_RUNNING, 0 }, - { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, - { "About", NULL, 0, gotomenu, 5, 0 }, - { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, + { "Reset Button NMI", "[F3]", SDLK_F3, softresetoric, 0, 0 }, + { "Hard Reset", "[F4]", SDLK_F4, resetoric, 0, 0 }, + { "Back", "\x17", SDLK_BACKSPACE,setemumode, EM_RUNNING, 0 }, + { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, + { "About", NULL, 0, gotomenu, 5, 0 }, + { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, #ifndef WWW - { "Quit", NULL, 0, setemumode, EM_PLEASEQUIT, 0 }, + { "Quit", NULL, 0, setemumode, EM_PLEASEQUIT, 0 }, #endif - { NULL, } }; - -struct osdmenuitem hwopitems[] = { { " Oric-1", "1", SDLK_1, swapmach, (0xffff<<16)|MACH_ORIC1, 0 }, - { " Oric-1 16K", "2", SDLK_2, swapmach, (0xffff<<16)|MACH_ORIC1_16K, 0 }, - { " Atmos", "3", SDLK_3, swapmach, (0xffff<<16)|MACH_ATMOS, 0 }, - { " Telestrat", "4", SDLK_4, swapmach, (DRV_NONE<<16)|MACH_TELESTRAT, 0 }, - { " Pravetz 8D", "5", SDLK_5, swapmach, (0xffff<<16)|MACH_PRAVETZ, 0 }, - { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, - { " No disk", "X", 'x', setdrivetype, DRV_NONE, 0 }, - { " Microdisc", "M", 'm', setdrivetype, DRV_MICRODISC, 0 }, - { " Jasmin", "J", 'j', setdrivetype, DRV_JASMIN, 0 }, - { " BD500", "B", 'b', setdrivetype, DRV_BD500, 0 }, -// { " Cumana", "C", 'c', NULL, 0, 0 }, - { " Pravetz 8D disk", "P", 'p', setdrivetype, DRV_PRAVETZ, 0 }, - { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, - { " Turbo tape", NULL, 0, toggletapeturbo, 0, 0 }, - { " Autoinsert tape", NULL, 0, toggleautoinsrt, 0, 0 }, - { " Autorewind tape", NULL, 0, toggleautowind, 0, 0 }, - { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, - { " VSync hack", NULL, 0, togglevsynchack, 0, 0 }, - { " Lightpen", NULL, 0, togglelightpen, 0, 0 }, - { " Serial none ", NULL, 0, toggleaciabackend, 0, 0 }, - { " CH376 (Telestrat) ", NULL, 0, togglech376, 0, 0 }, - { " Twilighte board ", NULL, 0, toggletwilighte, 0, 0 }, -// { " Mouse", NULL, 0, NULL, 0, 0 }, - { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, - { "Back", "\x17", SDLK_BACKSPACE,gotomenu, 0, 0 }, - { NULL, } }; + { NULL, } +}; + +struct osdmenuitem hwopitems[] = { { " Oric-1", "1", SDLK_1, swapmach, (0xffff<<16)|MACH_ORIC1, 0 }, + { " Oric-1 16K", "2", SDLK_2, swapmach, (0xffff<<16)|MACH_ORIC1_16K, 0 }, + { " Atmos", "3", SDLK_3, swapmach, (0xffff<<16)|MACH_ATMOS, 0 }, + { " Telestrat", "4", SDLK_4, swapmach, (DRV_NONE<<16)|MACH_TELESTRAT, 0 }, + { " Pravetz 8D", "5", SDLK_5, swapmach, (0xffff<<16)|MACH_PRAVETZ, 0 }, + { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, + { " No disk", "X", 'x', setdrivetype, DRV_NONE, 0 }, + { " Microdisc", "M", 'm', setdrivetype, DRV_MICRODISC, 0 }, + { " Jasmin", "J", 'j', setdrivetype, DRV_JASMIN, 0 }, + { " BD500", "B", 'b', setdrivetype, DRV_BD500, 0 }, + // { " Cumana", "C", 'c', NULL, 0, 0 }, + { " Pravetz 8D disk", "P", 'p', setdrivetype, DRV_PRAVETZ, 0 }, + { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, + { " Turbo tape", NULL, 0, toggletapeturbo, 0, 0 }, + { " Autoinsert tape", NULL, 0, toggleautoinsrt, 0, 0 }, + { " Autorewind tape", NULL, 0, toggleautowind, 0, 0 }, + { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, + { " VSync hack", NULL, 0, togglevsynchack, 0, 0 }, + { " Lightpen", NULL, 0, togglelightpen, 0, 0 }, + { " Serial none ", NULL, 0, toggleaciabackend, 0, 0 }, + { " CH376 (Telestrat) ", NULL, 0, togglech376, 0, 0 }, + { " Twilighte board ", NULL, 0, toggletwilighte, 0, 0 }, + // { " Mouse", NULL, 0, NULL, 0, 0 }, + { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, + { "Back", "\x17", SDLK_BACKSPACE,gotomenu, 0, 0 }, + { NULL, } +}; struct osdmenuitem auopitems[] = { { " Sound enabled", NULL, 0, togglesound, 0, 0 }, - { " Tape noise", NULL, 0, toggletapenoise, 0, 0 }, - { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, - { "Back", "\x17", SDLK_BACKSPACE,gotomenu, 0, 0 }, - { NULL, } }; + { " Tape noise", NULL, 0, toggletapenoise, 0, 0 }, + { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, + { "Back", "\x17", SDLK_BACKSPACE,gotomenu, 0, 0 }, + { NULL, } +}; struct osdmenuitem keopitems[] = { { " Show keyboard", NULL, 0, togglekeyboard, 0, 0 }, - { " Sticky mod keys", NULL, 0, togglestickykeys,0, 0 }, - { " Define mapping", NULL, 0, definemapping, 0, 0 }, - { "Save mapping...", NULL, 0, savemapping, 0, 0 }, - { "Load mapping...", NULL, 0, loadmapping, 0, 0 }, - { "Reset mapping", NULL, 0, resetmapping, 0, 0 }, - { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, - { "Back", "\x17", SDLK_BACKSPACE,gotomenu, 0, 0 }, - { NULL, } }; + { " Sticky mod keys", NULL, 0, togglestickykeys,0, 0 }, + { " Define mapping", NULL, 0, definemapping, 0, 0 }, + { "Save mapping...", NULL, 0, savemapping, 0, 0 }, + { "Load mapping...", NULL, 0, loadmapping, 0, 0 }, + { "Reset mapping", NULL, 0, resetmapping, 0, 0 }, + { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, + { "Back", "\x17", SDLK_BACKSPACE,gotomenu, 0, 0 }, + { NULL, } +}; struct osdmenuitem dbopitems[] = { { " Autoload symbols file", NULL, 0, togglesymbolsauto, 0, 0 }, - { " Case-sensitive symbols",NULL, 0, togglecasesyms, 0, 0 }, - { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, - { "Back", "\x17", SDLK_BACKSPACE,gotomenu, 0, 0 }, - { NULL, } }; + { " Case-sensitive symbols",NULL, 0, togglecasesyms, 0, 0 }, + { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, + { "Back", "\x17", SDLK_BACKSPACE,gotomenu, 0, 0 }, + { NULL, } +}; #ifdef __OPENGL_AVAILABLE__ struct osdmenuitem vdopitems[] = { { " OpenGL rendering", "O", 'o', swap_render_mode, RENDERMODE_GL, 0 }, - { " Software rendering", "S", 's', swap_render_mode, RENDERMODE_SW, 0 }, - { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, - { " Fullscreen", "[F8]", SDLK_F8, togglefullscreen, 0, 0 }, - { " Scanlines", "C", 'c', togglescanlines, 0, 0 }, - { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, - { "Back", "\x17", SDLK_BACKSPACE,gotomenu, 0, 0 }, - { NULL, } }; + { " Software rendering", "S", 's', swap_render_mode, RENDERMODE_SW, 0 }, + { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, + { " Fullscreen", "[F8]", SDLK_F8, togglefullscreen, 0, 0 }, + { " Scanlines", "C", 'c', togglescanlines, 0, 0 }, + { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, + { "Back", "\x17", SDLK_BACKSPACE,gotomenu, 0, 0 }, + { NULL, } +}; #else struct osdmenuitem vdopitems[] = { { " Fullscreen", "F", 'f', togglefullscreen, 0, 0 }, - { " Scanlines", "C", 'c', togglescanlines, 0, 0 }, - { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, - { "Back", "\x17", SDLK_BACKSPACE,gotomenu, 0, 0 }, - { NULL, } }; + { " Scanlines", "C", 'c', togglescanlines, 0, 0 }, + { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, + { "Back", "\x17", SDLK_BACKSPACE,gotomenu, 0, 0 }, + { NULL, } +}; #endif struct osdmenuitem glopitems[] = { { " OpenGL rendering", "O", 'o', swap_render_mode, RENDERMODE_GL, 0 }, - { " Software rendering", "S", 's', swap_render_mode, RENDERMODE_SW, 0 }, - { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, - { " Fullscreen", "F", 'f', togglefullscreen, 0, 0 }, - { " 50Hz/60Hz aspect ratio", "R", 'r', togglearatio, 0, 0 }, - { " Horizontal stretch", "H", 'h', togglehstretch, 0, 0 }, - { " Scanlines", "C", 'c', togglescanlines, 0, 0 }, - { " PAL ghosting", "P", 'p', togglepalghost, 0, 0 }, - { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, - { "Back", "\x17", SDLK_BACKSPACE,gotomenu, 0, 0 }, - { NULL, } }; + { " Software rendering", "S", 's', swap_render_mode, RENDERMODE_SW, 0 }, + { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, + { " Fullscreen", "F", 'f', togglefullscreen, 0, 0 }, + { " 50Hz/60Hz aspect ratio", "R", 'r', togglearatio, 0, 0 }, + { " Horizontal stretch", "H", 'h', togglehstretch, 0, 0 }, + { " Scanlines", "C", 'c', togglescanlines, 0, 0 }, + { " PAL ghosting", "P", 'p', togglepalghost, 0, 0 }, + { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, + { "Back", "\x17", SDLK_BACKSPACE,gotomenu, 0, 0 }, + { NULL, } +}; struct osdmenuitem aboutitems[] = { { "", NULL, 0, NULL, 0, 0 }, - { APP_NAME_FULL, NULL, 0, NULL, 0, OMIF_BRIGHT|OMIF_CENTRED }, - { "https://github.com/pete-gordon/oricutron",NULL, 0, gotosite, 0, OMIF_CENTRED }, - { "", NULL, 0, NULL, 0, 0 }, - { "(C)" APP_YEAR " Peter Gordon", NULL, 0, NULL, 0, OMIF_BRIGHT|OMIF_CENTRED }, - { "http://www.petergordon.org.uk", NULL, 0, gotosite, 0, OMIF_CENTRED }, - { "", NULL, 0, NULL, 0, 0 }, - { "Additional programming", NULL, 0, NULL, 0, OMIF_BRIGHT|OMIF_CENTRED }, - { "Francois Revol", NULL, 0, NULL, 0, OMIF_CENTRED }, - { "Stefan Haubenthal", NULL, 0, NULL, 0, OMIF_CENTRED }, - { "Alexandre Devert", NULL, 0, NULL, 0, OMIF_CENTRED }, - { "Ibisum", NULL, 0, NULL, 0, OMIF_CENTRED }, - { "Kamel Biskri", NULL, 0, NULL, 0, OMIF_CENTRED }, - { "Iss", NULL, 0, NULL, 0, OMIF_CENTRED }, - { "Patrice Torguet", NULL, 0, NULL, 0, OMIF_CENTRED }, - { "", NULL, 0, NULL, 0, 0 }, - { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, - { "Back", "\x17", SDLK_BACKSPACE, gotomenu, 0, 0 }, - { NULL, } }; + { APP_NAME_FULL, NULL, 0, NULL, 0, OMIF_BRIGHT|OMIF_CENTRED }, + { "https://github.com/pete-gordon/oricutron",NULL, 0, gotosite, 0, OMIF_CENTRED }, + { "", NULL, 0, NULL, 0, 0 }, + { "(C)" APP_YEAR " Peter Gordon", NULL, 0, NULL, 0, OMIF_BRIGHT|OMIF_CENTRED }, + { "http://www.petergordon.org.uk", NULL, 0, gotosite, 0, OMIF_CENTRED }, + { "", NULL, 0, NULL, 0, 0 }, + { "Additional programming", NULL, 0, NULL, 0, OMIF_BRIGHT|OMIF_CENTRED }, + { "Francois Revol", NULL, 0, NULL, 0, OMIF_CENTRED }, + { "Stefan Haubenthal", NULL, 0, NULL, 0, OMIF_CENTRED }, + { "Alexandre Devert", NULL, 0, NULL, 0, OMIF_CENTRED }, + { "Ibisum", NULL, 0, NULL, 0, OMIF_CENTRED }, + { "Kamel Biskri", NULL, 0, NULL, 0, OMIF_CENTRED }, + { "Iss", NULL, 0, NULL, 0, OMIF_CENTRED }, + { "Patrice Torguet", NULL, 0, NULL, 0, OMIF_CENTRED }, + { "", NULL, 0, NULL, 0, 0 }, + { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, + { "Back", "\x17", SDLK_BACKSPACE, gotomenu, 0, 0 }, + { NULL, } +}; struct osdmenuitem ovopitems[] = { { " 1mhz (None)", "1", '1', setoverclock, 0, 0 }, - { " 2mhz", "2", '2', setoverclock, 1, 0 }, - { " 4mhz", "3", '3', setoverclock, 2, 0 }, - { " 8mhz", "4", '4', setoverclock, 3, 0 }, - { " 16mhz", "5", '5', setoverclock, 4, 0 }, - { " 32mhz", "6", '6', setoverclock, 5, 0 }, - { " 64mhz", "7", '7', setoverclock, 6, 0 }, - { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, - { "Back", "\x17", SDLK_BACKSPACE,gotomenu,0, 0 }, - { NULL, } }; + { " 2mhz", "2", '2', setoverclock, 1, 0 }, + { " 4mhz", "3", '3', setoverclock, 2, 0 }, + { " 8mhz", "4", '4', setoverclock, 3, 0 }, + { " 16mhz", "5", '5', setoverclock, 4, 0 }, + { " 32mhz", "6", '6', setoverclock, 5, 0 }, + { " 64mhz", "7", '7', setoverclock, 6, 0 }, + { OSDMENUBAR, NULL, 0, NULL, 0, 0 }, + { "Back", "\x17", SDLK_BACKSPACE,gotomenu,0, 0 }, + { NULL, } +}; #define LAST_ITEM(x) ((sizeof(x)/sizeof(struct osdmenuitem))-2) struct osdmenu menus[] = { { "Main Menu", LAST_ITEM(mainitems)-4, mainitems }, - { "Hardware options", LAST_ITEM(hwopitems), hwopitems }, - { "Audio options", LAST_ITEM(auopitems), auopitems }, - { "Debug options", LAST_ITEM(dbopitems), dbopitems }, - { "Video options", LAST_ITEM(vdopitems), vdopitems }, - { "About Oricutron", LAST_ITEM(aboutitems), aboutitems }, - { "Overclock", LAST_ITEM(ovopitems), ovopitems }, - { "Keyboard options", LAST_ITEM(keopitems), keopitems }}; + { "Hardware options", LAST_ITEM(hwopitems), hwopitems }, + { "Audio options", LAST_ITEM(auopitems), auopitems }, + { "Debug options", LAST_ITEM(dbopitems), dbopitems }, + { "Video options", LAST_ITEM(vdopitems), vdopitems }, + { "About Oricutron", LAST_ITEM(aboutitems), aboutitems }, + { "Overclock", LAST_ITEM(ovopitems), ovopitems }, + { "Keyboard options", LAST_ITEM(keopitems), keopitems } +}; #define MKPATH_MAX (1024) // Prepend file prefix to filename -static void mkpath( char buf[MKPATH_MAX], const char *filename ) +static void mkpath(char buf[MKPATH_MAX], const char* filename) { - strncpy( buf, get_fileprefix(), MKPATH_MAX-1 ); + strncpy(buf, get_fileprefix(), MKPATH_MAX-1); buf[MKPATH_MAX-1] = 0; - strncat( buf, filename, MKPATH_MAX-strlen(buf)-1 ); + strncat(buf, filename, MKPATH_MAX-strlen(buf)-1); } // Load a 24bit BMP for the GUI -SDL_bool gimg_load( struct guiimg *gi ) +SDL_bool gimg_load(struct guiimg *gi) { SDL_RWops *f; Uint8 hdrbuf[640*3]; @@ -413,54 +431,54 @@ SDL_bool gimg_load( struct guiimg *gi ) char path[MKPATH_MAX]; // Get the file - mkpath( path, gi->filename ); - f = SDL_RWFromFile( path, "rb" ); - if( !f ) + mkpath(path, gi->filename); + f = SDL_RWFromFile(path, "rb"); + if(!f) { - error_printf( "Unable to open '%s' SDL_Error: %s\n", gi->filename, SDL_GetError() ); + error_printf("Unable to open '%s' SDL_Error: %s\n", gi->filename, SDL_GetError()); return SDL_FALSE; } // Read the header - if( SDL_RWread( f, hdrbuf, 54, 1 ) != 1 ) + if(SDL_RWread(f, hdrbuf, 54, 1) != 1) { - error_printf( "Error reading '%s'\n", gi->filename ); - SDL_RWclose( f ); + error_printf("Error reading '%s'\n", gi->filename); + SDL_RWclose(f); return SDL_FALSE; } fileok = SDL_TRUE; - if( strncmp( (char *)hdrbuf, "BM", 2 ) != 0 ) fileok = SDL_FALSE; // Must start with "BM" - if( ((hdrbuf[21]<<24)|(hdrbuf[20]<<16)|(hdrbuf[19]<<8)|hdrbuf[18]) != gi->w ) fileok = SDL_FALSE; // Must be the correct width - if( ((hdrbuf[25]<<24)|(hdrbuf[24]<<16)|(hdrbuf[23]<<8)|hdrbuf[22]) != gi->h ) fileok = SDL_FALSE; // Must be the correct height - if( ((hdrbuf[27]<<8)|hdrbuf[26]) != 1 ) fileok = SDL_FALSE; // Must contain one plane - if( ((hdrbuf[29]<<8)|hdrbuf[28]) != 24 ) fileok = SDL_FALSE; // Must be 24 bit - if( ((hdrbuf[33]<<24)|(hdrbuf[32]<<16)|(hdrbuf[31]<<8)|hdrbuf[30]) != 0 ) fileok = SDL_FALSE; // Must not be compressed + if(strncmp((char*)hdrbuf, "BM", 2) != 0) fileok = SDL_FALSE; // Must start with "BM" + if(((hdrbuf[21]<<24)|(hdrbuf[20]<<16)|(hdrbuf[19]<<8)|hdrbuf[18]) != gi->w) fileok = SDL_FALSE; // Must be the correct width + if(((hdrbuf[25]<<24)|(hdrbuf[24]<<16)|(hdrbuf[23]<<8)|hdrbuf[22]) != gi->h) fileok = SDL_FALSE; // Must be the correct height + if(((hdrbuf[27]<<8)|hdrbuf[26]) != 1) fileok = SDL_FALSE; // Must contain one plane + if(((hdrbuf[29]<<8)|hdrbuf[28]) != 24) fileok = SDL_FALSE; // Must be 24 bit + if(((hdrbuf[33]<<24)|(hdrbuf[32]<<16)|(hdrbuf[31]<<8)|hdrbuf[30]) != 0) fileok = SDL_FALSE; // Must not be compressed - if( !fileok ) + if(!fileok) { - error_printf( "'%s' needs to be a %dx%d, uncompressed, 24-bit BMP image\n", gi->filename, gi->w, gi->h ); - SDL_RWclose( f ); + error_printf("'%s' needs to be a %dx%d, uncompressed, 24-bit BMP image\n", gi->filename, gi->w, gi->h); + SDL_RWclose(f); return SDL_FALSE; } // Get some RAM! - if( !gi->buf ) - gi->buf = malloc( gi->w * gi->h * 3 ); + if(!gi->buf) + gi->buf = malloc(gi->w * gi->h * 3); - if( !gi->buf ) + if(!gi->buf) { - error_printf( "Out of memory\n" ); - SDL_RWclose( f ); + error_printf("Out of memory\n"); + SDL_RWclose(f); return SDL_FALSE; } // BMPs are upside down! - for( y=gi->h-1; y>=0; y-- ) + for(y=gi->h-1; y>=0; y--) { - SDL_RWread( f, hdrbuf, ((gi->w*3)+3)&0xfffffffc, 1 ); - for( x=0; xw; x++ ) + SDL_RWread(f, hdrbuf, ((gi->w*3)+3)&0xfffffffc, 1); + for(x=0; xw; x++) { gi->buf[(y*gi->w+x)*3+0] = hdrbuf[x*3+2]; gi->buf[(y*gi->w+x)*3+1] = hdrbuf[x*3+1]; @@ -468,198 +486,202 @@ SDL_bool gimg_load( struct guiimg *gi ) } } - SDL_RWclose( f ); + SDL_RWclose(f); return SDL_TRUE; } // Draw the statusbar at the bottom -void draw_statusbar( struct machine *oric ) +void draw_statusbar(struct machine *oric) { - if (oric->statusbar_mode == STATUSBARMODE_NONE) - oric->render_clear_area( 0, GIMG_POS_SBARY, 640, 480-GIMG_POS_SBARY ); - else - oric->render_gimg( GIMG_STATUSBAR, 0, GIMG_POS_SBARY ); + if(oric->statusbar_mode == STATUSBARMODE_NONE) + oric->render_clear_area(0, GIMG_POS_SBARY, 640, 480-GIMG_POS_SBARY); + else + oric->render_gimg(GIMG_STATUSBAR, 0, GIMG_POS_SBARY); } -void draw_keyboard( struct machine *oric ) { - if (oric->show_keyboard) { - switch( oric->type ) +void draw_keyboard(struct machine *oric) +{ + if(oric->show_keyboard) + { + switch(oric->type) { #ifndef WWW_NO_PRAVETZ - case MACH_PRAVETZ: - oric->render_gimg( GIMG_PRAVETZ_KEYBOARD, 0, 480); - break; + case MACH_PRAVETZ: + oric->render_gimg(GIMG_PRAVETZ_KEYBOARD, 0, 480); + break; #endif #ifndef WWW_NO_ORIC1 - case MACH_ORIC1: - case MACH_ORIC1_16K: - oric->render_gimg( GIMG_ORIC1_KEYBOARD, 0, 480); - break; + case MACH_ORIC1: + case MACH_ORIC1_16K: + oric->render_gimg(GIMG_ORIC1_KEYBOARD, 0, 480); + break; #endif - default: - oric->render_gimg( GIMG_ATMOS_KEYBOARD, 0, 480); - break; + default: + oric->render_gimg(GIMG_ATMOS_KEYBOARD, 0, 480); + break; } } } // Overlay the disk icons onto the status bar -void draw_disks( struct machine *oric ) +void draw_disks(struct machine *oric) { Sint32 i, j; - if( oric->statusbar_mode == STATUSBARMODE_NONE ) + if(oric->statusbar_mode == STATUSBARMODE_NONE) return; - if( oric->drivetype == DRV_NONE ) + if(oric->drivetype == DRV_NONE) { - oric->render_gimgpart( GIMG_STATUSBAR, GIMG_POS_DISKX, GIMG_POS_SBARY, GIMG_POS_DISKX, 0, 18*4, 16 ); + oric->render_gimgpart(GIMG_STATUSBAR, GIMG_POS_DISKX, GIMG_POS_SBARY, GIMG_POS_DISKX, 0, 18*4, 16); return; } - for( i=0; i<4; i++ ) + for(i=0; i<4; i++) { j = GIMG_DISK_EJECTED; - if( oric->wddisk.disk[i] ) + if(oric->wddisk.disk[i]) { j = ((oric->wddisk.c_drive==i)&&(oric->wddisk.currentop!=COP_NUFFINK)) ? GIMG_DISK_ACTIVE : GIMG_DISK_IDLE; - if( oric->wddisk.disk[i]->modified ) j+=2; + if(oric->wddisk.disk[i]->modified) j+=2; } - oric->render_gimg( j, GIMG_POS_DISKX+i*GIMG_W_DISK, GIMG_POS_SBARY ); + oric->render_gimg(j, GIMG_POS_DISKX+i*GIMG_W_DISK, GIMG_POS_SBARY); } } // Overlay the AVI record icon onto the status bar -void draw_avirec( struct machine *oric, SDL_bool recording ) +void draw_avirec(struct machine *oric, SDL_bool recording) { - if( oric->statusbar_mode == STATUSBARMODE_NONE) + if(oric->statusbar_mode == STATUSBARMODE_NONE) return; - if( recording ) + if(recording) { - oric->render_gimg( GIMG_AVI_RECORD, GIMG_POS_AVIRECX, GIMG_POS_SBARY ); + oric->render_gimg(GIMG_AVI_RECORD, GIMG_POS_AVIRECX, GIMG_POS_SBARY); return; } - oric->render_gimgpart( GIMG_STATUSBAR, GIMG_POS_AVIRECX, GIMG_POS_SBARY, GIMG_POS_AVIRECX, 0, 16, 16 ); + oric->render_gimgpart(GIMG_STATUSBAR, GIMG_POS_AVIRECX, GIMG_POS_SBARY, GIMG_POS_AVIRECX, 0, 16, 16); } // Overlay the tape icon onto the status bar -void draw_tape( struct machine *oric ) +void draw_tape(struct machine *oric) { - if( oric->statusbar_mode == STATUSBARMODE_NONE ) + if(oric->statusbar_mode == STATUSBARMODE_NONE) return; - if( oric->tapecap ) + if(oric->tapecap) { - oric->render_gimg( GIMG_TAPE_RECORD, GIMG_POS_TAPEX, GIMG_POS_SBARY ); + oric->render_gimg(GIMG_TAPE_RECORD, GIMG_POS_TAPEX, GIMG_POS_SBARY); return; } - if( !oric->tapebuf ) + if(!oric->tapebuf) { - oric->render_gimg( GIMG_TAPE_EJECTED, GIMG_POS_TAPEX, GIMG_POS_SBARY ); + oric->render_gimg(GIMG_TAPE_EJECTED, GIMG_POS_TAPEX, GIMG_POS_SBARY); return; } - if( oric->tapemotor ) + if(oric->tapemotor) { - oric->render_gimg( GIMG_TAPE_PLAY, GIMG_POS_TAPEX, GIMG_POS_SBARY ); + oric->render_gimg(GIMG_TAPE_PLAY, GIMG_POS_TAPEX, GIMG_POS_SBARY); return; } - if( oric->tapeoffs >= oric->tapelen ) + if(oric->tapeoffs >= oric->tapelen) { - oric->render_gimg( GIMG_TAPE_STOP, GIMG_POS_TAPEX, GIMG_POS_SBARY ); + oric->render_gimg(GIMG_TAPE_STOP, GIMG_POS_TAPEX, GIMG_POS_SBARY); return; } - oric->render_gimg( GIMG_TAPE_PAUSE, GIMG_POS_TAPEX, GIMG_POS_SBARY ); + oric->render_gimg(GIMG_TAPE_PAUSE, GIMG_POS_TAPEX, GIMG_POS_SBARY); } // Pop up some info! -void do_popup( struct machine *oric, char *str ) +void do_popup(struct machine *oric, char* str) { - strncpy( oric->popupstr, str, 40 ); oric->popupstr[39] = 0; + strncpy(oric->popupstr, str, 40); + oric->popupstr[39] = 0; oric->newpopupstr = SDL_TRUE; oric->popuptime = 100; } -void render_status( struct machine *oric ) +void render_status(struct machine *oric) { - if( refreshstatus ) - draw_statusbar( oric ); + if(refreshstatus) + draw_statusbar(oric); - if( refreshdisks || refreshstatus ) + if(refreshdisks || refreshstatus) { - draw_disks( oric ); + draw_disks(oric); refreshdisks = SDL_FALSE; } - if( refreshavi || refreshstatus ) + if(refreshavi || refreshstatus) { - draw_avirec( oric, vidcap != NULL ); + draw_avirec(oric, vidcap != NULL); refreshavi = SDL_FALSE; } - if( refreshtape || refreshstatus ) + if(refreshtape || refreshstatus) { - draw_tape( oric ); + draw_tape(oric); refreshtape = SDL_FALSE; } - if(refreshkeyboard || refreshstatus) { - draw_keyboard( oric ); - refreshkeyboard = SDL_FALSE; - } + if(refreshkeyboard || refreshstatus) + { + draw_keyboard(oric); + refreshkeyboard = SDL_FALSE; + } refreshstatus = SDL_FALSE; } // Top-level rendering routine -void render( struct machine *oric ) +void render(struct machine *oric) { int perc, fps; //, i; #ifndef WWW_NO_MONITOR - if( oric->emu_mode == EM_DEBUG ) - mon_update( oric ); + if(oric->emu_mode == EM_DEBUG) + mon_update(oric); #endif - oric->render_begin( oric ); + oric->render_begin(oric); - switch( oric->emu_mode ) + switch(oric->emu_mode) { case EM_MENU: - oric->render_video( oric, SDL_TRUE ); - render_status( oric ); - if( tz[TZ_MENU] ) oric->render_textzone( oric, TZ_MENU ); + oric->render_video(oric, SDL_TRUE); + render_status(oric); + if(tz[TZ_MENU]) oric->render_textzone(oric, TZ_MENU); break; case EM_RUNNING: - oric->render_video( oric, SDL_TRUE ); - render_status( oric ); - if( oric->statusbar_mode == STATUSBARMODE_FULL ) + oric->render_video(oric, SDL_TRUE); + render_status(oric); + if(oric->statusbar_mode == STATUSBARMODE_FULL) { fps = 100000/(frametimeave?frametimeave:1); - if( oric->vid_freq ) + if(oric->vid_freq) perc = 200000/(frametimeave?frametimeave:1); else perc = 166667/(frametimeave?frametimeave:1); #ifdef DEBUG_VSYNC - sprintf( oric->statusstr, "%4d.%02d%% - %4dFPS VSYNC:%3d", perc/100, perc%100, fps/100, oric->vid_offset ); + sprintf(oric->statusstr, "%4d.%02d%% - %4dFPS VSYNC:%3d", perc/100, perc%100, fps/100, oric->vid_offset); #else - sprintf( oric->statusstr, "%4d.%02d%% - %4dFPS", perc/100, perc%100, fps/100 ); + sprintf(oric->statusstr, "%4d.%02d%% - %4dFPS", perc/100, perc%100, fps/100); #endif oric->newstatusstr = SDL_TRUE; } - if( oric->popuptime > 0 ) + if(oric->popuptime > 0) { oric->popuptime--; - if( oric->popuptime == 0 ) + if(oric->popuptime == 0) { oric->popupstr[0] = 0; oric->newpopupstr = SDL_TRUE; @@ -669,26 +691,26 @@ void render( struct machine *oric ) #ifndef WWW_NO_MONITOR case EM_DEBUG: - mon_render( oric ); + mon_render(oric); break; #endif } - oric->render_end( oric ); + oric->render_end(oric); } // Draws a box in a textzone (uses the box chars in the font) // ptz = target textzone // x,y,w,h = location and dimensions // fg,bg = colours -void makebox( struct textzone *ptz, int x, int y, int w, int h, int fg, int bg ) +void makebox(struct textzone *ptz, int x, int y, int w, int h, int fg, int bg) { int cx, cy, o, bo; o = y*ptz->w+x; - for( cy=0; cytx[o ] = ' '; ptz->fc[o ] = fg; @@ -702,7 +724,7 @@ void makebox( struct textzone *ptz, int x, int y, int w, int h, int fg, int bg ) o = y*ptz->w+x; bo = o + (h-1)*ptz->w; - for( cx=0; cx<(w-1); cx++ ) + for(cx=0; cx<(w-1); cx++) { ptz->tx[o++] = cx==0?1:2; ptz->tx[bo++] = cx==0?9:2; @@ -714,14 +736,14 @@ void makebox( struct textzone *ptz, int x, int y, int w, int h, int fg, int bg ) } // Write a string to a textzone -void tzstr( struct textzone *ptz, char *text ) +void tzstr(struct textzone *ptz, char* text) { int i, o; o = ptz->py*ptz->w+ptz->px; - for( i=0; text && text[i]; i++ ) + for(i=0; text && text[i]; i++) { - switch( text[i] ) + switch(text[i]) { case 10: ptz->px = 1; @@ -737,7 +759,7 @@ void tzstr( struct textzone *ptz, char *text ) ptz->fc[o ] = ptz->cfc; ptz->bc[o++] = ptz->cbc; ptz->px++; - if( ptz->px >= ptz->w ) + if(ptz->px >= ptz->w) { ptz->px = 1; ptz->py++; @@ -750,78 +772,78 @@ void tzstr( struct textzone *ptz, char *text ) ptz->modified = SDL_TRUE; } -void tzputc( struct textzone *ptz, char c ) +void tzputc(struct textzone *ptz, char c) { char tmp[2]; tmp[0] = c; tmp[1] = 0; - tzstr( ptz, tmp ); + tzstr(ptz, tmp); } // Print a formatted string into a textzone -void tzprintf( struct textzone *ptz, char *fmt, ... ) +void tzprintf(struct textzone *ptz, char* fmt, ...) { va_list ap; - va_start( ap, fmt ); - if( vsnprintf( vsptmp, VSPTMPSIZE, fmt, ap ) != -1 ) + va_start(ap, fmt); + if(vsnprintf(vsptmp, VSPTMPSIZE, fmt, ap) != -1) { vsptmp[VSPTMPSIZE-1] = 0; - tzstr( ptz, vsptmp ); + tzstr(ptz, vsptmp); } - va_end( ap ); + va_end(ap); } // Write a string to a textzone at a specific location -void tzstrpos( struct textzone *ptz, int x, int y, char *text ) +void tzstrpos(struct textzone *ptz, int x, int y, char* text) { ptz->px = x; ptz->py = y; - tzstr( ptz, text ); + tzstr(ptz, text); } // Print a formatted string into a textzone at a specific location -void tzprintfpos( struct textzone *ptz, int x, int y, char *fmt, ... ) +void tzprintfpos(struct textzone *ptz, int x, int y, char* fmt, ...) { va_list ap; - va_start( ap, fmt ); - if( vsnprintf( vsptmp, VSPTMPSIZE, fmt, ap ) != -1 ) + va_start(ap, fmt); + if(vsnprintf(vsptmp, VSPTMPSIZE, fmt, ap) != -1) { vsptmp[VSPTMPSIZE-1] = 0; - tzstrpos( ptz, x, y, vsptmp ); + tzstrpos(ptz, x, y, vsptmp); } - va_end( ap ); + va_end(ap); } // Set the foreground and background colours for printing text into a textzone -void tzsetcol( struct textzone *ptz, int fc, int bc ) +void tzsetcol(struct textzone *ptz, int fc, int bc) { ptz->cfc = fc; ptz->cbc = bc; } // Set the title of a textzone -void tzsettitle( struct textzone *ptz, char *title ) +void tzsettitle(struct textzone *ptz, char* title) { int ox, oy; - makebox( ptz, 0, 0, ptz->w, ptz->h, menufc(SDL_FALSE), menubc(SDL_FALSE)); - if( !title ) return; + makebox(ptz, 0, 0, ptz->w, ptz->h, menufc(SDL_FALSE), menubc(SDL_FALSE)); + if(!title) return; - tzsetcol( ptz, menufc(SDL_FALSE), menubc(SDL_FALSE)); + tzsetcol(ptz, menufc(SDL_FALSE), menubc(SDL_FALSE)); ox = ptz->px; oy = ptz->py; ptz->px = 3; ptz->py = 0; - tzstr( ptz, "[ " ); - tzstr( ptz, title ); - tzstr( ptz, " ]" ); + tzstr(ptz, "[ "); + tzstr(ptz, title); + tzstr(ptz, " ]"); ptz->px = ox; ptz->py = oy; } -SDL_bool in_textzone( struct textzone *tz_, int x, int y ) +SDL_bool in_textzone(struct textzone *tz_, int x, int y) { - if( ( x >= tz_->x ) && ( x < (tz_->x+tz_->w*8) ) && - ( y >= tz_->y ) && ( y < (tz_->y+tz_->h*12) ) ) + if((x >= tz_->x) && (x < (tz_->x+tz_->w*8)) && + (y >= tz_->y) && (y < (tz_->y+tz_->h*12))) { return SDL_TRUE; } @@ -830,23 +852,23 @@ SDL_bool in_textzone( struct textzone *tz_, int x, int y ) } // Allocate a textzone structure -SDL_bool alloc_textzone( struct machine *oric, int i, int x, int y, int w, int h, char *title ) +SDL_bool alloc_textzone(struct machine *oric, int i, int x, int y, int w, int h, char* title) { struct textzone *ntz; - ntz = malloc( sizeof( struct textzone ) + w*h*3 ); - if( !ntz ) return SDL_FALSE; + ntz = malloc(sizeof(struct textzone) + w*h*3); + if(!ntz) return SDL_FALSE; ntz->x = x; ntz->y = y; ntz->w = w; ntz->h = h; - ntz->tx = (unsigned char *)(&ntz[1]); + ntz->tx = (unsigned char*)(&ntz[1]); ntz->fc = &ntz->tx[w*h]; ntz->bc = &ntz->fc[w*h]; - tzsettitle( ntz, title ); + tzsettitle(ntz, title); ntz->px = 1; ntz->py = 1; @@ -854,21 +876,21 @@ SDL_bool alloc_textzone( struct machine *oric, int i, int x, int y, int w, int h ntz->modified = SDL_TRUE; tz[i] = ntz; - oric->render_textzone_alloc( oric, i ); + oric->render_textzone_alloc(oric, i); return SDL_TRUE; } -void clear_textzone( struct machine *oric, int i ) +void clear_textzone(struct machine *oric, int i) { int x, y; struct textzone *ptz = tz[i]; - if (!ptz) return; + if(!ptz) return; - for( y=1; y<(ptz->h-1); y++ ) + for(y=1; y<(ptz->h-1); y++) { - for( x=1; x<(ptz->w-1); x++ ) + for(x=1; x<(ptz->w-1); x++) { ptz->tx[y*ptz->w+x] = ' '; ptz->fc[y*ptz->w+x] = 2; @@ -880,32 +902,32 @@ void clear_textzone( struct machine *oric, int i ) } // Free a textzone structure -void free_textzone( struct machine *oric, int i ) +void free_textzone(struct machine *oric, int i) { - oric->render_textzone_free( oric, i ); - if( !tz[i] ) return; - free( tz[i] ); + oric->render_textzone_free(oric, i); + if(!tz[i]) return; + free(tz[i]); tz[i] = NULL; } // Draw the current menu items into the menu textzone -void drawitems( void ) +void drawitems(void) { int i, j, o; // No menu, or no textzone? - if( ( !cmenu ) || ( !tz[TZ_MENU] ) ) + if((!cmenu) || (!tz[TZ_MENU])) return; // For each item... - for( i=0; cmenu->items[i].name; i++ ) + for(i=0; cmenu->items[i].name; i++) { // Check if its a menu bar - if( cmenu->items[i].name == OSDMENUBAR ) + if(cmenu->items[i].name == OSDMENUBAR) { // Fill it with the menu bar char o = tz[TZ_MENU]->w * (i+1) + 1; - for( j=1; jw-1; j++, o++ ) + for(j=1; jw-1; j++, o++) { tz[TZ_MENU]->tx[o] = 12; tz[TZ_MENU]->fc[o] = menufc(SDL_FALSE); @@ -915,75 +937,77 @@ void drawitems( void ) } // Check if this is the highlighted item, and set the colours accordingly - if( i==cmenu->citem ) - tzsetcol( tz[TZ_MENU], menufc(SDL_TRUE), menubc(SDL_TRUE)); + if(i==cmenu->citem) + tzsetcol(tz[TZ_MENU], menufc(SDL_TRUE), menubc(SDL_TRUE)); else - tzsetcol( tz[TZ_MENU], (cmenu->items[i].flags&OMIF_BRIGHT) ? 1 : menufc(SDL_FALSE), menubc(SDL_FALSE)); + tzsetcol(tz[TZ_MENU], (cmenu->items[i].flags&OMIF_BRIGHT) ? 1 : menufc(SDL_FALSE), menubc(SDL_FALSE)); // Calculate the position in the textzone o = tz[TZ_MENU]->w * (i+1) + 1; // Fill the background colour all the way along - for( j=1; jw-1; j++, o++ ) + for(j=1; jw-1; j++, o++) tz[TZ_MENU]->bc[o] = tz[TZ_MENU]->cbc; // Write the text for the item - if( cmenu->items[i].flags & OMIF_CENTRED ) - tzstrpos( tz[TZ_MENU], (tz[TZ_MENU]->w-(int)strlen(cmenu->items[i].name))/2, i+1, cmenu->items[i].name ); + if(cmenu->items[i].flags & OMIF_CENTRED) + tzstrpos(tz[TZ_MENU], (tz[TZ_MENU]->w-(int)strlen(cmenu->items[i].name))/2, i+1, cmenu->items[i].name); else - tzstrpos( tz[TZ_MENU], 1, i+1, cmenu->items[i].name ); + tzstrpos(tz[TZ_MENU], 1, i+1, cmenu->items[i].name); // And the key (if there is one) - if( cmenu->items[i].key ) - tzstrpos( tz[TZ_MENU], tz[TZ_MENU]->w-(1+(int)strlen(cmenu->items[i].key)), i+1, cmenu->items[i].key ); + if(cmenu->items[i].key) + tzstrpos(tz[TZ_MENU], tz[TZ_MENU]->w-(1+(int)strlen(cmenu->items[i].key)), i+1, cmenu->items[i].key); } } /***************** These functions can be used directly from the menu system ***************/ -void joinpath( char *path, char *file ) +void joinpath(char* path, char* file) { #if defined(__amigaos4__) - strcpy( filetmp, path ); - IDOS->AddPart( filetmp, file, 4096 ); + strcpy(filetmp, path); + IDOS->AddPart(filetmp, file, 4096); #elif defined(WIN32) int i; - strncpy( filetmp, path, 4096 ); filetmp[4095] = 0; - i = strlen( filetmp ); - if( ( i > 0 ) && ( filetmp[i-1] != PATHSEP ) && ( filetmp[i-1] != ':' ) ) + strncpy(filetmp, path, 4096); + filetmp[4095] = 0; + i = strlen(filetmp); + if((i > 0) && (filetmp[i-1] != PATHSEP) && (filetmp[i-1] != ':')) { filetmp[i++] = PATHSEP; filetmp[i++] = 0; } - strncat( filetmp, file, 4096+512 ); + strncat(filetmp, file, 4096+512); filetmp[4096+511] = 0; #else int i; - strncpy( filetmp, path, 4096 ); filetmp[4095] = 0; - i = (int)strlen( filetmp ); - if( ( i > 0 ) && ( filetmp[i-1] != PATHSEP ) ) + strncpy(filetmp, path, 4096); + filetmp[4095] = 0; + i = (int)strlen(filetmp); + if((i > 0) && (filetmp[i-1] != PATHSEP)) { filetmp[i++] = PATHSEP; filetmp[i++] = 0; } - strncat( filetmp, file, 4096+512 ); + strncat(filetmp, file, 4096+512); filetmp[4096+511] = 0; #endif } // "insert" a tape into the virtual tape drive, via filerequester -void inserttape( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void inserttape(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if( !filerequester( oric, "Insert tape", tapepath, tapefile, FR_TAPELOAD ) ) return; + if(!filerequester(oric, "Insert tape", tapepath, tapefile, FR_TAPELOAD)) return; oric->lasttapefile[0] = 0; - joinpath( tapepath, tapefile ); + joinpath(tapepath, tapefile); - switch (detect_image_type(filetmp)) + switch(detect_image_type(filetmp)) { case IMG_SNAPSHOT: - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be a snapshot file.\n" - "Would you like to load it? (All RAM and machine state will be lost)")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be a snapshot file.\n" + "Would you like to load it? (All RAM and machine state will be lost)")) { load_snapshot(oric, filetmp); return; @@ -991,197 +1015,197 @@ void inserttape( struct machine *oric, struct osdmenuitem *mitem, int dummy ) break; case IMG_ATMOS_MICRODISC: - if ((oric->type != MACH_ATMOS) && + if((oric->type != MACH_ATMOS) && (oric->type != MACH_ORIC1) && (oric->type != MACH_PRAVETZ)) { - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be a disk for an Oric Atmos with Microdisc.\n" - "Would you like to switch to that configuration and insert it as a disk?")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be a disk for an Oric Atmos with Microdisc.\n" + "Would you like to switch to that configuration and insert it as a disk?")) { - swapmach( oric, NULL, (DRV_MICRODISC<<16)|MACH_ATMOS ); - joinpath( tapepath, tapefile ); - diskimage_load( oric, filetmp, 0 ); + swapmach(oric, NULL, (DRV_MICRODISC<<16)|MACH_ATMOS); + joinpath(tapepath, tapefile); + diskimage_load(oric, filetmp, 0); } - setemumode( oric, NULL, EM_RUNNING ); + setemumode(oric, NULL, EM_RUNNING); return; } - if (oric->drivetype != DRV_MICRODISC) + if(oric->drivetype != DRV_MICRODISC) { - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be a disk for a use with the Microdisc controller.\n" - "Would you like to switch to that configuration and insert it as a disk?")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be a disk for a use with the Microdisc controller.\n" + "Would you like to switch to that configuration and insert it as a disk?")) { - swapmach( oric, NULL, (DRV_MICRODISC<<16)|oric->type ); - joinpath( tapepath, tapefile ); - diskimage_load( oric, filetmp, 0 ); + swapmach(oric, NULL, (DRV_MICRODISC<<16)|oric->type); + joinpath(tapepath, tapefile); + diskimage_load(oric, filetmp, 0); } - setemumode( oric, NULL, EM_RUNNING ); + setemumode(oric, NULL, EM_RUNNING); return; } - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be a disk.\n" - "Would you like to insert it in drive 0?")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be a disk.\n" + "Would you like to insert it in drive 0?")) { - joinpath( tapepath, tapefile ); - diskimage_load( oric, filetmp, 0 ); + joinpath(tapepath, tapefile); + diskimage_load(oric, filetmp, 0); } - setemumode( oric, NULL, EM_RUNNING ); + setemumode(oric, NULL, EM_RUNNING); return; case IMG_ATMOS_JASMIN: - if ((oric->type != MACH_ATMOS) && + if((oric->type != MACH_ATMOS) && (oric->type != MACH_ORIC1) && (oric->type != MACH_PRAVETZ)) { - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be a disk for an Oric Atmos with Jasmin.\n" - "Would you like to switch to that configuration and insert it as a disk?")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be a disk for an Oric Atmos with Jasmin.\n" + "Would you like to switch to that configuration and insert it as a disk?")) { - swapmach( oric, NULL, (DRV_JASMIN<<16)|MACH_ATMOS ); - joinpath( tapepath, tapefile ); - diskimage_load( oric, filetmp, 0 ); + swapmach(oric, NULL, (DRV_JASMIN<<16)|MACH_ATMOS); + joinpath(tapepath, tapefile); + diskimage_load(oric, filetmp, 0); oric->auto_jasmin_reset = SDL_TRUE; } - setemumode( oric, NULL, EM_RUNNING ); + setemumode(oric, NULL, EM_RUNNING); return; } - if (oric->drivetype != DRV_JASMIN) + if(oric->drivetype != DRV_JASMIN) { - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be a disk for a use with the Jasmin controller.\n" - "Would you like to switch to that configuration and insert it as a disk?")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be a disk for a use with the Jasmin controller.\n" + "Would you like to switch to that configuration and insert it as a disk?")) { - swapmach( oric, NULL, (DRV_JASMIN<<16)|oric->type ); - joinpath( tapepath, tapefile ); - diskimage_load( oric, filetmp, 0 ); + swapmach(oric, NULL, (DRV_JASMIN<<16)|oric->type); + joinpath(tapepath, tapefile); + diskimage_load(oric, filetmp, 0); oric->auto_jasmin_reset = SDL_TRUE; } - setemumode( oric, NULL, EM_RUNNING ); + setemumode(oric, NULL, EM_RUNNING); return; } - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be a disk.\n" - "Would you like to insert it in drive 0?")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be a disk.\n" + "Would you like to insert it in drive 0?")) { - joinpath( tapepath, tapefile ); - diskimage_load( oric, filetmp, 0 ); + joinpath(tapepath, tapefile); + diskimage_load(oric, filetmp, 0); } - setemumode( oric, NULL, EM_RUNNING ); + setemumode(oric, NULL, EM_RUNNING); return; case IMG_TELESTRAT_DISK: - if (oric->type != MACH_TELESTRAT) + if(oric->type != MACH_TELESTRAT) { - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be a disk for the Telestrat.\n" - "Would you like to switch to that configuration and insert it as a disk?")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be a disk for the Telestrat.\n" + "Would you like to switch to that configuration and insert it as a disk?")) { - swapmach( oric, NULL, MACH_TELESTRAT ); - joinpath( tapepath, tapefile ); - diskimage_load( oric, filetmp, 0 ); + swapmach(oric, NULL, MACH_TELESTRAT); + joinpath(tapepath, tapefile); + diskimage_load(oric, filetmp, 0); } - setemumode( oric, NULL, EM_RUNNING ); + setemumode(oric, NULL, EM_RUNNING); return; } - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be a disk.\n" - "Would you like to insert it in drive 0?")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be a disk.\n" + "Would you like to insert it in drive 0?")) { - joinpath( tapepath, tapefile ); - diskimage_load( oric, filetmp, 0 ); + joinpath(tapepath, tapefile); + diskimage_load(oric, filetmp, 0); } - setemumode( oric, NULL, EM_RUNNING ); + setemumode(oric, NULL, EM_RUNNING); return; case IMG_PRAVETZ_DISK: - if (oric->type != MACH_PRAVETZ) + if(oric->type != MACH_PRAVETZ) { - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be a disk for the Pravetz 8D disk controller.\n" - "Would you like to switch to that configuration and insert it as a disk?")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be a disk for the Pravetz 8D disk controller.\n" + "Would you like to switch to that configuration and insert it as a disk?")) { - swapmach( oric, NULL, (DRV_PRAVETZ<<16)|MACH_PRAVETZ ); - joinpath( tapepath, tapefile ); - diskimage_load( oric, filetmp, 0 ); - pravdiskboot( oric ); + swapmach(oric, NULL, (DRV_PRAVETZ<<16)|MACH_PRAVETZ); + joinpath(tapepath, tapefile); + diskimage_load(oric, filetmp, 0); + pravdiskboot(oric); } - setemumode( oric, NULL, EM_RUNNING ); + setemumode(oric, NULL, EM_RUNNING); return; } - if (oric->drivetype != DRV_PRAVETZ) + if(oric->drivetype != DRV_PRAVETZ) { - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be a disk for the Pravetz disk controller.\n" - "Would you like to switch to that configuration and insert it as a disk?")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be a disk for the Pravetz disk controller.\n" + "Would you like to switch to that configuration and insert it as a disk?")) { - swapmach( oric, NULL, (DRV_PRAVETZ<<16)|MACH_PRAVETZ ); - joinpath( tapepath, tapefile ); - diskimage_load( oric, filetmp, 0 ); - pravdiskboot( oric ); + swapmach(oric, NULL, (DRV_PRAVETZ<<16)|MACH_PRAVETZ); + joinpath(tapepath, tapefile); + diskimage_load(oric, filetmp, 0); + pravdiskboot(oric); } - setemumode( oric, NULL, EM_RUNNING ); + setemumode(oric, NULL, EM_RUNNING); return; } - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be a disk.\n" - "Would you like to insert it in drive 0?")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be a disk.\n" + "Would you like to insert it in drive 0?")) { - joinpath( tapepath, tapefile ); - diskimage_load( oric, filetmp, 0 ); + joinpath(tapepath, tapefile); + diskimage_load(oric, filetmp, 0); } - setemumode( oric, NULL, EM_RUNNING ); + setemumode(oric, NULL, EM_RUNNING); return; case IMG_GUESS_MICRODISC: - if ((oric->drivetype == DRV_PRAVETZ) || + if((oric->drivetype == DRV_PRAVETZ) || (oric->drivetype == DRV_NONE)) { - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be a disk for a Microdisc or Jasmin system.\n" - "Would you like to switch to Microdisc and insert it as a disk?")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be a disk for a Microdisc or Jasmin system.\n" + "Would you like to switch to Microdisc and insert it as a disk?")) { - swapmach( oric, NULL, (DRV_MICRODISC<<16)|oric->type ); - joinpath( tapepath, tapefile ); - diskimage_load( oric, filetmp, 0 ); + swapmach(oric, NULL, (DRV_MICRODISC<<16)|oric->type); + joinpath(tapepath, tapefile); + diskimage_load(oric, filetmp, 0); } - setemumode( oric, NULL, EM_RUNNING ); + setemumode(oric, NULL, EM_RUNNING); return; } - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be a disk.\n" - "Would you like to insert it in drive 0?")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be a disk.\n" + "Would you like to insert it in drive 0?")) { - joinpath( tapepath, tapefile ); - diskimage_load( oric, filetmp, 0 ); + joinpath(tapepath, tapefile); + diskimage_load(oric, filetmp, 0); } - setemumode( oric, NULL, EM_RUNNING ); + setemumode(oric, NULL, EM_RUNNING); return; } - tape_load_tap( oric, filetmp ); + tape_load_tap(oric, filetmp); #ifndef WWW_NO_MONITOR - if( oric->symbolsautoload ) mon_new_symbols( &oric->usersyms, oric, "symbols", SYM_BESTGUESS, SDL_TRUE, SDL_TRUE ); + if(oric->symbolsautoload) mon_new_symbols(&oric->usersyms, oric, "symbols", SYM_BESTGUESS, SDL_TRUE, SDL_TRUE); #endif - setemumode( oric, NULL, EM_RUNNING ); + setemumode(oric, NULL, EM_RUNNING); } // "insert" a disk into the virtual disk drive, via filerequester -void insertdisk( struct machine *oric, struct osdmenuitem *mitem, int drive ) +void insertdisk(struct machine *oric, struct osdmenuitem *mitem, int drive) { - char *dpath, *dfile; + char* dpath, *dfile; - if( oric->type != MACH_TELESTRAT ) + if(oric->type != MACH_TELESTRAT) { - switch (oric->drivetype) + switch(oric->drivetype) { case DRV_PRAVETZ: dpath = pravdiskpath; @@ -1193,20 +1217,22 @@ void insertdisk( struct machine *oric, struct osdmenuitem *mitem, int drive ) dfile = diskfile; break; } - } else { + } + else + { dpath = telediskpath; dfile = telediskfile; } - if( !filerequester( oric, "Insert disk", dpath, dfile, FR_DISKLOAD ) ) return; - joinpath( dpath, dfile ); + if(!filerequester(oric, "Insert disk", dpath, dfile, FR_DISKLOAD)) return; + joinpath(dpath, dfile); - switch (detect_image_type(filetmp)) + switch(detect_image_type(filetmp)) { case IMG_SNAPSHOT: - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be a snapshot file.\n" - "Would you like to load it? (All RAM and machine state will be lost)")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be a snapshot file.\n" + "Would you like to load it? (All RAM and machine state will be lost)")) { load_snapshot(oric, filetmp); return; @@ -1214,61 +1240,61 @@ void insertdisk( struct machine *oric, struct osdmenuitem *mitem, int drive ) break; case IMG_ATMOS_MICRODISC: - if ((oric->type != MACH_ATMOS) && + if((oric->type != MACH_ATMOS) && (oric->type != MACH_ORIC1) && (oric->type != MACH_PRAVETZ)) { - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be for an Oric Atmos with Microdisc.\n" - "Would you like to switch to that configuration?")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be for an Oric Atmos with Microdisc.\n" + "Would you like to switch to that configuration?")) { - swapmach( oric, NULL, (DRV_MICRODISC<<16)|MACH_ATMOS ); + swapmach(oric, NULL, (DRV_MICRODISC<<16)|MACH_ATMOS); } break; } - if ((oric->drivetype != DRV_MICRODISC) && + if((oric->drivetype != DRV_MICRODISC) && (oric->drivetype != DRV_NONE)) { - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be for a use with the Microdisc controller.\n" - "Would you like to switch to that configuration?")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be for a use with the Microdisc controller.\n" + "Would you like to switch to that configuration?")) { - swapmach( oric, NULL, (DRV_MICRODISC<<16)|oric->type ); + swapmach(oric, NULL, (DRV_MICRODISC<<16)|oric->type); } break; } break; case IMG_ATMOS_JASMIN: - if ((oric->type != MACH_ATMOS) && + if((oric->type != MACH_ATMOS) && (oric->type != MACH_ORIC1) && (oric->type != MACH_PRAVETZ)) { - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be for an Oric Atmos with Jasmin.\n" - "Would you like to switch to that configuration?")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be for an Oric Atmos with Jasmin.\n" + "Would you like to switch to that configuration?")) { - swapmach( oric, NULL, (DRV_JASMIN<<16)|MACH_ATMOS ); + swapmach(oric, NULL, (DRV_JASMIN<<16)|MACH_ATMOS); oric->auto_jasmin_reset = SDL_TRUE; } break; } - if (oric->drivetype == DRV_NONE) + if(oric->drivetype == DRV_NONE) { - swapmach( oric, NULL, (DRV_JASMIN<<16)|oric->type); + swapmach(oric, NULL, (DRV_JASMIN<<16)|oric->type); oric->auto_jasmin_reset = SDL_TRUE; break; } - if (oric->drivetype != DRV_JASMIN) + if(oric->drivetype != DRV_JASMIN) { - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be for a use with the Jasmin controller.\n" - "Would you like to switch to that configuration?")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be for a use with the Jasmin controller.\n" + "Would you like to switch to that configuration?")) { - swapmach( oric, NULL, (DRV_JASMIN<<16)|oric->type ); + swapmach(oric, NULL, (DRV_JASMIN<<16)|oric->type); oric->auto_jasmin_reset = SDL_TRUE; } break; @@ -1276,104 +1302,104 @@ void insertdisk( struct machine *oric, struct osdmenuitem *mitem, int drive ) break; case IMG_TELESTRAT_DISK: - if (oric->type != MACH_TELESTRAT) + if(oric->type != MACH_TELESTRAT) { - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be for a Telestrat.\n" - "Would you like to switch to that configuration?")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be for a Telestrat.\n" + "Would you like to switch to that configuration?")) { - swapmach( oric, NULL, MACH_TELESTRAT ); + swapmach(oric, NULL, MACH_TELESTRAT); } break; } break; case IMG_PRAVETZ_DISK: - if (oric->type != MACH_PRAVETZ) + if(oric->type != MACH_PRAVETZ) { - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be for a Pravetz 8D disk controller.\n" - "Would you like to switch to that configuration?")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be for a Pravetz 8D disk controller.\n" + "Would you like to switch to that configuration?")) { - swapmach( oric, NULL, (DRV_PRAVETZ<<16)|MACH_PRAVETZ ); - pravdiskboot( oric ); + swapmach(oric, NULL, (DRV_PRAVETZ<<16)|MACH_PRAVETZ); + pravdiskboot(oric); } break; } - if (oric->drivetype == DRV_NONE) + if(oric->drivetype == DRV_NONE) { - swapmach( oric, NULL, (DRV_PRAVETZ<<16)|MACH_PRAVETZ ); - pravdiskboot( oric ); + swapmach(oric, NULL, (DRV_PRAVETZ<<16)|MACH_PRAVETZ); + pravdiskboot(oric); break; } - if (oric->drivetype != DRV_PRAVETZ) + if(oric->drivetype != DRV_PRAVETZ) { - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be for a use with the Pravetz disk controller.\n" - "Would you like to switch to that configuration?")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be for a use with the Pravetz disk controller.\n" + "Would you like to switch to that configuration?")) { - swapmach( oric, NULL, (DRV_PRAVETZ<<16)|MACH_PRAVETZ ); - pravdiskboot( oric ); + swapmach(oric, NULL, (DRV_PRAVETZ<<16)|MACH_PRAVETZ); + pravdiskboot(oric); } break; } break; case IMG_GUESS_MICRODISC: - if (oric->drivetype == DRV_PRAVETZ) + if(oric->drivetype == DRV_PRAVETZ) { - if (msgbox(oric, MSGBOX_YES_NO, - "The file you selected appears to be for a Microdisc or Jasmin system.\n" - "Would you like to switch to Microdisc?")) + if(msgbox(oric, MSGBOX_YES_NO, + "The file you selected appears to be for a Microdisc or Jasmin system.\n" + "Would you like to switch to Microdisc?")) { - swapmach( oric, NULL, (DRV_MICRODISC<<16)|oric->type ); + swapmach(oric, NULL, (DRV_MICRODISC<<16)|oric->type); } break; } break; case IMG_TAPE: - if (msgbox(oric, MSGBOX_YES_NO, - "This appears to be a tape image...\n" - "Would you like to insert it as a tape?")) + if(msgbox(oric, MSGBOX_YES_NO, + "This appears to be a tape image...\n" + "Would you like to insert it as a tape?")) { oric->lasttapefile[0] = 0; - tape_load_tap( oric, filetmp ); + tape_load_tap(oric, filetmp); #ifndef WWW_NO_MONITOR - if( oric->symbolsautoload ) mon_new_symbols( &oric->usersyms, oric, "symbols", SYM_BESTGUESS, SDL_TRUE, SDL_TRUE ); + if(oric->symbolsautoload) mon_new_symbols(&oric->usersyms, oric, "symbols", SYM_BESTGUESS, SDL_TRUE, SDL_TRUE); #endif } - setemumode( oric, NULL, EM_RUNNING ); + setemumode(oric, NULL, EM_RUNNING); return; } - joinpath( dpath, dfile ); - diskimage_load( oric, filetmp, drive ); + joinpath(dpath, dfile); + diskimage_load(oric, filetmp, drive); - if( oric->drivetype == DRV_NONE ) + if(oric->drivetype == DRV_NONE) { - if (!oric->twilighteboard_activated) - swapmach( oric, NULL, (DRV_MICRODISC<<16)|oric->type ); -// setemumode( oric, NULL, EM_DEBUG ); + if(!oric->twilighteboard_activated) + swapmach(oric, NULL, (DRV_MICRODISC<<16)|oric->type); + // setemumode( oric, NULL, EM_DEBUG ); return; } - setemumode( oric, NULL, EM_RUNNING ); + setemumode(oric, NULL, EM_RUNNING); } -void savesnap( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void savesnap(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if( !filerequester( oric, "Save Snapshot", snappath, snapfile, FR_SNAPSHOTSAVE ) ) return; - joinpath( snappath, snapfile ); - save_snapshot( oric, filetmp ); + if(!filerequester(oric, "Save Snapshot", snappath, snapfile, FR_SNAPSHOTSAVE)) return; + joinpath(snappath, snapfile); + save_snapshot(oric, filetmp); } -void loadsnap( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void loadsnap(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if( !filerequester( oric, "Load Snapshot", snappath, snapfile, FR_SNAPSHOTLOAD ) ) return; - joinpath( snappath, snapfile ); - load_snapshot( oric, filetmp ); + if(!filerequester(oric, "Load Snapshot", snappath, snapfile, FR_SNAPSHOTLOAD)) return; + joinpath(snappath, snapfile); + load_snapshot(oric, filetmp); } void softresetoric(struct machine *oric, struct osdmenuitem *mitem, int dummy) @@ -1384,13 +1410,13 @@ void softresetoric(struct machine *oric, struct osdmenuitem *mitem, int dummy) } // Reset the oric -void resetoric( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void resetoric(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - switch( oric->drivetype ) + switch(oric->drivetype) { case DRV_MICRODISC: oric->romdis = SDL_TRUE; - microdisc_init( &oric->md, &oric->wddisk, oric ); + microdisc_init(&oric->md, &oric->wddisk, oric); break; case DRV_JASMIN: @@ -1401,36 +1427,36 @@ void resetoric( struct machine *oric, struct osdmenuitem *mitem, int dummy ) oric->romdis = SDL_FALSE; break; } - setromon( oric ); - m6502_reset( &oric->cpu ); - via_init( &oric->via, oric, VIA_MAIN ); - via_init( &oric->tele_via, oric, VIA_TELESTRAT ); - ay_init( &oric->ay, oric ); + setromon(oric); + m6502_reset(&oric->cpu); + via_init(&oric->via, oric, VIA_MAIN); + via_init(&oric->tele_via, oric, VIA_TELESTRAT); + ay_init(&oric->ay, oric); oric->cpu.rastercycles = oric->cyclesperraster; oric->frames = 0; - if( oric->autorewind ) tape_rewind( oric ); - setemumode( oric, NULL, EM_RUNNING ); + if(oric->autorewind) tape_rewind(oric); + setemumode(oric, NULL, EM_RUNNING); } -struct osdmenuitem *find_item_by_function(struct osdmenuitem *menu, void *function) +struct osdmenuitem *find_item_by_function(struct osdmenuitem *menu, void* function) { int i; static struct osdmenuitem dummyitem; /* So we can always return non-NULL */ - for (i=0; menu[i].name; i++) - if (menu[i].func == function) + for(i=0; menu[i].name; i++) + if(menu[i].func == function) return &menu[i]; return &dummyitem; } -struct osdmenuitem *find_item_by_function_and_arg(struct osdmenuitem *menu, void *function, int arg) +struct osdmenuitem *find_item_by_function_and_arg(struct osdmenuitem *menu, void* function, int arg) { int i; static struct osdmenuitem dummyitem; /* So we can always return non-NULL */ - for (i=0; menu[i].name; i++) - if ((menu[i].func == function) && (menu[i].arg == arg)) + for(i=0; menu[i].name; i++) + if((menu[i].func == function) && (menu[i].arg == arg)) return &menu[i]; return &dummyitem; @@ -1441,17 +1467,17 @@ struct osdmenuitem *find_item_by_key(struct osdmenuitem *menu, int sdlkey) int i; static struct osdmenuitem dummyitem; /* So we can always return non-NULL */ - for (i=0; menu[i].name; i++) - if (menu[i].sdlkey == sdlkey) + for(i=0; menu[i].name; i++) + if(menu[i].sdlkey == sdlkey) return &menu[i]; return &dummyitem; } // Turn tape noise on/off -void toggletapenoise( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void toggletapenoise(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if( oric->tapenoise ) + if(oric->tapenoise) { oric->ay.tapeout = 0; oric->tapenoise = SDL_FALSE; @@ -1464,29 +1490,29 @@ void toggletapenoise( struct machine *oric, struct osdmenuitem *mitem, int dummy } // Toggle sound on/off -void togglesound( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void togglesound(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if( ( soundon ) || (!soundavailable) ) + if((soundon) || (!soundavailable)) { soundon = SDL_FALSE; oric->ay.soundon = SDL_FALSE; mitem->name = " Sound enabled"; - if( soundavailable ) SDL_PauseAudio( 1 ); + if(soundavailable) SDL_PauseAudio(1); return; } soundon = SDL_TRUE; oric->ay.soundon = !warpspeed; mitem->name = "\x0e""Sound enabled"; - if( oric->emu_mode == EM_RUNNING ) SDL_PauseAudio( !warpspeed ); + if(oric->emu_mode == EM_RUNNING) SDL_PauseAudio(!warpspeed); } // Toggle turbotape on/off -void toggletapeturbo( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void toggletapeturbo(struct machine *oric, struct osdmenuitem *mitem, int dummy) { oric->tapeturbo_forceoff = SDL_FALSE; - if( oric->tapeturbo ) + if(oric->tapeturbo) { oric->tapeturbo = SDL_FALSE; mitem->name = " Turbo tape"; @@ -1498,9 +1524,9 @@ void toggletapeturbo( struct machine *oric, struct osdmenuitem *mitem, int dummy } // Toggle VSync Hack -void togglevsynchack( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void togglevsynchack(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if( oric->vsynchack ) + if(oric->vsynchack) { oric->vsynchack = SDL_FALSE; mitem->name = " VSync hack"; @@ -1512,9 +1538,9 @@ void togglevsynchack( struct machine *oric, struct osdmenuitem *mitem, int dummy } // Toggle lightpen -void togglelightpen( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void togglelightpen(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if( oric->lightpen ) + if(oric->lightpen) { oric->lightpen = SDL_FALSE; oric->cpu.read = oric->read_not_lightpen; @@ -1528,9 +1554,9 @@ void togglelightpen( struct machine *oric, struct osdmenuitem *mitem, int dummy } // Toggle tele acia (Serial card) -void toggleaciabackend( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void toggleaciabackend(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if( oric->aciabackend ) + if(oric->aciabackend) { oric->aciabackend = ACIA_TYPE_NONE; mitem->name = aciabackends[oric->aciabackend]; @@ -1541,44 +1567,44 @@ void toggleaciabackend( struct machine *oric, struct osdmenuitem *mitem, int dum mitem->name = aciabackendlabel; } - acia_init( &oric->tele_acia, oric ); + acia_init(&oric->tele_acia, oric); } // Toggle ch376 on/off void togglech376(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if (oric->ch376_activated) - { - oric->ch376_activated = SDL_FALSE; - mitem->name = " CH376 (Telestrat)"; - return; - } + if(oric->ch376_activated) + { + oric->ch376_activated = SDL_FALSE; + mitem->name = " CH376 (Telestrat)"; + return; + } - oric->ch376_activated = SDL_TRUE; - mitem->name = "\x0e""CH376 (Telestrat)"; - oric->ch376 = ch376_oric_init(); - if (oric->ch376 != NULL) - ch376_oric_config(oric->ch376); + oric->ch376_activated = SDL_TRUE; + mitem->name = "\x0e""CH376 (Telestrat)"; + oric->ch376 = ch376_oric_init(); + if(oric->ch376 != NULL) + ch376_oric_config(oric->ch376); } // Toggle twilighte on/off void toggletwilighte(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if (oric->twilighteboard_activated) - { - oric->twilighteboard_activated = SDL_FALSE; - mitem->name = " Twilighte board"; - return; - } + if(oric->twilighteboard_activated) + { + oric->twilighteboard_activated = SDL_FALSE; + mitem->name = " Twilighte board"; + return; + } - oric->twilighteboard_activated = SDL_TRUE; - mitem->name = "\x0e""Twilighte board"; - oric->twilighte = twilighte_oric_init(); - if (oric->twilighte == NULL) + oric->twilighteboard_activated = SDL_TRUE; + mitem->name = "\x0e""Twilighte board"; + oric->twilighte = twilighte_oric_init(); + if(oric->twilighte == NULL) { - oric->twilighteboard_activated = SDL_FALSE; // Impossible to create struct, we did not activate twilighteboard + oric->twilighteboard_activated = SDL_FALSE; // Impossible to create struct, we did not activate twilighteboard } else { @@ -1589,9 +1615,9 @@ void toggletwilighte(struct machine *oric, struct osdmenuitem *mitem, int dummy) } // Toggle symbols autoload -void togglesymbolsauto( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void togglesymbolsauto(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if( oric->symbolsautoload ) + if(oric->symbolsautoload) { oric->symbolsautoload = SDL_FALSE; mitem->name = " Autoload symbols file"; @@ -1603,9 +1629,9 @@ void togglesymbolsauto( struct machine *oric, struct osdmenuitem *mitem, int dum } // Toggle case sensitive symbols -void togglecasesyms( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void togglecasesyms(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if( oric->symbolscase ) + if(oric->symbolscase) { oric->symbolscase = SDL_FALSE; mitem->name = " Case-sensitive symbols"; @@ -1617,9 +1643,9 @@ void togglecasesyms( struct machine *oric, struct osdmenuitem *mitem, int dummy } // Toggle autorewind on/off -void toggleautowind( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void toggleautowind(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if( oric->autorewind ) + if(oric->autorewind) { oric->autorewind = SDL_FALSE; mitem->name = " Autorewind tape"; @@ -1631,9 +1657,9 @@ void toggleautowind( struct machine *oric, struct osdmenuitem *mitem, int dummy } // Toggle autoinsert on/off -void toggleautoinsrt( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void toggleautoinsrt(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if( oric->autoinsert ) + if(oric->autoinsert) { oric->autoinsert = SDL_FALSE; mitem->name = " Autoinsert tape"; @@ -1645,11 +1671,11 @@ void toggleautoinsrt( struct machine *oric, struct osdmenuitem *mitem, int dummy } // Toggle fullscreen on/off -void togglefullscreen( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void togglefullscreen(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if( !oric->render_togglefullscreen( oric ) ) return; // Failed :-( + if(!oric->render_togglefullscreen(oric)) return; // Failed :-( - if( fullscreen ) + if(fullscreen) { find_item_by_function(vdopitems, togglefullscreen)->name = "\x0e""Fullscreen"; find_item_by_function(glopitems, togglefullscreen)->name = "\x0e""Fullscreen"; @@ -1661,9 +1687,9 @@ void togglefullscreen( struct machine *oric, struct osdmenuitem *mitem, int dumm } // Toggle 50Hz/60Hz aspect ratio -void togglearatio( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void togglearatio(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if( oric->aratio ) + if(oric->aratio) { oric->aratio = SDL_FALSE; mitem->name = " 50Hz/60Hz aspect ratio"; @@ -1675,9 +1701,9 @@ void togglearatio( struct machine *oric, struct osdmenuitem *mitem, int dummy ) } // Toggle hstretch on/off -void togglehstretch( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void togglehstretch(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if( oric->hstretch ) + if(oric->hstretch) { oric->hstretch = SDL_FALSE; mitem->name = " Horizontal stretch"; @@ -1689,9 +1715,9 @@ void togglehstretch( struct machine *oric, struct osdmenuitem *mitem, int dummy } // Toggle PAL ghosting on/off -void togglepalghost( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void togglepalghost(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if( oric->palghost ) + if(oric->palghost) { oric->palghost = SDL_FALSE; mitem->name = " PAL ghosting"; @@ -1703,9 +1729,9 @@ void togglepalghost( struct machine *oric, struct osdmenuitem *mitem, int dummy } // Toggle scanlines on/off -void togglescanlines( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void togglescanlines(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if( oric->scanlines ) + if(oric->scanlines) { oric->scanlines = SDL_FALSE; find_item_by_function(vdopitems, togglescanlines)->name = " Scanlines"; @@ -1718,21 +1744,23 @@ void togglescanlines( struct machine *oric, struct osdmenuitem *mitem, int dummy find_item_by_function(glopitems, togglescanlines)->name = "\x0e""Scanlines"; } -void setoverclock( struct machine *oric, struct osdmenuitem *mitem, int value ) +void setoverclock(struct machine *oric, struct osdmenuitem *mitem, int value) { int i; /* Don't want to just modify name[0], since */ /* string constants are supposed to be constant.. */ - char *setnames[] = { "\x0e"" 1MHz (None)", "\x0e"" 2MHz", "\x0e"" 4MHz", "\x0e"" 8MHz", - "\x0e""16MHz", "\x0e""32MHz", "\x0e""64MHz" }; - char *unsetnames[] = { " 1MHz (None)", " 2MHz", " 4MHz", " 8MHz", - " 16MHz", " 32MHz", " 64MHz" }; + char* setnames[] = { "\x0e"" 1MHz (None)", "\x0e"" 2MHz", "\x0e"" 4MHz", "\x0e"" 8MHz", + "\x0e""16MHz", "\x0e""32MHz", "\x0e""64MHz" + }; + char* unsetnames[] = { " 1MHz (None)", " 2MHz", " 4MHz", " 8MHz", + " 16MHz", " 32MHz", " 64MHz" + }; oric->overclockmult = 1<overclockshift = value; - for( i=0; i<7; i++ ) + for(i=0; i<7; i++) { if(i == value) ovopitems[i].name = setnames[i]; @@ -1742,62 +1770,63 @@ void setoverclock( struct machine *oric, struct osdmenuitem *mitem, int value ) } // Go to internet site -void gotosite( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void gotosite(struct machine *oric, struct osdmenuitem *mitem, int dummy) { -/* TODO: mode those to their own gui_*.c */ + /* TODO: mode those to their own gui_*.c */ #if defined(__MORPHOS__) || defined(__AROS__) - struct Library *OpenURLBase = OpenLibrary( "openurl.library", 0 ); + struct Library *OpenURLBase = OpenLibrary("openurl.library", 0); static const struct TagItem URLTags[] = {{TAG_DONE, (ULONG) NULL}}; - if( OpenURLBase ) + if(OpenURLBase) { URL_OpenA(mitem->name, (struct TagItem*) URLTags); - CloseLibrary( OpenURLBase ); + CloseLibrary(OpenURLBase); } #elif defined(__amigaos4__) char tmp[256]; BPTR h; - sprintf( tmp, "URL:%s", mitem->name ); - if( ( h = IDOS->Open( tmp, MODE_OLDFILE ) ) ) IDOS->Close( h ); + sprintf(tmp, "URL:%s", mitem->name); + if((h = IDOS->Open(tmp, MODE_OLDFILE))) IDOS->Close(h); #elif defined(WIN32) || defined(__APPLE__) || defined(__BEOS__) || defined(__HAIKU__) - gui_open_url( mitem->name ); + gui_open_url(mitem->name); #else -/* default: assume XDG-compliant desktop */ + /* default: assume XDG-compliant desktop */ char tmp[256]; - sprintf( tmp, "xdg-open '%s'", mitem->name ); - system( tmp ); + sprintf(tmp, "xdg-open '%s'", mitem->name); + system(tmp); #endif } // Go to a different menu -void gotomenu( struct machine *oric, struct osdmenuitem *mitem, int menunum ) +void gotomenu(struct machine *oric, struct osdmenuitem *mitem, int menunum) { int i, w, keyw; - if( tz[TZ_MENU] ) free_textzone( oric, TZ_MENU ); + if(tz[TZ_MENU]) free_textzone(oric, TZ_MENU); cmenu = &menus[menunum]; - w = (int)strlen( cmenu->title )+8; + w = (int)strlen(cmenu->title)+8; keyw = 0; - for( i=0; cmenu->items[i].name; i++ ) + for(i=0; cmenu->items[i].name; i++) { - if( cmenu->items[i].name == OSDMENUBAR ) + if(cmenu->items[i].name == OSDMENUBAR) continue; - if( strlen( cmenu->items[i].name ) > w ) - w = (int)strlen( cmenu->items[i].name ); - if( cmenu->items[i].key ) + if(strlen(cmenu->items[i].name) > w) + w = (int)strlen(cmenu->items[i].name); + if(cmenu->items[i].key) { - if( (strlen( cmenu->items[i].key )+1) > keyw ) - keyw = (int)strlen( cmenu->items[i].key )+1; + if((strlen(cmenu->items[i].key)+1) > keyw) + keyw = (int)strlen(cmenu->items[i].key)+1; } } - w+=keyw+2; i+=2; + w+=keyw+2; + i+=2; - if( !alloc_textzone( oric, TZ_MENU, 320-w*4, 240-i*6, w, i, cmenu->title ) ) + if(!alloc_textzone(oric, TZ_MENU, 320-w*4, 240-i*6, w, i, cmenu->title)) { cmenu = NULL; oric->emu_mode = EM_RUNNING; @@ -1807,97 +1836,98 @@ void gotomenu( struct machine *oric, struct osdmenuitem *mitem, int menunum ) drawitems(); } -void togglekeyboard( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void togglekeyboard(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if( oric->show_keyboard ) - { - oric->show_keyboard = SDL_FALSE; - mitem->name = " Show keyboard"; - oric->shut_render(oric); - oric->init_render(oric); - return; - } - - oric->show_keyboard = SDL_TRUE; - mitem->name = "\x0e""Show keyboard"; + if(oric->show_keyboard) + { + oric->show_keyboard = SDL_FALSE; + mitem->name = " Show keyboard"; oric->shut_render(oric); oric->init_render(oric); - setemumode( oric, NULL, EM_RUNNING ); + return; + } + + oric->show_keyboard = SDL_TRUE; + mitem->name = "\x0e""Show keyboard"; + oric->shut_render(oric); + oric->init_render(oric); + setemumode(oric, NULL, EM_RUNNING); } -void definemapping( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void definemapping(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if( oric->define_mapping ) - { - oric->define_mapping = SDL_FALSE; - mitem->name = " Define mapping"; - return; - } + if(oric->define_mapping) + { + oric->define_mapping = SDL_FALSE; + mitem->name = " Define mapping"; + return; + } - oric->define_mapping = SDL_TRUE; - mitem->name = "\x0e""Define mapping"; - if(!oric->show_keyboard) { - find_item_by_function(keopitems, togglekeyboard)->name = "\x0e""Show keyboard"; - oric->show_keyboard = SDL_TRUE; - oric->shut_render(oric); - oric->init_render(oric); - } - cmenu = NULL; - oric->emu_mode = EM_RUNNING; - do_popup( oric, "Click on an Oric key." ); - setemumode( oric, NULL, EM_RUNNING ); + oric->define_mapping = SDL_TRUE; + mitem->name = "\x0e""Define mapping"; + if(!oric->show_keyboard) + { + find_item_by_function(keopitems, togglekeyboard)->name = "\x0e""Show keyboard"; + oric->show_keyboard = SDL_TRUE; + oric->shut_render(oric); + oric->init_render(oric); + } + cmenu = NULL; + oric->emu_mode = EM_RUNNING; + do_popup(oric, "Click on an Oric key."); + setemumode(oric, NULL, EM_RUNNING); } -void togglestickykeys( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void togglestickykeys(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if( oric->sticky_mod_keys ) - { - oric->sticky_mod_keys = SDL_FALSE; - mitem->name = " Sticky mod keys"; - release_sticky_keys(); - return; - } + if(oric->sticky_mod_keys) + { + oric->sticky_mod_keys = SDL_FALSE; + mitem->name = " Sticky mod keys"; + release_sticky_keys(); + return; + } - oric->sticky_mod_keys = SDL_TRUE; - mitem->name = "\x0e""Sticky mod keys"; - setemumode( oric, NULL, EM_RUNNING ); + oric->sticky_mod_keys = SDL_TRUE; + mitem->name = "\x0e""Sticky mod keys"; + setemumode(oric, NULL, EM_RUNNING); } -void savemapping( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void savemapping(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if( !filerequester( oric, "Save Keyboard Mapping", mappingpath, mappingfile, FR_KEYMAPPINGSAVE ) ) return; - joinpath( mappingpath, mappingfile ); - save_keyboard_mapping(oric, filetmp); - setemumode( oric, NULL, EM_RUNNING ); + if(!filerequester(oric, "Save Keyboard Mapping", mappingpath, mappingfile, FR_KEYMAPPINGSAVE)) return; + joinpath(mappingpath, mappingfile); + save_keyboard_mapping(oric, filetmp); + setemumode(oric, NULL, EM_RUNNING); } -void loadmapping( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void loadmapping(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - if( !filerequester( oric, "Load Keyboard Mapping", mappingpath, mappingfile, FR_KEYMAPPINGLOAD ) ) return; - joinpath( mappingpath, mappingfile ); - load_keyboard_mapping(oric, filetmp); - setemumode( oric, NULL, EM_RUNNING ); + if(!filerequester(oric, "Load Keyboard Mapping", mappingpath, mappingfile, FR_KEYMAPPINGLOAD)) return; + joinpath(mappingpath, mappingfile); + load_keyboard_mapping(oric, filetmp); + setemumode(oric, NULL, EM_RUNNING); } -void resetmapping( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void resetmapping(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - reset_keyboard_mapping(&(oric->keyboard_mapping)); - setemumode( oric, NULL, EM_RUNNING ); + reset_keyboard_mapping(&(oric->keyboard_mapping)); + setemumode(oric, NULL, EM_RUNNING); } #ifdef __CBCOPY__ -void clipbd_copy_gui( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void clipbd_copy_gui(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - clipboard_copy(oric); - setemumode( oric, NULL, EM_RUNNING ); + clipboard_copy(oric); + setemumode(oric, NULL, EM_RUNNING); } #endif #ifdef __CBPASTE__ -void clipbd_paste_gui( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void clipbd_paste_gui(struct machine *oric, struct osdmenuitem *mitem, int dummy) { - clipboard_paste(oric); - setemumode( oric, NULL, EM_RUNNING ); + clipboard_paste(oric); + setemumode(oric, NULL, EM_RUNNING); } #endif @@ -1905,16 +1935,16 @@ void clipbd_paste_gui( struct machine *oric, struct osdmenuitem *mitem, int dumm /************************* End of menu callable funcs *******************************/ // This is the event handler for when you are in the menus -SDL_bool menu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) +SDL_bool menu_event(SDL_Event *ev, struct machine *oric, SDL_bool *needrender) { SDL_bool done = SDL_FALSE; int i, x, y; // Wot, no menu?! - if( ( !cmenu ) || ( !tz[TZ_MENU] ) ) + if((!cmenu) || (!tz[TZ_MENU])) return done; x = -1; y = -1; - switch( ev->type ) + switch(ev->type) { case SDL_MOUSEMOTION: x = (ev->motion.x - tz[TZ_MENU]->x)/8; @@ -1922,7 +1952,7 @@ SDL_bool menu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) break; case SDL_MOUSEBUTTONDOWN: - if( ev->button.button == SDL_BUTTON_LEFT ) + if(ev->button.button == SDL_BUTTON_LEFT) { x = (ev->button.x - tz[TZ_MENU]->x)/8; y = (ev->button.y - tz[TZ_MENU]->y)/12-1; @@ -1930,11 +1960,12 @@ SDL_bool menu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) break; } - switch( ev->type ) + switch(ev->type) { case SDL_COMPAT_ACTIVEEVENT: - if(SDL_COMPAT_IsAppFocused(ev)) { - *needrender = SDL_TRUE; + if(SDL_COMPAT_IsAppFocused(ev)) + { + *needrender = SDL_TRUE; } break; @@ -1943,56 +1974,56 @@ SDL_bool menu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) x = (ev->motion.x - tz[TZ_MENU]->x)/8; y = (ev->motion.y - tz[TZ_MENU]->y)/12-1; - if( ( x < 0 ) || ( y < 0 ) || - ( x >= tz[TZ_MENU]->w ) ) + if((x < 0) || (y < 0) || + (x >= tz[TZ_MENU]->w)) break; - for( i=0; iitems[i].name == NULL ) + for(i=0; iitems[i].name == NULL) break; - if( ( i != y ) || ( cmenu->items[y].name == OSDMENUBAR ) || ( cmenu->items[y].func == NULL ) ) + if((i != y) || (cmenu->items[y].name == OSDMENUBAR) || (cmenu->items[y].func == NULL)) break; cmenu->citem = y; - if( ( ev->type == SDL_MOUSEBUTTONDOWN ) && - ( (ev->button.button==SDL_BUTTON_LEFT) || - (ev->button.button==SDL_BUTTON_RIGHT) ) ) - cmenu->items[cmenu->citem].func( oric, &cmenu->items[cmenu->citem], cmenu->items[cmenu->citem].arg ); + if((ev->type == SDL_MOUSEBUTTONDOWN) && + ((ev->button.button==SDL_BUTTON_LEFT) || + (ev->button.button==SDL_BUTTON_RIGHT))) + cmenu->items[cmenu->citem].func(oric, &cmenu->items[cmenu->citem], cmenu->items[cmenu->citem].arg); drawitems(); *needrender = SDL_TRUE; break; case SDL_KEYDOWN: - switch( ev->key.keysym.sym ) + switch(ev->key.keysym.sym) { case SDLK_UP: // Find the next selectable item above this one i = cmenu->citem-1; - while( ( cmenu->items[i].name == OSDMENUBAR ) || - ( cmenu->items[i].func == NULL ) ) + while((cmenu->items[i].name == OSDMENUBAR) || + (cmenu->items[i].func == NULL)) { - if( i < 0 ) break; + if(i < 0) break; i--; } // Hit the top? - if( ( i < 0 ) || ( cmenu->items[i].name == OSDMENUBAR ) ) + if((i < 0) || (cmenu->items[i].name == OSDMENUBAR)) { // Start the search again from the last item - for( i=0; cmenu->items[i].name; i++ ) ; + for(i=0; cmenu->items[i].name; i++) ; i--; // Find the first selectable item from here - while( ( cmenu->items[i].name == OSDMENUBAR ) || - ( cmenu->items[i].func == NULL ) ) + while((cmenu->items[i].name == OSDMENUBAR) || + (cmenu->items[i].func == NULL)) { - if( i < 0 ) break; + if(i < 0) break; i--; } - if( ( i < 0 ) || ( cmenu->items[i].name == OSDMENUBAR ) ) break; + if((i < 0) || (cmenu->items[i].name == OSDMENUBAR)) break; } cmenu->citem = i; drawitems(); @@ -2001,25 +2032,25 @@ SDL_bool menu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) case SDLK_DOWN: i = cmenu->citem+1; - while( ( cmenu->items[i].name == OSDMENUBAR ) || - ( cmenu->items[i].func == NULL ) ) + while((cmenu->items[i].name == OSDMENUBAR) || + (cmenu->items[i].func == NULL)) { - if( cmenu->items[i].name == NULL ) break; + if(cmenu->items[i].name == NULL) break; i++; } - if( ( cmenu->items[i].name == NULL ) || ( cmenu->items[i].name == OSDMENUBAR ) ) + if((cmenu->items[i].name == NULL) || (cmenu->items[i].name == OSDMENUBAR)) { i=0; - while( ( cmenu->items[i].name == OSDMENUBAR ) || - ( cmenu->items[i].func == NULL ) ) + while((cmenu->items[i].name == OSDMENUBAR) || + (cmenu->items[i].func == NULL)) { - if( cmenu->items[i].name == NULL ) break; + if(cmenu->items[i].name == NULL) break; i++; } - if( ( cmenu->items[i].name == NULL ) || ( cmenu->items[i].name == OSDMENUBAR ) ) + if((cmenu->items[i].name == NULL) || (cmenu->items[i].name == OSDMENUBAR)) break; } @@ -2034,20 +2065,20 @@ SDL_bool menu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) break; case SDL_KEYUP: - switch( ev->key.keysym.sym ) + switch(ev->key.keysym.sym) { case SDLK_RETURN: case SDLK_KP_ENTER: - if( !cmenu->items[cmenu->citem].func ) break; - cmenu->items[cmenu->citem].func( oric, &cmenu->items[cmenu->citem], cmenu->items[cmenu->citem].arg ); + if(!cmenu->items[cmenu->citem].func) break; + cmenu->items[cmenu->citem].func(oric, &cmenu->items[cmenu->citem], cmenu->items[cmenu->citem].arg); drawitems(); *needrender = SDL_TRUE; break; case SDLK_ESCAPE: - setemumode( oric, NULL, EM_RUNNING ); + setemumode(oric, NULL, EM_RUNNING); #ifdef WWW - if( oric->ay.soundon ) + if(oric->ay.soundon) { SDL_PauseAudio(0); } @@ -2056,17 +2087,17 @@ SDL_bool menu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) break; default: - for( i=0; cmenu->items[i].name; i++ ) + for(i=0; cmenu->items[i].name; i++) { - if( ( cmenu->items[i].sdlkey ) && - ( cmenu->items[i].sdlkey == ev->key.keysym.sym ) && - ( cmenu->items[i].func ) ) + if((cmenu->items[i].sdlkey) && + (cmenu->items[i].sdlkey == ev->key.keysym.sym) && + (cmenu->items[i].func)) break; } - if( !cmenu->items[i].name ) break; + if(!cmenu->items[i].name) break; - cmenu->items[i].func( oric, &cmenu->items[i], cmenu->items[i].arg ); + cmenu->items[i].func(oric, &cmenu->items[i], cmenu->items[i].arg); drawitems(); *needrender = SDL_TRUE; break; @@ -2074,17 +2105,17 @@ SDL_bool menu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) break; } - if (*needrender) ula_set_dirty(oric); + if(*needrender) ula_set_dirty(oric); return done; } -void set_render_mode( struct machine *oric, int whichrendermode ) +void set_render_mode(struct machine *oric, int whichrendermode) { oric->rendermode = whichrendermode; - switch( whichrendermode ) + switch(whichrendermode) { case RENDERMODE_SW: - if (oric->sw_depth == 8) + if(oric->sw_depth == 8) { oric->render_begin = render_begin_sw8; oric->render_end = render_end_sw8; @@ -2180,107 +2211,107 @@ void set_render_mode( struct machine *oric, int whichrendermode ) } } -void swap_render_mode( struct machine *oric, struct osdmenuitem *mitem, int newrendermode ) +void swap_render_mode(struct machine *oric, struct osdmenuitem *mitem, int newrendermode) { - if( oric->rendermode == newrendermode ) return; + if(oric->rendermode == newrendermode) return; - shut_gui( oric ); - shut_joy( oric ); - SDL_COMPAT_Quit( SDL_FALSE ); + shut_gui(oric); + shut_joy(oric); + SDL_COMPAT_Quit(SDL_FALSE); need_sdl_quit = SDL_FALSE; // Go SDL! - if( SDL_COMPAT_Init( SDL_INIT_VIDEO | SDL_INIT_AUDIO ) < 0 ) + if(SDL_COMPAT_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) { oric->emu_mode = EM_PLEASEQUIT; return; } need_sdl_quit = SDL_TRUE; - if( !init_gui( oric, newrendermode ) ) + if(!init_gui(oric, newrendermode)) { oric->emu_mode = EM_PLEASEQUIT; return; } - if( !ay_init( &oric->ay, oric ) ) + if(!ay_init(&oric->ay, oric)) { oric->emu_mode = EM_PLEASEQUIT; return; } - if( !init_joy( oric ) ) + if(!init_joy(oric)) { oric->emu_mode = EM_PLEASEQUIT; return; } - if( !init_filerequester( oric ) ) + if(!init_filerequester(oric)) { oric->emu_mode = EM_PLEASEQUIT; return; } - if( !init_msgbox( oric ) ) + if(!init_msgbox(oric)) { oric->emu_mode = EM_PLEASEQUIT; return; } - joy_setup( oric ); + joy_setup(oric); #ifdef WWW_MONITOR - mon_warminit( oric ); + mon_warminit(oric); #endif - setemumode( oric, NULL, EM_RUNNING ); + setemumode(oric, NULL, EM_RUNNING); } // Set things to default that can't fail -void preinit_gui( struct machine *oric ) +void preinit_gui(struct machine *oric) { int i; - for( i=0; idrivetype) + switch(oric->drivetype) { case DRV_JASMIN: case DRV_MICRODISC: @@ -2300,42 +2331,42 @@ void setmenutoggles( struct machine *oric ) break; } - if( soundavailable && soundon ) + if(soundavailable && soundon) find_item_by_function(auopitems, togglesound)->name = "\x0e""Sound enabled"; else find_item_by_function(auopitems, togglesound)->name = " Sound enabled"; - if( oric->tapenoise ) + if(oric->tapenoise) find_item_by_function(auopitems, toggletapenoise)->name = "\x0e""Tape noise"; else find_item_by_function(auopitems, toggletapenoise)->name = " Tape noise"; - if( oric->tapeturbo ) + if(oric->tapeturbo) find_item_by_function(hwopitems, toggletapeturbo)->name = "\x0e""Turbo tape"; else find_item_by_function(hwopitems, toggletapeturbo)->name = " Turbo tape"; - if( oric->autoinsert ) + if(oric->autoinsert) find_item_by_function(hwopitems, toggleautoinsrt)->name = "\x0e""Autoinsert tape"; else find_item_by_function(hwopitems, toggleautoinsrt)->name = " Autoinsert tape"; - if( oric->autorewind ) + if(oric->autorewind) find_item_by_function(hwopitems, toggleautowind)->name = "\x0e""Autorewind tape"; else find_item_by_function(hwopitems, toggleautowind)->name = " Autorewind tape"; - if( oric->vsynchack ) + if(oric->vsynchack) find_item_by_function(hwopitems, togglevsynchack)->name = "\x0e""VSync hack"; else find_item_by_function(hwopitems, togglevsynchack)->name = " VSync hack"; - if( oric->lightpen ) + if(oric->lightpen) find_item_by_function(hwopitems, togglelightpen)->name = "\x0e""Lightpen"; else find_item_by_function(hwopitems, togglelightpen)->name = " Lightpen"; - if( oric->aciabackend ) + if(oric->aciabackend) { strcpy(aciabackendlabel, aciabackends[oric->aciabackend]); sprintf(aciabackendlabel+18, "%.4X", oric->aciaoffset); @@ -2344,55 +2375,59 @@ void setmenutoggles( struct machine *oric ) else find_item_by_function(hwopitems, toggleaciabackend)->name = aciabackends[oric->aciabackend]; - if( oric->symbolsautoload ) + if(oric->symbolsautoload) find_item_by_function(dbopitems, togglesymbolsauto)->name = "\x0e""Autoload symbols file"; else find_item_by_function(dbopitems, togglesymbolsauto)->name = " Autoload symbols file"; - if( oric->symbolscase ) + if(oric->symbolscase) find_item_by_function(dbopitems, togglecasesyms)->name = "\x0e""Case-sensitive symbols"; else find_item_by_function(dbopitems, togglecasesyms)->name = " Case-sensitive symbols"; - if( fullscreen ) + if(fullscreen) { find_item_by_function(vdopitems, togglefullscreen)->name = "\x0e""Fullscreen"; find_item_by_function(glopitems, togglefullscreen)->name = "\x0e""Fullscreen"; - } else { + } + else + { find_item_by_function(vdopitems, togglefullscreen)->name = " Fullscreen"; find_item_by_function(glopitems, togglefullscreen)->name = " Fullscreen"; } - if( oric->aratio ) + if(oric->aratio) find_item_by_function(glopitems, togglearatio)->name = "\x0e""50Hz/60Hz aspect ratio"; else find_item_by_function(glopitems, togglearatio)->name = " 50Hz/60Hz aspect ratio"; - if( oric->hstretch ) + if(oric->hstretch) find_item_by_function(glopitems, togglehstretch)->name = "\x0e""Horizontal stretch"; else find_item_by_function(glopitems, togglehstretch)->name = " Horizontal stretch"; - if( oric->scanlines ) + if(oric->scanlines) { find_item_by_function(vdopitems, togglescanlines)->name = "\x0e""Scanlines"; find_item_by_function(glopitems, togglescanlines)->name = "\x0e""Scanlines"; - } else { + } + else + { find_item_by_function(vdopitems, togglescanlines)->name = " Scanlines"; find_item_by_function(glopitems, togglescanlines)->name = " Scanlines"; } - if( oric->palghost ) + if(oric->palghost) find_item_by_function(glopitems, togglepalghost)->name = "\x0e""PAL ghosting"; else find_item_by_function(glopitems, togglepalghost)->name = " PAL ghosting"; - find_item_by_function_and_arg(hwopitems, swapmach, (0xffff<<16)|MACH_ORIC1 )->name = oric->type==MACH_ORIC1 ? "\x0e""Oric-1" : " Oric-1"; - find_item_by_function_and_arg(hwopitems, swapmach, (0xffff<<16)|MACH_ORIC1_16K )->name = oric->type==MACH_ORIC1_16K ? "\x0e""Oric-1 16K" : " Oric-1 16K"; - find_item_by_function_and_arg(hwopitems, swapmach, (0xffff<<16)|MACH_ATMOS )->name = oric->type==MACH_ATMOS ? "\x0e""Atmos" : " Atmos"; + find_item_by_function_and_arg(hwopitems, swapmach, (0xffff<<16)|MACH_ORIC1)->name = oric->type==MACH_ORIC1 ? "\x0e""Oric-1" : " Oric-1"; + find_item_by_function_and_arg(hwopitems, swapmach, (0xffff<<16)|MACH_ORIC1_16K)->name = oric->type==MACH_ORIC1_16K ? "\x0e""Oric-1 16K" : " Oric-1 16K"; + find_item_by_function_and_arg(hwopitems, swapmach, (0xffff<<16)|MACH_ATMOS)->name = oric->type==MACH_ATMOS ? "\x0e""Atmos" : " Atmos"; find_item_by_function_and_arg(hwopitems, swapmach, (DRV_NONE<<16)|MACH_TELESTRAT)->name = oric->type==MACH_TELESTRAT ? "\x0e""Telestrat" : " Telestrat"; - find_item_by_function_and_arg(hwopitems, swapmach, (0xffff<<16)|MACH_PRAVETZ )->name = oric->type==MACH_PRAVETZ ? "\x0e""Pravetz 8D" : " Pravetz 8D"; + find_item_by_function_and_arg(hwopitems, swapmach, (0xffff<<16)|MACH_PRAVETZ)->name = oric->type==MACH_PRAVETZ ? "\x0e""Pravetz 8D" : " Pravetz 8D"; find_item_by_key(hwopitems, 'm')->func = microdiscrom_valid ? setdrivetype : NULL; find_item_by_key(hwopitems, 'j')->func = jasminrom_valid ? setdrivetype : NULL; @@ -2405,14 +2440,14 @@ void setmenutoggles( struct machine *oric ) find_item_by_key(hwopitems, 'p')->name = oric->drivetype==DRV_PRAVETZ ? "\x0e""Pravetz 8D disk" : " Pravetz 8D disk"; if(oric->show_keyboard) - find_item_by_function(keopitems, togglekeyboard)->name = "\x0e""Show keyboard"; + find_item_by_function(keopitems, togglekeyboard)->name = "\x0e""Show keyboard"; else - find_item_by_function(keopitems, togglekeyboard)->name = " Show keyboard"; + find_item_by_function(keopitems, togglekeyboard)->name = " Show keyboard"; if(oric->show_keyboard) - find_item_by_function(keopitems, togglestickykeys)->name = "\x0e""Sticky mod keys"; + find_item_by_function(keopitems, togglestickykeys)->name = "\x0e""Sticky mod keys"; else - find_item_by_function(keopitems, togglestickykeys)->name = " Sticky mod keys"; + find_item_by_function(keopitems, togglestickykeys)->name = " Sticky mod keys"; g_menu_scheme = oric->disable_menuscheme? 5 : oric->type; @@ -2421,29 +2456,29 @@ void setmenutoggles( struct machine *oric ) } // Initialise the GUI -SDL_bool init_gui( struct machine *oric, Sint32 rendermode ) +SDL_bool init_gui(struct machine *oric, Sint32 rendermode) { int i; SDL_AudioSpec wanted; - for( i=0; iinit_render( oric ) ) return SDL_FALSE; + set_render_mode(oric, rendermode); + if(!oric->init_render(oric)) return SDL_FALSE; // Allocate all text zones - if( !alloc_textzone( oric, TZ_MONITOR, 0, 228, 50, 21, "Monitor" ) ) return SDL_FALSE; - if( !alloc_textzone( oric, TZ_DEBUG, 0, 228, 50, 21, "Debug console" ) ) return SDL_FALSE; - if( !alloc_textzone( oric, TZ_MEMWATCH, 0, 228, 50, 21, "Memory watch" ) ) return SDL_FALSE; - if( !alloc_textzone( oric, TZ_REGS, 240, 0, 50, 19, "6502 Status" ) ) return SDL_FALSE; - if( !alloc_textzone( oric, TZ_VIA, 400, 228, 30, 21, "VIA Status" ) ) return SDL_FALSE; - if( !alloc_textzone( oric, TZ_VIA2, 400, 228, 30, 21, "Telestrat VIA Status" ) ) return SDL_FALSE; - if( !alloc_textzone( oric, TZ_AY, 400, 228, 30, 21, "AY Status" ) ) return SDL_FALSE; - if( !alloc_textzone( oric, TZ_DISK, 400, 228, 30, 21, "Disk Status" ) ) return SDL_FALSE; - if( !alloc_textzone( oric, TZ_TWIL, 400, 228, 30, 21, "Twilighte Status" ) ) return SDL_FALSE; + if(!alloc_textzone(oric, TZ_MONITOR, 0, 228, 50, 21, "Monitor")) return SDL_FALSE; + if(!alloc_textzone(oric, TZ_DEBUG, 0, 228, 50, 21, "Debug console")) return SDL_FALSE; + if(!alloc_textzone(oric, TZ_MEMWATCH, 0, 228, 50, 21, "Memory watch")) return SDL_FALSE; + if(!alloc_textzone(oric, TZ_REGS, 240, 0, 50, 19, "6502 Status")) return SDL_FALSE; + if(!alloc_textzone(oric, TZ_VIA, 400, 228, 30, 21, "VIA Status")) return SDL_FALSE; + if(!alloc_textzone(oric, TZ_VIA2, 400, 228, 30, 21, "Telestrat VIA Status")) return SDL_FALSE; + if(!alloc_textzone(oric, TZ_AY, 400, 228, 30, 21, "AY Status")) return SDL_FALSE; + if(!alloc_textzone(oric, TZ_DISK, 400, 228, 30, 21, "Disk Status")) return SDL_FALSE; + if(!alloc_textzone(oric, TZ_TWIL, 400, 228, 30, 21, "Twilighte Status")) return SDL_FALSE; // Set up SDL audio wanted.freq = AUDIO_FREQ; @@ -2456,7 +2491,7 @@ SDL_bool init_gui( struct machine *oric, Sint32 rendermode ) soundavailable = SDL_FALSE; soundon = SDL_FALSE; - if( SDL_OpenAudio( &wanted, &obtained ) >= 0 ) + if(SDL_OpenAudio(&wanted, &obtained) >= 0) { soundon = SDL_TRUE; soundavailable = SDL_TRUE; @@ -2464,45 +2499,45 @@ SDL_bool init_gui( struct machine *oric, Sint32 rendermode ) cyclespersample = ((CYCLESPERSECOND<shut_render( oric ); + oric->shut_render(oric); - for( i=0; ipravdiskautoboot ) + if(oric->pravdiskautoboot) { - queuekeys( "CALL800\x0d" ); + queuekeys("CALL800\x0d"); } } diff --git a/gui.h b/gui.h index ae113f4f..28fceac3 100644 --- a/gui.h +++ b/gui.h @@ -57,8 +57,8 @@ struct textzone { int x, y, w, h; // Dimensions int px, py, cfc, cbc; // Current position and text colours - unsigned char *tx; // Text buffer - unsigned char *fc, *bc; // Colour buffers + unsigned char* tx; // Text buffer + unsigned char* fc, *bc; // Colour buffers SDL_bool modified; }; @@ -73,8 +73,8 @@ struct textzone struct osdmenuitem { - char *name; - char *key; + char* name; + char* key; int sdlkey; void (*func)(struct machine *,struct osdmenuitem *,int); int arg; @@ -83,7 +83,7 @@ struct osdmenuitem struct osdmenu { - char *title; + char* title; int citem; struct osdmenuitem *items; }; @@ -92,7 +92,7 @@ struct osdmenu struct guiimg { - char *filename; + char* filename; Uint16 w, h; Uint8 *buf; }; @@ -123,58 +123,58 @@ enum #define NUM_GUI_COLS 16 -SDL_bool alloc_textzone( struct machine *oric, int i, int x, int y, int w, int h, char *title ); -void free_textzone( struct machine *oric, int i ); -SDL_bool in_textzone( struct textzone *tz, int x, int y ); - -void do_popup( struct machine *oric, char *str ); -void makebox( struct textzone *ptz, int x, int y, int w, int h, int fg, int bg ); -void tzsettitle( struct textzone *ptz, char *title ); -void tzstr( struct textzone *ptz, char *text ); -void tzputc( struct textzone *ptz, char c ); -void tzstrpos( struct textzone *ptz, int x, int y, char *text ); -void tzsetcol( struct textzone *ptz, int fc, int bc ); -void tzprintf( struct textzone *ptz, char *fmt, ... ); -void tzprintfpos( struct textzone *ptz, int x, int y, char *fmt, ... ); -void draw_textzone( struct textzone *ptz ); -void printstr( int x, int y, Uint32 fc, Uint32 bc, char *str ); -void gotosite( struct machine *oric, struct osdmenuitem *mitem, int dummy ); -void gotomenu( struct machine *oric, struct osdmenuitem *mitem, int menunum ); -SDL_bool menu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ); -void setmenutoggles( struct machine *oric ); -void set_render_mode( struct machine *oric, int whichrendermode ); - -void render( struct machine *oric ); -void preinit_gui( struct machine *oric ); -SDL_bool init_gui( struct machine *oric, Sint32 rendermode ); -void shut_gui( struct machine *oric ); - -void draw_statusbar( struct machine *oric ); -void draw_disks( struct machine *oric ); -void draw_avirec( struct machine *oric, SDL_bool recording ); -void draw_tape( struct machine *oric ); - -void draw_keyboard( struct machine *oric ); - - -void statusprintstr( int x, Uint32 fc, char *str ); -void joinpath( char *path, char *file ); +SDL_bool alloc_textzone(struct machine *oric, int i, int x, int y, int w, int h, char* title); +void free_textzone(struct machine *oric, int i); +SDL_bool in_textzone(struct textzone *tz, int x, int y); + +void do_popup(struct machine *oric, char* str); +void makebox(struct textzone *ptz, int x, int y, int w, int h, int fg, int bg); +void tzsettitle(struct textzone *ptz, char* title); +void tzstr(struct textzone *ptz, char* text); +void tzputc(struct textzone *ptz, char c); +void tzstrpos(struct textzone *ptz, int x, int y, char* text); +void tzsetcol(struct textzone *ptz, int fc, int bc); +void tzprintf(struct textzone *ptz, char* fmt, ...); +void tzprintfpos(struct textzone *ptz, int x, int y, char* fmt, ...); +void draw_textzone(struct textzone *ptz); +void printstr(int x, int y, Uint32 fc, Uint32 bc, char* str); +void gotosite(struct machine *oric, struct osdmenuitem *mitem, int dummy); +void gotomenu(struct machine *oric, struct osdmenuitem *mitem, int menunum); +SDL_bool menu_event(SDL_Event *ev, struct machine *oric, SDL_bool *needrender); +void setmenutoggles(struct machine *oric); +void set_render_mode(struct machine *oric, int whichrendermode); + +void render(struct machine *oric); +void preinit_gui(struct machine *oric); +SDL_bool init_gui(struct machine *oric, Sint32 rendermode); +void shut_gui(struct machine *oric); + +void draw_statusbar(struct machine *oric); +void draw_disks(struct machine *oric); +void draw_avirec(struct machine *oric, SDL_bool recording); +void draw_tape(struct machine *oric); + +void draw_keyboard(struct machine *oric); + + +void statusprintstr(int x, Uint32 fc, char* str); +void joinpath(char* path, char* file); /* implemented by OS-specific backends */ -SDL_bool init_gui_native( struct machine *oric ); -void shut_gui_native( struct machine *oric ); -void gui_open_url( const char *url ); -SDL_bool clipboard_copy( struct machine *oric ); -SDL_bool clipboard_paste( struct machine *oric ); +SDL_bool init_gui_native(struct machine *oric); +void shut_gui_native(struct machine *oric); +void gui_open_url(const char* url); +SDL_bool clipboard_copy(struct machine *oric); +SDL_bool clipboard_paste(struct machine *oric); -void setoverclock( struct machine *oric, struct osdmenuitem *mitem, int value ); -void clear_textzone( struct machine *oric, int i ); +void setoverclock(struct machine *oric, struct osdmenuitem *mitem, int value); +void clear_textzone(struct machine *oric, int i); -struct osdmenuitem *find_item_by_function(struct osdmenuitem *menu, void *function); +struct osdmenuitem *find_item_by_function(struct osdmenuitem *menu, void* function); -void togglefullscreen( struct machine *oric, struct osdmenuitem *mitem, int dummy ); +void togglefullscreen(struct machine *oric, struct osdmenuitem *mitem, int dummy); -void softresetoric( struct machine *oric, struct osdmenuitem *mitem, int dummy ); +void softresetoric(struct machine *oric, struct osdmenuitem *mitem, int dummy); -void pravdiskboot( struct machine *oric ); +void pravdiskboot(struct machine *oric); diff --git a/gui_android.c b/gui_android.c index 5c5c67d2..a2f92d18 100644 --- a/gui_android.c +++ b/gui_android.c @@ -35,7 +35,7 @@ static SDL_bool initialized = SDL_FALSE; -SDL_bool init_gui_native( struct machine *oric ) +SDL_bool init_gui_native(struct machine *oric) { if(!initialized) initialized = SDL_TRUE; @@ -44,13 +44,13 @@ SDL_bool init_gui_native( struct machine *oric ) return initialized; } -void shut_gui_native( struct machine *oric ) +void shut_gui_native(struct machine *oric) { /* FIXME: ... */ initialized = SDL_FALSE; } -void gui_open_url( const char *url ) +void gui_open_url(const char* url) { /* FIXME: ... */ return; diff --git a/gui_beos.cpp b/gui_beos.cpp index 31b3cdac..1216d417 100644 --- a/gui_beos.cpp +++ b/gui_beos.cpp @@ -48,282 +48,317 @@ extern "C" { #include "machine.h" } -static rgb_color oric_colors[] = { - { 0, 0, 0, 255 }, - { 255, 0, 0, 255 }, - { 0, 255, 0, 255 }, - { 255, 255, 0, 255 }, - { 0, 0, 255, 255 }, - { 255, 0, 255, 255 }, - { 0, 255, 255, 255 }, - { 255, 255, 255, 255 } +static rgb_color oric_colors[] = +{ + { 0, 0, 0, 255 }, + { 255, 0, 0, 255 }, + { 0, 255, 0, 255 }, + { 255, 255, 0, 255 }, + { 0, 0, 255, 255 }, + { 255, 0, 255, 255 }, + { 0, 255, 255, 255 }, + { 255, 255, 255, 255 } }; extern struct osdmenu menus[]; extern struct osdmenuitem aboutitems[]; //static BPopUpMenu *sPopup; -class OSDMenuItem : public BMenuItem { -public: - OSDMenuItem(struct osdmenuitem *desc, const char *name, BMessage *message) - : BMenuItem(name, message), fItem(desc) - { - if (desc->name[0] == '\x0e') - SetMarked(true); - if (desc->key) - SetTrigger(desc->key[0]); - }; - virtual ~OSDMenuItem() {}; - struct osdmenuitem *fItem; +class OSDMenuItem : public BMenuItem +{ + public: + OSDMenuItem(struct osdmenuitem *desc, const char* name, BMessage *message) + : BMenuItem(name, message), fItem(desc) + { + if(desc->name[0] == '\x0e') + SetMarked(true); + if(desc->key) + SetTrigger(desc->key[0]); + }; + virtual ~OSDMenuItem() {}; + struct osdmenuitem *fItem; }; -static void build_native_menus( struct osdmenu *menu, BMenu *m ) +static void build_native_menus(struct osdmenu *menu, BMenu *m) { - struct osdmenuitem *item = menu->items; - - printf("menu '%s': {\n", menu->title); - for (; item->name; item++) { - BMenuItem *mi; - const char *name = item->name; - if (name == OSDMENUBAR) { - name = "------------"; - // skip separators before back since it will also be ignored - if (item[1].sdlkey == SDLK_BACKSPACE) - continue; - mi = new BSeparatorItem(); - } else if (item->func == gotomenu) { - if (item->arg == 0) - continue; - // about item is special - if (menus[item->arg].items == aboutitems) { - mi = new BMenuItem(name, new BMessage(B_ABOUT_REQUESTED)); - } else { - BMenu *subMenu = new BMenu(name); - mi = new BMenuItem(subMenu); - build_native_menus( &menus[item->arg], subMenu ); - } - } else { - if (name[0] == ' ' || name[0] == '\x0e') - name = &name[1]; - mi = new OSDMenuItem(item, name, NULL); - } - - //printf("item '%s' key '%s'\n", name, item->key); - - m->AddItem(mi); - } - printf("}\n"); + struct osdmenuitem *item = menu->items; + + printf("menu '%s': {\n", menu->title); + for(; item->name; item++) + { + BMenuItem *mi; + const char* name = item->name; + if(name == OSDMENUBAR) + { + name = "------------"; + // skip separators before back since it will also be ignored + if(item[1].sdlkey == SDLK_BACKSPACE) + continue; + mi = new BSeparatorItem(); + } + else if(item->func == gotomenu) + { + if(item->arg == 0) + continue; + // about item is special + if(menus[item->arg].items == aboutitems) + { + mi = new BMenuItem(name, new BMessage(B_ABOUT_REQUESTED)); + } + else + { + BMenu *subMenu = new BMenu(name); + mi = new BMenuItem(subMenu); + build_native_menus(&menus[item->arg], subMenu); + } + } + else + { + if(name[0] == ' ' || name[0] == '\x0e') + name = &name[1]; + mi = new OSDMenuItem(item, name, NULL); + } + + //printf("item '%s' key '%s'\n", name, item->key); + + m->AddItem(mi); + } + printf("}\n"); } #if 0 -static void run_native_about( void ) +static void run_native_about(void) { - struct osdmenuitem *item = aboutitems; - BString text; - for (; item->name; item++) { - if (item->name == OSDMENUBAR) - break; - text << item->name; - text << "\n"; - } - BAlert *alert = new BAlert("About", text.String(), "Ok"); - alert->Go(); + struct osdmenuitem *item = aboutitems; + BString text; + for(; item->name; item++) + { + if(item->name == OSDMENUBAR) + break; + text << item->name; + text << "\n"; + } + BAlert *alert = new BAlert("About", text.String(), "Ok"); + alert->Go(); } #endif -SDL_bool init_gui_native( struct machine *oric ) +SDL_bool init_gui_native(struct machine *oric) { - BMimeType tapeType("application/x-oric-tape"); - if (!tapeType.IsInstalled()) - tapeType.Install(); - BMessage exts; - if (tapeType.GetFileExtensions(&exts) != B_OK) { - exts.AddString("extensions", "tap"); - tapeType.SetShortDescription("ORIC Tape"); - tapeType.SetLongDescription("ORIC Tape Image for emulators"); - tapeType.SetPreferredApp("application/x-vnd.oricutron"); - tapeType.SetFileExtensions(&exts); - tapeType.SetSnifferRule("0.40 [0:8](\"\\026\\026\\026\\044\")"); - } - exts.MakeEmpty(); - BMimeType diskType("application/x-oric-disk"); - if (!diskType.IsInstalled()) - diskType.Install(); - if (diskType.GetFileExtensions(&exts) != B_OK) { - exts.AddString("extensions", "dsk"); - diskType.Install(); - diskType.SetShortDescription("ORIC Disk"); - diskType.SetLongDescription("ORIC Disk Image for emulators"); - diskType.SetPreferredApp("application/x-vnd.oricutron"); - diskType.SetFileExtensions(&exts); - diskType.SetSnifferRule("0.80 (\"MFM_DISK\")"); - } - //BMimeType romType("application/x-oric-rom"); - - //sPopup = new BPopUpMenu("main"); - //build_native_menus( menus, sPopup ); - //TEST - //sPopup->Go( BPoint(0, 0), false, true); - - //run_native_about(); - - return SDL_TRUE; + BMimeType tapeType("application/x-oric-tape"); + if(!tapeType.IsInstalled()) + tapeType.Install(); + BMessage exts; + if(tapeType.GetFileExtensions(&exts) != B_OK) + { + exts.AddString("extensions", "tap"); + tapeType.SetShortDescription("ORIC Tape"); + tapeType.SetLongDescription("ORIC Tape Image for emulators"); + tapeType.SetPreferredApp("application/x-vnd.oricutron"); + tapeType.SetFileExtensions(&exts); + tapeType.SetSnifferRule("0.40 [0:8](\"\\026\\026\\026\\044\")"); + } + exts.MakeEmpty(); + BMimeType diskType("application/x-oric-disk"); + if(!diskType.IsInstalled()) + diskType.Install(); + if(diskType.GetFileExtensions(&exts) != B_OK) + { + exts.AddString("extensions", "dsk"); + diskType.Install(); + diskType.SetShortDescription("ORIC Disk"); + diskType.SetLongDescription("ORIC Disk Image for emulators"); + diskType.SetPreferredApp("application/x-vnd.oricutron"); + diskType.SetFileExtensions(&exts); + diskType.SetSnifferRule("0.80 (\"MFM_DISK\")"); + } + //BMimeType romType("application/x-oric-rom"); + + //sPopup = new BPopUpMenu("main"); + //build_native_menus( menus, sPopup ); + //TEST + //sPopup->Go( BPoint(0, 0), false, true); + + //run_native_about(); + + return SDL_TRUE; } -void shut_gui_native( struct machine *oric ) +void shut_gui_native(struct machine *oric) { } -extern "C" SDL_bool clipboard_copy( struct machine *oric ); -extern "C" SDL_bool clipboard_paste( struct machine *oric ); +extern "C" SDL_bool clipboard_copy(struct machine *oric); +extern "C" SDL_bool clipboard_paste(struct machine *oric); text_run *new_run(int32 offset, int color) { - BFont font(be_fixed_font); - text_run *run = new text_run; - run->offset = offset; - run->font = font; - run->color = oric_colors[color]; - return run; + BFont font(be_fixed_font); + text_run *run = new text_run; + run->offset = offset; + run->font = font; + run->color = oric_colors[color]; + return run; } -SDL_bool clipboard_copy_text( struct machine *oric ) +SDL_bool clipboard_copy_text(struct machine *oric) { - unsigned char *vidmem = (&oric->mem[oric->vid_addr]); - int line, col; - // TEXT - BString text; - BList textruns; - - textruns.AddItem(new_run(0, 0)); - - for (line = 0; line < 28; line++) { - for (col = 0; col < 40; col++) { - unsigned char c = vidmem[line * 40 + col]; - - if (c > 127) { - c -= 128; - } - - if (c < 8) { - textruns.AddItem(new_run(text.Length(), c)); - text << ' '; - } else if (c < ' ' || c == 127) { - text << ' '; - } else if (c == 0x60) { - text << B_UTF8_COPYRIGHT; - } else - text << (char)c; - } - text << '\n'; - } - //printf("%s\n", text.String()); - - - BMessage *clip = NULL; - if (be_clipboard->Lock()) { - be_clipboard->Clear(); - clip = be_clipboard->Data(); - if (clip) { - clip->AddData("text/plain", B_MIME_TYPE, text.String(), text.Length()); - - int arraySize = sizeof(text_run_array) - + textruns.CountItems() * sizeof(text_run); - text_run_array *array = (text_run_array *)malloc(arraySize); - array->count = textruns.CountItems(); - for (int i = 0; i < array->count; i++) { - memcpy(&array->runs[i], textruns.ItemAt(i), sizeof(text_run)); - } - clip->AddData("application/x-vnd.Be-text_run_array", B_MIME_TYPE, - array, arraySize); - free(array); - - be_clipboard->Commit(); - } - be_clipboard->Unlock(); - } - - for (int i = 0; i < textruns.CountItems(); i++) { - delete (text_run *)(textruns.ItemAt(i)); - } - textruns.MakeEmpty(); - - return SDL_TRUE; + unsigned char* vidmem = (&oric->mem[oric->vid_addr]); + int line, col; + // TEXT + BString text; + BList textruns; + + textruns.AddItem(new_run(0, 0)); + + for(line = 0; line < 28; line++) + { + for(col = 0; col < 40; col++) + { + unsigned char c = vidmem[line * 40 + col]; + + if(c > 127) + { + c -= 128; + } + + if(c < 8) + { + textruns.AddItem(new_run(text.Length(), c)); + text << ' '; + } + else if(c < ' ' || c == 127) + { + text << ' '; + } + else if(c == 0x60) + { + text << B_UTF8_COPYRIGHT; + } + else + text << (char)c; + } + text << '\n'; + } + //printf("%s\n", text.String()); + + + BMessage *clip = NULL; + if(be_clipboard->Lock()) + { + be_clipboard->Clear(); + clip = be_clipboard->Data(); + if(clip) + { + clip->AddData("text/plain", B_MIME_TYPE, text.String(), text.Length()); + + int arraySize = sizeof(text_run_array) + + textruns.CountItems() * sizeof(text_run); + text_run_array *array = (text_run_array *)malloc(arraySize); + array->count = textruns.CountItems(); + for(int i = 0; i < array->count; i++) + { + memcpy(&array->runs[i], textruns.ItemAt(i), sizeof(text_run)); + } + clip->AddData("application/x-vnd.Be-text_run_array", B_MIME_TYPE, + array, arraySize); + free(array); + + be_clipboard->Commit(); + } + be_clipboard->Unlock(); + } + + for(int i = 0; i < textruns.CountItems(); i++) + { + delete(text_run *)(textruns.ItemAt(i)); + } + textruns.MakeEmpty(); + + return SDL_TRUE; } -SDL_bool clipboard_copy( struct machine *oric ) +SDL_bool clipboard_copy(struct machine *oric) { - //unsigned char *vidmem = (&oric->mem[oric->vid_addr]); - if (oric->vid_addr == oric->vidbases[0]) { - // HIRES - } else if (oric->vid_addr == oric->vidbases[2]) { - // TEXT - return clipboard_copy_text( oric ); - } - - return SDL_TRUE; + //unsigned char *vidmem = (&oric->mem[oric->vid_addr]); + if(oric->vid_addr == oric->vidbases[0]) + { + // HIRES + } + else if(oric->vid_addr == oric->vidbases[2]) + { + // TEXT + return clipboard_copy_text(oric); + } + + return SDL_TRUE; } -SDL_bool clipboard_paste( struct machine *oric ) +SDL_bool clipboard_paste(struct machine *oric) { - const char *text; - int32 textLen; - BMessage *clip = NULL; - - if (be_clipboard->Lock()) { - clip = be_clipboard->Data(); - if (clip && clip->FindData("text/plain", B_MIME_TYPE, (const void **)&text, &textLen) == B_OK) { - printf("clip: tlen %ld\n", textLen); - BString t(text, textLen); - t.ReplaceAll('\n', '\r'); - t.ReplaceAll('\t', ' '); - queuekeys( (char *)t.String() ); - } - be_clipboard->Unlock(); - } + const char* text; + int32 textLen; + BMessage *clip = NULL; + + if(be_clipboard->Lock()) + { + clip = be_clipboard->Data(); + if(clip && clip->FindData("text/plain", B_MIME_TYPE, (const void**)&text, &textLen) == B_OK) + { + printf("clip: tlen %ld\n", textLen); + BString t(text, textLen); + t.ReplaceAll('\n', '\r'); + t.ReplaceAll('\t', ' '); + queuekeys((char*)t.String()); + } + be_clipboard->Unlock(); + } return SDL_TRUE; } // SDL version doesn't work due to cpu speed -SDL_bool clipboard_paste_sdl( struct machine *oric ) +SDL_bool clipboard_paste_sdl(struct machine *oric) { - const char *text; - int32 textLen; - BMessage *clip = NULL; - SDL_Event ev; - ev.key.keysym.scancode = 0; - ev.key.keysym.mod = (SDLMod)0; - ev.key.keysym.sym = (SDLKey)0; - - if (be_clipboard->Lock()) { - clip = be_clipboard->Data(); - if (clip && clip->FindData("text/plain", B_MIME_TYPE, (const void **)&text, &textLen) == B_OK) { - for (int i = 0; i < textLen; i++) { - fprintf(stderr, "pushing key '%c'\n", text[i]); - ev.key.keysym.sym = (SDLKey)text[i]; - ev.key.keysym.unicode = text[i]; - ev.type = SDL_KEYDOWN; - ev.key.state = SDL_PRESSED; - SDL_PushEvent(&ev); - ev.type = SDL_KEYUP; - ev.key.state = SDL_RELEASED; - SDL_PushEvent(&ev); - } - } - be_clipboard->Unlock(); - } + const char* text; + int32 textLen; + BMessage *clip = NULL; + SDL_Event ev; + ev.key.keysym.scancode = 0; + ev.key.keysym.mod = (SDLMod)0; + ev.key.keysym.sym = (SDLKey)0; + + if(be_clipboard->Lock()) + { + clip = be_clipboard->Data(); + if(clip && clip->FindData("text/plain", B_MIME_TYPE, (const void**)&text, &textLen) == B_OK) + { + for(int i = 0; i < textLen; i++) + { + fprintf(stderr, "pushing key '%c'\n", text[i]); + ev.key.keysym.sym = (SDLKey)text[i]; + ev.key.keysym.unicode = text[i]; + ev.type = SDL_KEYDOWN; + ev.key.state = SDL_PRESSED; + SDL_PushEvent(&ev); + ev.type = SDL_KEYUP; + ev.key.state = SDL_RELEASED; + SDL_PushEvent(&ev); + } + } + be_clipboard->Unlock(); + } return SDL_TRUE; } -void gui_open_url( const char *url ) +void gui_open_url(const char* url) { - // BUrl is not really public yet, and I'm lazy. - // It's a bit dangerous but we trust the caller. - BString command("/bin/open '"); - command << url << "'"; - system(command.String()); + // BUrl is not really public yet, and I'm lazy. + // It's a bit dangerous but we trust the caller. + BString command("/bin/open '"); + command << url << "'"; + system(command.String()); } diff --git a/gui_win.c b/gui_win.c index f5423109..6e6d6896 100644 --- a/gui_win.c +++ b/gui_win.c @@ -49,11 +49,11 @@ static void init_clipboard(void) { if(initialized) return; - + /* Grab the window manager specific information */ SDL_SysWMinfo info; SDL_VERSION(&info.version); - if (SDL_COMPAT_GetWMInfo(&info)) + if(SDL_COMPAT_GetWMInfo(&info)) { /* Save the information for later use */ #if SDL_MAJOR_VERSION == 1 @@ -62,21 +62,21 @@ static void init_clipboard(void) g_SDL_Window = info.info.win.window; #endif initialized = SDL_TRUE; - } + } } char* get_clipboard_text_win(void) { - if (!initialized) + if(!initialized) return NULL; - - if (IsClipboardFormatAvailable(CF_TEXT) && OpenClipboard(g_SDL_Window)) + + if(IsClipboardFormatAvailable(CF_TEXT) && OpenClipboard(g_SDL_Window)) { const HANDLE hMem = GetClipboardData(CF_TEXT); - if (hMem) + if(hMem) { - char *src = (char*)GlobalLock(hMem); - if (src) + char* src = (char*)GlobalLock(hMem); + if(src) { free(text); text = strdup(src); @@ -85,40 +85,40 @@ char* get_clipboard_text_win(void) } CloseClipboard(); } - + return text; } static void set_clipboard_text_win(const char* text_) { - if (!initialized) - return; - - if ( text_ != NULL ) + if(!initialized) + return; + + if(text_ != NULL) + { + if(OpenClipboard(g_SDL_Window)) { - if ( OpenClipboard(g_SDL_Window) ) - { - HANDLE hMem = GlobalAlloc((GMEM_MOVEABLE|GMEM_DDESHARE), strlen(text_)+1); - if ( hMem != NULL ) - { - char* dst = (char*)GlobalLock(hMem); - memcpy(dst, text_, strlen(text_)+1); - GlobalUnlock(hMem); - EmptyClipboard(); - SetClipboardData(CF_TEXT, hMem); - } - CloseClipboard(); - } + HANDLE hMem = GlobalAlloc((GMEM_MOVEABLE|GMEM_DDESHARE), strlen(text_)+1); + if(hMem != NULL) + { + char* dst = (char*)GlobalLock(hMem); + memcpy(dst, text_, strlen(text_)+1); + GlobalUnlock(hMem); + EmptyClipboard(); + SetClipboardData(CF_TEXT, hMem); + } + CloseClipboard(); } + } } -SDL_bool init_gui_native( struct machine *oric ) +SDL_bool init_gui_native(struct machine *oric) { init_clipboard(); return initialized; } -void shut_gui_native( struct machine *oric ) +void shut_gui_native(struct machine *oric) { if(text) { @@ -127,46 +127,51 @@ void shut_gui_native( struct machine *oric ) } } -void gui_open_url( const char *url ) +void gui_open_url(const char* url) { ShellExecute(NULL, "open", url, - NULL, NULL, SW_SHOWNORMAL); + NULL, NULL, SW_SHOWNORMAL); return; } -SDL_bool clipboard_copy( struct machine *oric ) +SDL_bool clipboard_copy(struct machine *oric) { - // HIRES - if (oric->vid_addr != oric->vidbases[2]) - return SDL_FALSE; - - int line, col, i; - char text_[40 * 28 + 28 + 1]; - unsigned char *vidmem = (&oric->mem[oric->vid_addr]); - - for (i = 0, line = 0; line < 28; line++) { - for (col = 0; col < 40; col++) { - unsigned char c = vidmem[line * 40 + col]; - - if (c > 127) { - c -= 128; - } - - if (c < ' ' || c == 127) { - text_[i++] = ' '; - } else - text_[i++] = (char)c; - } - text_[i++] = '\n'; + // HIRES + if(oric->vid_addr != oric->vidbases[2]) + return SDL_FALSE; + + int line, col, i; + char text_[40 * 28 + 28 + 1]; + unsigned char* vidmem = (&oric->mem[oric->vid_addr]); + + for(i = 0, line = 0; line < 28; line++) + { + for(col = 0; col < 40; col++) + { + unsigned char c = vidmem[line * 40 + col]; + + if(c > 127) + { + c -= 128; + } + + if(c < ' ' || c == 127) + { + text_[i++] = ' '; + } + else + text_[i++] = (char)c; } - text_[i++] = '\0'; - //printf("%s\n", text_); - - set_clipboard_text_win(text_); - return SDL_TRUE; + text_[i++] = '\n'; + } + text_[i++] = '\0'; + //printf("%s\n", text_); + + set_clipboard_text_win(text_); + return SDL_TRUE; } -SDL_bool clipboard_paste( struct machine *oric ) +SDL_bool clipboard_paste(struct machine *oric) { if(get_clipboard_text_win()) { @@ -175,8 +180,12 @@ SDL_bool clipboard_paste( struct machine *oric ) { switch(*p) { - case '\t': *p = ' '; break; - case '\n': *p = '\r'; break; + case '\t': + *p = ' '; + break; + case '\n': + *p = '\r'; + break; default: *p = (*p < 0x20 || 127 < *p)? ' ' : *p; break; diff --git a/gui_x11.c b/gui_x11.c index 35c7bd84..971c852a 100644 --- a/gui_x11.c +++ b/gui_x11.c @@ -63,54 +63,54 @@ static void Unlock_Display(void) static int clipboard_filter(const SDL_Event *event) { /* Post all non-window manager specific events */ - if ( event->type == SDL_SYSWMEVENT && event->syswm.msg != NULL) + if(event->type == SDL_SYSWMEVENT && event->syswm.msg != NULL) { XEvent xevent = event->syswm.msg->event.xevent; /* Handle window-manager specific clipboard events */ - switch (xevent.type) + switch(xevent.type) { /* Copy the selection from XA_CUT_BUFFER0 to the requested property */ case SelectionRequest: - { - XEvent sevent; - XSelectionRequestEvent *req; - int seln_format; - unsigned long nbytes; - unsigned long overflow; - unsigned char *seln_data; - - req = &xevent.xselectionrequest; - sevent.xselection.type = SelectionNotify; - sevent.xselection.display = req->display; - sevent.xselection.selection = req->selection; - sevent.xselection.target = None; - sevent.xselection.property = None; - sevent.xselection.requestor = req->requestor; - sevent.xselection.time = req->time; - if ( XGetWindowProperty(display, DefaultRootWindow(display), - XA_CUT_BUFFER0, 0, INT_MAX/4, False, req->target, - &sevent.xselection.target, &seln_format, - &nbytes, &overflow, &seln_data) == Success ) { - if ( sevent.xselection.target == req->target ) + XEvent sevent; + XSelectionRequestEvent *req; + int seln_format; + unsigned long nbytes; + unsigned long overflow; + unsigned char* seln_data; + + req = &xevent.xselectionrequest; + sevent.xselection.type = SelectionNotify; + sevent.xselection.display = req->display; + sevent.xselection.selection = req->selection; + sevent.xselection.target = None; + sevent.xselection.property = None; + sevent.xselection.requestor = req->requestor; + sevent.xselection.time = req->time; + if(XGetWindowProperty(display, DefaultRootWindow(display), + XA_CUT_BUFFER0, 0, INT_MAX/4, False, req->target, + &sevent.xselection.target, &seln_format, + &nbytes, &overflow, &seln_data) == Success) { - if ( sevent.xselection.target == XA_STRING ) + if(sevent.xselection.target == req->target) { - if ( seln_data[nbytes-1] == '\0' ) - --nbytes; + if(sevent.xselection.target == XA_STRING) + { + if(seln_data[nbytes-1] == '\0') + --nbytes; + } + XChangeProperty(display, req->requestor, req->property, + sevent.xselection.target, seln_format, PropModeReplace, + seln_data, nbytes); + sevent.xselection.property = req->property; } - XChangeProperty(display, req->requestor, req->property, - sevent.xselection.target, seln_format, PropModeReplace, - seln_data, nbytes); - sevent.xselection.property = req->property; + XFree(seln_data); } - XFree(seln_data); + XSendEvent(display,req->requestor,False,0, &sevent); + XSync(display, False); } - XSendEvent(display,req->requestor,False,0,&sevent); - XSync(display, False); - } - break; + break; } } @@ -126,17 +126,17 @@ static char* get_clipboard_text_x11(void) int seln_format; unsigned long nbytes; unsigned long overflow; - char *src; - char *text = NULL; + char* src; + char* text = NULL; - if (!initialized) + if(!initialized) return NULL; Lock_Display(); owner = XGetSelectionOwner(display, XA_PRIMARY); Unlock_Display(); - if (owner == None || owner == window) + if(owner == None || owner == window) { owner = DefaultRootWindow(display); selection = XA_CUT_BUFFER0; @@ -153,25 +153,25 @@ static char* get_clipboard_text_x11(void) XConvertSelection(display, XA_PRIMARY, XA_STRING, selection, owner, CurrentTime); Unlock_Display(); - while (!selection_response) + while(!selection_response) { SDL_WaitEvent(&event); - if (event.type == SDL_SYSWMEVENT && event.syswm.msg != NULL) + if(event.type == SDL_SYSWMEVENT && event.syswm.msg != NULL) { XEvent xevent = event.syswm.msg->event.xevent; - if ( (xevent.type == SelectionNotify) && - (xevent.xselection.requestor == owner) ) + if((xevent.type == SelectionNotify) && + (xevent.xselection.requestor == owner)) selection_response = 1; } } } Lock_Display(); - if (XGetWindowProperty(display, owner, selection, 0, - INT_MAX/4, False, XA_STRING, &seln_type, &seln_format, - &nbytes, &overflow, (unsigned char **)&src) == Success) + if(XGetWindowProperty(display, owner, selection, 0, + INT_MAX/4, False, XA_STRING, &seln_type, &seln_format, + &nbytes, &overflow, (unsigned char**)&src) == Success) { - if (seln_type == XA_STRING) + if(seln_type == XA_STRING) { text = strdup(src); } @@ -184,18 +184,18 @@ static char* get_clipboard_text_x11(void) static void set_clipboard_text_x11(const char* text) { - if (!initialized) - return; + if(!initialized) + return; - if ( text != NULL ) - { - Lock_Display(); - XChangeProperty(display, DefaultRootWindow(display), - (Atom)XA_CUT_BUFFER0, XA_STRING, 8, PropModeReplace, (unsigned char*)text, strlen(text)+1); - if ( XGetSelectionOwner(display, XA_PRIMARY) != window ) - XSetSelectionOwner(display, XA_PRIMARY, window, CurrentTime); - Unlock_Display(); - } + if(text != NULL) + { + Lock_Display(); + XChangeProperty(display, DefaultRootWindow(display), + (Atom)XA_CUT_BUFFER0, XA_STRING, 8, PropModeReplace, (unsigned char*)text, strlen(text)+1); + if(XGetSelectionOwner(display, XA_PRIMARY) != window) + XSetSelectionOwner(display, XA_PRIMARY, window, CurrentTime); + Unlock_Display(); + } } static void init_clipboard(void) @@ -206,10 +206,10 @@ static void init_clipboard(void) /* Grab the window manager specific information */ SDL_SysWMinfo info; SDL_VERSION(&info.version); - if (SDL_COMPAT_GetWMInfo(&info)) + if(SDL_COMPAT_GetWMInfo(&info)) { /* Save the information for later use */ - if (info.subsystem == SDL_SYSWM_X11) + if(info.subsystem == SDL_SYSWM_X11) { display = info.info.x11.display; window = info.info.x11.window; @@ -235,10 +235,10 @@ static void init_clipboard(void) /* Grab the window manager specific information */ SDL_SysWMinfo info; SDL_VERSION(&info.version); - if (SDL_COMPAT_GetWMInfo(&info)) + if(SDL_COMPAT_GetWMInfo(&info)) { /* Save the information for later use */ - if (info.subsystem == SDL_SYSWM_X11) + if(info.subsystem == SDL_SYSWM_X11) { display = info.info.x11.display; window = info.info.x11.window; @@ -250,61 +250,66 @@ static void init_clipboard(void) #endif /* SDL_MAJOR_VERSION == 1 */ -SDL_bool init_gui_native( struct machine *oric ) +SDL_bool init_gui_native(struct machine *oric) { init_clipboard(); return initialized; } -void shut_gui_native( struct machine *oric ) +void shut_gui_native(struct machine *oric) { return; } -void gui_open_url( const char *url ) +void gui_open_url(const char* url) { return; } -SDL_bool clipboard_copy( struct machine *oric ) +SDL_bool clipboard_copy(struct machine *oric) { - // HIRES - if (oric->vid_addr != oric->vidbases[2]) - return SDL_FALSE; + // HIRES + if(oric->vid_addr != oric->vidbases[2]) + return SDL_FALSE; - int line, col, i; - char text[40 * 28 + 28 + 1]; - unsigned char *vidmem = (&oric->mem[oric->vid_addr]); + int line, col, i; + char text[40 * 28 + 28 + 1]; + unsigned char* vidmem = (&oric->mem[oric->vid_addr]); - for (i = 0, line = 0; line < 28; line++) { - for (col = 0; col < 40; col++) { - unsigned char c = vidmem[line * 40 + col]; + for(i = 0, line = 0; line < 28; line++) + { + for(col = 0; col < 40; col++) + { + unsigned char c = vidmem[line * 40 + col]; - if (c > 127) { - c -= 128; - } + if(c > 127) + { + c -= 128; + } - if (c < ' ' || c == 127) { - text[i++] = ' '; - } else - text[i++] = (char)c; - } - text[i++] = '\n'; + if(c < ' ' || c == 127) + { + text[i++] = ' '; + } + else + text[i++] = (char)c; } - text[i++] = '\0'; - //printf("%s\n", text); + text[i++] = '\n'; + } + text[i++] = '\0'; + //printf("%s\n", text); #if SDL_MAJOR_VERSION == 1 - set_clipboard_text_x11(text); + set_clipboard_text_x11(text); #else - SDL_SetClipboardText(text); + SDL_SetClipboardText(text); #endif - return SDL_TRUE; + return SDL_TRUE; } -SDL_bool clipboard_paste( struct machine *oric ) +SDL_bool clipboard_paste(struct machine *oric) { - char *text = NULL; + char* text = NULL; #if SDL_MAJOR_VERSION == 1 text = get_clipboard_text_x11(); @@ -320,8 +325,12 @@ SDL_bool clipboard_paste( struct machine *oric ) { switch(*p) { - case '\t': *p = ' '; break; - case '\n': *p = '\r'; break; + case '\t': + *p = ' '; + break; + case '\n': + *p = '\r'; + break; default: *p = (*p < 0x20 || 128 <= *p)? ' ' : *p; break; diff --git a/joystick.c b/joystick.c index 6f779dc4..35e70cc8 100644 --- a/joystick.c +++ b/joystick.c @@ -39,85 +39,86 @@ struct keyjoydef { - char *id; + char* id; SDL_COMPAT_KEY sym; }; static struct keyjoydef keyjoytab[] = { { "BACKSPACE", SDLK_BACKSPACE }, - { "TAB", SDLK_TAB }, - { "CLEAR", SDLK_CLEAR }, - { "RETURN", SDLK_RETURN }, - { "ENTER", SDLK_RETURN }, - { "PAUSE", SDLK_PAUSE }, - { "ESCAPE", SDLK_ESCAPE }, - { "SPACE", SDLK_SPACE }, - { "HELP", SDLK_HELP }, - { "DELETE", SDLK_DELETE }, - { "DEL", SDLK_DELETE }, - { "LSHIFT", SDLK_LSHIFT }, - { "RSHIFT", SDLK_RSHIFT }, - { "RCTRL", SDLK_RCTRL }, - { "LCTRL", SDLK_LCTRL }, - { "RALT", SDLK_RALT }, - { "LALT", SDLK_LALT }, - { "KP0", SDLK_KP0 }, - { "KP1", SDLK_KP1 }, - { "KP2", SDLK_KP2 }, - { "KP3", SDLK_KP3 }, - { "KP4", SDLK_KP4 }, - { "KP5", SDLK_KP5 }, - { "KP6", SDLK_KP6 }, - { "KP7", SDLK_KP7 }, - { "KP8", SDLK_KP8 }, - { "KP9", SDLK_KP9 }, - { "KP_PERIOD", SDLK_KP_PERIOD }, - { "KP_FULLSTOP", SDLK_KP_PERIOD }, - { "KP_DIVIDE", SDLK_KP_DIVIDE }, - { "KP_MULTIPLY", SDLK_KP_MULTIPLY }, - { "KP_MINUS", SDLK_KP_MINUS }, - { "KP_PLUS", SDLK_KP_PLUS }, - { "KP_ENTER", SDLK_KP_ENTER }, - { "KP_EQUALS", SDLK_KP_EQUALS }, - { "UP", SDLK_UP }, - { "DOWN", SDLK_DOWN }, - { "LEFT", SDLK_LEFT }, - { "RIGHT", SDLK_RIGHT }, - { "INSERT", SDLK_INSERT }, - { "HOME", SDLK_HOME }, - { "END", SDLK_END }, - { "PAGEUP", SDLK_PAGEUP }, - { "PAGEDOWN", SDLK_PAGEDOWN }, - { "NONE", 0 }, - { NULL, 0 } }; + { "TAB", SDLK_TAB }, + { "CLEAR", SDLK_CLEAR }, + { "RETURN", SDLK_RETURN }, + { "ENTER", SDLK_RETURN }, + { "PAUSE", SDLK_PAUSE }, + { "ESCAPE", SDLK_ESCAPE }, + { "SPACE", SDLK_SPACE }, + { "HELP", SDLK_HELP }, + { "DELETE", SDLK_DELETE }, + { "DEL", SDLK_DELETE }, + { "LSHIFT", SDLK_LSHIFT }, + { "RSHIFT", SDLK_RSHIFT }, + { "RCTRL", SDLK_RCTRL }, + { "LCTRL", SDLK_LCTRL }, + { "RALT", SDLK_RALT }, + { "LALT", SDLK_LALT }, + { "KP0", SDLK_KP0 }, + { "KP1", SDLK_KP1 }, + { "KP2", SDLK_KP2 }, + { "KP3", SDLK_KP3 }, + { "KP4", SDLK_KP4 }, + { "KP5", SDLK_KP5 }, + { "KP6", SDLK_KP6 }, + { "KP7", SDLK_KP7 }, + { "KP8", SDLK_KP8 }, + { "KP9", SDLK_KP9 }, + { "KP_PERIOD", SDLK_KP_PERIOD }, + { "KP_FULLSTOP", SDLK_KP_PERIOD }, + { "KP_DIVIDE", SDLK_KP_DIVIDE }, + { "KP_MULTIPLY", SDLK_KP_MULTIPLY }, + { "KP_MINUS", SDLK_KP_MINUS }, + { "KP_PLUS", SDLK_KP_PLUS }, + { "KP_ENTER", SDLK_KP_ENTER }, + { "KP_EQUALS", SDLK_KP_EQUALS }, + { "UP", SDLK_UP }, + { "DOWN", SDLK_DOWN }, + { "LEFT", SDLK_LEFT }, + { "RIGHT", SDLK_RIGHT }, + { "INSERT", SDLK_INSERT }, + { "HOME", SDLK_HOME }, + { "END", SDLK_END }, + { "PAGEUP", SDLK_PAGEUP }, + { "PAGEDOWN", SDLK_PAGEDOWN }, + { "NONE", 0 }, + { NULL, 0 } +}; static SDL_bool joysubinited = SDL_FALSE; Uint8 joystate_a[JOYSTATE_LAST], joystate_b[JOYSTATE_LAST]; -static SDL_bool is_real_joystick( Sint16 joymode ) +static SDL_bool is_real_joystick(Sint16 joymode) { - if( ( joymode >= JOYMODE_SDL0 ) && ( joymode <= JOYMODE_SDL9 ) ) + if((joymode >= JOYMODE_SDL0) && (joymode <= JOYMODE_SDL9)) return SDL_TRUE; return SDL_FALSE; } -static void close_joysticks( struct machine *oric ) +static void close_joysticks(struct machine *oric) { - if( joysubinited ) + if(joysubinited) { - if( oric->sdljoy_a ) + if(oric->sdljoy_a) { - SDL_JoystickClose( oric->sdljoy_a ); - if( oric->sdljoy_b == oric->sdljoy_a ) + SDL_JoystickClose(oric->sdljoy_a); + if(oric->sdljoy_b == oric->sdljoy_a) oric->sdljoy_b = NULL; oric->sdljoy_a = NULL; } - if( oric->sdljoy_b ) + if(oric->sdljoy_b) { - SDL_JoystickClose( oric->sdljoy_b ); + SDL_JoystickClose(oric->sdljoy_b); oric->sdljoy_b = NULL; } - SDL_JoystickEventState( SDL_FALSE ); + SDL_JoystickEventState(SDL_FALSE); } } @@ -127,17 +128,17 @@ static void close_joysticks( struct machine *oric ) // Typical example would be the handling of additional or non standard buttons and axis. Uint8 get_joystick_type(SDL_Joystick* joystick) { - if (joystick) + if(joystick) { // @iss: SDL_JoystickName unsupported under SDL 1.x - returns NULL const char* joy_name = SDL_COMPAT_JoystickName(joystick); - if (joy_name) + if(joy_name) { // Examples of strings returned by SDL_JoystickName: // - "DualSense Wireless Controller" // - "SPEED-LINK Competition Pro" (USB variant of the old four direction joystick, that one has many more buttons) // - if (strcmp(joy_name, "DualSense Wireless Controller") == 0) + if(strcmp(joy_name, "DualSense Wireless Controller") == 0) { return JOYTYPE_DUALSENSE; } @@ -149,23 +150,23 @@ Uint8 get_joystick_type(SDL_Joystick* joystick) // Return an SDL keysym corresponding to the specified name (or 0) -SDL_COMPAT_KEY joy_keyname_to_sym( char *name ) +SDL_COMPAT_KEY joy_keyname_to_sym(char* name) { Sint32 i; char c; // Just a single char? - if( name[1] == 0 ) + if(name[1] == 0) { - c = tolower( name[0] ); - if( ( c >= 32 ) && ( c < 127 ) ) return c; + c = tolower(name[0]); + if((c >= 32) && (c < 127)) return c; return 0; } // Look for a matching named key - for( i=0; keyjoytab[i].id; i++ ) + for(i=0; keyjoytab[i].id; i++) { - if( strcasecmp( keyjoytab[i].id, name ) == 0 ) + if(strcasecmp(keyjoytab[i].id, name) == 0) { // dbg_printf("%s => %s = %.8X\n", name, keyjoytab[i].id, keyjoytab[i].sym); return keyjoytab[i].sym; @@ -175,11 +176,11 @@ SDL_COMPAT_KEY joy_keyname_to_sym( char *name ) return 0; } -static SDL_bool dojoyevent( SDL_Event *ev, struct machine *oric, Sint32 mode, Uint8 *joystate, SDL_Joystick *sjoy ) +static SDL_bool dojoyevent(SDL_Event *ev, struct machine *oric, Sint32 mode, Uint8 *joystate, SDL_Joystick *sjoy) { SDL_bool swallowit = SDL_FALSE; - switch( mode ) + switch(mode) { case JOYMODE_NONE: case JOYMODE_MOUSE: // Telestrat only @@ -187,20 +188,20 @@ static SDL_bool dojoyevent( SDL_Event *ev, struct machine *oric, Sint32 mode, Ui case JOYMODE_KB1: case JOYMODE_KB2: - { - SDL_COMPAT_KEY *kbtab = mode == JOYMODE_KB1? oric->kbjoy1 : oric->kbjoy2; - int i, st = ev->type == SDL_KEYDOWN? 1 : 0; - for( i=0; i< JOYSTATE_LAST; i++ ) { - if( ev->key.keysym.sym == kbtab[i] ) + SDL_COMPAT_KEY *kbtab = mode == JOYMODE_KB1? oric->kbjoy1 : oric->kbjoy2; + int i, st = ev->type == SDL_KEYDOWN? 1 : 0; + for(i=0; i< JOYSTATE_LAST; i++) { - // dbg_printf("%d: %.8X <> %.8X => %d\n", i, kbtab[i], ev->key.keysym.sym, st); - joystate[i] = st; - swallowit = SDL_TRUE; + if(ev->key.keysym.sym == kbtab[i]) + { + // dbg_printf("%d: %.8X <> %.8X => %d\n", i, kbtab[i], ev->key.keysym.sym, st); + joystate[i] = st; + swallowit = SDL_TRUE; + } } } - } - break; + break; case JOYMODE_SDL0: case JOYMODE_SDL1: @@ -212,7 +213,7 @@ static SDL_bool dojoyevent( SDL_Event *ev, struct machine *oric, Sint32 mode, Ui case JOYMODE_SDL7: case JOYMODE_SDL8: case JOYMODE_SDL9: - if( !sjoy ) return SDL_FALSE; + if(!sjoy) return SDL_FALSE; // // The way the controllers report the 4 direction digital values can change: @@ -224,117 +225,133 @@ static SDL_bool dojoyevent( SDL_Event *ev, struct machine *oric, Sint32 mode, Ui // Ideally this code should be revamped to use the SDL GameController API (see the article at https://blog.rubenwardy.com/2023/01/24/using_sdl_gamecontroller/ for an example), // but that require a significant amount of changes are would have to be tested extensively to make sure it works properly in every situation. // - switch( ev->type ) + switch(ev->type) { - case SDL_JOYHATMOTION: - if(ev->jhat.which != (mode-JOYMODE_SDL0) ) return SDL_FALSE; - swallowit = SDL_TRUE; - - joystate[JOYSTATE_UP] = (ev->jhat.value & SDL_HAT_UP) ? 1 : 0; - joystate[JOYSTATE_DOWN] = (ev->jhat.value & SDL_HAT_DOWN) ? 1 : 0; - joystate[JOYSTATE_LEFT] = (ev->jhat.value & SDL_HAT_LEFT) ? 1 : 0; - joystate[JOYSTATE_RIGHT] = (ev->jhat.value & SDL_HAT_RIGHT) ? 1 : 0; - break; + case SDL_JOYHATMOTION: + if(ev->jhat.which != (mode-JOYMODE_SDL0)) return SDL_FALSE; + swallowit = SDL_TRUE; + + joystate[JOYSTATE_UP] = (ev->jhat.value & SDL_HAT_UP) ? 1 : 0; + joystate[JOYSTATE_DOWN] = (ev->jhat.value & SDL_HAT_DOWN) ? 1 : 0; + joystate[JOYSTATE_LEFT] = (ev->jhat.value & SDL_HAT_LEFT) ? 1 : 0; + joystate[JOYSTATE_RIGHT] = (ev->jhat.value & SDL_HAT_RIGHT) ? 1 : 0; + break; case SDL_JOYAXISMOTION: - if( ev->jaxis.which != (mode-JOYMODE_SDL0) ) return SDL_FALSE; + if(ev->jaxis.which != (mode-JOYMODE_SDL0)) return SDL_FALSE; swallowit = SDL_TRUE; - switch (ev->jaxis.axis) + switch(ev->jaxis.axis) { case 0: // left/right - case 2: // secondary analog stick on modern controllers - if( ev->jaxis.value < -AXIS_THRESHOLD ) + case 2: // secondary analog stick on modern controllers + if(ev->jaxis.value < -AXIS_THRESHOLD) { - joystate[JOYSTATE_LEFT] = 1; // left - joystate[JOYSTATE_RIGHT] = 0; - } - else if( ev->jaxis.value > AXIS_THRESHOLD ) - { - joystate[JOYSTATE_LEFT] = 0; // right - joystate[JOYSTATE_RIGHT] = 1; - } - else - { - joystate[JOYSTATE_LEFT] = 0; - joystate[JOYSTATE_RIGHT] = 0; + joystate[JOYSTATE_LEFT] = 1; // left + joystate[JOYSTATE_RIGHT] = 0; + } + else if(ev->jaxis.value > AXIS_THRESHOLD) + { + joystate[JOYSTATE_LEFT] = 0; // right + joystate[JOYSTATE_RIGHT] = 1; + } + else + { + joystate[JOYSTATE_LEFT] = 0; + joystate[JOYSTATE_RIGHT] = 0; } break; case 1: // up/down - case 3: // secondary analog stick on modern controllers - if( ev->jaxis.value < -AXIS_THRESHOLD ) + case 3: // secondary analog stick on modern controllers + if(ev->jaxis.value < -AXIS_THRESHOLD) { - joystate[JOYSTATE_UP] = 1; // up - joystate[JOYSTATE_DOWN] = 0; - } - else if(ev->jaxis.value > AXIS_THRESHOLD ) - { - joystate[JOYSTATE_UP] = 0; // down - joystate[JOYSTATE_DOWN] = 1; - } - else - { - joystate[JOYSTATE_UP] = 0; - joystate[JOYSTATE_DOWN] = 0; + joystate[JOYSTATE_UP] = 1; // up + joystate[JOYSTATE_DOWN] = 0; + } + else if(ev->jaxis.value > AXIS_THRESHOLD) + { + joystate[JOYSTATE_UP] = 0; // down + joystate[JOYSTATE_DOWN] = 1; + } + else + { + joystate[JOYSTATE_UP] = 0; + joystate[JOYSTATE_DOWN] = 0; } break; - case 4: // analog trigger on modern controllers - case 5: // analog trigger on modern controllers - // Trigger a fire action if the analog value passes over the threshold - joystate[JOYSTATE_FIRE1] = (ev->jaxis.value > AXIS_THRESHOLD) ? 1 : 0; - break; + case 4: // analog trigger on modern controllers + case 5: // analog trigger on modern controllers + // Trigger a fire action if the analog value passes over the threshold + joystate[JOYSTATE_FIRE1] = (ev->jaxis.value > AXIS_THRESHOLD) ? 1 : 0; + break; - default: - break; + default: + break; } break; case SDL_JOYBUTTONDOWN: - { - if( ev->jbutton.which != (mode-JOYMODE_SDL0) ) return SDL_FALSE; - if( ( joystate[JOYSTATE_TYPE] == JOYTYPE_DUALSENSE ) && - ( (ev->jbutton.button>=11) && (ev->jbutton.button<=14) ) ) - { - // Specific code path for the Sony PS5 DualSense d-pad - switch( ev->jbutton.button ) { - case 11: joystate[JOYSTATE_UP] = 1; break; // Up - case 12: joystate[JOYSTATE_DOWN] = 1; break; // Down - case 13: joystate[JOYSTATE_LEFT] = 1; break; // Left - case 14: joystate[JOYSTATE_RIGHT] = 1; break; // Right + if(ev->jbutton.which != (mode-JOYMODE_SDL0)) return SDL_FALSE; + if((joystate[JOYSTATE_TYPE] == JOYTYPE_DUALSENSE) && + ((ev->jbutton.button>=11) && (ev->jbutton.button<=14))) + { + // Specific code path for the Sony PS5 DualSense d-pad + switch(ev->jbutton.button) + { + case 11: + joystate[JOYSTATE_UP] = 1; + break; // Up + case 12: + joystate[JOYSTATE_DOWN] = 1; + break; // Down + case 13: + joystate[JOYSTATE_LEFT] = 1; + break; // Left + case 14: + joystate[JOYSTATE_RIGHT] = 1; + break; // Right + } + } + else + { + // Standard code path to handle button press on most controllers + joystate[JOYSTATE_FIRE1 + (ev->jbutton.button % 3)] = 1; + } + swallowit = SDL_TRUE; } - } - else - { - // Standard code path to handle button press on most controllers - joystate[JOYSTATE_FIRE1 + (ev->jbutton.button % 3)] = 1; - } - swallowit = SDL_TRUE; - } break; case SDL_JOYBUTTONUP: - if( ev->jbutton.which != (mode-JOYMODE_SDL0) ) return SDL_FALSE; - if( ( joystate[JOYSTATE_TYPE] == JOYTYPE_DUALSENSE ) && - ( (ev->jbutton.button >= 11) && (ev->jbutton.button <= 14) ) ) - { - // Specific code path for the Sony PS5 DualSense d-pad - switch( ev->jbutton.button ) + if(ev->jbutton.which != (mode-JOYMODE_SDL0)) return SDL_FALSE; + if((joystate[JOYSTATE_TYPE] == JOYTYPE_DUALSENSE) && + ((ev->jbutton.button >= 11) && (ev->jbutton.button <= 14))) { - case 11: joystate[JOYSTATE_UP] = 0; break; // Up - case 12: joystate[JOYSTATE_DOWN] = 0; break; // Down - case 13: joystate[JOYSTATE_LEFT] = 0; break; // Left - case 14: joystate[JOYSTATE_RIGHT] = 0; break; // Right + // Specific code path for the Sony PS5 DualSense d-pad + switch(ev->jbutton.button) + { + case 11: + joystate[JOYSTATE_UP] = 0; + break; // Up + case 12: + joystate[JOYSTATE_DOWN] = 0; + break; // Down + case 13: + joystate[JOYSTATE_LEFT] = 0; + break; // Left + case 14: + joystate[JOYSTATE_RIGHT] = 0; + break; // Right + } + } + else + { + // Standard code path to handle button release on most controllers + joystate[JOYSTATE_FIRE1 + (ev->jbutton.button % 3)] = 0; } - } - else - { - // Standard code path to handle button release on most controllers - joystate[JOYSTATE_FIRE1 + (ev->jbutton.button % 3)] = 0; - } swallowit = SDL_TRUE; break; } @@ -344,190 +361,192 @@ static SDL_bool dojoyevent( SDL_Event *ev, struct machine *oric, Sint32 mode, Ui return swallowit; } -void joy_buildmask( struct machine *oric ) +void joy_buildmask(struct machine *oric) { Uint8 mkmask = 0xff; Uint8 mkmask_f = 0xff; - Uint8 joysel = oric->via.read_port_a( &oric->via ); - Uint8 telestrat_joysel = oric->tele_via.read_port_b( &oric->tele_via ); + Uint8 joysel = oric->via.read_port_a(&oric->via); + Uint8 telestrat_joysel = oric->tele_via.read_port_b(&oric->tele_via); Uint8 twilighteboard_joysel = 0; SDL_bool gimme_port_a = SDL_FALSE; SDL_bool gimme_port_b = SDL_FALSE; - if (oric->twilighteboard_activated) + if(oric->twilighteboard_activated) twilighteboard_joysel= twilighteboard_oric_read(oric->twilighte,0x320); - if (oric->type == MACH_ATMOS && oric->twilighteboard_activated) + if(oric->type == MACH_ATMOS && oric->twilighteboard_activated) { - if ( twilighteboard_joysel & 0x80 ) + if(twilighteboard_joysel & 0x80) { // Right Port - if( joystate_a[JOYSTATE_UP] ) mkmask &= 0xef; - if( joystate_a[JOYSTATE_DOWN] ) mkmask &= 0xf7; - if( joystate_a[JOYSTATE_LEFT] ) mkmask &= 0xfd; - if( joystate_a[JOYSTATE_RIGHT] ) mkmask &= 0xfe; - if( joystate_a[JOYSTATE_FIRE1] ) mkmask &= 0xfb; + if(joystate_a[JOYSTATE_UP]) mkmask &= 0xef; + if(joystate_a[JOYSTATE_DOWN]) mkmask &= 0xf7; + if(joystate_a[JOYSTATE_LEFT]) mkmask &= 0xfd; + if(joystate_a[JOYSTATE_RIGHT]) mkmask &= 0xfe; + if(joystate_a[JOYSTATE_FIRE1]) mkmask &= 0xfb; - if( joystate_a[JOYSTATE_FIRE2] ) mkmask_f &= 0x7f; // PA7 - fire 2 - if( joystate_a[JOYSTATE_FIRE3] ) mkmask_f &= 0xdf; // PA5 - fire 3 + if(joystate_a[JOYSTATE_FIRE2]) mkmask_f &= 0x7f; // PA7 - fire 2 + if(joystate_a[JOYSTATE_FIRE3]) mkmask_f &= 0xdf; // PA5 - fire 3 gimme_port_a = SDL_TRUE; gimme_port_b = SDL_TRUE; } - if ( twilighteboard_joysel & 0x40 ) + if(twilighteboard_joysel & 0x40) { // Left Port - if( joystate_b[JOYSTATE_UP] ) mkmask &= 0xef; // 0x10 - up - if( joystate_b[JOYSTATE_DOWN] ) mkmask &= 0xf7; // 0x08 - down - if( joystate_b[JOYSTATE_LEFT] ) mkmask &= 0xfd; // 0x02 - left - if( joystate_b[JOYSTATE_RIGHT] ) mkmask &= 0xfe; // 0x01 - right - if( joystate_b[JOYSTATE_FIRE1] ) mkmask &= 0xfb; // 0x04 - fire + if(joystate_b[JOYSTATE_UP]) mkmask &= 0xef; // 0x10 - up + if(joystate_b[JOYSTATE_DOWN]) mkmask &= 0xf7; // 0x08 - down + if(joystate_b[JOYSTATE_LEFT]) mkmask &= 0xfd; // 0x02 - left + if(joystate_b[JOYSTATE_RIGHT]) mkmask &= 0xfe; // 0x01 - right + if(joystate_b[JOYSTATE_FIRE1]) mkmask &= 0xfb; // 0x04 - fire gimme_port_b = SDL_TRUE; } - if( gimme_port_a ) + if(gimme_port_a) { twilighteboard_oric_write(oric->twilighte, 0x321, 0xff, mkmask_f); } - if( gimme_port_b ) + if(gimme_port_b) { // port B twilighteboard_oric_write(oric->twilighte, 0x320, 0xff, mkmask); } } - else if (oric->type == MACH_TELESTRAT) + else if(oric->type == MACH_TELESTRAT) { - if ( telestrat_joysel & 0x80 ) + if(telestrat_joysel & 0x80) { // Right Port - if( joystate_a[JOYSTATE_UP] ) mkmask &= 0xef; - if( joystate_a[JOYSTATE_DOWN] ) mkmask &= 0xf7; - if( joystate_a[JOYSTATE_LEFT] ) mkmask &= 0xfd; - if( joystate_a[JOYSTATE_RIGHT] ) mkmask &= 0xfe; - if( joystate_a[JOYSTATE_FIRE1] ) mkmask &= 0xfb; + if(joystate_a[JOYSTATE_UP]) mkmask &= 0xef; + if(joystate_a[JOYSTATE_DOWN]) mkmask &= 0xf7; + if(joystate_a[JOYSTATE_LEFT]) mkmask &= 0xfd; + if(joystate_a[JOYSTATE_RIGHT]) mkmask &= 0xfe; + if(joystate_a[JOYSTATE_FIRE1]) mkmask &= 0xfb; - if( joystate_a[JOYSTATE_FIRE2] ) mkmask_f &= 0x7f; // PA7 - fire 2 - if( joystate_a[JOYSTATE_FIRE3] ) mkmask_f &= 0xdf; // PA5 - fire 3 + if(joystate_a[JOYSTATE_FIRE2]) mkmask_f &= 0x7f; // PA7 - fire 2 + if(joystate_a[JOYSTATE_FIRE3]) mkmask_f &= 0xdf; // PA5 - fire 3 gimme_port_a = SDL_TRUE; gimme_port_b = SDL_TRUE; } - if ( telestrat_joysel & 0x40 ) + if(telestrat_joysel & 0x40) { // Left Port - if( joystate_b[JOYSTATE_UP] ) mkmask &= 0xef; // 0x10 - up - if( joystate_b[JOYSTATE_DOWN] ) mkmask &= 0xf7; // 0x08 - down - if( joystate_b[JOYSTATE_LEFT] ) mkmask &= 0xfd; // 0x02 - left - if( joystate_b[JOYSTATE_RIGHT ]) mkmask &= 0xfe; // 0x01 - right - if( joystate_b[JOYSTATE_FIRE1 ]) mkmask &= 0xfb; // 0x04 - fire + if(joystate_b[JOYSTATE_UP]) mkmask &= 0xef; // 0x10 - up + if(joystate_b[JOYSTATE_DOWN]) mkmask &= 0xf7; // 0x08 - down + if(joystate_b[JOYSTATE_LEFT]) mkmask &= 0xfd; // 0x02 - left + if(joystate_b[JOYSTATE_RIGHT ]) mkmask &= 0xfe; // 0x01 - right + if(joystate_b[JOYSTATE_FIRE1 ]) mkmask &= 0xfb; // 0x04 - fire gimme_port_b = SDL_TRUE; } - if( gimme_port_a ) + if(gimme_port_a) { - oric->tele_via.write_port_a( &oric->tele_via, 0xff, mkmask_f ); + oric->tele_via.write_port_a(&oric->tele_via, 0xff, mkmask_f); } - if( gimme_port_b ) + if(gimme_port_b) { - oric->tele_via.write_port_b( &oric->tele_via, 0xff, mkmask ); + oric->tele_via.write_port_b(&oric->tele_via, 0xff, mkmask); } } else { - switch( oric->joy_iface ) + switch(oric->joy_iface) { case JOYIFACE_ALTAI: - if( joysel & 0x80 ) + if(joysel & 0x80) { - if( joystate_a[JOYSTATE_UP] ) mkmask &= 0xef; - if( joystate_a[JOYSTATE_DOWN] ) mkmask &= 0xf7; - if( joystate_a[JOYSTATE_LEFT] ) mkmask &= 0xfe; - if( joystate_a[JOYSTATE_RIGHT] ) mkmask &= 0xfd; - if( joystate_a[JOYSTATE_FIRE1] || + if(joystate_a[JOYSTATE_UP]) mkmask &= 0xef; + if(joystate_a[JOYSTATE_DOWN]) mkmask &= 0xf7; + if(joystate_a[JOYSTATE_LEFT]) mkmask &= 0xfe; + if(joystate_a[JOYSTATE_RIGHT]) mkmask &= 0xfd; + if(joystate_a[JOYSTATE_FIRE1] || joystate_a[JOYSTATE_FIRE2] || - joystate_a[JOYSTATE_FIRE3] ) mkmask &= 0xdf; + joystate_a[JOYSTATE_FIRE3]) mkmask &= 0xdf; gimme_port_a = SDL_TRUE; } - if( joysel & 0x40 ) + if(joysel & 0x40) { - if( joystate_b[JOYSTATE_UP] ) mkmask &= 0xef; // 0x10 - up - if( joystate_b[JOYSTATE_DOWN] ) mkmask &= 0xf7; // 0x08 - down - if( joystate_b[JOYSTATE_LEFT] ) mkmask &= 0xfe; // 0x01 - left - if( joystate_b[JOYSTATE_RIGHT] ) mkmask &= 0xfd; // 0x02 - right - if( joystate_b[JOYSTATE_FIRE1] || + if(joystate_b[JOYSTATE_UP]) mkmask &= 0xef; // 0x10 - up + if(joystate_b[JOYSTATE_DOWN]) mkmask &= 0xf7; // 0x08 - down + if(joystate_b[JOYSTATE_LEFT]) mkmask &= 0xfe; // 0x01 - left + if(joystate_b[JOYSTATE_RIGHT]) mkmask &= 0xfd; // 0x02 - right + if(joystate_b[JOYSTATE_FIRE1] || joystate_b[JOYSTATE_FIRE2] || - joystate_b[JOYSTATE_FIRE3] ) mkmask &= 0xdf; // 0x20 - fire + joystate_b[JOYSTATE_FIRE3]) mkmask &= 0xdf; // 0x20 - fire gimme_port_a = SDL_TRUE; } break; case JOYIFACE_IJK: - mkmask &= 0xdf; + mkmask &= 0xdf; - if( ((oric->via.ddrb & 0x10)==0) || - ((oric->via.read_port_b( &oric->via )&0x10)!=0) ) + if(((oric->via.ddrb & 0x10)==0) || + ((oric->via.read_port_b(&oric->via)&0x10)!=0)) break; gimme_port_a = SDL_TRUE; - if( ( joysel & 0xc0 ) == 0xc0 ) break; + if((joysel & 0xc0) == 0xc0) break; - if( joysel & 0x40 ) + if(joysel & 0x40) { - if( joystate_a[JOYSTATE_UP] ) mkmask &= 0xef; - if( joystate_a[JOYSTATE_DOWN]) mkmask &= 0xf7; - if( joystate_a[JOYSTATE_LEFT]) mkmask &= 0xfd; - if( joystate_a[JOYSTATE_RIGHT]) mkmask &= 0xfe; - if( joystate_a[JOYSTATE_FIRE1] || + if(joystate_a[JOYSTATE_UP]) mkmask &= 0xef; + if(joystate_a[JOYSTATE_DOWN]) mkmask &= 0xf7; + if(joystate_a[JOYSTATE_LEFT]) mkmask &= 0xfd; + if(joystate_a[JOYSTATE_RIGHT]) mkmask &= 0xfe; + if(joystate_a[JOYSTATE_FIRE1] || joystate_a[JOYSTATE_FIRE2] || - joystate_a[JOYSTATE_FIRE3] ) mkmask &= 0xfb; + joystate_a[JOYSTATE_FIRE3]) mkmask &= 0xfb; } - if( joysel & 0x80 ) + if(joysel & 0x80) { - if( joystate_b[JOYSTATE_UP] ) mkmask &= 0xef; // 0x10 - up - if( joystate_b[JOYSTATE_DOWN] ) mkmask &= 0xf7; // 0x08 - down - if( joystate_b[JOYSTATE_LEFT] ) mkmask &= 0xfd; // 0x02 - left - if( joystate_b[JOYSTATE_RIGHT] ) mkmask &= 0xfe; // 0x01 - right - if( joystate_b[JOYSTATE_FIRE1] || + if(joystate_b[JOYSTATE_UP]) mkmask &= 0xef; // 0x10 - up + if(joystate_b[JOYSTATE_DOWN]) mkmask &= 0xf7; // 0x08 - down + if(joystate_b[JOYSTATE_LEFT]) mkmask &= 0xfd; // 0x02 - left + if(joystate_b[JOYSTATE_RIGHT]) mkmask &= 0xfe; // 0x01 - right + if(joystate_b[JOYSTATE_FIRE1] || joystate_b[JOYSTATE_FIRE2] || - joystate_b[JOYSTATE_FIRE3] ) mkmask &= 0xfb; // 0x04 - fire + joystate_b[JOYSTATE_FIRE3]) mkmask &= 0xfb; // 0x04 - fire } break; } oric->porta_joy = mkmask; - if( gimme_port_a ) + if(gimme_port_a) { - oric->via.write_port_a( &oric->via, 0xff, mkmask ); + oric->via.write_port_a(&oric->via, 0xff, mkmask); oric->porta_is_ay = SDL_FALSE; - } else { - if( !oric->porta_is_ay ) + } + else + { + if(!oric->porta_is_ay) { - oric->via.write_port_a( &oric->via, 0xff, oric->porta_ay ); + oric->via.write_port_a(&oric->via, 0xff, oric->porta_ay); oric->porta_is_ay = SDL_TRUE; } } } } -SDL_bool joy_filter_event( SDL_Event *ev, struct machine *oric ) +SDL_bool joy_filter_event(SDL_Event *ev, struct machine *oric) { SDL_bool swallow_event; SDL_bool mode = (oric->type==MACH_TELESTRAT || (oric->twilighteboard_activated && oric->type==MACH_ATMOS))? SDL_TRUE : SDL_FALSE; - swallow_event = dojoyevent( ev, oric, mode ? oric->telejoymode_a : oric->joymode_a, joystate_a, oric->sdljoy_a ); - swallow_event |= dojoyevent( ev, oric, mode ? oric->telejoymode_b : oric->joymode_b, joystate_b, oric->sdljoy_b ); + swallow_event = dojoyevent(ev, oric, mode ? oric->telejoymode_a : oric->joymode_a, joystate_a, oric->sdljoy_a); + swallow_event |= dojoyevent(ev, oric, mode ? oric->telejoymode_b : oric->joymode_b, joystate_b, oric->sdljoy_b); - if( swallow_event ) + if(swallow_event) { - joy_buildmask( oric ); + joy_buildmask(oric); // { // char testytesttest[64]; // sprintf( testytesttest, "A: %d%d%d%d-%d%d B: %d%d%d%d-%d%d", @@ -542,13 +561,13 @@ SDL_bool joy_filter_event( SDL_Event *ev, struct machine *oric ) return swallow_event; } -static void dojoysetup( struct machine *oric, Sint16 mode_a, Sint16 mode_b ) +static void dojoysetup(struct machine *oric, Sint16 mode_a, Sint16 mode_b) { Sint32 i; - close_joysticks( oric ); + close_joysticks(oric); - for( i=0; i< JOYSTATE_LAST; i++ ) + for(i=0; i< JOYSTATE_LAST; i++) { joystate_a[i] = 0; joystate_b[i] = 0; @@ -556,56 +575,58 @@ static void dojoysetup( struct machine *oric, Sint16 mode_a, Sint16 mode_b ) joystate_a[JOYSTATE_TYPE] = JOYTYPE_NONE; joystate_b[JOYSTATE_TYPE] = JOYTYPE_NONE; - if( (!is_real_joystick( mode_a )) && (!is_real_joystick( mode_b )) ) + if((!is_real_joystick(mode_a)) && (!is_real_joystick(mode_b))) return; - if( !joysubinited ) + if(!joysubinited) { //dbg_printf( "Initialising joysubsystem" ); - if( SDL_InitSubSystem( SDL_INIT_JOYSTICK ) != 0 ) + if(SDL_InitSubSystem(SDL_INIT_JOYSTICK) != 0) return; //dbg_printf( "Success!" ); joysubinited = SDL_TRUE; } - if( is_real_joystick( mode_a ) ) + if(is_real_joystick(mode_a)) { - oric->sdljoy_a = SDL_JoystickOpen( mode_a - JOYMODE_SDL0 ); + oric->sdljoy_a = SDL_JoystickOpen(mode_a - JOYMODE_SDL0); joystate_a[JOYSTATE_TYPE] = get_joystick_type(oric->sdljoy_a); //dbg_printf( "Joy0 = %p", oric->sdljoy_a ); - SDL_JoystickEventState( SDL_TRUE ); + SDL_JoystickEventState(SDL_TRUE); } - if( is_real_joystick( mode_b ) ) + if(is_real_joystick(mode_b)) { - if( mode_b == mode_a ) + if(mode_b == mode_a) { oric->sdljoy_b = oric->sdljoy_a; - } else { - oric->sdljoy_b = SDL_JoystickOpen( mode_b - JOYMODE_SDL0 ); + } + else + { + oric->sdljoy_b = SDL_JoystickOpen(mode_b - JOYMODE_SDL0); joystate_b[JOYSTATE_TYPE] = get_joystick_type(oric->sdljoy_b); - SDL_JoystickEventState( SDL_TRUE ); + SDL_JoystickEventState(SDL_TRUE); } } } -void joy_setup( struct machine *oric ) +void joy_setup(struct machine *oric) { - if( oric->type == MACH_TELESTRAT || ( oric->type == MACH_ATMOS && oric->twilighteboard_activated) ) - dojoysetup( oric, oric->telejoymode_a, oric->telejoymode_b ); + if(oric->type == MACH_TELESTRAT || (oric->type == MACH_ATMOS && oric->twilighteboard_activated)) + dojoysetup(oric, oric->telejoymode_a, oric->telejoymode_b); else - dojoysetup( oric, oric->joymode_a, oric->joymode_b ); + dojoysetup(oric, oric->joymode_a, oric->joymode_b); } -SDL_bool init_joy( struct machine *oric ) +SDL_bool init_joy(struct machine *oric) { return SDL_TRUE; } -void shut_joy( struct machine *oric ) +void shut_joy(struct machine *oric) { - close_joysticks( oric ); + close_joysticks(oric); } diff --git a/joystick.h b/joystick.h index e1ee271e..a08b1d52 100644 --- a/joystick.h +++ b/joystick.h @@ -69,10 +69,10 @@ enum JOYTYPE_DUALSENSE, }; -SDL_bool init_joy( struct machine *oric ); -void shut_joy( struct machine *oric ); +SDL_bool init_joy(struct machine *oric); +void shut_joy(struct machine *oric); -SDL_COMPAT_KEY joy_keyname_to_sym( char *name ); -void joy_setup( struct machine *oric ); -SDL_bool joy_filter_event( SDL_Event *ev, struct machine *oric ); -void joy_buildmask( struct machine *oric ); +SDL_COMPAT_KEY joy_keyname_to_sym(char* name); +void joy_setup(struct machine *oric); +SDL_bool joy_filter_event(SDL_Event *ev, struct machine *oric); +void joy_buildmask(struct machine *oric); diff --git a/keyboard.c b/keyboard.c index 9e448cf3..90e24c6c 100644 --- a/keyboard.c +++ b/keyboard.c @@ -48,31 +48,31 @@ static struct kbdkey kbd_atmos[65], kbd_oric1[65], kbd_pravetz[65]; -SDL_Surface* CreateSurface( int width , int height ) +SDL_Surface* CreateSurface(int width, int height) { - uint32_t rmask , gmask , bmask , amask; - SDL_Surface* surface; + uint32_t rmask, gmask, bmask, amask; + SDL_Surface* surface; - /* SDL interprets each pixel as a 32-bit number, so our masks must depend - on the endianness (byte order) of the machine */ + /* SDL interprets each pixel as a 32-bit number, so our masks must depend + on the endianness (byte order) of the machine */ #if SDL_BYTEORDER == SDL_BIG_ENDIAN - rmask = 0xff000000; - gmask = 0x00ff0000; - bmask = 0x0000ff00; - amask = 0x000000ff; + rmask = 0xff000000; + gmask = 0x00ff0000; + bmask = 0x0000ff00; + amask = 0x000000ff; #else - rmask = 0x000000ff; - gmask = 0x0000ff00; - bmask = 0x00ff0000; - amask = 0xff000000; + rmask = 0x000000ff; + gmask = 0x0000ff00; + bmask = 0x00ff0000; + amask = 0xff000000; #endif - surface = SDL_CreateRGBSurface( 0 , width , height , 32 , rmask , gmask , bmask , amask ); - if( surface == NULL ) - { - error_printf("CreateRGBSurface failed: %s", SDL_GetError() ); - exit(EXIT_FAILURE); - } + surface = SDL_CreateRGBSurface(0, width, height, 32, rmask, gmask, bmask, amask); + if(surface == NULL) + { + error_printf("CreateRGBSurface failed: %s", SDL_GetError()); + exit(EXIT_FAILURE); + } return surface; } @@ -80,42 +80,49 @@ SDL_Surface* CreateSurface( int width , int height ) #define KEYSIM_FLAG ((SDL_COMPAT_KEY)0x8000) #define KEYSIM_MASK ((SDL_COMPAT_KEY)0x7FFF) -static SDL_COMPAT_KEY keyMap[] = { - '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\\', - SDLK_ESCAPE, 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', SDLK_BACKSPACE, - SDLK_LCTRL, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', SDLK_RETURN, - SDLK_LSHIFT, 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', SDLK_RSHIFT, - SDLK_LEFT, SDLK_DOWN, ' ', SDLK_UP, SDLK_RIGHT, SDLK_RALT, ' ', ' ', ' ', ' ', ' ', ' ' }; - -static SDL_COMPAT_KEY keyMapPravetz[] = { - '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', KEYSIM_FLAG|';', '-', ';', - SDLK_ESCAPE, 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', KEYSIM_FLAG|'2', '\\', SDLK_BACKSPACE, - SDLK_LCTRL, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', '[', ']', SDLK_RETURN, - SDLK_LSHIFT, 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', SDLK_RSHIFT, - SDLK_LEFT, SDLK_DOWN, ' ', SDLK_UP, SDLK_RIGHT, SDLK_RALT, KEYSIM_FLAG|'6', ' ', ' ', ' ', ' ', ' ' }; - -static SDL_COMPAT_KEY keyMapShiftedPravetz[] = { - '1', '\'', '3', '4', '5', '7', KEYSIM_FLAG|'\'', '9', '0', '-', '8', KEYSIM_FLAG|'=', '=', - SDLK_ESCAPE, 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '~', '\\', SDLK_BACKSPACE, - SDLK_LCTRL, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', '[', ']', SDLK_RETURN, - SDLK_LSHIFT, 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', SDLK_RSHIFT, - SDLK_LEFT, SDLK_DOWN, ' ', SDLK_UP, SDLK_RIGHT, SDLK_RALT, '`', ' ', ' ', ' ', ' ', ' ' }; - -enum { - MOD_CTRL = 0, - MOD_LSHIFT, - MOD_RSHIFT, - MOD_FUNCT, - MODKEY_MAX +static SDL_COMPAT_KEY keyMap[] = +{ + '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\\', + SDLK_ESCAPE, 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', SDLK_BACKSPACE, + SDLK_LCTRL, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', SDLK_RETURN, + SDLK_LSHIFT, 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', SDLK_RSHIFT, + SDLK_LEFT, SDLK_DOWN, ' ', SDLK_UP, SDLK_RIGHT, SDLK_RALT, ' ', ' ', ' ', ' ', ' ', ' ' +}; + +static SDL_COMPAT_KEY keyMapPravetz[] = +{ + '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', KEYSIM_FLAG|';', '-', ';', + SDLK_ESCAPE, 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', KEYSIM_FLAG|'2', '\\', SDLK_BACKSPACE, + SDLK_LCTRL, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', '[', ']', SDLK_RETURN, + SDLK_LSHIFT, 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', SDLK_RSHIFT, + SDLK_LEFT, SDLK_DOWN, ' ', SDLK_UP, SDLK_RIGHT, SDLK_RALT, KEYSIM_FLAG|'6', ' ', ' ', ' ', ' ', ' ' +}; + +static SDL_COMPAT_KEY keyMapShiftedPravetz[] = +{ + '1', '\'', '3', '4', '5', '7', KEYSIM_FLAG|'\'', '9', '0', '-', '8', KEYSIM_FLAG|'=', '=', + SDLK_ESCAPE, 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '~', '\\', SDLK_BACKSPACE, + SDLK_LCTRL, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', '[', ']', SDLK_RETURN, + SDLK_LSHIFT, 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', SDLK_RSHIFT, + SDLK_LEFT, SDLK_DOWN, ' ', SDLK_UP, SDLK_RIGHT, SDLK_RALT, '`', ' ', ' ', ' ', ' ', ' ' +}; + +enum +{ + MOD_CTRL = 0, + MOD_LSHIFT, + MOD_RSHIFT, + MOD_FUNCT, + MODKEY_MAX }; static SDL_COMPAT_KEY modKeys[MODKEY_MAX] = { SDLK_LCTRL, SDLK_LSHIFT, SDLK_RSHIFT, SDLK_LALT }; -static char *modKeyNames[MODKEY_MAX] = { "Ctrl", "Left shift", "Right shift", "Funct" }; +static char* modKeyNames[MODKEY_MAX] = { "Ctrl", "Left shift", "Right shift", "Funct" }; static const int modKeyMax = MODKEY_MAX; static SDL_bool modKeyPressed[MODKEY_MAX]; static SDL_bool modKeyFakePressed[MODKEY_MAX]; -int kbd_init( struct machine *oric ) +int kbd_init(struct machine *oric) { int i, j; @@ -124,7 +131,7 @@ int kbd_init( struct machine *oric ) oric->keyboard_mapping.nb_map = 0; - for( i=0; i<62; i++ ) + for(i=0; i<62; i++) { kbd_atmos[i].w = 43; kbd_atmos[i].h = 43; @@ -150,18 +157,20 @@ int kbd_init( struct machine *oric ) // mod keys - for (j = 0; j < modKeyMax; j++) { - if (kbd_atmos[i].keysim == modKeys[j]) { - kbd_atmos[i].is_mod_key = 1; - kbd_oric1[i].is_mod_key = 1; - kbd_pravetz[i].is_mod_key = 1; - } + for(j = 0; j < modKeyMax; j++) + { + if(kbd_atmos[i].keysim == modKeys[j]) + { + kbd_atmos[i].is_mod_key = 1; + kbd_oric1[i].is_mod_key = 1; + kbd_pravetz[i].is_mod_key = 1; } + } } - for( i=0; i<13; i++ ) + for(i=0; i<13; i++) { kbd_atmos[i].x = i*43+47; kbd_atmos[i].y = 10; @@ -172,7 +181,7 @@ int kbd_init( struct machine *oric ) kbd_pravetz[i].x = i*42+47; kbd_pravetz[i].y = 10; } - for( i=13; i<27; i++ ) + for(i=13; i<27; i++) { kbd_atmos[i].x = (i-13)*43+23; kbd_atmos[i].y = 53; @@ -183,7 +192,7 @@ int kbd_init( struct machine *oric ) kbd_pravetz[i].x = (i-13)*42+25; kbd_pravetz[i].y = 51; } - for( i=27; i<40; i++ ) + for(i=27; i<40; i++) { kbd_atmos[i].x = (i-27)*43+38; kbd_atmos[i].y = 96; @@ -201,7 +210,7 @@ int kbd_init( struct machine *oric ) kbd_atmos[40].y = 139; kbd_atmos[40].w = 65; - for( i=41; i<52; i++ ) + for(i=41; i<52; i++) { kbd_atmos[i].x = (i-41)*43+103; kbd_atmos[i].y = 139; @@ -223,7 +232,7 @@ int kbd_init( struct machine *oric ) kbd_atmos[57].y = 182; kbd_atmos[58].x = -1; - for( i=40; i<52; i++ ) + for(i=40; i<52; i++) { kbd_oric1[i].x = (i-40)*43+49; kbd_oric1[i].y = 144; @@ -242,7 +251,7 @@ int kbd_init( struct machine *oric ) kbd_oric1[56].y = 187; kbd_oric1[57].x = -1; - for( i=41; i<52; i++ ) + for(i=41; i<52; i++) { kbd_pravetz[i].x = (i-41)*43+103; kbd_pravetz[i].y = 137; @@ -283,317 +292,358 @@ static SDL_bool release_keys = SDL_FALSE; // This is the event handler for when you are in the menus -SDL_bool keyboard_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) +SDL_bool keyboard_event(SDL_Event *ev, struct machine *oric, SDL_bool *needrender) { - SDL_bool done = SDL_FALSE; - SDL_bool lshifted = modKeyPressed[MOD_LSHIFT]; - SDL_bool rshifted = modKeyPressed[MOD_RSHIFT]; + SDL_bool done = SDL_FALSE; + SDL_bool lshifted = modKeyPressed[MOD_LSHIFT]; + SDL_bool rshifted = modKeyPressed[MOD_RSHIFT]; - int i, x, y, current_key_num = -1; - static char tmp[64]; - struct kbdkey * kbd; + int i, x, y, current_key_num = -1; + static char tmp[64]; + struct kbdkey * kbd; - if (release_keys) + if(release_keys) + { + x = 0; + for(i=0; iay, modKeys[i], SDL_FALSE ); - snprintf(tmp, sizeof(tmp), "%s released.", modKeyNames[i]); - do_popup(oric, tmp); - x++; - } else if (modKeyFakePressed[i]) { - modKeyFakePressed[i] = SDL_FALSE; - ay_keypress( &oric->ay, modKeys[i], SDL_FALSE ); - } + modKeyPressed[i] = SDL_FALSE; + ay_keypress(&oric->ay, modKeys[i], SDL_FALSE); + snprintf(tmp, sizeof(tmp), "%s released.", modKeyNames[i]); + do_popup(oric, tmp); + x++; + } + else if(modKeyFakePressed[i]) + { + modKeyFakePressed[i] = SDL_FALSE; + ay_keypress(&oric->ay, modKeys[i], SDL_FALSE); } + } - if (x > 1) - do_popup(oric, "All keys released"); + if(x > 1) + do_popup(oric, "All keys released"); - release_keys = SDL_FALSE; - } + release_keys = SDL_FALSE; + } - x = -1; - y = -1; - switch( ev->type ) - { - case SDL_MOUSEBUTTONDOWN: - x = ev->button.x; - y = ev->button.y - 480; + x = -1; + y = -1; + switch(ev->type) + { + case SDL_MOUSEBUTTONDOWN: + x = ev->button.x; + y = ev->button.y - 480; - switch( oric->type ) - { - case MACH_PRAVETZ: - kbd = kbd_pravetz; - break; - case MACH_ORIC1: - case MACH_ORIC1_16K: - kbd = kbd_oric1; - break; - default: - kbd = kbd_atmos; - break; - } + switch(oric->type) + { + case MACH_PRAVETZ: + kbd = kbd_pravetz; + break; + case MACH_ORIC1: + case MACH_ORIC1_16K: + kbd = kbd_oric1; + break; + default: + kbd = kbd_atmos; + break; + } - // find the visual key under the mouse pointer - current_key = NULL; - for(i=0; i<62; i++) { - if ((x > kbd[i].x) && (x < kbd[i].x + kbd[i].w) && - (y > kbd[i].y) && (y < kbd[i].y + kbd[i].h)) { - current_key = &(kbd[i]); - current_key_num = i; - //if (ev->type == SDL_MOUSEBUTTONDOWN) - // printf("Key %d pressed : keysim %d (%c)\n", - // i, current_key->keysim, (char)(current_key->keysim)); - break; - } - } + // find the visual key under the mouse pointer + current_key = NULL; + for(i=0; i<62; i++) + { + if((x > kbd[i].x) && (x < kbd[i].x + kbd[i].w) && + (y > kbd[i].y) && (y < kbd[i].y + kbd[i].h)) + { + current_key = &(kbd[i]); + current_key_num = i; + //if (ev->type == SDL_MOUSEBUTTONDOWN) + // printf("Key %d pressed : keysim %d (%c)\n", + // i, current_key->keysim, (char)(current_key->keysim)); + break; + } + } - if (current_key != NULL) { - // check which button was pressed - if( ev->button.button == SDL_BUTTON_LEFT ) + if(current_key != NULL) + { + // check which button was pressed + if(ev->button.button == SDL_BUTTON_LEFT) + { + if(oric->define_mapping) + { + do_popup(oric, "Press the key you want to use."); + defining_key_map = SDL_TRUE; + } + else + { + // manage mod keys + if(current_key->is_mod_key && oric->sticky_mod_keys) + { + for(i=0; ikeysim == modKeys[i]) + break; + } + + if(i < modKeyMax) + { + if(modKeyPressed[i]) + { + modKeyPressed[i] = SDL_FALSE; + snprintf(tmp, sizeof(tmp), "%s released.", modKeyNames[i]); + } + else { - if(oric->define_mapping) { - do_popup( oric, "Press the key you want to use." ); - defining_key_map = SDL_TRUE; - } else { - // manage mod keys - if (current_key->is_mod_key && oric->sticky_mod_keys) { - for (i=0; ikeysim == modKeys[i]) - break; - } - - if (i < modKeyMax) { - if (modKeyPressed[i]) { - modKeyPressed[i] = SDL_FALSE; - snprintf(tmp, sizeof(tmp), "%s released.", modKeyNames[i]); - } else { - modKeyPressed[i] = SDL_TRUE; - snprintf(tmp, sizeof(tmp), "%s pressed.", modKeyNames[i]); - } - do_popup(oric, tmp); - ay_keypress( &oric->ay, current_key->keysim, modKeyPressed[i] ); - current_key = NULL; - return done; - } - } - - // send the key to the Oric - switch( oric->type ) - { - case MACH_PRAVETZ: - if (lshifted) { - if (current_key_num == 24) - queuekeys("\x60"); - if (KEYSIM_FLAG & current_key->keysimshifted) - ay_keypress( &oric->ay, modKeys[MOD_LSHIFT], SDL_FALSE ); - ay_keypress( &oric->ay, KEYSIM_MASK & current_key->keysimshifted, SDL_TRUE ); - } else if (rshifted) { - if (current_key_num == 24) - queuekeys("\x60"); - if (KEYSIM_FLAG & current_key->keysimshifted) - ay_keypress( &oric->ay, modKeys[MOD_RSHIFT], SDL_FALSE ); - ay_keypress( &oric->ay, KEYSIM_MASK & current_key->keysimshifted, SDL_TRUE ); - } else { - if (current_key_num == 59) { - queuekeys("\x14"); - } else if (KEYSIM_FLAG & current_key->keysim) { - ay_keypress( &oric->ay, modKeys[MOD_LSHIFT], SDL_TRUE ); - ay_keypress( &oric->ay, KEYSIM_MASK & current_key->keysim, SDL_TRUE ); - modKeyFakePressed[MOD_LSHIFT] = SDL_TRUE; - } else { - ay_keypress( &oric->ay, KEYSIM_MASK & current_key->keysim, SDL_TRUE ); - } - } - break; - case MACH_ORIC1: - case MACH_ORIC1_16K: - case MACH_ATMOS: - default: - ay_keypress( &oric->ay, current_key->keysim, SDL_TRUE ); - break; - } - - // start releasing mod keys if need be - release_keys = SDL_TRUE; - } + modKeyPressed[i] = SDL_TRUE; + snprintf(tmp, sizeof(tmp), "%s pressed.", modKeyNames[i]); } + do_popup(oric, tmp); + ay_keypress(&oric->ay, current_key->keysim, modKeyPressed[i]); + current_key = NULL; + return done; + } } - break; - - case SDL_MOUSEBUTTONUP: - if ((current_key == NULL) || (defining_key_map)) - break; // send the key to the Oric - switch( oric->type ) + switch(oric->type) { - case MACH_PRAVETZ: - if (lshifted || rshifted) { - ay_keypress( &oric->ay, KEYSIM_MASK & current_key->keysimshifted, SDL_FALSE ); - } else { - ay_keypress( &oric->ay, KEYSIM_MASK & current_key->keysim, SDL_FALSE ); - } - break; - case MACH_ORIC1: - case MACH_ORIC1_16K: - case MACH_ATMOS: - default: - ay_keypress( &oric->ay, current_key->keysim, SDL_FALSE ); - break; + case MACH_PRAVETZ: + if(lshifted) + { + if(current_key_num == 24) + queuekeys("\x60"); + if(KEYSIM_FLAG & current_key->keysimshifted) + ay_keypress(&oric->ay, modKeys[MOD_LSHIFT], SDL_FALSE); + ay_keypress(&oric->ay, KEYSIM_MASK & current_key->keysimshifted, SDL_TRUE); + } + else if(rshifted) + { + if(current_key_num == 24) + queuekeys("\x60"); + if(KEYSIM_FLAG & current_key->keysimshifted) + ay_keypress(&oric->ay, modKeys[MOD_RSHIFT], SDL_FALSE); + ay_keypress(&oric->ay, KEYSIM_MASK & current_key->keysimshifted, SDL_TRUE); + } + else + { + if(current_key_num == 59) + { + queuekeys("\x14"); + } + else if(KEYSIM_FLAG & current_key->keysim) + { + ay_keypress(&oric->ay, modKeys[MOD_LSHIFT], SDL_TRUE); + ay_keypress(&oric->ay, KEYSIM_MASK & current_key->keysim, SDL_TRUE); + modKeyFakePressed[MOD_LSHIFT] = SDL_TRUE; + } + else + { + ay_keypress(&oric->ay, KEYSIM_MASK & current_key->keysim, SDL_TRUE); + } + } + break; + case MACH_ORIC1: + case MACH_ORIC1_16K: + case MACH_ATMOS: + default: + ay_keypress(&oric->ay, current_key->keysim, SDL_TRUE); + break; } - current_key = NULL; - break; + // start releasing mod keys if need be + release_keys = SDL_TRUE; + } + } + } + break; - case SDL_KEYUP: - if (defining_key_map) { - SDL_KeyboardEvent *kbd_evt = (SDL_KeyboardEvent *) ev; - add_to_keyboard_mapping( &(oric->keyboard_mapping), kbd_evt->keysym.sym, current_key->keysim ); - do_popup( oric, "Key mapping done."); - defining_key_map = SDL_FALSE; - current_key = NULL; - } - break; + case SDL_MOUSEBUTTONUP: + if((current_key == NULL) || (defining_key_map)) + break; - } - return done; + // send the key to the Oric + switch(oric->type) + { + case MACH_PRAVETZ: + if(lshifted || rshifted) + { + ay_keypress(&oric->ay, KEYSIM_MASK & current_key->keysimshifted, SDL_FALSE); + } + else + { + ay_keypress(&oric->ay, KEYSIM_MASK & current_key->keysim, SDL_FALSE); + } + break; + case MACH_ORIC1: + case MACH_ORIC1_16K: + case MACH_ATMOS: + default: + ay_keypress(&oric->ay, current_key->keysim, SDL_FALSE); + break; + } + + current_key = NULL; + break; + + case SDL_KEYUP: + if(defining_key_map) + { + SDL_KeyboardEvent *kbd_evt = (SDL_KeyboardEvent *) ev; + add_to_keyboard_mapping(&(oric->keyboard_mapping), kbd_evt->keysym.sym, current_key->keysim); + do_popup(oric, "Key mapping done."); + defining_key_map = SDL_FALSE; + current_key = NULL; + } + break; + + } + return done; } void release_sticky_keys(void) { - release_keys = SDL_TRUE; + release_keys = SDL_TRUE; } -void add_to_keyboard_mapping( struct keyboard_mapping *map, SDL_COMPAT_KEY host_key, SDL_COMPAT_KEY oric_key ) +void add_to_keyboard_mapping(struct keyboard_mapping *map, SDL_COMPAT_KEY host_key, SDL_COMPAT_KEY oric_key) { - // search for a matching host key - int index = 0; - while (index < map->nb_map) { - if (map->host_keys[index] == host_key) { - // found one: update it - map->oric_keys[index] = oric_key; - return; - } else { - // move through the list - index++; - } + // search for a matching host key + int index = 0; + while(index < map->nb_map) + { + if(map->host_keys[index] == host_key) + { + // found one: update it + map->oric_keys[index] = oric_key; + return; } - // add a new mapping - map->host_keys[map->nb_map] = host_key; - map->oric_keys[map->nb_map] = oric_key; - map->nb_map++; + else + { + // move through the list + index++; + } + } + // add a new mapping + map->host_keys[map->nb_map] = host_key; + map->oric_keys[map->nb_map] = oric_key; + map->nb_map++; } -void reset_keyboard_mapping( struct keyboard_mapping *map ) +void reset_keyboard_mapping(struct keyboard_mapping *map) { - map->nb_map = 0; + map->nb_map = 0; } -SDL_bool save_keyboard_mapping( struct machine *oric, char *filename ) +SDL_bool save_keyboard_mapping(struct machine *oric, char* filename) { - SDL_bool ok = SDL_TRUE; - FILE *f = NULL; + SDL_bool ok = SDL_TRUE; + FILE *f = NULL; - f = fopen(filename, "wt"); - if (!f) - { - msgbox(oric, MSGBOX_OK, "Unable to create keyboard mapping file (1)"); - return SDL_FALSE; - } + f = fopen(filename, "wt"); + if(!f) + { + msgbox(oric, MSGBOX_OK, "Unable to create keyboard mapping file (1)"); + return SDL_FALSE; + } - if (fputs("# SDL_key_symbol_for_host : SDL_key_symbol_for_oric\n", f) < 0) - { - msgbox(oric, MSGBOX_OK, "Unable to write to keyboard mapping file (2)"); - ok = SDL_FALSE; - } - if (ok == SDL_TRUE && fputs("# see http://www.libsdl.org/release/SDL-1.2.15/docs/html/sdlkey.html \n", f) < 0) + if(fputs("# SDL_key_symbol_for_host : SDL_key_symbol_for_oric\n", f) < 0) + { + msgbox(oric, MSGBOX_OK, "Unable to write to keyboard mapping file (2)"); + ok = SDL_FALSE; + } + if(ok == SDL_TRUE && fputs("# see http://www.libsdl.org/release/SDL-1.2.15/docs/html/sdlkey.html \n", f) < 0) + { + msgbox(oric, MSGBOX_OK, "Unable to write to keyboard mapping file (2)"); + ok = SDL_FALSE; + } + + // if we have any definition to save + if(ok == SDL_TRUE && oric->keyboard_mapping.nb_map != 0) + { + int i; + // loop through them + for(i=0; i < oric->keyboard_mapping.nb_map && ok == SDL_TRUE; i++) { - msgbox(oric, MSGBOX_OK, "Unable to write to keyboard mapping file (2)"); + // print them in the file + if(fprintf(f, "%d : %d\n", oric->keyboard_mapping.host_keys[i], oric->keyboard_mapping.oric_keys[i]) < 0) + { + msgbox(oric, MSGBOX_OK, "Unable to write to keyboard mapping file (3)"); ok = SDL_FALSE; + } } + } - // if we have any definition to save - if (ok == SDL_TRUE && oric->keyboard_mapping.nb_map != 0) { - int i; - // loop through them - for(i=0; i < oric->keyboard_mapping.nb_map && ok == SDL_TRUE; i++) { - // print them in the file - if (fprintf(f, "%d : %d\n", oric->keyboard_mapping.host_keys[i], oric->keyboard_mapping.oric_keys[i]) < 0) - { - msgbox(oric, MSGBOX_OK, "Unable to write to keyboard mapping file (3)"); - ok = SDL_FALSE; - } - } - } - - if(fclose(f) == EOF) { - msgbox(oric, MSGBOX_OK, "Unable to close keyboard mapping file (4)"); - ok = SDL_FALSE; - } + if(fclose(f) == EOF) + { + msgbox(oric, MSGBOX_OK, "Unable to close keyboard mapping file (4)"); + ok = SDL_FALSE; + } - return ok; + return ok; } -SDL_bool load_keyboard_mapping( struct machine *oric, char *filename ) +SDL_bool load_keyboard_mapping(struct machine *oric, char* filename) { - SDL_bool ok = SDL_TRUE; - FILE *f = NULL; - char buf[4096]; - int host_key, oric_key; + SDL_bool ok = SDL_TRUE; + FILE *f = NULL; + char buf[4096]; + int host_key, oric_key; - f = fopen(filename, "rt"); - if (!f) - { - msgbox(oric, MSGBOX_OK, "Unable to read keyboard mapping file (1)"); - return SDL_FALSE; - } + f = fopen(filename, "rt"); + if(!f) + { + msgbox(oric, MSGBOX_OK, "Unable to read keyboard mapping file (1)"); + return SDL_FALSE; + } - // first reset the mapping - reset_keyboard_mapping(&(oric->keyboard_mapping)); - - // while we are not finished reading the file - while (!feof(f) && !ferror(f)) { - // if we can read something - if (fgets(buf, 4096, f)>0) { - // if it's not a comment - if (buf[0] != '#') { - // if we can read a definition - if (sscanf(buf, "%d : %d", &host_key, &oric_key)==2) { - // add it to the keyboard mapping - add_to_keyboard_mapping( &(oric->keyboard_mapping), host_key, oric_key); - } - } + // first reset the mapping + reset_keyboard_mapping(&(oric->keyboard_mapping)); + + // while we are not finished reading the file + while(!feof(f) && !ferror(f)) + { + // if we can read something + if(fgets(buf, 4096, f)>0) + { + // if it's not a comment + if(buf[0] != '#') + { + // if we can read a definition + if(sscanf(buf, "%d : %d", &host_key, &oric_key)==2) + { + // add it to the keyboard mapping + add_to_keyboard_mapping(&(oric->keyboard_mapping), host_key, oric_key); } + } } + } - if(ferror(f)) { - msgbox(oric, MSGBOX_OK, "Problem while reading from keyboard mapping file (2)"); - ok = SDL_FALSE; - } + if(ferror(f)) + { + msgbox(oric, MSGBOX_OK, "Problem while reading from keyboard mapping file (2)"); + ok = SDL_FALSE; + } - if (ok == SDL_TRUE && sprintf(buf, "Read %d key mappings", oric->keyboard_mapping.nb_map) > 0) - do_popup(oric, buf); + if(ok == SDL_TRUE && sprintf(buf, "Read %d key mappings", oric->keyboard_mapping.nb_map) > 0) + do_popup(oric, buf); - if(fclose(f) == EOF) { - msgbox(oric, MSGBOX_OK, "Unable to close keyboard mapping file (3)"); - ok = SDL_FALSE; - } + if(fclose(f) == EOF) + { + msgbox(oric, MSGBOX_OK, "Unable to close keyboard mapping file (3)"); + ok = SDL_FALSE; + } - return ok; + return ok; } #ifdef __ANDROID__ extern struct osdmenuitem keopitems[]; -void togglekeyboard( struct machine *oric, struct osdmenuitem *mitem, int dummy ); +void togglekeyboard(struct machine *oric, struct osdmenuitem *mitem, int dummy); void android_togglekeyboard(struct machine* oric) { - togglekeyboard( oric, &keopitems[0], 0 ); + togglekeyboard(oric, &keopitems[0], 0); } #endif diff --git a/keyboard.h b/keyboard.h index e7a1a609..fbe04a3c 100644 --- a/keyboard.h +++ b/keyboard.h @@ -39,19 +39,19 @@ struct keyboard_mapping }; -int kbd_init( struct machine *oric ); +int kbd_init(struct machine *oric); -SDL_bool keyboard_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ); +SDL_bool keyboard_event(SDL_Event *ev, struct machine *oric, SDL_bool *needrender); void release_sticky_keys(void); -void add_to_keyboard_mapping( struct keyboard_mapping *map, SDL_COMPAT_KEY host_key, SDL_COMPAT_KEY oric_key ); +void add_to_keyboard_mapping(struct keyboard_mapping *map, SDL_COMPAT_KEY host_key, SDL_COMPAT_KEY oric_key); -void reset_keyboard_mapping( struct keyboard_mapping *map ); +void reset_keyboard_mapping(struct keyboard_mapping *map); -SDL_bool save_keyboard_mapping( struct machine *oric, char *filename ); +SDL_bool save_keyboard_mapping(struct machine *oric, char* filename); -SDL_bool load_keyboard_mapping( struct machine *oric, char *filename ); +SDL_bool load_keyboard_mapping(struct machine *oric, char* filename); #ifdef __ANDROID__ void android_togglekeyboard(struct machine* oric); diff --git a/machine.c b/machine.c index d9e7cb6a..00b7b0e5 100644 --- a/machine.c +++ b/machine.c @@ -90,58 +90,59 @@ Uint8 oricpalette[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff }; + 0xff, 0xff, 0xff + }; static Uint8 sedoric_detect[] = - { - 0xfb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x53, 0x45, 0x44, 0x4f, 0x52, 0x49, 0x43, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - }; +{ + 0xfb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x53, 0x45, 0x44, 0x4f, 0x52, 0x49, 0x43, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +}; static Uint8 stratsed_detect[] = - { - 0xfb, 0x00, 0x11, 0x2c, 0x00, 0xd4, 0xa9, 0x00, 0x00, 0x52, 0xa9, 0x00, 0x8d, 0x0f, 0x05, 0x8d, - 0x49, 0x05, 0xa9, 0x4c, 0xa0, 0x00, 0xa2, 0xd4, 0x8d, 0x4f, 0x05, 0x8c, 0x50, 0x05, 0x8e, 0x51, - 0x05, 0xa2, 0x03, 0xec, 0x0c, 0x02, 0xd0, 0x03, 0xa9, 0x02, 0x2c, 0xa9, 0x00, 0x9d, 0x09, 0x05, - }; +{ + 0xfb, 0x00, 0x11, 0x2c, 0x00, 0xd4, 0xa9, 0x00, 0x00, 0x52, 0xa9, 0x00, 0x8d, 0x0f, 0x05, 0x8d, + 0x49, 0x05, 0xa9, 0x4c, 0xa0, 0x00, 0xa2, 0xd4, 0x8d, 0x4f, 0x05, 0x8c, 0x50, 0x05, 0x8e, 0x51, + 0x05, 0xa2, 0x03, 0xec, 0x0c, 0x02, 0xd0, 0x03, 0xa9, 0x02, 0x2c, 0xa9, 0x00, 0x9d, 0x09, 0x05, +}; static Uint8 ftdos_detect[] = - { - 0xfb, 0x78, 0xa9, 0x7f, 0x8d, 0x0e, 0x03, 0xa9, 0x01, 0x8d, 0xfa, 0x03, 0xa9, 0x00, 0x8d, 0xfb, - 0x03, 0x85, 0x04, 0x8d, 0xf4, 0x03, 0xa2, 0x02, 0xac, 0x30, 0x02, 0xc0, 0x40, 0xd0, 0x04, 0xa9, - 0x04, 0xa2, 0x06, 0x85, 0x01, 0x8e, 0x53, 0x04, 0xa9, 0xac, 0x8d, 0xfe, 0xff, 0xa9, 0x04, 0x8d, - }; +{ + 0xfb, 0x78, 0xa9, 0x7f, 0x8d, 0x0e, 0x03, 0xa9, 0x01, 0x8d, 0xfa, 0x03, 0xa9, 0x00, 0x8d, 0xfb, + 0x03, 0x85, 0x04, 0x8d, 0xf4, 0x03, 0xa2, 0x02, 0xac, 0x30, 0x02, 0xc0, 0x40, 0xd0, 0x04, 0xa9, + 0x04, 0xa2, 0x06, 0x85, 0x01, 0x8e, 0x53, 0x04, 0xa9, 0xac, 0x8d, 0xfe, 0xff, 0xa9, 0x04, 0x8d, +}; static Uint8 ftdos_master_detect[] = - { - 0xfb, 0xea, 0x78, 0xa9, 0x7f, 0x8d, 0x0e, 0x03, 0xa9, 0x01, 0x8d, 0xfa, 0x03, 0xa9, 0x00, 0x8d, - 0xfb, 0x03, 0x85, 0x04, 0x85, 0x01, 0x8d, 0xf4, 0x03, 0xa9, 0xab, 0x8d, 0xfe, 0xff, 0xa9, 0x04, - 0x8d, 0xff, 0xff, 0x8d, 0x39, 0x04, 0x8d, 0x48, 0x04, 0x8d, 0x66, 0x04, 0xa9, 0x03, 0x85, 0x02, - }; +{ + 0xfb, 0xea, 0x78, 0xa9, 0x7f, 0x8d, 0x0e, 0x03, 0xa9, 0x01, 0x8d, 0xfa, 0x03, 0xa9, 0x00, 0x8d, + 0xfb, 0x03, 0x85, 0x04, 0x85, 0x01, 0x8d, 0xf4, 0x03, 0xa9, 0xab, 0x8d, 0xfe, 0xff, 0xa9, 0x04, + 0x8d, 0xff, 0xff, 0x8d, 0x39, 0x04, 0x8d, 0x48, 0x04, 0x8d, 0x66, 0x04, 0xa9, 0x03, 0x85, 0x02, +}; -int detect_image_type(char *filename) +int detect_image_type(char* filename) { FILE *f; size_t size; unsigned char tmp[6400]; f = fopen(filename, "rb"); - if (!f) + if(!f) return IMG_I_DUNNO; fseek(f, 0, SEEK_END); size = ftell(f); fseek(f, 0, SEEK_SET); - if (1 != fread(tmp, 8, 1, f)) + if(1 != fread(tmp, 8, 1, f)) { fclose(f); return IMG_I_DUNNO; } /* Look for tape header */ - if ((memcmp(tmp, "\x16\x16\x16\x16", 4) == 0) || + if((memcmp(tmp, "\x16\x16\x16\x16", 4) == 0) || (memcmp(tmp, "\x16\x16\x16\x24", 4) == 0) || (memcmp(tmp, "\x16\x16\x24", 3) == 0) || (memcmp(tmp, "RIFF", 4) == 0) || @@ -152,14 +153,14 @@ int detect_image_type(char *filename) } /* Look for snapshot header */ - if (memcmp(tmp, "OSN\x00", 4)==0) + if(memcmp(tmp, "OSN\x00", 4)==0) { fclose(f); return IMG_SNAPSHOT; } /* Look for a microdisc or jasmin disk image */ - if ((size > 20) && (memcmp(tmp, "MFM_DISK", 8)==0)) + if((size > 20) && (memcmp(tmp, "MFM_DISK", 8)==0)) { Uint8 *ptr, *eot; int sectorlen; @@ -173,13 +174,13 @@ int detect_image_type(char *filename) /* Find the first sector */ ptr = tmp; eot = &tmp[6400]; - while (1) + while(1) { // Search for ID mark - while( (ptr= eot) + if(ptr >= eot) { printf("%s: couldn't find track 0 sector 1 in %s\n", __func__, filename); return IMG_I_DUNNO; @@ -193,20 +194,20 @@ int detect_image_type(char *filename) ptr+=7; // Search for data ID - while( (ptr= eot) + while((ptr= eot) { printf("%s: couldn't find track 0 sector 1 in %s (2)\n", __func__, filename); return IMG_I_DUNNO; } // ptr now points to the sector data - if (gotsector) + if(gotsector) break; // Skip this sector ptr += sectorlen+3; - if (ptr >= eot) + if(ptr >= eot) { printf("%s: couldn't find track 0 sector 1 in %s (3)\n", __func__, filename); return IMG_I_DUNNO; @@ -215,18 +216,18 @@ int detect_image_type(char *filename) /* Got track 0, sector 1 */ /* See if we recognise it .. */ - if (sectorlen == 256) + if(sectorlen == 256) { - if (memcmp(ptr, sedoric_detect, sizeof(sedoric_detect))==0) + if(memcmp(ptr, sedoric_detect, sizeof(sedoric_detect))==0) return IMG_ATMOS_MICRODISC; - if (memcmp(ptr, stratsed_detect, sizeof(stratsed_detect))==0) + if(memcmp(ptr, stratsed_detect, sizeof(stratsed_detect))==0) return IMG_TELESTRAT_DISK; - if (memcmp(ptr, ftdos_detect, sizeof(ftdos_detect))==0) + if(memcmp(ptr, ftdos_detect, sizeof(ftdos_detect))==0) return IMG_ATMOS_JASMIN; - if (memcmp(ptr, ftdos_master_detect, sizeof(ftdos_master_detect))==0) + if(memcmp(ptr, ftdos_master_detect, sizeof(ftdos_master_detect))==0) return IMG_ATMOS_JASMIN; } @@ -237,110 +238,113 @@ int detect_image_type(char *filename) fclose(f); /* Maybe its a pravetz disk... */ - if (size == 143360) + if(size == 143360) return IMG_PRAVETZ_DISK; return IMG_I_DUNNO; } // Switch between emulation/monitor/menus etc. -void setemumode( struct machine *oric, struct osdmenuitem *mitem, int mode ) +void setemumode(struct machine *oric, struct osdmenuitem *mitem, int mode) { oric->emu_mode = mode; - switch( mode ) + switch(mode) { case EM_RUNNING: - SDL_COMPAT_EnableKeyRepeat( 0, 0 ); - SDL_COMPAT_EnableUNICODE( SDL_FALSE ); + SDL_COMPAT_EnableKeyRepeat(0, 0); + SDL_COMPAT_EnableUNICODE(SDL_FALSE); oric->ay.soundon = soundavailable && soundon && (!warpspeed); - if( oric->ay.soundon ) + if(oric->ay.soundon) { - ay_flushlog( &oric->ay ); - SDL_PauseAudio( 0 ); + ay_flushlog(&oric->ay); + SDL_PauseAudio(0); } - ula_set_dirty( oric ); + ula_set_dirty(oric); break; case EM_MENU: - if( vidcap ) avi_close( &vidcap ); - gotomenu( oric, NULL, 0 ); - SDL_COMPAT_EnableKeyRepeat( SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL ); - SDL_COMPAT_EnableUNICODE( SDL_TRUE ); + if(vidcap) avi_close(&vidcap); + gotomenu(oric, NULL, 0); + SDL_COMPAT_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); + SDL_COMPAT_EnableUNICODE(SDL_TRUE); oric->ay.soundon = SDL_FALSE; - if( soundavailable ) - SDL_PauseAudio( 1 ); + if(soundavailable) + SDL_PauseAudio(1); break; #ifndef WWW_NO_MONITOR case EM_DEBUG: - if( vidcap ) avi_close( &vidcap ); - mon_enter( oric ); - SDL_COMPAT_EnableKeyRepeat( SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL ); - SDL_COMPAT_EnableUNICODE( SDL_TRUE ); + if(vidcap) avi_close(&vidcap); + mon_enter(oric); + SDL_COMPAT_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); + SDL_COMPAT_EnableUNICODE(SDL_TRUE); oric->ay.soundon = SDL_FALSE; - if( soundavailable ) - SDL_PauseAudio( 1 ); + if(soundavailable) + SDL_PauseAudio(1); break; #endif } } -void setromon( struct machine *oric ) +void setromon(struct machine *oric) { // Determine if the ROM is currently active oric->romon = SDL_TRUE; - if( oric->drivetype == DRV_JASMIN ) + if(oric->drivetype == DRV_JASMIN) { - if( oric->jasmin.olay == 0 ) + if(oric->jasmin.olay == 0) { oric->romon = !oric->romdis; - } else { + } + else + { oric->romon = SDL_FALSE; } } - else if( oric->drivetype == DRV_PRAVETZ ) + else if(oric->drivetype == DRV_PRAVETZ) { oric->romon = !oric->pravetz.olay; } - else if ( oric->type == MACH_TELESTRAT ) + else if(oric->type == MACH_TELESTRAT) + { + oric->romon = (oric->tele_banktype == TELEBANK_ROM); + } + else { - oric->romon = ( oric->tele_banktype == TELEBANK_ROM ); - } else { oric->romon = !oric->romdis; } } // Oric Atmos CPU write -void atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) +void atmoswrite(struct m6502 *cpu, unsigned short addr, unsigned char data) { struct machine *oric = (struct machine *)cpu->userdata; - if (oric->twilighteboard_activated && addr >= 0xc000 ) + if(oric->twilighteboard_activated && addr >= 0xc000) twilighteboard_oric_ROM_RAM_write(oric->twilighte,addr-0xc000,data); - else - if( ( !oric->romdis ) && ( addr >= 0xc000 ) ) return; // Can't write to ROM! + else if((!oric->romdis) && (addr >= 0xc000)) return; // Can't write to ROM! - if( ( addr & 0xff00 ) == 0x0300 ) + if((addr & 0xff00) == 0x0300) { - if( oric->aciabackend && ( oric->aciaoffset <= addr && addr < oric->aciaoffset+4 ) ) - acia_write( &oric->tele_acia, addr, data ); + if(oric->aciabackend && (oric->aciaoffset <= addr && addr < oric->aciaoffset+4)) + acia_write(&oric->tele_acia, addr, data); - else if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) + else if(oric->ch376_activated && (0x340 <= addr) && (addr < 0x342)) ch376_oric_write(oric->ch376, addr, data); - else if(oric->twilighteboard_activated && ((0x342 <= addr && addr < 0x344 ) || (0x320 <= addr && addr < 0x330 ))) + else if(oric->twilighteboard_activated && ((0x342 <= addr && addr < 0x344) || (0x320 <= addr && addr < 0x330))) twilighteboard_oric_write(oric->twilighte,addr,0x00,data); - else if(oric->twilighteboard_activated && oric->twilighte->microdisc==SDL_TRUE && (0x310 <= addr && addr < 0x319 )) - { - if (addr==0x314) + else if(oric->twilighteboard_activated && oric->twilighte->microdisc==SDL_TRUE && (0x310 <= addr && addr < 0x319)) + { + if(addr==0x314) twilighteboard_oric_write(oric->twilighte,addr,0x00,data); - microdisc_write( &oric->md, addr, data ); - } + microdisc_write(&oric->md, addr, data); + } else - via_write( &oric->via, addr, data ); + via_write(&oric->via, addr, data); return; } @@ -348,20 +352,20 @@ void atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) } // Oric-1 16k CPU write -void o16kwrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) +void o16kwrite(struct m6502 *cpu, unsigned short addr, unsigned char data) { struct machine *oric = (struct machine *)cpu->userdata; - if( ( !oric->romdis ) && ( addr >= 0xc000 ) ) return; // Can't write to ROM! - if( ( addr & 0xff00 ) == 0x0300 ) + if((!oric->romdis) && (addr >= 0xc000)) return; // Can't write to ROM! + if((addr & 0xff00) == 0x0300) { - if( oric->aciabackend && ( oric->aciaoffset <= addr && addr < oric->aciaoffset+4 ) ) - acia_write( &oric->tele_acia, addr, data ); + if(oric->aciabackend && (oric->aciaoffset <= addr && addr < oric->aciaoffset+4)) + acia_write(&oric->tele_acia, addr, data); - else if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) + else if(oric->ch376_activated && (0x340 <= addr) && (addr < 0x342)) ch376_oric_write(oric->ch376, addr, data); else - via_write( &oric->via, addr, data ); + via_write(&oric->via, addr, data); return; } @@ -370,53 +374,53 @@ void o16kwrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) } // Oric Telestrat CPU write -void telestratwrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) +void telestratwrite(struct m6502 *cpu, unsigned short addr, unsigned char data) { struct machine *oric = (struct machine *)cpu->userdata; - if( addr >= 0xc000 ) + if(addr >= 0xc000) { -// if( oric->romdis ) -// { -// if( ( oric->md.diskrom ) && ( addr >= 0xe000 ) ) return; // Can't write to ROM! -// } else { - switch( oric->tele_banktype ) - { - case TELEBANK_HALFNHALF: - if( addr >= 0xe000 ) break; - case TELEBANK_RAM: - oric->rom[addr-0xc000] = data; - break; - } - return; -// } + // if( oric->romdis ) + // { + // if( ( oric->md.diskrom ) && ( addr >= 0xe000 ) ) return; // Can't write to ROM! + // } else { + switch(oric->tele_banktype) + { + case TELEBANK_HALFNHALF: + if(addr >= 0xe000) break; + case TELEBANK_RAM: + oric->rom[addr-0xc000] = data; + break; + } + return; + // } } - if( ( addr & 0xff00 ) == 0x0300 ) + if((addr & 0xff00) == 0x0300) { - switch( addr & 0x0f0 ) + switch(addr & 0x0f0) { case 0x20: - via_write( &oric->tele_via, addr, data ); + via_write(&oric->tele_via, addr, data); break; case 0x10: - if( addr >= 0x31c ) - acia_write( &oric->tele_acia, addr, data ); + if(addr >= 0x31c) + acia_write(&oric->tele_acia, addr, data); else - microdisc_write( &oric->md, addr, data ); + microdisc_write(&oric->md, addr, data); break; case 0x40: - if (oric->ch376_activated) + if(oric->ch376_activated) { - if (addr == 0x340 || addr == 0x341) + if(addr == 0x340 || addr == 0x341) ch376_oric_write(oric->ch376, addr, data); break; } default: - via_write( &oric->via, addr, data ); + via_write(&oric->via, addr, data); break; } return; @@ -426,33 +430,35 @@ void telestratwrite( struct m6502 *cpu, unsigned short addr, unsigned char data } // Oric Atmos + jasmin -void jasmin_atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) +void jasmin_atmoswrite(struct m6502 *cpu, unsigned short addr, unsigned char data) { struct machine *oric = (struct machine *)cpu->userdata; - if( oric->jasmin.olay == 0 ) + if(oric->jasmin.olay == 0) { - if( oric->romdis ) + if(oric->romdis) + { + if(addr >= 0xf800) return; // Can't write to jasmin rom + } + else { - if( addr >= 0xf800 ) return; // Can't write to jasmin rom - } else { - if( addr >= 0xc000 ) return; // Can't write to BASIC rom + if(addr >= 0xc000) return; // Can't write to BASIC rom } } - if( ( addr & 0xff00 ) == 0x0300 ) + if((addr & 0xff00) == 0x0300) { - if( ( addr >= 0x3f4 ) && ( addr < 0x400 ) ) - jasmin_write( &oric->jasmin, addr, data ); + if((addr >= 0x3f4) && (addr < 0x400)) + jasmin_write(&oric->jasmin, addr, data); - else if( oric->aciabackend && ( oric->aciaoffset <= addr && addr < oric->aciaoffset+4 ) ) - acia_write( &oric->tele_acia, addr, data ); + else if(oric->aciabackend && (oric->aciaoffset <= addr && addr < oric->aciaoffset+4)) + acia_write(&oric->tele_acia, addr, data); - else if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) + else if(oric->ch376_activated && (0x340 <= addr) && (addr < 0x342)) ch376_oric_write(oric->ch376, addr, data); else - via_write( &oric->via, addr, data ); + via_write(&oric->via, addr, data); return; } @@ -460,33 +466,35 @@ void jasmin_atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char da } // Oric-1 16k + jasmin -void jasmin_o16kwrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) +void jasmin_o16kwrite(struct m6502 *cpu, unsigned short addr, unsigned char data) { struct machine *oric = (struct machine *)cpu->userdata; - if( oric->jasmin.olay == 0 ) + if(oric->jasmin.olay == 0) { - if( oric->romdis ) + if(oric->romdis) + { + if(addr >= 0xf800) return; // Can't write to jasmin rom + } + else { - if( addr >= 0xf800 ) return; // Can't write to jasmin rom - } else { - if( addr >= 0xc000 ) return; // Can't write to BASIC rom + if(addr >= 0xc000) return; // Can't write to BASIC rom } } - if( ( addr & 0xff00 ) == 0x0300 ) + if((addr & 0xff00) == 0x0300) { - if( ( addr >= 0x3f4 ) && ( addr < 0x400 ) ) - jasmin_write( &oric->jasmin, addr, data ); + if((addr >= 0x3f4) && (addr < 0x400)) + jasmin_write(&oric->jasmin, addr, data); - else if( oric->aciabackend && ( oric->aciaoffset <= addr && addr < oric->aciaoffset+4 ) ) - acia_write( &oric->tele_acia, addr, data ); + else if(oric->aciabackend && (oric->aciaoffset <= addr && addr < oric->aciaoffset+4)) + acia_write(&oric->tele_acia, addr, data); - else if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) + else if(oric->ch376_activated && (0x340 <= addr) && (addr < 0x342)) ch376_oric_write(oric->ch376, addr, data); else - via_write( &oric->via, addr, data ); + via_write(&oric->via, addr, data); return; } @@ -495,29 +503,31 @@ void jasmin_o16kwrite( struct m6502 *cpu, unsigned short addr, unsigned char dat } // Oric Atmos + microdisc -void microdisc_atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) +void microdisc_atmoswrite(struct m6502 *cpu, unsigned short addr, unsigned char data) { struct machine *oric = (struct machine *)cpu->userdata; - if( oric->romdis ) + if(oric->romdis) { - if( ( oric->md.diskrom ) && ( addr >= 0xe000 ) ) return; // Can't write to ROM! - } else { - if( addr >= 0xc000 ) return; + if((oric->md.diskrom) && (addr >= 0xe000)) return; // Can't write to ROM! + } + else + { + if(addr >= 0xc000) return; } - if( ( addr & 0xff00 ) == 0x0300 ) + if((addr & 0xff00) == 0x0300) { - if( ( addr >= 0x310 ) && ( addr < 0x31c ) ) - microdisc_write( &oric->md, addr, data ); + if((addr >= 0x310) && (addr < 0x31c)) + microdisc_write(&oric->md, addr, data); - else if( oric->aciabackend && ( oric->aciaoffset <= addr && addr < oric->aciaoffset+4 ) ) - acia_write( &oric->tele_acia, addr, data ); + else if(oric->aciabackend && (oric->aciaoffset <= addr && addr < oric->aciaoffset+4)) + acia_write(&oric->tele_acia, addr, data); - else if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) + else if(oric->ch376_activated && (0x340 <= addr) && (addr < 0x342)) ch376_oric_write(oric->ch376, addr, data); else - via_write( &oric->via, addr, data ); + via_write(&oric->via, addr, data); return; } @@ -525,29 +535,31 @@ void microdisc_atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char } // Oric Atmos + bd500 -void bd500_atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) +void bd500_atmoswrite(struct m6502 *cpu, unsigned short addr, unsigned char data) { struct machine *oric = (struct machine *)cpu->userdata; - if( oric->romdis ) + if(oric->romdis) + { + if((oric->bd.diskrom) && (addr >= 0xc000)) return; // Can't write to ROM! + } + else { - if( ( oric->bd.diskrom ) && ( addr >= 0xc000 ) ) return; // Can't write to ROM! - } else { - if( addr >= 0xc000 ) return; + if(addr >= 0xc000) return; } - if( ( addr & 0xff00 ) == 0x0300 ) + if((addr & 0xff00) == 0x0300) { - if( ( addr >= 0x310 ) && ( addr < 0x324 ) ) - bd500_write( &oric->bd, addr, data ); + if((addr >= 0x310) && (addr < 0x324)) + bd500_write(&oric->bd, addr, data); - else if( oric->aciabackend && ( oric->aciaoffset <= addr && addr < oric->aciaoffset+4 ) ) - acia_write( &oric->tele_acia, addr, data ); + else if(oric->aciabackend && (oric->aciaoffset <= addr && addr < oric->aciaoffset+4)) + acia_write(&oric->tele_acia, addr, data); - else if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) + else if(oric->ch376_activated && (0x340 <= addr) && (addr < 0x342)) ch376_oric_write(oric->ch376, addr, data); else - via_write( &oric->via, addr, data ); + via_write(&oric->via, addr, data); return; } @@ -555,29 +567,31 @@ void bd500_atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char dat } // Oric-1 16k + microdisc -void microdisc_o16kwrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) +void microdisc_o16kwrite(struct m6502 *cpu, unsigned short addr, unsigned char data) { struct machine *oric = (struct machine *)cpu->userdata; - if( oric->romdis ) + if(oric->romdis) { - if( ( oric->md.diskrom ) && ( addr >= 0xe000 ) ) return; // Can't write to ROM! - } else { - if( addr >= 0xc000 ) return; + if((oric->md.diskrom) && (addr >= 0xe000)) return; // Can't write to ROM! + } + else + { + if(addr >= 0xc000) return; } - if( ( addr & 0xff00 ) == 0x0300 ) + if((addr & 0xff00) == 0x0300) { - if( ( addr >= 0x310 ) && ( addr < 0x31c ) ) - microdisc_write( &oric->md, addr, data ); + if((addr >= 0x310) && (addr < 0x31c)) + microdisc_write(&oric->md, addr, data); - else if( oric->aciabackend && ( oric->aciaoffset <= addr && addr < oric->aciaoffset+4 ) ) - acia_write( &oric->tele_acia, addr, data ); + else if(oric->aciabackend && (oric->aciaoffset <= addr && addr < oric->aciaoffset+4)) + acia_write(&oric->tele_acia, addr, data); - else if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) + else if(oric->ch376_activated && (0x340 <= addr) && (addr < 0x342)) ch376_oric_write(oric->ch376, addr, data); else - via_write( &oric->via, addr, data ); + via_write(&oric->via, addr, data); return; } @@ -585,29 +599,31 @@ void microdisc_o16kwrite( struct m6502 *cpu, unsigned short addr, unsigned char } // Oric-1 16k + bd500 -void bd500_o16kwrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) +void bd500_o16kwrite(struct m6502 *cpu, unsigned short addr, unsigned char data) { struct machine *oric = (struct machine *)cpu->userdata; - if( oric->romdis ) + if(oric->romdis) + { + if((oric->bd.diskrom) && (addr >= 0xc000)) return; // Can't write to ROM! + } + else { - if( ( oric->bd.diskrom ) && ( addr >= 0xc000 ) ) return; // Can't write to ROM! - } else { - if( addr >= 0xc000 ) return; + if(addr >= 0xc000) return; } - if( ( addr & 0xff00 ) == 0x0300 ) + if((addr & 0xff00) == 0x0300) { - if( ( addr >= 0x310 ) && ( addr < 0x324 ) ) - bd500_write( &oric->bd, addr, data ); + if((addr >= 0x310) && (addr < 0x324)) + bd500_write(&oric->bd, addr, data); - else if( oric->aciabackend && ( oric->aciaoffset <= addr && addr < oric->aciaoffset+4 ) ) - acia_write( &oric->tele_acia, addr, data ); + else if(oric->aciabackend && (oric->aciaoffset <= addr && addr < oric->aciaoffset+4)) + acia_write(&oric->tele_acia, addr, data); - else if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) + else if(oric->ch376_activated && (0x340 <= addr) && (addr < 0x342)) ch376_oric_write(oric->ch376, addr, data); else - via_write( &oric->via, addr, data ); + via_write(&oric->via, addr, data); return; } @@ -615,26 +631,26 @@ void bd500_o16kwrite( struct m6502 *cpu, unsigned short addr, unsigned char data } // Pravetz -void pravetz_atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char data ) +void pravetz_atmoswrite(struct m6502 *cpu, unsigned short addr, unsigned char data) { struct machine *oric = (struct machine *)cpu->userdata; oric->mem[addr] = data; - if( 0x300 <= addr && addr <= 0x30f ) + if(0x300 <= addr && addr <= 0x30f) { - via_write( &oric->via, addr, data ); + via_write(&oric->via, addr, data); } - else if( 0x310 <= addr && addr <= 0x31f ) + else if(0x310 <= addr && addr <= 0x31f) { - if( oric->aciabackend && oric->pravetz.extension == 0x100 ) - acia_write( &oric->tele_acia, addr, data ); + if(oric->aciabackend && oric->pravetz.extension == 0x100) + acia_write(&oric->tele_acia, addr, data); else - pravetz_write( &oric->pravetz, addr, data ); + pravetz_write(&oric->pravetz, addr, data); } - else if( 0x320 <= addr && addr <= 0x3ff ) + else if(0x320 <= addr && addr <= 0x3ff) { - switch( addr ) + switch(addr) { case 0x380: oric->pravetz.olay = 0; @@ -671,37 +687,37 @@ void pravetz_atmoswrite( struct m6502 *cpu, unsigned short addr, unsigned char d } // VIA is returned as RAM since it isn't ROM -SDL_bool isram( struct machine *oric, unsigned short addr ) +SDL_bool isram(struct machine *oric, unsigned short addr) { - if( addr < 0xc000 ) return SDL_TRUE; + if(addr < 0xc000) return SDL_TRUE; - if( oric->type == MACH_TELESTRAT ) + if(oric->type == MACH_TELESTRAT) { return oric->tele_banktype == TELEBANK_RAM; } - if( !oric->romdis ) return SDL_FALSE; + if(!oric->romdis) return SDL_FALSE; - switch( oric->drivetype ) + switch(oric->drivetype) { case DRV_MICRODISC: - if( !oric->md.diskrom ) return SDL_TRUE; - if( addr >= 0xe000 ) return SDL_FALSE; + if(!oric->md.diskrom) return SDL_TRUE; + if(addr >= 0xe000) return SDL_FALSE; break; case DRV_BD500: - if( !oric->bd.diskrom ) return SDL_TRUE; - if( addr >= 0xc000 ) return SDL_FALSE; + if(!oric->bd.diskrom) return SDL_TRUE; + if(addr >= 0xc000) return SDL_FALSE; break; case DRV_JASMIN: - if( oric->jasmin.olay ) return SDL_TRUE; - if( addr >= 0xf800 ) return SDL_FALSE; + if(oric->jasmin.olay) return SDL_TRUE; + if(addr >= 0xf800) return SDL_FALSE; break; case DRV_PRAVETZ: - if( oric->pravetz.olay ) return SDL_TRUE; - if( addr >= 0xc000 ) return SDL_FALSE; + if(oric->pravetz.olay) return SDL_TRUE; + if(addr >= 0xc000) return SDL_FALSE; break; } @@ -709,37 +725,38 @@ SDL_bool isram( struct machine *oric, unsigned short addr ) } // Oric Atmos CPU read -unsigned char atmosread( struct m6502 *cpu, unsigned short addr ) +unsigned char atmosread(struct m6502 *cpu, unsigned short addr) { struct machine *oric = (struct machine *)cpu->userdata; - if( ( addr & 0xff00 ) == 0x0300 ) + if((addr & 0xff00) == 0x0300) { - if( oric->aciabackend && ( oric->aciaoffset <= addr && addr < oric->aciaoffset+4 ) ) - return acia_read( &oric->tele_acia, addr ); + if(oric->aciabackend && (oric->aciaoffset <= addr && addr < oric->aciaoffset+4)) + return acia_read(&oric->tele_acia, addr); - if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) + if(oric->ch376_activated && (0x340 <= addr) && (addr < 0x342)) return ch376_oric_read(oric->ch376, addr); - if( oric->twilighteboard_activated) + if(oric->twilighteboard_activated) { - if ((0x342 <= addr && addr < 0x344 ) || (0x320 <= addr && addr < 0x330 )) + if((0x342 <= addr && addr < 0x344) || (0x320 <= addr && addr < 0x330)) return twilighteboard_oric_read(oric->twilighte,addr); - if (oric->twilighte->microdisc==SDL_TRUE) + if(oric->twilighte->microdisc==SDL_TRUE) { - if (0x310 <= addr && addr < 0x319) - return microdisc_read( &oric->md, addr ); + if(0x310 <= addr && addr < 0x319) + return microdisc_read(&oric->md, addr); } } - return via_read( &oric->via, addr ); + return via_read(&oric->via, addr); } - if( ( !oric->romdis ) && ( addr >= 0xc000 ) ) { + if((!oric->romdis) && (addr >= 0xc000)) + { - if (oric->twilighteboard_activated) + if(oric->twilighteboard_activated) return twilighteboard_oric_ROM_RAM_read(oric->twilighte,addr-0xc000); else return oric->rom[addr-0xc000]; @@ -748,290 +765,302 @@ unsigned char atmosread( struct m6502 *cpu, unsigned short addr ) } // Oric-1 16K CPU read -unsigned char o16kread( struct m6502 *cpu, unsigned short addr ) +unsigned char o16kread(struct m6502 *cpu, unsigned short addr) { struct machine *oric = (struct machine *)cpu->userdata; - if( ( addr & 0xff00 ) == 0x0300 ) + if((addr & 0xff00) == 0x0300) { - if( oric->aciabackend && ( oric->aciaoffset <= addr && addr < oric->aciaoffset+4 ) ) - return acia_read( &oric->tele_acia, addr ); + if(oric->aciabackend && (oric->aciaoffset <= addr && addr < oric->aciaoffset+4)) + return acia_read(&oric->tele_acia, addr); - if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) + if(oric->ch376_activated && (0x340 <= addr) && (addr < 0x342)) return ch376_oric_read(oric->ch376, addr); - return via_read( &oric->via, addr ); + return via_read(&oric->via, addr); } - if( ( !oric->romdis ) && ( addr >= 0xc000 ) ) + if((!oric->romdis) && (addr >= 0xc000)) return oric->rom[addr-0xc000]; return oric->mem[addr&0x3fff]; } // Oric Telestrat CPU read -unsigned char telestratread( struct m6502 *cpu, unsigned short addr ) +unsigned char telestratread(struct m6502 *cpu, unsigned short addr) { struct machine *oric = (struct machine *)cpu->userdata; - if( ( addr & 0xff00 ) == 0x0300 ) + if((addr & 0xff00) == 0x0300) { - switch( addr & 0x0f0 ) + switch(addr & 0x0f0) { case 0x010: - if( addr >= 0x31c ) + if(addr >= 0x31c) { - return acia_read( &oric->tele_acia, addr ); + return acia_read(&oric->tele_acia, addr); } - return microdisc_read( &oric->md, addr ); + return microdisc_read(&oric->md, addr); case 0x020: - return via_read( &oric->tele_via, addr ); + return via_read(&oric->tele_via, addr); case 0x040: - if (oric->ch376_activated) + if(oric->ch376_activated) { - if (addr == 0x340 || addr == 0x341) + if(addr == 0x340 || addr == 0x341) return ch376_oric_read(oric->ch376, addr); } } - return via_read( &oric->via, addr ); + return via_read(&oric->via, addr); } - if( addr >= 0xc000 ) + if(addr >= 0xc000) { -// if( oric->romdis ) -// { -// if( ( oric->md.diskrom ) && ( addr >= 0xe000 ) ) -// return rom_microdisc[addr-0xe000]; -// } else { - return oric->rom[addr-0xc000]; -// } + // if( oric->romdis ) + // { + // if( ( oric->md.diskrom ) && ( addr >= 0xe000 ) ) + // return rom_microdisc[addr-0xe000]; + // } else { + return oric->rom[addr-0xc000]; + // } } return oric->mem[addr]; } // Oric Atmos + jasmin -unsigned char jasmin_atmosread( struct m6502 *cpu, unsigned short addr ) +unsigned char jasmin_atmosread(struct m6502 *cpu, unsigned short addr) { struct machine *oric = (struct machine *)cpu->userdata; - if( oric->jasmin.olay == 0 ) + if(oric->jasmin.olay == 0) { - if( oric->romdis ) + if(oric->romdis) + { + if(addr >= 0xf800) return rom_jasmin[addr-0xf800]; + } + else { - if( addr >= 0xf800 ) return rom_jasmin[addr-0xf800]; - } else { - if( addr >= 0xc000 ) return oric->rom[addr-0xc000]; + if(addr >= 0xc000) return oric->rom[addr-0xc000]; } } - if( ( addr & 0xff00 ) == 0x0300 ) + if((addr & 0xff00) == 0x0300) { - if( ( addr >= 0x3f4 ) && ( addr < 0x400 ) ) - return jasmin_read( &oric->jasmin, addr ); + if((addr >= 0x3f4) && (addr < 0x400)) + return jasmin_read(&oric->jasmin, addr); - if( oric->aciabackend && ( oric->aciaoffset <= addr && addr < oric->aciaoffset+4 ) ) - return acia_read( &oric->tele_acia, addr ); + if(oric->aciabackend && (oric->aciaoffset <= addr && addr < oric->aciaoffset+4)) + return acia_read(&oric->tele_acia, addr); - if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) + if(oric->ch376_activated && (0x340 <= addr) && (addr < 0x342)) return ch376_oric_read(oric->ch376, addr); - return via_read( &oric->via, addr ); + return via_read(&oric->via, addr); } return oric->mem[addr]; } // Oric 16k + jasmin -unsigned char jasmin_o16kread( struct m6502 *cpu, unsigned short addr ) +unsigned char jasmin_o16kread(struct m6502 *cpu, unsigned short addr) { struct machine *oric = (struct machine *)cpu->userdata; - if( oric->jasmin.olay == 0 ) + if(oric->jasmin.olay == 0) { - if( oric->romdis ) + if(oric->romdis) { - if( addr >= 0xf800 ) return rom_jasmin[addr-0xf800]; - } else { - if( addr >= 0xc000 ) return oric->rom[addr-0xc000]; + if(addr >= 0xf800) return rom_jasmin[addr-0xf800]; + } + else + { + if(addr >= 0xc000) return oric->rom[addr-0xc000]; } } - if( ( addr & 0xff00 ) == 0x0300 ) + if((addr & 0xff00) == 0x0300) { - if( ( addr >= 0x3f4 ) && ( addr < 0x400 ) ) - return jasmin_read( &oric->jasmin, addr ); + if((addr >= 0x3f4) && (addr < 0x400)) + return jasmin_read(&oric->jasmin, addr); - if( oric->aciabackend && ( oric->aciaoffset <= addr && addr < oric->aciaoffset+4 ) ) - return acia_read( &oric->tele_acia, addr ); + if(oric->aciabackend && (oric->aciaoffset <= addr && addr < oric->aciaoffset+4)) + return acia_read(&oric->tele_acia, addr); - if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) + if(oric->ch376_activated && (0x340 <= addr) && (addr < 0x342)) return ch376_oric_read(oric->ch376, addr); - return via_read( &oric->via, addr ); + return via_read(&oric->via, addr); } return oric->mem[addr&0x3fff]; } // Oric Atmos + microdisc -unsigned char microdisc_atmosread( struct m6502 *cpu, unsigned short addr ) +unsigned char microdisc_atmosread(struct m6502 *cpu, unsigned short addr) { struct machine *oric = (struct machine *)cpu->userdata; - if( oric->romdis ) + if(oric->romdis) { - if( ( oric->md.diskrom ) && ( addr >= 0xe000 ) ) + if((oric->md.diskrom) && (addr >= 0xe000)) return rom_microdisc[addr-0xe000]; - } else { - if( addr >= 0xc000 ) + } + else + { + if(addr >= 0xc000) return oric->rom[addr-0xc000]; } - if( ( addr & 0xff00 ) == 0x0300 ) + if((addr & 0xff00) == 0x0300) { - if( ( addr >= 0x310 ) && ( addr < 0x31c ) ) - return microdisc_read( &oric->md, addr ); + if((addr >= 0x310) && (addr < 0x31c)) + return microdisc_read(&oric->md, addr); - if( oric->aciabackend && ( oric->aciaoffset <= addr && addr < oric->aciaoffset+4 ) ) - return acia_read( &oric->tele_acia, addr ); + if(oric->aciabackend && (oric->aciaoffset <= addr && addr < oric->aciaoffset+4)) + return acia_read(&oric->tele_acia, addr); - if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) + if(oric->ch376_activated && (0x340 <= addr) && (addr < 0x342)) return ch376_oric_read(oric->ch376, addr); - return via_read( &oric->via, addr ); + return via_read(&oric->via, addr); } return oric->mem[addr]; } // Oric Atmos + bd500 -unsigned char bd500_atmosread( struct m6502 *cpu, unsigned short addr ) +unsigned char bd500_atmosread(struct m6502 *cpu, unsigned short addr) { struct machine *oric = (struct machine *)cpu->userdata; - if( oric->romdis ) + if(oric->romdis) { - if( ( oric->bd.diskrom ) && ( addr >= 0xe000 ) ) + if((oric->bd.diskrom) && (addr >= 0xe000)) return rom_bd500[addr-0xe000]; - } else { - if( addr >= 0xc000 ) + } + else + { + if(addr >= 0xc000) return oric->rom[addr-0xc000]; } - if( ( addr & 0xff00 ) == 0x0300 ) + if((addr & 0xff00) == 0x0300) { - if( ( addr >= 0x310 ) && ( addr < 0x324 ) ) - return bd500_read( &oric->bd, addr ); + if((addr >= 0x310) && (addr < 0x324)) + return bd500_read(&oric->bd, addr); - if( oric->aciabackend && ( oric->aciaoffset <= addr && addr < oric->aciaoffset+4 ) ) - return acia_read( &oric->tele_acia, addr ); + if(oric->aciabackend && (oric->aciaoffset <= addr && addr < oric->aciaoffset+4)) + return acia_read(&oric->tele_acia, addr); - if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) + if(oric->ch376_activated && (0x340 <= addr) && (addr < 0x342)) return ch376_oric_read(oric->ch376, addr); - return via_read( &oric->via, addr ); + return via_read(&oric->via, addr); } return oric->mem[addr]; } // Oric-1 16k + microdisc -unsigned char microdisc_o16kread( struct m6502 *cpu, unsigned short addr ) +unsigned char microdisc_o16kread(struct m6502 *cpu, unsigned short addr) { struct machine *oric = (struct machine *)cpu->userdata; - if( oric->romdis ) + if(oric->romdis) { - if( ( oric->md.diskrom ) && ( addr >= 0xe000 ) ) + if((oric->md.diskrom) && (addr >= 0xe000)) return rom_microdisc[addr-0xe000]; - } else { - if( addr >= 0xc000 ) + } + else + { + if(addr >= 0xc000) return oric->rom[addr-0xc000]; } - if( ( addr & 0xff00 ) == 0x0300 ) + if((addr & 0xff00) == 0x0300) { - if( ( addr >= 0x310 ) && ( addr < 0x31c ) ) - return microdisc_read( &oric->md, addr ); + if((addr >= 0x310) && (addr < 0x31c)) + return microdisc_read(&oric->md, addr); - if( oric->aciabackend && ( oric->aciaoffset <= addr && addr < oric->aciaoffset+4 ) ) - return acia_read( &oric->tele_acia, addr ); + if(oric->aciabackend && (oric->aciaoffset <= addr && addr < oric->aciaoffset+4)) + return acia_read(&oric->tele_acia, addr); - if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) + if(oric->ch376_activated && (0x340 <= addr) && (addr < 0x342)) return ch376_oric_read(oric->ch376, addr); - return via_read( &oric->via, addr ); + return via_read(&oric->via, addr); } return oric->mem[addr&0x3fff]; } // Oric-1 16k + bd500 -unsigned char bd500_o16kread( struct m6502 *cpu, unsigned short addr ) +unsigned char bd500_o16kread(struct m6502 *cpu, unsigned short addr) { struct machine *oric = (struct machine *)cpu->userdata; - if( oric->romdis ) + if(oric->romdis) { - if( ( oric->bd.diskrom ) && ( addr >= 0xe000 ) ) + if((oric->bd.diskrom) && (addr >= 0xe000)) return rom_bd500[addr-0xe000]; - } else { - if( addr >= 0xc000 ) + } + else + { + if(addr >= 0xc000) return oric->rom[addr-0xc000]; } - if( ( addr & 0xff00 ) == 0x0300 ) + if((addr & 0xff00) == 0x0300) { - if( ( addr >= 0x310 ) && ( addr < 0x324 ) ) - return bd500_read( &oric->bd, addr ); + if((addr >= 0x310) && (addr < 0x324)) + return bd500_read(&oric->bd, addr); - if( oric->aciabackend && ( oric->aciaoffset <= addr && addr < oric->aciaoffset+4 ) ) - return acia_read( &oric->tele_acia, addr ); + if(oric->aciabackend && (oric->aciaoffset <= addr && addr < oric->aciaoffset+4)) + return acia_read(&oric->tele_acia, addr); - if( oric->ch376_activated && ( 0x340 <= addr ) && ( addr < 0x342 ) ) + if(oric->ch376_activated && (0x340 <= addr) && (addr < 0x342)) return ch376_oric_read(oric->ch376, addr); - return via_read( &oric->via, addr ); + return via_read(&oric->via, addr); } return oric->mem[addr&0x3fff]; } // Pravetz -unsigned char pravetz_atmosread( struct m6502 *cpu, unsigned short addr ) +unsigned char pravetz_atmosread(struct m6502 *cpu, unsigned short addr) { struct machine *oric = (struct machine *)cpu->userdata; - if( 0x300 == ( addr & 0xfff0 ) ) + if(0x300 == (addr & 0xfff0)) { - return via_read( &oric->via, addr ); + return via_read(&oric->via, addr); } - if( 0x310 == ( addr & 0xfff0 ) ) + if(0x310 == (addr & 0xfff0)) { - if( oric->aciabackend && oric->pravetz.extension == 0x100 ) - return acia_read( &oric->tele_acia, addr ); + if(oric->aciabackend && oric->pravetz.extension == 0x100) + return acia_read(&oric->tele_acia, addr); else - return pravetz_read( &oric->pravetz, addr ); + return pravetz_read(&oric->pravetz, addr); } - if( 0x320 <= addr && addr <= 0x3ff ) + if(0x320 <= addr && addr <= 0x3ff) { - if( pravetzrom_valid ) + if(pravetzrom_valid) { return rom_pravetz[addr - 0x300 + oric->pravetz.extension]; } } - if( 0xc000 <= addr /* 0xFFFF */) + if(0xc000 <= addr /* 0xFFFF */) { - if( !oric->pravetz.olay ) + if(!oric->pravetz.olay) { return oric->rom[addr-0xc000]; } @@ -1041,46 +1070,46 @@ unsigned char pravetz_atmosread( struct m6502 *cpu, unsigned short addr ) } /* Wrapper for the above when lightpen is enabled */ -unsigned char lightpen_read( struct m6502 *cpu, unsigned short addr ) +unsigned char lightpen_read(struct m6502 *cpu, unsigned short addr) { struct machine *oric = (struct machine *)cpu->userdata; - if( addr == 0x3e0 ) return oric->lightpenx; - if( addr == 0x3e1 ) return oric->lightpeny; + if(addr == 0x3e0) return oric->lightpenx; + if(addr == 0x3e1) return oric->lightpeny; - return oric->read_not_lightpen( cpu, addr ); + return oric->read_not_lightpen(cpu, addr); } -static SDL_bool load_rom( struct machine *oric, char *fname, int size, unsigned char *where, struct symboltable *stab, int symflags ) +static SDL_bool load_rom(struct machine *oric, char* fname, int size, unsigned char* where, struct symboltable *stab, int symflags) { SDL_RWops *f; - char *tmpname; + char* tmpname; // MinGW doesn't have asprintf :-( - tmpname = malloc( strlen( fname ) + 10 ); - if( !tmpname ) return SDL_FALSE; + tmpname = malloc(strlen(fname) + 10); + if(!tmpname) return SDL_FALSE; - sprintf( tmpname, "%s.rom", fname ); - f = SDL_RWFromFile( tmpname, "rb" ); - if( !f ) + sprintf(tmpname, "%s.rom", fname); + f = SDL_RWFromFile(tmpname, "rb"); + if(!f) { - error_printf( "Unable to open '%s'\n", tmpname ); - free( tmpname ); + error_printf("Unable to open '%s'\n", tmpname); + free(tmpname); return SDL_FALSE; } - if( size < 0 ) + if(size < 0) { int filesize; - SDL_RWseek( f, 0, SEEK_END ); - filesize = SDL_RWtell( f ); - SDL_RWseek( f, 0, SEEK_SET ); + SDL_RWseek(f, 0, SEEK_END); + filesize = SDL_RWtell(f); + SDL_RWseek(f, 0, SEEK_SET); - if( filesize > -size ) + if(filesize > -size) { - error_printf( "ROM '%s' exceeds %d bytes.\n", fname, -size ); - SDL_RWclose( f ); - free( tmpname ); + error_printf("ROM '%s' exceeds %d bytes.\n", fname, -size); + SDL_RWclose(f); + free(tmpname); return SDL_FALSE; } @@ -1088,39 +1117,39 @@ static SDL_bool load_rom( struct machine *oric, char *fname, int size, unsigned size = filesize; } - if( SDL_RWread( f, where, size, 1 ) != 1 ) + if(SDL_RWread(f, where, size, 1) != 1) { - error_printf( "Unable to read '%s'\n", tmpname ); - SDL_RWclose( f ); - free( tmpname ); + error_printf("Unable to read '%s'\n", tmpname); + SDL_RWclose(f); + free(tmpname); return SDL_FALSE; } - SDL_RWclose( f ); + SDL_RWclose(f); #ifndef WWW_NO_MONITOR - sprintf( tmpname, "%s.sym", fname ); - mon_new_symbols( stab, oric, tmpname, symflags, SDL_FALSE, SDL_FALSE ); - free( tmpname ); + sprintf(tmpname, "%s.sym", fname); + mon_new_symbols(stab, oric, tmpname, symflags, SDL_FALSE, SDL_FALSE); + free(tmpname); #endif return SDL_TRUE; } -void preinit_machine( struct machine *oric ) +void preinit_machine(struct machine *oric) { int i; #ifndef WWW_NO_MONITOR - mon_init_symtab( &sym_microdisc ); - mon_init_symtab( &sym_jasmin ); - mon_init_symtab( &oric->romsyms ); - mon_init_symtab( &oric->tele_banksyms[0] ); - mon_init_symtab( &oric->tele_banksyms[1] ); - mon_init_symtab( &oric->tele_banksyms[2] ); - mon_init_symtab( &oric->tele_banksyms[3] ); - mon_init_symtab( &oric->tele_banksyms[4] ); - mon_init_symtab( &oric->tele_banksyms[5] ); - mon_init_symtab( &oric->tele_banksyms[6] ); - mon_init_symtab( &oric->tele_banksyms[7] ); + mon_init_symtab(&sym_microdisc); + mon_init_symtab(&sym_jasmin); + mon_init_symtab(&oric->romsyms); + mon_init_symtab(&oric->tele_banksyms[0]); + mon_init_symtab(&oric->tele_banksyms[1]); + mon_init_symtab(&oric->tele_banksyms[2]); + mon_init_symtab(&oric->tele_banksyms[3]); + mon_init_symtab(&oric->tele_banksyms[4]); + mon_init_symtab(&oric->tele_banksyms[5]); + mon_init_symtab(&oric->tele_banksyms[6]); + mon_init_symtab(&oric->tele_banksyms[7]); #endif oric->mem = NULL; @@ -1184,7 +1213,7 @@ void preinit_machine( struct machine *oric ) oric->kbjoy2[6] = 0; oric->drivetype = DRV_NONE; - for( i=0; iwddisk.disk[i] = NULL; oric->diskname[i][0] = 0; @@ -1217,49 +1246,62 @@ void preinit_machine( struct machine *oric ) oric->pravdiskautoboot = SDL_TRUE; } -void load_diskroms( struct machine *oric ) +void load_diskroms(struct machine *oric) { - microdiscrom_valid = load_rom( oric, mdiscromfile, 8192, rom_microdisc, &sym_microdisc, SYMF_ROMDIS1|SYMF_MICRODISC ); - bd500rom_valid = load_rom( oric, bd500romfile, 8192, rom_bd500, &sym_bd500, SYMF_ROMDIS1|SYMF_BD500 ); - jasminrom_valid = load_rom( oric, jasmnromfile, 2048, rom_jasmin, &sym_jasmin, SYMF_ROMDIS1|SYMF_JASMIN ); - pravetzrom_valid = load_rom( oric, pravetzromfile[1], 512, rom_pravetz, &sym_pravetz, SYMF_PRAVZ8D ); + microdiscrom_valid = load_rom(oric, mdiscromfile, 8192, rom_microdisc, &sym_microdisc, SYMF_ROMDIS1|SYMF_MICRODISC); + bd500rom_valid = load_rom(oric, bd500romfile, 8192, rom_bd500, &sym_bd500, SYMF_ROMDIS1|SYMF_BD500); + jasminrom_valid = load_rom(oric, jasmnromfile, 2048, rom_jasmin, &sym_jasmin, SYMF_ROMDIS1|SYMF_JASMIN); + pravetzrom_valid = load_rom(oric, pravetzromfile[1], 512, rom_pravetz, &sym_pravetz, SYMF_PRAVZ8D); } // This is currently used to workaround a change in the behaviour of SDL // on OS4, but in future it would be a handy place to fix keyboard layout // issues, such as the problems with a non-uk keymap on linux. // Also helps German keymap on MorphOS. -int mapkey( struct machine *oric, int key ) +int mapkey(struct machine *oric, int key) { - switch( key ) + switch(key) { #if defined(__amigaos4__) || defined(__MORPHOS__) || defined(__AROS__) case '\xF6': - case ':': return ';'; - case '<': return ','; - case '>': return '.'; + case ':': + return ';'; + case '<': + return ','; + case '>': + return '.'; case '\xDF': - case '?': return '/'; + case '?': + return '/'; case '@': case '#': - case '~': return '\''; - case '_': return '-'; - case '+': return '='; + case '~': + return '\''; + case '_': + return '-'; + case '+': + return '='; case '\xE4': - case '{': return '['; + case '{': + return '['; case '\xFC': - case '}': return ']'; - case '^': return '\\'; + case '}': + return ']'; + case '^': + return '\\'; #elif defined(WIN32) - case '<': return '\\'; + case '<': + return '\\'; #endif } - if (oric->keyboard_mapping.nb_map != 0) { + if(oric->keyboard_mapping.nb_map != 0) + { int i; - for(i=0; i < oric->keyboard_mapping.nb_map; i++) { - if (key == oric->keyboard_mapping.host_keys[i]) - return oric->keyboard_mapping.oric_keys[i]; + for(i=0; i < oric->keyboard_mapping.nb_map; i++) + { + if(key == oric->keyboard_mapping.host_keys[i]) + return oric->keyboard_mapping.oric_keys[i]; } } @@ -1267,11 +1309,11 @@ int mapkey( struct machine *oric, int key ) } static SDL_bool lightpendown = SDL_FALSE; -void move_lightpen( struct machine *oric, int x, int y ) +void move_lightpen(struct machine *oric, int x, int y) { - if (!lightpendown) return; + if(!lightpendown) return; - if ((oric->rendermode == RENDERMODE_SW) || (!oric->hstretch)) + if((oric->rendermode == RENDERMODE_SW) || (!oric->hstretch)) { x = (x-80)/2; if(oric->rendermode == RENDERMODE_GL && oric->aratio && oric->vid_freq) @@ -1289,9 +1331,9 @@ void move_lightpen( struct machine *oric, int x, int y ) y = (y-14)/2; } - if ((x>=0) && (x<240) && (y>=0) && (y<224)) + if((x>=0) && (x<240) && (y>=0) && (y<224)) { - if (oric->scr[y*240+x] != 0) + if(oric->scr[y*240+x] != 0) { oric->lightpenx = (x+219)&0xff; oric->lightpeny = (y+54)&0xff; @@ -1300,62 +1342,62 @@ void move_lightpen( struct machine *oric, int x, int y ) } static SDL_bool shifted = SDL_FALSE; -SDL_bool emu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) +SDL_bool emu_event(SDL_Event *ev, struct machine *oric, SDL_bool *needrender) { Sint32 i; - if( joy_filter_event( ev, oric ) ) + if(joy_filter_event(ev, oric)) return SDL_FALSE; -// char stmp[32]; - switch( ev->type ) + // char stmp[32]; + switch(ev->type) { case SDL_MOUSEBUTTONDOWN: - switch (ev->button.button) + switch(ev->button.button) { case SDL_BUTTON_LEFT: lightpendown = SDL_TRUE; - move_lightpen( oric, ev->button.x, ev->button.y ); + move_lightpen(oric, ev->button.x, ev->button.y); break; case SDL_BUTTON_RIGHT: - setemumode( oric, NULL, EM_MENU ); + setemumode(oric, NULL, EM_MENU); *needrender = SDL_TRUE; break; } break; case SDL_MOUSEBUTTONUP: - if( ev->button.button == SDL_BUTTON_LEFT ) + if(ev->button.button == SDL_BUTTON_LEFT) lightpendown = SDL_FALSE; break; case SDL_MOUSEMOTION: - move_lightpen( oric, ev->motion.x, ev->motion.y ); + move_lightpen(oric, ev->motion.x, ev->motion.y); break; #ifdef WWW case SDL_MULTIGESTURE: { SDL_MultiGestureEvent *m = (SDL_MultiGestureEvent*)ev; - if (m->numFingers == 2) + if(m->numFingers == 2) { - setemumode( oric, NULL, EM_MENU ); + setemumode(oric, NULL, EM_MENU); *needrender = SDL_TRUE; } break; } #endif - case SDL_KEYUP: - switch( ev->key.keysym.sym ) + case SDL_KEYUP: + switch(ev->key.keysym.sym) { case SDLK_F1: - setemumode( oric, NULL, EM_MENU ); + setemumode(oric, NULL, EM_MENU); *needrender = SDL_TRUE; break; case SDLK_F2: - setemumode( oric, NULL, EM_DEBUG ); + setemumode(oric, NULL, EM_DEBUG); *needrender = SDL_TRUE; break; @@ -1364,57 +1406,57 @@ SDL_bool emu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) break; case SDLK_F4: - if( ( shifted ) && ( oric->drivetype == DRV_JASMIN ) ) + if((shifted) && (oric->drivetype == DRV_JASMIN)) { // ROMDIS - oric->cpu.write( &oric->cpu, 0x3fb, 1 ); + oric->cpu.write(&oric->cpu, 0x3fb, 1); } - if( oric->drivetype == DRV_MICRODISC ) + if(oric->drivetype == DRV_MICRODISC) { oric->romdis = SDL_TRUE; - microdisc_init( &oric->md, &oric->wddisk, oric ); + microdisc_init(&oric->md, &oric->wddisk, oric); } - else if( oric->drivetype == DRV_BD500 ) + else if(oric->drivetype == DRV_BD500) { oric->romdis = SDL_TRUE; - bd500_init( &oric->bd, &oric->wddisk, oric ); + bd500_init(&oric->bd, &oric->wddisk, oric); } - else if( oric->drivetype == DRV_PRAVETZ ) + else if(oric->drivetype == DRV_PRAVETZ) { oric->pravetz.olay = 0; oric->pravetz.romdis = 1; oric->pravetz.extension = 0; oric->romdis = !oric->pravetz.romdis; } - setromon( oric ); - m6502_reset( &oric->cpu ); - via_init( &oric->via, oric, VIA_MAIN ); - via_init( &oric->tele_via, oric, VIA_TELESTRAT ); - acia_init( &oric->tele_acia, oric ); + setromon(oric); + m6502_reset(&oric->cpu); + via_init(&oric->via, oric, VIA_MAIN); + via_init(&oric->tele_via, oric, VIA_TELESTRAT); + acia_init(&oric->tele_acia, oric); - if (oric->twilighteboard_activated) + if(oric->twilighteboard_activated) { oric->ch376_activated=SDL_TRUE; oric->twilighte=twilighte_oric_init(); - if (oric->twilighte->microdisc==SDL_TRUE) + if(oric->twilighte->microdisc==SDL_TRUE) { oric->drivetype = DRV_MICRODISC; oric->disksyms = NULL; - microdisc_init( &oric->md, &oric->wddisk, oric ); + microdisc_init(&oric->md, &oric->wddisk, oric); } } - if (oric->twilighte==NULL) + if(oric->twilighte==NULL) { oric->twilighteboard_activated=SDL_FALSE; } else oric->ch376_activated=SDL_TRUE; - if (oric->ch376_activated) + if(oric->ch376_activated) { oric->ch376 = ch376_oric_init(); - if (oric->ch376 != NULL) + if(oric->ch376 != NULL) ch376_oric_config(oric->ch376); } break; @@ -1427,31 +1469,31 @@ SDL_bool emu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) break; case SDLK_F6: - warpspeed = ( vidcap || warpspeed )? SDL_FALSE : SDL_TRUE; + warpspeed = (vidcap || warpspeed)? SDL_FALSE : SDL_TRUE; - if( soundavailable && soundon ) + if(soundavailable && soundon) { - ay_flushlog( &oric->ay ); + ay_flushlog(&oric->ay); oric->ay.soundon = !warpspeed; - SDL_PauseAudio( warpspeed ); + SDL_PauseAudio(warpspeed); } break; case SDLK_F7: - if( oric->drivetype == DRV_NONE ) break; + if(oric->drivetype == DRV_NONE) break; - for( i=0; i<4; i++ ) + for(i=0; i<4; i++) { - if( ( oric->wddisk.disk[i] ) && ( oric->wddisk.disk[i]->modified ) ) + if((oric->wddisk.disk[i]) && (oric->wddisk.disk[i]->modified)) { - if( shifted ) + if(shifted) { char frname[64]; - char *dpath, *dfile; + char* dpath, *dfile; - if( oric->type != MACH_TELESTRAT ) + if(oric->type != MACH_TELESTRAT) { - switch (oric->drivetype) + switch(oric->drivetype) { case DRV_PRAVETZ: dpath = pravdiskpath; @@ -1463,109 +1505,114 @@ SDL_bool emu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) dfile = diskfile; break; } - } else { + } + else + { dpath = telediskpath; dfile = telediskfile; } - sprintf( frname, "Save disk %d", i ); - if( filerequester( oric, frname, dpath, dfile, FR_DISKSAVE ) ) + sprintf(frname, "Save disk %d", i); + if(filerequester(oric, frname, dpath, dfile, FR_DISKSAVE)) { - joinpath( dpath, dfile ); - diskimage_save( oric, filetmp, i ); + joinpath(dpath, dfile); + diskimage_save(oric, filetmp, i); } - } else { - diskimage_save( oric, oric->wddisk.disk[i]->filename, i ); + } + else + { + diskimage_save(oric, oric->wddisk.disk[i]->filename, i); } } } break; case SDLK_F8: - togglefullscreen( oric, NULL, 0 ); + togglefullscreen(oric, NULL, 0); break; case SDLK_F9: - toggletapecap( oric, find_item_by_function(mainitems, toggletapecap), 0 ); + toggletapecap(oric, find_item_by_function(mainitems, toggletapecap), 0); break; case SDLK_F10: #ifndef __ANDROID__ - if( vidcap ) - { - ay_lockaudio( &oric->ay ); - avi_close( &vidcap ); - ay_unlockaudio( &oric->ay ); - do_popup( oric, "AVI capture stopped" ); - refreshavi = SDL_TRUE; - break; - } - - sprintf( vidcapname, "Capturing to video%02d.avi", vidcapcount ); - warpspeed = SDL_FALSE; - ay_lockaudio( &oric->ay ); - vidcap = avi_open( &vidcapname[13], oricpalette, soundavailable&&soundon, oric->vid_freq ); - ay_unlockaudio( &oric->ay ); - if( vidcap ) - { - vidcapcount++; - do_popup( oric, vidcapname ); - } - refreshavi = SDL_TRUE; + if(vidcap) + { + ay_lockaudio(&oric->ay); + avi_close(&vidcap); + ay_unlockaudio(&oric->ay); + do_popup(oric, "AVI capture stopped"); + refreshavi = SDL_TRUE; + break; + } + + sprintf(vidcapname, "Capturing to video%02d.avi", vidcapcount); + warpspeed = SDL_FALSE; + ay_lockaudio(&oric->ay); + vidcap = avi_open(&vidcapname[13], oricpalette, soundavailable&&soundon, oric->vid_freq); + ay_unlockaudio(&oric->ay); + if(vidcap) + { + vidcapcount++; + do_popup(oric, vidcapname); + } + refreshavi = SDL_TRUE; #else - android_togglekeyboard( oric ); + android_togglekeyboard(oric); #endif - break; + break; #ifdef __CBCOPY__ case SDLK_F11: - clipboard_copy( oric ); + clipboard_copy(oric); break; #endif #ifdef __CBPASTE__ case SDLK_F12: - clipboard_paste( oric ); + clipboard_paste(oric); break; #endif #ifdef __amigaos4__ case SDLK_HELP: - IDOS->SystemTags( "Multiview Oricutron.guide", - SYS_Input, IDOS->Open( "NIL:", MODE_NEWFILE ), - SYS_Output, IDOS->Open( "NIL:", MODE_NEWFILE ), - SYS_Asynch, TRUE, - TAG_DONE ); - break; + IDOS->SystemTags("Multiview Oricutron.guide", + SYS_Input, IDOS->Open("NIL:", MODE_NEWFILE), + SYS_Output, IDOS->Open("NIL:", MODE_NEWFILE), + SYS_Asynch, TRUE, + TAG_DONE); + break; #endif #ifdef __MORPHOS__ case SDLK_HELP: - { - struct NewAmigaGuide nag = - { (BPTR) NULL, - "Oricutron.guide", - NULL, - NULL, - NULL, - NULL, - NULL, - 0, - NULL, - "MAIN", - 0, - NULL, - NULL - }; - - OpenAmigaGuide(&nag, TAG_DONE); - } - break; + { + struct NewAmigaGuide nag = + { + (BPTR) NULL, + "Oricutron.guide", + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + "MAIN", + 0, + NULL, + NULL + }; + + OpenAmigaGuide(&nag, TAG_DONE); + } + break; #endif case SDLK_PRINT: - sprintf( screencapname, "Capturing to screenshot%02d.bmp", screencapcount ); + sprintf(screencapname, "Capturing to screenshot%02d.bmp", screencapcount); screencapcount++; - do_popup( oric, screencapname ); - SDL_COMPAT_TakeScreenshot( &screencapname[13] ); + do_popup(oric, screencapname); + SDL_COMPAT_TakeScreenshot(&screencapname[13]); break; case SDLK_LSHIFT: @@ -1573,20 +1620,20 @@ SDL_bool emu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) shifted = SDL_FALSE; default: - ay_keypress( &oric->ay, mapkey( oric, ev->key.keysym.sym ), SDL_FALSE ); + ay_keypress(&oric->ay, mapkey(oric, ev->key.keysym.sym), SDL_FALSE); break; } break; case SDL_KEYDOWN: - switch( ev->key.keysym.sym ) + switch(ev->key.keysym.sym) { case SDLK_LSHIFT: case SDLK_RSHIFT: shifted = SDL_TRUE; default: - ay_keypress( &oric->ay, mapkey( oric, ev->key.keysym.sym ), SDL_TRUE ); + ay_keypress(&oric->ay, mapkey(oric, ev->key.keysym.sym), SDL_TRUE); break; } break; @@ -1595,16 +1642,16 @@ SDL_bool emu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) return SDL_FALSE; } -void blank_ram( Sint32 how, Uint8 *mem, Uint32 size ) +void blank_ram(Sint32 how, Uint8 *mem, Uint32 size) { Uint32 i, j; - switch( how ) + switch(how) { case 0: - for( i=0; ipch_fd_cload_getname_pc = -1; oric->pch_fd_csave_getname_pc = -1; @@ -1648,14 +1695,15 @@ void clear_patches( struct machine *oric ) oric->keymap = KMAP_QWERTY; } -static char *keymapnames[] = { "qwerty", +static char* keymapnames[] = { "qwerty", "azerty", "qwertz", - NULL }; + NULL + }; static Uint8 hex2bin(char c) { - return ( ('0' <= c && c <= '9')? (c - '0') : (10 + (toupper(c) - 'A')) ); + return (('0' <= c && c <= '9')? (c - '0') : (10 + (toupper(c) - 'A'))); } static Uint8 hex2byte(char* s) @@ -1675,48 +1723,48 @@ static SDL_bool ishexchar(char c) return SDL_FALSE; } -void load_patches( struct machine *oric, char *fname ) +void load_patches(struct machine *oric, char* fname) { FILE *f; Sint32 i; - char *tmpname; + char* tmpname; // MinGW doesn't have asprintf :-( - tmpname = malloc( strlen( fname ) + 10 ); - if( !tmpname ) return; - - sprintf( tmpname, "%s.pch", fname ); - - f = fopen( tmpname, "r" ); - free( tmpname ); - if( !f ) return; - - while( !feof( f ) ) - { - if( !fgets( filetmp, 2048, f ) ) break; - - for( i=0; isws( filetmp[i] ); i++ ) ; - - if( read_config_int( &filetmp[i], "fd_cload_getname_pc", &oric->pch_fd_cload_getname_pc, 0, 65535 ) ) continue; - if( read_config_int( &filetmp[i], "fd_csave_getname_pc", &oric->pch_fd_csave_getname_pc, 0, 65535 ) ) continue; - if( read_config_int( &filetmp[i], "fd_store_getname_pc", &oric->pch_fd_store_getname_pc, 0, 65535 ) ) continue; - if( read_config_int( &filetmp[i], "fd_recall_getname_pc", &oric->pch_fd_recall_getname_pc, 0, 65535 ) ) continue; - if( read_config_int( &filetmp[i], "fd_getname_addr", &oric->pch_fd_getname_addr, 0, 65535 ) ) continue; - if( read_config_int( &filetmp[i], "tt_getsync_pc", &oric->pch_tt_getsync_pc, 0, 65535 ) ) continue; - if( read_config_int( &filetmp[i], "tt_getsync_end_pc", &oric->pch_tt_getsync_end_pc, 0, 65535 ) ) continue; - if( read_config_int( &filetmp[i], "tt_getsync_loop_pc", &oric->pch_tt_getsync_loop_pc, 0, 65535 ) ) continue; - if( read_config_int( &filetmp[i], "tt_readbyte_pc", &oric->pch_tt_readbyte_pc, 0, 65535 ) ) continue; - if( read_config_int( &filetmp[i], "tt_readbyte_end_pc", &oric->pch_tt_readbyte_end_pc, 0, 65535 ) ) continue; - if( read_config_int( &filetmp[i], "tt_readbyte_storebyte_addr", &oric->pch_tt_readbyte_storebyte_addr, 0, 65535 ) ) continue; - if( read_config_int( &filetmp[i], "tt_readbyte_storezero_addr", &oric->pch_tt_readbyte_storezero_addr, 0, 65535 ) ) continue; - if( read_config_bool( &filetmp[i], "tt_readbyte_setcarry", &oric->pch_tt_readbyte_setcarry ) ) continue; - if( read_config_int( &filetmp[i], "tt_putbyte_pc", &oric->pch_tt_putbyte_pc, 0, 65535 ) ) continue; - if( read_config_int( &filetmp[i], "tt_putbyte_end_pc", &oric->pch_tt_putbyte_end_pc, 0, 65535 ) ) continue; - if( read_config_int( &filetmp[i], "tt_csave_end_pc", &oric->pch_tt_csave_end_pc, 0, 65535 ) ) continue; - if( read_config_int( &filetmp[i], "tt_store_end_pc", &oric->pch_tt_store_end_pc, 0, 65535 ) ) continue; - if( read_config_int( &filetmp[i], "tt_writeleader_pc", &oric->pch_tt_writeleader_pc, 0, 65535 ) ) continue; - if( read_config_int( &filetmp[i], "tt_writeleader_end_pc", &oric->pch_tt_writeleader_end_pc, 0, 65535 ) ) continue; - if( read_config_option( &filetmp[i], "keymap", &oric->keymap, keymapnames ) ) continue; + tmpname = malloc(strlen(fname) + 10); + if(!tmpname) return; + + sprintf(tmpname, "%s.pch", fname); + + f = fopen(tmpname, "r"); + free(tmpname); + if(!f) return; + + while(!feof(f)) + { + if(!fgets(filetmp, 2048, f)) break; + + for(i=0; isws(filetmp[i]); i++) ; + + if(read_config_int(&filetmp[i], "fd_cload_getname_pc", &oric->pch_fd_cload_getname_pc, 0, 65535)) continue; + if(read_config_int(&filetmp[i], "fd_csave_getname_pc", &oric->pch_fd_csave_getname_pc, 0, 65535)) continue; + if(read_config_int(&filetmp[i], "fd_store_getname_pc", &oric->pch_fd_store_getname_pc, 0, 65535)) continue; + if(read_config_int(&filetmp[i], "fd_recall_getname_pc", &oric->pch_fd_recall_getname_pc, 0, 65535)) continue; + if(read_config_int(&filetmp[i], "fd_getname_addr", &oric->pch_fd_getname_addr, 0, 65535)) continue; + if(read_config_int(&filetmp[i], "tt_getsync_pc", &oric->pch_tt_getsync_pc, 0, 65535)) continue; + if(read_config_int(&filetmp[i], "tt_getsync_end_pc", &oric->pch_tt_getsync_end_pc, 0, 65535)) continue; + if(read_config_int(&filetmp[i], "tt_getsync_loop_pc", &oric->pch_tt_getsync_loop_pc, 0, 65535)) continue; + if(read_config_int(&filetmp[i], "tt_readbyte_pc", &oric->pch_tt_readbyte_pc, 0, 65535)) continue; + if(read_config_int(&filetmp[i], "tt_readbyte_end_pc", &oric->pch_tt_readbyte_end_pc, 0, 65535)) continue; + if(read_config_int(&filetmp[i], "tt_readbyte_storebyte_addr", &oric->pch_tt_readbyte_storebyte_addr, 0, 65535)) continue; + if(read_config_int(&filetmp[i], "tt_readbyte_storezero_addr", &oric->pch_tt_readbyte_storezero_addr, 0, 65535)) continue; + if(read_config_bool(&filetmp[i], "tt_readbyte_setcarry", &oric->pch_tt_readbyte_setcarry)) continue; + if(read_config_int(&filetmp[i], "tt_putbyte_pc", &oric->pch_tt_putbyte_pc, 0, 65535)) continue; + if(read_config_int(&filetmp[i], "tt_putbyte_end_pc", &oric->pch_tt_putbyte_end_pc, 0, 65535)) continue; + if(read_config_int(&filetmp[i], "tt_csave_end_pc", &oric->pch_tt_csave_end_pc, 0, 65535)) continue; + if(read_config_int(&filetmp[i], "tt_store_end_pc", &oric->pch_tt_store_end_pc, 0, 65535)) continue; + if(read_config_int(&filetmp[i], "tt_writeleader_pc", &oric->pch_tt_writeleader_pc, 0, 65535)) continue; + if(read_config_int(&filetmp[i], "tt_writeleader_end_pc", &oric->pch_tt_writeleader_end_pc, 0, 65535)) continue; + if(read_config_option(&filetmp[i], "keymap", &oric->keymap, keymapnames)) continue; /* * parse real patch line formatted as: @@ -1749,65 +1797,65 @@ void load_patches( struct machine *oric, char *fname ) } - fclose( f ); + fclose(f); // Got all the addresses needed for each patch? - if( ( ( oric->pch_fd_cload_getname_pc != -1 ) || - ( oric->pch_fd_csave_getname_pc != -1 ) || - ( oric->pch_fd_store_getname_pc != -1 ) || - ( oric->pch_fd_recall_getname_pc != -1 ) ) && - ( oric->pch_fd_getname_addr != -1 ) ) + if(((oric->pch_fd_cload_getname_pc != -1) || + (oric->pch_fd_csave_getname_pc != -1) || + (oric->pch_fd_store_getname_pc != -1) || + (oric->pch_fd_recall_getname_pc != -1)) && + (oric->pch_fd_getname_addr != -1)) oric->pch_fd_available = SDL_TRUE; - if( ( oric->pch_tt_getsync_pc != -1 ) && - ( oric->pch_tt_getsync_end_pc != -1 ) && - ( oric->pch_tt_getsync_loop_pc != -1 ) && - ( oric->pch_tt_readbyte_pc != -1 ) && - ( oric->pch_tt_readbyte_end_pc != -1 ) ) + if((oric->pch_tt_getsync_pc != -1) && + (oric->pch_tt_getsync_end_pc != -1) && + (oric->pch_tt_getsync_loop_pc != -1) && + (oric->pch_tt_readbyte_pc != -1) && + (oric->pch_tt_readbyte_end_pc != -1)) oric->pch_tt_available = SDL_TRUE; - if( ( oric->pch_tt_putbyte_pc != -1 ) && - ( oric->pch_tt_putbyte_end_pc != -1 ) ) + if((oric->pch_tt_putbyte_pc != -1) && + (oric->pch_tt_putbyte_end_pc != -1)) oric->pch_tt_save_available = SDL_TRUE; } -static void setup_for_microdisc( struct machine *oric, void *readptr, void *writeptr ) +static void setup_for_microdisc(struct machine *oric, void* readptr, void* writeptr) { oric->cpu.read = readptr; oric->cpu.write = writeptr; oric->romdis = SDL_TRUE; - microdisc_init( &oric->md, &oric->wddisk, oric ); + microdisc_init(&oric->md, &oric->wddisk, oric); oric->disksyms = &sym_microdisc; } -static void setup_for_bd500( struct machine *oric, void *readptr, void *writeptr ) +static void setup_for_bd500(struct machine *oric, void* readptr, void* writeptr) { oric->cpu.read = readptr; oric->cpu.write = writeptr; oric->romdis = SDL_TRUE; - bd500_init( &oric->bd, &oric->wddisk, oric ); + bd500_init(&oric->bd, &oric->wddisk, oric); oric->disksyms = &sym_bd500; } -static void setup_for_jasmin( struct machine *oric, void *readptr, void *writeptr ) +static void setup_for_jasmin(struct machine *oric, void* readptr, void* writeptr) { oric->cpu.read = readptr; oric->cpu.write = writeptr; oric->romdis = SDL_FALSE; - jasmin_init( &oric->jasmin, &oric->wddisk, oric ); + jasmin_init(&oric->jasmin, &oric->wddisk, oric); oric->disksyms = &sym_jasmin; } -static void setup_for_pravetzdisk( struct machine *oric, void *readptr, void *writeptr ) +static void setup_for_pravetzdisk(struct machine *oric, void* readptr, void* writeptr) { oric->cpu.read = readptr; oric->cpu.write = writeptr; oric->romdis = SDL_FALSE; - pravetz_init( &oric->pravetz, oric ); + pravetz_init(&oric->pravetz, oric); oric->disksyms = &sym_pravetz; } -static void setup_for_no_disk( struct machine *oric, void *readptr, void *writeptr ) +static void setup_for_no_disk(struct machine *oric, void* readptr, void* writeptr) { oric->drivetype = DRV_NONE; oric->cpu.read = readptr; @@ -1816,14 +1864,14 @@ static void setup_for_no_disk( struct machine *oric, void *readptr, void *writep oric->disksyms = NULL; } -SDL_bool init_machine( struct machine *oric, int type, SDL_bool nukebreakpoints ) +SDL_bool init_machine(struct machine *oric, int type, SDL_bool nukebreakpoints) { int i; oric->tapeturbo_forceoff = SDL_FALSE; oric->type = type; - m6502_init( &oric->cpu, (void*)oric, nukebreakpoints ); + m6502_init(&oric->cpu, (void*)oric, nukebreakpoints); oric->tapeturbo_syncstack = -1; @@ -1842,148 +1890,150 @@ SDL_bool init_machine( struct machine *oric, int type, SDL_bool nukebreakpoints oric->tele_banksyms[6].numsyms = 0; oric->tele_banksyms[7].numsyms = 0; - clear_patches( oric ); + clear_patches(oric); - switch( type ) + switch(type) { case MACH_ORIC1_16K: - for( i=0; i<4; i++ ) + for(i=0; i<4; i++) oric->vidbases[i] &= 0x7fff; oric->memsize = 16384 + 16384; - oric->mem = malloc( oric->memsize ); - if( !oric->mem ) + oric->mem = malloc(oric->memsize); + if(!oric->mem) { - error_printf( "Out of memory\n" ); + error_printf("Out of memory\n"); return SDL_FALSE; } - blank_ram( oric->rampattern, oric->mem, 16384+16384 ); + blank_ram(oric->rampattern, oric->mem, 16384+16384); oric->rom = &oric->mem[16384]; - switch( oric->drivetype ) + switch(oric->drivetype) { case DRV_MICRODISC: - setup_for_microdisc( oric, microdisc_o16kread, microdisc_o16kwrite); + setup_for_microdisc(oric, microdisc_o16kread, microdisc_o16kwrite); break; case DRV_BD500: - setup_for_bd500( oric, bd500_o16kread, bd500_o16kwrite); + setup_for_bd500(oric, bd500_o16kread, bd500_o16kwrite); break; case DRV_JASMIN: - setup_for_jasmin( oric, jasmin_o16kread, jasmin_o16kwrite); + setup_for_jasmin(oric, jasmin_o16kread, jasmin_o16kwrite); break; case DRV_PRAVETZ: default: - setup_for_no_disk( oric, o16kread, o16kwrite ); + setup_for_no_disk(oric, o16kread, o16kwrite); break; } - if( !load_rom( oric, oric1romfile, -16384, &oric->rom[0], &oric->romsyms, SYMF_ROMDIS0 ) ) return SDL_FALSE; - load_patches( oric, oric1romfile ); + if(!load_rom(oric, oric1romfile, -16384, &oric->rom[0], &oric->romsyms, SYMF_ROMDIS0)) return SDL_FALSE; + load_patches(oric, oric1romfile); break; case MACH_ORIC1: oric->memsize = 65536 + 16384; - oric->mem = malloc( oric->memsize ); - if( !oric->mem ) + oric->mem = malloc(oric->memsize); + if(!oric->mem) { - error_printf( "Out of memory\n" ); + error_printf("Out of memory\n"); return SDL_FALSE; } - blank_ram( oric->rampattern, oric->mem, 65536+16384 ); + blank_ram(oric->rampattern, oric->mem, 65536+16384); oric->rom = &oric->mem[65536]; - switch( oric->drivetype ) + switch(oric->drivetype) { case DRV_MICRODISC: - setup_for_microdisc( oric, microdisc_atmosread, microdisc_atmoswrite); + setup_for_microdisc(oric, microdisc_atmosread, microdisc_atmoswrite); break; case DRV_BD500: - setup_for_bd500( oric, bd500_atmosread, bd500_atmoswrite); + setup_for_bd500(oric, bd500_atmosread, bd500_atmoswrite); break; case DRV_JASMIN: - setup_for_jasmin( oric, jasmin_atmosread, jasmin_atmoswrite); + setup_for_jasmin(oric, jasmin_atmosread, jasmin_atmoswrite); break; case DRV_PRAVETZ: default: - setup_for_no_disk( oric, atmosread, atmoswrite ); + setup_for_no_disk(oric, atmosread, atmoswrite); break; } - if( !load_rom( oric, oric1romfile, -16384, &oric->rom[0], &oric->romsyms, SYMF_ROMDIS0 ) ) return SDL_FALSE; - load_patches( oric, oric1romfile ); + if(!load_rom(oric, oric1romfile, -16384, &oric->rom[0], &oric->romsyms, SYMF_ROMDIS0)) return SDL_FALSE; + load_patches(oric, oric1romfile); break; case MACH_ATMOS: oric->memsize = 65536 + 16384; - oric->mem = malloc( oric->memsize ); - if( !oric->mem ) + oric->mem = malloc(oric->memsize); + if(!oric->mem) { - error_printf( "Out of memory\n" ); + error_printf("Out of memory\n"); return SDL_FALSE; } - blank_ram( oric->rampattern, oric->mem, 65536+16384 ); + blank_ram(oric->rampattern, oric->mem, 65536+16384); oric->rom = &oric->mem[65536]; - switch( oric->drivetype ) + switch(oric->drivetype) { case DRV_MICRODISC: - setup_for_microdisc( oric, microdisc_atmosread, microdisc_atmoswrite); + setup_for_microdisc(oric, microdisc_atmosread, microdisc_atmoswrite); break; case DRV_BD500: - setup_for_bd500( oric, bd500_atmosread, bd500_atmoswrite); + setup_for_bd500(oric, bd500_atmosread, bd500_atmoswrite); break; case DRV_JASMIN: - setup_for_jasmin( oric, jasmin_atmosread, jasmin_atmoswrite); + setup_for_jasmin(oric, jasmin_atmosread, jasmin_atmoswrite); break; case DRV_PRAVETZ: default: - setup_for_no_disk( oric, atmosread, atmoswrite ); + setup_for_no_disk(oric, atmosread, atmoswrite); break; } - if( !load_rom( oric, atmosromfile, -16384, &oric->rom[0], &oric->romsyms, SYMF_ROMDIS0 ) ) return SDL_FALSE; - load_patches( oric, atmosromfile ); + if(!load_rom(oric, atmosromfile, -16384, &oric->rom[0], &oric->romsyms, SYMF_ROMDIS0)) return SDL_FALSE; + load_patches(oric, atmosromfile); break; case MACH_TELESTRAT: oric->drivetype = DRV_MICRODISC; oric->memsize = 65536 + 16384*7; - oric->mem = malloc( oric->memsize ); - if( !oric->mem ) + oric->mem = malloc(oric->memsize); + if(!oric->mem) { - error_printf( "Out of memory\n" ); + error_printf("Out of memory\n"); return SDL_FALSE; } - blank_ram( oric->rampattern, oric->mem, 65536+16384*7 ); + blank_ram(oric->rampattern, oric->mem, 65536+16384*7); - setup_for_microdisc( oric, telestratread, telestratwrite ); + setup_for_microdisc(oric, telestratread, telestratwrite); oric->disksyms = NULL; - for( i=0; i<8; i++ ) + for(i=0; i<8; i++) { // assign oric->rom to allow binary patches oric->rom = oric->tele_bank[i].ptr = &oric->mem[0x0c000+(i*0x4000)]; - if( telebankfiles[i][0] ) + if(telebankfiles[i][0]) { oric->tele_bank[i].type = TELEBANK_ROM; - if( !load_rom( oric, telebankfiles[i], -16384, oric->tele_bank[i].ptr, &oric->tele_banksyms[i], SYMF_TELEBANK0<tele_bank[i].ptr, &oric->tele_banksyms[i], SYMF_TELEBANK0<tele_bank[i].type = TELEBANK_RAM; } } @@ -1995,42 +2045,42 @@ SDL_bool init_machine( struct machine *oric, int type, SDL_bool nukebreakpoints case MACH_PRAVETZ: oric->memsize = 65536 + 16384; - oric->mem = malloc( oric->memsize ); - if( !oric->mem ) + oric->mem = malloc(oric->memsize); + if(!oric->mem) { - error_printf( "Out of memory\n" ); + error_printf("Out of memory\n"); return SDL_FALSE; } - blank_ram( oric->rampattern, oric->mem, 65536+16384 ); + blank_ram(oric->rampattern, oric->mem, 65536+16384); oric->rom = &oric->mem[65536]; - switch( oric->drivetype ) + switch(oric->drivetype) { case DRV_MICRODISC: - setup_for_microdisc( oric, microdisc_atmosread, microdisc_atmoswrite); + setup_for_microdisc(oric, microdisc_atmosread, microdisc_atmoswrite); break; case DRV_BD500: - setup_for_bd500( oric, bd500_atmosread, bd500_atmoswrite); + setup_for_bd500(oric, bd500_atmosread, bd500_atmoswrite); break; case DRV_JASMIN: - setup_for_jasmin( oric, jasmin_atmosread, jasmin_atmoswrite); + setup_for_jasmin(oric, jasmin_atmosread, jasmin_atmoswrite); break; case DRV_PRAVETZ: - setup_for_pravetzdisk( oric, pravetz_atmosread, pravetz_atmoswrite ); + setup_for_pravetzdisk(oric, pravetz_atmosread, pravetz_atmoswrite); break; default: - setup_for_no_disk( oric, atmosread, atmoswrite ); + setup_for_no_disk(oric, atmosread, atmoswrite); break; } - if( !load_rom( oric, pravetzromfile[0], -16384, &oric->rom[0], &oric->romsyms, SYMF_ROMDIS0 ) ) return SDL_FALSE; - load_patches( oric, pravetzromfile[0] ); + if(!load_rom(oric, pravetzromfile[0], -16384, &oric->rom[0], &oric->romsyms, SYMF_ROMDIS0)) return SDL_FALSE; + load_patches(oric, pravetzromfile[0]); break; default: @@ -2043,38 +2093,38 @@ SDL_bool init_machine( struct machine *oric, int type, SDL_bool nukebreakpoints oric->vid_maxrast = 312; oric->vid_end = oric->vid_start + 224; oric->vid_raster = 0; - ula_powerup_default( oric ); + ula_powerup_default(oric); oric->read_not_lightpen = oric->cpu.read; - if (oric->lightpen) + if(oric->lightpen) oric->cpu.read = lightpen_read; - setromon( oric ); + setromon(oric); oric->tapename[0] = 0; - tape_rewind( oric ); - if (oric->twilighteboard_activated) + tape_rewind(oric); + if(oric->twilighteboard_activated) { oric->twilighte=twilighte_oric_init(); oric->ch376_activated=SDL_TRUE; - if (oric->twilighte->microdisc==SDL_TRUE) + if(oric->twilighte->microdisc==SDL_TRUE) { oric->drivetype = DRV_MICRODISC; oric->disksyms = NULL; - microdisc_init( &oric->md, &oric->wddisk, oric ); + microdisc_init(&oric->md, &oric->wddisk, oric); } } - if (oric->twilighte==NULL) oric->twilighteboard_activated=SDL_FALSE; + if(oric->twilighte==NULL) oric->twilighteboard_activated=SDL_FALSE; - m6502_reset( &oric->cpu ); - via_init( &oric->via, oric, VIA_MAIN ); - via_init( &oric->tele_via, oric, VIA_TELESTRAT ); - acia_init( &oric->tele_acia, oric ); + m6502_reset(&oric->cpu); + via_init(&oric->via, oric, VIA_MAIN); + via_init(&oric->tele_via, oric, VIA_TELESTRAT); + acia_init(&oric->tele_acia, oric); - if (oric->ch376_activated) + if(oric->ch376_activated) { oric->ch376 = ch376_oric_init(); ch376_oric_config(oric->ch376); @@ -2082,70 +2132,99 @@ SDL_bool init_machine( struct machine *oric, int type, SDL_bool nukebreakpoints - ay_init( &oric->ay, oric ); - joy_setup( oric ); + ay_init(&oric->ay, oric); + joy_setup(oric); oric->cpu.rastercycles = oric->cyclesperraster; oric->frames = 0; oric->vid_double = SDL_TRUE; - setemumode( oric, NULL, EM_RUNNING ); + setemumode(oric, NULL, EM_RUNNING); - if( oric->autorewind ) tape_rewind( oric ); + if(oric->autorewind) tape_rewind(oric); - setmenutoggles( oric ); + setmenutoggles(oric); refreshstatus = SDL_TRUE; return SDL_TRUE; } -void shut_machine( struct machine *oric ) +void shut_machine(struct machine *oric) { - if( oric->drivetype == DRV_MICRODISC ) { microdisc_free( &oric->md ); oric->drivetype = DRV_NONE; } - if( oric->drivetype == DRV_BD500 ) { bd500_free( &oric->bd ); oric->drivetype = DRV_NONE; } - if( oric->drivetype == DRV_JASMIN ) { jasmin_free( &oric->jasmin ); oric->drivetype = DRV_NONE; } - if( oric->drivetype == DRV_PRAVETZ ) { pravetz_free( &oric->pravetz ); oric->drivetype = DRV_NONE; } - if( oric->mem ) { free( oric->mem ); oric->mem = NULL; oric->rom = NULL; } - if( oric->prf ) { fclose( oric->prf ); oric->prf = NULL; } - if( oric->tsavf ) tape_stop_savepatch( oric ); - if( oric->tapecap ) toggletapecap( oric, find_item_by_function(mainitems, toggletapecap), 0 ); - if (oric->tapebuf) { free(oric->tapebuf); oric->tapebuf = NULL; } + if(oric->drivetype == DRV_MICRODISC) + { + microdisc_free(&oric->md); + oric->drivetype = DRV_NONE; + } + if(oric->drivetype == DRV_BD500) + { + bd500_free(&oric->bd); + oric->drivetype = DRV_NONE; + } + if(oric->drivetype == DRV_JASMIN) + { + jasmin_free(&oric->jasmin); + oric->drivetype = DRV_NONE; + } + if(oric->drivetype == DRV_PRAVETZ) + { + pravetz_free(&oric->pravetz); + oric->drivetype = DRV_NONE; + } + if(oric->mem) + { + free(oric->mem); + oric->mem = NULL; + oric->rom = NULL; + } + if(oric->prf) + { + fclose(oric->prf); + oric->prf = NULL; + } + if(oric->tsavf) tape_stop_savepatch(oric); + if(oric->tapecap) toggletapecap(oric, find_item_by_function(mainitems, toggletapecap), 0); + if(oric->tapebuf) + { + free(oric->tapebuf); + oric->tapebuf = NULL; + } #ifndef WWW_NO_MONITOR - mon_freesyms( &sym_microdisc ); - mon_freesyms( &sym_bd500 ); - mon_freesyms( &sym_jasmin ); - mon_freesyms( &sym_pravetz ); - mon_freesyms( &oric->romsyms ); - mon_freesyms( &oric->tele_banksyms[0] ); - mon_freesyms( &oric->tele_banksyms[1] ); - mon_freesyms( &oric->tele_banksyms[2] ); - mon_freesyms( &oric->tele_banksyms[3] ); - mon_freesyms( &oric->tele_banksyms[4] ); - mon_freesyms( &oric->tele_banksyms[5] ); - mon_freesyms( &oric->tele_banksyms[6] ); - mon_freesyms( &oric->tele_banksyms[7] ); + mon_freesyms(&sym_microdisc); + mon_freesyms(&sym_bd500); + mon_freesyms(&sym_jasmin); + mon_freesyms(&sym_pravetz); + mon_freesyms(&oric->romsyms); + mon_freesyms(&oric->tele_banksyms[0]); + mon_freesyms(&oric->tele_banksyms[1]); + mon_freesyms(&oric->tele_banksyms[2]); + mon_freesyms(&oric->tele_banksyms[3]); + mon_freesyms(&oric->tele_banksyms[4]); + mon_freesyms(&oric->tele_banksyms[5]); + mon_freesyms(&oric->tele_banksyms[6]); + mon_freesyms(&oric->tele_banksyms[7]); #endif } -void setdrivetype( struct machine *oric, struct osdmenuitem *mitem, int type ) +void setdrivetype(struct machine *oric, struct osdmenuitem *mitem, int type) { - if( oric->drivetype == type ) + if(oric->drivetype == type) return; - if( ( type == DRV_PRAVETZ ) && - ( oric->type != MACH_PRAVETZ ) ) + if((type == DRV_PRAVETZ) && + (oric->type != MACH_PRAVETZ)) { - swapmach( oric, mitem, (DRV_PRAVETZ<<16)|MACH_PRAVETZ ); + swapmach(oric, mitem, (DRV_PRAVETZ<<16)|MACH_PRAVETZ); return; } - shut_machine( oric ); + shut_machine(oric); - switch( type ) + switch(type) { case DRV_MICRODISC: case DRV_BD500: case DRV_JASMIN: case DRV_PRAVETZ: - oric->drivetype = type; + oric->drivetype = type; break; default: @@ -2154,29 +2233,29 @@ void setdrivetype( struct machine *oric, struct osdmenuitem *mitem, int type ) } #ifndef WWW_NO_MONITOR - mon_state_reset( oric ); + mon_state_reset(oric); #endif - if( !init_machine( oric, oric->type, SDL_FALSE ) ) + if(!init_machine(oric, oric->type, SDL_FALSE)) { - shut( oric ); + shut(oric); #ifdef __ANDROID__ error_printf("'init_machine' failed"); #endif - exit( EXIT_FAILURE ); + exit(EXIT_FAILURE); } - setmenutoggles( oric ); + setmenutoggles(oric); } -void swapmach( struct machine *oric, struct osdmenuitem *mitem, int which ) +void swapmach(struct machine *oric, struct osdmenuitem *mitem, int which) { int curr_drivetype; curr_drivetype = oric->drivetype; - shut_machine( oric ); + shut_machine(oric); - if( ((which>>16)&0xffff) != 0xffff ) + if(((which>>16)&0xffff) != 0xffff) curr_drivetype = (which>>16)&0xffff; which &= 0xffff; @@ -2185,18 +2264,18 @@ void swapmach( struct machine *oric, struct osdmenuitem *mitem, int which ) /* The contents of the disk panel depend on the disk type. */ /* Wipe it to prevent garbage. */ - clear_textzone( oric, TZ_DISK ); + clear_textzone(oric, TZ_DISK); #ifndef WWW_NO_MONITOR - mon_state_reset( oric ); + mon_state_reset(oric); #endif - if( !init_machine( oric, which, which!=oric->type ) ) + if(!init_machine(oric, which, which!=oric->type)) { - shut( oric ); + shut(oric); #ifdef __ANDROID__ error_printf("'init_machine' failed"); #endif - exit( EXIT_FAILURE ); + exit(EXIT_FAILURE); } } diff --git a/machine.h b/machine.h index ca3ebd97..8feeebfb 100644 --- a/machine.h +++ b/machine.h @@ -81,7 +81,7 @@ enum struct telebankinfo { unsigned char type; - unsigned char *ptr; + unsigned char* ptr; }; struct machine @@ -91,8 +91,8 @@ struct machine struct via via; struct ay8912 ay; unsigned int memsize; - unsigned char *mem; - unsigned char *rom; + unsigned char* mem; + unsigned char* rom; int emu_mode; struct symboltable romsyms; @@ -128,7 +128,7 @@ struct machine int vid_chline; int frames; SDL_bool vid_dirty[224]; - void (*vid_block_func)( struct machine *, SDL_bool, int, int ); + void (*vid_block_func)(struct machine *, SDL_bool, int, int); int overclockmult, overclockshift; @@ -140,8 +140,8 @@ struct machine SDL_bool vsynchack; unsigned short vid_addr; - unsigned char *vid_ch_data; - unsigned char *vid_ch_base; + unsigned char* vid_ch_data; + unsigned char* vid_ch_base; Uint8 *scrpt; Uint8 *scr; @@ -163,7 +163,7 @@ struct machine unsigned char tapebit, tapeout, tapeparity; int tapelen, tapeoffs, tapecount, tapetime, tapedupbytes, tapehdrend, tapedelay; - unsigned char *tapebuf; + unsigned char* tapebuf; SDL_bool tapemotor, tapenoise, tapeturbo, autorewind, autoinsert; SDL_bool tapeturbo_forceoff; SDL_bool symbolsautoload, symbolscase; @@ -216,14 +216,14 @@ struct machine void (*render_textzone_alloc)(struct machine *, int); void (*render_textzone_free)(struct machine *, int); void (*render_textzone)(struct machine *, int); - void (*render_clear_area)( int, int, int, int ); + void (*render_clear_area)(int, int, int, int); void (*render_gimg)(int, Sint32, Sint32); void (*render_gimgpart)(int, Sint32, Sint32, Sint32, Sint32, Sint32, Sint32); void (*render_alloc_textzone)(struct machine *, struct textzone *); void (*render_free_textzone)(struct machine *, struct textzone *); void (*render_video)(struct machine *, SDL_bool); - SDL_bool (*render_togglefullscreen)(struct machine *oric); - SDL_bool (*init_render)(struct machine *); + SDL_bool(*render_togglefullscreen)(struct machine *oric); + SDL_bool(*init_render)(struct machine *); void (*shut_render)(struct machine *); char popupstr[40]; @@ -271,21 +271,21 @@ struct machine char aciabackendname[ACIA_BACKEND_NAME_LEN]; }; -void setromon( struct machine *oric ); -void setemumode( struct machine *oric, struct osdmenuitem *mitem, int mode ); -void video_show( struct machine *oric ); -SDL_bool emu_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ); +void setromon(struct machine *oric); +void setemumode(struct machine *oric, struct osdmenuitem *mitem, int mode); +void video_show(struct machine *oric); +SDL_bool emu_event(SDL_Event *ev, struct machine *oric, SDL_bool *needrender); -void preinit_machine( struct machine *oric ); -void load_diskroms( struct machine *oric ); -SDL_bool init_machine( struct machine *oric, int type, SDL_bool nukebreakpoints ); -void shut_machine( struct machine *oric ); -void setdrivetype( struct machine *oric, struct osdmenuitem *mitem, int type ); -void swapmach( struct machine *oric, struct osdmenuitem *mitem, int which ); -SDL_bool isram( struct machine *oric, unsigned short addr ); +void preinit_machine(struct machine *oric); +void load_diskroms(struct machine *oric); +SDL_bool init_machine(struct machine *oric, int type, SDL_bool nukebreakpoints); +void shut_machine(struct machine *oric); +void setdrivetype(struct machine *oric, struct osdmenuitem *mitem, int type); +void swapmach(struct machine *oric, struct osdmenuitem *mitem, int which); +SDL_bool isram(struct machine *oric, unsigned short addr); -void clear_patches( struct machine *oric ); +void clear_patches(struct machine *oric); -unsigned char lightpen_read( struct m6502 *cpu, unsigned short addr ); +unsigned char lightpen_read(struct m6502 *cpu, unsigned short addr); -int detect_image_type(char *filename); +int detect_image_type(char* filename); diff --git a/main.c b/main.c index 224438cc..a47cd0ce 100644 --- a/main.c +++ b/main.c @@ -136,31 +136,34 @@ struct start_opts char* start_syms_files[32]; Sint32 start_syms_count; char start_snapshot[1024]; - char *start_breakpoint; + char* start_breakpoint; Sint32 start_disks_count; char start_disks[4][1024]; }; -static char *machtypes[] = { "oric1", +static char* machtypes[] = { "oric1", "oric1-16k", "atmos", "telestrat", "pravetz|pravetz8d", - NULL }; + NULL + }; -static char *disktypes[] = { "none", +static char* disktypes[] = { "none", "jasmin", "microdisc", "bd500", "pravetz", - NULL }; + NULL + }; -static char *joyifacetypes[] = { "none", +static char* joyifacetypes[] = { "none", "altai|pase", "ijk", - NULL }; + NULL + }; -static char *joymodes[] = { "none", +static char* joymodes[] = { "none", "kbjoy1", "kbjoy2", "sdljoy0", @@ -174,21 +177,23 @@ static char *joymodes[] = { "none", "sdljoy8", "sdljoy9", "mouse", - NULL }; + NULL + }; -static char *rendermodes[] = { "{{INVALID}}", +static char* rendermodes[] = { "{{INVALID}}", "soft", "opengl", - NULL }; + NULL + }; -static char *swdepths[] = { "8", "16", "32", NULL }; +static char* swdepths[] = { "8", "16", "32", NULL }; -static char *sbarmodes[] = { "full", "nofps", "none", NULL }; +static char* sbarmodes[] = { "full", "nofps", "none", NULL }; -static char *fileprefix = 0; +static char* fileprefix = 0; // Initialize path prefix for locating program resources -static void init_fileprefix( char *argv[] ) +static void init_fileprefix(char* argv[]) { (void) argv; #if defined(__amigaos4__) @@ -202,24 +207,24 @@ static void init_fileprefix( char *argv[] ) #elif defined(__linux__) || defined(__APPLE__) // Find program directory - fileprefix = realpath( argv[0], 0 ); // convert to absolute path - int len = strlen( fileprefix ); - while ( len && fileprefix[len-1] != PATHSEP ) // strip the program filename + fileprefix = realpath(argv[0], 0); // convert to absolute path + int len = strlen(fileprefix); + while(len && fileprefix[len-1] != PATHSEP) // strip the program filename len--; fileprefix[len] = 0; #if defined(__APPLE__) // When bundled, program is in /Oricutron.app/Contents/MacOS/ // but data files are further up in the parent of Oricutron.app. - const char *suffix = ".app/Contents/MacOS/"; + const char* suffix = ".app/Contents/MacOS/"; int suffix_len = strlen(suffix); - if ( len > suffix_len && !strcasecmp( fileprefix + len - suffix_len, suffix ) ) + if(len > suffix_len && !strcasecmp(fileprefix + len - suffix_len, suffix)) { - // Located in bundle - go to parent of .app dir - len -= suffix_len; // strip the suffix we matched - while ( len && fileprefix[len-1] != PATHSEP ) // strip the .app dir - len--; - fileprefix[len] = 0; + // Located in bundle - go to parent of .app dir + len -= suffix_len; // strip the suffix we matched + while(len && fileprefix[len-1] != PATHSEP) // strip the .app dir + len--; + fileprefix[len] = 0; } // else not bundled, stay in program directory #endif @@ -230,24 +235,24 @@ static void init_fileprefix( char *argv[] ) } // Get prefix string to locate program resources -const char *get_fileprefix() +const char* get_fileprefix() { return fileprefix; } // Check if filename looks to be absolute path -SDL_bool is_abs_path( const char *filename ) +SDL_bool is_abs_path(const char* filename) { char c = *(filename++); // Detect unix-style absolute path - if ( c == '/' || c == '\\' || c == '~' ) + if(c == '/' || c == '\\' || c == '~') return SDL_TRUE; // Detect Amiga style absolute path or DOS drive letter - while ( c ) + while(c) { - if ( c == ':' ) + if(c == ':') return SDL_TRUE; c = *(filename++); } @@ -256,70 +261,70 @@ SDL_bool is_abs_path( const char *filename ) } // Prepend file prefix to relative path, buffer of size maxlen -void add_fileprefix( char *filename, int maxlen ) +void add_fileprefix(char* filename, int maxlen) { - const char *prefix = get_fileprefix(); - Sint32 prefix_len = strlen( prefix ); - if ( prefix_len == 0 ) + const char* prefix = get_fileprefix(); + Sint32 prefix_len = strlen(prefix); + if(prefix_len == 0) return; // no file prefix on this platform - Sint32 filename_len = strlen( filename ); - if ( prefix_len + filename_len + 1 > maxlen ) + Sint32 filename_len = strlen(filename); + if(prefix_len + filename_len + 1 > maxlen) return; // won't fit in buffer - if ( is_abs_path ( filename ) ) + if(is_abs_path(filename)) return; // don't apply prefix to absolute path // Move filename including terminating zero - for ( int i=filename_len+1; i>=0; i-- ) + for(int i=filename_len+1; i>=0; i--) filename[prefix_len+i] = filename[i]; // Put the prefix before - for (int i=0; i= (maxlen-1) ) break; - if( !buf[i] ) break; + if(d >= (maxlen-1)) break; + if(!buf[i]) break; - if( ( buf[i] == '\\' ) && ( buf[i+1] == '\'' ) ) + if((buf[i] == '\\') && (buf[i+1] == '\'')) { dest[d++] = '\''; i+=2; continue; } - if( ( buf[i] == '\\' ) && ( buf[i+1] == '\\' ) ) + if((buf[i] == '\\') && (buf[i+1] == '\\')) { dest[d++] = '\\'; i+=2; @@ -333,157 +338,159 @@ SDL_bool read_config_string( char *buf, char *token, char *dest, Sint32 maxlen ) return SDL_TRUE; } -SDL_bool read_config_path( char *buf, char *token, char *dest, Sint32 maxlen ) +SDL_bool read_config_path(char* buf, char* token, char* dest, Sint32 maxlen) { - if ( !read_config_string( buf, token, dest, maxlen ) ) + if(!read_config_string(buf, token, dest, maxlen)) return SDL_FALSE; - add_fileprefix( dest, maxlen ); + add_fileprefix(dest, maxlen); return SDL_TRUE; } -SDL_bool read_config_bool( char *buf, char *token, SDL_bool *dest ) +SDL_bool read_config_bool(char* buf, char* token, SDL_bool *dest) { Sint32 i, toklen; // Get the token length - toklen = (int)strlen( token ); + toklen = (int)strlen(token); // Is this the token? - if( strncasecmp( buf, token, toklen ) != 0 ) return SDL_FALSE; + if(strncasecmp(buf, token, toklen) != 0) return SDL_FALSE; i = toklen; // Check for whitespace, equals, whitespace, single quote - while( isws( buf[i] ) ) i++; - if( buf[i] != '=' ) return SDL_TRUE; + while(isws(buf[i])) i++; + if(buf[i] != '=') return SDL_TRUE; i++; - while( isws( buf[i] ) ) i++; + while(isws(buf[i])) i++; (*dest) = SDL_FALSE; - if( strncasecmp( &buf[i], "true", 4 ) == 0 ) (*dest) = SDL_TRUE; - if( strncasecmp( &buf[i], "yes", 3 ) == 0 ) (*dest) = SDL_TRUE; + if(strncasecmp(&buf[i], "true", 4) == 0)(*dest) = SDL_TRUE; + if(strncasecmp(&buf[i], "yes", 3) == 0)(*dest) = SDL_TRUE; return SDL_TRUE; } -SDL_bool read_config_option( char *buf, char *token, Sint32 *dest, char **options ) +SDL_bool read_config_option(char* buf, char* token, Sint32 *dest, char** options) { Sint32 i, j, len; - char *thisopt; + char* thisopt; // Get the token length - len = (int)strlen( token ); + len = (int)strlen(token); // Is this the token? - if( strncasecmp( buf, token, len ) != 0 ) return SDL_FALSE; + if(strncasecmp(buf, token, len) != 0) return SDL_FALSE; i = len; // Check for whitespace, equals, whitespace, single quote - while( isws( buf[i] ) ) i++; - if( buf[i] != '=' ) return SDL_TRUE; + while(isws(buf[i])) i++; + if(buf[i] != '=') return SDL_TRUE; i++; - while( isws( buf[i] ) ) i++; + while(isws(buf[i])) i++; // Huh!? - if( strncmp( &buf[i], "{{INVALID}}", 11 ) == 0 ) + if(strncmp(&buf[i], "{{INVALID}}", 11) == 0) return SDL_FALSE; - for( j=0; options[j]; j++ ) + for(j=0; options[j]; j++) { thisopt = options[j]; - while( thisopt[0] ) + while(thisopt[0]) { len = 0; - while( (thisopt[len]!=0) && (thisopt[len]!='|') ) len++; + while((thisopt[len]!=0) && (thisopt[len]!='|')) len++; - if( strncasecmp( &buf[i], thisopt, len ) == 0 ) + if(strncasecmp(&buf[i], thisopt, len) == 0) { - if( istokend( buf[i+len] ) ) + if(istokend(buf[i+len])) { *dest = j; return SDL_TRUE; } } thisopt += len; - if( thisopt[0] == '|' ) thisopt++; + if(thisopt[0] == '|') thisopt++; } } return SDL_TRUE; } -SDL_bool read_config_int( char *buf, char *token, int *dest, int min, int max ) +SDL_bool read_config_int(char* buf, char* token, int* dest, int min, int max) { Sint32 i, toklen; int val, hv; // Get the token length - toklen = (int)strlen( token ); + toklen = (int)strlen(token); // Is this the token? - if( strncasecmp( buf, token, toklen ) != 0 ) return SDL_FALSE; + if(strncasecmp(buf, token, toklen) != 0) return SDL_FALSE; i = toklen; // Check for whitespace, equals, whitespace - while( isws( buf[i] ) ) i++; - if( buf[i] != '=' ) return SDL_TRUE; + while(isws(buf[i])) i++; + if(buf[i] != '=') return SDL_TRUE; i++; - while( isws( buf[i] ) ) i++; + while(isws(buf[i])) i++; val = 0; - if( buf[i] == '$' ) + if(buf[i] == '$') { i++; - while( (hv=hexit(buf[i])) != -1 ) + while((hv=hexit(buf[i])) != -1) { val = (val<<4) + hv; i++; } - } else { - val = atoi( &buf[i] ); + } + else + { + val = atoi(&buf[i]); } - if( val < min ) val = min; - if( val > max ) val = max; + if(val < min) val = min; + if(val > max) val = max; (*dest) = val; return SDL_TRUE; } -SDL_bool read_config_joykey( char *buf, char *token, SDL_COMPAT_KEY *dest ) +SDL_bool read_config_joykey(char* buf, char* token, SDL_COMPAT_KEY *dest) { Sint32 i, toklen, d; SDL_COMPAT_KEY thekey; char keyname[32]; // Get the token length - toklen = (int)strlen( token ); + toklen = (int)strlen(token); // Is this the token? - if( strncasecmp( buf, token, toklen ) != 0 ) return SDL_FALSE; + if(strncasecmp(buf, token, toklen) != 0) return SDL_FALSE; i = toklen; // Check for whitespace, equals, whitespace, single quote - while( isws( buf[i] ) ) i++; - if( buf[i] != '=' ) return SDL_TRUE; + while(isws(buf[i])) i++; + if(buf[i] != '=') return SDL_TRUE; i++; - while( isws( buf[i] ) ) i++; - if( buf[i] != '\'' ) return SDL_TRUE; + while(isws(buf[i])) i++; + if(buf[i] != '\'') return SDL_TRUE; i++; // Copy and un-escape the string d=0; - while( buf[i] != '\'' ) + while(buf[i] != '\'') { - if( d >= 31 ) break; - if( !buf[i] ) break; + if(d >= 31) break; + if(!buf[i]) break; - if( ( buf[i] == '\\' ) && ( buf[i+1] == '\'' ) ) + if((buf[i] == '\\') && (buf[i+1] == '\'')) { keyname[d++] = '\''; i+=2; continue; } - if( ( buf[i] == '\\' ) && ( buf[i+1] == '\\' ) ) + if((buf[i] == '\\') && (buf[i+1] == '\\')) { keyname[d++] = '\\'; i+=2; @@ -495,9 +502,9 @@ SDL_bool read_config_joykey( char *buf, char *token, SDL_COMPAT_KEY *dest ) keyname[d] = 0; - thekey = joy_keyname_to_sym( keyname ); + thekey = joy_keyname_to_sym(keyname); - if( thekey ) + if(thekey) { *dest = thekey; return SDL_TRUE; @@ -506,7 +513,7 @@ SDL_bool read_config_joykey( char *buf, char *token, SDL_COMPAT_KEY *dest ) return SDL_FALSE; } -static void load_config( struct start_opts *sto, struct machine *oric ) +static void load_config(struct start_opts *sto, struct machine *oric) { FILE *f; Sint32 i, j; @@ -515,73 +522,79 @@ static void load_config( struct start_opts *sto, struct machine *oric ) strcpy(config_path, "oricutron.cfg"); add_fileprefix(config_path, 4096); - f = fopen( config_path, "r" ); - if( !f ) return; + f = fopen(config_path, "r"); + if(!f) return; - while( !feof( f ) ) + while(!feof(f)) { - if( !fgets( sto->lctmp, 2048, f ) ) break; - - for( i=0; isws( sto->lctmp[i] ); i++ ) ; - - if( read_config_option( &sto->lctmp[i], "machine", &sto->start_machine, machtypes ) ) continue; - if( read_config_option( &sto->lctmp[i], "disktype", &sto->start_disktype, disktypes ) ) continue; - if( read_config_bool( &sto->lctmp[i], "debug", &sto->start_debug ) ) continue; - if( read_config_bool( &sto->lctmp[i], "fullscreen", &fullscreen ) ) continue; - if( read_config_option( &sto->lctmp[i], "statusbarmode", &oric->statusbar_mode, sbarmodes) ) continue; - if( read_config_bool( &sto->lctmp[i], "hwsurface", &hwsurface ) ) continue; - if( read_config_bool( &sto->lctmp[i], "scanlines", &oric->scanlines ) ) continue; - if( read_config_bool( &sto->lctmp[i], "aratio", &oric->aratio ) ) continue; - if( read_config_bool( &sto->lctmp[i], "hstretch", &oric->hstretch ) ) continue; - if( read_config_bool( &sto->lctmp[i], "palghosting", &oric->palghost ) ) continue; - if( read_config_bool( &sto->lctmp[i], "rom16", &oric->rom16 ) ) continue; - if( read_config_bool( &sto->lctmp[i], "dos70", &oric->dos70 ) ) continue; - if( read_config_path( &sto->lctmp[i], "diskimage", sto->start_disk, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "tapeimage", sto->start_tape, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "symbols", sto->start_syms, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "tapepath", tapepath, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "diskpath", diskpath, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "telediskpath", telediskpath, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "pravdiskpath", pravdiskpath, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "atmosrom", atmosromfile, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "oric1rom", oric1romfile, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "mdiscrom", mdiscromfile, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "bd500rom", bd500romfile, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "jasminrom", jasmnromfile, 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "pravetzrom", pravetzromfile[0], 1024 ) ) continue; - if( read_config_path( &sto->lctmp[i], "pravetz8drom", pravetzromfile[1], 1024 ) ) continue; - if( read_config_int( &sto->lctmp[i], "rampattern", &oric->rampattern, 0, 1 ) ) continue; - if( read_config_option( &sto->lctmp[i], "swdepth", &oric->sw_depth, swdepths ) ) + if(!fgets(sto->lctmp, 2048, f)) break; + + for(i=0; isws(sto->lctmp[i]); i++) ; + + if(read_config_option(&sto->lctmp[i], "machine", &sto->start_machine, machtypes)) continue; + if(read_config_option(&sto->lctmp[i], "disktype", &sto->start_disktype, disktypes)) continue; + if(read_config_bool(&sto->lctmp[i], "debug", &sto->start_debug)) continue; + if(read_config_bool(&sto->lctmp[i], "fullscreen", &fullscreen)) continue; + if(read_config_option(&sto->lctmp[i], "statusbarmode", &oric->statusbar_mode, sbarmodes)) continue; + if(read_config_bool(&sto->lctmp[i], "hwsurface", &hwsurface)) continue; + if(read_config_bool(&sto->lctmp[i], "scanlines", &oric->scanlines)) continue; + if(read_config_bool(&sto->lctmp[i], "aratio", &oric->aratio)) continue; + if(read_config_bool(&sto->lctmp[i], "hstretch", &oric->hstretch)) continue; + if(read_config_bool(&sto->lctmp[i], "palghosting", &oric->palghost)) continue; + if(read_config_bool(&sto->lctmp[i], "rom16", &oric->rom16)) continue; + if(read_config_bool(&sto->lctmp[i], "dos70", &oric->dos70)) continue; + if(read_config_path(&sto->lctmp[i], "diskimage", sto->start_disk, 1024)) continue; + if(read_config_path(&sto->lctmp[i], "tapeimage", sto->start_tape, 1024)) continue; + if(read_config_path(&sto->lctmp[i], "symbols", sto->start_syms, 1024)) continue; + if(read_config_path(&sto->lctmp[i], "tapepath", tapepath, 1024)) continue; + if(read_config_path(&sto->lctmp[i], "diskpath", diskpath, 1024)) continue; + if(read_config_path(&sto->lctmp[i], "telediskpath", telediskpath, 1024)) continue; + if(read_config_path(&sto->lctmp[i], "pravdiskpath", pravdiskpath, 1024)) continue; + if(read_config_path(&sto->lctmp[i], "atmosrom", atmosromfile, 1024)) continue; + if(read_config_path(&sto->lctmp[i], "oric1rom", oric1romfile, 1024)) continue; + if(read_config_path(&sto->lctmp[i], "mdiscrom", mdiscromfile, 1024)) continue; + if(read_config_path(&sto->lctmp[i], "bd500rom", bd500romfile, 1024)) continue; + if(read_config_path(&sto->lctmp[i], "jasminrom", jasmnromfile, 1024)) continue; + if(read_config_path(&sto->lctmp[i], "pravetzrom", pravetzromfile[0], 1024)) continue; + if(read_config_path(&sto->lctmp[i], "pravetz8drom", pravetzromfile[1], 1024)) continue; + if(read_config_int(&sto->lctmp[i], "rampattern", &oric->rampattern, 0, 1)) continue; + if(read_config_option(&sto->lctmp[i], "swdepth", &oric->sw_depth, swdepths)) { /* Convert index to depth */ - switch (oric->sw_depth) + switch(oric->sw_depth) { - case 0: oric->sw_depth = 8; break; - case 2: oric->sw_depth = 32; break; - default: oric->sw_depth = 16; break; + case 0: + oric->sw_depth = 8; + break; + case 2: + oric->sw_depth = 32; + break; + default: + oric->sw_depth = 16; + break; } continue; } - if( read_config_option( &sto->lctmp[i], "rendermode", &sto->start_rendermode, rendermodes ) ) + if(read_config_option(&sto->lctmp[i], "rendermode", &sto->start_rendermode, rendermodes)) { #ifndef __OPENGL_AVAILABLE__ - if( sto->start_rendermode == RENDERMODE_GL ) + if(sto->start_rendermode == RENDERMODE_GL) sto->start_rendermode = RENDERMODE_SW; #endif continue; } - for( j=0; j<8; j++ ) + for(j=0; j<8; j++) { - sprintf( tbtmp, "telebank%c", j+'0' ); - if( read_config_path( &sto->lctmp[i], tbtmp, telebankfiles[j], 1024 ) ) break; + sprintf(tbtmp, "telebank%c", j+'0'); + if(read_config_path(&sto->lctmp[i], tbtmp, telebankfiles[j], 1024)) break; } - if( read_config_bool( &sto->lctmp[i], "lightpen", &oric->lightpen ) ) continue; - if( read_config_bool( &sto->lctmp[i], "printenable", &oric->printenable ) ) continue; - if( read_config_bool( &sto->lctmp[i], "printfilter", &oric->printfilter ) ) continue; - if( read_config_bool( &sto->lctmp[i], "dcadjust", &oric->dcadjust ) ) continue; - if( read_config_bool( &sto->lctmp[i], "soundloopon", &oric->soundloopon ) ) continue; - if( read_config_int( &sto->lctmp[i], "serial_address", &oric->aciaoffset, 0x310, 0x3fc ) ) continue; - if( read_config_string( &sto->lctmp[i], "serial", oric->aciabackendname, ACIA_BACKEND_NAME_LEN ) ) + if(read_config_bool(&sto->lctmp[i], "lightpen", &oric->lightpen)) continue; + if(read_config_bool(&sto->lctmp[i], "printenable", &oric->printenable)) continue; + if(read_config_bool(&sto->lctmp[i], "printfilter", &oric->printfilter)) continue; + if(read_config_bool(&sto->lctmp[i], "dcadjust", &oric->dcadjust)) continue; + if(read_config_bool(&sto->lctmp[i], "soundloopon", &oric->soundloopon)) continue; + if(read_config_int(&sto->lctmp[i], "serial_address", &oric->aciaoffset, 0x310, 0x3fc)) continue; + if(read_config_string(&sto->lctmp[i], "serial", oric->aciabackendname, ACIA_BACKEND_NAME_LEN)) { if(!strcasecmp("none", oric->aciabackendname)) oric->aciabackendcfg = oric->aciabackend = ACIA_TYPE_NONE; @@ -594,16 +607,20 @@ static void load_config( struct start_opts *sto, struct machine *oric ) oric->aciabackendcfg = oric->aciabackend = ACIA_TYPE_MODEM; oric->aciabackendcfgport = 0; oric->aciabackendcfgdomain = 4; - if(p) { + if(p) + { char* p2 = strchr(p+1, ':'); - if (p2) { + if(p2) + { // check if we want IPv6 - if (strcasecmp(p2+1, "ipv6")==0) - oric->aciabackendcfgdomain = 6; + if(strcasecmp(p2+1, "ipv6")==0) + oric->aciabackendcfgdomain = 6; *p2 = '\0'; // temporarily place a \0 to isolate the port part of the string oric->aciabackendcfgport = atoi(p+1); // get the port part of the string *p2 = ':'; // put back the semicolon - } else { + } + else + { oric->aciabackendcfgport = atoi(p+1); } } @@ -619,103 +636,103 @@ static void load_config( struct start_opts *sto, struct machine *oric ) } continue; } - if( read_config_option( &sto->lctmp[i], "joyinterface", &oric->joy_iface, joyifacetypes ) ) continue; - if( read_config_option( &sto->lctmp[i], "joystick_a", &oric->joymode_a, joymodes ) ) continue; - if( read_config_option( &sto->lctmp[i], "joystick_b", &oric->joymode_b, joymodes ) ) continue; - if( read_config_option( &sto->lctmp[i], "telejoy_a", &oric->telejoymode_a, joymodes ) ) continue; - if( read_config_option( &sto->lctmp[i], "telejoy_b", &oric->telejoymode_b, joymodes ) ) continue; - if( read_config_joykey( &sto->lctmp[i], "kbjoy1_up", &oric->kbjoy1[0] ) ) continue; - if( read_config_joykey( &sto->lctmp[i], "kbjoy1_down", &oric->kbjoy1[1] ) ) continue; - if( read_config_joykey( &sto->lctmp[i], "kbjoy1_left", &oric->kbjoy1[2] ) ) continue; - if( read_config_joykey( &sto->lctmp[i], "kbjoy1_right", &oric->kbjoy1[3] ) ) continue; - if( read_config_joykey( &sto->lctmp[i], "kbjoy1_fire1", &oric->kbjoy1[4] ) ) continue; - if( read_config_joykey( &sto->lctmp[i], "kbjoy1_fire2", &oric->kbjoy1[5] ) ) continue; - if( read_config_joykey( &sto->lctmp[i], "kbjoy1_fire3", &oric->kbjoy1[6] ) ) continue; - if( read_config_joykey( &sto->lctmp[i], "kbjoy2_up", &oric->kbjoy2[0] ) ) continue; - if( read_config_joykey( &sto->lctmp[i], "kbjoy2_down", &oric->kbjoy2[1] ) ) continue; - if( read_config_joykey( &sto->lctmp[i], "kbjoy2_left", &oric->kbjoy2[2] ) ) continue; - if( read_config_joykey( &sto->lctmp[i], "kbjoy2_right", &oric->kbjoy2[3] ) ) continue; - if( read_config_joykey( &sto->lctmp[i], "kbjoy2_fire1", &oric->kbjoy2[4] ) ) continue; - if( read_config_joykey( &sto->lctmp[i], "kbjoy2_fire2", &oric->kbjoy2[5] ) ) continue; - if( read_config_joykey( &sto->lctmp[i], "kbjoy2_fire3", &oric->kbjoy2[6] ) ) continue; - if( read_config_bool( &sto->lctmp[i], "diskautosave", &oric->diskautosave ) ) continue; - if( read_config_bool( &sto->lctmp[i], "ch376", &oric->ch376_activated) ) continue; - if( read_config_bool( &sto->lctmp[i], "twilighte_board",&oric->twilighteboard_activated) ) continue; - if( read_config_bool( &sto->lctmp[i], "pravdiskautoboot", &oric->pravdiskautoboot ) ) continue; - if( read_config_bool( &sto->lctmp[i], "disable_menuscheme", &oric->disable_menuscheme ) ) continue; - if( read_config_bool( &sto->lctmp[i], "show_keyboard", &oric->show_keyboard ) ) continue; - if( read_config_bool( &sto->lctmp[i], "sticky_mod_keys", &oric->sticky_mod_keys ) )continue; - if( read_config_path( &sto->lctmp[i], "autoload_keyboard_mapping", keymap_path, 4096 ) ) + if(read_config_option(&sto->lctmp[i], "joyinterface", &oric->joy_iface, joyifacetypes)) continue; + if(read_config_option(&sto->lctmp[i], "joystick_a", &oric->joymode_a, joymodes)) continue; + if(read_config_option(&sto->lctmp[i], "joystick_b", &oric->joymode_b, joymodes)) continue; + if(read_config_option(&sto->lctmp[i], "telejoy_a", &oric->telejoymode_a, joymodes)) continue; + if(read_config_option(&sto->lctmp[i], "telejoy_b", &oric->telejoymode_b, joymodes)) continue; + if(read_config_joykey(&sto->lctmp[i], "kbjoy1_up", &oric->kbjoy1[0])) continue; + if(read_config_joykey(&sto->lctmp[i], "kbjoy1_down", &oric->kbjoy1[1])) continue; + if(read_config_joykey(&sto->lctmp[i], "kbjoy1_left", &oric->kbjoy1[2])) continue; + if(read_config_joykey(&sto->lctmp[i], "kbjoy1_right", &oric->kbjoy1[3])) continue; + if(read_config_joykey(&sto->lctmp[i], "kbjoy1_fire1", &oric->kbjoy1[4])) continue; + if(read_config_joykey(&sto->lctmp[i], "kbjoy1_fire2", &oric->kbjoy1[5])) continue; + if(read_config_joykey(&sto->lctmp[i], "kbjoy1_fire3", &oric->kbjoy1[6])) continue; + if(read_config_joykey(&sto->lctmp[i], "kbjoy2_up", &oric->kbjoy2[0])) continue; + if(read_config_joykey(&sto->lctmp[i], "kbjoy2_down", &oric->kbjoy2[1])) continue; + if(read_config_joykey(&sto->lctmp[i], "kbjoy2_left", &oric->kbjoy2[2])) continue; + if(read_config_joykey(&sto->lctmp[i], "kbjoy2_right", &oric->kbjoy2[3])) continue; + if(read_config_joykey(&sto->lctmp[i], "kbjoy2_fire1", &oric->kbjoy2[4])) continue; + if(read_config_joykey(&sto->lctmp[i], "kbjoy2_fire2", &oric->kbjoy2[5])) continue; + if(read_config_joykey(&sto->lctmp[i], "kbjoy2_fire3", &oric->kbjoy2[6])) continue; + if(read_config_bool(&sto->lctmp[i], "diskautosave", &oric->diskautosave)) continue; + if(read_config_bool(&sto->lctmp[i], "ch376", &oric->ch376_activated)) continue; + if(read_config_bool(&sto->lctmp[i], "twilighte_board", &oric->twilighteboard_activated)) continue; + if(read_config_bool(&sto->lctmp[i], "pravdiskautoboot", &oric->pravdiskautoboot)) continue; + if(read_config_bool(&sto->lctmp[i], "disable_menuscheme", &oric->disable_menuscheme)) continue; + if(read_config_bool(&sto->lctmp[i], "show_keyboard", &oric->show_keyboard)) continue; + if(read_config_bool(&sto->lctmp[i], "sticky_mod_keys", &oric->sticky_mod_keys))continue; + if(read_config_path(&sto->lctmp[i], "autoload_keyboard_mapping", keymap_path, 4096)) { - load_keymap = SDL_TRUE; - continue; + load_keymap = SDL_TRUE; + continue; } } - fclose( f ); + fclose(f); } -static void usage( int ret ) +static void usage(int ret) { - printf( VERSION_COPYRIGHTS "\n\n" - "Usage:\toricutron [-a|--arg [option]] [disk file] [tape file] [snapshot file]\n" - " -m / --machine = Specify machine type. Valid types are:\n" - "\n" - " \"atmos\" or \"a\" for Oric Atmos\n" - " \"oric1\" or \"1\" for Oric-1\n" - " \"o16k\" for Oric-1 16k\n" - " \"telestrat\" or \"t\" for Telestrat\n" - " \"pravetz\", \"pravetz8d\" or \"p\" for Pravetz 8D\n" - "\n" - " -d / --disk = Specify a disk image to use in drive 0\n" - " -t / --tape = Specify a tape image to use\n" - " -k / --drive = Specify a disk drive controller. Valid types are:\n" - "\n" - " \"microdisc\" or \"m\" for Microdisc\n" - " \"jasmin\" or \"j\" for Jasmin\n" - " \"bd500\" or \"b\" for Byte Drive 500\n" - " \"pravetz\" or \"p\" for Pravetz\n" - " \"none\" or \"n\"\n" - "\n" - " -s / --symbols = Load symbols from a file\n" - " -f / --fullscreen = Run oricutron fullscreen\n" - " --statusbar = Set initial status bar mode: 'full', 'nofps' or 'none'\n" - " -w / --window = Run oricutron in a window\n" + printf(VERSION_COPYRIGHTS "\n\n" + "Usage:\toricutron [-a|--arg [option]] [disk file] [tape file] [snapshot file]\n" + " -m / --machine = Specify machine type. Valid types are:\n" + "\n" + " \"atmos\" or \"a\" for Oric Atmos\n" + " \"oric1\" or \"1\" for Oric-1\n" + " \"o16k\" for Oric-1 16k\n" + " \"telestrat\" or \"t\" for Telestrat\n" + " \"pravetz\", \"pravetz8d\" or \"p\" for Pravetz 8D\n" + "\n" + " -d / --disk = Specify a disk image to use in drive 0\n" + " -t / --tape = Specify a tape image to use\n" + " -k / --drive = Specify a disk drive controller. Valid types are:\n" + "\n" + " \"microdisc\" or \"m\" for Microdisc\n" + " \"jasmin\" or \"j\" for Jasmin\n" + " \"bd500\" or \"b\" for Byte Drive 500\n" + " \"pravetz\" or \"p\" for Pravetz\n" + " \"none\" or \"n\"\n" + "\n" + " -s / --symbols = Load symbols from a file\n" + " -f / --fullscreen = Run oricutron fullscreen\n" + " --statusbar = Set initial status bar mode: 'full', 'nofps' or 'none'\n" + " -w / --window = Run oricutron in a window\n" #ifdef __OPENGL_AVAILABLE__ - " -R / --rendermode = Render mode. Valid modes are:\n" - "\n" - " \"soft\" for software rendering\n" - " \"opengl\" for OpenGL\n" - "\n" + " -R / --rendermode = Render mode. Valid modes are:\n" + "\n" + " \"soft\" for software rendering\n" + " \"opengl\" for OpenGL\n" + "\n" #endif - " -b / --debug = Start oricutron in the debugger\n" - " -r / --breakpoint = Set a breakpoint\n" - "\n" - " --turbotape on|off = Enable or disable turbotape\n" - " --lightpen on|off = Enable or disable lightpen\n" - " --vsynchack on|off = Enable or disable VSync hack\n" - " --scanlines on|off = Enable or disable scanline simulation\n" - "\n" - " --serial_address N = Set serial card base address to N\n" - " where N is decimal or hexadecimal within the range of $31c..$3fc\n" - " (i.e. 796, 0x31c, $31C represent the same value)\n" - "\n" - " --serial = Set serial card back-end emulation:\n" - "\n" - " \"none\" - no serial\n" - " \"loopback\" - for testing - all TX data is returned to RX\n" + " -b / --debug = Start oricutron in the debugger\n" + " -r / --breakpoint = Set a breakpoint\n" + "\n" + " --turbotape on|off = Enable or disable turbotape\n" + " --lightpen on|off = Enable or disable lightpen\n" + " --vsynchack on|off = Enable or disable VSync hack\n" + " --scanlines on|off = Enable or disable scanline simulation\n" + "\n" + " --serial_address N = Set serial card base address to N\n" + " where N is decimal or hexadecimal within the range of $31c..$3fc\n" + " (i.e. 796, 0x31c, $31C represent the same value)\n" + "\n" + " --serial = Set serial card back-end emulation:\n" + "\n" + " \"none\" - no serial\n" + " \"loopback\" - for testing - all TX data is returned to RX\n" #ifdef BACKEND_MODEM - " \"modem[:port]\" - emulates com port with attached modem,\n" - " only minimal AT command set is supported and\n" - " data is redirected to TCP. Default port is 23 (telnet)\n" + " \"modem[:port]\" - emulates com port with attached modem,\n" + " only minimal AT command set is supported and\n" + " data is redirected to TCP. Default port is 23 (telnet)\n" #endif #ifdef BACKEND_COM - " \"com:115200,8,N,1,\" - use real or virtual on host as emulated ACIA.\n" - " Baudrate, data bits, parity and stop bits can be set as needed\n" - " ex.: Windows: \"com:115200,8,N,1,COM1\"\n" - " Linux: \"com:19200,8,N,1,/dev/ttyS0\"\n" - " \"com:115200,8,N,1,/dev/ttyUSB0\"\n" + " \"com:115200,8,N,1,\" - use real or virtual on host as emulated ACIA.\n" + " Baudrate, data bits, parity and stop bits can be set as needed\n" + " ex.: Windows: \"com:115200,8,N,1,COM1\"\n" + " Linux: \"com:19200,8,N,1,/dev/ttyS0\"\n" + " \"com:115200,8,N,1,/dev/ttyUSB0\"\n" #endif - "\n"); + "\n"); #ifdef __ANDROID__ error_printf("Bad command line."); @@ -726,36 +743,36 @@ static void usage( int ret ) // Print a formatted string into a textzone #ifndef __ANDROID__ -void error_printf( char *fmt, ... ) +void error_printf(char* fmt, ...) { static char str[256]; // Stupid MinGW32 not having vasprintf... va_list ap; - va_start( ap, fmt ); - if( vsnprintf( str, 256, fmt, ap ) != -1 ) + va_start(ap, fmt); + if(vsnprintf(str, 256, fmt, ap) != -1) { str[255] = 0; #ifdef WIN32 - MessageBoxA( NULL, str, "Oricutron", MB_OK ); + MessageBoxA(NULL, str, "Oricutron", MB_OK); #else - fprintf( stderr, "%s\n", str ); + fprintf(stderr, "%s\n", str); #endif } - va_end( ap ); + va_end(ap); } #endif -static SDL_bool on_or_off( char *arg, char *option, SDL_bool *storage ) +static SDL_bool on_or_off(char* arg, char* option, SDL_bool *storage) { - if( option ) + if(option) { - if( strcasecmp( option, "on" ) == 0 ) + if(strcasecmp(option, "on") == 0) { *storage = SDL_TRUE; return SDL_TRUE; } - if( strcasecmp( option, "off" ) == 0 ) + if(strcasecmp(option, "off") == 0) { *storage = SDL_FALSE; return SDL_TRUE; @@ -766,14 +783,14 @@ static SDL_bool on_or_off( char *arg, char *option, SDL_bool *storage ) return SDL_FALSE; } -SDL_bool init( struct machine *oric, int argc, char *argv[] ) +SDL_bool init(struct machine *oric, int argc, char* argv[]) { Sint32 i; struct start_opts *sto; char opt_type, *opt_arg = NULL, *tmp; - sto = malloc( sizeof( struct start_opts ) ); - if( !sto ) return SDL_FALSE; + sto = malloc(sizeof(struct start_opts)); + if(!sto) return SDL_FALSE; // Defaults sto->start_machine = MACH_ATMOS; @@ -800,91 +817,143 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) #else hwsurface = SDL_FALSE; #endif - preinit_ula( oric ); - preinit_machine( oric ); - preinit_render_sw( oric ); - preinit_render_sw8( oric ); + preinit_ula(oric); + preinit_machine(oric); + preinit_render_sw(oric); + preinit_render_sw8(oric); #ifdef __OPENGL_AVAILABLE__ - preinit_render_gl( oric ); + preinit_render_gl(oric); #endif - preinit_gui( oric ); + preinit_gui(oric); kbd_init(oric); // Go SDL! - if( SDL_COMPAT_Init( SDL_INIT_VIDEO | SDL_INIT_AUDIO ) < 0 ) + if(SDL_COMPAT_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) { - free( sto ); + free(sto); return SDL_FALSE; } need_sdl_quit = SDL_TRUE; - render_sw_detectvideo( oric ); + render_sw_detectvideo(oric); - load_config( sto, oric ); + load_config(sto, oric); - for( i=1; itapeturbo ) ) exit( EXIT_FAILURE ); + if(!on_or_off(argv[i-1], opt_arg, &oric->tapeturbo)) exit(EXIT_FAILURE); continue; } - if( strcasecmp( tmp, "lightpen" ) == 0 ) + if(strcasecmp(tmp, "lightpen") == 0) { - if( !on_or_off( argv[i-1], opt_arg, &oric->lightpen ) ) exit( EXIT_FAILURE ); + if(!on_or_off(argv[i-1], opt_arg, &oric->lightpen)) exit(EXIT_FAILURE); continue; } - if( strcasecmp( tmp, "serial_address" ) == 0 ) + if(strcasecmp(tmp, "serial_address") == 0) { - if( !opt_arg ) - exit( EXIT_FAILURE ); - if( '$' == opt_arg[0] && 1 == sscanf(opt_arg, "$%x", &oric->aciaoffset) ) + if(!opt_arg) + exit(EXIT_FAILURE); + if('$' == opt_arg[0] && 1 == sscanf(opt_arg, "$%x", &oric->aciaoffset)) continue; - if( '0' == opt_arg[0] && 1 == sscanf(opt_arg, "0x%x", &oric->aciaoffset) ) + if('0' == opt_arg[0] && 1 == sscanf(opt_arg, "0x%x", &oric->aciaoffset)) continue; - if( '0' == opt_arg[0] && 1 == sscanf(opt_arg, "0X%x", &oric->aciaoffset) ) + if('0' == opt_arg[0] && 1 == sscanf(opt_arg, "0X%x", &oric->aciaoffset)) continue; - if( 1 == sscanf(opt_arg, "%d", &oric->aciaoffset) ) + if(1 == sscanf(opt_arg, "%d", &oric->aciaoffset)) continue; - exit( EXIT_FAILURE ); + exit(EXIT_FAILURE); } - if( strcasecmp( tmp, "serial" ) == 0 ) + if(strcasecmp(tmp, "serial") == 0) { oric->aciabackendcfg = oric->aciabackend = ACIA_TYPE_NONE; if(!strcasecmp("none", opt_arg)) @@ -898,17 +967,21 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) oric->aciabackendcfg = oric->aciabackend = ACIA_TYPE_MODEM; oric->aciabackendcfgport = 0; oric->aciabackendcfgdomain = 4; - if(p) { + if(p) + { char* p2 = strchr(p+1, ':'); - if (p2) { - // check if we want IPv6 - if (strcasecmp(p2+1, "ipv6")==0) - oric->aciabackendcfgdomain = 6; - *p2 = '\0'; // temporarily place a \0 to isolate the port part of the string - oric->aciabackendcfgport = atoi(p+1); // get the port part of the string - *p2 = ':'; // put back the semicolon - } else { - oric->aciabackendcfgport = atoi(p+1); + if(p2) + { + // check if we want IPv6 + if(strcasecmp(p2+1, "ipv6")==0) + oric->aciabackendcfgdomain = 6; + *p2 = '\0'; // temporarily place a \0 to isolate the port part of the string + oric->aciabackendcfgport = atoi(p+1); // get the port part of the string + *p2 = ':'; // put back the semicolon + } + else + { + oric->aciabackendcfgport = atoi(p+1); } } if(oric->aciabackendcfgport <= 0) @@ -926,53 +999,53 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) continue; } - if( strcasecmp( tmp, "vsynchack" ) == 0 ) + if(strcasecmp(tmp, "vsynchack") == 0) { - if( !on_or_off( argv[i-1], opt_arg, &oric->vsynchack ) ) exit( EXIT_FAILURE ); + if(!on_or_off(argv[i-1], opt_arg, &oric->vsynchack)) exit(EXIT_FAILURE); continue; } - if( strcasecmp( tmp, "scanlines" ) == 0 ) + if(strcasecmp(tmp, "scanlines") == 0) { - if( !on_or_off( argv[i-1], opt_arg, &oric->scanlines ) ) exit( EXIT_FAILURE ); + if(!on_or_off(argv[i-1], opt_arg, &oric->scanlines)) exit(EXIT_FAILURE); continue; } - if( strcasecmp( tmp, "statusbar" ) == 0 ) + if(strcasecmp(tmp, "statusbar") == 0) { - if( opt_arg ) + if(opt_arg) { - if( strcasecmp( opt_arg, "none" ) == 0 ) + if(strcasecmp(opt_arg, "none") == 0) { oric->statusbar_mode = STATUSBARMODE_NONE; continue; } - if( strcasecmp( opt_arg, "full" ) == 0 ) + if(strcasecmp(opt_arg, "full") == 0) { oric->statusbar_mode = STATUSBARMODE_FULL; continue; } - if( strcasecmp( opt_arg, "nofps" ) == 0 ) + if(strcasecmp(opt_arg, "nofps") == 0) { oric->statusbar_mode = STATUSBARMODE_NOFPS; continue; } } - error_printf( "Invalid statusbar mode" ); - free( sto ); - exit( EXIT_FAILURE ); + error_printf("Invalid statusbar mode"); + free(sto); + exit(EXIT_FAILURE); } break; default: opt_type = argv[i][1]; opt_arg = NULL; - if (argv[i][2]) + if(argv[i][2]) opt_arg = &argv[i][2]; - else if ( i<(argc-1)) + else if(i<(argc-1)) { - switch (opt_type) + switch(opt_type) { case 'm': case 'd': @@ -983,48 +1056,48 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) #ifdef __OPENGL_AVAILABLE__ case 'R': #endif - opt_arg = argv[i+1]; + opt_arg = argv[i+1]; i++; } } break; } - switch( opt_type ) + switch(opt_type) { case 'm': // Machine type - if( opt_arg ) + if(opt_arg) { - if(( strcasecmp( opt_arg, "atmos" ) == 0 ) || - ( strcasecmp( opt_arg, "a" ) == 0 )) + if((strcasecmp(opt_arg, "atmos") == 0) || + (strcasecmp(opt_arg, "a") == 0)) { sto->start_machine = MACH_ATMOS; sto->start_machine_set = SDL_TRUE; break; } - if(( strcasecmp( opt_arg, "oric1" ) == 0 ) || - ( strcasecmp( opt_arg, "1" ) == 0 )) + if((strcasecmp(opt_arg, "oric1") == 0) || + (strcasecmp(opt_arg, "1") == 0)) { sto->start_machine = MACH_ORIC1; sto->start_machine_set = SDL_TRUE; break; } - if( strcasecmp( opt_arg, "o16k" ) == 0 ) + if(strcasecmp(opt_arg, "o16k") == 0) { sto->start_machine = MACH_ORIC1_16K; sto->start_machine_set = SDL_TRUE; break; } - if(( strcasecmp( opt_arg, "telestrat" ) == 0 ) || - ( strcasecmp( opt_arg, "t" ) == 0 )) + if((strcasecmp(opt_arg, "telestrat") == 0) || + (strcasecmp(opt_arg, "t") == 0)) { sto->start_machine = MACH_TELESTRAT; sto->start_machine_set = SDL_TRUE; break; } - if(( strcasecmp( opt_arg, "pravetz" ) == 0 ) || - ( strcasecmp( opt_arg, "pravetz8d" ) == 0 ) || - ( strcasecmp( opt_arg, "p" ) == 0 )) + if((strcasecmp(opt_arg, "pravetz") == 0) || + (strcasecmp(opt_arg, "pravetz8d") == 0) || + (strcasecmp(opt_arg, "p") == 0)) { sto->start_machine = MACH_PRAVETZ; sto->start_machine_set = SDL_TRUE; @@ -1032,84 +1105,86 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) } } - error_printf( "Invalid machine type" ); - free( sto ); - exit( EXIT_FAILURE ); + error_printf("Invalid machine type"); + free(sto); + exit(EXIT_FAILURE); break; case 't': // Tape image - { - SDL_bool drop_through = SDL_FALSE; - if( opt_arg ) { - switch (detect_image_type(opt_arg)) + SDL_bool drop_through = SDL_FALSE; + if(opt_arg) { - case IMG_ATMOS_MICRODISC: - case IMG_ATMOS_JASMIN: - case IMG_TELESTRAT_DISK: - case IMG_BD500_DISK: - case IMG_PRAVETZ_DISK: - case IMG_GUESS_MICRODISC: - printf("'%s' seems to be a disk image.\n", opt_arg); - drop_through = SDL_TRUE; - break; - - case IMG_SNAPSHOT: - printf("'%s' seems to be a snapshot file.\n", opt_arg); - strncpy( sto->start_snapshot, opt_arg, 1024); - sto->start_snapshot[1023] = 0; - break; - - case IMG_TAPE: - default: - strncpy( sto->start_tape, opt_arg, 1024 ); - sto->start_tape[1023] = 0; - break; + switch(detect_image_type(opt_arg)) + { + case IMG_ATMOS_MICRODISC: + case IMG_ATMOS_JASMIN: + case IMG_TELESTRAT_DISK: + case IMG_BD500_DISK: + case IMG_PRAVETZ_DISK: + case IMG_GUESS_MICRODISC: + printf("'%s' seems to be a disk image.\n", opt_arg); + drop_through = SDL_TRUE; + break; + + case IMG_SNAPSHOT: + printf("'%s' seems to be a snapshot file.\n", opt_arg); + strncpy(sto->start_snapshot, opt_arg, 1024); + sto->start_snapshot[1023] = 0; + break; + + case IMG_TAPE: + default: + strncpy(sto->start_tape, opt_arg, 1024); + sto->start_tape[1023] = 0; + break; + } + } + else + { + error_printf("No tape image specified"); + free(sto); + exit(EXIT_FAILURE); } - } else { - error_printf( "No tape image specified" ); - free( sto ); - exit( EXIT_FAILURE ); - } - if (!drop_through) - break; - } + if(!drop_through) + break; + } case 'd': // Disk image - if( opt_arg ) + if(opt_arg) { - strncpy( sto->start_disk, opt_arg, 1024 ); + strncpy(sto->start_disk, opt_arg, 1024); sto->start_disk[1023] = 0; - switch (detect_image_type(sto->start_disk)) + switch(detect_image_type(sto->start_disk)) { case IMG_ATMOS_MICRODISC: - if (!sto->start_machine_set) sto->start_machine = MACH_ATMOS; - if (!sto->start_disktype_set) sto->start_disktype = DRV_MICRODISC; + if(!sto->start_machine_set) sto->start_machine = MACH_ATMOS; + if(!sto->start_disktype_set) sto->start_disktype = DRV_MICRODISC; break; case IMG_ATMOS_JASMIN: - if (!sto->start_machine_set) sto->start_machine = MACH_ATMOS; - if (!sto->start_disktype_set) sto->start_disktype = DRV_JASMIN; + if(!sto->start_machine_set) sto->start_machine = MACH_ATMOS; + if(!sto->start_disktype_set) sto->start_disktype = DRV_JASMIN; break; case IMG_TELESTRAT_DISK: - if (!sto->start_machine_set) sto->start_machine = MACH_TELESTRAT; - if (!sto->start_disktype_set) sto->start_disktype = DRV_MICRODISC; + if(!sto->start_machine_set) sto->start_machine = MACH_TELESTRAT; + if(!sto->start_disktype_set) sto->start_disktype = DRV_MICRODISC; break; case IMG_BD500_DISK: - if (!sto->start_machine_set) sto->start_machine = MACH_ATMOS; - if (!sto->start_disktype_set) sto->start_disktype = DRV_BD500; + if(!sto->start_machine_set) sto->start_machine = MACH_ATMOS; + if(!sto->start_disktype_set) sto->start_disktype = DRV_BD500; break; case IMG_PRAVETZ_DISK: - if (!sto->start_machine_set) sto->start_machine = MACH_PRAVETZ; - if (!sto->start_disktype_set) sto->start_disktype = DRV_PRAVETZ; + if(!sto->start_machine_set) sto->start_machine = MACH_PRAVETZ; + if(!sto->start_disktype_set) sto->start_disktype = DRV_PRAVETZ; break; case IMG_GUESS_MICRODISC: - if (!sto->start_disktype_set) sto->start_disktype = DRV_MICRODISC; + if(!sto->start_disktype_set) sto->start_disktype = DRV_MICRODISC; break; case IMG_TAPE: @@ -1120,59 +1195,61 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) case IMG_SNAPSHOT: printf("'%s' seems to be a snapshot file.\n", opt_arg); - strncpy( sto->start_snapshot, opt_arg, 1024); + strncpy(sto->start_snapshot, opt_arg, 1024); sto->start_snapshot[1023] = 0; sto->start_disk[0] = 0; break; } - if( sto->start_disk[0] ) + if(sto->start_disk[0]) { - if( sto->start_disks_count < 4 ) + if(sto->start_disks_count < 4) { - strcpy( sto->start_disks[sto->start_disks_count], sto->start_disk ); + strcpy(sto->start_disks[sto->start_disks_count], sto->start_disk); sto->start_disks_count++; } } - } else { - error_printf( "No disk image specified" ); - free( sto ); - exit( EXIT_FAILURE ); + } + else + { + error_printf("No disk image specified"); + free(sto); + exit(EXIT_FAILURE); } break; case 'k': // Drive controller type - if( opt_arg ) + if(opt_arg) { - if(( strcasecmp( opt_arg, "microdisc" ) == 0 ) || - ( strcasecmp( opt_arg, "m" ) == 0 )) + if((strcasecmp(opt_arg, "microdisc") == 0) || + (strcasecmp(opt_arg, "m") == 0)) { sto->start_disktype = DRV_MICRODISC; sto->start_disktype_set = SDL_TRUE; break; } - if(( strcasecmp( opt_arg, "bd500" ) == 0 ) || - ( strcasecmp( opt_arg, "b" ) == 0 )) + if((strcasecmp(opt_arg, "bd500") == 0) || + (strcasecmp(opt_arg, "b") == 0)) { sto->start_disktype = DRV_BD500; sto->start_disktype_set = SDL_TRUE; break; } - if(( strcasecmp( opt_arg, "jasmin" ) == 0 ) || - ( strcasecmp( opt_arg, "j" ) == 0 )) + if((strcasecmp(opt_arg, "jasmin") == 0) || + (strcasecmp(opt_arg, "j") == 0)) { sto->start_disktype = DRV_JASMIN; sto->start_disktype_set = SDL_TRUE; break; } - if(( strcasecmp( opt_arg, "pravetz" ) == 0 ) || - ( strcasecmp( opt_arg, "p" ) == 0 )) + if((strcasecmp(opt_arg, "pravetz") == 0) || + (strcasecmp(opt_arg, "p") == 0)) { sto->start_disktype = DRV_PRAVETZ; sto->start_disktype_set = SDL_TRUE; break; } - if(( strcasecmp( opt_arg, "none" ) == 0 ) || - ( strcasecmp( opt_arg, "n" ) == 0 )) + if((strcasecmp(opt_arg, "none") == 0) || + (strcasecmp(opt_arg, "n") == 0)) { sto->start_disktype = DRV_NONE; sto->start_disktype_set = SDL_FALSE; @@ -1180,30 +1257,32 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) } } - error_printf( "Invalid drive type" ); - free( sto ); - exit( EXIT_FAILURE ); + error_printf("Invalid drive type"); + free(sto); + exit(EXIT_FAILURE); break; case 's': // Pre-load symbols file - if( opt_arg ) + if(opt_arg) { - if( sto->start_syms_count < 32 ) + if(sto->start_syms_count < 32) { - char* new_syms = strdup( opt_arg ); - if( NULL != new_syms ) + char* new_syms = strdup(opt_arg); + if(NULL != new_syms) sto->start_syms_files[sto->start_syms_count++] = new_syms; } - } else { - error_printf( "No symbols file specified" ); - free( sto ); - exit( EXIT_FAILURE ); + } + else + { + error_printf("No symbols file specified"); + free(sto); + exit(EXIT_FAILURE); } break; case 'f': fullscreen = SDL_TRUE; - oric->statusbar_mode = STATUSBARMODE_NONE; + oric->statusbar_mode = STATUSBARMODE_NONE; break; case 'w': @@ -1215,85 +1294,93 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) break; case 'r': // Breakpoint - if( opt_arg ) + if(opt_arg) { sto->start_breakpoint = opt_arg; } else { - error_printf( "Breakpoint address or symbol expected" ); - free( sto ); - exit( EXIT_FAILURE ); + error_printf("Breakpoint address or symbol expected"); + free(sto); + exit(EXIT_FAILURE); } break; #ifdef __OPENGL_AVAILABLE__ case 'R': // Render mode - if( opt_arg ) + if(opt_arg) { - if( strcasecmp( opt_arg, "soft" ) == 0 ) { sto->start_rendermode = RENDERMODE_SW; break; } - if( strcasecmp( opt_arg, "opengl" ) == 0 ) { sto->start_rendermode = RENDERMODE_GL; break; } + if(strcasecmp(opt_arg, "soft") == 0) + { + sto->start_rendermode = RENDERMODE_SW; + break; + } + if(strcasecmp(opt_arg, "opengl") == 0) + { + sto->start_rendermode = RENDERMODE_GL; + break; + } } - error_printf( "Invalid render mode" ); - free( sto ); - exit( EXIT_FAILURE ); + error_printf("Invalid render mode"); + free(sto); + exit(EXIT_FAILURE); break; #endif case 'h': - free( sto ); - usage( EXIT_SUCCESS ); + free(sto); + usage(EXIT_SUCCESS); break; } } else { - switch (detect_image_type(argv[i])) + switch(detect_image_type(argv[i])) { case IMG_SNAPSHOT: - strncpy( sto->start_snapshot, argv[i], 1024); + strncpy(sto->start_snapshot, argv[i], 1024); sto->start_snapshot[1023] = 0; break; case IMG_ATMOS_MICRODISC: - if (!sto->start_machine_set) sto->start_machine = MACH_ATMOS; - if (!sto->start_disktype_set) sto->start_disktype = DRV_MICRODISC; - strncpy( sto->start_disk, argv[i], 1024 ); + if(!sto->start_machine_set) sto->start_machine = MACH_ATMOS; + if(!sto->start_disktype_set) sto->start_disktype = DRV_MICRODISC; + strncpy(sto->start_disk, argv[i], 1024); sto->start_disk[1023] = 0; break; case IMG_ATMOS_JASMIN: - if (!sto->start_machine_set) sto->start_machine = MACH_ATMOS; - if (!sto->start_disktype_set) sto->start_disktype = DRV_JASMIN; - strncpy( sto->start_disk, argv[i], 1024 ); + if(!sto->start_machine_set) sto->start_machine = MACH_ATMOS; + if(!sto->start_disktype_set) sto->start_disktype = DRV_JASMIN; + strncpy(sto->start_disk, argv[i], 1024); sto->start_disk[1023] = 0; break; case IMG_TELESTRAT_DISK: - if (!sto->start_machine_set) sto->start_machine = MACH_TELESTRAT; - if (!sto->start_disktype_set) sto->start_disktype = DRV_MICRODISC; - strncpy( sto->start_disk, argv[i], 1024 ); + if(!sto->start_machine_set) sto->start_machine = MACH_TELESTRAT; + if(!sto->start_disktype_set) sto->start_disktype = DRV_MICRODISC; + strncpy(sto->start_disk, argv[i], 1024); sto->start_disk[1023] = 0; break; case IMG_BD500_DISK: - if (!sto->start_machine_set) sto->start_machine = MACH_ATMOS; - if (!sto->start_disktype_set) sto->start_disktype = DRV_BD500; - strncpy( sto->start_disk, argv[i], 1024 ); + if(!sto->start_machine_set) sto->start_machine = MACH_ATMOS; + if(!sto->start_disktype_set) sto->start_disktype = DRV_BD500; + strncpy(sto->start_disk, argv[i], 1024); sto->start_disk[1023] = 0; break; case IMG_PRAVETZ_DISK: - if (!sto->start_machine_set) sto->start_machine = MACH_PRAVETZ; - if (!sto->start_disktype_set) sto->start_disktype = DRV_PRAVETZ; - strncpy( sto->start_disk, argv[i], 1024 ); + if(!sto->start_machine_set) sto->start_machine = MACH_PRAVETZ; + if(!sto->start_disktype_set) sto->start_disktype = DRV_PRAVETZ; + strncpy(sto->start_disk, argv[i], 1024); sto->start_disk[1023] = 0; break; case IMG_GUESS_MICRODISC: - if (!sto->start_disktype_set) sto->start_disktype = DRV_MICRODISC; - strncpy( sto->start_disk, argv[i], 1024 ); + if(!sto->start_disktype_set) sto->start_disktype = DRV_MICRODISC; + strncpy(sto->start_disk, argv[i], 1024); sto->start_disk[1023] = 0; break; @@ -1303,79 +1390,103 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) break; default: - free( sto ); - usage( EXIT_FAILURE ); + free(sto); + usage(EXIT_FAILURE); } - if( sto->start_disk[0] ) + if(sto->start_disk[0]) { - if( sto->start_disks_count < 4 ) + if(sto->start_disks_count < 4) { - strcpy( sto->start_disks[sto->start_disks_count], sto->start_disk ); + strcpy(sto->start_disks[sto->start_disks_count], sto->start_disk); sto->start_disks_count++; } } } } - load_diskroms( oric ); + load_diskroms(oric); - if( ( sto->start_disk[0] ) && ( sto->start_disktype == DRV_NONE ) ) + if((sto->start_disk[0]) && (sto->start_disktype == DRV_NONE)) sto->start_disktype = DRV_MICRODISC; - for( i=0; i<8; i++ ) lastframetimes[i] = 0; + for(i=0; i<8; i++) lastframetimes[i] = 0; frametimeave = 0; - setoverclock( oric, NULL, 0 ); - if( !init_gui( oric, sto->start_rendermode ) ) { free( sto ); return SDL_FALSE; } - if( !init_filerequester( oric ) ) { free( sto ); return SDL_FALSE; } - if( !init_msgbox( oric ) ) { free( sto ); return SDL_FALSE; } + setoverclock(oric, NULL, 0); + if(!init_gui(oric, sto->start_rendermode)) + { + free(sto); + return SDL_FALSE; + } + if(!init_filerequester(oric)) + { + free(sto); + return SDL_FALSE; + } + if(!init_msgbox(oric)) + { + free(sto); + return SDL_FALSE; + } oric->drivetype = sto->start_disktype; - if( !init_ula( oric ) ) { free( sto ); return SDL_FALSE; } - if( !init_joy( oric ) ) { free( sto ); return SDL_FALSE; } - if( !init_machine( oric, sto->start_machine, SDL_TRUE ) ) { free( sto ); return SDL_FALSE; } + if(!init_ula(oric)) + { + free(sto); + return SDL_FALSE; + } + if(!init_joy(oric)) + { + free(sto); + return SDL_FALSE; + } + if(!init_machine(oric, sto->start_machine, SDL_TRUE)) + { + free(sto); + return SDL_FALSE; + } - if( sto->start_disk[0] ) + if(sto->start_disk[0]) { #ifdef WWW - // NOT SURE WHY I HAD TO DO THIS ??? - if( sto->start_disk[0] ) + // NOT SURE WHY I HAD TO DO THIS ??? + if(sto->start_disk[0]) + { + if(sto->start_disks_count < 4) { - if( sto->start_disks_count < 4 ) - { - strcpy( sto->start_disks[sto->start_disks_count], sto->start_disk ); - sto->start_disks_count++; - } + strcpy(sto->start_disks[sto->start_disks_count], sto->start_disk); + sto->start_disks_count++; } + } #endif - switch (detect_image_type(sto->start_disk)) + switch(detect_image_type(sto->start_disk)) { case IMG_ATMOS_MICRODISC: - if (!sto->start_machine_set) sto->start_machine = MACH_ATMOS; - if (!sto->start_disktype_set) sto->start_disktype = DRV_MICRODISC; + if(!sto->start_machine_set) sto->start_machine = MACH_ATMOS; + if(!sto->start_disktype_set) sto->start_disktype = DRV_MICRODISC; break; case IMG_ATMOS_JASMIN: - if (!sto->start_machine_set) sto->start_machine = MACH_ATMOS; - if (!sto->start_disktype_set) sto->start_disktype = DRV_JASMIN; + if(!sto->start_machine_set) sto->start_machine = MACH_ATMOS; + if(!sto->start_disktype_set) sto->start_disktype = DRV_JASMIN; break; case IMG_TELESTRAT_DISK: - if (!sto->start_machine_set) sto->start_machine = MACH_TELESTRAT; - if (!sto->start_disktype_set) sto->start_disktype = DRV_MICRODISC; + if(!sto->start_machine_set) sto->start_machine = MACH_TELESTRAT; + if(!sto->start_disktype_set) sto->start_disktype = DRV_MICRODISC; break; case IMG_BD500_DISK: - if (!sto->start_machine_set) sto->start_machine = MACH_ATMOS; - if (!sto->start_disktype_set) sto->start_disktype = DRV_BD500; + if(!sto->start_machine_set) sto->start_machine = MACH_ATMOS; + if(!sto->start_disktype_set) sto->start_disktype = DRV_BD500; break; case IMG_PRAVETZ_DISK: - if (!sto->start_machine_set) sto->start_machine = MACH_PRAVETZ; - if (!sto->start_disktype_set) sto->start_disktype = DRV_PRAVETZ; + if(!sto->start_machine_set) sto->start_machine = MACH_PRAVETZ; + if(!sto->start_disktype_set) sto->start_disktype = DRV_PRAVETZ; break; case IMG_GUESS_MICRODISC: - if (!sto->start_disktype_set) sto->start_disktype = DRV_MICRODISC; + if(!sto->start_disktype_set) sto->start_disktype = DRV_MICRODISC; break; case IMG_TAPE: @@ -1386,24 +1497,24 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) case IMG_SNAPSHOT: printf("'%s' seems to be a snapshot file.\n", opt_arg); - strncpy( sto->start_snapshot, opt_arg, 1024); + strncpy(sto->start_snapshot, opt_arg, 1024); sto->start_snapshot[1023] = 0; sto->start_disk[0] = 0; break; } - for( i=0; i<4; i++ ) + for(i=0; i<4; i++) { - disk_eject( oric, i ); + disk_eject(oric, i); } - for( i=0; istart_disks_count; i++ ) + for(i=0; istart_disks_count; i++) { - diskimage_load( oric, sto->start_disks[i], i ); + diskimage_load(oric, sto->start_disks[i], i); } - switch (oric->drivetype) + switch(oric->drivetype) { case DRV_PRAVETZ: - pravdiskboot( oric ); + pravdiskboot(oric); break; case DRV_JASMIN: @@ -1411,64 +1522,64 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) break; } } - if( sto->start_tape[0] ) + if(sto->start_tape[0]) { - if( tape_load_tap( oric, sto->start_tape ) ) - queuekeys( "CLOAD\"\"\x0d" ); + if(tape_load_tap(oric, sto->start_tape)) + queuekeys("CLOAD\"\"\x0d"); } #ifndef WWW_NO_MONITOR - mon_init( oric ); - if( sto->start_syms[0] ) - mon_new_symbols( &oric->usersyms, oric, sto->start_syms, SYM_BESTGUESS, SDL_TRUE, SDL_TRUE ); + mon_init(oric); + if(sto->start_syms[0]) + mon_new_symbols(&oric->usersyms, oric, sto->start_syms, SYM_BESTGUESS, SDL_TRUE, SDL_TRUE); - for( i=0; istart_syms_count; i++ ) + for(i=0; istart_syms_count; i++) { - if( NULL!=sto->start_syms_files[i] ) + if(NULL!=sto->start_syms_files[i]) { - mon_new_symbols( &oric->usersyms, oric, sto->start_syms_files[i], SYM_BESTGUESS, SDL_TRUE, SDL_TRUE ); + mon_new_symbols(&oric->usersyms, oric, sto->start_syms_files[i], SYM_BESTGUESS, SDL_TRUE, SDL_TRUE); free(sto->start_syms_files[i]); sto->start_syms_files[i] = NULL; } } sto->start_syms_count = 0; - if( sto->start_breakpoint ) + if(sto->start_breakpoint) { - if( sto->start_breakpoint[0] == ':' ) + if(sto->start_breakpoint[0] == ':') { SDL_bool needrender = SDL_FALSE; char bsbuf[32]; char* fn = sto->start_breakpoint + 1; - FILE* f = fopen( fn, "rt" ); - if( !f ) + FILE* f = fopen(fn, "rt"); + if(!f) { - error_printf( "Invalid breakpoint file" ); - free( sto ); + error_printf("Invalid breakpoint file"); + free(sto); return SDL_FALSE; } - while( !feof( f ) ) + while(!feof(f)) { char* p; - if( !fgets( bsbuf, 32, f ) ) break; + if(!fgets(bsbuf, 32, f)) break; bsbuf[31] = 0; - while( NULL != (p = strchr( bsbuf, '\r' )) ) *p = 0; - while( NULL != (p = strchr( bsbuf, '\n' )) ) *p = 0; - while( NULL != (p = strchr( bsbuf, '\t' )) ) *p = ' '; + while(NULL != (p = strchr(bsbuf, '\r'))) *p = 0; + while(NULL != (p = strchr(bsbuf, '\n'))) *p = 0; + while(NULL != (p = strchr(bsbuf, '\t'))) *p = ' '; p = bsbuf; - while( *p && isws( *p ) ) p++; - if( *p ) mon_cmd( bsbuf, oric, &needrender ); + while(*p && isws(*p)) p++; + if(*p) mon_cmd(bsbuf, oric, &needrender); } - fclose( f ); + fclose(f); } else { int off = 0; unsigned int addr; - if( !mon_getnum( oric, &addr, sto->start_breakpoint, &off, SDL_FALSE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) + if(!mon_getnum(oric, &addr, sto->start_breakpoint, &off, SDL_FALSE, SDL_FALSE, SDL_FALSE, SDL_TRUE)) { - error_printf( "Invalid breakpoint" ); - free( sto ); + error_printf("Invalid breakpoint"); + free(sto); return SDL_FALSE; } @@ -1477,65 +1588,65 @@ SDL_bool init( struct machine *oric, int argc, char *argv[] ) } } - if( sto->start_snapshot[0] ) - load_snapshot( oric, sto->start_snapshot ); + if(sto->start_snapshot[0]) + load_snapshot(oric, sto->start_snapshot); - if( sto->start_debug ) - setemumode( oric, NULL, EM_DEBUG ); + if(sto->start_debug) + setemumode(oric, NULL, EM_DEBUG); #endif - free( sto ); + free(sto); return SDL_TRUE; } -void shut( struct machine *oric ) +void shut(struct machine *oric) { - if( vidcap ) avi_close( &vidcap ); + if(vidcap) avi_close(&vidcap); #if defined(DEBUG_CPU_TRACE) && DEBUG_CPU_TRACE > 0 dump_cputrace(oric); #endif - if( oric ) + if(oric) { - shut_machine( oric ); - shut_joy( oric ); - shut_ula( oric ); + shut_machine(oric); + shut_joy(oric); + shut_ula(oric); #ifndef WWW_NO_MONITOR - mon_shut( oric ); + mon_shut(oric); #endif - shut_filerequester( oric ); - shut_msgbox( oric ); - shut_gui( oric ); + shut_filerequester(oric); + shut_msgbox(oric); + shut_gui(oric); } - if( need_sdl_quit ) - SDL_COMPAT_Quit( SDL_TRUE ); + if(need_sdl_quit) + SDL_COMPAT_Quit(SDL_TRUE); } -void frameloop_overclock( struct machine *oric, SDL_bool *framedone, SDL_bool *needrender ) +void frameloop_overclock(struct machine *oric, SDL_bool *framedone, SDL_bool *needrender) { int instloop, instcycles; - while( ( !(*framedone) ) && ( !(*needrender) ) ) + while((!(*framedone)) && (!(*needrender))) { - while( oric->cpu.rastercycles > 0 ) + while(oric->cpu.rastercycles > 0) { /* Do as many instructions as the overclock multiple */ - for( instloop=0, instcycles=0; instloop < oric->overclockmult; instloop++ ) + for(instloop=0, instcycles=0; instloop < oric->overclockmult; instloop++) { - if( m6502_set_icycles( &oric->cpu, SDL_TRUE, mon_bpmsg ) ) + if(m6502_set_icycles(&oric->cpu, SDL_TRUE, mon_bpmsg)) { #ifndef WWW_NO_MONITOR // Hit breakpoint - setemumode( oric, NULL, EM_DEBUG ); + setemumode(oric, NULL, EM_DEBUG); *needrender = SDL_TRUE; #endif break; } instcycles += oric->cpu.icycles; - tape_patches( oric ); + tape_patches(oric); - if( instloop < (oric->overclockmult-1) ) + if(instloop < (oric->overclockmult-1)) { - if (m6502_inst( &oric->cpu )) + if(m6502_inst(&oric->cpu)) break; } } @@ -1544,131 +1655,131 @@ void frameloop_overclock( struct machine *oric, SDL_bool *framedone, SDL_bool *n instcycles >>= oric->overclockshift; /* Move the emulation on */ - via_clock( &oric->via, instcycles ); - ay_ticktock( &oric->ay, instcycles ); + via_clock(&oric->via, instcycles); + ay_ticktock(&oric->ay, instcycles); - switch( oric->drivetype ) + switch(oric->drivetype) { case DRV_MICRODISC: case DRV_BD500: case DRV_JASMIN: - wd17xx_ticktock( &oric->wddisk, instcycles ); + wd17xx_ticktock(&oric->wddisk, instcycles); break; } - if( oric->type == MACH_TELESTRAT ) + if(oric->type == MACH_TELESTRAT) { - via_clock( &oric->tele_via, instcycles ); + via_clock(&oric->tele_via, instcycles); } - if( oric->aciabackend ) - acia_clock( &oric->tele_acia, instcycles ); + if(oric->aciabackend) + acia_clock(&oric->tele_acia, instcycles); oric->cpu.rastercycles -= instcycles; /* If we hit a breakpoint above, we do not want to execute the */ /* instruction that caused the breakpoint */ - if( oric->emu_mode != EM_RUNNING ) break; - if( m6502_inst( &oric->cpu ) ) + if(oric->emu_mode != EM_RUNNING) break; + if(m6502_inst(&oric->cpu)) { // Hit JAM instruction #ifndef WWW_NO_MONITOR - mon_printf_above( "Opcode %02X executed at %04X", oric->cpu.calcop, oric->cpu.lastpc ); - setemumode( oric, NULL, EM_DEBUG ); + mon_printf_above("Opcode %02X executed at %04X", oric->cpu.calcop, oric->cpu.lastpc); + setemumode(oric, NULL, EM_DEBUG); *needrender = SDL_TRUE; #endif break; } } - if( oric->cpu.rastercycles <= 0 ) + if(oric->cpu.rastercycles <= 0) { - *framedone = ula_doraster( oric ); + *framedone = ula_doraster(oric); oric->cpu.rastercycles += oric->cyclesperraster; } } } -void frameloop_normal( struct machine *oric, SDL_bool *framedone, SDL_bool *needrender ) +void frameloop_normal(struct machine *oric, SDL_bool *framedone, SDL_bool *needrender) { - while( ( !(*framedone) ) && ( !(*needrender) ) ) + while((!(*framedone)) && (!(*needrender))) { - while( oric->cpu.rastercycles > 0 ) + while(oric->cpu.rastercycles > 0) { - if( m6502_set_icycles( &oric->cpu, SDL_TRUE, mon_bpmsg ) ) + if(m6502_set_icycles(&oric->cpu, SDL_TRUE, mon_bpmsg)) { #ifndef WWW_NO_MONITOR // Hit breakpoint - setemumode( oric, NULL, EM_DEBUG ); + setemumode(oric, NULL, EM_DEBUG); *needrender = SDL_TRUE; #endif break; } - if (!oric->twilighteboard_activated) - tape_patches( oric ); + if(!oric->twilighteboard_activated) + tape_patches(oric); - via_clock( &oric->via, oric->cpu.icycles ); - ay_ticktock( &oric->ay, oric->cpu.icycles ); + via_clock(&oric->via, oric->cpu.icycles); + ay_ticktock(&oric->ay, oric->cpu.icycles); - switch( oric->drivetype ) + switch(oric->drivetype) { case DRV_MICRODISC: case DRV_BD500: case DRV_JASMIN: - wd17xx_ticktock( &oric->wddisk, oric->cpu.icycles ); + wd17xx_ticktock(&oric->wddisk, oric->cpu.icycles); break; } - if( oric->type == MACH_TELESTRAT ) + if(oric->type == MACH_TELESTRAT) { - via_clock( &oric->tele_via, oric->cpu.icycles ); + via_clock(&oric->tele_via, oric->cpu.icycles); } - if( oric->aciabackend ) - acia_clock( &oric->tele_acia, oric->cpu.icycles ); + if(oric->aciabackend) + acia_clock(&oric->tele_acia, oric->cpu.icycles); oric->cpu.rastercycles -= oric->cpu.icycles; - if( m6502_inst( &oric->cpu ) ) + if(m6502_inst(&oric->cpu)) { #ifndef WWW_NO_MONITOR // Hit JAM instruction - mon_printf_above( "Opcode %02X executed at %04X", oric->cpu.calcop, oric->cpu.lastpc ); - setemumode( oric, NULL, EM_DEBUG ); + mon_printf_above("Opcode %02X executed at %04X", oric->cpu.calcop, oric->cpu.lastpc); + setemumode(oric, NULL, EM_DEBUG); *needrender = SDL_TRUE; #endif break; } } - if( oric->cpu.rastercycles <= 0 ) + if(oric->cpu.rastercycles <= 0) { - *framedone = ula_doraster( oric ); + *framedone = ula_doraster(oric); oric->cpu.rastercycles += oric->cyclesperraster; } } } /* Tasks to do once per emulated frame */ -void once_per_frame( struct machine *oric ) +void once_per_frame(struct machine *oric) { int i; - if( oric->diskautosave ) + if(oric->diskautosave) { - for( i=0; i<4; i++ ) + for(i=0; i<4; i++) { - if( ( oric->wddisk.disk[i] ) && ( oric->wddisk.disk[i]->modified ) ) + if((oric->wddisk.disk[i]) && (oric->wddisk.disk[i]->modified)) { oric->wddisk.disk[i]->modified_time++; - if( oric->wddisk.disk[i]->modified_time >= 20 ) + if(oric->wddisk.disk[i]->modified_time >= 20) { - diskimage_save( oric, oric->wddisk.disk[i]->filename, i ); + diskimage_save(oric, oric->wddisk.disk[i]->filename, i); } } } } } -static void loop_handler( void* arg ) +static void loop_handler(void* arg) { struct context* ctx = arg; struct machine* oric = &ctx->oric; @@ -1677,28 +1788,28 @@ static void loop_handler( void* arg ) SDL_bool done = SDL_FALSE; Sint32 i; - while (!done) + while(!done) { - if ( oric->emu_mode == EM_PLEASEQUIT ) + if(oric->emu_mode == EM_PLEASEQUIT) break; - if ( oric->emu_mode == EM_RUNNING ) + if(oric->emu_mode == EM_RUNNING) { - if (oric->overclockmult == 1) - frameloop_normal( oric, &ctx->framedone, &ctx->needrender ); + if(oric->overclockmult == 1) + frameloop_normal(oric, &ctx->framedone, &ctx->needrender); else - frameloop_overclock( oric, &ctx->framedone, &ctx->needrender ); + frameloop_overclock(oric, &ctx->framedone, &ctx->needrender); - ay_unlockaudio( &oric->ay ); + ay_unlockaudio(&oric->ay); - if (ctx->framedone) + if(ctx->framedone) { ctx->nextframe_us += oric->vid_freq ? 20000LL : 16667LL; ctx->nextframe_ms = (Uint32)(ctx->nextframe_us / 1000LL); - if (warpspeed) + if(warpspeed) { - if ((oric->frames&3)==0) + if((oric->frames&3)==0) ctx->needrender = SDL_TRUE; } else @@ -1707,21 +1818,21 @@ static void loop_handler( void* arg ) } } - if (ctx->needrender) + if(ctx->needrender) { - render( oric ); + render(oric); ctx->needrender = SDL_FALSE; } - if (ctx->framedone) + if(ctx->framedone) { - once_per_frame( oric ); + once_per_frame(oric); ctx->then = ctx->now; ctx->now = SDL_GetTicks(); frametimeave = 0; - for (i = (FRAMES_TO_AVERAGE - 1); i > 0; i--) + for(i = (FRAMES_TO_AVERAGE - 1); i > 0; i--) { lastframetimes[i] = lastframetimes[i - 1]; frametimeave += lastframetimes[i]; @@ -1729,14 +1840,14 @@ static void loop_handler( void* arg ) lastframetimes[0] = ctx->now - ctx->then; frametimeave = (frametimeave + lastframetimes[0]) / FRAMES_TO_AVERAGE; - if (warpspeed) + if(warpspeed) { ctx->nextframe_ms = ctx->now; ctx->nextframe_us = ((Uint64)ctx->nextframe_ms) * 1000; } else { - if (ctx->now > ctx->nextframe_ms) + if(ctx->now > ctx->nextframe_ms) { ctx->nextframe_ms = ctx->now; ctx->nextframe_us = ((Uint64)ctx->nextframe_ms) * 1000; @@ -1750,76 +1861,82 @@ static void loop_handler( void* arg ) } #if defined(WWW) - if (!SDL_PollEvent(event)) + if(!SDL_PollEvent(event)) break; #else - if (!SDL_PollEvent(event)) + if(!SDL_PollEvent(event)) continue; #endif } else { - ay_unlockaudio( &oric->ay ); - if (ctx->needrender) + ay_unlockaudio(&oric->ay); + if(ctx->needrender) { - render( oric ); + render(oric); ctx->needrender = SDL_FALSE; } #if defined(WWW) - if (!SDL_PollEvent(event)) + if(!SDL_PollEvent(event)) break; #else - if (!SDL_WaitEvent(event)) + if(!SDL_WaitEvent(event)) break; #endif } - do { - switch (event->type) { - case SDL_COMPAT_ACTIVEEVENT: { - if (SDL_COMPAT_IsAppActive(event)) { - oric->shut_render(oric); - oric->init_render(oric); - ctx->needrender = SDL_TRUE; - } + do + { + switch(event->type) + { + case SDL_COMPAT_ACTIVEEVENT: + { + if(SDL_COMPAT_IsAppActive(event)) + { + oric->shut_render(oric); + oric->init_render(oric); + ctx->needrender = SDL_TRUE; } - break; - case SDL_QUIT: - done = SDL_TRUE; - break; + } + break; + case SDL_QUIT: + done = SDL_TRUE; + break; - default: - switch (oric->emu_mode) { - case EM_MENU: - done |= menu_event(event, oric, &ctx->needrender); - break; + default: + switch(oric->emu_mode) + { + case EM_MENU: + done |= menu_event(event, oric, &ctx->needrender); + break; - case EM_RUNNING: - done |= emu_event(event, oric, &ctx->needrender); - break; + case EM_RUNNING: + done |= emu_event(event, oric, &ctx->needrender); + break; #ifndef WWW_NO_MONITOR - case EM_DEBUG: - done |= mon_event(event, oric, &ctx->needrender); - break; + case EM_DEBUG: + done |= mon_event(event, oric, &ctx->needrender); + break; #endif - } - } - if (oric->show_keyboard) - keyboard_event(event, oric, &ctx->needrender); - } while ( SDL_PollEvent( event ) ); + } + } + if(oric->show_keyboard) + keyboard_event(event, oric, &ctx->needrender); + } + while(SDL_PollEvent(event)); #if defined(WWW) // 1 loop only because emscripten will simulate the actual looping - done = SDL_TRUE; + done = SDL_TRUE; #endif } #if defined(WWW) #else - ay_unlockaudio(&oric->ay); - shut(oric); + ay_unlockaudio(&oric->ay); + shut(oric); #endif - } +} #ifdef WWW @@ -1833,112 +1950,113 @@ void success(char* path, const char* fileToLoad) { int i; printf("Loading disk %s\n", fileToLoad); - switch (detect_image_type(path)) + switch(detect_image_type(path)) { case IMG_SNAPSHOT: load_snapshot(&gCtx->oric, path); break; case IMG_ATMOS_MICRODISC: - if ((gCtx->oric.type != MACH_ATMOS) && + if((gCtx->oric.type != MACH_ATMOS) && (gCtx->oric.type != MACH_ORIC1) && (gCtx->oric.type != MACH_PRAVETZ)) { - swapmach( &gCtx->oric, NULL, (DRV_MICRODISC<<16)|MACH_ATMOS ); + swapmach(&gCtx->oric, NULL, (DRV_MICRODISC<<16)|MACH_ATMOS); break; } - if ((gCtx->oric.drivetype != DRV_MICRODISC) && + if((gCtx->oric.drivetype != DRV_MICRODISC) && (gCtx->oric.drivetype != DRV_NONE)) { - swapmach( &gCtx->oric, NULL, (DRV_MICRODISC<<16)|gCtx->oric.type ); + swapmach(&gCtx->oric, NULL, (DRV_MICRODISC<<16)|gCtx->oric.type); } break; case IMG_ATMOS_JASMIN: - if ((gCtx->oric.type != MACH_ATMOS) && + if((gCtx->oric.type != MACH_ATMOS) && (gCtx->oric.type != MACH_ORIC1) && (gCtx->oric.type != MACH_PRAVETZ)) { - swapmach( &gCtx->oric, NULL, (DRV_JASMIN<<16)|MACH_ATMOS ); + swapmach(&gCtx->oric, NULL, (DRV_JASMIN<<16)|MACH_ATMOS); gCtx->oric.auto_jasmin_reset = SDL_TRUE; break; } - if (gCtx->oric.drivetype == DRV_NONE) + if(gCtx->oric.drivetype == DRV_NONE) { - swapmach( &gCtx->oric, NULL, (DRV_JASMIN<<16)|gCtx->oric.type); + swapmach(&gCtx->oric, NULL, (DRV_JASMIN<<16)|gCtx->oric.type); gCtx->oric.auto_jasmin_reset = SDL_TRUE; break; } - if (gCtx->oric.drivetype != DRV_JASMIN) + if(gCtx->oric.drivetype != DRV_JASMIN) { - swapmach( &gCtx->oric, NULL, (DRV_JASMIN<<16)|gCtx->oric.type ); + swapmach(&gCtx->oric, NULL, (DRV_JASMIN<<16)|gCtx->oric.type); gCtx->oric.auto_jasmin_reset = SDL_TRUE; break; } break; case IMG_TELESTRAT_DISK: - if (gCtx->oric.type != MACH_TELESTRAT) + if(gCtx->oric.type != MACH_TELESTRAT) { - swapmach( &gCtx->oric, NULL, MACH_TELESTRAT ); + swapmach(&gCtx->oric, NULL, MACH_TELESTRAT); break; } break; case IMG_PRAVETZ_DISK: - if (gCtx->oric.type != MACH_PRAVETZ) + if(gCtx->oric.type != MACH_PRAVETZ) { - swapmach( &gCtx->oric, NULL, (DRV_PRAVETZ<<16)|MACH_PRAVETZ ); - pravdiskboot( &gCtx->oric ); + swapmach(&gCtx->oric, NULL, (DRV_PRAVETZ<<16)|MACH_PRAVETZ); + pravdiskboot(&gCtx->oric); break; } - if (gCtx->oric.drivetype == DRV_NONE) + if(gCtx->oric.drivetype == DRV_NONE) { - swapmach( &gCtx->oric, NULL, (DRV_PRAVETZ<<16)|MACH_PRAVETZ ); - pravdiskboot( &gCtx->oric ); + swapmach(&gCtx->oric, NULL, (DRV_PRAVETZ<<16)|MACH_PRAVETZ); + pravdiskboot(&gCtx->oric); break; } - if (gCtx->oric.drivetype != DRV_PRAVETZ) + if(gCtx->oric.drivetype != DRV_PRAVETZ) { - swapmach( &gCtx->oric, NULL, (DRV_PRAVETZ<<16)|MACH_PRAVETZ ); - pravdiskboot( &gCtx->oric ); + swapmach(&gCtx->oric, NULL, (DRV_PRAVETZ<<16)|MACH_PRAVETZ); + pravdiskboot(&gCtx->oric); break; } break; case IMG_GUESS_MICRODISC: - if (gCtx->oric.drivetype == DRV_PRAVETZ) + if(gCtx->oric.drivetype == DRV_PRAVETZ) { - swapmach( &gCtx->oric, NULL, (DRV_MICRODISC<<16)|gCtx->oric.type ); + swapmach(&gCtx->oric, NULL, (DRV_MICRODISC<<16)|gCtx->oric.type); break; } break; case IMG_TAPE: gCtx->oric.lasttapefile[0] = 0; - tape_load_tap( &(gCtx->oric), path ); + tape_load_tap(&(gCtx->oric), path); #ifndef WWW_NO_MONITOR - if( gCtx->oric.symbolsautoload ) mon_new_symbols( &gCtx->oric.usersyms, &(gCtx->oric), "symbols", SYM_BESTGUESS, SDL_TRUE, SDL_TRUE ); + if(gCtx->oric.symbolsautoload) mon_new_symbols(&gCtx->oric.usersyms, &(gCtx->oric), "symbols", SYM_BESTGUESS, SDL_TRUE, SDL_TRUE); #endif - queuekeys( "CLOAD\"\"\x0d" ); + queuekeys("CLOAD\"\"\x0d"); return; } - diskimage_load( &(gCtx->oric), path, 0 ); + diskimage_load(&(gCtx->oric), path, 0); - if( gCtx->oric.drivetype == DRV_NONE ) + if(gCtx->oric.drivetype == DRV_NONE) { - swapmach( &(gCtx->oric), NULL, (DRV_MICRODISC<<16)|gCtx->oric.type ); + swapmach(&(gCtx->oric), NULL, (DRV_MICRODISC<<16)|gCtx->oric.type); return; } } -void downloadSucceeded(emscripten_fetch_t *fetch) { +void downloadSucceeded(emscripten_fetch_t* fetch) +{ int fd; char path[1024]; @@ -1948,140 +2066,151 @@ void downloadSucceeded(emscripten_fetch_t *fetch) { printf("status %d\n",fetch->status); sprintf(path, "/readwritefs/%s", fetch->url), - fd = open(path, O_RDWR | O_CREAT, 0666); - if (fd == -1) + fd = open(path, O_RDWR | O_CREAT, 0666); + if(fd == -1) perror("Failing to create file"); else { - if (write(fd, fetch->data, fetch->numBytes) != fetch->numBytes) { + if(write(fd, fetch->data, fetch->numBytes) != fetch->numBytes) + { perror("Failing to write to file"); - } else if (close(fd) != 0) { + } + else if(close(fd) != 0) + { perror("Failing to close file"); - } else { + } + else + { success(path, fetch->url); } } - // sync from memory state to persisted - EM_ASM( - FS.syncfs(function (err) { - assert(!err); - }); - ); + // sync from memory state to persisted + EM_ASM( + FS.syncfs(function(err) + { + assert(!err); + }); + ); emscripten_fetch_close(fetch); // Free data associated with the fetch. } -void downloadFailed(emscripten_fetch_t *fetch) { +void downloadFailed(emscripten_fetch_t* fetch) +{ printf("Downloading %s failed, HTTP failure status code: %d.\n", fetch->url, fetch->status); emscripten_fetch_close(fetch); // Also free data on failure. } - void EMSCRIPTEN_KEEPALIVE www_async_dload() { +void EMSCRIPTEN_KEEPALIVE www_async_dload() +{ - // is the file here - char * fileToLoad = getenv("FILE"); + // is the file here + char* fileToLoad = getenv("FILE"); - printf("Downloading file %s\n", fileToLoad); + printf("Downloading file %s\n", fileToLoad); - if(fileToLoad == NULL) - return; + if(fileToLoad == NULL) + return; - char path[1024]; - sprintf(path, "/readwritefs/%s", fileToLoad); + char path[1024]; + sprintf(path, "/readwritefs/%s", fileToLoad); - int fd = open(path, O_RDWR); - if (fd == -1) - { - emscripten_fetch_attr_t attr; - emscripten_fetch_attr_init(&attr); - strcpy(attr.requestMethod, "GET"); - attr.attributes = EMSCRIPTEN_FETCH_LOAD_TO_MEMORY; - - attr.onsuccess = downloadSucceeded; - attr.onerror = downloadFailed; - emscripten_fetch(&attr, fileToLoad); - } else { - printf("%s is already downloaded!\n", fileToLoad); - success(path, fileToLoad); - } + int fd = open(path, O_RDWR); + if(fd == -1) + { + emscripten_fetch_attr_t attr; + emscripten_fetch_attr_init(&attr); + strcpy(attr.requestMethod, "GET"); + attr.attributes = EMSCRIPTEN_FETCH_LOAD_TO_MEMORY; + + attr.onsuccess = downloadSucceeded; + attr.onerror = downloadFailed; + emscripten_fetch(&attr, fileToLoad); } + else + { + printf("%s is already downloaded!\n", fileToLoad); + success(path, fileToLoad); + } +} #endif - int main( int argc, char *argv[] ) - { - static struct context ctx; +int main(int argc, char* argv[]) +{ + static struct context ctx; #ifdef _MSC_VER - _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); + _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); #endif - // This should center SDL window + // This should center SDL window #ifndef __MORPHOS__ - putenv("SDL_VIDEO_CENTERED=center"); + putenv("SDL_VIDEO_CENTERED=center"); #endif #ifndef WWW - init_fileprefix( argv ); + init_fileprefix(argv); #endif - // ---------------------------------------------------------------------------- - // This makes relative paths work in C++ in Xcode by changing directory to the Resources folder inside the .app bundle + // ---------------------------------------------------------------------------- + // This makes relative paths work in C++ in Xcode by changing directory to the Resources folder inside the .app bundle #ifdef __APPLE__ - CFBundleRef mainBundle = CFBundleGetMainBundle(); - CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle); - char path[PATH_MAX]; - if (!CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8 *)path, PATH_MAX)) - { - // error! - } - CFRelease(resourcesURL); - // this directory is something/Oricutron.app/Contents/Resources - // go down 3 times to find the app containing directory - strcat(path, "/../../.."); - chdir(path); - //printf("Current Path: %s\n", path); + CFBundleRef mainBundle = CFBundleGetMainBundle(); + CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle); + char path[PATH_MAX]; + if(!CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8 *)path, PATH_MAX)) + { + // error! + } + CFRelease(resourcesURL); + // this directory is something/Oricutron.app/Contents/Resources + // go down 3 times to find the app containing directory + strcat(path, "/../../.."); + chdir(path); + //printf("Current Path: %s\n", path); #endif - memset(&ctx.oric, 0, sizeof(ctx.oric)); - if (!init(&ctx.oric, argc, argv)) - { - shut(&ctx.oric); - return EXIT_FAILURE; - } - // call to SDL_GetTicks must be behind init - ctx.now = SDL_GetTicks(); - ctx.nextframe_ms = ctx.now; - ctx.nextframe_us = ((Uint64)ctx.nextframe_ms) * 1000; - ctx.needrender = SDL_TRUE; - ctx.framedone = SDL_FALSE; - - if (load_keymap) - { - load_keyboard_mapping(&ctx.oric, keymap_path); - load_keymap = SDL_FALSE; - } + memset(&ctx.oric, 0, sizeof(ctx.oric)); + if(!init(&ctx.oric, argc, argv)) + { + shut(&ctx.oric); + return EXIT_FAILURE; + } + // call to SDL_GetTicks must be behind init + ctx.now = SDL_GetTicks(); + ctx.nextframe_ms = ctx.now; + ctx.nextframe_us = ((Uint64)ctx.nextframe_ms) * 1000; + ctx.needrender = SDL_TRUE; + ctx.framedone = SDL_FALSE; + + if(load_keymap) + { + load_keyboard_mapping(&ctx.oric, keymap_path); + load_keymap = SDL_FALSE; + } #ifdef WWW - // save the context to a global - gCtx = &ctx; - // create read-write fs - EM_ASM( - FS.mkdir('/readwritefs'); - FS.mount(IDBFS, {}, '/readwritefs'); - - // sync from persisted state into memory and then - // run the 'www_async_dload' function - FS.syncfs(true, function (err) { - assert(!err); - // async download of space1999-fr.dsk - ccall('www_async_dload', 'v'); - }); - ); - - emscripten_set_main_loop_arg(loop_handler, &ctx, -1, 0); + // save the context to a global + gCtx = &ctx; + // create read-write fs + EM_ASM( + FS.mkdir('/readwritefs'); + FS.mount(IDBFS, {}, '/readwritefs'); + + // sync from persisted state into memory and then + // run the 'www_async_dload' function + FS.syncfs(true, function(err) + { + assert(!err); + // async download of space1999-fr.dsk + ccall('www_async_dload', 'v'); + }); + ); + + emscripten_set_main_loop_arg(loop_handler, &ctx, -1, 0); #else - loop_handler(&ctx); + loop_handler(&ctx); #endif - return EXIT_SUCCESS; - } + return EXIT_SUCCESS; +} diff --git a/main.h b/main.h index 2a580deb..fc9ba71f 100644 --- a/main.h +++ b/main.h @@ -18,8 +18,8 @@ ** */ -SDL_bool read_config_string( char *buf, char *token, char *dest, Sint32 maxlen ); -SDL_bool read_config_bool( char *buf, char *token, SDL_bool *dest ); -SDL_bool read_config_option( char *buf, char *token, Sint32 *dest, char **options ); -SDL_bool read_config_int( char *buf, char *token, int *dest, int min, int max ); -void shut( struct machine *oric ); +SDL_bool read_config_string(char* buf, char* token, char* dest, Sint32 maxlen); +SDL_bool read_config_bool(char* buf, char* token, SDL_bool *dest); +SDL_bool read_config_option(char* buf, char* token, Sint32 *dest, char** options); +SDL_bool read_config_int(char* buf, char* token, int* dest, int min, int max); +void shut(struct machine *oric); diff --git a/monitor.c b/monitor.c index aed1e0bf..0bd0adba 100644 --- a/monitor.c +++ b/monitor.c @@ -56,22 +56,22 @@ #if LOG_DEBUG #if defined(__amigaos4__) || defined(__MORPHOS__) -static char *debug_logname = "RAM:debug.log"; +static char* debug_logname = "RAM:debug.log"; #else -static char *debug_logname = "debug_log.txt"; +static char* debug_logname = "debug_log.txt"; #endif FILE *debug_logfile = NULL; #endif struct disinf { - char *name; + char* name; int amode; }; struct asminf { - char *name; + char* name; short imp, imm, zp, zpx, zpy, abs, abx, aby, zix, ziy, rel, ind; }; @@ -139,69 +139,71 @@ enum }; // 12345678901 12345678 -static struct msym defsym_tele[] = { { 0x0300, 0, "VIA_IORB" , "VIA_IORB" , "VIA_IORB" }, - { 0x0301, 0, "VIA_IORA" , "VIA_IORA" , "VIA_IORA" }, - { 0x0302, 0, "VIA_DDRB" , "VIA_DDRB" , "VIA_DDRB" }, - { 0x0303, 0, "VIA_DDRA" , "VIA_DDRA" , "VIA_DDRA" }, - { 0x0304, 0, "VIA_T1C_L" , "VIA_T1C\x16", "VIA_T1C_L" }, - { 0x0305, 0, "VIA_T1C_H" , "VIA_T1C\x16", "VIA_T1C_H" }, - { 0x0306, 0, "VIA_T1L_L" , "VIA_T1L\x16", "VIA_T1L_L" }, - { 0x0307, 0, "VIA_T1L_H" , "VIA_T1L\x16", "VIA_T1L_H" }, - { 0x0308, 0, "VIA_T2C_L" , "VIA_T2C\x16", "VIA_T2C_L" }, - { 0x0309, 0, "VIA_T2C_H" , "VIA_T2C\x16", "VIA_T2C_H" }, - { 0x030A, 0, "VIA_SR" , "VIA_SR" , "VIA_SR" }, - { 0x030B, 0, "VIA_ACR" , "VIA_ACR" , "VIA_ACR" }, - { 0x030C, 0, "VIA_PCR" , "VIA_PCR" , "VIA_PCR" }, - { 0x030D, 0, "VIA_IFR" , "VIA_IFR" , "VIA_IFR" }, - { 0x030E, 0, "VIA_IER" , "VIA_IER" , "VIA_IER" }, - { 0x030F, 0, "VIA_IORA2" , "VIA_IORA2" , "VIA_IORA2" }, - { 0x0310, 0, "WD17_COMMA\x16", "WD17_CO\x16", "WD17_COMMAND" }, - { 0x0311, 0, "WD17_TRACK\x16", "WD17_TR\x16", "WD17_TRACK" }, - { 0x0312, 0, "WD17_SECTO\x16", "WD17_SE\x16", "WD17_SECTOR" }, - { 0x0313, 0, "WD17_DATA" , "WD17_DA\x16", "WD17_DATA" }, - { 0x0314, 0, "MDSC_STATUS" , "MDSC_ST\x16", "MDSC_STATUS" }, - { 0x0318, 0, "MDSC_DRQ" , "MDSC_DR\x16", "MDSC_DRQ" }, - { 0x031c, 0, "ACIA_DATA" , "ACIA_DA\x16", "ACIA_DATA" }, - { 0x031d, 0, "ACIA_STATUS" , "ACIA_ST\x16", "ACIA_STATUS" }, - { 0x031e, 0, "ACIA_COMMA\x16", "ACIA_CO\x16", "ACIA_COMMAND" }, - { 0x031f, 0, "ACIA_CONTR\x16", "ACIA_CO\x16", "ACIA_CONTROL" }, - { 0x0320, 0, "VIA2_IORB" , "VIA2_IORB" , "VIA2_IORB" }, - { 0x0321, 0, "VIA2_IORA" , "VIA2_IORA" , "VIA2_IORA" }, - { 0x0322, 0, "VIA2_DDRB" , "VIA2_DDRB" , "VIA2_DDRB" }, - { 0x0323, 0, "VIA2_DDRA" , "VIA2_DDRA" , "VIA2_DDRA" }, - { 0x0324, 0, "VIA2_T1C_L" , "VIA2_T1\x16", "VIA2_T1C_L" }, - { 0x0325, 0, "VIA2_T1C_H" , "VIA2_T1\x16", "VIA2_T1C_H" }, - { 0x0326, 0, "VIA2_T1L_L" , "VIA2_T1\x16", "VIA2_T1L_L" }, - { 0x0327, 0, "VIA2_T1L_H" , "VIA2_T1\x16", "VIA2_T1L_H" }, - { 0x0328, 0, "VIA2_T2C_L" , "VIA2_T2\x16", "VIA2_T2C_L" }, - { 0x0329, 0, "VIA2_T2C_H" , "VIA2_T2\x16", "VIA2_T2C_H" }, - { 0x032A, 0, "VIA2_SR" , "VIA2_SR" , "VIA2_SR" }, - { 0x032B, 0, "VIA2_ACR" , "VIA2_ACR" , "VIA2_ACR" }, - { 0x032C, 0, "VIA2_PCR" , "VIA2_PCR" , "VIA2_PCR" }, - { 0x032D, 0, "VIA2_IFR" , "VIA2_IFR" , "VIA2_IFR" }, - { 0x032E, 0, "VIA2_IER" , "VIA2_IER" , "VIA2_IER" }, - { 0x032F, 0, "VIA2_IORA2" , "VIA2_IO\x16", "VIA2_IORA2" }, - { 0xc000, 0, "BankedArea" , "BankedA\x16", "BankedArea" } }; +static struct msym defsym_tele[] = { { 0x0300, 0, "VIA_IORB", "VIA_IORB", "VIA_IORB" }, + { 0x0301, 0, "VIA_IORA", "VIA_IORA", "VIA_IORA" }, + { 0x0302, 0, "VIA_DDRB", "VIA_DDRB", "VIA_DDRB" }, + { 0x0303, 0, "VIA_DDRA", "VIA_DDRA", "VIA_DDRA" }, + { 0x0304, 0, "VIA_T1C_L", "VIA_T1C\x16", "VIA_T1C_L" }, + { 0x0305, 0, "VIA_T1C_H", "VIA_T1C\x16", "VIA_T1C_H" }, + { 0x0306, 0, "VIA_T1L_L", "VIA_T1L\x16", "VIA_T1L_L" }, + { 0x0307, 0, "VIA_T1L_H", "VIA_T1L\x16", "VIA_T1L_H" }, + { 0x0308, 0, "VIA_T2C_L", "VIA_T2C\x16", "VIA_T2C_L" }, + { 0x0309, 0, "VIA_T2C_H", "VIA_T2C\x16", "VIA_T2C_H" }, + { 0x030A, 0, "VIA_SR", "VIA_SR", "VIA_SR" }, + { 0x030B, 0, "VIA_ACR", "VIA_ACR", "VIA_ACR" }, + { 0x030C, 0, "VIA_PCR", "VIA_PCR", "VIA_PCR" }, + { 0x030D, 0, "VIA_IFR", "VIA_IFR", "VIA_IFR" }, + { 0x030E, 0, "VIA_IER", "VIA_IER", "VIA_IER" }, + { 0x030F, 0, "VIA_IORA2", "VIA_IORA2", "VIA_IORA2" }, + { 0x0310, 0, "WD17_COMMA\x16", "WD17_CO\x16", "WD17_COMMAND" }, + { 0x0311, 0, "WD17_TRACK\x16", "WD17_TR\x16", "WD17_TRACK" }, + { 0x0312, 0, "WD17_SECTO\x16", "WD17_SE\x16", "WD17_SECTOR" }, + { 0x0313, 0, "WD17_DATA", "WD17_DA\x16", "WD17_DATA" }, + { 0x0314, 0, "MDSC_STATUS", "MDSC_ST\x16", "MDSC_STATUS" }, + { 0x0318, 0, "MDSC_DRQ", "MDSC_DR\x16", "MDSC_DRQ" }, + { 0x031c, 0, "ACIA_DATA", "ACIA_DA\x16", "ACIA_DATA" }, + { 0x031d, 0, "ACIA_STATUS", "ACIA_ST\x16", "ACIA_STATUS" }, + { 0x031e, 0, "ACIA_COMMA\x16", "ACIA_CO\x16", "ACIA_COMMAND" }, + { 0x031f, 0, "ACIA_CONTR\x16", "ACIA_CO\x16", "ACIA_CONTROL" }, + { 0x0320, 0, "VIA2_IORB", "VIA2_IORB", "VIA2_IORB" }, + { 0x0321, 0, "VIA2_IORA", "VIA2_IORA", "VIA2_IORA" }, + { 0x0322, 0, "VIA2_DDRB", "VIA2_DDRB", "VIA2_DDRB" }, + { 0x0323, 0, "VIA2_DDRA", "VIA2_DDRA", "VIA2_DDRA" }, + { 0x0324, 0, "VIA2_T1C_L", "VIA2_T1\x16", "VIA2_T1C_L" }, + { 0x0325, 0, "VIA2_T1C_H", "VIA2_T1\x16", "VIA2_T1C_H" }, + { 0x0326, 0, "VIA2_T1L_L", "VIA2_T1\x16", "VIA2_T1L_L" }, + { 0x0327, 0, "VIA2_T1L_H", "VIA2_T1\x16", "VIA2_T1L_H" }, + { 0x0328, 0, "VIA2_T2C_L", "VIA2_T2\x16", "VIA2_T2C_L" }, + { 0x0329, 0, "VIA2_T2C_H", "VIA2_T2\x16", "VIA2_T2C_H" }, + { 0x032A, 0, "VIA2_SR", "VIA2_SR", "VIA2_SR" }, + { 0x032B, 0, "VIA2_ACR", "VIA2_ACR", "VIA2_ACR" }, + { 0x032C, 0, "VIA2_PCR", "VIA2_PCR", "VIA2_PCR" }, + { 0x032D, 0, "VIA2_IFR", "VIA2_IFR", "VIA2_IFR" }, + { 0x032E, 0, "VIA2_IER", "VIA2_IER", "VIA2_IER" }, + { 0x032F, 0, "VIA2_IORA2", "VIA2_IO\x16", "VIA2_IORA2" }, + { 0xc000, 0, "BankedArea", "BankedA\x16", "BankedArea" } +}; // 12345678901 12345678 -static struct msym defsym_atmos[] = { { 0x0300, 0, "VIA_IORB" , "VIA_IORB" , "VIA_IORB" }, - { 0x0301, 0, "VIA_IORA" , "VIA_IORA" , "VIA_IORA" }, - { 0x0302, 0, "VIA_DDRB" , "VIA_DDRB" , "VIA_DDRB" }, - { 0x0303, 0, "VIA_DDRA" , "VIA_DDRA" , "VIA_DDRA" }, - { 0x0304, 0, "VIA_T1C_L" , "VIA_T1C\x16", "VIA_T1C_L" }, - { 0x0305, 0, "VIA_T1C_H" , "VIA_T1C\x16", "VIA_T1C_H" }, - { 0x0306, 0, "VIA_T1L_L" , "VIA_T1L\x16", "VIA_T1L_L" }, - { 0x0307, 0, "VIA_T1L_H" , "VIA_T1L\x16", "VIA_T1L_H" }, - { 0x0308, 0, "VIA_T2C_L" , "VIA_T2C\x16", "VIA_T2C_L" }, - { 0x0309, 0, "VIA_T2C_H" , "VIA_T2C\x16", "VIA_T2C_H" }, - { 0x030A, 0, "VIA_SR" , "VIA_SR" , "VIA_SR" }, - { 0x030B, 0, "VIA_ACR" , "VIA_ACR" , "VIA_ACR" }, - { 0x030C, 0, "VIA_PCR" , "VIA_PCR" , "VIA_PCR" }, - { 0x030D, 0, "VIA_IFR" , "VIA_IFR" , "VIA_IFR" }, - { 0x030E, 0, "VIA_IER" , "VIA_IER" , "VIA_IER" }, - { 0x030F, 0, "VIA_IORA2" , "VIA_IORA2" , "VIA_IORA2" }, - { 0xc000, SYMF_ROMDIS0, "ROMStart" , "ROMStart" , "ROMStart" }, - { 0xc000, SYMF_ROMDIS1, "Overlay" , "Overlay" , "Overlay" } }; +static struct msym defsym_atmos[] = { { 0x0300, 0, "VIA_IORB", "VIA_IORB", "VIA_IORB" }, + { 0x0301, 0, "VIA_IORA", "VIA_IORA", "VIA_IORA" }, + { 0x0302, 0, "VIA_DDRB", "VIA_DDRB", "VIA_DDRB" }, + { 0x0303, 0, "VIA_DDRA", "VIA_DDRA", "VIA_DDRA" }, + { 0x0304, 0, "VIA_T1C_L", "VIA_T1C\x16", "VIA_T1C_L" }, + { 0x0305, 0, "VIA_T1C_H", "VIA_T1C\x16", "VIA_T1C_H" }, + { 0x0306, 0, "VIA_T1L_L", "VIA_T1L\x16", "VIA_T1L_L" }, + { 0x0307, 0, "VIA_T1L_H", "VIA_T1L\x16", "VIA_T1L_H" }, + { 0x0308, 0, "VIA_T2C_L", "VIA_T2C\x16", "VIA_T2C_L" }, + { 0x0309, 0, "VIA_T2C_H", "VIA_T2C\x16", "VIA_T2C_H" }, + { 0x030A, 0, "VIA_SR", "VIA_SR", "VIA_SR" }, + { 0x030B, 0, "VIA_ACR", "VIA_ACR", "VIA_ACR" }, + { 0x030C, 0, "VIA_PCR", "VIA_PCR", "VIA_PCR" }, + { 0x030D, 0, "VIA_IFR", "VIA_IFR", "VIA_IFR" }, + { 0x030E, 0, "VIA_IER", "VIA_IER", "VIA_IER" }, + { 0x030F, 0, "VIA_IORA2", "VIA_IORA2", "VIA_IORA2" }, + { 0xc000, SYMF_ROMDIS0, "ROMStart", "ROMStart", "ROMStart" }, + { 0xc000, SYMF_ROMDIS1, "Overlay", "Overlay", "Overlay" } +}; enum { @@ -281,437 +283,439 @@ enum #define AMF_IND (1<= '0' ) && ( c <= '1' ) ) return SDL_TRUE; + if((c >= '0') && (c <= '1')) return SDL_TRUE; return SDL_FALSE; } -SDL_bool isnum( char c ) +SDL_bool isnum(char c) { - if( ( c >= '0' ) && ( c <= '9' ) ) return SDL_TRUE; + if((c >= '0') && (c <= '9')) return SDL_TRUE; return SDL_FALSE; } -SDL_bool ishex( char c ) +SDL_bool ishex(char c) { - if( isnum( c ) ) return SDL_TRUE; - if( ( c >= 'a' ) && ( c <= 'f' ) ) return SDL_TRUE; - if( ( c >= 'A' ) && ( c <= 'F' ) ) return SDL_TRUE; + if(isnum(c)) return SDL_TRUE; + if((c >= 'a') && (c <= 'f')) return SDL_TRUE; + if((c >= 'A') && (c <= 'F')) return SDL_TRUE; return SDL_FALSE; } -SDL_bool isalph( char c ) +SDL_bool isalph(char c) { - if( ( c >= 'a' ) && ( c <= 'z' ) ) return SDL_TRUE; - if( ( c >= 'A' ) && ( c <= 'Z' ) ) return SDL_TRUE; + if((c >= 'a') && (c <= 'z')) return SDL_TRUE; + if((c >= 'A') && (c <= 'Z')) return SDL_TRUE; return SDL_FALSE; } -SDL_bool issymstart( char c ) +SDL_bool issymstart(char c) { - if( isalph( c ) ) return SDL_TRUE; - if( c == '_' ) return SDL_TRUE; + if(isalph(c)) return SDL_TRUE; + if(c == '_') return SDL_TRUE; return SDL_FALSE; } -SDL_bool issymchar( char c ) +SDL_bool issymchar(char c) { - if( issymstart( c ) ) return SDL_TRUE; - if( isnum( c ) ) return SDL_TRUE; + if(issymstart(c)) return SDL_TRUE; + if(isnum(c)) return SDL_TRUE; return SDL_FALSE; } -int hexit( char c ) +int hexit(char c) { - if( isnum( c ) ) return c-'0'; - if( ( c >= 'a' ) && ( c <= 'f' ) ) return c-('a'-10); - if( ( c >= 'A' ) && ( c <= 'F' ) ) return c-('A'-10); + if(isnum(c)) return c-'0'; + if((c >= 'a') && (c <= 'f')) return c-('a'-10); + if((c >= 'A') && (c <= 'F')) return c-('A'-10); return -1; } #ifndef WWW_NO_MONITOR -static int bp_at( struct machine *oric, unsigned short addr, int *xbp, int *mbp ) +static int bp_at(struct machine *oric, unsigned short addr, int* xbp, int* mbp) { int bpmask = 0, i; - if( xbp ) *xbp = -1; - if( mbp ) *mbp = -1; + if(xbp) *xbp = -1; + if(mbp) *mbp = -1; oric->cpu.anybp = SDL_FALSE; - for( i=0; i<16; i++ ) + for(i=0; i<16; i++) { - if( oric->cpu.breakpoints[i] != -1 ) + if(oric->cpu.breakpoints[i] != -1) { oric->cpu.anybp = SDL_TRUE; - if( addr == oric->cpu.breakpoints[i] ) + if(addr == oric->cpu.breakpoints[i]) { bpmask |= 8; - if( xbp ) *xbp = i; + if(xbp) *xbp = i; break; } } } oric->cpu.anymbp = SDL_FALSE; - for( i=0; i<16; i++ ) + for(i=0; i<16; i++) { - if( oric->cpu.membreakpoints[i].flags ) + if(oric->cpu.membreakpoints[i].flags) { oric->cpu.anymbp = SDL_TRUE; - if( oric->cpu.membreakpoints[i].addr == addr ) + if(oric->cpu.membreakpoints[i].addr == addr) { bpmask |= oric->cpu.membreakpoints[i].flags; - if( mbp ) *mbp = i; + if(mbp) *mbp = i; break; } } @@ -721,12 +725,12 @@ static int bp_at( struct machine *oric, unsigned short addr, int *xbp, int *mbp } // Don't mess with registers that change because you read them! -unsigned char mon_read( struct machine *oric, unsigned short addr ) +unsigned char mon_read(struct machine *oric, unsigned short addr) { // microdisc registers could screw things up - if( oric->drivetype == DRV_MICRODISC ) + if(oric->drivetype == DRV_MICRODISC) { - switch( addr ) + switch(addr) { case 0x310: return oric->wddisk.r_status; @@ -748,38 +752,38 @@ unsigned char mon_read( struct machine *oric, unsigned short addr ) } } - if( oric->drivetype == DRV_PRAVETZ ) + if(oric->drivetype == DRV_PRAVETZ) { - if ( ( 0x300 <= addr ) && ( addr <= 0x30f ) ) + if((0x300 <= addr) && (addr <= 0x30f)) { - return via_mon_read( &oric->via, addr ); + return via_mon_read(&oric->via, addr); } - if ( ( 0x310 <= addr ) && ( addr <= 0x31f ) ) + if((0x310 <= addr) && (addr <= 0x31f)) { return 0xFF; } - return oric->cpu.read( &oric->cpu, addr ); + return oric->cpu.read(&oric->cpu, addr); } - if( ( addr & 0xff00 ) == 0x0300 ) + if((addr & 0xff00) == 0x0300) { - if ( ( !oric->lightpen ) || ( addr < 0x3e0 ) || ( addr > 0x3e1 ) ) + if((!oric->lightpen) || (addr < 0x3e0) || (addr > 0x3e1)) { - return via_mon_read( &oric->via, addr ); + return via_mon_read(&oric->via, addr); } } - return oric->cpu.read( &oric->cpu, addr ); + return oric->cpu.read(&oric->cpu, addr); } -void mon_store_state( struct machine *oric ) +void mon_store_state(struct machine *oric) { int k; - for( k=0; k<65536; k++ ) + for(k=0; k<65536; k++) { - if( isram( oric, k ) ) - mwatch_old[k] = mon_read( oric, k ); + if(isram(oric, k)) + mwatch_old[k] = mon_read(oric, k); } mwatch_oldvalid = SDL_TRUE; @@ -798,24 +802,24 @@ void mon_store_state( struct machine *oric ) via2_oldvalid = SDL_TRUE; } -void mon_set_modified( struct machine *oric ) +void mon_set_modified(struct machine *oric) { - if( modified ) return; + if(modified) return; modified = SDL_TRUE; - mon_store_state( oric ); + mon_store_state(oric); } -void dbg_scroll( void ) +void dbg_scroll(void) { int x, y, s, d; struct textzone *ptz = tz[TZ_DEBUG]; s = ptz->w*2+1; d = ptz->w+1; - for( y=0; y<18; y++ ) + for(y=0; y<18; y++) { - for( x=0; x<48; x++ ) + for(x=0; x<48; x++) { ptz->tx[d] = ptz->tx[s]; ptz->fc[d] = ptz->fc[s]; @@ -825,7 +829,7 @@ void dbg_scroll( void ) s += 2; } - for( x=0; x<48; x++ ) + for(x=0; x<48; x++) { ptz->tx[d] = ' '; ptz->fc[d] = 2; @@ -833,248 +837,262 @@ void dbg_scroll( void ) } } -void dbg_printf( char *fmt, ... ) +void dbg_printf(char* fmt, ...) { va_list ap; dbg_scroll(); - va_start( ap, fmt ); - if( vsnprintf( vsptmp, VSPTMPSIZE, fmt, ap ) != -1 ) + va_start(ap, fmt); + if(vsnprintf(vsptmp, VSPTMPSIZE, fmt, ap) != -1) { vsptmp[VSPTMPSIZE-1] = 0; #if LOG_DEBUG - if( debug_logfile ) + if(debug_logfile) { - fprintf( debug_logfile, "%s\n", vsptmp ); - fflush( debug_logfile ); + fprintf(debug_logfile, "%s\n", vsptmp); + fflush(debug_logfile); } #endif vsptmp[48] = 0; - tzstrpos( tz[TZ_DEBUG], 1, 19, vsptmp ); + tzstrpos(tz[TZ_DEBUG], 1, 19, vsptmp); } - va_end( ap ); + va_end(ap); } -struct msym *mon_tab_find_sym_by_addr( struct symboltable *stab, struct machine *oric, unsigned short addr, SDL_bool *override_romdis ) +struct msym *mon_tab_find_sym_by_addr(struct symboltable *stab, struct machine *oric, unsigned short addr, SDL_bool *override_romdis) { int i, j, k; SDL_bool romdis; romdis = oric->romdis; - if( ( oric->drivetype == DRV_JASMIN ) && ( oric->jasmin.olay ) ) + if((oric->drivetype == DRV_JASMIN) && (oric->jasmin.olay)) romdis = SDL_FALSE; - if (override_romdis) + if(override_romdis) romdis = *override_romdis; - for( i=0; inumsyms; i++ ) + for(i=0; inumsyms; i++) { - if( oric->type == MACH_TELESTRAT ) + if(oric->type == MACH_TELESTRAT) { - if( stab->syms[i].addr >= 0xc000 ) + if(stab->syms[i].addr >= 0xc000) { - for( j=0, k=SYMF_TELEBANK0; j<8; j++, k<<=1 ) + for(j=0, k=SYMF_TELEBANK0; j<8; j++, k<<=1) { - if( ((stab->syms[i].flags&k)==0) && ( oric->tele_currbank == j ) ) + if(((stab->syms[i].flags&k)==0) && (oric->tele_currbank == j)) break; } - if( j != 8 ) continue; + if(j != 8) continue; } - } else { - if( stab->syms[i].flags&SYMF_MICRODISC ) + } + else + { + if(stab->syms[i].flags&SYMF_MICRODISC) { - if( ( oric->drivetype != DRV_MICRODISC ) || ( !oric->md.diskrom ) ) + if((oric->drivetype != DRV_MICRODISC) || (!oric->md.diskrom)) continue; } - if( (stab->syms[i].flags&SYMF_JASMIN) && ( oric->drivetype != DRV_JASMIN ) ) + if((stab->syms[i].flags&SYMF_JASMIN) && (oric->drivetype != DRV_JASMIN)) continue; - if( romdis ) + if(romdis) { - if( (stab->syms[i].flags&SYMF_ROMDIS0) != 0 ) + if((stab->syms[i].flags&SYMF_ROMDIS0) != 0) continue; - } else { - if( (stab->syms[i].flags&SYMF_ROMDIS1) != 0 ) + } + else + { + if((stab->syms[i].flags&SYMF_ROMDIS1) != 0) continue; } } - if( addr == stab->syms[i].addr ) + if(addr == stab->syms[i].addr) return &stab->syms[i]; } return NULL; } -struct msym *mon_tab_find_sym_by_name( struct symboltable *stab, struct machine *oric, char *name, int *symnum ) +struct msym *mon_tab_find_sym_by_name(struct symboltable *stab, struct machine *oric, char* name, int* symnum) { int i, j, k, romdis; romdis = oric->romdis; - if( ( oric->drivetype == DRV_JASMIN ) && ( oric->jasmin.olay ) ) + if((oric->drivetype == DRV_JASMIN) && (oric->jasmin.olay)) romdis = 1; - for( i=0; inumsyms; i++ ) + for(i=0; inumsyms; i++) { - if( oric->type == MACH_TELESTRAT ) + if(oric->type == MACH_TELESTRAT) { - if( stab->syms[i].addr >= 0xc000 ) + if(stab->syms[i].addr >= 0xc000) { - for( j=0, k=SYMF_TELEBANK0; j<8; j++, k<<=1 ) + for(j=0, k=SYMF_TELEBANK0; j<8; j++, k<<=1) { - if( ((stab->syms[i].flags&k)==0) && ( oric->tele_currbank == j ) ) + if(((stab->syms[i].flags&k)==0) && (oric->tele_currbank == j)) break; } - if( j != 8 ) continue; + if(j != 8) continue; } - } else { - if( stab->syms[i].flags&SYMF_MICRODISC ) + } + else + { + if(stab->syms[i].flags&SYMF_MICRODISC) { - if( ( oric->drivetype != DRV_MICRODISC ) || ( !oric->md.diskrom ) ) + if((oric->drivetype != DRV_MICRODISC) || (!oric->md.diskrom)) continue; } - if( (stab->syms[i].flags&SYMF_JASMIN) && ( oric->drivetype != DRV_JASMIN ) ) + if((stab->syms[i].flags&SYMF_JASMIN) && (oric->drivetype != DRV_JASMIN)) continue; - if( romdis ) + if(romdis) { - if( (stab->syms[i].flags&SYMF_ROMDIS0) != 0 ) + if((stab->syms[i].flags&SYMF_ROMDIS0) != 0) continue; - } else { - if( (stab->syms[i].flags&SYMF_ROMDIS1) != 0 ) + } + else + { + if((stab->syms[i].flags&SYMF_ROMDIS1) != 0) continue; } } - if( !oric->symbolscase ) + if(!oric->symbolscase) { - if( strcasecmp( name, stab->syms[i].name ) == 0 ) + if(strcasecmp(name, stab->syms[i].name) == 0) { - if( symnum ) (*symnum) = i; + if(symnum)(*symnum) = i; return &stab->syms[i]; } - } else { - if( strcmp( name, stab->syms[i].name ) == 0 ) + } + else + { + if(strcmp(name, stab->syms[i].name) == 0) { - if( symnum ) (*symnum) = i; + if(symnum)(*symnum) = i; return &stab->syms[i]; } } } - if( symnum ) (*symnum) = -1; + if(symnum)(*symnum) = -1; return NULL; } -struct msym *mon_find_sym_by_addr( struct machine *oric, unsigned short addr, SDL_bool *override_romdis ) +struct msym *mon_find_sym_by_addr(struct machine *oric, unsigned short addr, SDL_bool *override_romdis) { struct msym *ret; - ret = mon_tab_find_sym_by_addr( &oric->usersyms, oric, addr, override_romdis ); - if( !ret ) ret = mon_tab_find_sym_by_addr( &oric->romsyms, oric, addr, override_romdis ); - if( ( !ret ) && ( oric->type == MACH_TELESTRAT ) ) ret = mon_tab_find_sym_by_addr( &oric->tele_banksyms[oric->tele_currbank], oric, addr, override_romdis ); - if( ( !ret ) && ( oric->disksyms ) ) ret = mon_tab_find_sym_by_addr( oric->disksyms, oric, addr, override_romdis ); - if( ret ) return ret; + ret = mon_tab_find_sym_by_addr(&oric->usersyms, oric, addr, override_romdis); + if(!ret) ret = mon_tab_find_sym_by_addr(&oric->romsyms, oric, addr, override_romdis); + if((!ret) && (oric->type == MACH_TELESTRAT)) ret = mon_tab_find_sym_by_addr(&oric->tele_banksyms[oric->tele_currbank], oric, addr, override_romdis); + if((!ret) && (oric->disksyms)) ret = mon_tab_find_sym_by_addr(oric->disksyms, oric, addr, override_romdis); + if(ret) return ret; - return mon_tab_find_sym_by_addr( &defaultsyms, oric, addr, override_romdis ); + return mon_tab_find_sym_by_addr(&defaultsyms, oric, addr, override_romdis); } -struct msym *mon_find_sym_by_name( struct machine *oric, char *name ) +struct msym *mon_find_sym_by_name(struct machine *oric, char* name) { struct msym *ret; - ret = mon_tab_find_sym_by_name( &oric->usersyms, oric, name, NULL ); - if( !ret ) ret = mon_tab_find_sym_by_name( &oric->romsyms, oric, name, NULL ); - if( ( !ret ) && ( oric->type == MACH_TELESTRAT ) ) ret = mon_tab_find_sym_by_name( &oric->tele_banksyms[oric->tele_currbank], oric, name, NULL ); - if( ( !ret ) && ( oric->disksyms ) ) ret = mon_tab_find_sym_by_name( oric->disksyms, oric, name, NULL ); - if( ret ) return ret; + ret = mon_tab_find_sym_by_name(&oric->usersyms, oric, name, NULL); + if(!ret) ret = mon_tab_find_sym_by_name(&oric->romsyms, oric, name, NULL); + if((!ret) && (oric->type == MACH_TELESTRAT)) ret = mon_tab_find_sym_by_name(&oric->tele_banksyms[oric->tele_currbank], oric, name, NULL); + if((!ret) && (oric->disksyms)) ret = mon_tab_find_sym_by_name(oric->disksyms, oric, name, NULL); + if(ret) return ret; - return mon_tab_find_sym_by_name( &defaultsyms, oric, name, NULL ); + return mon_tab_find_sym_by_name(&defaultsyms, oric, name, NULL); } -SDL_bool mon_addsym( struct symboltable *stab, unsigned short addr, unsigned short flags, char *name, struct msym **symptr ) +SDL_bool mon_addsym(struct symboltable *stab, unsigned short addr, unsigned short flags, char* name, struct msym **symptr) { int i; - if( symptr ) (*symptr) = NULL; + if(symptr)(*symptr) = NULL; // Is it a dynamic symbol table? - if( stab->symspace == -1 ) return SDL_FALSE; + if(stab->symspace == -1) return SDL_FALSE; - if( ( !stab->syms ) || ( stab->symspace < (stab->numsyms+1) ) ) + if((!stab->syms) || (stab->symspace < (stab->numsyms+1))) { struct msym *newbuf; - newbuf = malloc( sizeof( struct msym ) * (stab->symspace+64) ); - if( !newbuf ) return SDL_FALSE; + newbuf = malloc(sizeof(struct msym) * (stab->symspace+64)); + if(!newbuf) return SDL_FALSE; - if( ( stab->syms ) && ( stab->numsyms > 0 ) ) - memcpy( newbuf, stab->syms, sizeof( struct msym ) * stab->numsyms ); + if((stab->syms) && (stab->numsyms > 0)) + memcpy(newbuf, stab->syms, sizeof(struct msym) * stab->numsyms); - free( stab->syms ); + free(stab->syms); stab->syms = newbuf; stab->symspace += 64; - for( i=stab->numsyms; isymspace; i++ ) + for(i=stab->numsyms; isymspace; i++) stab->syms[i].name = NULL; } - if( !stab->syms[stab->numsyms].name ) + if(!stab->syms[stab->numsyms].name) { - stab->syms[stab->numsyms].name = malloc( 128 ); - if( !stab->syms[stab->numsyms].name ) return SDL_FALSE; + stab->syms[stab->numsyms].name = malloc(128); + if(!stab->syms[stab->numsyms].name) return SDL_FALSE; } stab->syms[stab->numsyms].addr = addr; stab->syms[stab->numsyms].flags = flags; - strncpy( stab->syms[stab->numsyms].name, name, 128 ); + strncpy(stab->syms[stab->numsyms].name, name, 128); stab->syms[stab->numsyms].name[127] = 0; - if( strlen( name ) > SNAME_LEN ) + if(strlen(name) > SNAME_LEN) { - strncpy( stab->syms[stab->numsyms].sname, name, (SNAME_LEN-1) ); + strncpy(stab->syms[stab->numsyms].sname, name, (SNAME_LEN-1)); stab->syms[stab->numsyms].sname[SNAME_LEN-1] = 22; stab->syms[stab->numsyms].sname[SNAME_LEN] = 0; - } else { - strcpy( stab->syms[stab->numsyms].sname, name ); + } + else + { + strcpy(stab->syms[stab->numsyms].sname, name); } - if( strlen( name ) > SSNAME_LEN ) + if(strlen(name) > SSNAME_LEN) { - strncpy( stab->syms[stab->numsyms].ssname, name, (SSNAME_LEN-1) ); + strncpy(stab->syms[stab->numsyms].ssname, name, (SSNAME_LEN-1)); stab->syms[stab->numsyms].ssname[SSNAME_LEN-1] = 22; stab->syms[stab->numsyms].ssname[SSNAME_LEN] = 0; - } else { - strcpy( stab->syms[stab->numsyms].ssname, name ); + } + else + { + strcpy(stab->syms[stab->numsyms].ssname, name); } - if( symptr ) *(symptr) = &stab->syms[stab->numsyms]; + if(symptr) *(symptr) = &stab->syms[stab->numsyms]; stab->numsyms++; return SDL_TRUE; } -void mon_init_symtab( struct symboltable *stab ) +void mon_init_symtab(struct symboltable *stab) { stab->syms = NULL; stab->numsyms = 0; stab->symspace = 0; } -void mon_freesyms( struct symboltable *stab ) +void mon_freesyms(struct symboltable *stab) { // Is it a dynamic table? - if( stab->symspace == -1 ) return; - if (stab->syms) + if(stab->symspace == -1) return; + if(stab->syms) { int i; - for (i = 0; i < stab->numsyms; i++) + for(i = 0; i < stab->numsyms; i++) { free(stab->syms[i].name); } @@ -1087,36 +1105,38 @@ void mon_freesyms( struct symboltable *stab ) -char *mon_disassemble( struct machine *oric, unsigned short *paddr, SDL_bool *looped, SDL_bool filemode ) +char* mon_disassemble(struct machine *oric, unsigned short* paddr, SDL_bool *looped, SDL_bool filemode) { unsigned short iaddr, addr; unsigned char op, a1, a2; int i; - char *tmpsname, *disptr; + char* tmpsname, *disptr; char sname[SNAME_LEN+1]; struct msym *csym; disptr = distmp; iaddr = *paddr; - if( looped ) *looped = SDL_FALSE; + if(looped) *looped = SDL_FALSE; tmpsname = ""; - if( !filemode ) + if(!filemode) + { + csym = mon_find_sym_by_addr(oric, iaddr, NULL); + if(csym) tmpsname = csym->sname; + } + else { - csym = mon_find_sym_by_addr( oric, iaddr, NULL ); - if( csym ) tmpsname = csym->sname; - } else { - csym = mon_find_sym_by_addr( oric, iaddr, NULL ); - if( csym ) + csym = mon_find_sym_by_addr(oric, iaddr, NULL); + if(csym) { tmpsname = csym->name; - if( strlen( tmpsname ) > SNAME_LEN ) + if(strlen(tmpsname) > SNAME_LEN) { int ln = strlen(tmpsname); ln = (ln<127)? ln : 126; - memcpy( distmp, tmpsname, ln ); + memcpy(distmp, tmpsname, ln); distmp[ln] = '\n'; distmp[ln+1] = 0; disptr = &distmp[strlen(distmp)]; @@ -1125,138 +1145,168 @@ char *mon_disassemble( struct machine *oric, unsigned short *paddr, SDL_bool *lo } } - strcpy( sname, tmpsname ); - for( i=(int)strlen(sname); iname : csym->sname ); + a1 = mon_read(oric, (*paddr)++); + csym = mon_find_sym_by_addr(oric, a1, NULL); + if(csym) + sprintf(disptr, "%s %04X %02X %02X %s %s", sname, iaddr, op, a1, distab[op].name, filemode ? csym->name : csym->sname); else - sprintf( disptr, "%s %04X %02X %02X %s $%02X", sname, iaddr, op, a1, distab[op].name, a1 ); - if( distab[op].amode == AM_ZP ) break; - strcat( disptr, distab[op].amode == AM_ZPX ? ",X" : ",Y" ); + sprintf(disptr, "%s %04X %02X %02X %s $%02X", sname, iaddr, op, a1, distab[op].name, a1); + if(distab[op].amode == AM_ZP) break; + strcat(disptr, distab[op].amode == AM_ZPX ? ",X" : ",Y"); break; case AM_ABS: case AM_ABX: case AM_ABY: - a1 = mon_read( oric, (*paddr)++ ); - a2 = mon_read( oric, (*paddr)++ ); - csym = mon_find_sym_by_addr( oric, (a2<<8)|a1, NULL ); - if( csym ) - sprintf( disptr, "%s %04X %02X %02X %02X %s %s", sname, iaddr, op, a1, a2, distab[op].name, filemode ? csym->name : csym->sname ); + a1 = mon_read(oric, (*paddr)++); + a2 = mon_read(oric, (*paddr)++); + csym = mon_find_sym_by_addr(oric, (a2<<8)|a1, NULL); + if(csym) + sprintf(disptr, "%s %04X %02X %02X %02X %s %s", sname, iaddr, op, a1, a2, distab[op].name, filemode ? csym->name : csym->sname); else - sprintf( disptr, "%s %04X %02X %02X %02X %s $%02X%02X", sname, iaddr, op, a1, a2, distab[op].name, a2, a1 ); - if( distab[op].amode == AM_ABS ) break; - strcat( disptr, distab[op].amode == AM_ABX ? ",X" : ",Y" ); + sprintf(disptr, "%s %04X %02X %02X %02X %s $%02X%02X", sname, iaddr, op, a1, a2, distab[op].name, a2, a1); + if(distab[op].amode == AM_ABS) break; + strcat(disptr, distab[op].amode == AM_ABX ? ",X" : ",Y"); break; case AM_ZIX: - a1 = mon_read( oric, (*paddr)++ ); - csym = mon_find_sym_by_addr( oric, a1, NULL ); - if( csym ) - sprintf( disptr, "%s %04X %02X %02X %s (%s,X)", sname, iaddr, op, a1, distab[op].name, filemode ? csym->name : csym->ssname ); + a1 = mon_read(oric, (*paddr)++); + csym = mon_find_sym_by_addr(oric, a1, NULL); + if(csym) + sprintf(disptr, "%s %04X %02X %02X %s (%s,X)", sname, iaddr, op, a1, distab[op].name, filemode ? csym->name : csym->ssname); else - sprintf( disptr, "%s %04X %02X %02X %s ($%02X,X)", sname, iaddr, op, a1, distab[op].name, a1 ); + sprintf(disptr, "%s %04X %02X %02X %s ($%02X,X)", sname, iaddr, op, a1, distab[op].name, a1); break; case AM_ZIY: - a1 = mon_read( oric, (*paddr)++ ); - csym = mon_find_sym_by_addr( oric, a1, NULL ); - if( csym ) - sprintf( disptr, "%s %04X %02X %02X %s (%s),Y", sname, iaddr, op, a1, distab[op].name, filemode ? csym->name : csym->ssname ); + a1 = mon_read(oric, (*paddr)++); + csym = mon_find_sym_by_addr(oric, a1, NULL); + if(csym) + sprintf(disptr, "%s %04X %02X %02X %s (%s),Y", sname, iaddr, op, a1, distab[op].name, filemode ? csym->name : csym->ssname); else - sprintf( disptr, "%s %04X %02X %02X %s ($%02X),Y", sname, iaddr, op, a1, distab[op].name, a1 ); + sprintf(disptr, "%s %04X %02X %02X %s ($%02X),Y", sname, iaddr, op, a1, distab[op].name, a1); break; case AM_REL: - a1 = mon_read( oric, (*paddr)++ ); + a1 = mon_read(oric, (*paddr)++); addr = ((*paddr)+((signed char)a1))&0xffff; - csym = mon_find_sym_by_addr( oric, addr, NULL ); - if( csym ) - sprintf( disptr, "%s %04X %02X %02X %s %s", sname, iaddr, op, a1, distab[op].name, filemode ? csym->name : csym->sname ); + csym = mon_find_sym_by_addr(oric, addr, NULL); + if(csym) + sprintf(disptr, "%s %04X %02X %02X %s %s", sname, iaddr, op, a1, distab[op].name, filemode ? csym->name : csym->sname); else - sprintf( disptr, "%s %04X %02X %02X %s $%04X", sname, iaddr, op, a1, distab[op].name, addr ); + sprintf(disptr, "%s %04X %02X %02X %s $%04X", sname, iaddr, op, a1, distab[op].name, addr); break; case AM_IND: - a1 = mon_read( oric, (*paddr)++ ); - a2 = mon_read( oric, (*paddr)++ ); - csym = mon_find_sym_by_addr( oric, (a2<<8)|a1, NULL ); - if( csym ) - sprintf( disptr, "%s %04X %02X %02X %02X %s (%s)", sname, iaddr, op, a1, a2, distab[op].name, filemode ? csym->name : csym->sname ); + a1 = mon_read(oric, (*paddr)++); + a2 = mon_read(oric, (*paddr)++); + csym = mon_find_sym_by_addr(oric, (a2<<8)|a1, NULL); + if(csym) + sprintf(disptr, "%s %04X %02X %02X %02X %s (%s)", sname, iaddr, op, a1, a2, distab[op].name, filemode ? csym->name : csym->sname); else - sprintf( disptr, "%s %04X %02X %02X %02X %s ($%02X%02X)", sname, iaddr, op, a1, a2, distab[op].name, a2, a1 ); + sprintf(disptr, "%s %04X %02X %02X %02X %s ($%02X%02X)", sname, iaddr, op, a1, a2, distab[op].name, a2, a1); break; default: - strcpy( disptr, " WTF?" ); + strcpy(disptr, " WTF?"); break; } - for( i=(int)strlen(disptr); i<47; i++ ) + for(i=(int)strlen(disptr); i<47; i++) disptr[i] = 32; disptr[i] = 0; - switch( bp_at( oric, iaddr, NULL, NULL ) ) + switch(bp_at(oric, iaddr, NULL, NULL)) { - case ( MBPF_READ): disptr[SNAME_LEN+1] = 'r'; break; - case ( MBPF_WRITE ): disptr[SNAME_LEN+1] = 'w'; break; - case ( MBPF_WRITE|MBPF_READ): disptr[SNAME_LEN+1] = 'a'; break; - case ( MBPF_CHANGE ): disptr[SNAME_LEN+1] = 'c'; break; - case ( MBPF_CHANGE |MBPF_READ): disptr[SNAME_LEN+1] = 'g'; break; - case ( MBPF_CHANGE|MBPF_WRITE ): disptr[SNAME_LEN+1] = 'm'; break; - case ( MBPF_CHANGE|MBPF_WRITE|MBPF_READ): disptr[SNAME_LEN+1] = '+'; break; - case (8 ): disptr[SNAME_LEN+1] = 'X'; break; - case (8| MBPF_READ): disptr[SNAME_LEN+1] = 'R'; break; - case (8| MBPF_WRITE ): disptr[SNAME_LEN+1] = 'W'; break; - case (8| MBPF_WRITE|MBPF_READ): disptr[SNAME_LEN+1] = 'A'; break; - case (8|MBPF_CHANGE ): disptr[SNAME_LEN+1] = 'C'; break; - case (8|MBPF_CHANGE |MBPF_READ): disptr[SNAME_LEN+1] = 'G'; break; - case (8|MBPF_CHANGE|MBPF_WRITE ): disptr[SNAME_LEN+1] = 'M'; break; - case (8|MBPF_CHANGE|MBPF_WRITE|MBPF_READ): disptr[SNAME_LEN+1] = '*'; break; + case(MBPF_READ): + disptr[SNAME_LEN+1] = 'r'; + break; + case(MBPF_WRITE): + disptr[SNAME_LEN+1] = 'w'; + break; + case(MBPF_WRITE|MBPF_READ): + disptr[SNAME_LEN+1] = 'a'; + break; + case(MBPF_CHANGE): + disptr[SNAME_LEN+1] = 'c'; + break; + case(MBPF_CHANGE |MBPF_READ): + disptr[SNAME_LEN+1] = 'g'; + break; + case(MBPF_CHANGE|MBPF_WRITE): + disptr[SNAME_LEN+1] = 'm'; + break; + case(MBPF_CHANGE|MBPF_WRITE|MBPF_READ): + disptr[SNAME_LEN+1] = '+'; + break; + case(8): + disptr[SNAME_LEN+1] = 'X'; + break; + case(8| MBPF_READ): + disptr[SNAME_LEN+1] = 'R'; + break; + case(8| MBPF_WRITE): + disptr[SNAME_LEN+1] = 'W'; + break; + case(8| MBPF_WRITE|MBPF_READ): + disptr[SNAME_LEN+1] = 'A'; + break; + case(8|MBPF_CHANGE): + disptr[SNAME_LEN+1] = 'C'; + break; + case(8|MBPF_CHANGE |MBPF_READ): + disptr[SNAME_LEN+1] = 'G'; + break; + case(8|MBPF_CHANGE|MBPF_WRITE): + disptr[SNAME_LEN+1] = 'M'; + break; + case(8|MBPF_CHANGE|MBPF_WRITE|MBPF_READ): + disptr[SNAME_LEN+1] = '*'; + break; } - if( iaddr == oric->cpu.pc ) + if(iaddr == oric->cpu.pc) disptr[SNAME_LEN+2] = '>'; - if( ( looped ) && ( iaddr > *paddr ) ) + if((looped) && (iaddr > *paddr)) *looped = SDL_TRUE; return distmp; } -static void mon_regmod( int x, int y, int w ) +static void mon_regmod(int x, int y, int w) { int offs, i; offs = y*tz[TZ_REGS]->w+x; - for( i=0; ifc[offs] = 1; tz[TZ_REGS]->bc[offs] = 8; } } -void mon_update_regs( struct machine *oric ) +void mon_update_regs(struct machine *oric) { int i; unsigned short addr, pc; @@ -1265,117 +1315,151 @@ void mon_update_regs( struct machine *oric ) pc = oric->cpu.pc; - if( ( oric->cpu.irq ) && ( oric->cpu.f_i == 0 ) ) - pc = (mon_read( oric, 0xffff )<<8) | mon_read( oric, 0xfffe ); + if((oric->cpu.irq) && (oric->cpu.f_i == 0)) + pc = (mon_read(oric, 0xffff)<<8) | mon_read(oric, 0xfffe); - tzprintfpos( tz[TZ_REGS], 2, 2, "PC=%04X SP=01%02X A=%02X X=%02X Y=%02X LPC=%04X", - pc, - oric->cpu.sp, - oric->cpu.a, - oric->cpu.x, - oric->cpu.y, - oric->cpu.lastpc ); + tzprintfpos(tz[TZ_REGS], 2, 2, "PC=%04X SP=01%02X A=%02X X=%02X Y=%02X LPC=%04X", + pc, + oric->cpu.sp, + oric->cpu.a, + oric->cpu.x, + oric->cpu.y, + oric->cpu.lastpc); - csym = mon_find_sym_by_addr( oric, pc, NULL ); - if( csym ) + csym = mon_find_sym_by_addr(oric, pc, NULL); + if(csym) { - if( strlen( csym->name ) > 46 ) + if(strlen(csym->name) > 46) { - strncpy( stmp, csym->name, 46 ); + strncpy(stmp, csym->name, 46); stmp[46] = 0; - } else { - strcpy( stmp, csym->name ); } - tzstrpos( tz[TZ_REGS], 2, 3, stmp ); - } else { - tzprintfpos( tz[TZ_REGS], 2, 3, "%46s", " " ); + else + { + strcpy(stmp, csym->name); + } + tzstrpos(tz[TZ_REGS], 2, 3, stmp); + } + else + { + tzprintfpos(tz[TZ_REGS], 2, 3, "%46s", " "); } - tzprintfpos( tz[TZ_REGS], 2, 4, "CY=%09d", oric->cpu.cycles ); - tzprintfpos( tz[TZ_REGS], 2, 5, "FM=%06d RS=%03d", oric->frames, oric->vid_raster ); + tzprintfpos(tz[TZ_REGS], 2, 4, "CY=%09d", oric->cpu.cycles); + tzprintfpos(tz[TZ_REGS], 2, 5, "FM=%06d RS=%03d", oric->frames, oric->vid_raster); - tzstrpos( tz[TZ_REGS], 35, 4, (oric->cpu.irq&IRQF_VIA) ? "VIA" : " " ); - tzstrpos( tz[TZ_REGS], 35, 5, (oric->cpu.irq&IRQF_DISK) ? "DISK" : " " ); + tzstrpos(tz[TZ_REGS], 35, 4, (oric->cpu.irq&IRQF_VIA) ? "VIA" : " "); + tzstrpos(tz[TZ_REGS], 35, 5, (oric->cpu.irq&IRQF_DISK) ? "DISK" : " "); - tzstrpos( tz[TZ_REGS], 20, 4, "NV-BDIZC" ); - tzprintfpos( tz[TZ_REGS], 20, 5, "%01X%01X1%01X%01X%01X%01X%01X", - oric->cpu.f_n, - oric->cpu.f_v, - oric->cpu.f_b, - oric->cpu.f_d, - oric->cpu.f_i, - oric->cpu.f_z, - oric->cpu.f_c ); + tzstrpos(tz[TZ_REGS], 20, 4, "NV-BDIZC"); + tzprintfpos(tz[TZ_REGS], 20, 5, "%01X%01X1%01X%01X%01X%01X%01X", + oric->cpu.f_n, + oric->cpu.f_v, + oric->cpu.f_b, + oric->cpu.f_d, + oric->cpu.f_i, + oric->cpu.f_z, + oric->cpu.f_c); - tzprintfpos( tz[TZ_REGS], 30, 4, "NMI=%04X RST=%04X", - (oric->cpu.read( &oric->cpu, 0xfffb )<<8)|oric->cpu.read( &oric->cpu, 0xfffa ), - (oric->cpu.read( &oric->cpu, 0xfffd )<<8)|oric->cpu.read( &oric->cpu, 0xfffc ) ); - tzprintfpos( tz[TZ_REGS], 30, 5, "IRQ=%04X", (oric->cpu.read( &oric->cpu, 0xffff )<<8)|oric->cpu.read( &oric->cpu, 0xfffe ) ); + tzprintfpos(tz[TZ_REGS], 30, 4, "NMI=%04X RST=%04X", + (oric->cpu.read(&oric->cpu, 0xfffb)<<8)|oric->cpu.read(&oric->cpu, 0xfffa), + (oric->cpu.read(&oric->cpu, 0xfffd)<<8)|oric->cpu.read(&oric->cpu, 0xfffc)); + tzprintfpos(tz[TZ_REGS], 30, 5, "IRQ=%04X", (oric->cpu.read(&oric->cpu, 0xffff)<<8)|oric->cpu.read(&oric->cpu, 0xfffe)); addr = pc; - for( i=0; i<10; i++ ) + for(i=0; i<10; i++) { disaddrs[i] = addr; - tzsetcol( tz[TZ_REGS], (addr==pc) ? 1 : 2, 3 ); - tzstrpos( tz[TZ_REGS], 23, 7+i, " " ); - tzstrpos( tz[TZ_REGS], 2, 7+i, mon_disassemble( oric, &addr, NULL, SDL_FALSE ) ); + tzsetcol(tz[TZ_REGS], (addr==pc) ? 1 : 2, 3); + tzstrpos(tz[TZ_REGS], 23, 7+i, " "); + tzstrpos(tz[TZ_REGS], 2, 7+i, mon_disassemble(oric, &addr, NULL, SDL_FALSE)); } - if( cpu_oldvalid ) + if(cpu_oldvalid) { - if( cpu_old.pc != pc ) mon_regmod( 5, 2, 4 ); - if( cpu_old.sp != oric->cpu.sp ) mon_regmod( 14, 2, 4 ); - if( cpu_old.a != oric->cpu.a ) mon_regmod( 22, 2, 2 ); - if( cpu_old.x != oric->cpu.x ) mon_regmod( 28, 2, 2 ); - if( cpu_old.y != oric->cpu.y ) mon_regmod( 34, 2, 2 ); - if( cpu_old.cycles != oric->cpu.cycles ) mon_regmod( 5, 4, 9 ); - if( frames_old != oric->frames ) mon_regmod( 5, 5, 6 ); - if( vidraster_old != oric->vid_raster ) mon_regmod( 15, 5, 3 ); - if( cpu_old.f_n != oric->cpu.f_n ) mon_regmod( 20, 5, 1 ); - if( cpu_old.f_v != oric->cpu.f_v ) mon_regmod( 21, 5, 1 ); - if( cpu_old.f_b != oric->cpu.f_b ) mon_regmod( 23, 5, 1 ); - if( cpu_old.f_d != oric->cpu.f_d ) mon_regmod( 24, 5, 1 ); - if( cpu_old.f_i != oric->cpu.f_i ) mon_regmod( 25, 5, 1 ); - if( cpu_old.f_z != oric->cpu.f_z ) mon_regmod( 26, 5, 1 ); - if( cpu_old.f_c != oric->cpu.f_c ) mon_regmod( 27, 5, 1 ); - - if( (cpu_old.irq&IRQF_VIA) != (oric->cpu.irq&IRQF_VIA) ) mon_regmod( 35, 4, 3 ); - if( (cpu_old.irq&IRQF_DISK) != (oric->cpu.irq&IRQF_DISK) ) mon_regmod( 35, 5, 4 ); + if(cpu_old.pc != pc) mon_regmod(5, 2, 4); + if(cpu_old.sp != oric->cpu.sp) mon_regmod(14, 2, 4); + if(cpu_old.a != oric->cpu.a) mon_regmod(22, 2, 2); + if(cpu_old.x != oric->cpu.x) mon_regmod(28, 2, 2); + if(cpu_old.y != oric->cpu.y) mon_regmod(34, 2, 2); + if(cpu_old.cycles != oric->cpu.cycles) mon_regmod(5, 4, 9); + if(frames_old != oric->frames) mon_regmod(5, 5, 6); + if(vidraster_old != oric->vid_raster) mon_regmod(15, 5, 3); + if(cpu_old.f_n != oric->cpu.f_n) mon_regmod(20, 5, 1); + if(cpu_old.f_v != oric->cpu.f_v) mon_regmod(21, 5, 1); + if(cpu_old.f_b != oric->cpu.f_b) mon_regmod(23, 5, 1); + if(cpu_old.f_d != oric->cpu.f_d) mon_regmod(24, 5, 1); + if(cpu_old.f_i != oric->cpu.f_i) mon_regmod(25, 5, 1); + if(cpu_old.f_z != oric->cpu.f_z) mon_regmod(26, 5, 1); + if(cpu_old.f_c != oric->cpu.f_c) mon_regmod(27, 5, 1); + + if((cpu_old.irq&IRQF_VIA) != (oric->cpu.irq&IRQF_VIA)) mon_regmod(35, 4, 3); + if((cpu_old.irq&IRQF_DISK) != (oric->cpu.irq&IRQF_DISK)) mon_regmod(35, 5, 4); } } -static void mon_click_regs( struct machine *oric, SDL_bool *needrender, int x, int y, SDL_bool dblclk ) +static void mon_click_regs(struct machine *oric, SDL_bool *needrender, int x, int y, SDL_bool dblclk) { char cmdtmp[32]; - if( ( dblclk ) && ( y == 5 ) ) + if((dblclk) && (y == 5)) { - switch( x ) + switch(x) { - case 20: mon_set_modified( oric ); oric->cpu.f_n ^= 1; *needrender = SDL_TRUE; return; - case 21: mon_set_modified( oric ); oric->cpu.f_v ^= 1; *needrender = SDL_TRUE; return; - case 23: mon_set_modified( oric ); oric->cpu.f_b ^= 1; *needrender = SDL_TRUE; return; - case 24: mon_set_modified( oric ); oric->cpu.f_d ^= 1; *needrender = SDL_TRUE; return; - case 25: mon_set_modified( oric ); oric->cpu.f_i ^= 1; *needrender = SDL_TRUE; return; - case 26: mon_set_modified( oric ); oric->cpu.f_z ^= 1; *needrender = SDL_TRUE; return; - case 27: mon_set_modified( oric ); oric->cpu.f_c ^= 1; *needrender = SDL_TRUE; return; + case 20: + mon_set_modified(oric); + oric->cpu.f_n ^= 1; + *needrender = SDL_TRUE; + return; + case 21: + mon_set_modified(oric); + oric->cpu.f_v ^= 1; + *needrender = SDL_TRUE; + return; + case 23: + mon_set_modified(oric); + oric->cpu.f_b ^= 1; + *needrender = SDL_TRUE; + return; + case 24: + mon_set_modified(oric); + oric->cpu.f_d ^= 1; + *needrender = SDL_TRUE; + return; + case 25: + mon_set_modified(oric); + oric->cpu.f_i ^= 1; + *needrender = SDL_TRUE; + return; + case 26: + mon_set_modified(oric); + oric->cpu.f_z ^= 1; + *needrender = SDL_TRUE; + return; + case 27: + mon_set_modified(oric); + oric->cpu.f_c ^= 1; + *needrender = SDL_TRUE; + return; } } - if( ( dblclk ) && ( y >= 7 ) && ( y < 17 ) ) + if((dblclk) && (y >= 7) && (y < 17)) { int i; - if( bp_at( oric, disaddrs[y-7], &i, NULL ) & 8 ) + if(bp_at(oric, disaddrs[y-7], &i, NULL) & 8) { - sprintf( cmdtmp, "bc %d", i ); - mon_do_cmd( cmdtmp, oric, needrender ); + sprintf(cmdtmp, "bc %d", i); + mon_do_cmd(cmdtmp, oric, needrender); *needrender = SDL_TRUE; - } else { - sprintf( cmdtmp, "bs $%04x", disaddrs[y-7] ); - mon_do_cmd( cmdtmp, oric, needrender ); + } + else + { + sprintf(cmdtmp, "bs $%04x", disaddrs[y-7]); + mon_do_cmd(cmdtmp, oric, needrender); *needrender = SDL_TRUE; } @@ -1383,102 +1467,102 @@ static void mon_click_regs( struct machine *oric, SDL_bool *needrender, int x, i } } -static void mon_viamod( int x, int y, int w, struct textzone *vtz ) +static void mon_viamod(int x, int y, int w, struct textzone *vtz) { int offs, i; offs = y*vtz->w+x; - for( i=0; ifc[offs] = 1; vtz->bc[offs] = 8; } } -void mon_update_via( struct machine *oric, struct textzone *vtz, struct via *v, struct via *old, SDL_bool *oldvalid ) +void mon_update_via(struct machine *oric, struct textzone *vtz, struct via *v, struct via *old, SDL_bool *oldvalid) { int i, j, o; unsigned char val; - char *names[] = { "IORB ", "IORAh", "DDRB ", "DDRA ", "T1CL ", "T1CH ", "T1LL ", "T1LH ", "T2CL ", "T2CH ", "SR ", "ACR ", "PCR ", "IFR ", "IER ", "IORA " }; + char* names[] = { "IORB ", "IORAh", "DDRB ", "DDRA ", "T1CL ", "T1CH ", "T1LL ", "T1LH ", "T2CL ", "T2CH ", "SR ", "ACR ", "PCR ", "IFR ", "IER ", "IORA " }; - for( i=0; i<16; i++ ) + for(i=0; i<16; i++) { - val = via_mon_read( v, v == &oric->via ? 0x300+i : 0x320+i ); - tzprintfpos( vtz, 2, i+1, "%04X: %s $%02X %%", (v == &oric->via) ? 0x300+i : 0x320+i, names[i], val ); - for( j=128; j; j>>=1 ) + val = via_mon_read(v, v == &oric->via ? 0x300+i : 0x320+i); + tzprintfpos(vtz, 2, i+1, "%04X: %s $%02X %%", (v == &oric->via) ? 0x300+i : 0x320+i, names[i], val); + for(j=128; j; j>>=1) tzputc(vtz, (val&j)?'1':'0'); - if( *oldvalid ) + if(*oldvalid) { - unsigned char oval = via_mon_read(old, (v == &oric->via) ? 0x300+i : 0x320+i ); - if( val != oval ) mon_viamod( 16, i+1, 2, vtz ); - for( j=128, o=19; j; j>>=1, o++ ) + unsigned char oval = via_mon_read(old, (v == &oric->via) ? 0x300+i : 0x320+i); + if(val != oval) mon_viamod(16, i+1, 2, vtz); + for(j=128, o=19; j; j>>=1, o++) { - if ((val&j) != (oval&j)) - mon_viamod( o, i+1, 1, vtz ); + if((val&j) != (oval&j)) + mon_viamod(o, i+1, 1, vtz); } } } - tzprintfpos( vtz, 2, 18, "---------- TAPE ----------"); - tzprintfpos( vtz, 2, 19, "OFS %08u LEN %08u", oric->tapeoffs, oric->tapelen ); + tzprintfpos(vtz, 2, 18, "---------- TAPE ----------"); + tzprintfpos(vtz, 2, 19, "OFS %08u LEN %08u", oric->tapeoffs, oric->tapelen); -/* - if( v == &oric->via ) - { - tzprintfpos( vtz, 2, 11, "TAPE OFFS = %07d", oric->tapeoffs ); - tzprintfpos( vtz, 2, 12, "TAPE LEN = %07d", oric->tapelen ); - tzprintfpos( vtz, 2, 13, "COUNT = %07d", oric->tapecount ); - tzprintfpos( vtz, 2, 14, "BIT = %02X DATA = %1X", - oric->tapebit, - oric->tapetime == TAPE_1_PULSE ); - tzprintfpos( vtz, 2, 15, "MOTOR = %1X", oric->tapemotor ); - } + /* + if( v == &oric->via ) + { + tzprintfpos( vtz, 2, 11, "TAPE OFFS = %07d", oric->tapeoffs ); + tzprintfpos( vtz, 2, 12, "TAPE LEN = %07d", oric->tapelen ); + tzprintfpos( vtz, 2, 13, "COUNT = %07d", oric->tapecount ); + tzprintfpos( vtz, 2, 14, "BIT = %02X DATA = %1X", + oric->tapebit, + oric->tapetime == TAPE_1_PULSE ); + tzprintfpos( vtz, 2, 15, "MOTOR = %1X", oric->tapemotor ); + } - if( v == &oric->tele_via ) - { - tzprintfpos( vtz, 2, 11, "BANK = %02X", oric->tele_currbank ); - } + if( v == &oric->tele_via ) + { + tzprintfpos( vtz, 2, 11, "BANK = %02X", oric->tele_currbank ); + } - if( *oldvalid ) - { - if( old->pcr != v->pcr ) mon_viamod( 6, 2, 2, vtz ); - if( old->acr != v->acr ) mon_viamod( 13, 2, 2, vtz ); - if( old->sr != v->sr ) mon_viamod( 19, 2, 2, vtz ); - if( old->ifr != v->ifr ) mon_viamod( 6, 3, 2, vtz ); - if( old->ier != v->ier ) mon_viamod( 13, 3, 2, vtz ); - if( old->ddra != v->ddra ) mon_viamod( 12, 5, 2, vtz ); - if( old->ddrb != v->ddrb ) mon_viamod( 18, 5, 2, vtz ); - if( old->ca1 != v->ca1 ) mon_viamod( 6, 6, 1, vtz ); - if( old->ca2 != v->ca2 ) mon_viamod( 12, 6, 1, vtz ); - if( old->cb1 != v->cb1 ) mon_viamod( 20, 6, 1, vtz ); - if( old->cb2 != v->cb2 ) mon_viamod( 26, 6, 1, vtz ); - if( old->t1c != v->t1c ) mon_viamod( 15, 8, 4, vtz ); - if( old->t2c != v->t2c ) mon_viamod( 15, 9, 4, vtz ); - - if( ((old->t1l_h<<8)|(old->t1l_l)) != ((v->t1l_h<<8)|(v->t1l_l)) ) mon_viamod( 6, 8, 4, vtz ); - if( ((old->t2l_h<<8)|(old->t2l_l)) != ((v->t2l_h<<8)|(v->t2l_l)) ) mon_viamod( 6, 9, 4, vtz ); - - if( ((v->ora&v->ddra)|(v->ira&(~v->ddra))) != ((old->ora&old->ddra)|(old->ira&(~old->ddra))) ) mon_viamod( 4, 5, 2, vtz ); - if( ((v->orb&v->ddrb)|(v->irb&(~v->ddrb))) != ((old->orb&old->ddrb)|(old->irb&(~old->ddrb))) ) mon_viamod( 26, 5, 2, vtz ); - } -*/ + if( *oldvalid ) + { + if( old->pcr != v->pcr ) mon_viamod( 6, 2, 2, vtz ); + if( old->acr != v->acr ) mon_viamod( 13, 2, 2, vtz ); + if( old->sr != v->sr ) mon_viamod( 19, 2, 2, vtz ); + if( old->ifr != v->ifr ) mon_viamod( 6, 3, 2, vtz ); + if( old->ier != v->ier ) mon_viamod( 13, 3, 2, vtz ); + if( old->ddra != v->ddra ) mon_viamod( 12, 5, 2, vtz ); + if( old->ddrb != v->ddrb ) mon_viamod( 18, 5, 2, vtz ); + if( old->ca1 != v->ca1 ) mon_viamod( 6, 6, 1, vtz ); + if( old->ca2 != v->ca2 ) mon_viamod( 12, 6, 1, vtz ); + if( old->cb1 != v->cb1 ) mon_viamod( 20, 6, 1, vtz ); + if( old->cb2 != v->cb2 ) mon_viamod( 26, 6, 1, vtz ); + if( old->t1c != v->t1c ) mon_viamod( 15, 8, 4, vtz ); + if( old->t2c != v->t2c ) mon_viamod( 15, 9, 4, vtz ); + + if( ((old->t1l_h<<8)|(old->t1l_l)) != ((v->t1l_h<<8)|(v->t1l_l)) ) mon_viamod( 6, 8, 4, vtz ); + if( ((old->t2l_h<<8)|(old->t2l_l)) != ((v->t2l_h<<8)|(v->t2l_l)) ) mon_viamod( 6, 9, 4, vtz ); + + if( ((v->ora&v->ddra)|(v->ira&(~v->ddra))) != ((old->ora&old->ddra)|(old->ira&(~old->ddra))) ) mon_viamod( 4, 5, 2, vtz ); + if( ((v->orb&v->ddrb)|(v->irb&(~v->ddrb))) != ((old->orb&old->ddrb)|(old->irb&(~old->ddrb))) ) mon_viamod( 26, 5, 2, vtz ); + } + */ } -static void mon_aymod( int x, int y, int w ) +static void mon_aymod(int x, int y, int w) { int offs, i; offs = y*tz[TZ_AY]->w+x; - for( i=0; ifc[offs] = 1; tz[TZ_AY]->bc[offs] = 8; } } -static void printayregbits( struct machine *oric, char *str, Sint16 x, Sint16 y, int reg, Uint8 bits ) +static void printayregbits(struct machine *oric, char* str, Sint16 x, Sint16 y, int reg, Uint8 bits) { int i, o, fc, bc; Uint8 vnew, vold; @@ -1487,32 +1571,34 @@ static void printayregbits( struct machine *oric, char *str, Sint16 x, Sint16 y, vnew = oric->ay.eregs[reg]; vold = ay_old.eregs[reg]; - tzprintfpos( ptz, x, y, str, vnew ); + tzprintfpos(ptz, x, y, str, vnew); fc = 2; bc = 3; - if( ( ay_oldvalid ) && ( ay_old.eregs[reg] != oric->ay.eregs[reg] ) ) + if((ay_oldvalid) && (ay_old.eregs[reg] != oric->ay.eregs[reg])) { fc = 1; bc = 8; - mon_aymod( x+14, y, 2 ); + mon_aymod(x+14, y, 2); } x+=18; o = (y*ptz->w)+x; bits = 8-bits; - for( i=0; i<8; i++ ) + for(i=0; i<8; i++) { - if( i >= bits ) + if(i >= bits) ptz->tx[o] = (vnew&(0x80>>i)) ? '1' : '0'; else ptz->tx[o] = ' '; - if( (vnew&(0x80)>>i) != (vold&(0x80)>>i) ) + if((vnew&(0x80)>>i) != (vold&(0x80)>>i)) { ptz->fc[o] = fc; ptz->bc[o] = bc; - } else { + } + else + { ptz->fc[o] = 2; ptz->bc[o] = 3; } @@ -1520,59 +1606,60 @@ static void printayregbits( struct machine *oric, char *str, Sint16 x, Sint16 y, } } -void mon_update_ay( struct machine *oric ) +void mon_update_ay(struct machine *oric) { - char *strs[] = { "INACTIVE", + char* strs[] = { "INACTIVE", "READ ", "WRITE ", - "LATCH " }; - tzprintfpos( tz[TZ_AY], 2, 1, "CTRL=%s REG=%02X", - strs[oric->ay.bmode&3], - oric->ay.creg ); + "LATCH " + }; + tzprintfpos(tz[TZ_AY], 2, 1, "CTRL=%s REG=%02X", + strs[oric->ay.bmode&3], + oric->ay.creg); - if( ay_oldvalid ) + if(ay_oldvalid) { - if( (ay_old.bmode&3) != (oric->ay.bmode&3) ) mon_aymod( 7, 1, 8 ); - if( ay_old.creg != oric->ay.creg ) mon_aymod( 21, 1, 2 ); + if((ay_old.bmode&3) != (oric->ay.bmode&3)) mon_aymod(7, 1, 8); + if(ay_old.creg != oric->ay.creg) mon_aymod(21, 1, 2); } - printayregbits( oric, "R0 Pitch A L $%02X %%", 2, 2, AY_CHA_PER_L, 8 ); - printayregbits( oric, "R1 Pitch A H $%02X %%", 2, 3, AY_CHA_PER_H, 4 ); - printayregbits( oric, "R2 Pitch B L $%02X %%", 2, 4, AY_CHB_PER_L, 8 ); - printayregbits( oric, "R3 Pitch B H $%02X %%", 2, 5, AY_CHB_PER_H, 4 ); - printayregbits( oric, "R4 Pitch C L $%02X %%", 2, 6, AY_CHC_PER_L, 8 ); - printayregbits( oric, "R5 Pitch C H $%02X %%", 2, 7, AY_CHC_PER_H, 4 ); - - printayregbits( oric, "R6 Noise $%02X %%", 2, 9, AY_NOISE_PER, 5 ); - printayregbits( oric, "R7 Status $%02X %%", 2,10, AY_STATUS, 7 ); - - printayregbits( oric, "R8 Volume A $%02X %%", 2,12, AY_CHA_AMP, 5 ); - printayregbits( oric, "R9 Volume B $%02X %%", 2,13, AY_CHB_AMP, 5 ); - printayregbits( oric, "RA Volume C $%02X %%", 2,14, AY_CHC_AMP, 5 ); - - printayregbits( oric, "RB Env Per L $%02X %%", 2,16, AY_ENV_PER_L, 8 ); - printayregbits( oric, "RC Env Per H $%02X %%", 2,17, AY_ENV_PER_H, 8 ); - printayregbits( oric, "RD Env Cycle $%02X %%", 2,18, AY_ENV_CYCLE, 4 ); - printayregbits( oric, "RE Key Col $%02X %%", 2,19, AY_PORT_A, 8 ); - -/* - tzprintfpos( tz[TZ_AY], 2, 4, "A:P=%04X A=%02X N:PER=%02X", - (oric->ay.regs[AY_CHA_PER_H]<<8)|(oric->ay.regs[AY_CHA_PER_L]), - oric->ay.regs[AY_CHA_AMP], - oric->ay.regs[AY_NOISE_PER] ); - tzprintfpos( tz[TZ_AY], 2, 5, "B:P=%04X A=%02X E:PER=%04X", - (oric->ay.regs[AY_CHB_PER_H]<<8)|(oric->ay.regs[AY_CHB_PER_L]), - oric->ay.regs[AY_CHB_AMP], - (oric->ay.regs[AY_ENV_PER_H]<<8)|(oric->ay.regs[AY_ENV_PER_L]) ); - tzprintfpos( tz[TZ_AY], 2, 6, "C:P=%04X A=%02X E:CYC=%02X", - (oric->ay.regs[AY_CHC_PER_H]<<8)|(oric->ay.regs[AY_CHC_PER_L]), - oric->ay.regs[AY_CHC_AMP], - oric->ay.regs[AY_ENV_CYCLE] ); - tzprintfpos( tz[TZ_AY], 2, 8, "STATUS=%02X", - oric->ay.regs[AY_STATUS] ); - tzprintfpos( tz[TZ_AY], 2, 9, "PORT=%02X", - oric->ay.regs[AY_PORT_A] ); -*/ + printayregbits(oric, "R0 Pitch A L $%02X %%", 2, 2, AY_CHA_PER_L, 8); + printayregbits(oric, "R1 Pitch A H $%02X %%", 2, 3, AY_CHA_PER_H, 4); + printayregbits(oric, "R2 Pitch B L $%02X %%", 2, 4, AY_CHB_PER_L, 8); + printayregbits(oric, "R3 Pitch B H $%02X %%", 2, 5, AY_CHB_PER_H, 4); + printayregbits(oric, "R4 Pitch C L $%02X %%", 2, 6, AY_CHC_PER_L, 8); + printayregbits(oric, "R5 Pitch C H $%02X %%", 2, 7, AY_CHC_PER_H, 4); + + printayregbits(oric, "R6 Noise $%02X %%", 2, 9, AY_NOISE_PER, 5); + printayregbits(oric, "R7 Status $%02X %%", 2,10, AY_STATUS, 7); + + printayregbits(oric, "R8 Volume A $%02X %%", 2,12, AY_CHA_AMP, 5); + printayregbits(oric, "R9 Volume B $%02X %%", 2,13, AY_CHB_AMP, 5); + printayregbits(oric, "RA Volume C $%02X %%", 2,14, AY_CHC_AMP, 5); + + printayregbits(oric, "RB Env Per L $%02X %%", 2,16, AY_ENV_PER_L, 8); + printayregbits(oric, "RC Env Per H $%02X %%", 2,17, AY_ENV_PER_H, 8); + printayregbits(oric, "RD Env Cycle $%02X %%", 2,18, AY_ENV_CYCLE, 4); + printayregbits(oric, "RE Key Col $%02X %%", 2,19, AY_PORT_A, 8); + + /* + tzprintfpos( tz[TZ_AY], 2, 4, "A:P=%04X A=%02X N:PER=%02X", + (oric->ay.regs[AY_CHA_PER_H]<<8)|(oric->ay.regs[AY_CHA_PER_L]), + oric->ay.regs[AY_CHA_AMP], + oric->ay.regs[AY_NOISE_PER] ); + tzprintfpos( tz[TZ_AY], 2, 5, "B:P=%04X A=%02X E:PER=%04X", + (oric->ay.regs[AY_CHB_PER_H]<<8)|(oric->ay.regs[AY_CHB_PER_L]), + oric->ay.regs[AY_CHB_AMP], + (oric->ay.regs[AY_ENV_PER_H]<<8)|(oric->ay.regs[AY_ENV_PER_L]) ); + tzprintfpos( tz[TZ_AY], 2, 6, "C:P=%04X A=%02X E:CYC=%02X", + (oric->ay.regs[AY_CHC_PER_H]<<8)|(oric->ay.regs[AY_CHC_PER_L]), + oric->ay.regs[AY_CHC_AMP], + oric->ay.regs[AY_ENV_CYCLE] ); + tzprintfpos( tz[TZ_AY], 2, 8, "STATUS=%02X", + oric->ay.regs[AY_STATUS] ); + tzprintfpos( tz[TZ_AY], 2, 9, "PORT=%02X", + oric->ay.regs[AY_PORT_A] ); + */ } /* @@ -1595,108 +1682,124 @@ void mon_update_ay( struct machine *oric ) int currentop; int delayedint; */ -void mon_update_disk( struct machine *oric ) +void mon_update_disk(struct machine *oric) { - char *opname; + char* opname; - if( oric->drivetype == DRV_NONE ) + if(oric->drivetype == DRV_NONE) return; - if( oric->drivetype == DRV_PRAVETZ ) + if(oric->drivetype == DRV_PRAVETZ) { int i = oric->wddisk.c_drive; - tzprintfpos( tz[TZ_DISK], 2, 2, "DRIVE=%02X EXT=%04X", - oric->wddisk.c_drive, - oric->pravetz.extension ); - tzprintfpos( tz[TZ_DISK], 2, 3, "VOL=%02X SEL=%02X", - oric->pravetz.drv[i].volume, - oric->pravetz.drv[i].select ); - tzprintfpos( tz[TZ_DISK], 2, 4, "MOTOR=%01X WRRDY=%01X", - oric->pravetz.drv[i].motor_on, - oric->pravetz.drv[i].write_ready ); - tzprintfpos( tz[TZ_DISK], 2, 5, "OVRAM=%s", oric->pravetz.olay ? "ON " : "OFF" ); + tzprintfpos(tz[TZ_DISK], 2, 2, "DRIVE=%02X EXT=%04X", + oric->wddisk.c_drive, + oric->pravetz.extension); + tzprintfpos(tz[TZ_DISK], 2, 3, "VOL=%02X SEL=%02X", + oric->pravetz.drv[i].volume, + oric->pravetz.drv[i].select); + tzprintfpos(tz[TZ_DISK], 2, 4, "MOTOR=%01X WRRDY=%01X", + oric->pravetz.drv[i].motor_on, + oric->pravetz.drv[i].write_ready); + tzprintfpos(tz[TZ_DISK], 2, 5, "OVRAM=%s", oric->pravetz.olay ? "ON " : "OFF"); return; } opname = "Unknown "; - switch( oric->wddisk.currentop ) + switch(oric->wddisk.currentop) { - case COP_NUFFINK: opname = "Idle "; break; - case COP_READ_TRACK: opname = "Read track "; break; - case COP_READ_SECTOR: opname = "Read sector "; break; - case COP_READ_SECTORS: opname = "Read sectors "; break; - case COP_WRITE_TRACK: opname = "Write track "; break; - case COP_WRITE_SECTOR: opname = "Write sector "; break; - case COP_WRITE_SECTORS: opname = "Write sectors"; break; - case COP_READ_ADDRESS: opname = "Read address "; break; + case COP_NUFFINK: + opname = "Idle "; + break; + case COP_READ_TRACK: + opname = "Read track "; + break; + case COP_READ_SECTOR: + opname = "Read sector "; + break; + case COP_READ_SECTORS: + opname = "Read sectors "; + break; + case COP_WRITE_TRACK: + opname = "Write track "; + break; + case COP_WRITE_SECTOR: + opname = "Write sector "; + break; + case COP_WRITE_SECTORS: + opname = "Write sectors"; + break; + case COP_READ_ADDRESS: + opname = "Read address "; + break; } - tzprintfpos( tz[TZ_DISK], 2, 2, "STATUS=%02X ROMDIS=%1X", oric->wddisk.r_status, oric->romdis ); - tzprintfpos( tz[TZ_DISK], 2, 3, "DRIVE=%02X SIDE=%02X TRACK=%02X", - oric->wddisk.c_drive, - oric->wddisk.c_side, - oric->wddisk.c_track ); - tzprintfpos( tz[TZ_DISK], 2, 4, "SECTR=%02X DATA=%02X", - oric->wddisk.r_sector, - oric->wddisk.r_data ); - tzprintfpos( tz[TZ_DISK], 2, 5, "OP=%s", opname ); - tzprintfpos( tz[TZ_DISK], 2, 6, "IRQC=%03d DRQC=%03d", - oric->wddisk.delayedint, - oric->wddisk.delayeddrq ); - - switch( oric->drivetype ) + tzprintfpos(tz[TZ_DISK], 2, 2, "STATUS=%02X ROMDIS=%1X", oric->wddisk.r_status, oric->romdis); + tzprintfpos(tz[TZ_DISK], 2, 3, "DRIVE=%02X SIDE=%02X TRACK=%02X", + oric->wddisk.c_drive, + oric->wddisk.c_side, + oric->wddisk.c_track); + tzprintfpos(tz[TZ_DISK], 2, 4, "SECTR=%02X DATA=%02X", + oric->wddisk.r_sector, + oric->wddisk.r_data); + tzprintfpos(tz[TZ_DISK], 2, 5, "OP=%s", opname); + tzprintfpos(tz[TZ_DISK], 2, 6, "IRQC=%03d DRQC=%03d", + oric->wddisk.delayedint, + oric->wddisk.delayeddrq); + + switch(oric->drivetype) { case DRV_MICRODISC: - tzprintfpos( tz[TZ_DISK], 2, 8, "MDSTAT=%02X INTRQ=%1X DRQ=%1X", - oric->md.status, - oric->md.intrq!=0, - oric->md.drq!=0 ); - tzprintfpos( tz[TZ_DISK], 2, 9, "EPROM=%1X", oric->md.diskrom ); + tzprintfpos(tz[TZ_DISK], 2, 8, "MDSTAT=%02X INTRQ=%1X DRQ=%1X", + oric->md.status, + oric->md.intrq!=0, + oric->md.drq!=0); + tzprintfpos(tz[TZ_DISK], 2, 9, "EPROM=%1X", oric->md.diskrom); break; case DRV_JASMIN: - tzprintfpos( tz[TZ_DISK], 2, 8, "OVRAM=%s", oric->jasmin.olay ? "ON " : "OFF" ); + tzprintfpos(tz[TZ_DISK], 2, 8, "OVRAM=%s", oric->jasmin.olay ? "ON " : "OFF"); break; } } -void mon_update_twil( struct machine *oric ) +void mon_update_twil(struct machine *oric) { - if ( (oric->twilighteboard_activated == SDL_FALSE ) && (oric->ch376_activated == SDL_FALSE) ) + if((oric->twilighteboard_activated == SDL_FALSE) && (oric->ch376_activated == SDL_FALSE)) return; - if ( oric->twilighteboard_activated ) + if(oric->twilighteboard_activated) { int current_bank = oric->twilighte->current_bank & 0x07; int is_ram = (current_bank == 0) || ((twilighteboard_oric_read(oric->twilighte, 0x342) & 0x20) && (current_bank < 5)); - tzprintfpos( tz[TZ_TWIL], 2, 2, "Board version = %02X", (twilighteboard_oric_read(oric->twilighte, 0x342) & 0x07) ); - tzprintfpos( tz[TZ_TWIL], 2, 4, "Bank set = %02X", twilighteboard_oric_read(oric->twilighte, 0x343) ); - tzprintfpos( tz[TZ_TWIL], 2, 5, "Bank hardware number = %02X", twilighte_board_mapping_bank(oric->twilighte) ); - tzprintfpos( tz[TZ_TWIL], 2, 6, "Bank software number = %02X", twilighte_board_mapping_software_bank(oric->twilighte) ); - tzprintfpos( tz[TZ_TWIL], 2, 7, "Bank type = %s" , is_ram ? "SRAM ": "EEPROM"); - tzprintfpos( tz[TZ_TWIL], 2, 9, "Twil register = %02X", twilighteboard_oric_read(oric->twilighte, 0x342) ); - tzprintfpos( tz[TZ_TWIL], 2, 10, "Bank register = %02X", twilighteboard_oric_read(oric->twilighte, 0x343) ); - tzprintfpos( tz[TZ_TWIL], 2, 12, "IORB = %02X", twilighteboard_oric_read(oric->twilighte, 0x320) ); - tzprintfpos( tz[TZ_TWIL], 2, 13, "IORAh = %02X", twilighteboard_oric_read(oric->twilighte, 0x321) ); - tzprintfpos( tz[TZ_TWIL], 2, 14, "DDRB = %02X", twilighteboard_oric_read(oric->twilighte, 0x322) ); - tzprintfpos( tz[TZ_TWIL], 2, 15, "DDRA = %02X", twilighteboard_oric_read(oric->twilighte, 0x323) ); + tzprintfpos(tz[TZ_TWIL], 2, 2, "Board version = %02X", (twilighteboard_oric_read(oric->twilighte, 0x342) & 0x07)); + tzprintfpos(tz[TZ_TWIL], 2, 4, "Bank set = %02X", twilighteboard_oric_read(oric->twilighte, 0x343)); + tzprintfpos(tz[TZ_TWIL], 2, 5, "Bank hardware number = %02X", twilighte_board_mapping_bank(oric->twilighte)); + tzprintfpos(tz[TZ_TWIL], 2, 6, "Bank software number = %02X", twilighte_board_mapping_software_bank(oric->twilighte)); + tzprintfpos(tz[TZ_TWIL], 2, 7, "Bank type = %s", is_ram ? "SRAM ": "EEPROM"); + tzprintfpos(tz[TZ_TWIL], 2, 9, "Twil register = %02X", twilighteboard_oric_read(oric->twilighte, 0x342)); + tzprintfpos(tz[TZ_TWIL], 2, 10, "Bank register = %02X", twilighteboard_oric_read(oric->twilighte, 0x343)); + tzprintfpos(tz[TZ_TWIL], 2, 12, "IORB = %02X", twilighteboard_oric_read(oric->twilighte, 0x320)); + tzprintfpos(tz[TZ_TWIL], 2, 13, "IORAh = %02X", twilighteboard_oric_read(oric->twilighte, 0x321)); + tzprintfpos(tz[TZ_TWIL], 2, 14, "DDRB = %02X", twilighteboard_oric_read(oric->twilighte, 0x322)); + tzprintfpos(tz[TZ_TWIL], 2, 15, "DDRA = %02X", twilighteboard_oric_read(oric->twilighte, 0x323)); } int offs = 8*tz[TZ_TWIL]->w+1; - for( int k=0; k<28; k++ ) + for(int k=0; k<28; k++) { tz[TZ_TWIL]->tx[offs+k] = 2; tz[TZ_TWIL]->bc[offs+k] = 3; tz[TZ_TWIL]->fc[offs+k] = 2; } - if ( oric->ch376_activated ) + if(oric->ch376_activated) { } } -void mon_state_reset( struct machine *oric ) +void mon_state_reset(struct machine *oric) { mwatch_oldvalid = SDL_FALSE; cpu_oldvalid = SDL_FALSE; @@ -1705,19 +1808,21 @@ void mon_state_reset( struct machine *oric ) via2_oldvalid = SDL_FALSE; } -void mon_update_mwatch( struct machine *oric ) +void mon_update_mwatch(struct machine *oric) { unsigned short addr; int j,k,l; unsigned int v; - if( mw_split ) + if(mw_split) { tz[TZ_MEMWATCH]->tx[ 50] = mw_which==0 ? 14 : 5; tz[TZ_MEMWATCH]->tx[550] = mw_which==1 ? 14 : 5; - } else { + } + else + { int offs = 10*tz[TZ_MEMWATCH]->w+1; - for( k=0; k<48; k++ ) + for(k=0; k<48; k++) tz[TZ_MEMWATCH]->tx[offs+k] = 32; tz[TZ_MEMWATCH]->tx[ 50] = 5; tz[TZ_MEMWATCH]->tx[550] = 5; @@ -1725,12 +1830,12 @@ void mon_update_mwatch( struct machine *oric ) } addr = mw_addr[0]; - for( j=0; j<19; j++, addr+=8 ) + for(j=0; j<19; j++, addr+=8) { - if( ( mw_split ) && ( j == 9 ) ) + if((mw_split) && (j == 9)) { int offs = 10*tz[TZ_MEMWATCH]->w+1; - for( k=0; k<48; k++ ) + for(k=0; k<48; k++) { tz[TZ_MEMWATCH]->tx[offs+k] = 2; tz[TZ_MEMWATCH]->bc[offs+k] = 3; @@ -1740,30 +1845,30 @@ void mon_update_mwatch( struct machine *oric ) addr = mw_addr[1]; } - sprintf( vsptmp, "%04X ", addr ); - for( k=0; k<8; k++ ) + sprintf(vsptmp, "%04X ", addr); + for(k=0; k<8; k++) { char tmp[8]; - snprintf( tmp, 7, "%02X ", mon_read( oric, addr+k ) ); - strcat( vsptmp, tmp ); + snprintf(tmp, 7, "%02X ", mon_read(oric, addr+k)); + strcat(vsptmp, tmp); } - l = (int)strlen( vsptmp ); + l = (int)strlen(vsptmp); vsptmp[l++] = 32; vsptmp[l++] = '\''; - for( k=0; k<8; k++ ) + for(k=0; k<8; k++) { - v = mon_read( oric, addr+k ); + v = mon_read(oric, addr+k); vsptmp[l++] = ((v>31)&&(v<128))?v:'.'; } vsptmp[l++] = '\''; vsptmp[l++] = 0; - tzstrpos( tz[TZ_MEMWATCH], 1, j+1, vsptmp ); + tzstrpos(tz[TZ_MEMWATCH], 1, j+1, vsptmp); - if( mwatch_oldvalid ) + if(mwatch_oldvalid) { - for( k=0; k<8; k++ ) + for(k=0; k<8; k++) { - if( isram( oric, addr+k ) && ( mwatch_old[addr+k] != mon_read( oric, addr+k ) ) ) + if(isram(oric, addr+k) && (mwatch_old[addr+k] != mon_read(oric, addr+k))) { int offs = (j+1)*tz[TZ_MEMWATCH]->w; tz[TZ_MEMWATCH]->fc[offs+(k*3+7)] = 1; @@ -1777,127 +1882,127 @@ void mon_update_mwatch( struct machine *oric ) } } - if( mw_mode == 0 ) return; + if(mw_mode == 0) return; - makebox( tz[TZ_MEMWATCH], 17, 8, 7, 3, 2, 3 ); - tzstrpos( tz[TZ_MEMWATCH], 18, 9, mw_ibuf ); + makebox(tz[TZ_MEMWATCH], 17, 8, 7, 3, 2, 3); + tzstrpos(tz[TZ_MEMWATCH], 18, 9, mw_ibuf); } -void mon_update( struct machine *oric ) +void mon_update(struct machine *oric) { - mon_update_regs( oric ); - switch( mshow ) + mon_update_regs(oric); + switch(mshow) { case MSHOW_VIA: - mon_update_via( oric, tz[TZ_VIA], &oric->via, &via_old, &via_oldvalid ); + mon_update_via(oric, tz[TZ_VIA], &oric->via, &via_old, &via_oldvalid); break; case MSHOW_VIA2: - mon_update_via( oric, tz[TZ_VIA2], &oric->tele_via, &via2_old, &via2_oldvalid ); + mon_update_via(oric, tz[TZ_VIA2], &oric->tele_via, &via2_old, &via2_oldvalid); break; case MSHOW_AY: - mon_update_ay( oric ); + mon_update_ay(oric); break; case MSHOW_DISK: - mon_update_disk( oric ); + mon_update_disk(oric); break; case MSHOW_TWIL: - mon_update_twil( oric ); + mon_update_twil(oric); break; } - switch( cshow ) + switch(cshow) { case CSHOW_MWATCH: - mon_update_mwatch( oric ); + mon_update_mwatch(oric); break; } } -void mon_render( struct machine *oric ) +void mon_render(struct machine *oric) { - if (updatepreview) - ula_renderscreen( oric ); - oric->render_video( oric, SDL_FALSE ); + if(updatepreview) + ula_renderscreen(oric); + oric->render_video(oric, SDL_FALSE); - switch( mshow ) + switch(mshow) { case MSHOW_VIA: - oric->render_textzone( oric, TZ_VIA ); + oric->render_textzone(oric, TZ_VIA); break; case MSHOW_VIA2: - oric->render_textzone( oric, TZ_VIA2 ); + oric->render_textzone(oric, TZ_VIA2); break; case MSHOW_AY: - oric->render_textzone( oric, TZ_AY ); + oric->render_textzone(oric, TZ_AY); break; case MSHOW_DISK: - oric->render_textzone( oric, TZ_DISK ); + oric->render_textzone(oric, TZ_DISK); break; case MSHOW_TWIL: - oric->render_textzone( oric, TZ_TWIL ); + oric->render_textzone(oric, TZ_TWIL); break; } - switch( cshow ) + switch(cshow) { case CSHOW_CONSOLE: - oric->render_textzone( oric, TZ_MONITOR ); + oric->render_textzone(oric, TZ_MONITOR); break; case CSHOW_DEBUG: - oric->render_textzone( oric, TZ_DEBUG ); + oric->render_textzone(oric, TZ_DEBUG); break; case CSHOW_MWATCH: - oric->render_textzone( oric, TZ_MEMWATCH ); + oric->render_textzone(oric, TZ_MEMWATCH); break; } - oric->render_textzone( oric, TZ_REGS ); + oric->render_textzone(oric, TZ_REGS); } -void mon_hide_curs( void ) +void mon_hide_curs(void) { struct textzone *ptz = tz[TZ_MONITOR]; int x = cursx-iloff; - if( mon_asmmode ) + if(mon_asmmode) { ptz->fc[ptz->w*19+8+x] = 2; ptz->bc[ptz->w*19+8+x] = 3; return; } - if( ( x < 0 ) || ( x > CONS_WIDTH ) ) return; + if((x < 0) || (x > CONS_WIDTH)) return; ptz->fc[ptz->w*19+2+x] = 2; ptz->bc[ptz->w*19+2+x] = 3; } -void mon_show_curs( void ) +void mon_show_curs(void) { struct textzone *ptz = tz[TZ_MONITOR]; int x = cursx-iloff; - if( mon_asmmode ) + if(mon_asmmode) { ptz->fc[ptz->w*19+8+x] = 3; ptz->bc[ptz->w*19+8+x] = 2; return; } - if( ( x < 0 ) || ( x > CONS_WIDTH ) ) return; + if((x < 0) || (x > CONS_WIDTH)) return; ptz->fc[ptz->w*19+2+x] = 3; ptz->bc[ptz->w*19+2+x] = 2; } -void mon_scroll( SDL_bool above ) +void mon_scroll(SDL_bool above) { int x, y, s, d, h; struct textzone *ptz = tz[TZ_MONITOR]; @@ -1906,9 +2011,9 @@ void mon_scroll( SDL_bool above ) s = ptz->w*2+1; d = ptz->w+1; - for( y=0; ytx[d] = ptz->tx[s]; ptz->fc[d] = ptz->fc[s]; @@ -1918,7 +2023,7 @@ void mon_scroll( SDL_bool above ) s += 2; } - for( x=0; x<48; x++ ) + for(x=0; x<48; x++) { ptz->tx[d] = ' '; ptz->fc[d] = 2; @@ -1926,136 +2031,136 @@ void mon_scroll( SDL_bool above ) } } -void mon_oprintf( char *fmt, ... ) +void mon_oprintf(char* fmt, ...) { va_list ap; int i; char stmp[48]; - va_start( ap, fmt ); - if( vsnprintf( vsptmp, VSPTMPSIZE, fmt, ap ) != -1 ) + va_start(ap, fmt); + if(vsnprintf(vsptmp, VSPTMPSIZE, fmt, ap) != -1) { vsptmp[VSPTMPSIZE-1] = 0; i = 0; - while( strlen( &vsptmp[i] ) > 47 ) + while(strlen(&vsptmp[i]) > 47) { - strncpy( stmp, &vsptmp[i], 47 ); + strncpy(stmp, &vsptmp[i], 47); stmp[47] = 0; - tzstrpos( tz[TZ_MONITOR], 1, 19, stmp ); - mon_scroll( SDL_FALSE ); + tzstrpos(tz[TZ_MONITOR], 1, 19, stmp); + mon_scroll(SDL_FALSE); i += 47; } - tzstrpos( tz[TZ_MONITOR], 1, 19, &vsptmp[i] ); + tzstrpos(tz[TZ_MONITOR], 1, 19, &vsptmp[i]); } - va_end( ap ); + va_end(ap); } -void mon_printf( char *fmt, ... ) +void mon_printf(char* fmt, ...) { va_list ap; int i; char stmp[48]; - mon_scroll( SDL_FALSE ); + mon_scroll(SDL_FALSE); - va_start( ap, fmt ); - if( vsnprintf( vsptmp, VSPTMPSIZE, fmt, ap ) != -1 ) + va_start(ap, fmt); + if(vsnprintf(vsptmp, VSPTMPSIZE, fmt, ap) != -1) { vsptmp[VSPTMPSIZE-1] = 0; i = 0; - while( strlen( &vsptmp[i] ) > 46 ) + while(strlen(&vsptmp[i]) > 46) { - strncpy( stmp, &vsptmp[i], 46 ); + strncpy(stmp, &vsptmp[i], 46); stmp[46] = 0; - tzstrpos( tz[TZ_MONITOR], 1, 19, stmp ); - mon_scroll( SDL_FALSE ); + tzstrpos(tz[TZ_MONITOR], 1, 19, stmp); + mon_scroll(SDL_FALSE); i += 46; } - tzstrpos( tz[TZ_MONITOR], 1, 19, &vsptmp[i] ); + tzstrpos(tz[TZ_MONITOR], 1, 19, &vsptmp[i]); } - va_end( ap ); + va_end(ap); } -void mon_printf_above( char *fmt, ... ) +void mon_printf_above(char* fmt, ...) { va_list ap; int i; char stmp[48]; - mon_scroll( SDL_TRUE ); + mon_scroll(SDL_TRUE); - va_start( ap, fmt ); - if( vsnprintf( vsptmp, VSPTMPSIZE, fmt, ap ) != -1 ) + va_start(ap, fmt); + if(vsnprintf(vsptmp, VSPTMPSIZE, fmt, ap) != -1) { vsptmp[VSPTMPSIZE-1] = 0; i = 0; - while( strlen( &vsptmp[i] ) > 46 ) + while(strlen(&vsptmp[i]) > 46) { - strncpy( stmp, &vsptmp[i], 46 ); + strncpy(stmp, &vsptmp[i], 46); stmp[46] = 0; - tzstrpos( tz[TZ_MONITOR], 1, 18, stmp ); - mon_scroll( SDL_TRUE ); + tzstrpos(tz[TZ_MONITOR], 1, 18, stmp); + mon_scroll(SDL_TRUE); i += 46; } - tzstrpos( tz[TZ_MONITOR], 1, 18, &vsptmp[i] ); + tzstrpos(tz[TZ_MONITOR], 1, 18, &vsptmp[i]); } - va_end( ap ); + va_end(ap); } -void mon_str( char *str ) +void mon_str(char* str) { - mon_scroll( SDL_FALSE ); - tzstrpos( tz[TZ_MONITOR], 1, 19, str ); + mon_scroll(SDL_FALSE); + tzstrpos(tz[TZ_MONITOR], 1, 19, str); } -void mon_str_above( char *str ) +void mon_str_above(char* str) { - mon_scroll( SDL_TRUE ); - tzstrpos( tz[TZ_MONITOR], 1, 18, str ); + mon_scroll(SDL_TRUE); + tzstrpos(tz[TZ_MONITOR], 1, 18, str); } -void mon_start_input( void ) +void mon_start_input(void) { - mon_scroll( SDL_FALSE ); + mon_scroll(SDL_FALSE); ibuf[0] = 0; ilen = 0; iloff = 0; cursx = 0; - if( mon_asmmode ) + if(mon_asmmode) { - tzsetcol( tz[TZ_MONITOR], 1, 3 ); - tzprintfpos( tz[TZ_MONITOR], 1, 19, " %04X:", mon_addr ); + tzsetcol(tz[TZ_MONITOR], 1, 3); + tzprintfpos(tz[TZ_MONITOR], 1, 19, " %04X:", mon_addr); return; } - tzsetcol( tz[TZ_MONITOR], 1, 3 ); - tzstrpos( tz[TZ_MONITOR], 1, 19, "]" ); + tzsetcol(tz[TZ_MONITOR], 1, 3); + tzstrpos(tz[TZ_MONITOR], 1, 19, "]"); } -void mon_enter( struct machine *oric ) +void mon_enter(struct machine *oric) { defaultsyms.syms = NULL; defaultsyms.numsyms = 0; defaultsyms.symspace = -1; // Not a dynamic symbol table - switch( oric->type ) + switch(oric->type) { case MACH_ORIC1: case MACH_ORIC1_16K: case MACH_ATMOS: case MACH_PRAVETZ: defaultsyms.syms = defsym_atmos; - defaultsyms.numsyms = sizeof( defsym_atmos ) / sizeof( struct msym ); + defaultsyms.numsyms = sizeof(defsym_atmos) / sizeof(struct msym); break; case MACH_TELESTRAT: defaultsyms.syms = defsym_tele; - defaultsyms.numsyms = sizeof( defsym_tele ) / sizeof( struct msym ); + defaultsyms.numsyms = sizeof(defsym_tele) / sizeof(struct msym); break; } - if( mon_bpmsg[0] ) + if(mon_bpmsg[0]) { - mon_printf_above( mon_bpmsg ); + mon_printf_above(mon_bpmsg); mon_bpmsg[0] = 0; } @@ -2063,13 +2168,13 @@ void mon_enter( struct machine *oric ) updatepreview = SDL_TRUE; } -void mon_warminit( struct machine *oric ) +void mon_warminit(struct machine *oric) { mon_start_input(); mon_show_curs(); } -void mon_init( struct machine *oric ) +void mon_init(struct machine *oric) { defaultsyms.numsyms = 0; defaultsyms.symspace = 0; @@ -2093,156 +2198,156 @@ void mon_init( struct machine *oric ) ay_oldvalid = SDL_FALSE; via_oldvalid = SDL_FALSE; #if LOG_DEBUG - debug_logfile = fopen( debug_logname, "w" ); + debug_logfile = fopen(debug_logname, "w"); #endif } -void mon_shut( struct machine *oric ) +void mon_shut(struct machine *oric) { - mon_freesyms( &oric->usersyms ); + mon_freesyms(&oric->usersyms); #if LOG_DEBUG - if( debug_logfile ) fclose( debug_logfile ); + if(debug_logfile) fclose(debug_logfile); debug_logfile = NULL; #endif } -int mon_getreg( char *buf, int *off, SDL_bool addrregs, SDL_bool nregs, SDL_bool viaregs ) +int mon_getreg(char* buf, int* off, SDL_bool addrregs, SDL_bool nregs, SDL_bool viaregs) { int i; i = *off; - while( isws( buf[i] ) ) i++; + while(isws(buf[i])) i++; - if( viaregs ) + if(viaregs) { - if( strncasecmp( &buf[i], "vpcr", 4 ) == 0 ) + if(strncasecmp(&buf[i], "vpcr", 4) == 0) { i+=4; *off = i; return REG_VIA_PCR; } - if( strncasecmp( &buf[i], "vacr", 4 ) == 0 ) + if(strncasecmp(&buf[i], "vacr", 4) == 0) { i+=4; *off = i; return REG_VIA_ACR; } - if( strncasecmp( &buf[i], "vsr", 3 ) == 0 ) + if(strncasecmp(&buf[i], "vsr", 3) == 0) { i+=3; *off = i; return REG_VIA_SR; } - if( strncasecmp( &buf[i], "vifr", 4 ) == 0 ) + if(strncasecmp(&buf[i], "vifr", 4) == 0) { i+=4; *off = i; return REG_VIA_IFR; } - if( strncasecmp( &buf[i], "vier", 4 ) == 0 ) + if(strncasecmp(&buf[i], "vier", 4) == 0) { i+=4; *off = i; return REG_VIA_IER; } - if( strncasecmp( &buf[i], "vira", 4 ) == 0 ) + if(strncasecmp(&buf[i], "vira", 4) == 0) { i+=4; *off = i; return REG_VIA_IRA; } - if( strncasecmp( &buf[i], "vora", 4 ) == 0 ) + if(strncasecmp(&buf[i], "vora", 4) == 0) { i+=4; *off = i; return REG_VIA_ORA; } - if( strncasecmp( &buf[i], "vddra", 5 ) == 0 ) + if(strncasecmp(&buf[i], "vddra", 5) == 0) { i+=5; *off = i; return REG_VIA_DDRA; } - if( strncasecmp( &buf[i], "virb", 4 ) == 0 ) + if(strncasecmp(&buf[i], "virb", 4) == 0) { i+=4; *off = i; return REG_VIA_IRB; } - if( strncasecmp( &buf[i], "vorb", 4 ) == 0 ) + if(strncasecmp(&buf[i], "vorb", 4) == 0) { i+=4; *off = i; return REG_VIA_ORB; } - if( strncasecmp( &buf[i], "vddrb", 5 ) == 0 ) + if(strncasecmp(&buf[i], "vddrb", 5) == 0) { i+=5; *off = i; return REG_VIA_DDRB; } - if( strncasecmp( &buf[i], "vt1l", 4 ) == 0 ) + if(strncasecmp(&buf[i], "vt1l", 4) == 0) { i+=4; *off = i; return REG_VIA_T1L; } - if( strncasecmp( &buf[i], "vt1c", 4 ) == 0 ) + if(strncasecmp(&buf[i], "vt1c", 4) == 0) { i+=4; *off = i; return REG_VIA_T1C; } - if( strncasecmp( &buf[i], "vt2l", 4 ) == 0 ) + if(strncasecmp(&buf[i], "vt2l", 4) == 0) { i+=4; *off = i; return REG_VIA_T2L; } - if( strncasecmp( &buf[i], "vt2c", 4 ) == 0 ) + if(strncasecmp(&buf[i], "vt2c", 4) == 0) { i+=4; *off = i; return REG_VIA_T2C; } - if( strncasecmp( &buf[i], "vca1", 4 ) == 0 ) + if(strncasecmp(&buf[i], "vca1", 4) == 0) { i+=4; *off = i; return REG_VIA_CA1; } - if( strncasecmp( &buf[i], "vca2", 4 ) == 0 ) + if(strncasecmp(&buf[i], "vca2", 4) == 0) { i+=4; *off = i; return REG_VIA_CA2; } - if( strncasecmp( &buf[i], "vcb1", 4 ) == 0 ) + if(strncasecmp(&buf[i], "vcb1", 4) == 0) { i+=4; *off = i; return REG_VIA_CB1; } - if( strncasecmp( &buf[i], "vcb2", 4 ) == 0 ) + if(strncasecmp(&buf[i], "vcb2", 4) == 0) { i+=4; *off = i; @@ -2250,16 +2355,16 @@ int mon_getreg( char *buf, int *off, SDL_bool addrregs, SDL_bool nregs, SDL_bool } } - if( addrregs ) + if(addrregs) { - if( strncasecmp( &buf[i], "pc", 2 ) == 0 ) + if(strncasecmp(&buf[i], "pc", 2) == 0) { i+=2; *off = i; return REG_PC; } - if( strncasecmp( &buf[i], "sp", 2 ) == 0 ) + if(strncasecmp(&buf[i], "sp", 2) == 0) { i+=2; *off = i; @@ -2267,9 +2372,9 @@ int mon_getreg( char *buf, int *off, SDL_bool addrregs, SDL_bool nregs, SDL_bool } } - if( nregs ) + if(nregs) { - switch( buf[i] ) + switch(buf[i]) { case 'a': case 'A': @@ -2294,27 +2399,27 @@ int mon_getreg( char *buf, int *off, SDL_bool addrregs, SDL_bool nregs, SDL_bool return -1; } -SDL_bool mon_getnum( struct machine *oric, unsigned int *num, char *buf, int *off, SDL_bool addrregs, SDL_bool nregs, SDL_bool viaregs, SDL_bool symbols ) +SDL_bool mon_getnum(struct machine *oric, unsigned int* num, char* buf, int* off, SDL_bool addrregs, SDL_bool nregs, SDL_bool viaregs, SDL_bool symbols) { int i, j; char c; unsigned int v; i = *off; - while( isws( buf[i] ) ) i++; + while(isws(buf[i])) i++; - if( ( symbols ) && ( issymstart( buf[i] ) ) ) + if((symbols) && (issymstart(buf[i]))) { struct msym *fsym; - for( j=0; issymchar( buf[i+j] ); j++ ) ; + for(j=0; issymchar(buf[i+j]); j++) ; c = buf[i+j]; - if( isws( c ) || ( c == 13 ) || ( c == 10 ) || ( c == 0 ) || ( c == ',' ) || ( c == ')' ) ) + if(isws(c) || (c == 13) || (c == 10) || (c == 0) || (c == ',') || (c == ')')) { buf[i+j] = 0; - fsym = mon_find_sym_by_name( oric, &buf[i] ); + fsym = mon_find_sym_by_name(oric, &buf[i]); buf[i+j] = c; - if( fsym ) + if(fsym) { (*num) = fsym->addr; (*off) = i+j; @@ -2323,10 +2428,10 @@ SDL_bool mon_getnum( struct machine *oric, unsigned int *num, char *buf, int *of } } - j = mon_getreg( buf, off, addrregs, nregs, viaregs ); - if( j != -1 ) + j = mon_getreg(buf, off, addrregs, nregs, viaregs); + if(j != -1) { - switch( j ) + switch(j) { case REG_A: *num = oric->cpu.a; @@ -2403,14 +2508,14 @@ SDL_bool mon_getnum( struct machine *oric, unsigned int *num, char *buf, int *of } } - if( buf[i] == '%' ) + if(buf[i] == '%') { // Binary i++; - if( !isbin( buf[i] ) ) return SDL_FALSE; + if(!isbin(buf[i])) return SDL_FALSE; v = 0; - while( isbin( buf[i] ) ) + while(isbin(buf[i])) { v = (v<<1) | (buf[i]-'0'); i++; @@ -2421,17 +2526,17 @@ SDL_bool mon_getnum( struct machine *oric, unsigned int *num, char *buf, int *of return SDL_TRUE; } - if( buf[i] == '$' || buf[i] == '#' ) + if(buf[i] == '$' || buf[i] == '#') { // Hex i++; - if( !ishex( buf[i] ) ) return SDL_FALSE; + if(!ishex(buf[i])) return SDL_FALSE; v = 0; - for( ;; ) + for(;;) { - j = hexit( buf[i] ); - if( j == -1 ) break; + j = hexit(buf[i]); + if(j == -1) break; v = (v<<4) | j; i++; } @@ -2441,10 +2546,10 @@ SDL_bool mon_getnum( struct machine *oric, unsigned int *num, char *buf, int *of return SDL_TRUE; } - if( !isnum( buf[i] ) ) return SDL_FALSE; + if(!isnum(buf[i])) return SDL_FALSE; v = 0; - while( isnum( buf[i] ) ) + while(isnum(buf[i])) { v = (v*10) + (buf[i]-'0'); i++; @@ -2455,22 +2560,22 @@ SDL_bool mon_getnum( struct machine *oric, unsigned int *num, char *buf, int *of return SDL_TRUE; } -Uint16 mon_sym_best_guess( struct machine *oric, Uint16 addr, char *symname, SDL_bool use_emu_state ) +Uint16 mon_sym_best_guess(struct machine *oric, Uint16 addr, char* symname, SDL_bool use_emu_state) { // In the ROM area? - if( addr >= 0xc000 ) + if(addr >= 0xc000) { // In a telestrat bank? - if( oric->type == MACH_TELESTRAT ) + if(oric->type == MACH_TELESTRAT) { // Labels starting t0_ are assumed to be telestrat bank 0 (etc.) - if( ( symname[0] == 't' ) && - ( ( symname[1] >= '0' ) && ( symname[1] <= '7' ) ) && - ( symname[2] == '_' ) ) + if((symname[0] == 't') && + ((symname[1] >= '0') && (symname[1] <= '7')) && + (symname[2] == '_')) return SYMF_TELEBANK0 << (symname[1]-'0'); // No hint from the label name. Can we attempt to use the current telestrat bank? - if( use_emu_state ) + if(use_emu_state) return SYMF_TELEBANK0 << oric->tele_currbank; // Just make it valid in any telestrat bank @@ -2478,10 +2583,10 @@ Uint16 mon_sym_best_guess( struct machine *oric, Uint16 addr, char *symname, SDL } // Its not a telestrat, so its ROM or overlay - if( use_emu_state ) + if(use_emu_state) { int romdis = oric->romdis; - if( ( oric->drivetype == DRV_JASMIN ) && ( oric->jasmin.olay ) ) + if((oric->drivetype == DRV_JASMIN) && (oric->jasmin.olay)) romdis = 1; return romdis ? SYMF_ROMDIS1 : SYMF_ROMDIS0; @@ -2494,61 +2599,63 @@ Uint16 mon_sym_best_guess( struct machine *oric, Uint16 addr, char *symname, SDL return 0; } -struct msym *mon_replace_or_add_symbol( struct symboltable *stab, struct machine *oric, char *symname, unsigned short flags, Uint16 addr ) +struct msym *mon_replace_or_add_symbol(struct symboltable *stab, struct machine *oric, char* symname, unsigned short flags, Uint16 addr) { int i; char symtmp[160]; struct msym *retval = NULL; - for( i=0; issymchar(symname[i]); i++ ) + for(i=0; issymchar(symname[i]); i++) symtmp[i] = symname[i]; symtmp[i] = 0; // Is it a dynamic symbol table? - if( stab->symspace == -1 ) return retval; + if(stab->symspace == -1) return retval; - if( flags == SYM_BESTGUESS ) - flags = mon_sym_best_guess( oric, addr, symtmp, SDL_TRUE ); + if(flags == SYM_BESTGUESS) + flags = mon_sym_best_guess(oric, addr, symtmp, SDL_TRUE); - for( i=0; inumsyms; i++ ) + for(i=0; inumsyms; i++) { - if( !oric->symbolscase ) + if(!oric->symbolscase) { - if( strcasecmp( symtmp, stab->syms[i].name ) == 0 ) + if(strcasecmp(symtmp, stab->syms[i].name) == 0) break; - } else { - if( strcmp( symtmp, stab->syms[i].name ) == 0 ) + } + else + { + if(strcmp(symtmp, stab->syms[i].name) == 0) break; } } // Replace existing symbol? - if( i < stab->numsyms ) + if(i < stab->numsyms) { stab->syms[i].addr = addr; stab->syms[i].flags = flags; return &stab->syms[i]; } - mon_addsym( stab, addr, flags, symtmp, &retval ); + mon_addsym(stab, addr, flags, symtmp, &retval); return retval; } -SDL_bool mon_symsfromsnapshot( struct symboltable *stab, unsigned char *buffer, unsigned int len) +SDL_bool mon_symsfromsnapshot(struct symboltable *stab, unsigned char* buffer, unsigned int len) { int offs, symlen, addr, flags; - char *symname; + char* symname; stab->numsyms = 0; offs = 0; - while (offs < len) + while(offs < len) { symlen = (buffer[offs]<<24)|(buffer[offs+1]<<16)|(buffer[offs+2]<<8)|buffer[offs+3]; offs+=4; - if (symlen+offs >= len) return SDL_FALSE; + if(symlen+offs >= len) return SDL_FALSE; - symname = (char *)(&buffer[offs]); + symname = (char*)(&buffer[offs]); offs += symlen; addr = (buffer[offs]<<8)|buffer[offs+1]; @@ -2557,7 +2664,7 @@ SDL_bool mon_symsfromsnapshot( struct symboltable *stab, unsigned char *buffer, flags = (buffer[offs]<<8)|buffer[offs+1]; offs += 2; - mon_addsym( stab, addr, flags, symname, NULL ); + mon_addsym(stab, addr, flags, symname, NULL); } return SDL_TRUE; @@ -2565,95 +2672,97 @@ SDL_bool mon_symsfromsnapshot( struct symboltable *stab, unsigned char *buffer, -SDL_bool mon_new_symbols( struct symboltable *stab, struct machine *oric, char *fname, unsigned short flags, SDL_bool above, SDL_bool verbose ) +SDL_bool mon_new_symbols(struct symboltable *stab, struct machine *oric, char* fname, unsigned short flags, SDL_bool above, SDL_bool verbose) { FILE *f; int i, j; unsigned int v; - f = fopen( fname, "r" ); - if( !f ) + f = fopen(fname, "r"); + if(!f) { - if( verbose ) + if(verbose) { - if( above ) - mon_printf_above( "Unable to open '%s'", fname ); + if(above) + mon_printf_above("Unable to open '%s'", fname); else - mon_printf( "Unable to open '%s'", fname ); + mon_printf("Unable to open '%s'", fname); } return SDL_FALSE; } stab->numsyms = 0; - while( !feof( f ) ) + while(!feof(f)) { char linetmp[256]; - if( !fgets( linetmp, 256, f ) ) break; + if(!fgets(linetmp, 256, f)) break; - if( sscanf( linetmp, "al %06X .%s", &v, linetmp ) != 2 ) + if(sscanf(linetmp, "al %06X .%s", &v, linetmp) != 2) { - for( i=0, v=0; i<4; i++ ) - { - j = hexit( linetmp[i] ); - if( j == -1 ) break; - v = (v<<4)|j; - } - if( i < 4 ) continue; - if( linetmp[4] != 32 ) continue; - if( !issymstart( linetmp[5] ) ) continue; + for(i=0, v=0; i<4; i++) + { + j = hexit(linetmp[i]); + if(j == -1) break; + v = (v<<4)|j; + } + if(i < 4) continue; + if(linetmp[4] != 32) continue; + if(!issymstart(linetmp[5])) continue; - for( i=5,j=0; issymchar(linetmp[i]); i++,j++ ) - linetmp[j] = linetmp[i]; - linetmp[j] = 0; + for(i=5,j=0; issymchar(linetmp[i]); i++,j++) + linetmp[j] = linetmp[i]; + linetmp[j] = 0; } -// printf( "'%s' = %04X\n", linetmp, v ); - fflush( stdout ); + // printf( "'%s' = %04X\n", linetmp, v ); + fflush(stdout); // Guess the flags! - if( flags == SYM_BESTGUESS ) + if(flags == SYM_BESTGUESS) { - mon_addsym( stab, v, mon_sym_best_guess( oric, v, linetmp, SDL_FALSE ), linetmp, NULL ); - } else { - mon_addsym( stab, v, flags, linetmp, NULL ); + mon_addsym(stab, v, mon_sym_best_guess(oric, v, linetmp, SDL_FALSE), linetmp, NULL); + } + else + { + mon_addsym(stab, v, flags, linetmp, NULL); } } - fclose( f ); + fclose(f); - if( verbose ) + if(verbose) { - if( above ) - mon_printf_above( "Symbols loaded from '%s'", fname ); + if(above) + mon_printf_above("Symbols loaded from '%s'", fname); else - mon_printf( "Symbols loaded from '%s'", fname ); + mon_printf("Symbols loaded from '%s'", fname); } return SDL_TRUE; } -SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) +SDL_bool mon_cmd(char* cmd, struct machine *oric, SDL_bool *needrender) { int i, j, k, l; unsigned int v, w; SDL_bool done = SDL_FALSE; - unsigned char *tmem; + unsigned char* tmem; struct msym *tmpsym; FILE *f; i=0; - while( isws( cmd[i] ) ) i++; + while(isws(cmd[i])) i++; - if( cmd[i] != '?' ) + if(cmd[i] != '?') helpcount = 0; - switch( cmd[i] ) + switch(cmd[i]) { case 'a': lastcmd = ARPT_ASSEM; i++; - if( mon_getnum( oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) + if(mon_getnum(oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE)) mon_addr = v; mon_asmmode = SDL_TRUE; @@ -2662,138 +2771,138 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) case 's': // Symbols lastcmd = 0; i++; - switch( cmd[i] ) + switch(cmd[i]) { case 'c': // Case insensitive oric->symbolscase = SDL_FALSE; - mon_str( "Symbols are not case-sensitive" ); + mon_str("Symbols are not case-sensitive"); break; case 'C': // Case sensitive oric->symbolscase = SDL_TRUE; - mon_str( "Symbols are case-sensitive" ); + mon_str("Symbols are case-sensitive"); break; case 'a': // add - if( !isws( cmd[i+1] ) ) + if(!isws(cmd[i+1])) { - mon_str( "???" ); + mon_str("???"); break; } i+=2; - while( isws( cmd[i] ) ) i++; + while(isws(cmd[i])) i++; - if( !issymstart( cmd[i] ) ) + if(!issymstart(cmd[i])) { - mon_str( "Expected symbol name and address" ); + mon_str("Expected symbol name and address"); break; } j = i; - while( issymchar( cmd[i] ) ) i++; + while(issymchar(cmd[i])) i++; - if( !isws( cmd[i] ) ) + if(!isws(cmd[i])) { - mon_str( "Expected symbol name and address" ); + mon_str("Expected symbol name and address"); break; } - if( !mon_getnum( oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) + if(!mon_getnum(oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE)) { - mon_str( "Address expected" ); + mon_str("Address expected"); break; } - tmpsym = mon_replace_or_add_symbol( &oric->usersyms, oric, &cmd[j], SYM_BESTGUESS, v ); - if( !tmpsym ) + tmpsym = mon_replace_or_add_symbol(&oric->usersyms, oric, &cmd[j], SYM_BESTGUESS, v); + if(!tmpsym) { - mon_str( "Failed for some reason" ); + mon_str("Failed for some reason"); break; } - mon_printf( "%s = %04X", tmpsym->name, tmpsym->addr ); + mon_printf("%s = %04X", tmpsym->name, tmpsym->addr); break; case 'k': // kill - if( !isws( cmd[i+1] ) ) + if(!isws(cmd[i+1])) { - mon_str( "???" ); + mon_str("???"); break; } i+=2; - while( isws( cmd[i] ) ) i++; + while(isws(cmd[i])) i++; - if( !issymstart( cmd[i] ) ) + if(!issymstart(cmd[i])) { - mon_str( "Symbol expected" ); + mon_str("Symbol expected"); break; } j = i; - while( issymchar( cmd[i] ) ) i++; + while(issymchar(cmd[i])) i++; - if( cmd[i] != 0 ) + if(cmd[i] != 0) { - mon_printf( "Expected end of line at '%s'", &cmd[i] ); + mon_printf("Expected end of line at '%s'", &cmd[i]); break; } - if( !mon_tab_find_sym_by_name( &oric->usersyms, oric, &cmd[j], &k ) ) + if(!mon_tab_find_sym_by_name(&oric->usersyms, oric, &cmd[j], &k)) { - mon_printf( "Couldn't find '%s' in the user symbol table", &cmd[j] ); + mon_printf("Couldn't find '%s' in the user symbol table", &cmd[j]); break; } - for( ; k<(oric->usersyms.numsyms-1); k++ ) + for(; k<(oric->usersyms.numsyms-1); k++) oric->usersyms.syms[k] = oric->usersyms.syms[k+1]; oric->usersyms.numsyms--; - mon_printf( "Killed symbol '%s'", &cmd[j] ); + mon_printf("Killed symbol '%s'", &cmd[j]); break; case 'z': // Zap oric->usersyms.numsyms = 0; - mon_str( "Symbols zapped!" ); + mon_str("Symbols zapped!"); break; case 'l': // Load - if( !isws( cmd[i+1] ) ) + if(!isws(cmd[i+1])) { - mon_str( "???" ); + mon_str("???"); break; } i+=2; - mon_new_symbols( &oric->usersyms, oric, &cmd[i], SYM_BESTGUESS, SDL_FALSE, SDL_TRUE ); + mon_new_symbols(&oric->usersyms, oric, &cmd[i], SYM_BESTGUESS, SDL_FALSE, SDL_TRUE); break; case 'x': // Export - if( !isws( cmd[i+1] ) ) + if(!isws(cmd[i+1])) { - mon_str( "???" ); + mon_str("???"); break; } i+=2; - f = fopen( &cmd[i], "w" ); - if( !f ) + f = fopen(&cmd[i], "w"); + if(!f) { - mon_printf( "Unable to open '%s' for writing", &cmd[i] ); + mon_printf("Unable to open '%s' for writing", &cmd[i]); break; } - for( j=0; jusersyms.numsyms; j++ ) - fprintf( f, "%04X %s\n", oric->usersyms.syms[j].addr, oric->usersyms.syms[j].name ); - fclose( f ); + for(j=0; jusersyms.numsyms; j++) + fprintf(f, "%04X %s\n", oric->usersyms.syms[j].addr, oric->usersyms.syms[j].name); + fclose(f); - mon_printf( "User symbols exported to '%s'", &cmd[i] ); + mon_printf("User symbols exported to '%s'", &cmd[i]); break; default: - mon_str( "???" ); + mon_str("???"); break; } break; @@ -2801,22 +2910,22 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) case 'b': lastcmd = 0; i++; - switch( cmd[i] ) + switch(cmd[i]) { case 'l': - if( cmd[i+1] == 'm' ) + if(cmd[i+1] == 'm') { oric->cpu.anymbp = SDL_FALSE; - for( j=0; j<16; j++ ) + for(j=0; j<16; j++) { - if( oric->cpu.membreakpoints[j].flags ) + if(oric->cpu.membreakpoints[j].flags) { - mon_printf( "%02d: $%04X %c%c%c", - j, - oric->cpu.membreakpoints[j].addr, - (oric->cpu.membreakpoints[j].flags&MBPF_READ) ? 'r' : ' ', - (oric->cpu.membreakpoints[j].flags&MBPF_WRITE) ? 'w' : ' ', - (oric->cpu.membreakpoints[j].flags&MBPF_CHANGE) ? 'c' : ' ' ); + mon_printf("%02d: $%04X %c%c%c", + j, + oric->cpu.membreakpoints[j].addr, + (oric->cpu.membreakpoints[j].flags&MBPF_READ) ? 'r' : ' ', + (oric->cpu.membreakpoints[j].flags&MBPF_WRITE) ? 'w' : ' ', + (oric->cpu.membreakpoints[j].flags&MBPF_CHANGE) ? 'c' : ' '); oric->cpu.anymbp = SDL_TRUE; } } @@ -2824,52 +2933,52 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) } oric->cpu.anybp = SDL_FALSE; - for( j=0; j<16; j++ ) + for(j=0; j<16; j++) { - if( oric->cpu.breakpoints[j] != -1 ) + if(oric->cpu.breakpoints[j] != -1) { - mon_printf( "%02d: $%04X %s%s%s", - j, - oric->cpu.breakpoints[j], - (oric->cpu.breakpoint_flags[j]&MBPF_RESETCYCLES) ? "z" : "", - (oric->cpu.breakpoint_flags[j]&MBPF_RESETCYCLESCONTINUE) ? "c" : "", - (oric->cpu.breakpoint_flags[j]&MBPF_RESETCYCLESPRINT) ? "t" : "" ); + mon_printf("%02d: $%04X %s%s%s", + j, + oric->cpu.breakpoints[j], + (oric->cpu.breakpoint_flags[j]&MBPF_RESETCYCLES) ? "z" : "", + (oric->cpu.breakpoint_flags[j]&MBPF_RESETCYCLESCONTINUE) ? "c" : "", + (oric->cpu.breakpoint_flags[j]&MBPF_RESETCYCLESPRINT) ? "t" : ""); oric->cpu.anybp = SDL_TRUE; } } break; case 's': - if( cmd[i+1] == 'm' ) + if(cmd[i+1] == 'm') { - for( j=0; j<16; j++ ) + for(j=0; j<16; j++) { - if( oric->cpu.membreakpoints[j].flags == 0 ) + if(oric->cpu.membreakpoints[j].flags == 0) break; } - if( j == 16 ) + if(j == 16) { - mon_str( "Max 16 breakpoints" ); + mon_str("Max 16 breakpoints"); break; } i += 2; - if( !mon_getnum( oric, &v, cmd, &i, SDL_TRUE, SDL_TRUE, SDL_TRUE, SDL_TRUE ) ) + if(!mon_getnum(oric, &v, cmd, &i, SDL_TRUE, SDL_TRUE, SDL_TRUE, SDL_TRUE)) { - mon_str( "Address expected" ); + mon_str("Address expected"); break; } oric->cpu.membreakpoints[j].addr = v & 0xffff; - oric->cpu.membreakpoints[j].lastval = mon_read( oric, v&0xffff ); + oric->cpu.membreakpoints[j].lastval = mon_read(oric, v&0xffff); oric->cpu.membreakpoints[j].flags = 0; - while( isws( cmd[i] ) ) i++; + while(isws(cmd[i])) i++; - for( ;; ) + for(;;) { - switch( cmd[i] ) + switch(cmd[i]) { case 'r': oric->cpu.membreakpoints[j].flags |= MBPF_READ; @@ -2889,33 +2998,33 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) break; } - if( !oric->cpu.membreakpoints[j].flags ) + if(!oric->cpu.membreakpoints[j].flags) oric->cpu.membreakpoints[j].flags = MBPF_READ|MBPF_WRITE; oric->cpu.anymbp = SDL_TRUE; - mon_printf( "m%02d: $%04X %s%s%s", j, oric->cpu.membreakpoints[j].addr, - (oric->cpu.membreakpoints[j].flags&MBPF_READ) ? "r" : "", - (oric->cpu.membreakpoints[j].flags&MBPF_WRITE) ? "w" : "", - (oric->cpu.membreakpoints[j].flags&MBPF_CHANGE) ? "c" : "" ); + mon_printf("m%02d: $%04X %s%s%s", j, oric->cpu.membreakpoints[j].addr, + (oric->cpu.membreakpoints[j].flags&MBPF_READ) ? "r" : "", + (oric->cpu.membreakpoints[j].flags&MBPF_WRITE) ? "w" : "", + (oric->cpu.membreakpoints[j].flags&MBPF_CHANGE) ? "c" : ""); break; } - for( j=0; j<16; j++ ) + for(j=0; j<16; j++) { - if( oric->cpu.breakpoints[j] == -1 ) + if(oric->cpu.breakpoints[j] == -1) break; } - if( j == 16 ) + if(j == 16) { - mon_str( "Max 16 breakpoints" ); + mon_str("Max 16 breakpoints"); break; } i++; - if( !mon_getnum( oric, &v, cmd, &i, SDL_TRUE, SDL_TRUE, SDL_TRUE, SDL_TRUE ) ) + if(!mon_getnum(oric, &v, cmd, &i, SDL_TRUE, SDL_TRUE, SDL_TRUE, SDL_TRUE)) { - mon_str( "Address expected" ); + mon_str("Address expected"); break; } @@ -2923,11 +3032,11 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) oric->cpu.breakpoint_flags[j] = 0; oric->cpu.anybp = SDL_TRUE; - while( isws( cmd[i] ) ) i++; + while(isws(cmd[i])) i++; - for( ;; ) + for(;;) { - switch( cmd[i] ) + switch(cmd[i]) { case 'z': oric->cpu.breakpoint_flags[j] |= MBPF_RESETCYCLES; @@ -2945,42 +3054,42 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) break; } - mon_printf( "%02d: $%04X %s%s%s", - j, - oric->cpu.breakpoints[j], - (oric->cpu.breakpoint_flags[j]&MBPF_RESETCYCLES) ? "z" : "", - (oric->cpu.breakpoint_flags[j]&MBPF_RESETCYCLESCONTINUE) ? "c" : "", - (oric->cpu.breakpoint_flags[j]&MBPF_RESETCYCLESPRINT) ? "t" : "" ); + mon_printf("%02d: $%04X %s%s%s", + j, + oric->cpu.breakpoints[j], + (oric->cpu.breakpoint_flags[j]&MBPF_RESETCYCLES) ? "z" : "", + (oric->cpu.breakpoint_flags[j]&MBPF_RESETCYCLESCONTINUE) ? "c" : "", + (oric->cpu.breakpoint_flags[j]&MBPF_RESETCYCLESPRINT) ? "t" : ""); break; case 'c': j = 0; - if( cmd[i+1] == 'm' ) + if(cmd[i+1] == 'm') { j = 1; i++; } i++; - if( !mon_getnum( oric, &v, cmd, &i, SDL_FALSE, SDL_FALSE, SDL_FALSE, SDL_FALSE ) ) + if(!mon_getnum(oric, &v, cmd, &i, SDL_FALSE, SDL_FALSE, SDL_FALSE, SDL_FALSE)) { - mon_str( "Breakpoint ID expected" ); + mon_str("Breakpoint ID expected"); break; } - if( v > 15 ) + if(v > 15) { - mon_str( "Invalid breakpoint ID" ); + mon_str("Invalid breakpoint ID"); break; } - if( j ) + if(j) { oric->cpu.membreakpoints[v].flags = 0; oric->cpu.anymbp = SDL_FALSE; - for( j=0; j<16; j++ ) + for(j=0; j<16; j++) { - if( oric->cpu.membreakpoints[j].flags != 0 ) + if(oric->cpu.membreakpoints[j].flags != 0) { oric->cpu.anymbp = SDL_TRUE; break; @@ -2991,9 +3100,9 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) oric->cpu.breakpoints[v] = -1; oric->cpu.anybp = SDL_FALSE; - for( j=0; j<16; j++ ) + for(j=0; j<16; j++) { - if( oric->cpu.breakpoints[j] != -1 ) + if(oric->cpu.breakpoints[j] != -1) { oric->cpu.anybp = SDL_TRUE; break; @@ -3002,21 +3111,21 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) break; case 'z': - if( cmd[i+1] == 'm' ) + if(cmd[i+1] == 'm') { - for( i=0; i<16; i++ ) + for(i=0; i<16; i++) oric->cpu.membreakpoints[i].flags = 0; oric->cpu.anymbp = SDL_FALSE; break; } - for( i=0; i<16; i++ ) + for(i=0; i<16; i++) oric->cpu.breakpoints[i] = -1; oric->cpu.anybp = SDL_FALSE; break; default: - mon_str( "???" ); + mon_str("???"); break; } break; @@ -3025,30 +3134,30 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) lastcmd = ARPT_MEMORY; i++; - switch( cmd[i] ) + switch(cmd[i]) { case 's': - lastcmd = 0; + lastcmd = 0; i++; - if( !mon_getnum( oric, &w, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) + if(!mon_getnum(oric, &w, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE)) { - mon_str( "Value expected" ); + mon_str("Value expected"); } else { Uint16* collection = memory_search; memory_search_pos = 0; memory_hits = 0; - for ( j=0x500; j < 0x9800; j++ ) + for(j=0x500; j < 0x9800; j++) { - if ((unsigned char)w == mon_read( oric, j ) ) + if((unsigned char)w == mon_read(oric, j)) { *collection++ = j; memory_hits++; } } - sprintf( vsptmp, "Found %i match(es)", memory_hits ); + sprintf(vsptmp, "Found %i match(es)", memory_hits); mon_str(vsptmp); } break; @@ -3057,85 +3166,85 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) lastcmd = 0; i++; - if( !mon_getnum( oric, &w, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) + if(!mon_getnum(oric, &w, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE)) { - mon_str( "Value expected" ); + mon_str("Value expected"); } else { int newhits = 0; memory_search_pos = 0; - for ( j = 0; j < memory_hits; j++ ) + for(j = 0; j < memory_hits; j++) { Uint16 curr_mem_addr = memory_search[j]; - if ( (unsigned char)w == mon_read( oric, curr_mem_addr ) ) + if((unsigned char)w == mon_read(oric, curr_mem_addr)) { memory_search[newhits++] = curr_mem_addr; } } memory_hits = newhits; - sprintf( vsptmp, "Refined match(es) : %i", memory_hits ); - mon_str( vsptmp ); + sprintf(vsptmp, "Refined match(es) : %i", memory_hits); + mon_str(vsptmp); } break; case 'p': - { - char tmp[16]; - int lines = 0; - int j, k = 0; + { + char tmp[16]; + int lines = 0; + int j, k = 0; - lastcmd = ARPT_SEARCH; - vsptmp[0] = 0; + lastcmd = ARPT_SEARCH; + vsptmp[0] = 0; - for ( j = memory_search_pos; j < memory_hits; j++, k++ ) - { - sprintf( tmp, "[%04X]:[%02X] ", memory_search[j], mon_read( oric, memory_search[j] ) ); - strcat( vsptmp, tmp ); - if (k == 4) - { - mon_str( vsptmp ); - vsptmp[0] = 0; - lines++; - k = 0; - } - if (lines > 16) + for(j = memory_search_pos; j < memory_hits; j++, k++) { + sprintf(tmp, "[%04X]:[%02X] ", memory_search[j], mon_read(oric, memory_search[j])); + strcat(vsptmp, tmp); + if(k == 4) + { + mon_str(vsptmp); + vsptmp[0] = 0; + lines++; + k = 0; + } + if(lines > 16) + { memory_search_pos = j; break; + } } + if(strlen(vsptmp)) + { + mon_str(vsptmp); + } + if(j >= memory_hits) + { + memory_search_pos = 0; + lastcmd = 0; + } + break; } - if (strlen( vsptmp )) - { - mon_str( vsptmp ); - } - if ( j >= memory_hits ) - { - memory_search_pos = 0; - lastcmd = 0; - } - break; - } case 'm': lastcmd = 0; i++; - if( !mon_getnum( oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) + if(!mon_getnum(oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE)) { - mon_str( "Bad address" ); + mon_str("Bad address"); break; } - if( !mon_getnum( oric, &w, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) + if(!mon_getnum(oric, &w, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE)) { - mon_str( "Value expected" ); + mon_str("Value expected"); break; } - mon_set_modified( oric ); - oric->cpu.write( &oric->cpu, v, w ); + mon_set_modified(oric); + oric->cpu.write(&oric->cpu, v, w); updatepreview = SDL_TRUE; break; @@ -3143,16 +3252,18 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) lastcmd = 0; i++; - if( !mon_getnum( oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) + if(!mon_getnum(oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE)) { - mon_str( "Bad address" ); + mon_str("Bad address"); break; } - if( mw_split ) + if(mw_split) { mw_addr[mw_which] = v; - } else { + } + else + { mw_which = 0; mw_addr[0] = v; } @@ -3160,36 +3271,36 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) break; default: - if( ( cmd[i] != 0 ) && ( !isws( cmd[i] ) ) ) + if((cmd[i] != 0) && (!isws(cmd[i]))) { - mon_str( "???" ); + mon_str("???"); break; } - if( mon_getnum( oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) + if(mon_getnum(oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE)) mon_addr = v; - for( j=0; j<16; j++ ) + for(j=0; j<16; j++) { - sprintf( vsptmp, "%04X ", mon_addr ); - for( k=0; k<8; k++ ) + sprintf(vsptmp, "%04X ", mon_addr); + for(k=0; k<8; k++) { char tmp[8]; - snprintf( tmp, 7, "%02X ", mon_read( oric, mon_addr+k ) ); - strcat( vsptmp, tmp ); + snprintf(tmp, 7, "%02X ", mon_read(oric, mon_addr+k)); + strcat(vsptmp, tmp); } - l = (int)strlen( vsptmp ); + l = (int)strlen(vsptmp); vsptmp[l++] = 32; vsptmp[l++] = '\''; - for( k=0; k<8; k++ ) + for(k=0; k<8; k++) { - v = mon_read( oric, mon_addr++ ); + v = mon_read(oric, mon_addr++); vsptmp[l++] = ((v>31)&&(v<128))?v:'.'; } vsptmp[l++] = '\''; vsptmp[l++] = 0; - mon_str( vsptmp ); + mon_str(vsptmp); } break; } @@ -3198,66 +3309,132 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) case 'd': lastcmd = ARPT_DISASM; i++; - if( mon_getnum( oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) + if(mon_getnum(oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE)) mon_addr = v; - for( j=0; j<16; j++ ) - mon_str( mon_disassemble( oric, &mon_addr, NULL, SDL_FALSE ) ); + for(j=0; j<16; j++) + mon_str(mon_disassemble(oric, &mon_addr, NULL, SDL_FALSE)); break; case 'r': lastcmd = 0; i++; - j = mon_getreg( cmd, &i, SDL_TRUE, SDL_TRUE, SDL_TRUE ); - if( j == -1 ) + j = mon_getreg(cmd, &i, SDL_TRUE, SDL_TRUE, SDL_TRUE); + if(j == -1) { - mon_str( "Register expected" ); + mon_str("Register expected"); break; } - if( !mon_getnum( oric, &v, cmd, &i, SDL_TRUE, SDL_TRUE, SDL_TRUE, SDL_TRUE ) ) + if(!mon_getnum(oric, &v, cmd, &i, SDL_TRUE, SDL_TRUE, SDL_TRUE, SDL_TRUE)) { - mon_str( "Expression expected" ); + mon_str("Expression expected"); break; } - switch( j ) + switch(j) { - case REG_PC: mon_set_modified( oric ); oric->cpu.pc = v; break; - case REG_SP: mon_set_modified( oric ); oric->cpu.sp = v; break; - case REG_A: mon_set_modified( oric ); oric->cpu.a = v; break; - case REG_X: mon_set_modified( oric ); oric->cpu.x = v; break; - case REG_Y: mon_set_modified( oric ); oric->cpu.y = v; break; - - case REG_VIA_PCR: mon_set_modified( oric ); via_write( &oric->via, VIA_PCR, v ); break; - case REG_VIA_ACR: mon_set_modified( oric ); via_write( &oric->via, VIA_ACR, v ); break; - case REG_VIA_SR: mon_set_modified( oric ); via_write( &oric->via, VIA_SR, v ); break; - case REG_VIA_IFR: mon_set_modified( oric ); via_mon_write_ifr( &oric->via, v ); break; - case REG_VIA_IER: mon_set_modified( oric ); oric->via.ier = v&0x7f; break; - case REG_VIA_IRA: mon_set_modified( oric ); oric->via.write_port_a( &oric->via, 0xff, v ); break; - case REG_VIA_ORA: mon_set_modified( oric ); via_write( &oric->via, VIA_IORA, v ); break; - case REG_VIA_DDRA: mon_set_modified( oric ); via_write( &oric->via, VIA_DDRA, v ); break; - case REG_VIA_IRB: mon_set_modified( oric ); oric->via.write_port_b( &oric->via, 0xff, v ); break; - case REG_VIA_ORB: mon_set_modified( oric ); via_write( &oric->via, VIA_IORB, v ); break; - case REG_VIA_DDRB: mon_set_modified( oric ); via_write( &oric->via, VIA_DDRB, v ); break; - case REG_VIA_T1C: mon_set_modified( oric ); oric->via.t1c = v; break; - case REG_VIA_CA1: mon_set_modified( oric ); via_write_CA1( &oric->via, v ); break; - case REG_VIA_CA2: mon_set_modified( oric ); via_write_CA2( &oric->via, v ); break; - case REG_VIA_CB1: mon_set_modified( oric ); via_write_CB1( &oric->via, v ); break; - case REG_VIA_CB2: mon_set_modified( oric ); via_write_CB2( &oric->via, v ); break; - case REG_VIA_T2C: mon_set_modified( oric ); oric->via.t2c = v; break; + case REG_PC: + mon_set_modified(oric); + oric->cpu.pc = v; + break; + case REG_SP: + mon_set_modified(oric); + oric->cpu.sp = v; + break; + case REG_A: + mon_set_modified(oric); + oric->cpu.a = v; + break; + case REG_X: + mon_set_modified(oric); + oric->cpu.x = v; + break; + case REG_Y: + mon_set_modified(oric); + oric->cpu.y = v; + break; + + case REG_VIA_PCR: + mon_set_modified(oric); + via_write(&oric->via, VIA_PCR, v); + break; + case REG_VIA_ACR: + mon_set_modified(oric); + via_write(&oric->via, VIA_ACR, v); + break; + case REG_VIA_SR: + mon_set_modified(oric); + via_write(&oric->via, VIA_SR, v); + break; + case REG_VIA_IFR: + mon_set_modified(oric); + via_mon_write_ifr(&oric->via, v); + break; + case REG_VIA_IER: + mon_set_modified(oric); + oric->via.ier = v&0x7f; + break; + case REG_VIA_IRA: + mon_set_modified(oric); + oric->via.write_port_a(&oric->via, 0xff, v); + break; + case REG_VIA_ORA: + mon_set_modified(oric); + via_write(&oric->via, VIA_IORA, v); + break; + case REG_VIA_DDRA: + mon_set_modified(oric); + via_write(&oric->via, VIA_DDRA, v); + break; + case REG_VIA_IRB: + mon_set_modified(oric); + oric->via.write_port_b(&oric->via, 0xff, v); + break; + case REG_VIA_ORB: + mon_set_modified(oric); + via_write(&oric->via, VIA_IORB, v); + break; + case REG_VIA_DDRB: + mon_set_modified(oric); + via_write(&oric->via, VIA_DDRB, v); + break; + case REG_VIA_T1C: + mon_set_modified(oric); + oric->via.t1c = v; + break; + case REG_VIA_CA1: + mon_set_modified(oric); + via_write_CA1(&oric->via, v); + break; + case REG_VIA_CA2: + mon_set_modified(oric); + via_write_CA2(&oric->via, v); + break; + case REG_VIA_CB1: + mon_set_modified(oric); + via_write_CB1(&oric->via, v); + break; + case REG_VIA_CB2: + mon_set_modified(oric); + via_write_CB2(&oric->via, v); + break; + case REG_VIA_T2C: + mon_set_modified(oric); + oric->via.t2c = v; + break; case REG_VIA_T1L: - mon_set_modified( oric ); - via_write( &oric->via, VIA_T1L_L, v&0xff ); - via_write( &oric->via, VIA_T1L_H, (v>>8)&0xff ); + mon_set_modified(oric); + via_write(&oric->via, VIA_T1L_L, v&0xff); + via_write(&oric->via, VIA_T1L_H, (v>>8)&0xff); break; case REG_VIA_T2L: - mon_set_modified( oric ); - via_write( &oric->via, VIA_T2C_L, v&0xff ); - via_write( &oric->via, VIA_T2C_H, (v>>8)&0xff ); + mon_set_modified(oric); + via_write(&oric->via, VIA_T2C_L, v&0xff); + via_write(&oric->via, VIA_T2C_H, (v>>8)&0xff); break; } @@ -3270,13 +3447,13 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) case 'q': lastcmd = ARPT_QUIT; - switch( cmd[i+1] ) + switch(cmd[i+1]) { case 32: case 0: case 'm': - mon_store_state( oric ); - setemumode( oric, NULL, EM_RUNNING ); + mon_store_state(oric); + setemumode(oric, NULL, EM_RUNNING); break; case 'e': @@ -3284,105 +3461,105 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) break; default: - mon_printf( "???" ); + mon_printf("???"); break; } break; case 'x': - mon_store_state( oric ); - setemumode( oric, NULL, EM_RUNNING ); + mon_store_state(oric); + setemumode(oric, NULL, EM_RUNNING); break; case 'f': lastcmd = 0; i++; - switch( cmd[i] ) + switch(cmd[i]) { // fd - disassemble to file case 'd': i++; - if( !mon_getnum( oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) + if(!mon_getnum(oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE)) { - mon_str( "Start address expected\n" ); + mon_str("Start address expected\n"); break; } mon_addr = v; - if( !mon_getnum( oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) + if(!mon_getnum(oric, &v, cmd, &i, SDL_TRUE, SDL_FALSE, SDL_FALSE, SDL_TRUE)) { - mon_str( "End address expected\n" ); + mon_str("End address expected\n"); break; } - while( isws( cmd[i] ) ) i++; - if( !cmd[i] ) + while(isws(cmd[i])) i++; + if(!cmd[i]) { - mon_str( "Filename expected" ); + mon_str("Filename expected"); break; } - f = fopen( &cmd[i], "w" ); - if( !f ) + f = fopen(&cmd[i], "w"); + if(!f) { - mon_printf( "Unable to open '%s'", &cmd[i] ); + mon_printf("Unable to open '%s'", &cmd[i]); break; } - while( mon_addr <= v ) + while(mon_addr <= v) { SDL_bool looped; - fprintf( f, "%s\n", mon_disassemble( oric, &mon_addr, &looped, SDL_TRUE ) ); - if( looped ) break; + fprintf(f, "%s\n", mon_disassemble(oric, &mon_addr, &looped, SDL_TRUE)); + if(looped) break; } - fclose( f ); + fclose(f); break; // fw - write mem to bin file case 'w': i++; - if( !mon_getnum( oric, &v, cmd, &i, SDL_TRUE, SDL_TRUE, SDL_TRUE, SDL_TRUE ) ) + if(!mon_getnum(oric, &v, cmd, &i, SDL_TRUE, SDL_TRUE, SDL_TRUE, SDL_TRUE)) { - mon_str( "Address expected" ); + mon_str("Address expected"); break; } - if( !mon_getnum( oric, &w, cmd, &i, SDL_TRUE, SDL_TRUE, SDL_TRUE, SDL_TRUE ) ) + if(!mon_getnum(oric, &w, cmd, &i, SDL_TRUE, SDL_TRUE, SDL_TRUE, SDL_TRUE)) { - mon_str( "Size expected" ); + mon_str("Size expected"); break; } - while( isws( cmd[i] ) ) i++; - if( !cmd[i] ) + while(isws(cmd[i])) i++; + if(!cmd[i]) { - mon_str( "Filename expected" ); + mon_str("Filename expected"); break; } - tmem = malloc( w ); - if( !tmem ) + tmem = malloc(w); + if(!tmem) { - mon_str( "Amnesia!" ); + mon_str("Amnesia!"); break; } - for( j=0; jcpu.write( &oric->cpu, v & 0xffff, w & 0xff ); + oric->cpu.write(&oric->cpu, v & 0xffff, w & 0xff); v++; j++; } } - fclose( f ); - mon_printf( "%d bytes read from '%s'", j, &cmd[i] ); + fclose(f); + mon_printf("%d bytes read from '%s'", j, &cmd[i]); updatepreview = SDL_TRUE; break; } @@ -3434,29 +3611,29 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) lastcmd = 0; i++; j = cmd[i]; - switch( j ) + switch(j) { case 'l': case 's': i++; - while( isws( cmd[i] ) ) i++; - if( !cmd[i] ) + while(isws(cmd[i])) i++; + if(!cmd[i]) { - mon_str( "Filename expected" ); + mon_str("Filename expected"); break; } joinpath(snappath, &cmd[i]); - if (j == 'l') + if(j == 'l') { - if (!load_snapshot(oric, filetmp)) + if(!load_snapshot(oric, filetmp)) mon_printf("Snapshot load failed"); else mon_printf("Snapshot loaded"); } else { - if (!save_snapshot(oric, filetmp)) + if(!save_snapshot(oric, filetmp)) mon_printf("Snapshot save failed"); else mon_printf("Snapshot saved"); @@ -3464,82 +3641,82 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) break; default: - mon_printf( "???" ); + mon_printf("???"); break; } break; case '?': lastcmd = ARPT_HELP; - switch( helpcount ) + switch(helpcount) { case 0: - mon_str( "KEYS:" ); + mon_str("KEYS:"); // | - | - | - mon_str( " F2 : Quit Monitor F3 : Toggle Console" ); - mon_str( " F4 : Toggle info F9 : Reset cycles" ); - mon_str( " F10: Step into F11: Step over" ); - mon_str( " F12: Skip inst." ); - mon_str( " " ); - mon_str( "COMMANDS:" ); - mon_str( " a - Assemble" ); - mon_str( " bc - Clear breakpoint" ); - mon_str( " bcm - Clear mem breakpoint" ); - mon_str( " bl - List breakpoints" ); - mon_str( " blm - List mem breakpoints" ); - mon_str( " bs [zct] - Set breakpoint/cycles" ); - mon_str( " bsm [rwc] - Set mem breakpoint" ); - mon_str( " bz - Zap breakpoints" ); - mon_str( " bzm - Zap mem breakpoints" ); - mon_str( " d - Disassemble" ); - mon_str( "---- MORE" ); + mon_str(" F2 : Quit Monitor F3 : Toggle Console"); + mon_str(" F4 : Toggle info F9 : Reset cycles"); + mon_str(" F10: Step into F11: Step over"); + mon_str(" F12: Skip inst."); + mon_str(" "); + mon_str("COMMANDS:"); + mon_str(" a - Assemble"); + mon_str(" bc - Clear breakpoint"); + mon_str(" bcm - Clear mem breakpoint"); + mon_str(" bl - List breakpoints"); + mon_str(" blm - List mem breakpoints"); + mon_str(" bs [zct] - Set breakpoint/cycles"); + mon_str(" bsm [rwc] - Set mem breakpoint"); + mon_str(" bz - Zap breakpoints"); + mon_str(" bzm - Zap mem breakpoints"); + mon_str(" d - Disassemble"); + mon_str("---- MORE"); helpcount++; break; case 1: - mon_str( " m - Dump memory" ); - mon_str( " mm - Modify memory" ); - mon_str( " mw - Memory watch at addr" ); - mon_str( " ms - Memory search" ); - mon_str( " mr - Memory search refine" ); - mon_str( " mp - Memory print search" ); - mon_str( " nl - Load snapshot" ); - mon_str( " ns - Save snapshot" ); - mon_str( " r - Set to " ); - mon_str( " q, x or qm - Quit monitor" ); - mon_str( " qe - Quit emulator" ); - mon_str( " sa - Add or move user sym." ); - mon_str( " sk - Kill user symbol" ); - mon_str( " sc - Symbols not case-sens." ); - mon_str( " sC - Symbols case-sensitive" ); - mon_str( " sl - Load user symbols" ); - mon_str( " sx - Export user symbols" ); - mon_str( " sz - Zap user symbols" ); - mon_str( " " ); - mon_str( "---- MORE" ); + mon_str(" m - Dump memory"); + mon_str(" mm - Modify memory"); + mon_str(" mw - Memory watch at addr"); + mon_str(" ms - Memory search"); + mon_str(" mr - Memory search refine"); + mon_str(" mp - Memory print search"); + mon_str(" nl - Load snapshot"); + mon_str(" ns - Save snapshot"); + mon_str(" r - Set to "); + mon_str(" q, x or qm - Quit monitor"); + mon_str(" qe - Quit emulator"); + mon_str(" sa - Add or move user sym."); + mon_str(" sk - Kill user symbol"); + mon_str(" sc - Symbols not case-sens."); + mon_str(" sC - Symbols case-sensitive"); + mon_str(" sl - Load user symbols"); + mon_str(" sx - Export user symbols"); + mon_str(" sz - Zap user symbols"); + mon_str(" "); + mon_str("---- MORE"); helpcount++; break; case 2: - mon_str( " fd - Disassemble to file" ); - mon_str( " fw - Write mem to bin file" ); -// ToDo: mon_str( " ft - Write mem to tap file" ); - mon_str( " fr - Read bin file to mem" ); - mon_str( " " ); - mon_str( " " ); - mon_str( " " ); - mon_str( " " ); - mon_str( " " ); - mon_str( " " ); - mon_str( " " ); - mon_str( " " ); - mon_str( " " ); - mon_str( " " ); - mon_str( " " ); - mon_str( " " ); - mon_str( " " ); - mon_str( " " ); - mon_str( " " ); + mon_str(" fd - Disassemble to file"); + mon_str(" fw - Write mem to bin file"); + // ToDo: mon_str( " ft - Write mem to tap file" ); + mon_str(" fr - Read bin file to mem"); + mon_str(" "); + mon_str(" "); + mon_str(" "); + mon_str(" "); + mon_str(" "); + mon_str(" "); + mon_str(" "); + mon_str(" "); + mon_str(" "); + mon_str(" "); + mon_str(" "); + mon_str(" "); + mon_str(" "); + mon_str(" "); + mon_str(" "); helpcount = 0; lastcmd = 0; break; @@ -3548,69 +3725,71 @@ SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) default: lastcmd = 0; - mon_printf( "???" ); + mon_printf("???"); break; } return done; } -SDL_bool mon_do_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ) +SDL_bool mon_do_cmd(char* cmd, struct machine *oric, SDL_bool *needrender) { int i; SDL_bool ret; mon_hide_curs(); for(i=2; i<49; i++) tz[TZ_MONITOR]->tx[50*19+i] = 32; - tzstrpos( tz[TZ_MONITOR], 2, 19, cmd ); - tzsetcol( tz[TZ_MONITOR], 2, 3 ); - ret = mon_cmd( cmd, oric, needrender ); + tzstrpos(tz[TZ_MONITOR], 2, 19, cmd); + tzsetcol(tz[TZ_MONITOR], 2, 3); + ret = mon_cmd(cmd, oric, needrender); mon_start_input(); mon_show_curs(); return ret; } -static void mon_write_ibuf( void ) +static void mon_write_ibuf(void) { char ibtmp[CONS_WIDTH+1]; - strncpy( ibtmp, &ibuf[iloff], CONS_WIDTH ); + strncpy(ibtmp, &ibuf[iloff], CONS_WIDTH); ibtmp[CONS_WIDTH] = 0; - tzstrpos( tz[TZ_MONITOR], 1, 19, iloff > 0 ? "\x16" : "]" ); - tzstrpos( tz[TZ_MONITOR], 2, 19, ibtmp ); - if( strlen( &ibuf[iloff] ) > CONS_WIDTH ) + tzstrpos(tz[TZ_MONITOR], 1, 19, iloff > 0 ? "\x16" : "]"); + tzstrpos(tz[TZ_MONITOR], 2, 19, ibtmp); + if(strlen(&ibuf[iloff]) > CONS_WIDTH) + { + tzstrpos(tz[TZ_MONITOR], 2+CONS_WIDTH, 19, "\x16"); + } + else { - tzstrpos( tz[TZ_MONITOR], 2+CONS_WIDTH, 19, "\x16" ); - } else { - tzstr( tz[TZ_MONITOR], " " ); - tzstrpos( tz[TZ_MONITOR], 2+CONS_WIDTH, 19, " " ); + tzstr(tz[TZ_MONITOR], " "); + tzstrpos(tz[TZ_MONITOR], 2+CONS_WIDTH, 19, " "); } } -static void mon_write_ibuf_asm( void ) +static void mon_write_ibuf_asm(void) { char ibtmp[CONS_WIDTH+1]; - strncpy( ibtmp, ibuf, CONS_WIDTH ); + strncpy(ibtmp, ibuf, CONS_WIDTH); ibtmp[CONS_WIDTH] = 0; - tzstrpos( tz[TZ_MONITOR], 8, 19, ibtmp ); - tzstr( tz[TZ_MONITOR], " " ); + tzstrpos(tz[TZ_MONITOR], 8, 19, ibtmp); + tzstr(tz[TZ_MONITOR], " "); } -static void mon_set_curs_to_end( void ) +static void mon_set_curs_to_end(void) { cursx = ilen; iloff = ilen-CONS_WIDTH; - if( iloff < 0 ) iloff = 0; + if(iloff < 0) iloff = 0; } -static void mon_set_iloff( void ) +static void mon_set_iloff(void) { - if( cursx < iloff ) iloff = cursx; - if( cursx >= (iloff+CONS_WIDTH) ) iloff = cursx-CONS_WIDTH; - if( iloff < 0 ) iloff =0; + if(cursx < iloff) iloff = cursx; + if(cursx >= (iloff+CONS_WIDTH)) iloff = cursx-CONS_WIDTH; + if(iloff < 0) iloff =0; } /* @@ -3627,26 +3806,26 @@ static void mon_set_iloff( void ) AM_REL, <-- AM_ABS - AM_IND (nnnn) */ -static SDL_bool mon_decodeoperand( struct machine *oric, char *ptr, int *type, unsigned short *val ) +static SDL_bool mon_decodeoperand(struct machine *oric, char* ptr, int* type, unsigned short* val) { int i; unsigned int v; i=0; - while( isws( ptr[i] ) ) i++; + while(isws(ptr[i])) i++; // Implied - if( ptr[i] == 0 ) + if(ptr[i] == 0) { (*type) = AM_IMP; return SDL_TRUE; } // Immediate - if( ptr[i] == '#' ) + if(ptr[i] == '#') { i++; - if( !mon_getnum( oric, &v, ptr, &i, SDL_FALSE, SDL_FALSE, SDL_FALSE, SDL_TRUE ) ) + if(!mon_getnum(oric, &v, ptr, &i, SDL_FALSE, SDL_FALSE, SDL_FALSE, SDL_TRUE)) return SDL_FALSE; (*type) = AM_IMM; (*val) = v; @@ -3654,27 +3833,27 @@ static SDL_bool mon_decodeoperand( struct machine *oric, char *ptr, int *type, u } // ZIX, ZIY, IND - if( ptr[i] == '(' ) + if(ptr[i] == '(') { i++; - if( !mon_getnum( oric, &v, ptr, &i, SDL_TRUE, SDL_TRUE, SDL_FALSE, SDL_TRUE ) ) + if(!mon_getnum(oric, &v, ptr, &i, SDL_TRUE, SDL_TRUE, SDL_FALSE, SDL_TRUE)) return SDL_FALSE; - if( strncasecmp( &ptr[i], ",X)", 3 ) == 0 ) + if(strncasecmp(&ptr[i], ",X)", 3) == 0) { (*type) = AM_ZIX; (*val) = v&0xff; return SDL_TRUE; } - if( strncasecmp( &ptr[i], "),Y", 3 ) == 0 ) + if(strncasecmp(&ptr[i], "),Y", 3) == 0) { (*type) = AM_ZIY; (*val) = v&0xff; return SDL_TRUE; } - if( ptr[i] == ')' ) + if(ptr[i] == ')') { (*type) = AM_IND; (*val) = v; @@ -3684,17 +3863,17 @@ static SDL_bool mon_decodeoperand( struct machine *oric, char *ptr, int *type, u return SDL_FALSE; } - if( !mon_getnum( oric, &v, ptr, &i, SDL_TRUE, SDL_TRUE, SDL_FALSE, SDL_TRUE ) ) + if(!mon_getnum(oric, &v, ptr, &i, SDL_TRUE, SDL_TRUE, SDL_FALSE, SDL_TRUE)) return SDL_FALSE; - if( strncasecmp( &ptr[i], ",X", 2 ) == 0 ) + if(strncasecmp(&ptr[i], ",X", 2) == 0) { (*type) = AM_ABX; (*val) = v; return SDL_TRUE; } - if( strncasecmp( &ptr[i], ",Y", 2 ) == 0 ) + if(strncasecmp(&ptr[i], ",Y", 2) == 0) { (*type) = AM_ABY; (*val) = v; @@ -3706,183 +3885,223 @@ static SDL_bool mon_decodeoperand( struct machine *oric, char *ptr, int *type, u return SDL_TRUE; } -static SDL_bool mon_assemble_line( struct machine *oric ) +static SDL_bool mon_assemble_line(struct machine *oric) { int i, j, addsym, amode; unsigned short val; i=0; - while( isws( ibuf[i] ) ) i++; + while(isws(ibuf[i])) i++; - if( ibuf[i] == 0 ) return SDL_TRUE; + if(ibuf[i] == 0) return SDL_TRUE; // Starts with a label? j = i; addsym = -1; - if( issymstart( ibuf[j] ) ) + if(issymstart(ibuf[j])) { - while( issymchar( ibuf[j] ) ) j++; - if( ibuf[j] == ':' ) + while(issymchar(ibuf[j])) j++; + if(ibuf[j] == ':') { addsym = i; i = j+1; - while( isws( ibuf[i] ) ) i++; + while(isws(ibuf[i])) i++; } } - for( j=0; asmtab[j].name; j++ ) + for(j=0; asmtab[j].name; j++) { - if( strncasecmp( asmtab[j].name, &ibuf[i], 3 ) == 0 ) + if(strncasecmp(asmtab[j].name, &ibuf[i], 3) == 0) break; } - if( !asmtab[j].name ) + if(!asmtab[j].name) { - mon_oprintf( " %04X %c%c%c ??? ", mon_addr, ibuf[i], ibuf[i+1], ibuf[i+2] ); + mon_oprintf(" %04X %c%c%c ??? ", mon_addr, ibuf[i], ibuf[i+1], ibuf[i+2]); return SDL_FALSE; } i += 3; - if( !mon_decodeoperand( oric, &ibuf[i], &amode, &val ) ) + if(!mon_decodeoperand(oric, &ibuf[i], &amode, &val)) { - mon_str( "Illegal operand" ); + mon_str("Illegal operand"); return SDL_FALSE; } - switch( amode ) + switch(amode) { case AM_IMP: - if( asmtab[j].imp == -1 ) { mon_str( "Operand expected" ); return SDL_FALSE; } - mon_set_modified( oric ); - oric->cpu.write( &oric->cpu, mon_addr, asmtab[j].imp ); + if(asmtab[j].imp == -1) + { + mon_str("Operand expected"); + return SDL_FALSE; + } + mon_set_modified(oric); + oric->cpu.write(&oric->cpu, mon_addr, asmtab[j].imp); break; case AM_IMM: - if( asmtab[j].imm == -1 ) { mon_str( "Illegal operand" ); return SDL_FALSE; } - mon_set_modified( oric ); - oric->cpu.write( &oric->cpu, mon_addr, asmtab[j].imm ); - oric->cpu.write( &oric->cpu, mon_addr+1, val ); + if(asmtab[j].imm == -1) + { + mon_str("Illegal operand"); + return SDL_FALSE; + } + mon_set_modified(oric); + oric->cpu.write(&oric->cpu, mon_addr, asmtab[j].imm); + oric->cpu.write(&oric->cpu, mon_addr+1, val); break; case AM_ABS: - if( asmtab[j].rel != -1 ) + if(asmtab[j].rel != -1) { i = ((int)val)-((int)(mon_addr+2)); - if( ( i < -128 ) || ( i > 127 ) ) + if((i < -128) || (i > 127)) { - mon_str( "Branch out of range" ); + mon_str("Branch out of range"); return SDL_FALSE; } - mon_set_modified( oric ); - oric->cpu.write( &oric->cpu, mon_addr, asmtab[j].rel ); - oric->cpu.write( &oric->cpu, mon_addr+1, i&0xff ); + mon_set_modified(oric); + oric->cpu.write(&oric->cpu, mon_addr, asmtab[j].rel); + oric->cpu.write(&oric->cpu, mon_addr+1, i&0xff); break; } - if( ( asmtab[j].zp != -1 ) && ( (val&0xff00)==0 ) ) + if((asmtab[j].zp != -1) && ((val&0xff00)==0)) { - mon_set_modified( oric ); - oric->cpu.write( &oric->cpu, mon_addr, asmtab[j].zp ); - oric->cpu.write( &oric->cpu, mon_addr+1, val ); + mon_set_modified(oric); + oric->cpu.write(&oric->cpu, mon_addr, asmtab[j].zp); + oric->cpu.write(&oric->cpu, mon_addr+1, val); break; } - if( asmtab[j].abs == -1 ) { mon_str( "Illegal operand" ); return SDL_FALSE; } - mon_set_modified( oric ); - oric->cpu.write( &oric->cpu, mon_addr, asmtab[j].abs ); - oric->cpu.write( &oric->cpu, mon_addr+1, val&0xff ); - oric->cpu.write( &oric->cpu, mon_addr+2, (val>>8)&0xff ); + if(asmtab[j].abs == -1) + { + mon_str("Illegal operand"); + return SDL_FALSE; + } + mon_set_modified(oric); + oric->cpu.write(&oric->cpu, mon_addr, asmtab[j].abs); + oric->cpu.write(&oric->cpu, mon_addr+1, val&0xff); + oric->cpu.write(&oric->cpu, mon_addr+2, (val>>8)&0xff); break; case AM_IND: - if( asmtab[j].ind == -1 ) { mon_str( "Illegal operand" ); return SDL_FALSE; } - mon_set_modified( oric ); - oric->cpu.write( &oric->cpu, mon_addr, asmtab[j].ind ); - oric->cpu.write( &oric->cpu, mon_addr+1, val&0xff ); - oric->cpu.write( &oric->cpu, mon_addr+2, (val>>8)&0xff ); + if(asmtab[j].ind == -1) + { + mon_str("Illegal operand"); + return SDL_FALSE; + } + mon_set_modified(oric); + oric->cpu.write(&oric->cpu, mon_addr, asmtab[j].ind); + oric->cpu.write(&oric->cpu, mon_addr+1, val&0xff); + oric->cpu.write(&oric->cpu, mon_addr+2, (val>>8)&0xff); break; case AM_ZPX: - if( asmtab[j].zpx == -1 ) { mon_str( "Illegal operand" ); return SDL_FALSE; } - mon_set_modified( oric ); - oric->cpu.write( &oric->cpu, mon_addr, asmtab[j].zpx ); - oric->cpu.write( &oric->cpu, mon_addr+1, val ); + if(asmtab[j].zpx == -1) + { + mon_str("Illegal operand"); + return SDL_FALSE; + } + mon_set_modified(oric); + oric->cpu.write(&oric->cpu, mon_addr, asmtab[j].zpx); + oric->cpu.write(&oric->cpu, mon_addr+1, val); break; case AM_ZPY: - if( asmtab[j].zpy == -1 ) { mon_str( "Illegal operand" ); return SDL_FALSE; } - mon_set_modified( oric ); - oric->cpu.write( &oric->cpu, mon_addr, asmtab[j].zpy ); - oric->cpu.write( &oric->cpu, mon_addr+1, val ); + if(asmtab[j].zpy == -1) + { + mon_str("Illegal operand"); + return SDL_FALSE; + } + mon_set_modified(oric); + oric->cpu.write(&oric->cpu, mon_addr, asmtab[j].zpy); + oric->cpu.write(&oric->cpu, mon_addr+1, val); break; case AM_ZIX: - if( asmtab[j].zix == -1 ) { mon_str( "Illegal operand" ); return SDL_FALSE; } - mon_set_modified( oric ); - oric->cpu.write( &oric->cpu, mon_addr, asmtab[j].zix ); - oric->cpu.write( &oric->cpu, mon_addr+1, val ); + if(asmtab[j].zix == -1) + { + mon_str("Illegal operand"); + return SDL_FALSE; + } + mon_set_modified(oric); + oric->cpu.write(&oric->cpu, mon_addr, asmtab[j].zix); + oric->cpu.write(&oric->cpu, mon_addr+1, val); break; case AM_ZIY: - if( asmtab[j].ziy == -1 ) { mon_str( "Illegal operand" ); return SDL_FALSE; } - mon_set_modified( oric ); - oric->cpu.write( &oric->cpu, mon_addr, asmtab[j].ziy ); - oric->cpu.write( &oric->cpu, mon_addr+1, val ); + if(asmtab[j].ziy == -1) + { + mon_str("Illegal operand"); + return SDL_FALSE; + } + mon_set_modified(oric); + oric->cpu.write(&oric->cpu, mon_addr, asmtab[j].ziy); + oric->cpu.write(&oric->cpu, mon_addr+1, val); break; case AM_ABX: - if( ( asmtab[j].zpx != -1 ) && ( (val&0xff00)==0 ) ) + if((asmtab[j].zpx != -1) && ((val&0xff00)==0)) { - mon_set_modified( oric ); - oric->cpu.write( &oric->cpu, mon_addr, asmtab[j].zpx ); - oric->cpu.write( &oric->cpu, mon_addr+1, val ); + mon_set_modified(oric); + oric->cpu.write(&oric->cpu, mon_addr, asmtab[j].zpx); + oric->cpu.write(&oric->cpu, mon_addr+1, val); break; } - if( asmtab[j].abx == -1 ) { mon_str( "Illegal operand" ); return SDL_FALSE; } - mon_set_modified( oric ); - oric->cpu.write( &oric->cpu, mon_addr, asmtab[j].abx ); - oric->cpu.write( &oric->cpu, mon_addr+1, val&0xff ); - oric->cpu.write( &oric->cpu, mon_addr+2, (val>>8)&0xff ); + if(asmtab[j].abx == -1) + { + mon_str("Illegal operand"); + return SDL_FALSE; + } + mon_set_modified(oric); + oric->cpu.write(&oric->cpu, mon_addr, asmtab[j].abx); + oric->cpu.write(&oric->cpu, mon_addr+1, val&0xff); + oric->cpu.write(&oric->cpu, mon_addr+2, (val>>8)&0xff); break; case AM_ABY: - if( ( asmtab[j].zpy != -1 ) && ( (val&0xff00)==0 ) ) + if((asmtab[j].zpy != -1) && ((val&0xff00)==0)) { - mon_set_modified( oric ); - oric->cpu.write( &oric->cpu, mon_addr, asmtab[j].zpy ); - oric->cpu.write( &oric->cpu, mon_addr+1, val ); + mon_set_modified(oric); + oric->cpu.write(&oric->cpu, mon_addr, asmtab[j].zpy); + oric->cpu.write(&oric->cpu, mon_addr+1, val); break; } - if( asmtab[j].aby == -1 ) { mon_str( "Illegal operand" ); return SDL_FALSE; } - mon_set_modified( oric ); - oric->cpu.write( &oric->cpu, mon_addr, asmtab[j].aby ); - oric->cpu.write( &oric->cpu, mon_addr+1, val&0xff ); - oric->cpu.write( &oric->cpu, mon_addr+2, (val>>8)&0xff ); + if(asmtab[j].aby == -1) + { + mon_str("Illegal operand"); + return SDL_FALSE; + } + mon_set_modified(oric); + oric->cpu.write(&oric->cpu, mon_addr, asmtab[j].aby); + oric->cpu.write(&oric->cpu, mon_addr+1, val&0xff); + oric->cpu.write(&oric->cpu, mon_addr+2, (val>>8)&0xff); break; } - if( addsym != -1 ) - mon_replace_or_add_symbol( &oric->usersyms, oric, &ibuf[addsym], SYM_BESTGUESS, mon_addr ); + if(addsym != -1) + mon_replace_or_add_symbol(&oric->usersyms, oric, &ibuf[addsym], SYM_BESTGUESS, mon_addr); - mon_oprintf( mon_disassemble( oric, &mon_addr, NULL, SDL_FALSE ) ); + mon_oprintf(mon_disassemble(oric, &mon_addr, NULL, SDL_FALSE)); return SDL_FALSE; } -static SDL_bool mon_console_keydown( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) +static SDL_bool mon_console_keydown(SDL_Event *ev, struct machine *oric, SDL_bool *needrender) { int i; SDL_bool done; done = SDL_FALSE; - if( mon_asmmode ) + if(mon_asmmode) { - switch( ev->key.keysym.sym ) + switch(ev->key.keysym.sym) { case SDLK_LEFT: - if( cursx > 0 ) + if(cursx > 0) { mon_hide_curs(); cursx--; @@ -3893,7 +4112,7 @@ static SDL_bool mon_console_keydown( SDL_Event *ev, struct machine *oric, SDL_bo break; case SDLK_RIGHT: - if( cursx < ilen ) + if(cursx < ilen) { mon_hide_curs(); cursx++; @@ -3904,13 +4123,13 @@ static SDL_bool mon_console_keydown( SDL_Event *ev, struct machine *oric, SDL_bo break; case SDLK_BACKSPACE: - if( cursx > 0 ) + if(cursx > 0) { mon_hide_curs(); - for( i=cursx-1; ikey.keysym ) ) + switch(SDL_COMPAT_GetKeysymUnicode(ev->key.keysym)) { default: - if( ( SDL_COMPAT_GetKeysymUnicode( ev->key.keysym ) > 31 ) && ( SDL_COMPAT_GetKeysymUnicode( ev->key.keysym ) < 127 ) ) + if((SDL_COMPAT_GetKeysymUnicode(ev->key.keysym) > 31) && (SDL_COMPAT_GetKeysymUnicode(ev->key.keysym) < 127)) { - if( ilen >= MAX_ASM_INPUT ) break; + if(ilen >= MAX_ASM_INPUT) break; mon_hide_curs(); - for( i=ilen+1; i>cursx; i-- ) + for(i=ilen+1; i>cursx; i--) ibuf[i] = ibuf[i-1]; - ibuf[cursx] = SDL_COMPAT_TranslateUnicode( ev->key.keysym ); + ibuf[cursx] = SDL_COMPAT_TranslateUnicode(ev->key.keysym); cursx++; ilen++; mon_write_ibuf_asm(); @@ -3965,16 +4184,16 @@ static SDL_bool mon_console_keydown( SDL_Event *ev, struct machine *oric, SDL_bo return done; } - switch( ev->key.keysym.sym ) + switch(ev->key.keysym.sym) { case SDLK_UP: - if( histp >= (histu-1) ) break; + if(histp >= (histu-1)) break; mon_hide_curs(); - strcpy( ibuf, &history[++histp][0] ); - ilen = (int)strlen( ibuf ); + strcpy(ibuf, &history[++histp][0]); + ilen = (int)strlen(ibuf); mon_set_curs_to_end(); mon_set_iloff(); - tzstrpos( tz[TZ_MONITOR], 2, 19, " " ); + tzstrpos(tz[TZ_MONITOR], 2, 19, " "); mon_write_ibuf(); mon_show_curs(); *needrender = SDL_TRUE; @@ -3982,26 +4201,28 @@ static SDL_bool mon_console_keydown( SDL_Event *ev, struct machine *oric, SDL_bo case SDLK_DOWN: mon_hide_curs(); - if( histp <= 0 ) + if(histp <= 0) { histp = -1; ibuf[0] = 0; ilen = 0; iloff = 0; cursx = 0; - } else { - strcpy( ibuf, &history[--histp][0] ); + } + else + { + strcpy(ibuf, &history[--histp][0]); mon_set_curs_to_end(); mon_set_iloff(); } - tzstrpos( tz[TZ_MONITOR], 2, 19, " " ); + tzstrpos(tz[TZ_MONITOR], 2, 19, " "); mon_write_ibuf(); mon_show_curs(); *needrender = SDL_TRUE; break; case SDLK_LEFT: - if( cursx > 0 ) + if(cursx > 0) { mon_hide_curs(); cursx--; @@ -4013,7 +4234,7 @@ static SDL_bool mon_console_keydown( SDL_Event *ev, struct machine *oric, SDL_bo break; case SDLK_RIGHT: - if( cursx < ilen ) + if(cursx < ilen) { mon_hide_curs(); cursx++; @@ -4028,13 +4249,13 @@ static SDL_bool mon_console_keydown( SDL_Event *ev, struct machine *oric, SDL_bo break; case SDLK_BACKSPACE: - if( cursx > 0 ) + if(cursx > 0) { mon_hide_curs(); - for( i=cursx-1; i 0 ) && ( strcmp( &history[0][0], ibuf ) == 0 ) ) ) + if(!((histu > 0) && (strcmp(&history[0][0], ibuf) == 0))) { - if( histu > 0 ) + if(histu > 0) { - for( i=histu; i>0; i-- ) - strcpy( &history[i][0], &history[i-1][0] ); + for(i=histu; i>0; i--) + strcpy(&history[i][0], &history[i-1][0]); } - strcpy( &history[0][0], ibuf ); - if( histu < 10 ) histu++; + strcpy(&history[0][0], ibuf); + if(histu < 10) histu++; } } histp = -1; - tzsetcol( tz[TZ_MONITOR], 2, 3 ); - done |= mon_cmd( ibuf, oric, needrender ); + tzsetcol(tz[TZ_MONITOR], 2, 3); + done |= mon_cmd(ibuf, oric, needrender); mon_start_input(); mon_show_curs(); *needrender = SDL_TRUE; break; } - switch( SDL_COMPAT_GetKeysymUnicode( ev->key.keysym ) ) + switch(SDL_COMPAT_GetKeysymUnicode(ev->key.keysym)) { default: - if( ( SDL_COMPAT_GetKeysymUnicode( ev->key.keysym ) > 31 ) && ( SDL_COMPAT_GetKeysymUnicode( ev->key.keysym ) < 127 ) ) + if((SDL_COMPAT_GetKeysymUnicode(ev->key.keysym) > 31) && (SDL_COMPAT_GetKeysymUnicode(ev->key.keysym) < 127)) { - if( ilen >= MAX_CONS_INPUT ) break; + if(ilen >= MAX_CONS_INPUT) break; mon_hide_curs(); - for( i=ilen+1; i>cursx; i-- ) + for(i=ilen+1; i>cursx; i--) ibuf[i] = ibuf[i-1]; - ibuf[cursx] = SDL_COMPAT_TranslateUnicode( ev->key.keysym ); + ibuf[cursx] = SDL_COMPAT_TranslateUnicode(ev->key.keysym); cursx++; ilen++; mon_set_iloff(); @@ -4119,7 +4340,7 @@ static SDL_bool mon_console_keydown( SDL_Event *ev, struct machine *oric, SDL_bo return done; } -static SDL_bool mon_mwatch_keydown( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) +static SDL_bool mon_mwatch_keydown(SDL_Event *ev, struct machine *oric, SDL_bool *needrender) { SDL_bool done; unsigned int v; @@ -4128,7 +4349,7 @@ static SDL_bool mon_mwatch_keydown( SDL_Event *ev, struct machine *oric, SDL_boo page = mw_split ? 8*8 : 8*18; done = SDL_FALSE; - switch( ev->key.keysym.sym ) + switch(ev->key.keysym.sym) { case SDLK_UP: mw_addr[mw_which] -= kshifted ? page : 8; @@ -4152,11 +4373,11 @@ static SDL_bool mon_mwatch_keydown( SDL_Event *ev, struct machine *oric, SDL_boo case SDLK_RETURN: case SDLK_KP_ENTER: - if( mw_mode != 1 ) break; + if(mw_mode != 1) break; mw_ibuf[5] = 0; mw_mode = 0; i = 0; - if( mon_getnum( oric, &v, mw_ibuf, &i, SDL_FALSE, SDL_FALSE, SDL_FALSE, SDL_FALSE ) ) + if(mon_getnum(oric, &v, mw_ibuf, &i, SDL_FALSE, SDL_FALSE, SDL_FALSE, SDL_FALSE)) mw_addr[mw_which] = v; *needrender = SDL_TRUE; break; @@ -4167,23 +4388,23 @@ static SDL_bool mon_mwatch_keydown( SDL_Event *ev, struct machine *oric, SDL_boo break; case SDLK_BACKSPACE: - if( mw_mode != 1 ) break; - if( mw_koffs <= 0 ) break; + if(mw_mode != 1) break; + if(mw_koffs <= 0) break; mw_ibuf[mw_koffs--] = 0; *needrender = SDL_TRUE; break; case SDLK_s: - if( mw_mode != 0 ) break; + if(mw_mode != 0) break; mw_split = !mw_split; - if( ( !mw_split ) && ( mw_which != 0 ) ) + if((!mw_split) && (mw_which != 0)) mw_which = 0; *needrender = SDL_TRUE; break; case SDLK_TAB: - if( !mw_split ) break; - if( mw_mode != 0 ) mw_mode = 0; + if(!mw_split) break; + if(mw_mode != 0) mw_mode = 0; mw_which ^= 1; *needrender = SDL_TRUE; break; @@ -4192,9 +4413,9 @@ static SDL_bool mon_mwatch_keydown( SDL_Event *ev, struct machine *oric, SDL_boo break; } - if( ishex( SDL_COMPAT_GetKeysymUnicode( ev->key.keysym ) ) ) + if(ishex(SDL_COMPAT_GetKeysymUnicode(ev->key.keysym))) { - if( mw_mode != 1 ) + if(mw_mode != 1) { mw_mode = 1; mw_ibuf[0] = '$'; @@ -4202,9 +4423,9 @@ static SDL_bool mon_mwatch_keydown( SDL_Event *ev, struct machine *oric, SDL_boo mw_koffs = 0; } - if( mw_koffs < 4 ) + if(mw_koffs < 4) { - mw_ibuf[++mw_koffs] = SDL_COMPAT_TranslateUnicode( ev->key.keysym ); + mw_ibuf[++mw_koffs] = SDL_COMPAT_TranslateUnicode(ev->key.keysym); mw_ibuf[mw_koffs+1] = 0; } @@ -4214,32 +4435,32 @@ static SDL_bool mon_mwatch_keydown( SDL_Event *ev, struct machine *oric, SDL_boo return done; } -static unsigned int steppy_step( struct machine *oric ) +static unsigned int steppy_step(struct machine *oric) { - m6502_set_icycles( &oric->cpu, SDL_FALSE, mon_bpmsg ); - tape_patches( oric ); - via_clock( &oric->via, oric->cpu.icycles ); - ay_ticktock( &oric->ay, oric->cpu.icycles ); - if((oric->drivetype == DRV_MICRODISC) || (oric->drivetype == DRV_JASMIN)) wd17xx_ticktock( &oric->wddisk, oric->cpu.icycles ); - if( oric->type == MACH_TELESTRAT ) + m6502_set_icycles(&oric->cpu, SDL_FALSE, mon_bpmsg); + tape_patches(oric); + via_clock(&oric->via, oric->cpu.icycles); + ay_ticktock(&oric->ay, oric->cpu.icycles); + if((oric->drivetype == DRV_MICRODISC) || (oric->drivetype == DRV_JASMIN)) wd17xx_ticktock(&oric->wddisk, oric->cpu.icycles); + if(oric->type == MACH_TELESTRAT) { - via_clock( &oric->tele_via, oric->cpu.icycles ); + via_clock(&oric->tele_via, oric->cpu.icycles); } - if( oric->aciabackend ) - acia_clock( &oric->tele_acia, oric->cpu.icycles ); + if(oric->aciabackend) + acia_clock(&oric->tele_acia, oric->cpu.icycles); oric->cpu.rastercycles -= oric->cpu.icycles; - m6502_inst( &oric->cpu ); + m6502_inst(&oric->cpu); - if( oric->cpu.rastercycles <= 0 ) + if(oric->cpu.rastercycles <= 0) { - ula_doraster( oric ); + ula_doraster(oric); oric->cpu.rastercycles += oric->cyclesperraster; } - if( mon_bpmsg[0] ) + if(mon_bpmsg[0]) { - mon_printf_above( mon_bpmsg ); + mon_printf_above(mon_bpmsg); mon_bpmsg[0] = 0; } @@ -4247,11 +4468,11 @@ static unsigned int steppy_step( struct machine *oric ) return oric->cpu.icycles; } -static SDL_bool clickzone( struct textzone *tz_, int *tx, int *ty, SDL_bool *dblclk ) +static SDL_bool clickzone(struct textzone *tz_, int* tx, int* ty, SDL_bool *dblclk) { int dx, dy; - if( !in_textzone( tz_, leftclick[0].x, leftclick[0].y ) ) + if(!in_textzone(tz_, leftclick[0].x, leftclick[0].y)) return SDL_FALSE; *tx = (leftclick[0].x - tz_->x) / 8; @@ -4260,31 +4481,34 @@ static SDL_bool clickzone( struct textzone *tz_, int *tx, int *ty, SDL_bool *dbl dx = (leftclick[1].x - tz_->x) / 8; dy = (leftclick[1].y - tz_->y) / 12; - if( ( (*tx) == dx ) && ( (*ty) == dy ) && ( (leftclick[0].time-leftclick[1].time) < 1000 ) ) + if(((*tx) == dx) && ((*ty) == dy) && ((leftclick[0].time-leftclick[1].time) < 1000)) { *dblclk = SDL_TRUE; // Reset double click timing after a successful double click leftclick[0].time = -1; - } else { + } + else + { *dblclk = SDL_FALSE; } return SDL_TRUE; } -SDL_bool mon_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) +SDL_bool mon_event(SDL_Event *ev, struct machine *oric, SDL_bool *needrender) { SDL_bool done; SDL_bool donkey; done = SDL_FALSE; donkey = SDL_FALSE; - switch( ev->type ) + switch(ev->type) { case SDL_COMPAT_ACTIVEEVENT: - if(SDL_COMPAT_IsAppFocused(ev)) { - *needrender = SDL_TRUE; + if(SDL_COMPAT_IsAppFocused(ev)) + { + *needrender = SDL_TRUE; } break; @@ -4298,15 +4522,15 @@ SDL_bool mon_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) leftclick[0].y = ev->button.y; leftclick[0].time = SDL_GetTicks(); - if( clickzone( tz[TZ_REGS], &tx, &ty, &dblclk ) ) + if(clickzone(tz[TZ_REGS], &tx, &ty, &dblclk)) { - mon_click_regs( oric, needrender, tx, ty, dblclk ); + mon_click_regs(oric, needrender, tx, ty, dblclk); } } break; case SDL_KEYUP: - switch( ev->key.keysym.sym ) + switch(ev->key.keysym.sym) { case SDLK_F9: oric->cpu.cycles = 0; @@ -4321,34 +4545,34 @@ SDL_bool mon_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) case SDLK_F1: refreshstatus = SDL_TRUE; *needrender = SDL_TRUE; - mon_store_state( oric ); - ula_set_dirty( oric ); - setemumode( oric, NULL, EM_MENU ); + mon_store_state(oric); + ula_set_dirty(oric); + setemumode(oric, NULL, EM_MENU); break; case SDLK_F2: // In case we're on a breakpoint - m6502_set_icycles( &oric->cpu, SDL_FALSE, mon_bpmsg ); - tape_patches( oric ); - via_clock( &oric->via, oric->cpu.icycles ); - ay_ticktock( &oric->ay, oric->cpu.icycles ); - if((oric->drivetype == DRV_MICRODISC) || (oric->drivetype == DRV_JASMIN)) wd17xx_ticktock( &oric->wddisk, oric->cpu.icycles ); - if( oric->type == MACH_TELESTRAT ) + m6502_set_icycles(&oric->cpu, SDL_FALSE, mon_bpmsg); + tape_patches(oric); + via_clock(&oric->via, oric->cpu.icycles); + ay_ticktock(&oric->ay, oric->cpu.icycles); + if((oric->drivetype == DRV_MICRODISC) || (oric->drivetype == DRV_JASMIN)) wd17xx_ticktock(&oric->wddisk, oric->cpu.icycles); + if(oric->type == MACH_TELESTRAT) { - via_clock( &oric->tele_via, oric->cpu.icycles ); + via_clock(&oric->tele_via, oric->cpu.icycles); } - if( oric->aciabackend ) - acia_clock( &oric->tele_acia, oric->cpu.icycles ); + if(oric->aciabackend) + acia_clock(&oric->tele_acia, oric->cpu.icycles); oric->cpu.rastercycles -= oric->cpu.icycles; - m6502_inst( &oric->cpu ); - if( oric->cpu.rastercycles <= 0 ) + m6502_inst(&oric->cpu); + if(oric->cpu.rastercycles <= 0) { - ula_doraster( oric ); + ula_doraster(oric); oric->cpu.rastercycles += oric->cyclesperraster; } *needrender = SDL_TRUE; - mon_store_state( oric ); - setemumode( oric, NULL, EM_RUNNING ); + mon_store_state(oric); + setemumode(oric, NULL, EM_RUNNING); break; case SDLK_F3: @@ -4358,11 +4582,11 @@ SDL_bool mon_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) case SDLK_F4: mshow = (mshow+1)%MSHOW_LAST; - if( ( mshow == MSHOW_VIA2 ) && ( oric->type != MACH_TELESTRAT ) ) + if((mshow == MSHOW_VIA2) && (oric->type != MACH_TELESTRAT)) mshow = (mshow+1)%MSHOW_LAST; - if( ( oric->drivetype == DRV_NONE ) && ( mshow == MSHOW_DISK ) ) + if((oric->drivetype == DRV_NONE) && (mshow == MSHOW_DISK)) mshow = (mshow+1)%MSHOW_LAST; - if( ( oric->twilighteboard_activated == SDL_FALSE ) && ( mshow == MSHOW_TWIL ) ) + if((oric->twilighteboard_activated == SDL_FALSE) && (mshow == MSHOW_TWIL)) mshow = (mshow+1)%MSHOW_LAST; *needrender = SDL_TRUE; break; @@ -4373,7 +4597,7 @@ SDL_bool mon_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) break; case SDL_KEYDOWN: - switch( ev->key.keysym.sym ) + switch(ev->key.keysym.sym) { case SDLK_LSHIFT: case SDLK_RSHIFT: @@ -4382,41 +4606,41 @@ SDL_bool mon_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) break; case SDLK_F10: - if( !kshifted ) + if(!kshifted) { - mon_store_state( oric ); - steppy_step( oric ); + mon_store_state(oric); + steppy_step(oric); *needrender = SDL_TRUE; donkey = SDL_TRUE; break; } case SDLK_F11: - if( mon_read( oric, oric->cpu.pc ) == 0x20 ) // JSR instruction? + if(mon_read(oric, oric->cpu.pc) == 0x20) // JSR instruction? { Uint16 newpc; unsigned int endticks; newpc = oric->cpu.pc+3; - mon_store_state( oric ); + mon_store_state(oric); endticks = SDL_GetTicks()+5000; // 5 seconds to comply - while( ( oric->cpu.pc != newpc ) && ( SDL_GetTicks() < endticks ) ) - steppy_step( oric ); + while((oric->cpu.pc != newpc) && (SDL_GetTicks() < endticks)) + steppy_step(oric); *needrender = SDL_TRUE; donkey = SDL_TRUE; break; } - mon_store_state( oric ); - steppy_step( oric ); + mon_store_state(oric); + steppy_step(oric); *needrender = SDL_TRUE; donkey = SDL_TRUE; break; case SDLK_F12: - switch( distab[mon_read( oric, oric->cpu.pc )].amode ) + switch(distab[mon_read(oric, oric->cpu.pc)].amode) { case AM_IMM: case AM_ZP: @@ -4448,16 +4672,16 @@ SDL_bool mon_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ) break; } - if( !donkey ) + if(!donkey) { - switch( cshow ) + switch(cshow) { case CSHOW_CONSOLE: - done |= mon_console_keydown( ev, oric, needrender ); + done |= mon_console_keydown(ev, oric, needrender); break; case CSHOW_MWATCH: - done |= mon_mwatch_keydown( ev, oric, needrender ); + done |= mon_mwatch_keydown(ev, oric, needrender); break; } } @@ -4475,12 +4699,12 @@ void mon_traceinst(struct m6502 *cpu) { struct machine *oric = (struct machine *)cpu->userdata; - if (!list_start) + if(!list_start) { int i; list_start = &cputrace[0]; list_end = &cputrace[DEBUG_CPU_TRACE-1]; - for (i=0; inext; @@ -4510,38 +4734,38 @@ void mon_traceinst(struct m6502 *cpu) next->inst[1] = mon_read(oric, cpu->calcpc+1); next->inst[2] = mon_read(oric, cpu->calcpc+2); next->romdis = oric->romdis; - if( ( oric->drivetype == DRV_JASMIN ) && ( oric->jasmin.olay ) ) + if((oric->drivetype == DRV_JASMIN) && (oric->jasmin.olay)) next->romdis = SDL_FALSE; next = next->next; } -char *cputrace_print( struct machine *oric, struct cpu_trace_entry *cte ) +char* cputrace_print(struct machine *oric, struct cpu_trace_entry *cte) { unsigned short iaddr, addr; unsigned char op, a1, a2; int i; - char *tmpsname, *disptr; + char* tmpsname, *disptr; char sname[SNAME_LEN+1]; struct msym *csym; disptr = distmp; tmpsname = ""; - csym = mon_find_sym_by_addr( oric, cte->pc, &cte->romdis ); - if( csym ) + csym = mon_find_sym_by_addr(oric, cte->pc, &cte->romdis); + if(csym) { tmpsname = csym->name; - if( strlen( tmpsname ) > SNAME_LEN ) + if(strlen(tmpsname) > SNAME_LEN) { - sprintf( distmp, "%s\n", tmpsname ); + sprintf(distmp, "%s\n", tmpsname); disptr = &distmp[strlen(distmp)]; tmpsname = ""; } } - strcpy( sname, tmpsname ); - for( i=strlen(sname); iinst[0]; a1 = cte->inst[1]; a2 = cte->inst[2]; - switch( distab[op].amode ) + switch(distab[op].amode) { case AM_IMP: - sprintf( disptr, "%s %04X %02X %s", sname, iaddr, op, distab[op].name ); + sprintf(disptr, "%s %04X %02X %s", sname, iaddr, op, distab[op].name); break; case AM_IMM: - sprintf( disptr, "%s %04X %02X %02X %s #$%02X", sname, iaddr, op, a1, distab[op].name, a1 ); + sprintf(disptr, "%s %04X %02X %02X %s #$%02X", sname, iaddr, op, a1, distab[op].name, a1); break; case AM_ZP: case AM_ZPX: case AM_ZPY: - csym = mon_find_sym_by_addr( oric, a1, &cte->romdis ); - if( csym ) - sprintf( disptr, "%s %04X %02X %02X %s %s", sname, iaddr, op, a1, distab[op].name, csym->name ); + csym = mon_find_sym_by_addr(oric, a1, &cte->romdis); + if(csym) + sprintf(disptr, "%s %04X %02X %02X %s %s", sname, iaddr, op, a1, distab[op].name, csym->name); else - sprintf( disptr, "%s %04X %02X %02X %s $%02X", sname, iaddr, op, a1, distab[op].name, a1 ); - if( distab[op].amode == AM_ZP ) break; - strcat( disptr, distab[op].amode == AM_ZPX ? ",X" : ",Y" ); + sprintf(disptr, "%s %04X %02X %02X %s $%02X", sname, iaddr, op, a1, distab[op].name, a1); + if(distab[op].amode == AM_ZP) break; + strcat(disptr, distab[op].amode == AM_ZPX ? ",X" : ",Y"); break; case AM_ABS: case AM_ABX: case AM_ABY: - csym = mon_find_sym_by_addr( oric, (a2<<8)|a1, &cte->romdis ); - if( csym ) - sprintf( disptr, "%s %04X %02X %02X %02X %s %s", sname, iaddr, op, a1, a2, distab[op].name, csym->name ); + csym = mon_find_sym_by_addr(oric, (a2<<8)|a1, &cte->romdis); + if(csym) + sprintf(disptr, "%s %04X %02X %02X %02X %s %s", sname, iaddr, op, a1, a2, distab[op].name, csym->name); else - sprintf( disptr, "%s %04X %02X %02X %02X %s $%02X%02X", sname, iaddr, op, a1, a2, distab[op].name, a2, a1 ); - if( distab[op].amode == AM_ABS ) break; - strcat( disptr, distab[op].amode == AM_ABX ? ",X" : ",Y" ); + sprintf(disptr, "%s %04X %02X %02X %02X %s $%02X%02X", sname, iaddr, op, a1, a2, distab[op].name, a2, a1); + if(distab[op].amode == AM_ABS) break; + strcat(disptr, distab[op].amode == AM_ABX ? ",X" : ",Y"); break; case AM_ZIX: - csym = mon_find_sym_by_addr( oric, a1, &cte->romdis ); - if( csym ) - sprintf( disptr, "%s %04X %02X %02X %s (%s,X)", sname, iaddr, op, a1, distab[op].name, csym->name ); + csym = mon_find_sym_by_addr(oric, a1, &cte->romdis); + if(csym) + sprintf(disptr, "%s %04X %02X %02X %s (%s,X)", sname, iaddr, op, a1, distab[op].name, csym->name); else - sprintf( disptr, "%s %04X %02X %02X %s ($%02X,X)", sname, iaddr, op, a1, distab[op].name, a1 ); + sprintf(disptr, "%s %04X %02X %02X %s ($%02X,X)", sname, iaddr, op, a1, distab[op].name, a1); break; case AM_ZIY: - csym = mon_find_sym_by_addr( oric, a1, &cte->romdis ); - if( csym ) - sprintf( disptr, "%s %04X %02X %02X %s (%s),Y", sname, iaddr, op, a1, distab[op].name, csym->name ); + csym = mon_find_sym_by_addr(oric, a1, &cte->romdis); + if(csym) + sprintf(disptr, "%s %04X %02X %02X %s (%s),Y", sname, iaddr, op, a1, distab[op].name, csym->name); else - sprintf( disptr, "%s %04X %02X %02X %s ($%02X),Y", sname, iaddr, op, a1, distab[op].name, a1 ); + sprintf(disptr, "%s %04X %02X %02X %s ($%02X),Y", sname, iaddr, op, a1, distab[op].name, a1); break; case AM_REL: addr = ((cte->pc+2)+((signed char)a1))&0xffff; - csym = mon_find_sym_by_addr( oric, addr, &cte->romdis ); - if( csym ) - sprintf( disptr, "%s %04X %02X %02X %s %s", sname, iaddr, op, a1, distab[op].name, csym->name ); + csym = mon_find_sym_by_addr(oric, addr, &cte->romdis); + if(csym) + sprintf(disptr, "%s %04X %02X %02X %s %s", sname, iaddr, op, a1, distab[op].name, csym->name); else - sprintf( disptr, "%s %04X %02X %02X %s $%04X", sname, iaddr, op, a1, distab[op].name, addr ); + sprintf(disptr, "%s %04X %02X %02X %s $%04X", sname, iaddr, op, a1, distab[op].name, addr); break; case AM_IND: - csym = mon_find_sym_by_addr( oric, (a2<<8)|a1, &cte->romdis ); - if( csym ) - sprintf( disptr, "%s %04X %02X %02X %02X %s (%s)", sname, iaddr, op, a1, a2, distab[op].name, csym->name ); + csym = mon_find_sym_by_addr(oric, (a2<<8)|a1, &cte->romdis); + if(csym) + sprintf(disptr, "%s %04X %02X %02X %02X %s (%s)", sname, iaddr, op, a1, a2, distab[op].name, csym->name); else - sprintf( disptr, "%s %04X %02X %02X %02X %s ($%02X%02X)", sname, iaddr, op, a1, a2, distab[op].name, a2, a1 ); + sprintf(disptr, "%s %04X %02X %02X %02X %s ($%02X%02X)", sname, iaddr, op, a1, a2, distab[op].name, a2, a1); break; default: - strcpy( disptr, " WTF?" ); + strcpy(disptr, " WTF?"); break; } - for( i=strlen(disptr); i<60; i++ ) + for(i=strlen(disptr); i<60; i++) disptr[i] = 32; disptr[i] = 0; sprintf(&disptr[60], "%c%c-%c%c%c%c%c A=%02X X=%02X Y=%02X SP=%04X ROMDIS=%d", - (cte->flags&0x80) ? 'N' : '-', - (cte->flags&0x40) ? 'V' : '-', - (cte->flags&0x10) ? 'B' : '-', - (cte->flags&0x08) ? 'D' : '-', - (cte->flags&0x04) ? 'I' : '-', - (cte->flags&0x02) ? 'Z' : '-', - (cte->flags&0x01) ? 'C' : '-', - cte->a, - cte->x, - cte->y, - cte->sp+0x100, - cte->romdis); + (cte->flags&0x80) ? 'N' : '-', + (cte->flags&0x40) ? 'V' : '-', + (cte->flags&0x10) ? 'B' : '-', + (cte->flags&0x08) ? 'D' : '-', + (cte->flags&0x04) ? 'I' : '-', + (cte->flags&0x02) ? 'Z' : '-', + (cte->flags&0x01) ? 'C' : '-', + cte->a, + cte->x, + cte->y, + cte->sp+0x100, + cte->romdis); return distmp; } @@ -4646,7 +4870,7 @@ void dump_cputrace(struct machine *oric) { struct cpu_trace_entry *iter = list_start; - while (iter != next) + while(iter != next) { printf("%s\n", cputrace_print(oric, iter)); iter = iter->next; @@ -4654,4 +4878,4 @@ void dump_cputrace(struct machine *oric) } #endif -#endif \ No newline at end of file +#endif diff --git a/monitor.h b/monitor.h index 2b2bdca4..5788ccd9 100644 --- a/monitor.h +++ b/monitor.h @@ -59,7 +59,7 @@ struct msym unsigned short flags; char sname[SNAME_LEN+1]; // Short name char ssname[SSNAME_LEN+1]; // Short short name - char *name; // Full name + char* name; // Full name }; struct symboltable @@ -68,28 +68,28 @@ struct symboltable struct msym *syms; }; -SDL_bool isws( char c ); -SDL_bool ishex( char c ); -int hexit( char c ); +SDL_bool isws(char c); +SDL_bool ishex(char c); +int hexit(char c); -void mon_warminit( struct machine *oric ); -void mon_init( struct machine *oric ); -void mon_render( struct machine *oric ); -void mon_update_regs( struct machine *oric ); -void mon_update( struct machine *oric ); -SDL_bool mon_event( SDL_Event *ev, struct machine *oric, SDL_bool *needrender ); -void dbg_printf( char *fmt, ... ); -void mon_printf_above( char *fmt, ... ); -void mon_enter( struct machine *oric ); -void mon_shut( struct machine *oric ); -void mon_init_symtab( struct symboltable *stab ); -void mon_freesyms( struct symboltable *stab ); -SDL_bool mon_new_symbols( struct symboltable *stab, struct machine *oric, char *fname, unsigned short flags, SDL_bool above, SDL_bool verbose ); -SDL_bool mon_symsfromsnapshot( struct symboltable *stab, unsigned char *buffer, unsigned int len); -void mon_state_reset( struct machine *oric ); -SDL_bool mon_getnum( struct machine *oric, unsigned int *num, char *buf, int *off, SDL_bool addrregs, SDL_bool nregs, SDL_bool viaregs, SDL_bool symbols ); -SDL_bool mon_do_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ); -SDL_bool mon_cmd( char *cmd, struct machine *oric, SDL_bool *needrender ); +void mon_warminit(struct machine *oric); +void mon_init(struct machine *oric); +void mon_render(struct machine *oric); +void mon_update_regs(struct machine *oric); +void mon_update(struct machine *oric); +SDL_bool mon_event(SDL_Event *ev, struct machine *oric, SDL_bool *needrender); +void dbg_printf(char* fmt, ...); +void mon_printf_above(char* fmt, ...); +void mon_enter(struct machine *oric); +void mon_shut(struct machine *oric); +void mon_init_symtab(struct symboltable *stab); +void mon_freesyms(struct symboltable *stab); +SDL_bool mon_new_symbols(struct symboltable *stab, struct machine *oric, char* fname, unsigned short flags, SDL_bool above, SDL_bool verbose); +SDL_bool mon_symsfromsnapshot(struct symboltable *stab, unsigned char* buffer, unsigned int len); +void mon_state_reset(struct machine *oric); +SDL_bool mon_getnum(struct machine *oric, unsigned int* num, char* buf, int* off, SDL_bool addrregs, SDL_bool nregs, SDL_bool viaregs, SDL_bool symbols); +SDL_bool mon_do_cmd(char* cmd, struct machine *oric, SDL_bool *needrender); +SDL_bool mon_cmd(char* cmd, struct machine *oric, SDL_bool *needrender); #if defined(DEBUG_CPU_TRACE) && DEBUG_CPU_TRACE > 0 struct cpu_trace_entry diff --git a/msgbox.h b/msgbox.h index e7ea6d3e..63000da5 100644 --- a/msgbox.h +++ b/msgbox.h @@ -26,7 +26,7 @@ enum MSGBOX_OK }; -SDL_bool init_msgbox( struct machine *oric ); -void shut_msgbox( struct machine *oric ); -SDL_bool msgbox( struct machine *oric, int type, char *msg ); +SDL_bool init_msgbox(struct machine *oric); +void shut_msgbox(struct machine *oric); +SDL_bool msgbox(struct machine *oric, int type, char* msg); diff --git a/msgbox_beos.cpp b/msgbox_beos.cpp index a6a8e392..b4852480 100644 --- a/msgbox_beos.cpp +++ b/msgbox_beos.cpp @@ -40,27 +40,27 @@ extern "C" { #include "msgbox.h" } -SDL_bool init_msgbox( struct machine *oric ) +SDL_bool init_msgbox(struct machine *oric) { return SDL_TRUE; } -void shut_msgbox( struct machine *oric ) +void shut_msgbox(struct machine *oric) { } -SDL_bool msgbox( struct machine *oric, int type, char *msg ) +SDL_bool msgbox(struct machine *oric, int type, char* msg) { - switch( type ) + switch(type) { case MSGBOX_YES_NO: return ((new BAlert("Oricutron Request", msg, "Yes", "No"))->Go() == 0) ? SDL_TRUE : SDL_FALSE; -// return (MessageBoxA( hwnd, msg, "Oriculator Request", MB_YESNO ) == IDYES); + // return (MessageBoxA( hwnd, msg, "Oriculator Request", MB_YESNO ) == IDYES); case MSGBOX_OK_CANCEL: return ((new BAlert("Oricutron Request", msg, "Ok", "Cancel"))->Go() == 0) ? SDL_TRUE : SDL_FALSE; -// return (MessageBoxA( hwnd, msg, "Oriculator Request", MB_OKCANCEL ) == IDOK); - + // return (MessageBoxA( hwnd, msg, "Oriculator Request", MB_OKCANCEL ) == IDOK); + case MSGBOX_OK: (new BAlert("Oricutron Request", msg, "Ok"))->Go(); return SDL_TRUE; diff --git a/msgbox_gtk.c b/msgbox_gtk.c index 2597fd0a..db9a2b80 100644 --- a/msgbox_gtk.c +++ b/msgbox_gtk.c @@ -40,19 +40,19 @@ #include "msgbox.h" extern SDL_bool fullscreen; -void togglefullscreen( struct machine *oric, struct osdmenuitem *mitem, int dummy ); +void togglefullscreen(struct machine *oric, struct osdmenuitem *mitem, int dummy); -SDL_bool init_msgbox( struct machine *oric ) +SDL_bool init_msgbox(struct machine *oric) { // We rely on init_filerequester to call gtk_init() return SDL_TRUE; } -void shut_msgbox( struct machine *oric ) +void shut_msgbox(struct machine *oric) { } -SDL_bool msgbox( struct machine *oric, int type, char *msg ) +SDL_bool msgbox(struct machine *oric, int type, char* msg) { GtkWidget *dialog = NULL; GtkButtonsType btns = GTK_BUTTONS_OK; @@ -61,10 +61,10 @@ SDL_bool msgbox( struct machine *oric, int type, char *msg ) gint res; SDL_bool was_fullscreen = fullscreen; - if (fullscreen) + if(fullscreen) togglefullscreen(oric, NULL, 0); - switch( type ) + switch(type) { case MSGBOX_YES_NO: btns = GTK_BUTTONS_YES_NO; @@ -80,15 +80,15 @@ SDL_bool msgbox( struct machine *oric, int type, char *msg ) } dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, mtyp, btns, "%s", msg); - res = gtk_dialog_run(GTK_DIALOG (dialog)); - if ((res == GTK_RESPONSE_OK) || (res == GTK_RESPONSE_YES) || (res == GTK_RESPONSE_ACCEPT)) + res = gtk_dialog_run(GTK_DIALOG(dialog)); + if((res == GTK_RESPONSE_OK) || (res == GTK_RESPONSE_YES) || (res == GTK_RESPONSE_ACCEPT)) result = SDL_TRUE; - + gtk_widget_destroy(dialog); - while (gtk_events_pending()) + while(gtk_events_pending()) gtk_main_iteration(); - if (was_fullscreen) + if(was_fullscreen) togglefullscreen(oric, NULL, 0); return result; diff --git a/msgbox_os2.c b/msgbox_os2.c index 7d3a949c..9f880fea 100644 --- a/msgbox_os2.c +++ b/msgbox_os2.c @@ -25,28 +25,28 @@ #include "via.h" #include "msgbox.h" -SDL_bool init_msgbox( struct machine *oric ) +SDL_bool init_msgbox(struct machine *oric) { return SDL_TRUE; } -void shut_msgbox( struct machine *oric ) +void shut_msgbox(struct machine *oric) { } -SDL_bool msgbox( struct machine *oric, int type, char *msg ) +SDL_bool msgbox(struct machine *oric, int type, char* msg) { - char *btns = "OK|Cancel"; + char* btns = "OK|Cancel"; struct EasyStruct myES = - { + { sizeof(struct EasyStruct), - 0, - (UBYTE *) "Oricutron Request", - (UBYTE *) msg, - (UBYTE *) btns, + 0, + (UBYTE *) "Oricutron Request", + (UBYTE *) msg, + (UBYTE *) btns, }; - switch( type ) + switch(type) { case MSGBOX_YES_NO: strcpy(btns, "Yes|No"); diff --git a/msgbox_os4.c b/msgbox_os4.c index 17a21470..ca8e2587 100644 --- a/msgbox_os4.c +++ b/msgbox_os4.c @@ -49,54 +49,54 @@ struct Library *RequesterBase = NULL; struct IntuitionIFace *IIntuition = NULL; struct RequesterIFace *IRequester = NULL; -SDL_bool init_msgbox( struct machine *oric ) +SDL_bool init_msgbox(struct machine *oric) { - IntuitionBase = IExec->OpenLibrary( "intuition.library", 51 ); - if( !IntuitionBase ) + IntuitionBase = IExec->OpenLibrary("intuition.library", 51); + if(!IntuitionBase) { - printf( "Unable to open intuition.library v51+\n" ); + printf("Unable to open intuition.library v51+\n"); return SDL_FALSE; } - IIntuition = (struct IntuitionIFace *)IExec->GetInterface( IntuitionBase, "main", 1, NULL ); - if( !IIntuition ) + IIntuition = (struct IntuitionIFace *)IExec->GetInterface(IntuitionBase, "main", 1, NULL); + if(!IIntuition) { - printf( "Unable to obtain main interface for intuition.library\n" ); + printf("Unable to obtain main interface for intuition.library\n"); return SDL_FALSE; } - RequesterBase = IExec->OpenLibrary( "requester.class", 51 ); - if( !RequesterBase ) + RequesterBase = IExec->OpenLibrary("requester.class", 51); + if(!RequesterBase) { - printf( "Unable to open requester.class v51+\n" ); + printf("Unable to open requester.class v51+\n"); return SDL_FALSE; } - IRequester = (struct RequesterIFace *)IExec->GetInterface( RequesterBase, "main", 1, NULL ); - if( !IRequester ) + IRequester = (struct RequesterIFace *)IExec->GetInterface(RequesterBase, "main", 1, NULL); + if(!IRequester) { - printf( "Unable to obtain main interface for requester.library\n" ); + printf("Unable to obtain main interface for requester.library\n"); return SDL_FALSE; } return SDL_TRUE; } -void shut_msgbox( struct machine *oric ) +void shut_msgbox(struct machine *oric) { - if( IRequester ) IExec->DropInterface( (struct Interface *)IRequester ); - if( RequesterBase ) IExec->CloseLibrary( RequesterBase ); - if( IIntuition ) IExec->DropInterface( (struct Interface *)IIntuition ); - if( IntuitionBase ) IExec->CloseLibrary( IntuitionBase ); + if(IRequester) IExec->DropInterface((struct Interface *)IRequester); + if(RequesterBase) IExec->CloseLibrary(RequesterBase); + if(IIntuition) IExec->DropInterface((struct Interface *)IIntuition); + if(IntuitionBase) IExec->CloseLibrary(IntuitionBase); } -SDL_bool msgbox( struct machine *oric, int type, char *msg ) +SDL_bool msgbox(struct machine *oric, int type, char* msg) { Object *req_obj; int32 result, imgtype=REQIMAGE_INFO; STRPTR btns = "huh?!"; - switch( type ) + switch(type) { case MSGBOX_YES_NO: btns = "Yes|No"; @@ -107,26 +107,26 @@ SDL_bool msgbox( struct machine *oric, int type, char *msg ) btns = "OK|Cancel"; imgtype = REQIMAGE_QUESTION; break; - + case MSGBOX_OK: btns = "OK"; imgtype = REQIMAGE_INFO; break; } - req_obj = (Object *)IIntuition->NewObject( IRequester->REQUESTER_GetClass(), NULL, - REQ_TitleText, "Oricutron Request", - REQ_BodyText, msg, - REQ_GadgetText, btns, - REQ_Image, imgtype, - TAG_DONE ); + req_obj = (Object *)IIntuition->NewObject(IRequester->REQUESTER_GetClass(), NULL, + REQ_TitleText, "Oricutron Request", + REQ_BodyText, msg, + REQ_GadgetText, btns, + REQ_Image, imgtype, + TAG_DONE); - if( !req_obj ) return SDL_TRUE; // Oh well + if(!req_obj) return SDL_TRUE; // Oh well - result = IIntuition->IDoMethod( req_obj, RM_OPENREQ, NULL, NULL, NULL ); - IIntuition->DisposeObject( req_obj ); + result = IIntuition->IDoMethod(req_obj, RM_OPENREQ, NULL, NULL, NULL); + IIntuition->DisposeObject(req_obj); - if( type == MSGBOX_OK ) return SDL_TRUE; + if(type == MSGBOX_OK) return SDL_TRUE; return result ? SDL_TRUE : SDL_FALSE; } diff --git a/msgbox_sdl.c b/msgbox_sdl.c index c1d2e700..1748c21e 100644 --- a/msgbox_sdl.c +++ b/msgbox_sdl.c @@ -48,7 +48,7 @@ struct msgboxbut { int x, y; - char *str; + char* str; }; extern SDL_Surface *screen; @@ -57,84 +57,89 @@ static struct msgboxbut *btns; static int cbtn; static struct msgboxbut ynbuts[] = { { 2, 5, " YES " }, - { 50, 5, " NO " }, - { -1,-1, NULL } }; + { 50, 5, " NO " }, + { -1, -1, NULL } +}; static struct msgboxbut ocbuts[] = { { 2, 5, " OK " }, - { 50, 5, " CANCEL " }, - { -1,-1, NULL } }; + { 50, 5, " CANCEL " }, + { -1, -1, NULL } +}; static struct msgboxbut obuts[] = { { 26, 5, " OK " }, - { -1,-1, NULL } }; + { -1, -1, NULL } +}; -SDL_bool init_msgbox( struct machine *oric ) +SDL_bool init_msgbox(struct machine *oric) { - if( !alloc_textzone( oric, TZ_MSGBOX, 80, 120, 60, 8, "Oricutron Request" ) ) return SDL_FALSE; + if(!alloc_textzone(oric, TZ_MSGBOX, 80, 120, 60, 8, "Oricutron Request")) return SDL_FALSE; return SDL_TRUE; } -void shut_msgbox( struct machine *oric ) +void shut_msgbox(struct machine *oric) { - free_textzone( oric, TZ_MSGBOX ); + free_textzone(oric, TZ_MSGBOX); } // Render the messagebox -static void msgbox_render( struct machine *oric ) +static void msgbox_render(struct machine *oric) { int i; - for( i=0; btns[i].x!=-1; i++ ) + for(i=0; btns[i].x!=-1; i++) { - if( i==cbtn ) + if(i==cbtn) { tz[TZ_MSGBOX]->cfc = 1; tz[TZ_MSGBOX]->cbc = 2; - } else { + } + else + { tz[TZ_MSGBOX]->cfc = 2; tz[TZ_MSGBOX]->cbc = 5; } - tzstrpos( tz[TZ_MSGBOX], btns[i].x, btns[i].y, btns[i].str ); + tzstrpos(tz[TZ_MSGBOX], btns[i].x, btns[i].y, btns[i].str); } - oric->render_begin( oric ); + oric->render_begin(oric); - oric->render_video( oric, SDL_TRUE ); - oric->render_textzone( oric, TZ_MSGBOX ); + oric->render_video(oric, SDL_TRUE); + oric->render_textzone(oric, TZ_MSGBOX); - oric->render_end( oric ); + oric->render_end(oric); } -static int msgbox_checkover( int x, int y ) +static int msgbox_checkover(int x, int y) { int i; - for( i=0; btns[i].x!=-1; i++ ) + for(i=0; btns[i].x!=-1; i++) { - if( ( y == btns[i].y ) && - ( x >= btns[i].x ) && - ( x < (btns[i].x+strlen(btns[i].str)) ) ) + if((y == btns[i].y) && + (x >= btns[i].x) && + (x < (btns[i].x+strlen(btns[i].str)))) return i; } return -1; } -SDL_bool msgbox( struct machine *oric, int type, char *msg ) +SDL_bool msgbox(struct machine *oric, int type, char* msg) { int i, j, k, mx, my, presson; int lines[] = { 2*60, 3*60, 5*60 }; - char *msg2; + char* msg2; SDL_Event event; SDL_bool wasunicode; - wasunicode = SDL_COMPAT_EnableUNICODE( SDL_TRUE ); - SDL_COMPAT_EnableKeyRepeat( SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL ); + wasunicode = SDL_COMPAT_EnableUNICODE(SDL_TRUE); + SDL_COMPAT_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); // Clear any old message - for( i=1; i<59; i++ ) + for(i=1; i<59; i++) { - for( j=0; j<3; j++ ) + for(j=0; j<3; j++) { tz[TZ_MSGBOX]->fc[lines[j]+i] = 2; tz[TZ_MSGBOX]->bc[lines[j]+i] = 3; @@ -142,21 +147,21 @@ SDL_bool msgbox( struct machine *oric, int type, char *msg ) } } - for( i=0; msg[i]; i++ ) if( (msg[i]=='\r')||(msg[i]=='\n') ) break; + for(i=0; msg[i]; i++) if((msg[i]=='\r')||(msg[i]=='\n')) break; - for( j=0, k=30-i/2; jtx[lines[0]+k] = msg[j]; - while( (msg[i]=='\r')||(msg[i]=='\n') ) i++; - if( msg[i] ) + while((msg[i]=='\r')||(msg[i]=='\n')) i++; + if(msg[i]) { msg2 = &msg[i]; - i = strlen( msg2 ); - for( j=0, k=30-i/2; jtx[lines[1]+k] = msg2[j]; } - switch( type ) + switch(type) { case MSGBOX_YES_NO: btns = ynbuts; @@ -174,75 +179,77 @@ SDL_bool msgbox( struct machine *oric, int type, char *msg ) break; } - msgbox_render( oric ); + msgbox_render(oric); presson = -1; - for( ;; ) + for(;;) { #ifdef WWW - if( !SDL_PollEvent( &event )) { - emscripten_sleep(10); - continue; + if(!SDL_PollEvent(&event)) + { + emscripten_sleep(10); + continue; } #else - if( !SDL_WaitEvent( &event ) ) + if(!SDL_WaitEvent(&event)) break; #endif - switch( event.type ) + switch(event.type) { case SDL_COMPAT_ACTIVEEVENT: - if(SDL_COMPAT_IsAppFocused( &event ) ) { - msgbox_render( oric ); + if(SDL_COMPAT_IsAppFocused(&event)) + { + msgbox_render(oric); } break; case SDL_MOUSEMOTION: - if( presson != -1 ) break; + if(presson != -1) break; mx = (event.motion.x - tz[TZ_MSGBOX]->x)/8; my = (event.motion.y - tz[TZ_MSGBOX]->y)/12; - i = msgbox_checkover( mx, my ); - if( i == -1 ) break; - if( i != cbtn ) + i = msgbox_checkover(mx, my); + if(i == -1) break; + if(i != cbtn) { cbtn = i; - msgbox_render( oric ); + msgbox_render(oric); } break; case SDL_MOUSEBUTTONDOWN: - if( event.button.button == SDL_BUTTON_LEFT ) + if(event.button.button == SDL_BUTTON_LEFT) { mx = (event.motion.x - tz[TZ_MSGBOX]->x)/8; my = (event.motion.y - tz[TZ_MSGBOX]->y)/12; - i = msgbox_checkover( mx, my ); - if( i == -1 ) break; + i = msgbox_checkover(mx, my); + if(i == -1) break; cbtn = i; presson = i; - msgbox_render( oric ); + msgbox_render(oric); } break; case SDL_MOUSEBUTTONUP: - if( event.button.button == SDL_BUTTON_LEFT ) + if(event.button.button == SDL_BUTTON_LEFT) { - if( presson == -1 ) break; + if(presson == -1) break; mx = (event.motion.x - tz[TZ_MSGBOX]->x)/8; my = (event.motion.y - tz[TZ_MSGBOX]->y)/12; - i = msgbox_checkover( mx, my ); - if( i == presson ) + i = msgbox_checkover(mx, my); + if(i == presson) { - switch( type ) + switch(type) { case MSGBOX_YES_NO: case MSGBOX_OK_CANCEL: - SDL_COMPAT_EnableUNICODE( wasunicode ); - SDL_COMPAT_EnableKeyRepeat( wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0 ); + SDL_COMPAT_EnableUNICODE(wasunicode); + SDL_COMPAT_EnableKeyRepeat(wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0); return (presson==0); default: - SDL_COMPAT_EnableUNICODE( wasunicode ); - SDL_COMPAT_EnableKeyRepeat( wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0 ); + SDL_COMPAT_EnableUNICODE(wasunicode); + SDL_COMPAT_EnableKeyRepeat(wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0); return SDL_TRUE; } break; @@ -253,38 +260,38 @@ SDL_bool msgbox( struct machine *oric, int type, char *msg ) break; case SDL_KEYDOWN: - switch( event.key.keysym.sym ) + switch(event.key.keysym.sym) { case SDLK_TAB: case SDLK_RIGHT: cbtn = cbtn+1; - if( btns[cbtn].x == -1 ) cbtn = 0; - msgbox_render( oric ); + if(btns[cbtn].x == -1) cbtn = 0; + msgbox_render(oric); break; case SDLK_LEFT: cbtn--; - if( cbtn < 0 ) + if(cbtn < 0) { - for( cbtn=0; btns[cbtn].x!=-1; cbtn++ ) ; + for(cbtn=0; btns[cbtn].x!=-1; cbtn++) ; cbtn--; } - msgbox_render( oric ); + msgbox_render(oric); break; case SDLK_RETURN: case SDLK_KP_ENTER: - switch( type ) + switch(type) { case MSGBOX_YES_NO: case MSGBOX_OK_CANCEL: - SDL_COMPAT_EnableUNICODE( wasunicode ); - SDL_COMPAT_EnableKeyRepeat( wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0 ); + SDL_COMPAT_EnableUNICODE(wasunicode); + SDL_COMPAT_EnableKeyRepeat(wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0); return (cbtn==0); default: - SDL_COMPAT_EnableUNICODE( wasunicode ); - SDL_COMPAT_EnableKeyRepeat( wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0 ); + SDL_COMPAT_EnableUNICODE(wasunicode); + SDL_COMPAT_EnableKeyRepeat(wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0); return SDL_TRUE; } break; @@ -296,7 +303,7 @@ SDL_bool msgbox( struct machine *oric, int type, char *msg ) } } - SDL_COMPAT_EnableUNICODE( wasunicode ); - SDL_COMPAT_EnableKeyRepeat( wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0 ); + SDL_COMPAT_EnableUNICODE(wasunicode); + SDL_COMPAT_EnableKeyRepeat(wasunicode ? SDL_DEFAULT_REPEAT_DELAY : 0, wasunicode ? SDL_DEFAULT_REPEAT_INTERVAL : 0); return SDL_FALSE; } diff --git a/msgbox_win32.c b/msgbox_win32.c index 9c0dae78..685fabd5 100644 --- a/msgbox_win32.c +++ b/msgbox_win32.c @@ -38,38 +38,38 @@ #include "machine.h" #include "msgbox.h" -SDL_bool init_msgbox( struct machine *oric ) +SDL_bool init_msgbox(struct machine *oric) { return SDL_TRUE; } -void shut_msgbox( struct machine *oric ) +void shut_msgbox(struct machine *oric) { } -SDL_bool msgbox( struct machine *oric, int type, char *msg ) +SDL_bool msgbox(struct machine *oric, int type, char* msg) { SDL_SysWMinfo wmi; HWND hwnd; hwnd = NULL; SDL_VERSION(&wmi.version); - if(SDL_COMPAT_GetWMInfo( &wmi ) ) + if(SDL_COMPAT_GetWMInfo(&wmi)) #if SDL_MAJOR_VERSION == 1 hwnd = (HWND)wmi.window; #else hwnd = (HWND)wmi.info.win.window; #endif - switch( type ) + switch(type) { case MSGBOX_YES_NO: - return (MessageBoxA( hwnd, msg, "Oricutron Request", MB_YESNO ) == IDYES); + return (MessageBoxA(hwnd, msg, "Oricutron Request", MB_YESNO) == IDYES); case MSGBOX_OK_CANCEL: - return (MessageBoxA( hwnd, msg, "Oricutron Request", MB_OKCANCEL ) == IDOK); - + return (MessageBoxA(hwnd, msg, "Oricutron Request", MB_OKCANCEL) == IDOK); + case MSGBOX_OK: - MessageBoxA( hwnd, msg, "Oricutron Request", MB_OK ); + MessageBoxA(hwnd, msg, "Oricutron Request", MB_OK); } return SDL_TRUE; diff --git a/msvc/Oricutron.rc b/msvc/Oricutron.rc index d754e665..1f35c63a 100644 --- a/msvc/Oricutron.rc +++ b/msvc/Oricutron.rc @@ -1,51 +1,51 @@ -#include -# define ORICUTRON_VERSION_MAJOR 1 -# define ORICUTRON_VERSION_MINOR 2 -# define ORICUTRON_VERSION_PATCH 0 -# define ORICUTRON_VERSION_NUMBER "1.2.0\0" -# define ORICUTRON_COPYRIGHT "Oricutron 1.2.0 (c)2015 Peter Gordon (pete@gordon.plus)\0" -# define ORICUTRON_APPNAME "Oricutron\0" -# define ORICUTRON_EXE "Oricutron.exe\0" -# define ORICUTRON_COMPANYNAME "pete-gordon/oricutron\0" -# define ORICUTRON_LINK "https://github.com/pete-gordon/oricutron/\0" - -101 ICON "..\winicon.ico" - -#ifdef GCC_WINDRES -VS_VERSION_INFO VERSIONINFO -#else -VS_VERSION_INFO VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE -#endif - FILEVERSION ORICUTRON_VERSION_MAJOR,ORICUTRON_VERSION_MINOR,ORICUTRON_VERSION_PATCH,0 - PRODUCTVERSION ORICUTRON_VERSION_MAJOR,ORICUTRON_VERSION_MINOR,ORICUTRON_VERSION_PATCH,0 - FILEFLAGSMASK VS_FFI_FILEFLAGSMASK -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS VOS_NT_WINDOWS32 - FILETYPE VFT_APP - FILESUBTYPE VFT2_UNKNOWN -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" - //language ID = U.S. English, char set = Windows, Multilingual - BEGIN - VALUE "CompanyName", ORICUTRON_COMPANYNAME - VALUE "FileDescription", ORICUTRON_EXE - VALUE "FileVersion", ORICUTRON_VERSION_NUMBER - VALUE "InternalName", ORICUTRON_EXE - VALUE "LegalCopyright", ORICUTRON_COPYRIGHT - VALUE "OriginalFilename", ORICUTRON_EXE - VALUE "ProductName", ORICUTRON_APPNAME - VALUE "ProductVersion", ORICUTRON_VERSION_NUMBER - VALUE "Comments", ORICUTRON_LINK - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x0409, 1252 - END -END +#include +# define ORICUTRON_VERSION_MAJOR 1 +# define ORICUTRON_VERSION_MINOR 2 +# define ORICUTRON_VERSION_PATCH 0 +# define ORICUTRON_VERSION_NUMBER "1.2.0\0" +# define ORICUTRON_COPYRIGHT "Oricutron 1.2.0 (c)2015 Peter Gordon (pete@gordon.plus)\0" +# define ORICUTRON_APPNAME "Oricutron\0" +# define ORICUTRON_EXE "Oricutron.exe\0" +# define ORICUTRON_COMPANYNAME "pete-gordon/oricutron\0" +# define ORICUTRON_LINK "https://github.com/pete-gordon/oricutron/\0" + +101 ICON "..\winicon.ico" + +#ifdef GCC_WINDRES +VS_VERSION_INFO VERSIONINFO +#else +VS_VERSION_INFO VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE +#endif + FILEVERSION ORICUTRON_VERSION_MAJOR,ORICUTRON_VERSION_MINOR,ORICUTRON_VERSION_PATCH,0 + PRODUCTVERSION ORICUTRON_VERSION_MAJOR,ORICUTRON_VERSION_MINOR,ORICUTRON_VERSION_PATCH,0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS_NT_WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE VFT2_UNKNOWN +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + BEGIN + VALUE "CompanyName", ORICUTRON_COMPANYNAME + VALUE "FileDescription", ORICUTRON_EXE + VALUE "FileVersion", ORICUTRON_VERSION_NUMBER + VALUE "InternalName", ORICUTRON_EXE + VALUE "LegalCopyright", ORICUTRON_COPYRIGHT + VALUE "OriginalFilename", ORICUTRON_EXE + VALUE "ProductName", ORICUTRON_APPNAME + VALUE "ProductVersion", ORICUTRON_VERSION_NUMBER + VALUE "Comments", ORICUTRON_LINK + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/msvc/VS2017/Oricutron.sln b/msvc/VS2017/Oricutron.sln index 40760682..706636cc 100644 --- a/msvc/VS2017/Oricutron.sln +++ b/msvc/VS2017/Oricutron.sln @@ -1,4 +1,4 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.27428.1 diff --git a/msvc/VS2017/Oricutron.vcxproj b/msvc/VS2017/Oricutron.vcxproj index 2ab0cb64..dea6e3d6 100644 --- a/msvc/VS2017/Oricutron.vcxproj +++ b/msvc/VS2017/Oricutron.vcxproj @@ -1,4 +1,4 @@ - + diff --git a/msvc/VS2017/Oricutron.vcxproj.filters b/msvc/VS2017/Oricutron.vcxproj.filters index ea61e66c..e5118e12 100644 --- a/msvc/VS2017/Oricutron.vcxproj.filters +++ b/msvc/VS2017/Oricutron.vcxproj.filters @@ -1,4 +1,4 @@ - + diff --git a/msvc/VS2019/Oricutron.sln b/msvc/VS2019/Oricutron.sln index 538efe11..5c937bc0 100644 --- a/msvc/VS2019/Oricutron.sln +++ b/msvc/VS2019/Oricutron.sln @@ -1,4 +1,4 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.29411.138 diff --git a/msvc/VS2019/Oricutron.vcxproj b/msvc/VS2019/Oricutron.vcxproj index 15a72b43..28f2be00 100644 --- a/msvc/VS2019/Oricutron.vcxproj +++ b/msvc/VS2019/Oricutron.vcxproj @@ -1,4 +1,4 @@ - + diff --git a/msvc/VS2019/Oricutron.vcxproj.filters b/msvc/VS2019/Oricutron.vcxproj.filters index 0b5706f0..7a880e2a 100644 --- a/msvc/VS2019/Oricutron.vcxproj.filters +++ b/msvc/VS2019/Oricutron.vcxproj.filters @@ -1,307 +1,307 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - {d8905722-c245-4995-9565-1254df225adf} - - - {2a1ecf99-deac-4e93-8be8-b458195be3e6} - - - {da16e29b-077d-4e5d-a0f0-a28dcb6a6f8e} - - - {4e5b9fcf-0045-4de6-b89b-1068fb7c09f8} - - - {cc64b1f4-268f-4438-977a-7a111a46d23c} - - - {cb7fe694-3d2f-454a-ad9d-00a823d54e1b} - - - {4396d62b-8f06-42de-a6cb-f18ad3efec67} - - - {7e934c0d-8e01-4561-8fb2-046726f16eab} - - - {277732bb-2f68-45d9-8df8-f5445a281fd4} - - - {e7b0354f-0047-49e9-b26e-148f1be37f38} - - - {e6e88892-b414-4cf9-9cef-c2f287ab8305} - - - {8438c688-6a7e-49a1-bd13-fa16128c58ec} - - - {7a330041-d032-4884-903e-eb6f613ed87e} - - - {b01b5e24-c6cf-49fb-8e17-a4eae6400688} - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files\filereq - - - Source Files\filereq - - - Source Files\filereq - - - Source Files\filereq - - - Source Files\filereq - - - Source Files\msgbox - - - Source Files\msgbox - - - Source Files\msgbox - - - Source Files\msgbox - - - Source Files\msgbox - - - Source Files\msgbox - - - Source Files\renderer - - - Source Files\renderer - - - Source Files\renderer - - - Source Files\renderer - - - Source Files\gui - - - Source Files\gui - - - Source Files\gui - - - Source Files\gui - - - Source Files\acia - - - Source Files\acia - - - Source Files\acia - - - Source Files\acia - - - Source Files\plugins - - - Source Files\plugins - - - Source Files\plugins - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files\renderer - - - Header Files\renderer - - - Header Files\renderer - - - Header Files\renderer - - - Header Files\filereq - - - Header Files\gui - - - Header Files\msgbox - - - Header Files\msvc - - - Header Files\msvc - - - Header Files\acia - - - Header Files\msvc - - - Header Files\plugins - - - Header Files\plugins - - - Header Files\plugins - - - - - Source Files\msvc - - - Source Files\msvc - - - - Source Files\filereq - - - Source Files\msgbox - - - Source Files\gui - - - - - Resource Files - - - - - Resource Files - - + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {d8905722-c245-4995-9565-1254df225adf} + + + {2a1ecf99-deac-4e93-8be8-b458195be3e6} + + + {da16e29b-077d-4e5d-a0f0-a28dcb6a6f8e} + + + {4e5b9fcf-0045-4de6-b89b-1068fb7c09f8} + + + {cc64b1f4-268f-4438-977a-7a111a46d23c} + + + {cb7fe694-3d2f-454a-ad9d-00a823d54e1b} + + + {4396d62b-8f06-42de-a6cb-f18ad3efec67} + + + {7e934c0d-8e01-4561-8fb2-046726f16eab} + + + {277732bb-2f68-45d9-8df8-f5445a281fd4} + + + {e7b0354f-0047-49e9-b26e-148f1be37f38} + + + {e6e88892-b414-4cf9-9cef-c2f287ab8305} + + + {8438c688-6a7e-49a1-bd13-fa16128c58ec} + + + {7a330041-d032-4884-903e-eb6f613ed87e} + + + {b01b5e24-c6cf-49fb-8e17-a4eae6400688} + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files\filereq + + + Source Files\filereq + + + Source Files\filereq + + + Source Files\filereq + + + Source Files\filereq + + + Source Files\msgbox + + + Source Files\msgbox + + + Source Files\msgbox + + + Source Files\msgbox + + + Source Files\msgbox + + + Source Files\msgbox + + + Source Files\renderer + + + Source Files\renderer + + + Source Files\renderer + + + Source Files\renderer + + + Source Files\gui + + + Source Files\gui + + + Source Files\gui + + + Source Files\gui + + + Source Files\acia + + + Source Files\acia + + + Source Files\acia + + + Source Files\acia + + + Source Files\plugins + + + Source Files\plugins + + + Source Files\plugins + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files\renderer + + + Header Files\renderer + + + Header Files\renderer + + + Header Files\renderer + + + Header Files\filereq + + + Header Files\gui + + + Header Files\msgbox + + + Header Files\msvc + + + Header Files\msvc + + + Header Files\acia + + + Header Files\msvc + + + Header Files\plugins + + + Header Files\plugins + + + Header Files\plugins + + + + + Source Files\msvc + + + Source Files\msvc + + + + Source Files\filereq + + + Source Files\msgbox + + + Source Files\gui + + + + + Resource Files + + + + + Resource Files + + \ No newline at end of file diff --git a/msvc/dirent.h b/msvc/dirent.h index f7a46daf..b65a0eff 100644 --- a/msvc/dirent.h +++ b/msvc/dirent.h @@ -219,99 +219,103 @@ extern "C" { /* Wide-character version */ -struct _wdirent { - /* Always zero */ - long d_ino; +struct _wdirent +{ + /* Always zero */ + long d_ino; - /* File position within stream */ - long d_off; + /* File position within stream */ + long d_off; - /* Structure size */ - unsigned short d_reclen; + /* Structure size */ + unsigned short d_reclen; - /* Length of name without \0 */ - size_t d_namlen; + /* Length of name without \0 */ + size_t d_namlen; - /* File type */ - int d_type; + /* File type */ + int d_type; - /* File name */ - wchar_t d_name[PATH_MAX+1]; + /* File name */ + wchar_t d_name[PATH_MAX+1]; }; typedef struct _wdirent _wdirent; -struct _WDIR { - /* Current directory entry */ - struct _wdirent ent; +struct _WDIR +{ + /* Current directory entry */ + struct _wdirent ent; - /* Private file data */ - WIN32_FIND_DATAW data; + /* Private file data */ + WIN32_FIND_DATAW data; - /* True if data is valid */ - int cached; + /* True if data is valid */ + int cached; - /* Win32 search handle */ - HANDLE handle; + /* Win32 search handle */ + HANDLE handle; - /* Initial directory name */ - wchar_t *patt; + /* Initial directory name */ + wchar_t* patt; }; typedef struct _WDIR _WDIR; /* Multi-byte character version */ -struct dirent { - /* Always zero */ - long d_ino; +struct dirent +{ + /* Always zero */ + long d_ino; - /* File position within stream */ - long d_off; + /* File position within stream */ + long d_off; - /* Structure size */ - unsigned short d_reclen; + /* Structure size */ + unsigned short d_reclen; - /* Length of name without \0 */ - size_t d_namlen; + /* Length of name without \0 */ + size_t d_namlen; - /* File type */ - int d_type; + /* File type */ + int d_type; - /* File name */ - char d_name[PATH_MAX+1]; + /* File name */ + char d_name[PATH_MAX+1]; }; typedef struct dirent dirent; -struct DIR { - struct dirent ent; - struct _WDIR *wdirp; +struct DIR +{ + struct dirent ent; + struct _WDIR *wdirp; }; typedef struct DIR DIR; /* Dirent functions */ -static DIR *opendir (const char *dirname); -static _WDIR *_wopendir (const wchar_t *dirname); +static DIR *opendir(const char* dirname); +static _WDIR *_wopendir(const wchar_t* dirname); -static struct dirent *readdir (DIR *dirp); -static struct _wdirent *_wreaddir (_WDIR *dirp); +static struct dirent *readdir(DIR *dirp); +static struct _wdirent *_wreaddir(_WDIR *dirp); static int readdir_r( - DIR *dirp, struct dirent *entry, struct dirent **result); + DIR *dirp, struct dirent *entry, struct dirent **result); static int _wreaddir_r( - _WDIR *dirp, struct _wdirent *entry, struct _wdirent **result); + _WDIR *dirp, struct _wdirent *entry, struct _wdirent **result); -static int closedir (DIR *dirp); -static int _wclosedir (_WDIR *dirp); +static int closedir(DIR *dirp); +static int _wclosedir(_WDIR *dirp); -static void rewinddir (DIR* dirp); -static void _wrewinddir (_WDIR* dirp); +static void rewinddir(DIR* dirp); +static void _wrewinddir(_WDIR* dirp); -static int scandir (const char *dirname, struct dirent ***namelist, - int (*filter)(const struct dirent*), - int (*compare)(const struct dirent**, const struct dirent**)); +static int scandir(const char* dirname, struct dirent ***namelist, + int (*filter)(const struct dirent*), + int (*compare)(const struct dirent**, const struct dirent**)); -static int alphasort (const struct dirent **a, const struct dirent **b); +static int alphasort(const struct dirent **a, const struct dirent **b); -static int versionsort (const struct dirent **a, const struct dirent **b); +static int versionsort(const struct dirent **a, const struct dirent **b); /* For compatibility with Symbian */ @@ -324,24 +328,24 @@ static int versionsort (const struct dirent **a, const struct dirent **b); /* Internal utility functions */ -static WIN32_FIND_DATAW *dirent_first (_WDIR *dirp); -static WIN32_FIND_DATAW *dirent_next (_WDIR *dirp); +static WIN32_FIND_DATAW *dirent_first(_WDIR *dirp); +static WIN32_FIND_DATAW *dirent_next(_WDIR *dirp); static int dirent_mbstowcs_s( - size_t *pReturnValue, - wchar_t *wcstr, - size_t sizeInWords, - const char *mbstr, - size_t count); + size_t* pReturnValue, + wchar_t* wcstr, + size_t sizeInWords, + const char* mbstr, + size_t count); static int dirent_wcstombs_s( - size_t *pReturnValue, - char *mbstr, - size_t sizeInBytes, - const wchar_t *wcstr, - size_t count); + size_t* pReturnValue, + char* mbstr, + size_t sizeInBytes, + const wchar_t* wcstr, + size_t count); -static void dirent_set_errno (int error); +static void dirent_set_errno(int error); /* @@ -351,97 +355,104 @@ static void dirent_set_errno (int error); */ static _WDIR* _wopendir( - const wchar_t *dirname) + const wchar_t* dirname) { - _WDIR *dirp; - DWORD n; - wchar_t *p; - - /* Must have directory name */ - if (dirname == NULL || dirname[0] == '\0') { - dirent_set_errno (ENOENT); - return NULL; - } - - /* Allocate new _WDIR structure */ - dirp = (_WDIR*) malloc (sizeof (struct _WDIR)); - if (!dirp) { - return NULL; - } - - /* Reset _WDIR structure */ - dirp->handle = INVALID_HANDLE_VALUE; - dirp->patt = NULL; - dirp->cached = 0; + _WDIR *dirp; + DWORD n; + wchar_t* p; + + /* Must have directory name */ + if(dirname == NULL || dirname[0] == '\0') + { + dirent_set_errno(ENOENT); + return NULL; + } - /* - * Compute the length of full path plus zero terminator - * - * Note that on WinRT there's no way to convert relative paths - * into absolute paths, so just assume it is an absolute path. - */ + /* Allocate new _WDIR structure */ + dirp = (_WDIR*) malloc(sizeof(struct _WDIR)); + if(!dirp) + { + return NULL; + } + + /* Reset _WDIR structure */ + dirp->handle = INVALID_HANDLE_VALUE; + dirp->patt = NULL; + dirp->cached = 0; + + /* + * Compute the length of full path plus zero terminator + * + * Note that on WinRT there's no way to convert relative paths + * into absolute paths, so just assume it is an absolute path. + */ #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) - /* Desktop */ - n = GetFullPathNameW (dirname, 0, NULL, NULL); + /* Desktop */ + n = GetFullPathNameW(dirname, 0, NULL, NULL); #else - /* WinRT */ - n = wcslen (dirname); + /* WinRT */ + n = wcslen(dirname); #endif - /* Allocate room for absolute directory name and search pattern */ - dirp->patt = (wchar_t*) malloc (sizeof (wchar_t) * n + 16); - if (dirp->patt == NULL) { - goto exit_closedir; - } - - /* - * Convert relative directory name to an absolute one. This - * allows rewinddir() to function correctly even when current - * working directory is changed between opendir() and rewinddir(). - * - * Note that on WinRT there's no way to convert relative paths - * into absolute paths, so just assume it is an absolute path. - */ + /* Allocate room for absolute directory name and search pattern */ + dirp->patt = (wchar_t*) malloc(sizeof(wchar_t) * n + 16); + if(dirp->patt == NULL) + { + goto exit_closedir; + } + + /* + * Convert relative directory name to an absolute one. This + * allows rewinddir() to function correctly even when current + * working directory is changed between opendir() and rewinddir(). + * + * Note that on WinRT there's no way to convert relative paths + * into absolute paths, so just assume it is an absolute path. + */ #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) - /* Desktop */ - n = GetFullPathNameW (dirname, n, dirp->patt, NULL); - if (n <= 0) { - goto exit_closedir; - } + /* Desktop */ + n = GetFullPathNameW(dirname, n, dirp->patt, NULL); + if(n <= 0) + { + goto exit_closedir; + } #else - /* WinRT */ - wcsncpy_s (dirp->patt, n+1, dirname, n); + /* WinRT */ + wcsncpy_s(dirp->patt, n+1, dirname, n); #endif - /* Append search pattern \* to the directory name */ - p = dirp->patt + n; - switch (p[-1]) { + /* Append search pattern \* to the directory name */ + p = dirp->patt + n; + switch(p[-1]) + { case '\\': case '/': case ':': - /* Directory ends in path separator, e.g. c:\temp\ */ - /*NOP*/; - break; + /* Directory ends in path separator, e.g. c:\temp\ */ + /*NOP*/ + ; + break; default: - /* Directory name doesn't end in path separator */ - *p++ = '\\'; - } - *p++ = '*'; - *p = '\0'; - - /* Open directory stream and retrieve the first entry */ - if (!dirent_first (dirp)) { - goto exit_closedir; - } - - /* Success */ - return dirp; - - /* Failure */ + /* Directory name doesn't end in path separator */ + *p++ = '\\'; + } + *p++ = '*'; + *p = '\0'; + + /* Open directory stream and retrieve the first entry */ + if(!dirent_first(dirp)) + { + goto exit_closedir; + } + + /* Success */ + return dirp; + + /* Failure */ exit_closedir: - _wclosedir (dirp); - return NULL; + _wclosedir(dirp); + return NULL; } /* @@ -452,18 +463,18 @@ _wopendir( */ static struct _wdirent* _wreaddir( - _WDIR *dirp) + _WDIR *dirp) { - struct _wdirent *entry; + struct _wdirent *entry; - /* - * Read directory entry to buffer. We can safely ignore the return value - * as entry will be set to NULL in case of error. - */ - (void) _wreaddir_r (dirp, &dirp->ent, &entry); + /* + * Read directory entry to buffer. We can safely ignore the return value + * as entry will be set to NULL in case of error. + */ + (void) _wreaddir_r(dirp, &dirp->ent, &entry); - /* Return pointer to statically allocated directory entry */ - return entry; + /* Return pointer to statically allocated directory entry */ + return entry; } /* @@ -474,59 +485,68 @@ _wreaddir( */ static int _wreaddir_r( - _WDIR *dirp, - struct _wdirent *entry, - struct _wdirent **result) + _WDIR *dirp, + struct _wdirent *entry, + struct _wdirent **result) { - WIN32_FIND_DATAW *datap; - - /* Read next directory entry */ - datap = dirent_next (dirp); - if (datap) { - size_t n; - DWORD attr; - - /* - * Copy file name as wide-character string. If the file name is too - * long to fit in to the destination buffer, then truncate file name - * to PATH_MAX characters and zero-terminate the buffer. - */ - n = 0; - while (n < PATH_MAX && datap->cFileName[n] != 0) { - entry->d_name[n] = datap->cFileName[n]; - n++; - } - entry->d_name[n] = 0; - - /* Length of file name excluding zero terminator */ - entry->d_namlen = n; - - /* File type */ - attr = datap->dwFileAttributes; - if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) { - entry->d_type = DT_CHR; - } else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) { - entry->d_type = DT_DIR; - } else { - entry->d_type = DT_REG; - } - - /* Reset dummy fields */ - entry->d_ino = 0; - entry->d_off = 0; - entry->d_reclen = sizeof (struct _wdirent); + WIN32_FIND_DATAW *datap; - /* Set result address */ - *result = entry; + /* Read next directory entry */ + datap = dirent_next(dirp); + if(datap) + { + size_t n; + DWORD attr; - } else { + /* + * Copy file name as wide-character string. If the file name is too + * long to fit in to the destination buffer, then truncate file name + * to PATH_MAX characters and zero-terminate the buffer. + */ + n = 0; + while(n < PATH_MAX && datap->cFileName[n] != 0) + { + entry->d_name[n] = datap->cFileName[n]; + n++; + } + entry->d_name[n] = 0; - /* Return NULL to indicate end of directory */ - *result = NULL; + /* Length of file name excluding zero terminator */ + entry->d_namlen = n; + /* File type */ + attr = datap->dwFileAttributes; + if((attr & FILE_ATTRIBUTE_DEVICE) != 0) + { + entry->d_type = DT_CHR; + } + else if((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) + { + entry->d_type = DT_DIR; } + else + { + entry->d_type = DT_REG; + } + + /* Reset dummy fields */ + entry->d_ino = 0; + entry->d_off = 0; + entry->d_reclen = sizeof(struct _wdirent); + + /* Set result address */ + *result = entry; + + } + else + { - return /*OK*/0; + /* Return NULL to indicate end of directory */ + *result = NULL; + + } + + return /*OK*/0; } /* @@ -536,31 +556,35 @@ _wreaddir_r( */ static int _wclosedir( - _WDIR *dirp) + _WDIR *dirp) { - int ok; - if (dirp) { + int ok; + if(dirp) + { - /* Release search handle */ - if (dirp->handle != INVALID_HANDLE_VALUE) { - FindClose (dirp->handle); - } + /* Release search handle */ + if(dirp->handle != INVALID_HANDLE_VALUE) + { + FindClose(dirp->handle); + } - /* Release search pattern */ - free (dirp->patt); + /* Release search pattern */ + free(dirp->patt); - /* Release directory structure */ - free (dirp); - ok = /*success*/0; + /* Release directory structure */ + free(dirp); + ok = /*success*/0; - } else { + } + else + { - /* Invalid directory stream */ - dirent_set_errno (EBADF); - ok = /*failure*/-1; + /* Invalid directory stream */ + dirent_set_errno(EBADF); + ok = /*failure*/-1; - } - return ok; + } + return ok; } /* @@ -569,64 +593,70 @@ _wclosedir( */ static void _wrewinddir( - _WDIR* dirp) + _WDIR* dirp) { - if (dirp) { - /* Release existing search handle */ - if (dirp->handle != INVALID_HANDLE_VALUE) { - FindClose (dirp->handle); - } - - /* Open new search handle */ - dirent_first (dirp); + if(dirp) + { + /* Release existing search handle */ + if(dirp->handle != INVALID_HANDLE_VALUE) + { + FindClose(dirp->handle); } + + /* Open new search handle */ + dirent_first(dirp); + } } /* Get first directory entry (internal) */ static WIN32_FIND_DATAW* dirent_first( - _WDIR *dirp) + _WDIR *dirp) { - WIN32_FIND_DATAW *datap; - DWORD error; - - /* Open directory and retrieve the first entry */ - dirp->handle = FindFirstFileExW( - dirp->patt, FindExInfoStandard, &dirp->data, - FindExSearchNameMatch, NULL, 0); - if (dirp->handle != INVALID_HANDLE_VALUE) { - - /* a directory entry is now waiting in memory */ - datap = &dirp->data; - dirp->cached = 1; - - } else { - - /* Failed to open directory: no directory entry in memory */ - dirp->cached = 0; - datap = NULL; - - /* Set error code */ - error = GetLastError (); - switch (error) { - case ERROR_ACCESS_DENIED: - /* No read access to directory */ - dirent_set_errno (EACCES); - break; - - case ERROR_DIRECTORY: - /* Directory name is invalid */ - dirent_set_errno (ENOTDIR); - break; - - case ERROR_PATH_NOT_FOUND: - default: - /* Cannot find the file */ - dirent_set_errno (ENOENT); - } + WIN32_FIND_DATAW *datap; + DWORD error; + + /* Open directory and retrieve the first entry */ + dirp->handle = FindFirstFileExW( + dirp->patt, FindExInfoStandard, &dirp->data, + FindExSearchNameMatch, NULL, 0); + if(dirp->handle != INVALID_HANDLE_VALUE) + { + + /* a directory entry is now waiting in memory */ + datap = &dirp->data; + dirp->cached = 1; + + } + else + { + + /* Failed to open directory: no directory entry in memory */ + dirp->cached = 0; + datap = NULL; + + /* Set error code */ + error = GetLastError(); + switch(error) + { + case ERROR_ACCESS_DENIED: + /* No read access to directory */ + dirent_set_errno(EACCES); + break; + case ERROR_DIRECTORY: + /* Directory name is invalid */ + dirent_set_errno(ENOTDIR); + break; + + case ERROR_PATH_NOT_FOUND: + default: + /* Cannot find the file */ + dirent_set_errno(ENOENT); } - return datap; + + } + return datap; } /* @@ -636,38 +666,46 @@ dirent_first( */ static WIN32_FIND_DATAW* dirent_next( - _WDIR *dirp) + _WDIR *dirp) { - WIN32_FIND_DATAW *p; - - /* Get next directory entry */ - if (dirp->cached != 0) { - - /* A valid directory entry already in memory */ - p = &dirp->data; - dirp->cached = 0; - - } else if (dirp->handle != INVALID_HANDLE_VALUE) { - - /* Get the next directory entry from stream */ - if (FindNextFileW (dirp->handle, &dirp->data) != FALSE) { - /* Got a file */ - p = &dirp->data; - } else { - /* The very last entry has been processed or an error occurred */ - FindClose (dirp->handle); - dirp->handle = INVALID_HANDLE_VALUE; - p = NULL; - } + WIN32_FIND_DATAW *p; - } else { + /* Get next directory entry */ + if(dirp->cached != 0) + { - /* End of directory stream reached */ - p = NULL; + /* A valid directory entry already in memory */ + p = &dirp->data; + dirp->cached = 0; + } + else if(dirp->handle != INVALID_HANDLE_VALUE) + { + + /* Get the next directory entry from stream */ + if(FindNextFileW(dirp->handle, &dirp->data) != FALSE) + { + /* Got a file */ + p = &dirp->data; + } + else + { + /* The very last entry has been processed or an error occurred */ + FindClose(dirp->handle); + dirp->handle = INVALID_HANDLE_VALUE; + p = NULL; } - return p; + } + else + { + + /* End of directory stream reached */ + p = NULL; + + } + + return p; } /* @@ -675,55 +713,59 @@ dirent_next( */ static DIR* opendir( - const char *dirname) + const char* dirname) { - struct DIR *dirp; + struct DIR *dirp; - /* Must have directory name */ - if (dirname == NULL || dirname[0] == '\0') { - dirent_set_errno (ENOENT); - return NULL; - } + /* Must have directory name */ + if(dirname == NULL || dirname[0] == '\0') + { + dirent_set_errno(ENOENT); + return NULL; + } - /* Allocate memory for DIR structure */ - dirp = (DIR*) malloc (sizeof (struct DIR)); - if (!dirp) { - return NULL; - } - { - int error; - wchar_t wname[PATH_MAX + 1]; - size_t n; - - /* Convert directory name to wide-character string */ - error = dirent_mbstowcs_s( - &n, wname, PATH_MAX + 1, dirname, PATH_MAX + 1); - if (error) { - /* - * Cannot convert file name to wide-character string. This - * occurs if the string contains invalid multi-byte sequences or - * the output buffer is too small to contain the resulting - * string. - */ - goto exit_free; - } + /* Allocate memory for DIR structure */ + dirp = (DIR*) malloc(sizeof(struct DIR)); + if(!dirp) + { + return NULL; + } + { + int error; + wchar_t wname[PATH_MAX + 1]; + size_t n; + /* Convert directory name to wide-character string */ + error = dirent_mbstowcs_s( + &n, wname, PATH_MAX + 1, dirname, PATH_MAX + 1); + if(error) + { + /* + * Cannot convert file name to wide-character string. This + * occurs if the string contains invalid multi-byte sequences or + * the output buffer is too small to contain the resulting + * string. + */ + goto exit_free; + } - /* Open directory stream using wide-character name */ - dirp->wdirp = _wopendir (wname); - if (!dirp->wdirp) { - goto exit_free; - } + /* Open directory stream using wide-character name */ + dirp->wdirp = _wopendir(wname); + if(!dirp->wdirp) + { + goto exit_free; } - /* Success */ - return dirp; + } + + /* Success */ + return dirp; - /* Failure */ + /* Failure */ exit_free: - free (dirp); - return NULL; + free(dirp); + return NULL; } /* @@ -731,18 +773,18 @@ opendir( */ static struct dirent* readdir( - DIR *dirp) + DIR *dirp) { - struct dirent *entry; + struct dirent *entry; - /* - * Read directory entry to buffer. We can safely ignore the return value - * as entry will be set to NULL in case of error. - */ - (void) readdir_r (dirp, &dirp->ent, &entry); + /* + * Read directory entry to buffer. We can safely ignore the return value + * as entry will be set to NULL in case of error. + */ + (void) readdir_r(dirp, &dirp->ent, &entry); - /* Return pointer to statically allocated directory entry */ - return entry; + /* Return pointer to statically allocated directory entry */ + return entry; } /* @@ -753,88 +795,100 @@ readdir( */ static int readdir_r( - DIR *dirp, - struct dirent *entry, - struct dirent **result) + DIR *dirp, + struct dirent *entry, + struct dirent **result) { - WIN32_FIND_DATAW *datap; - - /* Read next directory entry */ - datap = dirent_next (dirp->wdirp); - if (datap) { - size_t n; - int error; - - /* Attempt to convert file name to multi-byte string */ - error = dirent_wcstombs_s( - &n, entry->d_name, PATH_MAX + 1, datap->cFileName, PATH_MAX + 1); - - /* - * If the file name cannot be represented by a multi-byte string, - * then attempt to use old 8+3 file name. This allows traditional - * Unix-code to access some file names despite of unicode - * characters, although file names may seem unfamiliar to the user. - * - * Be ware that the code below cannot come up with a short file - * name unless the file system provides one. At least - * VirtualBox shared folders fail to do this. - */ - if (error && datap->cAlternateFileName[0] != '\0') { - error = dirent_wcstombs_s( + WIN32_FIND_DATAW *datap; + + /* Read next directory entry */ + datap = dirent_next(dirp->wdirp); + if(datap) + { + size_t n; + int error; + + /* Attempt to convert file name to multi-byte string */ + error = dirent_wcstombs_s( + &n, entry->d_name, PATH_MAX + 1, datap->cFileName, PATH_MAX + 1); + + /* + * If the file name cannot be represented by a multi-byte string, + * then attempt to use old 8+3 file name. This allows traditional + * Unix-code to access some file names despite of unicode + * characters, although file names may seem unfamiliar to the user. + * + * Be ware that the code below cannot come up with a short file + * name unless the file system provides one. At least + * VirtualBox shared folders fail to do this. + */ + if(error && datap->cAlternateFileName[0] != '\0') + { + error = dirent_wcstombs_s( &n, entry->d_name, PATH_MAX + 1, datap->cAlternateFileName, PATH_MAX + 1); - } + } - if (!error) { - DWORD attr; - - /* Length of file name excluding zero terminator */ - entry->d_namlen = n - 1; - - /* File attributes */ - attr = datap->dwFileAttributes; - if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) { - entry->d_type = DT_CHR; - } else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) { - entry->d_type = DT_DIR; - } else { - entry->d_type = DT_REG; - } - - /* Reset dummy fields */ - entry->d_ino = 0; - entry->d_off = 0; - entry->d_reclen = sizeof (struct dirent); - - } else { - - /* - * Cannot convert file name to multi-byte string so construct - * an erroneous directory entry and return that. Note that - * we cannot return NULL as that would stop the processing - * of directory entries completely. - */ - entry->d_name[0] = '?'; - entry->d_name[1] = '\0'; - entry->d_namlen = 1; - entry->d_type = DT_UNKNOWN; - entry->d_ino = 0; - entry->d_off = -1; - entry->d_reclen = 0; + if(!error) + { + DWORD attr; + + /* Length of file name excluding zero terminator */ + entry->d_namlen = n - 1; + + /* File attributes */ + attr = datap->dwFileAttributes; + if((attr & FILE_ATTRIBUTE_DEVICE) != 0) + { + entry->d_type = DT_CHR; + } + else if((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) + { + entry->d_type = DT_DIR; + } + else + { + entry->d_type = DT_REG; + } + + /* Reset dummy fields */ + entry->d_ino = 0; + entry->d_off = 0; + entry->d_reclen = sizeof(struct dirent); - } + } + else + { - /* Return pointer to directory entry */ - *result = entry; + /* + * Cannot convert file name to multi-byte string so construct + * an erroneous directory entry and return that. Note that + * we cannot return NULL as that would stop the processing + * of directory entries completely. + */ + entry->d_name[0] = '?'; + entry->d_name[1] = '\0'; + entry->d_namlen = 1; + entry->d_type = DT_UNKNOWN; + entry->d_ino = 0; + entry->d_off = -1; + entry->d_reclen = 0; - } else { + } - /* No more directory entries */ - *result = NULL; + /* Return pointer to directory entry */ + *result = entry; - } + } + else + { + + /* No more directory entries */ + *result = NULL; + + } - return /*OK*/0; + return /*OK*/0; } /* @@ -842,26 +896,29 @@ readdir_r( */ static int closedir( - DIR *dirp) + DIR *dirp) { - int ok; - if (dirp) { + int ok; + if(dirp) + { - /* Close wide-character directory stream */ - ok = _wclosedir (dirp->wdirp); - dirp->wdirp = NULL; + /* Close wide-character directory stream */ + ok = _wclosedir(dirp->wdirp); + dirp->wdirp = NULL; - /* Release multi-byte character version */ - free (dirp); + /* Release multi-byte character version */ + free(dirp); - } else { + } + else + { - /* Invalid directory stream */ - dirent_set_errno (EBADF); - ok = /*failure*/-1; + /* Invalid directory stream */ + dirent_set_errno(EBADF); + ok = /*failure*/-1; - } - return ok; + } + return ok; } /* @@ -869,10 +926,10 @@ closedir( */ static void rewinddir( - DIR* dirp) + DIR* dirp) { - /* Rewind wide-character string directory stream */ - _wrewinddir (dirp->wdirp); + /* Rewind wide-character string directory stream */ + _wrewinddir(dirp->wdirp); } /* @@ -880,275 +937,314 @@ rewinddir( */ static int scandir( - const char *dirname, - struct dirent ***namelist, - int (*filter)(const struct dirent*), - int (*compare)(const struct dirent**, const struct dirent**)) + const char* dirname, + struct dirent ***namelist, + int (*filter)(const struct dirent*), + int (*compare)(const struct dirent**, const struct dirent**)) { - struct dirent **files = NULL; - size_t size = 0; - size_t allocated = 0; - const size_t init_size = 1; - DIR *dir = NULL; - struct dirent *entry; - struct dirent *tmp = NULL; - size_t i; - int result = 0; - - /* Open directory stream */ - dir = opendir (dirname); - if (dir) { - - /* Read directory entries to memory */ - while (1) { - - /* Enlarge pointer table to make room for another pointer */ - if (size >= allocated) { - void *p; - size_t num_entries; - - /* Compute number of entries in the enlarged pointer table */ - if (size < init_size) { - /* Allocate initial pointer table */ - num_entries = init_size; - } else { - /* Double the size */ - num_entries = size * 2; - } - - /* Allocate first pointer table or enlarge existing table */ - p = realloc (files, sizeof (void*) * num_entries); - if (p != NULL) { - /* Got the memory */ - files = (dirent**) p; - allocated = num_entries; - } else { - /* Out of memory */ - result = -1; - break; - } - - } - - /* Allocate room for temporary directory entry */ - if (tmp == NULL) { - tmp = (struct dirent*) malloc (sizeof (struct dirent)); - if (tmp == NULL) { - /* Cannot allocate temporary directory entry */ - result = -1; - break; - } - } - - /* Read directory entry to temporary area */ - if (readdir_r (dir, tmp, &entry) == /*OK*/0) { - - /* Did we get an entry? */ - if (entry != NULL) { - int pass; - - /* Determine whether to include the entry in result */ - if (filter) { - /* Let the filter function decide */ - pass = filter (tmp); - } else { - /* No filter function, include everything */ - pass = 1; - } - - if (pass) { - /* Store the temporary entry to pointer table */ - files[size++] = tmp; - tmp = NULL; - - /* Keep up with the number of files */ - result++; - } - - } else { - - /* - * End of directory stream reached => sort entries and - * exit. - */ - qsort (files, size, sizeof (void*), - (int (*) (const void*, const void*)) compare); - break; - - } - - } else { - /* Error reading directory entry */ - result = /*Error*/ -1; - break; - } + struct dirent **files = NULL; + size_t size = 0; + size_t allocated = 0; + const size_t init_size = 1; + DIR *dir = NULL; + struct dirent *entry; + struct dirent *tmp = NULL; + size_t i; + int result = 0; + + /* Open directory stream */ + dir = opendir(dirname); + if(dir) + { + + /* Read directory entries to memory */ + while(1) + { + /* Enlarge pointer table to make room for another pointer */ + if(size >= allocated) + { + void* p; + size_t num_entries; + + /* Compute number of entries in the enlarged pointer table */ + if(size < init_size) + { + /* Allocate initial pointer table */ + num_entries = init_size; + } + else + { + /* Double the size */ + num_entries = size * 2; } - } else { - /* Cannot open directory */ - result = /*Error*/ -1; - } + /* Allocate first pointer table or enlarge existing table */ + p = realloc(files, sizeof(void*) * num_entries); + if(p != NULL) + { + /* Got the memory */ + files = (dirent**) p; + allocated = num_entries; + } + else + { + /* Out of memory */ + result = -1; + break; + } - /* Release temporary directory entry */ - free (tmp); + } + + /* Allocate room for temporary directory entry */ + if(tmp == NULL) + { + tmp = (struct dirent*) malloc(sizeof(struct dirent)); + if(tmp == NULL) + { + /* Cannot allocate temporary directory entry */ + result = -1; + break; + } + } + + /* Read directory entry to temporary area */ + if(readdir_r(dir, tmp, &entry) == /*OK*/0) + { + + /* Did we get an entry? */ + if(entry != NULL) + { + int pass; + + /* Determine whether to include the entry in result */ + if(filter) + { + /* Let the filter function decide */ + pass = filter(tmp); + } + else + { + /* No filter function, include everything */ + pass = 1; + } + + if(pass) + { + /* Store the temporary entry to pointer table */ + files[size++] = tmp; + tmp = NULL; + + /* Keep up with the number of files */ + result++; + } - /* Release allocated memory on error */ - if (result < 0) { - for (i = 0; i < size; i++) { - free (files[i]); } - free (files); - files = NULL; - } + else + { + + /* + * End of directory stream reached => sort entries and + * exit. + */ + qsort(files, size, sizeof(void*), + (int (*)(const void*, const void*)) compare); + break; + + } + + } + else + { + /* Error reading directory entry */ + result = /*Error*/ -1; + break; + } - /* Close directory stream */ - if (dir) { - closedir (dir); } - /* Pass pointer table to caller */ - if (namelist) { - *namelist = files; + } + else + { + /* Cannot open directory */ + result = /*Error*/ -1; + } + + /* Release temporary directory entry */ + free(tmp); + + /* Release allocated memory on error */ + if(result < 0) + { + for(i = 0; i < size; i++) + { + free(files[i]); } - return result; + free(files); + files = NULL; + } + + /* Close directory stream */ + if(dir) + { + closedir(dir); + } + + /* Pass pointer table to caller */ + if(namelist) + { + *namelist = files; + } + return result; } /* Alphabetical sorting */ static int alphasort( - const struct dirent **a, const struct dirent **b) + const struct dirent **a, const struct dirent **b) { - return strcoll ((*a)->d_name, (*b)->d_name); + return strcoll((*a)->d_name, (*b)->d_name); } /* Sort versions */ static int versionsort( - const struct dirent **a, const struct dirent **b) + const struct dirent **a, const struct dirent **b) { - /* FIXME: implement strverscmp and use that */ - return alphasort (a, b); + /* FIXME: implement strverscmp and use that */ + return alphasort(a, b); } /* Convert multi-byte string to wide character string */ static int dirent_mbstowcs_s( - size_t *pReturnValue, - wchar_t *wcstr, - size_t sizeInWords, - const char *mbstr, - size_t count) + size_t* pReturnValue, + wchar_t* wcstr, + size_t sizeInWords, + const char* mbstr, + size_t count) { - int error; + int error; #if defined(_MSC_VER) && _MSC_VER >= 1400 - /* Microsoft Visual Studio 2005 or later */ - error = mbstowcs_s (pReturnValue, wcstr, sizeInWords, mbstr, count); + /* Microsoft Visual Studio 2005 or later */ + error = mbstowcs_s(pReturnValue, wcstr, sizeInWords, mbstr, count); #else - /* Older Visual Studio or non-Microsoft compiler */ - size_t n; + /* Older Visual Studio or non-Microsoft compiler */ + size_t n; - /* Convert to wide-character string (or count characters) */ - n = mbstowcs (wcstr, mbstr, sizeInWords); - if (!wcstr || n < count) { + /* Convert to wide-character string (or count characters) */ + n = mbstowcs(wcstr, mbstr, sizeInWords); + if(!wcstr || n < count) + { - /* Zero-terminate output buffer */ - if (wcstr && sizeInWords) { - if (n >= sizeInWords) { - n = sizeInWords - 1; - } - wcstr[n] = 0; - } + /* Zero-terminate output buffer */ + if(wcstr && sizeInWords) + { + if(n >= sizeInWords) + { + n = sizeInWords - 1; + } + wcstr[n] = 0; + } - /* Length of resulting multi-byte string WITH zero terminator */ - if (pReturnValue) { - *pReturnValue = n + 1; - } + /* Length of resulting multi-byte string WITH zero terminator */ + if(pReturnValue) + { + *pReturnValue = n + 1; + } - /* Success */ - error = 0; + /* Success */ + error = 0; - } else { + } + else + { - /* Could not convert string */ - error = 1; + /* Could not convert string */ + error = 1; - } + } #endif - return error; + return error; } /* Convert wide-character string to multi-byte string */ static int dirent_wcstombs_s( - size_t *pReturnValue, - char *mbstr, - size_t sizeInBytes, /* max size of mbstr */ - const wchar_t *wcstr, - size_t count) + size_t* pReturnValue, + char* mbstr, + size_t sizeInBytes, /* max size of mbstr */ + const wchar_t* wcstr, + size_t count) { - int error; + int error; #if defined(_MSC_VER) && _MSC_VER >= 1400 - /* Microsoft Visual Studio 2005 or later */ - error = wcstombs_s (pReturnValue, mbstr, sizeInBytes, wcstr, count); + /* Microsoft Visual Studio 2005 or later */ + error = wcstombs_s(pReturnValue, mbstr, sizeInBytes, wcstr, count); #else - /* Older Visual Studio or non-Microsoft compiler */ - size_t n; + /* Older Visual Studio or non-Microsoft compiler */ + size_t n; - /* Convert to multi-byte string (or count the number of bytes needed) */ - n = wcstombs (mbstr, wcstr, sizeInBytes); - if (!mbstr || n < count) { + /* Convert to multi-byte string (or count the number of bytes needed) */ + n = wcstombs(mbstr, wcstr, sizeInBytes); + if(!mbstr || n < count) + { - /* Zero-terminate output buffer */ - if (mbstr && sizeInBytes) { - if (n >= sizeInBytes) { - n = sizeInBytes - 1; - } - mbstr[n] = '\0'; - } + /* Zero-terminate output buffer */ + if(mbstr && sizeInBytes) + { + if(n >= sizeInBytes) + { + n = sizeInBytes - 1; + } + mbstr[n] = '\0'; + } - /* Length of resulting multi-bytes string WITH zero-terminator */ - if (pReturnValue) { - *pReturnValue = n + 1; - } + /* Length of resulting multi-bytes string WITH zero-terminator */ + if(pReturnValue) + { + *pReturnValue = n + 1; + } - /* Success */ - error = 0; + /* Success */ + error = 0; - } else { + } + else + { - /* Cannot convert string */ - error = 1; + /* Cannot convert string */ + error = 1; - } + } #endif - return error; + return error; } /* Set errno variable */ static void dirent_set_errno( - int error) + int error) { #if defined(_MSC_VER) && _MSC_VER >= 1400 - /* Microsoft Visual Studio 2005 and later */ - _set_errno (error); + /* Microsoft Visual Studio 2005 and later */ + _set_errno(error); #else - /* Non-Microsoft compiler or older Microsoft compiler */ - errno = error; + /* Non-Microsoft compiler or older Microsoft compiler */ + errno = error; #endif } diff --git a/plugins/ch376/ch376.c b/plugins/ch376/ch376.c index 38ecca80..1220e804 100644 --- a/plugins/ch376/ch376.c +++ b/plugins/ch376/ch376.c @@ -144,53 +144,53 @@ extern struct Library *SysBase; // Important: All values in all structures are stored in little-endian (either in 16 or 32 bit) struct FatDirInfo { - char DIR_Name[11]; - CH376_U8 DIR_Attr; - CH376_U8 DIR_NTRes; - CH376_U8 DIR_CrtTimeTenth; - CH376_U8 DIR_CrtTime[2]; - CH376_U8 DIR_CrtDate[2]; - CH376_U8 DIR_LstAccDate[2]; - CH376_U8 DIR_FstClusHI[2]; - CH376_U8 DIR_WrtTime[2]; - CH376_U8 DIR_WrtDate[2]; - CH376_U8 DIR_FstClusLO[2]; - CH376_U8 DIR_FileSize[4]; + char DIR_Name[11]; + CH376_U8 DIR_Attr; + CH376_U8 DIR_NTRes; + CH376_U8 DIR_CrtTimeTenth; + CH376_U8 DIR_CrtTime[2]; + CH376_U8 DIR_CrtDate[2]; + CH376_U8 DIR_LstAccDate[2]; + CH376_U8 DIR_FstClusHI[2]; + CH376_U8 DIR_WrtTime[2]; + CH376_U8 DIR_WrtDate[2]; + CH376_U8 DIR_FstClusLO[2]; + CH376_U8 DIR_FileSize[4]; }; struct MountInfo { - CH376_U8 MOUNT_DeviceType; - CH376_U8 MOUNT_RemovableMedia; - CH376_U8 MOUNT_Versions; - CH376_U8 MOUNT_DataFormatAndEtc; - CH376_U8 MOUNT_AdditionalLength; - CH376_U8 MOUNT_Reserved1; - CH376_U8 MOUNT_Reserved2; - CH376_U8 MOUNT_MiscFlag; - char MOUNT_VendorIdStr[8]; - char MOUNT_ProductIdStr[16]; - char MOUNT_ProductRevStr[4]; + CH376_U8 MOUNT_DeviceType; + CH376_U8 MOUNT_RemovableMedia; + CH376_U8 MOUNT_Versions; + CH376_U8 MOUNT_DataFormatAndEtc; + CH376_U8 MOUNT_AdditionalLength; + CH376_U8 MOUNT_Reserved1; + CH376_U8 MOUNT_Reserved2; + CH376_U8 MOUNT_MiscFlag; + char MOUNT_VendorIdStr[8]; + char MOUNT_ProductIdStr[16]; + char MOUNT_ProductRevStr[4]; }; struct DiskQuery { - CH376_U8 DISK_TotalSector[4]; - CH376_U8 DISK_FreeSector[4]; - CH376_U8 DISK_DiskFat; + CH376_U8 DISK_TotalSector[4]; + CH376_U8 DISK_FreeSector[4]; + CH376_U8 DISK_DiskFat; }; union CommandData { - char CMD_FileName[14]; // [W/O] CH376_CMD_SET_FILE_NAME - struct MountInfo CMD_MountInfo; // [R/O] CH376_CMD_DISK_MOUNT - struct FatDirInfo CMD_FatDirInfo; // [R/O] CH376_CMD_FILE_OPEN, CH376_CMD_FILE_ENUM_GO - struct DiskQuery CMD_DiskQuery; // [R/O] CH376_CMD_DISK_QUERY, CH376_CMD_DISK_CAPACITY - CH376_U8 CMD_FileSeek[4]; // [R/W] CH376_CMD_BYTE_LOCATE - CH376_U8 CMD_FileReadWrite[2]; // [W/O] CH376_CMD_BYTE_READ, CH376_CMD_BYTE_WRITE - CH376_U8 CMD_IOBuffer[255]; // [R/W] CH376_CMD_BYTE_READ, CH376_CMD_BYTE_RD_GO, CH376_CMD_BYTE_WRITE, CH376_CMD_BYTE_WR_GO - CH376_U8 CMD_CheckByte; // [R/W] CH376_CMD_CHECK_EXIST - CH376_U8 CMD_VAR32[4]; // [R/W] CH376_CMD_GET_FILE_SIZE, CH376_CMD_SET_FILE_SIZE + char CMD_FileName[14]; // [W/O] CH376_CMD_SET_FILE_NAME + struct MountInfo CMD_MountInfo; // [R/O] CH376_CMD_DISK_MOUNT + struct FatDirInfo CMD_FatDirInfo; // [R/O] CH376_CMD_FILE_OPEN, CH376_CMD_FILE_ENUM_GO + struct DiskQuery CMD_DiskQuery; // [R/O] CH376_CMD_DISK_QUERY, CH376_CMD_DISK_CAPACITY + CH376_U8 CMD_FileSeek[4]; // [R/W] CH376_CMD_BYTE_LOCATE + CH376_U8 CMD_FileReadWrite[2]; // [W/O] CH376_CMD_BYTE_READ, CH376_CMD_BYTE_WRITE + CH376_U8 CMD_IOBuffer[255]; // [R/W] CH376_CMD_BYTE_READ, CH376_CMD_BYTE_RD_GO, CH376_CMD_BYTE_WRITE, CH376_CMD_BYTE_WR_GO + CH376_U8 CMD_CheckByte; // [R/W] CH376_CMD_CHECK_EXIST + CH376_U8 CMD_VAR32[4]; // [R/W] CH376_CMD_GET_FILE_SIZE, CH376_CMD_SET_FILE_SIZE }; #pragma pack() @@ -201,61 +201,61 @@ union CommandData struct ch376 { - CH376_CONTEXT context; + CH376_CONTEXT context; - CH376_U8 command; - CH376_U8 command_status; + CH376_U8 command; + CH376_U8 command_status; - CH376_U8 interface_status; - CH376_U8 usb_mode; + CH376_U8 interface_status; + CH376_U8 usb_mode; - union CommandData cmd_data; - CH376_U8 nb_bytes_in_cmd_data; - CH376_U8 pos_rw_in_cmd_data; + union CommandData cmd_data; + CH376_U8 nb_bytes_in_cmd_data; + CH376_U8 pos_rw_in_cmd_data; - CH376_U16 bytes_to_read_write; + CH376_U16 bytes_to_read_write; - CH376_LOCK root_dir_lock; - CH376_LOCK current_dir_lock; - CH376_FILE current_file; - CH376_DIR current_directory_browsing; + CH376_LOCK root_dir_lock; + CH376_LOCK current_dir_lock; + CH376_FILE current_file; + CH376_DIR current_directory_browsing; - CH376_BOOL current_file_is_directory; - char dir_pattern[14]; + CH376_BOOL current_file_is_directory; + char dir_pattern[14]; - char *sdcard_drive_path; - char *usb_drive_path; + char* sdcard_drive_path; + char* usb_drive_path; }; /* /// */ /* /// "CH376 private prototypes" */ -static char *clone_string(const char *string); +static char* clone_string(const char* string); static void clear_structure(struct ch376 *ch376); static void cancel_all_io(struct ch376 *ch376); static int normalize_char(char c); -static const char * normalize_file_name(const char *file_name, char *normalized_file_name); -static const char * trim_file_name(const char *file_name, char *trimmed_file_name); +static const char* normalize_file_name(const char* file_name, char* normalized_file_name); +static const char* trim_file_name(const char* file_name, char* trimmed_file_name); static void file_read_chunk(struct ch376 *ch376); static void file_write_chunk(struct ch376 *ch376); -static CH376_BOOL pattern_match(const char *pattern, const char *str); -static const char * normalize_pattern(const char *pattern, char *normalized_pattern); +static CH376_BOOL pattern_match(const char* pattern, const char* str); +static const char* normalize_pattern(const char* pattern, char* normalized_pattern); /* /// */ /* /// "Portable operating system-dependent prototypes" */ // Allocate "size" byte of memory -static void * system_alloc_mem(int size); +static void* system_alloc_mem(int size); // Free memory previously allocated with system_alloc_mem // It is safe to call it with NULL -static void system_free_mem(void *ptr); +static void system_free_mem(void* ptr); // Initialize the operating system dependent context // User data may be used if external data is required for such initialization -static CH376_BOOL system_init_context(CH376_CONTEXT *context, UNUSED void *user_data); +static CH376_BOOL system_init_context(CH376_CONTEXT *context, UNUSED void* user_data); // Release the operating system dependent context previously initialized by system_init_context static void system_clean_context(CH376_CONTEXT *context); @@ -265,7 +265,7 @@ static CH376_BOOL system_get_disk_info(CH376_CONTEXT *context, CH376_LOCK root_l // Try to lock the directory from the provided lock location and return an associated lock // Return 0 if a directory could not be locked (not a directory or not existing) -static CH376_LOCK system_obtain_directory_lock(CH376_CONTEXT *context, const char *dir_path, CH376_LOCK root_lock); +static CH376_LOCK system_obtain_directory_lock(CH376_CONTEXT *context, const char* dir_path, CH376_LOCK root_lock); // Release a lock previously obtained from system_obtain_directory_lock // It is safe to call it with a 0 @@ -275,15 +275,15 @@ static void system_release_directory_lock(CH376_CONTEXT *context, CH376_LOCK dir static CH376_LOCK system_clone_directory_lock(CH376_CONTEXT *context, CH376_LOCK dir_lock); // Create a new directory -static CH376_LOCK system_create_directory(CH376_CONTEXT *context, const char *dir_path, CH376_LOCK root_lock); +static CH376_LOCK system_create_directory(CH376_CONTEXT *context, const char* dir_path, CH376_LOCK root_lock); // Return a file handle corresponding to the given file located in the provited directory lock // Return 0 if the file could not be found -static CH376_FILE system_file_open_existing(CH376_CONTEXT *context, const char *file_name, CH376_LOCK root_lock); +static CH376_FILE system_file_open_existing(CH376_CONTEXT *context, const char* file_name, CH376_LOCK root_lock); // Create a file in the provited directory lock and return its file handle // Return 0 if the file could not be created -static CH376_FILE system_file_open_new(CH376_CONTEXT *context, const char *file_name, CH376_LOCK root_lock); +static CH376_FILE system_file_open_new(CH376_CONTEXT *context, const char* file_name, CH376_LOCK root_lock); // Close a file opened with system_file_open_existing or system_file_open_new static void system_file_close(CH376_CONTEXT *context, CH376_FILE file); @@ -292,13 +292,13 @@ static void system_file_close(CH376_CONTEXT *context, CH376_FILE file); static CH376_S32 system_file_seek(CH376_CONTEXT *context, CH376_FILE file, int pos); // Read a part of a file -static CH376_S32 system_file_read(CH376_CONTEXT *context, CH376_FILE file, void *buffer, CH376_S32 size); +static CH376_S32 system_file_read(CH376_CONTEXT *context, CH376_FILE file, void* buffer, CH376_S32 size); // Write some data into a file -static CH376_S32 system_file_write(CH376_CONTEXT *context, CH376_FILE file, void *buffer, CH376_S32 size); +static CH376_S32 system_file_write(CH376_CONTEXT *context, CH376_FILE file, void* buffer, CH376_S32 size); // Delete a file -static CH376_BOOL system_file_delete(CH376_CONTEXT *context, const char *file_name, CH376_LOCK root_lock); +static CH376_BOOL system_file_delete(CH376_CONTEXT *context, const char* file_name, CH376_LOCK root_lock); // Delete a directory static CH376_BOOL system_directory_delete(CH376_CONTEXT *context, CH376_LOCK root_lock); @@ -308,7 +308,7 @@ static CH376_BOOL system_directory_delete(CH376_CONTEXT *context, CH376_LOCK roo static CH376_DIR system_start_examine_directory(CH376_CONTEXT *context, CH376_LOCK dir_lock); // Get the next entry from a directory on which a examine session was started using system_start_examine_directory -static CH376_BOOL system_go_examine_directory(CH376_CONTEXT *context, CH376_LOCK dir_lock, CH376_DIR fib, struct FatDirInfo *dir_info, char *pattern); +static CH376_BOOL system_go_examine_directory(CH376_CONTEXT *context, CH376_LOCK dir_lock, CH376_DIR fib, struct FatDirInfo *dir_info, char* pattern); // Finish a directory examine session (release all related resources) static void system_finish_examine_directory(CH376_CONTEXT *context, CH376_DIR fib); @@ -332,17 +332,17 @@ static CH376_S32 system_get_file_offset(CH376_CONTEXT *context, CH376_FILE file) #define dbg_printf(...) #endif -static void * system_alloc_mem(int size) +static void* system_alloc_mem(int size) { - return AllocVec(size, MEMF_ANY); + return AllocVec(size, MEMF_ANY); } -static void system_free_mem(void *ptr) +static void system_free_mem(void* ptr) { - FreeVec(ptr); + FreeVec(ptr); } -static CH376_BOOL system_init_context(CH376_CONTEXT *context, UNUSED void *user_data) +static CH376_BOOL system_init_context(CH376_CONTEXT *context, UNUSED void* user_data) { context->DOSBase = OpenLibrary(DOSNAME, 0L); return (context->DOSBase != NULL); @@ -356,342 +356,342 @@ static void system_clean_context(CH376_CONTEXT *context) static CH376_BOOL system_get_disk_info(CH376_CONTEXT *context, CH376_LOCK root_lock, struct DiskQuery *disk_info) { - struct Library *DOSBase = context->DOSBase; - BOOL got_info = CH376_FALSE; + struct Library *DOSBase = context->DOSBase; + BOOL got_info = CH376_FALSE; - if(disk_info) - { - struct InfoData *info = system_alloc_mem(sizeof(struct InfoData)); + if(disk_info) + { + struct InfoData *info = system_alloc_mem(sizeof(struct InfoData)); - if(info) - { - if(Info(root_lock, info) == DOSTRUE) - { - QUAD total_sector = (info->id_NumBlocks * info->id_BytesPerBlock) / 512; - QUAD free_sector = ((info->id_NumBlocks - info->id_NumBlocksUsed) * info->id_BytesPerBlock) / 512; + if(info) + { + if(Info(root_lock, info) == DOSTRUE) + { + QUAD total_sector = (info->id_NumBlocks * info->id_BytesPerBlock) / 512; + QUAD free_sector = ((info->id_NumBlocks - info->id_NumBlocksUsed) * info->id_BytesPerBlock) / 512; - disk_info->DISK_TotalSector[0] = (total_sector & 0x000000ff) >> 0; - disk_info->DISK_TotalSector[1] = (total_sector & 0x0000ff00) >> 8; - disk_info->DISK_TotalSector[2] = (total_sector & 0x00ff0000) >> 16; - disk_info->DISK_TotalSector[3] = (total_sector & 0xff000000) >> 24; + disk_info->DISK_TotalSector[0] = (total_sector & 0x000000ff) >> 0; + disk_info->DISK_TotalSector[1] = (total_sector & 0x0000ff00) >> 8; + disk_info->DISK_TotalSector[2] = (total_sector & 0x00ff0000) >> 16; + disk_info->DISK_TotalSector[3] = (total_sector & 0xff000000) >> 24; - disk_info->DISK_FreeSector[0] = (free_sector & 0x000000ff) >> 0; - disk_info->DISK_FreeSector[1] = (free_sector & 0x0000ff00) >> 8; - disk_info->DISK_FreeSector[2] = (free_sector & 0x00ff0000) >> 16; - disk_info->DISK_FreeSector[3] = (free_sector & 0xff000000) >> 24; + disk_info->DISK_FreeSector[0] = (free_sector & 0x000000ff) >> 0; + disk_info->DISK_FreeSector[1] = (free_sector & 0x0000ff00) >> 8; + disk_info->DISK_FreeSector[2] = (free_sector & 0x00ff0000) >> 16; + disk_info->DISK_FreeSector[3] = (free_sector & 0xff000000) >> 24; - disk_info->DISK_DiskFat = 0x0c; // FAT32? + disk_info->DISK_DiskFat = 0x0c; // FAT32? - got_info = TRUE; - } - system_free_mem(info); - } + got_info = TRUE; + } + system_free_mem(info); } + } - return got_info; + return got_info; } -static CH376_LOCK system_obtain_directory_lock(CH376_CONTEXT *context, const char *dir_path, CH376_LOCK root_lock) +static CH376_LOCK system_obtain_directory_lock(CH376_CONTEXT *context, const char* dir_path, CH376_LOCK root_lock) { - struct Library *DOSBase = context->DOSBase; - BPTR lock; - BPTR old_lock = (BPTR)0; - - dbg_printf("system_obtain_directory_lock: %s\n", dir_path); + struct Library *DOSBase = context->DOSBase; + BPTR lock; + BPTR old_lock = (BPTR)0; - if(root_lock) - { - old_lock = CurrentDir(root_lock); - } + dbg_printf("system_obtain_directory_lock: %s\n", dir_path); - lock = Lock(dir_path, SHARED_LOCK); + if(root_lock) + { + old_lock = CurrentDir(root_lock); + } - if(lock != (BPTR)0) - { - struct FileInfoBlock *fib = AllocDosObject(DOS_FIB, NULL); + lock = Lock(dir_path, SHARED_LOCK); - if(fib) - { - if(Examine(lock, fib) == DOSFALSE || fib->fib_DirEntryType < 0) - { - UnLock(lock); - lock = (BPTR)0; - } - FreeDosObject(DOS_FIB, fib); - } - } + if(lock != (BPTR)0) + { + struct FileInfoBlock *fib = AllocDosObject(DOS_FIB, NULL); - if(old_lock) + if(fib) { - CurrentDir(old_lock); + if(Examine(lock, fib) == DOSFALSE || fib->fib_DirEntryType < 0) + { + UnLock(lock); + lock = (BPTR)0; + } + FreeDosObject(DOS_FIB, fib); } + } + + if(old_lock) + { + CurrentDir(old_lock); + } - return lock; + return lock; } static void system_release_directory_lock(CH376_CONTEXT *context, CH376_LOCK dir_lock) { - struct Library *DOSBase = context->DOSBase; - UnLock(dir_lock); + struct Library *DOSBase = context->DOSBase; + UnLock(dir_lock); } static CH376_LOCK system_clone_directory_lock(CH376_CONTEXT *context, CH376_LOCK dir_lock) { - struct Library *DOSBase = context->DOSBase; - return DupLock(dir_lock); + struct Library *DOSBase = context->DOSBase; + return DupLock(dir_lock); } -static CH376_LOCK system_create_directory(CH376_CONTEXT *context, const char *dir_path, CH376_LOCK root_lock) +static CH376_LOCK system_create_directory(CH376_CONTEXT *context, const char* dir_path, CH376_LOCK root_lock) { - struct Library *DOSBase = context->DOSBase; - BPTR lock; - BPTR old_lock = (BPTR)0; + struct Library *DOSBase = context->DOSBase; + BPTR lock; + BPTR old_lock = (BPTR)0; - dbg_printf("system_create_directory: %s\n", dir_path); + dbg_printf("system_create_directory: %s\n", dir_path); - if(root_lock) - { - old_lock = CurrentDir(root_lock); - } + if(root_lock) + { + old_lock = CurrentDir(root_lock); + } - lock = CreateDir(dir_path); + lock = CreateDir(dir_path); - if(old_lock) - { - CurrentDir(old_lock); - } + if(old_lock) + { + CurrentDir(old_lock); + } - return lock; + return lock; } static BPTR file_open(CH376_CONTEXT *context, CONST_STRPTR file_name, BPTR root_lock, LONG mode) { - struct Library *DOSBase = context->DOSBase; - BPTR old_lock = (BPTR)0; - BPTR file; + struct Library *DOSBase = context->DOSBase; + BPTR old_lock = (BPTR)0; + BPTR file; - if(root_lock) - { - old_lock = CurrentDir(root_lock); - } + if(root_lock) + { + old_lock = CurrentDir(root_lock); + } - file = Open(file_name, mode); + file = Open(file_name, mode); - if(old_lock) - { - CurrentDir(old_lock); - } + if(old_lock) + { + CurrentDir(old_lock); + } - return file; + return file; } -static CH376_FILE system_file_open_existing(CH376_CONTEXT *context, const char *file_name, CH376_LOCK root_lock) +static CH376_FILE system_file_open_existing(CH376_CONTEXT *context, const char* file_name, CH376_LOCK root_lock) { - return file_open(context, file_name, root_lock, MODE_OLDFILE); + return file_open(context, file_name, root_lock, MODE_OLDFILE); } -static CH376_FILE system_file_open_new(CH376_CONTEXT *context, const char *file_name, CH376_LOCK root_lock) +static CH376_FILE system_file_open_new(CH376_CONTEXT *context, const char* file_name, CH376_LOCK root_lock) { - return file_open(context, file_name, root_lock, MODE_NEWFILE); + return file_open(context, file_name, root_lock, MODE_NEWFILE); } static void system_file_close(CH376_CONTEXT *context, CH376_FILE file) { - struct Library *DOSBase = context->DOSBase; - Close(file); + struct Library *DOSBase = context->DOSBase; + Close(file); } static CH376_S32 system_file_seek(CH376_CONTEXT *context, CH376_FILE file, int pos) { - struct Library *DOSBase = context->DOSBase; + struct Library *DOSBase = context->DOSBase; - dbg_printf("system_file_seek trying to seek to position %d\n", pos); + dbg_printf("system_file_seek trying to seek to position %d\n", pos); - if(file) - return Seek(file, pos, OFFSET_BEGINNING); - else - return -1; + if(file) + return Seek(file, pos, OFFSET_BEGINNING); + else + return -1; } -static CH376_S32 system_file_read(CH376_CONTEXT *context, CH376_FILE file, void *buffer, CH376_S32 size) +static CH376_S32 system_file_read(CH376_CONTEXT *context, CH376_FILE file, void* buffer, CH376_S32 size) { - struct Library *DOSBase = context->DOSBase; + struct Library *DOSBase = context->DOSBase; - dbg_printf("system_file_read trying to read %d bytes\n", size); + dbg_printf("system_file_read trying to read %d bytes\n", size); - if(file) - return Read(file, buffer, size); - else - return -1; + if(file) + return Read(file, buffer, size); + else + return -1; } -static CH376_S32 system_file_write(CH376_CONTEXT *context, CH376_FILE file, void *buffer, CH376_S32 size) +static CH376_S32 system_file_write(CH376_CONTEXT *context, CH376_FILE file, void* buffer, CH376_S32 size) { - struct Library *DOSBase = context->DOSBase; + struct Library *DOSBase = context->DOSBase; - dbg_printf("system_file_write trying to write %d bytes\n", size); + dbg_printf("system_file_write trying to write %d bytes\n", size); - if(file) - return Write(file, buffer, size); - else - return -1; + if(file) + return Write(file, buffer, size); + else + return -1; } -static CH376_BOOL system_file_delete(CH376_CONTEXT *context, const char *file_name, CH376_LOCK root_lock) +static CH376_BOOL system_file_delete(CH376_CONTEXT *context, const char* file_name, CH376_LOCK root_lock) { - struct Library *DOSBase = context->DOSBase; - BPTR old_lock = (BPTR)0; - LONG err; + struct Library *DOSBase = context->DOSBase; + BPTR old_lock = (BPTR)0; + LONG err; - if(root_lock) - { - old_lock = CurrentDir(root_lock); - } + if(root_lock) + { + old_lock = CurrentDir(root_lock); + } - err = DeleteFile(file_name); + err = DeleteFile(file_name); - if(old_lock) - { - CurrentDir(old_lock); - } + if(old_lock) + { + CurrentDir(old_lock); + } - return (err != 0); + return (err != 0); } static CH376_BOOL system_directory_delete(CH376_CONTEXT *context, CH376_LOCK root_lock) { - // FIXME - struct Library *DOSBase = context->DOSBase; + // FIXME + struct Library *DOSBase = context->DOSBase; - dbg_printf("system_directory_delete: %s\n", root_lock); + dbg_printf("system_directory_delete: %s\n", root_lock); - if(root_lock) - return (DeleteFile(root_lock) != 0); + if(root_lock) + return (DeleteFile(root_lock) != 0); - return CH376_FALSE; + return CH376_FALSE; } static CH376_DIR system_start_examine_directory(CH376_CONTEXT *context, CH376_LOCK dir_lock) { - struct Library *DOSBase = context->DOSBase; - struct FileInfoBlock *fib = AllocDosObject(DOS_FIB, NULL); + struct Library *DOSBase = context->DOSBase; + struct FileInfoBlock *fib = AllocDosObject(DOS_FIB, NULL); - if(fib) + if(fib) + { + if(Examine(dir_lock, fib) == DOSFALSE) { - if(Examine(dir_lock, fib) == DOSFALSE) - { - FreeDosObject(DOS_FIB, fib); - fib = NULL; - } + FreeDosObject(DOS_FIB, fib); + fib = NULL; } + } - return fib; + return fib; } -static CH376_BOOL system_go_examine_directory(CH376_CONTEXT *context, CH376_LOCK dir_lock, CH376_DIR fib, struct FatDirInfo *dir_info, char *pattern) +static CH376_BOOL system_go_examine_directory(CH376_CONTEXT *context, CH376_LOCK dir_lock, CH376_DIR fib, struct FatDirInfo *dir_info, char* pattern) { - struct Library *DOSBase = context->DOSBase; - BOOL is_done = FALSE; + struct Library *DOSBase = context->DOSBase; + BOOL is_done = FALSE; - if(fib) while(!is_done && ExNext(dir_lock, fib) == DOSTRUE) + if(fib) while(!is_done && ExNext(dir_lock, fib) == DOSTRUE) { - if(normalize_file_name(fib->fib_FileName, dir_info->DIR_Name) && pattern_match(pattern, dir_info->DIR_Name)) - { - dir_info->DIR_Attr = 0; - - if(fib->fib_DirEntryType > 0) - dir_info->DIR_Attr |= DIR_ATTR_DIRECTORY; - if((fib->fib_Protection & FIBF_WRITE) != 0) - dir_info->DIR_Attr |= DIR_ATTR_READ_ONLY; - if((fib->fib_Protection & FIBF_ARCHIVE) == 0) - dir_info->DIR_Attr |= DIR_ATTR_ARCHIVE; - //if(fib->fib_Protection & FIBF_DELETE) - //if(fib->fib_Protection & FIBF_EXECUTE) - //if(fib->fib_Protection & FIBF_READ) - //if(fib->fib_Protection & FIBF_PURE) - //if(fib->fib_Protection & FIBF_SCRIPT) - dbg_printf("system_go_examine_directory defined file attributes: %d\n", dir_info->DIR_Attr); - - dir_info->DIR_NTRes = 0; - dir_info->DIR_CrtTimeTenth = 0; - dir_info->DIR_CrtTime[0] = 0; - dir_info->DIR_CrtTime[1] = 0; - dir_info->DIR_CrtDate[0] = 0; - dir_info->DIR_CrtDate[1] = 0; - dir_info->DIR_LstAccDate[0] = 0; - dir_info->DIR_LstAccDate[1] = 0; - dir_info->DIR_FstClusHI[0] = 0; - dir_info->DIR_FstClusHI[1] = 0; - dir_info->DIR_WrtTime[0] = 0; - dir_info->DIR_WrtTime[1] = 0; - dir_info->DIR_WrtDate[0] = 0; - dir_info->DIR_WrtDate[1] = 0; - dir_info->DIR_FstClusLO[0] = 0; - dir_info->DIR_FstClusLO[1] = 0; - dir_info->DIR_FileSize[0] = (fib->fib_Size & 0x000000ff) >> 0; - dir_info->DIR_FileSize[1] = (fib->fib_Size & 0x0000ff00) >> 8; - dir_info->DIR_FileSize[2] = (fib->fib_Size & 0x00ff0000) >> 16; - dir_info->DIR_FileSize[3] = (fib->fib_Size & 0xff000000) >> 24; - - is_done = TRUE; - } + if(normalize_file_name(fib->fib_FileName, dir_info->DIR_Name) && pattern_match(pattern, dir_info->DIR_Name)) + { + dir_info->DIR_Attr = 0; + + if(fib->fib_DirEntryType > 0) + dir_info->DIR_Attr |= DIR_ATTR_DIRECTORY; + if((fib->fib_Protection & FIBF_WRITE) != 0) + dir_info->DIR_Attr |= DIR_ATTR_READ_ONLY; + if((fib->fib_Protection & FIBF_ARCHIVE) == 0) + dir_info->DIR_Attr |= DIR_ATTR_ARCHIVE; + //if(fib->fib_Protection & FIBF_DELETE) + //if(fib->fib_Protection & FIBF_EXECUTE) + //if(fib->fib_Protection & FIBF_READ) + //if(fib->fib_Protection & FIBF_PURE) + //if(fib->fib_Protection & FIBF_SCRIPT) + dbg_printf("system_go_examine_directory defined file attributes: %d\n", dir_info->DIR_Attr); + + dir_info->DIR_NTRes = 0; + dir_info->DIR_CrtTimeTenth = 0; + dir_info->DIR_CrtTime[0] = 0; + dir_info->DIR_CrtTime[1] = 0; + dir_info->DIR_CrtDate[0] = 0; + dir_info->DIR_CrtDate[1] = 0; + dir_info->DIR_LstAccDate[0] = 0; + dir_info->DIR_LstAccDate[1] = 0; + dir_info->DIR_FstClusHI[0] = 0; + dir_info->DIR_FstClusHI[1] = 0; + dir_info->DIR_WrtTime[0] = 0; + dir_info->DIR_WrtTime[1] = 0; + dir_info->DIR_WrtDate[0] = 0; + dir_info->DIR_WrtDate[1] = 0; + dir_info->DIR_FstClusLO[0] = 0; + dir_info->DIR_FstClusLO[1] = 0; + dir_info->DIR_FileSize[0] = (fib->fib_Size & 0x000000ff) >> 0; + dir_info->DIR_FileSize[1] = (fib->fib_Size & 0x0000ff00) >> 8; + dir_info->DIR_FileSize[2] = (fib->fib_Size & 0x00ff0000) >> 16; + dir_info->DIR_FileSize[3] = (fib->fib_Size & 0xff000000) >> 24; + + is_done = TRUE; + } } - return is_done; + return is_done; } static void system_finish_examine_directory(CH376_CONTEXT *context, CH376_DIR fib) { - struct Library *DOSBase = context->DOSBase; + struct Library *DOSBase = context->DOSBase; - if(fib) - { - FreeDosObject(DOS_FIB, fib); - } + if(fib) + { + FreeDosObject(DOS_FIB, fib); + } } static CH376_S32 system_get_file_size(CH376_CONTEXT *context, CH376_FILE file) { - struct Library *DOSBase = context->DOSBase; - struct FileInfoBlock *fib = AllocDosObject(DOS_FIB, NULL); - CH376_S32 file_size = 0xffffffff; + struct Library *DOSBase = context->DOSBase; + struct FileInfoBlock *fib = AllocDosObject(DOS_FIB, NULL); + CH376_S32 file_size = 0xffffffff; - if (fib) + if(fib) + { + if(file) { - if (file) - { - if ( ExamineFH(file, &fib) ) - { - file_size = fib->fib_Size; - } - else - { - dbg_printf("system_get_file_size: error\n"); - } - } - else - { - dbg_printf("system_get_file_size: no file handle\n"); - } - - FreeDosObject(DOS_FIB, fib); + if(ExamineFH(file, &fib)) + { + file_size = fib->fib_Size; + } + else + { + dbg_printf("system_get_file_size: error\n"); + } + } + else + { + dbg_printf("system_get_file_size: no file handle\n"); } - return file_size; + FreeDosObject(DOS_FIB, fib); + } + + return file_size; } static CH376_S32 system_get_file_offset(CH376_CONTEXT *context, CH376_FILE file) { - CH376_S32 file_offset = 0xffffffff; + CH376_S32 file_offset = 0xffffffff; - if (file) - { - dbg_printf("system_get_file_offset: unsupported error\n"); - } - else - dbg_printf("system_get_file_offset: no file handle\n"); + if(file) + { + dbg_printf("system_get_file_offset: unsupported error\n"); + } + else + dbg_printf("system_get_file_offset: no file handle\n"); - return file_offset; + return file_offset; } /* /// */ @@ -703,360 +703,360 @@ static CH376_S32 system_get_file_offset(CH376_CONTEXT *context, CH376_FILE file) #ifdef DEBUG_CH376 static void dbg_printf(LPCTSTR str, ...) { - TCHAR buffer[256]; + TCHAR buffer[256]; - va_list args; - va_start(args, str); - _vsnprintf_s(buffer, sizeof(buffer) - 1, sizeof(buffer) - 1, str, args); - OutputDebugString(buffer); - va_end(args); + va_list args; + va_start(args, str); + _vsnprintf_s(buffer, sizeof(buffer) - 1, sizeof(buffer) - 1, str, args); + OutputDebugString(buffer); + va_end(args); } #else #define dbg_printf(...) #endif -static void * system_alloc_mem(int size) +static void* system_alloc_mem(int size) { - return GlobalAlloc(GMEM_FIXED, size); + return GlobalAlloc(GMEM_FIXED, size); } -static void system_free_mem(void *ptr) +static void system_free_mem(void* ptr) { - GlobalFree(ptr); + GlobalFree(ptr); } -static CH376_BOOL system_init_context(CH376_CONTEXT *context, UNUSED void *user_data) +static CH376_BOOL system_init_context(CH376_CONTEXT *context, UNUSED void* user_data) { - // Nothing to do? - return CH376_TRUE; + // Nothing to do? + return CH376_TRUE; }; static void system_clean_context(CH376_CONTEXT *context) { - // Nothing to do? + // Nothing to do? } static CH376_BOOL system_get_disk_info(CH376_CONTEXT *context, CH376_LOCK root_lock, struct DiskQuery *disk_info) { - BOOL got_info = FALSE; - char volume[4]; - DWORD sectors_per_cluster; - DWORD bytes_per_sector; - DWORD number_of_free_clusters; - DWORD total_number_of_clusters; + BOOL got_info = FALSE; + char volume[4]; + DWORD sectors_per_cluster; + DWORD bytes_per_sector; + DWORD number_of_free_clusters; + DWORD total_number_of_clusters; - //@iss volume[0] = (char)(PathGetDriveNumber(root_lock->path) + 'A'); - volume[0] = ((char*)root_lock->path)[0] & 0xdf; - volume[1] = ':'; - volume[2] = '\\'; - volume[3] = '\0'; + //@iss volume[0] = (char)(PathGetDriveNumber(root_lock->path) + 'A'); + volume[0] = ((char*)root_lock->path)[0] & 0xdf; + volume[1] = ':'; + volume[2] = '\\'; + volume[3] = '\0'; - if(GetDiskFreeSpace(volume, §ors_per_cluster, &bytes_per_sector, &number_of_free_clusters, &total_number_of_clusters)) - { - INT64 total_sector = (total_number_of_clusters * sectors_per_cluster * bytes_per_sector) / 512; - INT64 free_sector = (number_of_free_clusters * sectors_per_cluster * bytes_per_sector) / 512; + if(GetDiskFreeSpace(volume, §ors_per_cluster, &bytes_per_sector, &number_of_free_clusters, &total_number_of_clusters)) + { + INT64 total_sector = (total_number_of_clusters * sectors_per_cluster * bytes_per_sector) / 512; + INT64 free_sector = (number_of_free_clusters * sectors_per_cluster * bytes_per_sector) / 512; - disk_info->DISK_TotalSector[0] = (INT8)((total_sector & 0x000000ff) >> 0); - disk_info->DISK_TotalSector[1] = (INT8)((total_sector & 0x0000ff00) >> 8); - disk_info->DISK_TotalSector[2] = (INT8)((total_sector & 0x00ff0000) >> 16); - disk_info->DISK_TotalSector[3] = (INT8)((total_sector & 0xff000000) >> 24); + disk_info->DISK_TotalSector[0] = (INT8)((total_sector & 0x000000ff) >> 0); + disk_info->DISK_TotalSector[1] = (INT8)((total_sector & 0x0000ff00) >> 8); + disk_info->DISK_TotalSector[2] = (INT8)((total_sector & 0x00ff0000) >> 16); + disk_info->DISK_TotalSector[3] = (INT8)((total_sector & 0xff000000) >> 24); - disk_info->DISK_FreeSector[0] = (INT8)((free_sector & 0x000000ff) >> 0); - disk_info->DISK_FreeSector[1] = (INT8)((free_sector & 0x0000ff00) >> 8); - disk_info->DISK_FreeSector[2] = (INT8)((free_sector & 0x00ff0000) >> 16); - disk_info->DISK_FreeSector[3] = (INT8)((free_sector & 0xff000000) >> 24); + disk_info->DISK_FreeSector[0] = (INT8)((free_sector & 0x000000ff) >> 0); + disk_info->DISK_FreeSector[1] = (INT8)((free_sector & 0x0000ff00) >> 8); + disk_info->DISK_FreeSector[2] = (INT8)((free_sector & 0x00ff0000) >> 16); + disk_info->DISK_FreeSector[3] = (INT8)((free_sector & 0xff000000) >> 24); - disk_info->DISK_DiskFat = 0x0c; // FAT32? + disk_info->DISK_DiskFat = 0x0c; // FAT32? - got_info = TRUE; - } - return got_info; + got_info = TRUE; + } + return got_info; } -static CH376_LOCK system_obtain_directory_lock(CH376_CONTEXT *context, const char *dir_path, CH376_LOCK root_lock) +static CH376_LOCK system_obtain_directory_lock(CH376_CONTEXT *context, const char* dir_path, CH376_LOCK root_lock) { - CH376_LOCK lock = NULL; - TCHAR old_dir[MAX_PATH]; - struct stat s; + CH376_LOCK lock = NULL; + TCHAR old_dir[MAX_PATH]; + struct stat s; - if(root_lock) - { - GetCurrentDirectory(sizeof(old_dir), old_dir); - SetCurrentDirectory(root_lock->path); - }; + if(root_lock) + { + GetCurrentDirectory(sizeof(old_dir), old_dir); + SetCurrentDirectory(root_lock->path); + }; - //@iss PathIsDirectory(dir_path) - if(stat(dir_path,&s) == 0 && s.st_mode & S_IFDIR) - { - lock = (CH376_LOCK)system_alloc_mem(sizeof(struct _CH376_LOCK )); - GetFullPathName(dir_path, MAX_PATH, lock->path, NULL); - lock->handle = INVALID_HANDLE_VALUE; - } + //@iss PathIsDirectory(dir_path) + if(stat(dir_path, &s) == 0 && s.st_mode & S_IFDIR) + { + lock = (CH376_LOCK)system_alloc_mem(sizeof(struct _CH376_LOCK)); + GetFullPathName(dir_path, MAX_PATH, lock->path, NULL); + lock->handle = INVALID_HANDLE_VALUE; + } - if(root_lock) - { - SetCurrentDirectory(old_dir); - }; + if(root_lock) + { + SetCurrentDirectory(old_dir); + }; - return lock; + return lock; } static void system_release_directory_lock(CH376_CONTEXT *context, CH376_LOCK dir_lock) { - if(dir_lock != (CH376_LOCK)0) - { - system_free_mem(dir_lock); - } + if(dir_lock != (CH376_LOCK)0) + { + system_free_mem(dir_lock); + } } static CH376_LOCK system_clone_directory_lock(CH376_CONTEXT *context, CH376_LOCK dir_lock) { - CH376_LOCK dup_lock = (CH376_LOCK)system_alloc_mem(sizeof(struct _CH376_LOCK)); + CH376_LOCK dup_lock = (CH376_LOCK)system_alloc_mem(sizeof(struct _CH376_LOCK)); - CopyMemory(dup_lock, dir_lock, sizeof(struct _CH376_LOCK)); + CopyMemory(dup_lock, dir_lock, sizeof(struct _CH376_LOCK)); - return dup_lock; + return dup_lock; } -static HANDLE file_open(CH376_CONTEXT *context, const char *file_name, PCHAR root_path, DWORD creation_disposition) +static HANDLE file_open(CH376_CONTEXT *context, const char* file_name, PCHAR root_path, DWORD creation_disposition) { - TCHAR old_dir[MAX_PATH]; - HANDLE file; + TCHAR old_dir[MAX_PATH]; + HANDLE file; - if(root_path) - { - GetCurrentDirectory(sizeof(old_dir), old_dir); - SetCurrentDirectory(root_path); - } + if(root_path) + { + GetCurrentDirectory(sizeof(old_dir), old_dir); + SetCurrentDirectory(root_path); + } - file = CreateFile(file_name, GENERIC_READ | GENERIC_WRITE, 0, NULL, creation_disposition, FILE_ATTRIBUTE_NORMAL, NULL); + file = CreateFile(file_name, GENERIC_READ | GENERIC_WRITE, 0, NULL, creation_disposition, FILE_ATTRIBUTE_NORMAL, NULL); - if(root_path) - { - SetCurrentDirectory(old_dir); - } + if(root_path) + { + SetCurrentDirectory(old_dir); + } - if(file != INVALID_HANDLE_VALUE) - return file; - else - return NULL; + if(file != INVALID_HANDLE_VALUE) + return file; + else + return NULL; } -static CH376_BOOL system_file_delete(CH376_CONTEXT *context, const char *file_name, CH376_LOCK root_lock) +static CH376_BOOL system_file_delete(CH376_CONTEXT *context, const char* file_name, CH376_LOCK root_lock) { - LONG err; - TCHAR old_dir[MAX_PATH]; + LONG err; + TCHAR old_dir[MAX_PATH]; - if (root_lock) - { - GetCurrentDirectory(sizeof(old_dir), old_dir); - SetCurrentDirectory(root_lock->path); - }; + if(root_lock) + { + GetCurrentDirectory(sizeof(old_dir), old_dir); + SetCurrentDirectory(root_lock->path); + }; - dbg_printf("system_file_delete: %s\n", file_name); + dbg_printf("system_file_delete: %s\n", file_name); - err = DeleteFile(file_name); + err = DeleteFile(file_name); - if (root_lock) - { - SetCurrentDirectory(old_dir); - }; + if(root_lock) + { + SetCurrentDirectory(old_dir); + }; - return (err != 0); + return (err != 0); } static CH376_BOOL system_directory_delete(CH376_CONTEXT *context, CH376_LOCK root_lock) { - dbg_printf("system_directory_delete: %s\n", root_lock); + dbg_printf("system_directory_delete: %s\n", root_lock); - if (root_lock) - return (RemoveDirectory((LPCSTR)root_lock) != 0); + if(root_lock) + return (RemoveDirectory((LPCSTR)root_lock) != 0); - return CH376_FALSE; + return CH376_FALSE; } -static CH376_LOCK system_create_directory(CH376_CONTEXT *context, const char *dir_path, CH376_LOCK root_lock) +static CH376_LOCK system_create_directory(CH376_CONTEXT *context, const char* dir_path, CH376_LOCK root_lock) { - TCHAR old_dir[MAX_PATH]; - CH376_LOCK lock = NULL; + TCHAR old_dir[MAX_PATH]; + CH376_LOCK lock = NULL; - if (root_lock) - { - GetCurrentDirectory(sizeof(old_dir), old_dir); - SetCurrentDirectory(root_lock->path); - }; + if(root_lock) + { + GetCurrentDirectory(sizeof(old_dir), old_dir); + SetCurrentDirectory(root_lock->path); + }; - dbg_printf("system_create_directory: %s\n", dir_path); + dbg_printf("system_create_directory: %s\n", dir_path); - if (CreateDirectory(dir_path, NULL)) - { - lock = (CH376_LOCK)system_alloc_mem(sizeof(struct _CH376_LOCK )); - SetCurrentDirectory(dir_path); - GetCurrentDirectory(sizeof(lock->path), lock->path); - lock->handle = INVALID_HANDLE_VALUE; - } + if(CreateDirectory(dir_path, NULL)) + { + lock = (CH376_LOCK)system_alloc_mem(sizeof(struct _CH376_LOCK)); + SetCurrentDirectory(dir_path); + GetCurrentDirectory(sizeof(lock->path), lock->path); + lock->handle = INVALID_HANDLE_VALUE; + } - if (root_lock) - { - SetCurrentDirectory(old_dir); - }; + if(root_lock) + { + SetCurrentDirectory(old_dir); + }; - return lock; + return lock; } -static CH376_FILE system_file_open_existing(CH376_CONTEXT *context, const char *file_name, CH376_LOCK root_lock) +static CH376_FILE system_file_open_existing(CH376_CONTEXT *context, const char* file_name, CH376_LOCK root_lock) { - return file_open(context, file_name, root_lock->path, OPEN_EXISTING); + return file_open(context, file_name, root_lock->path, OPEN_EXISTING); } -static CH376_FILE system_file_open_new(CH376_CONTEXT *context, const char *file_name, CH376_LOCK root_lock) +static CH376_FILE system_file_open_new(CH376_CONTEXT *context, const char* file_name, CH376_LOCK root_lock) { - return file_open(context, file_name, root_lock->path, CREATE_ALWAYS); + return file_open(context, file_name, root_lock->path, CREATE_ALWAYS); } static void system_file_close(CH376_CONTEXT *context, CH376_FILE file) { - if(file) CloseHandle(file); + if(file) CloseHandle(file); } static CH376_S32 system_file_seek(CH376_CONTEXT *context, CH376_FILE file, int pos) { - if(file != NULL) - return SetFilePointer(file, pos, NULL, FILE_BEGIN); - else - return -1; + if(file != NULL) + return SetFilePointer(file, pos, NULL, FILE_BEGIN); + else + return -1; } -static CH376_S32 system_file_read(CH376_CONTEXT *context, CH376_FILE file, void *buffer, CH376_S32 size) +static CH376_S32 system_file_read(CH376_CONTEXT *context, CH376_FILE file, void* buffer, CH376_S32 size) { - DWORD read_bytes; + DWORD read_bytes; - if(ReadFile(file, buffer, size, &read_bytes, NULL)) - return read_bytes; - else - return -1; + if(ReadFile(file, buffer, size, &read_bytes, NULL)) + return read_bytes; + else + return -1; } -static CH376_S32 system_file_write(CH376_CONTEXT *context, CH376_FILE file, void *buffer, CH376_S32 size) +static CH376_S32 system_file_write(CH376_CONTEXT *context, CH376_FILE file, void* buffer, CH376_S32 size) { - DWORD written_bytes; + DWORD written_bytes; - if(WriteFile(file, buffer, size, &written_bytes, NULL)) - return written_bytes; - else - return -1; + if(WriteFile(file, buffer, size, &written_bytes, NULL)) + return written_bytes; + else + return -1; } static CH376_DIR system_start_examine_directory(CH376_CONTEXT *context, CH376_LOCK dir_lock) { - LPWIN32_FIND_DATA find_file_data = (LPWIN32_FIND_DATA)system_alloc_mem(sizeof(WIN32_FIND_DATA)); - TCHAR szDir[MAX_PATH]; - StringCchCopy(szDir, MAX_PATH, dir_lock->path); - StringCchCat(szDir, MAX_PATH, TEXT("\\*")); + LPWIN32_FIND_DATA find_file_data = (LPWIN32_FIND_DATA)system_alloc_mem(sizeof(WIN32_FIND_DATA)); + TCHAR szDir[MAX_PATH]; + StringCchCopy(szDir, MAX_PATH, dir_lock->path); + StringCchCat(szDir, MAX_PATH, TEXT("\\*")); - dir_lock->handle = FindFirstFile(szDir, find_file_data); + dir_lock->handle = FindFirstFile(szDir, find_file_data); - if(dir_lock->handle == INVALID_HANDLE_VALUE) - { - system_free_mem(find_file_data); - find_file_data = NULL; - } + if(dir_lock->handle == INVALID_HANDLE_VALUE) + { + system_free_mem(find_file_data); + find_file_data = NULL; + } - return find_file_data; + return find_file_data; } -static CH376_BOOL system_go_examine_directory(CH376_CONTEXT *context, CH376_LOCK dir_lock, CH376_DIR fib, struct FatDirInfo *dir_info, char *pattern) +static CH376_BOOL system_go_examine_directory(CH376_CONTEXT *context, CH376_LOCK dir_lock, CH376_DIR fib, struct FatDirInfo *dir_info, char* pattern) { - BOOL is_done = FALSE; - - if(dir_lock->handle != INVALID_HANDLE_VALUE) - { - while(!is_done && FindNextFile(dir_lock->handle, fib)) - { - if(normalize_file_name(fib->cFileName, dir_info->DIR_Name) && pattern_match(pattern, dir_info->DIR_Name)) - { - // Storing attributes :) - dir_info->DIR_Attr = (UINT8)fib->dwFileAttributes; - - dbg_printf("system_go_examine_directory defined file attributes: %d\n", dir_info->DIR_Attr); - - dir_info->DIR_NTRes = 0; - dir_info->DIR_CrtTimeTenth = 0; - dir_info->DIR_CrtTime[0] = 0; - dir_info->DIR_CrtTime[1] = 0; - dir_info->DIR_CrtDate[0] = 0; - dir_info->DIR_CrtDate[1] = 0; - dir_info->DIR_LstAccDate[0] = 0; - dir_info->DIR_LstAccDate[1] = 0; - dir_info->DIR_FstClusHI[0] = 0; - dir_info->DIR_FstClusHI[1] = 0; - dir_info->DIR_WrtTime[0] = 0; - dir_info->DIR_WrtTime[1] = 0; - dir_info->DIR_WrtDate[0] = 0; - dir_info->DIR_WrtDate[1] = 0; - dir_info->DIR_FstClusLO[0] = 0; - dir_info->DIR_FstClusLO[1] = 0; - dir_info->DIR_FileSize[0] = (UINT8)((fib->nFileSizeLow & 0x000000ff) >> 0); - dir_info->DIR_FileSize[1] = (UINT8)((fib->nFileSizeLow & 0x0000ff00) >> 8); - dir_info->DIR_FileSize[2] = (UINT8)((fib->nFileSizeLow & 0x00ff0000) >> 16); - dir_info->DIR_FileSize[3] = (UINT8)((fib->nFileSizeLow & 0xff000000) >> 24); - - is_done = TRUE; - } - } - } + BOOL is_done = FALSE; - return is_done; + if(dir_lock->handle != INVALID_HANDLE_VALUE) + { + while(!is_done && FindNextFile(dir_lock->handle, fib)) + { + if(normalize_file_name(fib->cFileName, dir_info->DIR_Name) && pattern_match(pattern, dir_info->DIR_Name)) + { + // Storing attributes :) + dir_info->DIR_Attr = (UINT8)fib->dwFileAttributes; + + dbg_printf("system_go_examine_directory defined file attributes: %d\n", dir_info->DIR_Attr); + + dir_info->DIR_NTRes = 0; + dir_info->DIR_CrtTimeTenth = 0; + dir_info->DIR_CrtTime[0] = 0; + dir_info->DIR_CrtTime[1] = 0; + dir_info->DIR_CrtDate[0] = 0; + dir_info->DIR_CrtDate[1] = 0; + dir_info->DIR_LstAccDate[0] = 0; + dir_info->DIR_LstAccDate[1] = 0; + dir_info->DIR_FstClusHI[0] = 0; + dir_info->DIR_FstClusHI[1] = 0; + dir_info->DIR_WrtTime[0] = 0; + dir_info->DIR_WrtTime[1] = 0; + dir_info->DIR_WrtDate[0] = 0; + dir_info->DIR_WrtDate[1] = 0; + dir_info->DIR_FstClusLO[0] = 0; + dir_info->DIR_FstClusLO[1] = 0; + dir_info->DIR_FileSize[0] = (UINT8)((fib->nFileSizeLow & 0x000000ff) >> 0); + dir_info->DIR_FileSize[1] = (UINT8)((fib->nFileSizeLow & 0x0000ff00) >> 8); + dir_info->DIR_FileSize[2] = (UINT8)((fib->nFileSizeLow & 0x00ff0000) >> 16); + dir_info->DIR_FileSize[3] = (UINT8)((fib->nFileSizeLow & 0xff000000) >> 24); + + is_done = TRUE; + } + } + } + + return is_done; } static void system_finish_examine_directory(CH376_CONTEXT *context, CH376_DIR fib) { - if(fib) - { - FindClose(fib); - system_free_mem(fib); - } + if(fib) + { + FindClose(fib); + system_free_mem(fib); + } } static CH376_S32 system_get_file_size(CH376_CONTEXT *context, CH376_FILE file) { - CH376_S32 file_size = 0xffffffff; - BY_HANDLE_FILE_INFORMATION file_stat; + CH376_S32 file_size = 0xffffffff; + BY_HANDLE_FILE_INFORMATION file_stat; - if (file) + if(file) + { + if(GetFileInformationByHandle(file, &file_stat)) { - if ( GetFileInformationByHandle(file, &file_stat) ) - { - // Only low DWORD - file_size = file_stat.nFileSizeLow; - } - else - { - dbg_printf("system_get_file_size: error\n"); - } + // Only low DWORD + file_size = file_stat.nFileSizeLow; } else - dbg_printf("system_get_file_size: no file handle\n"); + { + dbg_printf("system_get_file_size: error\n"); + } + } + else + dbg_printf("system_get_file_size: no file handle\n"); - return file_size; + return file_size; } static CH376_S32 system_get_file_offset(CH376_CONTEXT *context, CH376_FILE file) { - CH376_S32 file_offset = 0xffffffff; + CH376_S32 file_offset = 0xffffffff; - if (file) - { - dbg_printf("system_get_file_offset: unsupported error\n"); - } - else - dbg_printf("system_get_file_offset: no file handle\n"); + if(file) + { + dbg_printf("system_get_file_offset: unsupported error\n"); + } + else + dbg_printf("system_get_file_offset: no file handle\n"); - return file_offset; + return file_offset; } /* /// */ @@ -1071,21 +1071,21 @@ static CH376_S32 system_get_file_offset(CH376_CONTEXT *context, CH376_FILE file) #define dbg_printf(...) #endif -static void * system_alloc_mem(int size) +static void* system_alloc_mem(int size) { - return malloc(size); + return malloc(size); } -static void system_free_mem(void *ptr) +static void system_free_mem(void* ptr) { - if (ptr) - free(ptr); + if(ptr) + free(ptr); } -static CH376_BOOL system_init_context(CH376_CONTEXT *context, UNUSED void *user_data) +static CH376_BOOL system_init_context(CH376_CONTEXT *context, UNUSED void* user_data) { /* Nothing to do */ - return CH376_TRUE; + return CH376_TRUE; } static void system_clean_context(CH376_CONTEXT *context) @@ -1095,394 +1095,395 @@ static void system_clean_context(CH376_CONTEXT *context) static CH376_BOOL system_get_disk_info(CH376_CONTEXT *context, CH376_LOCK root_lock, struct DiskQuery *disk_info) { - CH376_BOOL got_info = CH376_FALSE; + CH376_BOOL got_info = CH376_FALSE; - if(disk_info) - { - struct statvfs stats; + if(disk_info) + { + struct statvfs stats; - if(statvfs(root_lock, &stats) == 0) - { - int64_t total_sector = (stats.f_blocks * stats.f_bsize) / 512; - int64_t free_sector = (stats.f_bfree * stats.f_bsize) / 512; + if(statvfs(root_lock, &stats) == 0) + { + int64_t total_sector = (stats.f_blocks * stats.f_bsize) / 512; + int64_t free_sector = (stats.f_bfree * stats.f_bsize) / 512; - disk_info->DISK_TotalSector[0] = (total_sector & 0x000000ff) >> 0; - disk_info->DISK_TotalSector[1] = (total_sector & 0x0000ff00) >> 8; - disk_info->DISK_TotalSector[2] = (total_sector & 0x00ff0000) >> 16; - disk_info->DISK_TotalSector[3] = (total_sector & 0xff000000) >> 24; + disk_info->DISK_TotalSector[0] = (total_sector & 0x000000ff) >> 0; + disk_info->DISK_TotalSector[1] = (total_sector & 0x0000ff00) >> 8; + disk_info->DISK_TotalSector[2] = (total_sector & 0x00ff0000) >> 16; + disk_info->DISK_TotalSector[3] = (total_sector & 0xff000000) >> 24; - disk_info->DISK_FreeSector[0] = (free_sector & 0x000000ff) >> 0; - disk_info->DISK_FreeSector[1] = (free_sector & 0x0000ff00) >> 8; - disk_info->DISK_FreeSector[2] = (free_sector & 0x00ff0000) >> 16; - disk_info->DISK_FreeSector[3] = (free_sector & 0xff000000) >> 24; + disk_info->DISK_FreeSector[0] = (free_sector & 0x000000ff) >> 0; + disk_info->DISK_FreeSector[1] = (free_sector & 0x0000ff00) >> 8; + disk_info->DISK_FreeSector[2] = (free_sector & 0x00ff0000) >> 16; + disk_info->DISK_FreeSector[3] = (free_sector & 0xff000000) >> 24; - disk_info->DISK_DiskFat = 0x0c; // FAT32? + disk_info->DISK_DiskFat = 0x0c; // FAT32? - got_info = CH376_TRUE; - } + got_info = CH376_TRUE; } + } - return got_info; + return got_info; } -static CH376_LOCK system_obtain_directory_lock(CH376_CONTEXT *context, const char *dir_path, CH376_LOCK root_lock) +static CH376_LOCK system_obtain_directory_lock(CH376_CONTEXT *context, const char* dir_path, CH376_LOCK root_lock) { - CH376_LOCK lock = NULL; - char *old_dir = NULL; - struct stat path_stat; + CH376_LOCK lock = NULL; + char* old_dir = NULL; + struct stat path_stat; - dbg_printf("system_obtain_directory_lock: %s\n", dir_path); + dbg_printf("system_obtain_directory_lock: %s\n", dir_path); - if(root_lock) - { - if((old_dir = getcwd(NULL, 0)) != NULL) - chdir(root_lock); - } + if(root_lock) + { + if((old_dir = getcwd(NULL, 0)) != NULL) + chdir(root_lock); + } - stat(dir_path, &path_stat); - if(S_ISDIR(path_stat.st_mode)) - { - lock = realpath(dir_path, NULL); - } + stat(dir_path, &path_stat); + if(S_ISDIR(path_stat.st_mode)) + { + lock = realpath(dir_path, NULL); + } - if(old_dir) + if(old_dir) + { + if(old_dir != NULL) { - if(old_dir != NULL) - { - chdir(old_dir); - system_free_mem(old_dir); - } + chdir(old_dir); + system_free_mem(old_dir); } + } - return lock; + return lock; } static void system_release_directory_lock(CH376_CONTEXT *context, CH376_LOCK dir_lock) { - if(dir_lock != (CH376_LOCK)0) - { - system_free_mem(dir_lock); - } + if(dir_lock != (CH376_LOCK)0) + { + system_free_mem(dir_lock); + } } static CH376_LOCK system_clone_directory_lock(CH376_CONTEXT *context, CH376_LOCK dir_lock) { - return strdup(dir_lock); + return strdup(dir_lock); } -static FILE * file_open(const char *file_name, CH376_LOCK root_lock, const char *mode) +static FILE * file_open(const char* file_name, CH376_LOCK root_lock, const char* mode) { - FILE *file; - char *old_dir = NULL; - // FIXME: unused variable - //struct stat path_stat; + FILE *file; + char* old_dir = NULL; + // FIXME: unused variable + //struct stat path_stat; - if(root_lock) - { - if((old_dir = getcwd(NULL, 0)) != NULL) - chdir(root_lock); - } + if(root_lock) + { + if((old_dir = getcwd(NULL, 0)) != NULL) + chdir(root_lock); + } - file = fopen(file_name, mode); + file = fopen(file_name, mode); - if(old_dir) - { - chdir(old_dir); - system_free_mem(old_dir); - } + if(old_dir) + { + chdir(old_dir); + system_free_mem(old_dir); + } - return file; + return file; } -static CH376_BOOL system_file_delete(CH376_CONTEXT *context, const char *file_name, CH376_LOCK root_lock) +static CH376_BOOL system_file_delete(CH376_CONTEXT *context, const char* file_name, CH376_LOCK root_lock) { - int err; - char *old_dir = NULL; + int err; + char* old_dir = NULL; - if(root_lock) - { - if((old_dir = getcwd(NULL, 0)) != NULL) - chdir(root_lock); - } + if(root_lock) + { + if((old_dir = getcwd(NULL, 0)) != NULL) + chdir(root_lock); + } - err = remove(file_name); + err = remove(file_name); - dbg_printf("system_file_delete: %s\n", file_name); + dbg_printf("system_file_delete: %s\n", file_name); - if(old_dir) + if(old_dir) + { + if(old_dir != NULL) { - if(old_dir != NULL) - { - chdir(old_dir); - system_free_mem(old_dir); - } + chdir(old_dir); + system_free_mem(old_dir); } + } - return (err == 0); + return (err == 0); } static CH376_BOOL system_directory_delete(CH376_CONTEXT *context, CH376_LOCK root_lock) { - dbg_printf("system_directory_delete: %s\n", root_lock); + dbg_printf("system_directory_delete: %s\n", root_lock); - if (root_lock) - return (rmdir(root_lock) == 0); - else - return CH376_FALSE; + if(root_lock) + return (rmdir(root_lock) == 0); + else + return CH376_FALSE; } -static CH376_LOCK system_create_directory(CH376_CONTEXT *context, const char *dir_path, CH376_LOCK root_lock) +static CH376_LOCK system_create_directory(CH376_CONTEXT *context, const char* dir_path, CH376_LOCK root_lock) { - CH376_LOCK lock = NULL; - char *old_dir = NULL; + CH376_LOCK lock = NULL; + char* old_dir = NULL; - if(root_lock) - { - if((old_dir = getcwd(NULL, 0)) != NULL) - chdir(root_lock); - } + if(root_lock) + { + if((old_dir = getcwd(NULL, 0)) != NULL) + chdir(root_lock); + } - dbg_printf("system_create_directory: %s\n", dir_path); + dbg_printf("system_create_directory: %s\n", dir_path); - if (!mkdir(dir_path, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) - lock = realpath(dir_path, NULL); + if(!mkdir(dir_path, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) + lock = realpath(dir_path, NULL); - if(old_dir) - { - chdir(old_dir); - system_free_mem(old_dir); - } + if(old_dir) + { + chdir(old_dir); + system_free_mem(old_dir); + } - return lock; + return lock; } -static CH376_FILE system_file_open_existing(CH376_CONTEXT *context, const char *file_name, CH376_LOCK root_lock) +static CH376_FILE system_file_open_existing(CH376_CONTEXT *context, const char* file_name, CH376_LOCK root_lock) { - FILE *fp; + FILE *fp; - fp = file_open(file_name, root_lock, "rb+"); + fp = file_open(file_name, root_lock, "rb+"); - return fp; + return fp; } -static CH376_FILE system_file_open_new(CH376_CONTEXT *context, const char *file_name, CH376_LOCK root_lock) +static CH376_FILE system_file_open_new(CH376_CONTEXT *context, const char* file_name, CH376_LOCK root_lock) { - return file_open(file_name, root_lock, "wb+"); + return file_open(file_name, root_lock, "wb+"); } static void system_file_close(CH376_CONTEXT *context, CH376_FILE file) { - if (file) fclose(file); + if(file) fclose(file); } static CH376_S32 system_file_seek(CH376_CONTEXT *context, CH376_FILE file, int pos) { - dbg_printf("system_file_seek trying to seek to position %d\n", pos); + dbg_printf("system_file_seek trying to seek to position %d\n", pos); - if(file) - if (!fseek(file, pos, SEEK_SET)) - return ftell(file); -// else - return -1; + if(file) + if(!fseek(file, pos, SEEK_SET)) + return ftell(file); + // else + return -1; } -static CH376_S32 system_file_read(CH376_CONTEXT *context, CH376_FILE file, void *buffer, CH376_S32 size) +static CH376_S32 system_file_read(CH376_CONTEXT *context, CH376_FILE file, void* buffer, CH376_S32 size) { - dbg_printf("system_file_read trying to read %d bytes\n", size); + dbg_printf("system_file_read trying to read %d bytes\n", size); - if(file) - return fread(buffer, 1, size, file); - else - return -1; + if(file) + return fread(buffer, 1, size, file); + else + return -1; } -static CH376_S32 system_file_write(CH376_CONTEXT *context, CH376_FILE file, void *buffer, CH376_S32 size) +static CH376_S32 system_file_write(CH376_CONTEXT *context, CH376_FILE file, void* buffer, CH376_S32 size) { - dbg_printf("system_file_write trying to write %d bytes\n", size); + dbg_printf("system_file_write trying to write %d bytes\n", size); - if(file) - return fwrite(buffer, 1, size, file); - else - return -1; + if(file) + return fwrite(buffer, 1, size, file); + else + return -1; } static CH376_DIR system_start_examine_directory(CH376_CONTEXT *context, CH376_LOCK dir_lock) { - CH376_DIR fib = system_alloc_mem(sizeof(struct _CH376_DIR)); + CH376_DIR fib = system_alloc_mem(sizeof(struct _CH376_DIR)); - if(fib) - { - fib->handle = opendir(dir_lock); - fib->entry = NULL; - } + if(fib) + { + fib->handle = opendir(dir_lock); + fib->entry = NULL; + } - return fib; + return fib; } -static CH376_BOOL system_go_examine_directory(CH376_CONTEXT *context, CH376_LOCK dir_lock, CH376_DIR fib, struct FatDirInfo *dir_info, char *pattern) +static CH376_BOOL system_go_examine_directory(CH376_CONTEXT *context, CH376_LOCK dir_lock, CH376_DIR fib, struct FatDirInfo *dir_info, char* pattern) { - CH376_BOOL is_done = CH376_FALSE; - struct stat file_stat; - struct tm *timeinfo; - CH376_U16 dos_cdate, dos_ctime; - CH376_U16 dos_adate; - CH376_U16 dos_mdate, dos_mtime; - char *old_dir = NULL; + CH376_BOOL is_done = CH376_FALSE; + struct stat file_stat; + struct tm *timeinfo; + CH376_U16 dos_cdate, dos_ctime; + CH376_U16 dos_adate; + CH376_U16 dos_mdate, dos_mtime; + char* old_dir = NULL; - if(dir_lock) - { - if((old_dir = getcwd(NULL, 0)) != NULL) - chdir(dir_lock); - } + if(dir_lock) + { + if((old_dir = getcwd(NULL, 0)) != NULL) + chdir(dir_lock); + } - if(fib) while(!is_done && (fib->entry = readdir(fib->handle))) + if(fib) while(!is_done && (fib->entry = readdir(fib->handle))) { - if(normalize_file_name(fib->entry->d_name, dir_info->DIR_Name) && pattern_match(pattern, dir_info->DIR_Name)) - { - stat(fib->entry->d_name, &file_stat); + if(normalize_file_name(fib->entry->d_name, dir_info->DIR_Name) && pattern_match(pattern, dir_info->DIR_Name)) + { + stat(fib->entry->d_name, &file_stat); - dir_info->DIR_Attr = 0; + dir_info->DIR_Attr = 0; - if(S_ISDIR(file_stat.st_mode)) - dir_info->DIR_Attr |= DIR_ATTR_DIRECTORY; - if((file_stat.st_mode & S_IWUSR) == 0) { - dir_info->DIR_Attr |= DIR_ATTR_READ_ONLY; - dbg_printf("--- READ ONLY ---"); - } + if(S_ISDIR(file_stat.st_mode)) + dir_info->DIR_Attr |= DIR_ATTR_DIRECTORY; + if((file_stat.st_mode & S_IWUSR) == 0) + { + dir_info->DIR_Attr |= DIR_ATTR_READ_ONLY; + dbg_printf("--- READ ONLY ---"); + } -// FIXME: begin-of-implemented for Linux and Windows + // FIXME: begin-of-implemented for Linux and Windows #if defined(__linux__) || defined(WIN32) - dbg_printf("system_go_examine_directory defined file attributes: %04o -> %02x\n", file_stat.st_mode, dir_info->DIR_Attr); - if (file_stat.st_ctim.tv_sec == 0) - { - dos_cdate = 0; - dos_ctime = 0; - } - else - { - timeinfo = localtime(&(file_stat.st_ctim.tv_sec)); - dos_cdate = DIR_MAKE_FILE_DATE((timeinfo->tm_year + 1900), (timeinfo->tm_mon + 1), timeinfo->tm_mday); - dos_ctime = DIR_MAKE_FILE_TIME(timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); - dbg_printf("system_go_examine_directory defined file cdate/time: %s", asctime(timeinfo)); - } + dbg_printf("system_go_examine_directory defined file attributes: %04o -> %02x\n", file_stat.st_mode, dir_info->DIR_Attr); + if(file_stat.st_ctim.tv_sec == 0) + { + dos_cdate = 0; + dos_ctime = 0; + } + else + { + timeinfo = localtime(&(file_stat.st_ctim.tv_sec)); + dos_cdate = DIR_MAKE_FILE_DATE((timeinfo->tm_year + 1900), (timeinfo->tm_mon + 1), timeinfo->tm_mday); + dos_ctime = DIR_MAKE_FILE_TIME(timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); + dbg_printf("system_go_examine_directory defined file cdate/time: %s", asctime(timeinfo)); + } - if (file_stat.st_atim.tv_sec == 0) - { - dos_adate = 0; - } - else - { - timeinfo = localtime(&(file_stat.st_atim.tv_sec)); - dos_adate = DIR_MAKE_FILE_DATE((timeinfo->tm_year + 1900), (timeinfo->tm_mon + 1), timeinfo->tm_mday); - dbg_printf("system_go_examine_directory defined file adate/time: %s", asctime(timeinfo)); - } + if(file_stat.st_atim.tv_sec == 0) + { + dos_adate = 0; + } + else + { + timeinfo = localtime(&(file_stat.st_atim.tv_sec)); + dos_adate = DIR_MAKE_FILE_DATE((timeinfo->tm_year + 1900), (timeinfo->tm_mon + 1), timeinfo->tm_mday); + dbg_printf("system_go_examine_directory defined file adate/time: %s", asctime(timeinfo)); + } - if (file_stat.st_mtim.tv_sec == 0) - { - dos_mdate = 0; - dos_mtime = 0; - } - else - { - timeinfo = localtime(&(file_stat.st_mtim.tv_sec)); - dos_mdate = DIR_MAKE_FILE_DATE((timeinfo->tm_year + 1900), (timeinfo->tm_mon + 1), timeinfo->tm_mday); - dos_mtime = DIR_MAKE_FILE_TIME(timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); - dbg_printf("system_go_examine_directory defined file mdate/time: %s", asctime(timeinfo)); - } + if(file_stat.st_mtim.tv_sec == 0) + { + dos_mdate = 0; + dos_mtime = 0; + } + else + { + timeinfo = localtime(&(file_stat.st_mtim.tv_sec)); + dos_mdate = DIR_MAKE_FILE_DATE((timeinfo->tm_year + 1900), (timeinfo->tm_mon + 1), timeinfo->tm_mday); + dos_mtime = DIR_MAKE_FILE_TIME(timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); + dbg_printf("system_go_examine_directory defined file mdate/time: %s", asctime(timeinfo)); + } #else - // silence compiler warnings - timeinfo = 0; - dos_ctime = 0; - dos_cdate = 0; - dos_mtime = 0; - dos_mdate = 0; - dos_adate = 0; + // silence compiler warnings + timeinfo = 0; + dos_ctime = 0; + dos_cdate = 0; + dos_mtime = 0; + dos_mdate = 0; + dos_adate = 0; #endif -// FIXME: end-of-implemented for Linux and Windows - - dir_info->DIR_NTRes = 0; - dir_info->DIR_CrtTimeTenth = 0; - dir_info->DIR_CrtTime[0] = (dos_ctime & 0x00ff); - dir_info->DIR_CrtTime[1] = (dos_ctime >> 8); - dir_info->DIR_CrtDate[0] = (dos_cdate & 0x00ff); - dir_info->DIR_CrtDate[1] = (dos_cdate >> 8); - dir_info->DIR_LstAccDate[0] = (dos_adate & 0x00ff); - dir_info->DIR_LstAccDate[1] = (dos_adate >> 8); - dir_info->DIR_FstClusHI[0] = 0; - dir_info->DIR_FstClusHI[1] = 0; - dir_info->DIR_WrtTime[0] = (dos_mtime & 0x00ff); - dir_info->DIR_WrtTime[1] = (dos_mtime >> 8); - dir_info->DIR_WrtDate[0] = (dos_mdate & 0x00ff); - dir_info->DIR_WrtDate[1] = (dos_mdate >> 8); - dir_info->DIR_FstClusLO[0] = 0; - dir_info->DIR_FstClusLO[1] = 0; - dir_info->DIR_FileSize[0] = (file_stat.st_size & 0x000000ff) >> 0; - dir_info->DIR_FileSize[1] = (file_stat.st_size & 0x0000ff00) >> 8; - dir_info->DIR_FileSize[2] = (file_stat.st_size & 0x00ff0000) >> 16; - dir_info->DIR_FileSize[3] = (file_stat.st_size & 0xff000000) >> 24; - - is_done = CH376_TRUE; - } - } - - if(old_dir) - { - chdir(old_dir); - system_free_mem(old_dir); - } + // FIXME: end-of-implemented for Linux and Windows + + dir_info->DIR_NTRes = 0; + dir_info->DIR_CrtTimeTenth = 0; + dir_info->DIR_CrtTime[0] = (dos_ctime & 0x00ff); + dir_info->DIR_CrtTime[1] = (dos_ctime >> 8); + dir_info->DIR_CrtDate[0] = (dos_cdate & 0x00ff); + dir_info->DIR_CrtDate[1] = (dos_cdate >> 8); + dir_info->DIR_LstAccDate[0] = (dos_adate & 0x00ff); + dir_info->DIR_LstAccDate[1] = (dos_adate >> 8); + dir_info->DIR_FstClusHI[0] = 0; + dir_info->DIR_FstClusHI[1] = 0; + dir_info->DIR_WrtTime[0] = (dos_mtime & 0x00ff); + dir_info->DIR_WrtTime[1] = (dos_mtime >> 8); + dir_info->DIR_WrtDate[0] = (dos_mdate & 0x00ff); + dir_info->DIR_WrtDate[1] = (dos_mdate >> 8); + dir_info->DIR_FstClusLO[0] = 0; + dir_info->DIR_FstClusLO[1] = 0; + dir_info->DIR_FileSize[0] = (file_stat.st_size & 0x000000ff) >> 0; + dir_info->DIR_FileSize[1] = (file_stat.st_size & 0x0000ff00) >> 8; + dir_info->DIR_FileSize[2] = (file_stat.st_size & 0x00ff0000) >> 16; + dir_info->DIR_FileSize[3] = (file_stat.st_size & 0xff000000) >> 24; + + is_done = CH376_TRUE; + } + } + + if(old_dir) + { + chdir(old_dir); + system_free_mem(old_dir); + } - return is_done; + return is_done; } static void system_finish_examine_directory(CH376_CONTEXT *context, CH376_DIR fib) { - if (fib) - { - closedir(fib->handle); - system_free_mem(fib); - } + if(fib) + { + closedir(fib->handle); + system_free_mem(fib); + } } static CH376_S32 system_get_file_size(CH376_CONTEXT *context, CH376_FILE file) { - CH376_S32 file_size = 0xffffffff; - struct stat file_stat; + CH376_S32 file_size = 0xffffffff; + struct stat file_stat; - if (file) + if(file) + { + if(!fstat(fileno(file), &file_stat)) { - if ( !fstat(fileno(file), &file_stat) ) - { - file_size = file_stat.st_size; - } - else - { - dbg_printf("system_get_file_size: error\n"); - } + file_size = file_stat.st_size; } else - dbg_printf("system_get_file_size: no file handle\n"); + { + dbg_printf("system_get_file_size: error\n"); + } + } + else + dbg_printf("system_get_file_size: no file handle\n"); - return file_size; + return file_size; } static CH376_S32 system_get_file_offset(CH376_CONTEXT *context, CH376_FILE file) { - CH376_S32 file_offset = 0xffffffff; + CH376_S32 file_offset = 0xffffffff; - if (file) - { - file_offset = ftell(file); + if(file) + { + file_offset = ftell(file); - if(file_offset == -1) - { - dbg_printf("system_get_file_offset: error\n"); - } + if(file_offset == -1) + { + dbg_printf("system_get_file_offset: error\n"); } - else - dbg_printf("system_get_file_offset: no file handle\n"); + } + else + dbg_printf("system_get_file_offset: no file handle\n"); - return file_offset; + return file_offset; } /* /// */ @@ -1493,333 +1494,333 @@ static CH376_S32 system_get_file_offset(CH376_CONTEXT *context, CH376_FILE file) /* /// "CH376 private subroutines" */ -static char *clone_string(const char *string) +static char* clone_string(const char* string) { - // int l; - // char *s; - // - // for(l=0; string[l]!='\0'; l++); - // - // s = system_alloc_mem(l); - // - // for(l=0; string[l]!='\0'; l++) - // s[l] = string[l]; - // - // s[l] = '\0'; + // int l; + // char *s; + // + // for(l=0; string[l]!='\0'; l++); + // + // s = system_alloc_mem(l); + // + // for(l=0; string[l]!='\0'; l++) + // s[l] = string[l]; + // + // s[l] = '\0'; - // return s; + // return s; - return strdup(string); + return strdup(string); } static void clear_structure(struct ch376 *ch376) { - ch376->command = CH376_CMD_NONE; - ch376->command_status = 0; - ch376->interface_status = 0; - ch376->nb_bytes_in_cmd_data = 0; - ch376->pos_rw_in_cmd_data = 0; - ch376->usb_mode = CH376_ARG_SET_USB_MODE_INVALID; - ch376->bytes_to_read_write = 0; - ch376->root_dir_lock = (CH376_LOCK)0; - ch376->current_dir_lock = (CH376_LOCK)0; - ch376->current_file = (CH376_FILE)0; - ch376->current_directory_browsing = (CH376_DIR)0; + ch376->command = CH376_CMD_NONE; + ch376->command_status = 0; + ch376->interface_status = 0; + ch376->nb_bytes_in_cmd_data = 0; + ch376->pos_rw_in_cmd_data = 0; + ch376->usb_mode = CH376_ARG_SET_USB_MODE_INVALID; + ch376->bytes_to_read_write = 0; + ch376->root_dir_lock = (CH376_LOCK)0; + ch376->current_dir_lock = (CH376_LOCK)0; + ch376->current_file = (CH376_FILE)0; + ch376->current_directory_browsing = (CH376_DIR)0; } static void cancel_all_io(struct ch376 *ch376) { - // Cancel data buffer read/write sessions - ch376->bytes_to_read_write = 0; + // Cancel data buffer read/write sessions + ch376->bytes_to_read_write = 0; - // End directory browsing or file i/o sessions - system_finish_examine_directory(&ch376->context, ch376->current_directory_browsing); - ch376->current_directory_browsing = (CH376_DIR)0; - system_file_close(&ch376->context, ch376->current_file); - ch376->current_file = (CH376_FILE)0; + // End directory browsing or file i/o sessions + system_finish_examine_directory(&ch376->context, ch376->current_directory_browsing); + ch376->current_directory_browsing = (CH376_DIR)0; + system_file_close(&ch376->context, ch376->current_file); + ch376->current_file = (CH376_FILE)0; - // Release potential already obtained lock for root and current - system_release_directory_lock(&ch376->context, ch376->root_dir_lock); - ch376->root_dir_lock = (CH376_LOCK)0; - system_release_directory_lock(&ch376->context, ch376->current_dir_lock); - ch376->current_dir_lock = (CH376_LOCK)0; + // Release potential already obtained lock for root and current + system_release_directory_lock(&ch376->context, ch376->root_dir_lock); + ch376->root_dir_lock = (CH376_LOCK)0; + system_release_directory_lock(&ch376->context, ch376->current_dir_lock); + ch376->current_dir_lock = (CH376_LOCK)0; } // Normalize a char (capitalized and ASCII) // Return -1 if not possible static int normalize_char(char c) { - if(c > 127) - return -1; + if(c > 127) + return -1; - if(c >='a' && c <='z') - return c - ('a' - 'A'); + if(c >='a' && c <='z') + return c - ('a' - 'A'); - return c; + return c; } // Normalized a dos filename in 8.3 format // Return NULL if not possible -static const char * normalize_file_name(const char *file_name, char *normalized_file_name) +static const char* normalize_file_name(const char* file_name, char* normalized_file_name) { - int i = 0; - int j = 0; - int c; + int i = 0; + int j = 0; + int c; - dbg_printf("normalize_file_name: %s\n", file_name); + dbg_printf("normalize_file_name: %s\n", file_name); - // '.' or '..' - if(file_name[0] == '.') - { - if( (file_name[1] == '\0') || (file_name[1] == '.' && file_name[2] == '\0')) - return NULL; - } + // '.' or '..' + if(file_name[0] == '.') + { + if((file_name[1] == '\0') || (file_name[1] == '.' && file_name[2] == '\0')) + return NULL; + } - while(file_name[i] != '\0' && file_name[i] != '.' && j < 8) - { - c = normalize_char(file_name[i++]); + while(file_name[i] != '\0' && file_name[i] != '.' && j < 8) + { + c = normalize_char(file_name[i++]); - if(c == -1) - return NULL; - else - normalized_file_name[j++] = (char)c; - } + if(c == -1) + return NULL; + else + normalized_file_name[j++] = (char)c; + } - if(file_name[i] == '\0') - { - for(; j<8; j++) - { - normalized_file_name[j] = ' '; - } - } - else if(file_name[i] == '.') + if(file_name[i] == '\0') + { + for(; j<8; j++) { - i++; - for(; j<8; j++) - { - normalized_file_name[j] = ' '; - } + normalized_file_name[j] = ' '; } - else + } + else if(file_name[i] == '.') + { + i++; + for(; j<8; j++) { - dbg_printf("normalize_file_name impossible: %s (%d=%c,%d=%c)\n", file_name, i, file_name[i], j, normalized_file_name[j]); - return NULL; + normalized_file_name[j] = ' '; } + } + else + { + dbg_printf("normalize_file_name impossible: %s (%d=%c,%d=%c)\n", file_name, i, file_name[i], j, normalized_file_name[j]); + return NULL; + } - while(file_name[i] != '\0' && file_name[i] != '.' && j < 11) - { - c = normalize_char(file_name[i++]); + while(file_name[i] != '\0' && file_name[i] != '.' && j < 11) + { + c = normalize_char(file_name[i++]); - if(c == -1) - return NULL; - else - normalized_file_name[j++] = (char)c; - } + if(c == -1) + return NULL; + else + normalized_file_name[j++] = (char)c; + } - if(file_name[i] != '\0') - { - dbg_printf("normalize_file_name impossible: %s (%d=%c,%d=%c)\n", file_name, i, file_name[i], j, normalized_file_name[j]); - return NULL; - } + if(file_name[i] != '\0') + { + dbg_printf("normalize_file_name impossible: %s (%d=%c,%d=%c)\n", file_name, i, file_name[i], j, normalized_file_name[j]); + return NULL; + } - dbg_printf("normalize_file_name done: %s (%d=&%02x,%d=&%02x)\n", file_name, i, file_name[i], j, normalized_file_name[j]); + dbg_printf("normalize_file_name done: %s (%d=&%02x,%d=&%02x)\n", file_name, i, file_name[i], j, normalized_file_name[j]); - for(; j<11; j++) - { - normalized_file_name[j] = ' '; - } + for(; j<11; j++) + { + normalized_file_name[j] = ' '; + } - normalized_file_name[j] = '\0'; + normalized_file_name[j] = '\0'; - return normalized_file_name; + return normalized_file_name; } // Convert normalized 8.3 filename into regular filename // (remove trailing spaces in name and extension, and clear extension trailing '.' if any) -static const char * trim_file_name(const char *file_name, char *trimmed_file_name) +static const char* trim_file_name(const char* file_name, char* trimmed_file_name) { - int i = 0; - int j = 0; + int i = 0; + int j = 0; - while(file_name[i] != ' ' && file_name[i] != '\0') - trimmed_file_name[j++] = file_name[i++]; + while(file_name[i] != ' ' && file_name[i] != '\0') + trimmed_file_name[j++] = file_name[i++]; - while(file_name[i] == ' ') - i++; + while(file_name[i] == ' ') + i++; - while(file_name[i] != ' ' && file_name[i] != '\0') - trimmed_file_name[j++] = file_name[i++]; + while(file_name[i] != ' ' && file_name[i] != '\0') + trimmed_file_name[j++] = file_name[i++]; - if(j > 0 && trimmed_file_name[j-1] == '.') - j--; + if(j > 0 && trimmed_file_name[j-1] == '.') + j--; - trimmed_file_name[j] = '\0'; + trimmed_file_name[j] = '\0'; - dbg_printf("trim_file_name from \"%s\" to \"%s\"\n", file_name, trimmed_file_name); + dbg_printf("trim_file_name from \"%s\" to \"%s\"\n", file_name, trimmed_file_name); - return trimmed_file_name; + return trimmed_file_name; } static void file_read_chunk(struct ch376 *ch376) { - CH376_S32 bytes_to_read_now; - CH376_S32 bytes_actually_read; + CH376_S32 bytes_to_read_now; + CH376_S32 bytes_actually_read; - if(ch376->bytes_to_read_write > sizeof(ch376->cmd_data.CMD_IOBuffer)) - bytes_to_read_now = sizeof(ch376->cmd_data.CMD_IOBuffer); - else - bytes_to_read_now = ch376->bytes_to_read_write; + if(ch376->bytes_to_read_write > sizeof(ch376->cmd_data.CMD_IOBuffer)) + bytes_to_read_now = sizeof(ch376->cmd_data.CMD_IOBuffer); + else + bytes_to_read_now = ch376->bytes_to_read_write; - bytes_actually_read = system_file_read(&ch376->context, ch376->current_file, &ch376->cmd_data.CMD_IOBuffer, bytes_to_read_now); + bytes_actually_read = system_file_read(&ch376->context, ch376->current_file, &ch376->cmd_data.CMD_IOBuffer, bytes_to_read_now); - if(bytes_actually_read >= 0) - { - ch376->bytes_to_read_write -= (CH376_U16)bytes_actually_read; - - ch376->nb_bytes_in_cmd_data = (CH376_U8)bytes_actually_read; - ch376->interface_status = 127; - // CH376 specification tells that the last buffer is returned with INT_SUCCESS - // but it is not the case (at least with revision 4). An empty buffer is always - // returned with INT_SUCCESS. As a consequence some routines do not read the last - // buffer when INT_SUCCESS is returned. It is not correct regarding CH376 - // specification, but to keep compatibility with these (wrong) routines, - // we also always return an empty buffer with INT_SUCCESS by checking - // bytes_actually_read == 0 instead of bytes_actually_read < bytes_to_read_now - if(bytes_to_read_now == 0 || bytes_actually_read == 0) - { - dbg_printf("[WRITE][DATA][CH376_CMD_BYTE_READ] all done: read operated with success (no more data)\n"); - ch376->command_status = CH376_INT_SUCCESS; - } - else - { - dbg_printf("[WRITE][DATA][CH376_CMD_BYTE_READ] all done: read operated with success (waiting data read for %d bytes out of %d)\n", ch376->nb_bytes_in_cmd_data, ch376->bytes_to_read_write); - ch376->command_status = CH376_INT_DISK_READ; - } + if(bytes_actually_read >= 0) + { + ch376->bytes_to_read_write -= (CH376_U16)bytes_actually_read; + + ch376->nb_bytes_in_cmd_data = (CH376_U8)bytes_actually_read; + ch376->interface_status = 127; + // CH376 specification tells that the last buffer is returned with INT_SUCCESS + // but it is not the case (at least with revision 4). An empty buffer is always + // returned with INT_SUCCESS. As a consequence some routines do not read the last + // buffer when INT_SUCCESS is returned. It is not correct regarding CH376 + // specification, but to keep compatibility with these (wrong) routines, + // we also always return an empty buffer with INT_SUCCESS by checking + // bytes_actually_read == 0 instead of bytes_actually_read < bytes_to_read_now + if(bytes_to_read_now == 0 || bytes_actually_read == 0) + { + dbg_printf("[WRITE][DATA][CH376_CMD_BYTE_READ] all done: read operated with success (no more data)\n"); + ch376->command_status = CH376_INT_SUCCESS; } else { - dbg_printf("[WRITE][DATA][CH376_CMD_BYTE_READ] aborted: read failure\n"); - - ch376->nb_bytes_in_cmd_data = 0; - ch376->interface_status = 0; - ch376->command_status = CH376_RET_ABORT; + dbg_printf("[WRITE][DATA][CH376_CMD_BYTE_READ] all done: read operated with success (waiting data read for %d bytes out of %d)\n", ch376->nb_bytes_in_cmd_data, ch376->bytes_to_read_write); + ch376->command_status = CH376_INT_DISK_READ; } + } + else + { + dbg_printf("[WRITE][DATA][CH376_CMD_BYTE_READ] aborted: read failure\n"); + + ch376->nb_bytes_in_cmd_data = 0; + ch376->interface_status = 0; + ch376->command_status = CH376_RET_ABORT; + } } static void file_write_chunk(struct ch376 *ch376) { - CH376_S32 bytes_to_write_now; - CH376_S32 bytes_actually_written; + CH376_S32 bytes_to_write_now; + CH376_S32 bytes_actually_written; - bytes_to_write_now = ch376->nb_bytes_in_cmd_data; + bytes_to_write_now = ch376->nb_bytes_in_cmd_data; - bytes_actually_written = system_file_write(&ch376->context, ch376->current_file, &ch376->cmd_data.CMD_IOBuffer, bytes_to_write_now); + bytes_actually_written = system_file_write(&ch376->context, ch376->current_file, &ch376->cmd_data.CMD_IOBuffer, bytes_to_write_now); - if(bytes_actually_written == bytes_to_write_now) - { - ch376->bytes_to_read_write -= (CH376_U16)bytes_actually_written; - - ch376->nb_bytes_in_cmd_data = 0; - ch376->interface_status = 127; - if(ch376->bytes_to_read_write == 0) - { - dbg_printf("[WRITE][DATA][CH376_CMD_BYTE_WRITE] all done: write operated with success (no more data)\n"); - ch376->command_status = CH376_INT_SUCCESS; - } - else - { - if(ch376->bytes_to_read_write > sizeof(ch376->cmd_data.CMD_IOBuffer)) - ch376->nb_bytes_in_cmd_data = sizeof(ch376->cmd_data.CMD_IOBuffer); - else - ch376->nb_bytes_in_cmd_data = (CH376_U8)ch376->bytes_to_read_write; + if(bytes_actually_written == bytes_to_write_now) + { + ch376->bytes_to_read_write -= (CH376_U16)bytes_actually_written; - dbg_printf("[WRITE][DATA][CH376_CMD_BYTE_WRITE] all done: write operated with success (waiting data write for %d bytes out of %d)\n", ch376->nb_bytes_in_cmd_data, ch376->bytes_to_read_write); - ch376->command_status = CH376_INT_DISK_WRITE; - } + ch376->nb_bytes_in_cmd_data = 0; + ch376->interface_status = 127; + if(ch376->bytes_to_read_write == 0) + { + dbg_printf("[WRITE][DATA][CH376_CMD_BYTE_WRITE] all done: write operated with success (no more data)\n"); + ch376->command_status = CH376_INT_SUCCESS; } else { - dbg_printf("[WRITE][DATA][CH376_CMD_BYTE_WRITE] aborted: write failure\n"); + if(ch376->bytes_to_read_write > sizeof(ch376->cmd_data.CMD_IOBuffer)) + ch376->nb_bytes_in_cmd_data = sizeof(ch376->cmd_data.CMD_IOBuffer); + else + ch376->nb_bytes_in_cmd_data = (CH376_U8)ch376->bytes_to_read_write; - ch376->nb_bytes_in_cmd_data = 0; - ch376->interface_status = 0; - ch376->command_status = CH376_RET_ABORT; + dbg_printf("[WRITE][DATA][CH376_CMD_BYTE_WRITE] all done: write operated with success (waiting data write for %d bytes out of %d)\n", ch376->nb_bytes_in_cmd_data, ch376->bytes_to_read_write); + ch376->command_status = CH376_INT_DISK_WRITE; } + } + else + { + dbg_printf("[WRITE][DATA][CH376_CMD_BYTE_WRITE] aborted: write failure\n"); + + ch376->nb_bytes_in_cmd_data = 0; + ch376->interface_status = 0; + ch376->command_status = CH376_RET_ABORT; + } } // Normalize file pattern (use normalize_file_name()) -static const char * normalize_pattern(const char *pattern, char *normalized_pattern) +static const char* normalize_pattern(const char* pattern, char* normalized_pattern) { - int i = -1; + int i = -1; - dbg_printf("normalize_pattern: '%s'\n", normalized_pattern); + dbg_printf("normalize_pattern: '%s'\n", normalized_pattern); - if (!strcmp(pattern, "*")) - { - dbg_printf("normalize_pattern: * -> *.*\n"); - normalize_file_name("*.*", normalized_pattern); - } - else if (!normalize_file_name(pattern, normalized_pattern)) - { - dbg_printf("normalize_pattern: error\n"); - normalized_pattern[0] = '\0'; // if used, pattern_match() will always return FALSE - return NULL; - } + if(!strcmp(pattern, "*")) + { + dbg_printf("normalize_pattern: * -> *.*\n"); + normalize_file_name("*.*", normalized_pattern); + } + else if(!normalize_file_name(pattern, normalized_pattern)) + { + dbg_printf("normalize_pattern: error\n"); + normalized_pattern[0] = '\0'; // if used, pattern_match() will always return FALSE + return NULL; + } - while (i<11) + while(i<11) + { + i++; + if(normalized_pattern[i] == '*') { - i++; - if (normalized_pattern[i] == '*') - { - // We can't use '?' as wildcard character because ch376 can't use '?' as meta character - // Unlike DOS: Here '*' means any character up to end of filename including extension part - while (i < 11) - normalized_pattern[i++]='*'; - } + // We can't use '?' as wildcard character because ch376 can't use '?' as meta character + // Unlike DOS: Here '*' means any character up to end of filename including extension part + while(i < 11) + normalized_pattern[i++]='*'; } + } - dbg_printf("normalize_pattern: '%s' (i=%d)\n", normalized_pattern, i); + dbg_printf("normalize_pattern: '%s' (i=%d)\n", normalized_pattern, i); - return normalized_pattern; + return normalized_pattern; } // Check file_name against pattern // file_name and pattern must be normalized before calling the function -static CH376_BOOL pattern_match(const char *pattern, const char * file_name) +static CH376_BOOL pattern_match(const char* pattern, const char* file_name) { - CH376_BOOL found = CH376_FALSE; - int i=0; + CH376_BOOL found = CH376_FALSE; + int i=0; - dbg_printf("pattern_match('%s', '%s') => ", pattern, file_name); + dbg_printf("pattern_match('%s', '%s') => ", pattern, file_name); - while(1) + while(1) + { + if(pattern[i] != '*') { - if (pattern[i] != '*') - { - if (pattern[i] != file_name[i]) - { - found = CH376_FALSE; - break; - } - if (pattern[i] == '\0') - { - found = CH376_TRUE; - break; - } - } - else - { - if (file_name[i] == '\0') - { - found = CH376_TRUE; - break; - } - } - i++; + if(pattern[i] != file_name[i]) + { + found = CH376_FALSE; + break; + } + if(pattern[i] == '\0') + { + found = CH376_TRUE; + break; + } + } + else + { + if(file_name[i] == '\0') + { + found = CH376_TRUE; + break; + } } + i++; + } - dbg_printf("i=%d, found=%d\n", i, found); - return found; + dbg_printf("i=%d, found=%d\n", i, found); + return found; } /* /// */ @@ -1828,8 +1829,8 @@ static CH376_BOOL pattern_match(const char *pattern, const char * file_name) CH376_U8 ch376_read_command_port(struct ch376 *ch376) { - dbg_printf("[READ][COMMAND] during command &%02x status &%02x\n", ch376->command, ch376->command_status); - return ch376->interface_status; + dbg_printf("[READ][COMMAND] during command &%02x status &%02x\n", ch376->command, ch376->command_status); + return ch376->interface_status; } /* /// */ @@ -1838,112 +1839,112 @@ CH376_U8 ch376_read_command_port(struct ch376 *ch376) CH376_U8 ch376_read_data_port(struct ch376 *ch376) { - CH376_U8 data_out = 0xff; // Hi-Z + CH376_U8 data_out = 0xff; // Hi-Z - dbg_printf(">> [READ][DATA] for during command &%02x status &%02x\n", ch376->command, ch376->command_status); + dbg_printf(">> [READ][DATA] for during command &%02x status &%02x\n", ch376->command, ch376->command_status); - switch(ch376->command) - { + switch(ch376->command) + { case CH376_CMD_CHECK_EXIST: - data_out = ch376->cmd_data.CMD_CheckByte; - dbg_printf("[READ][DATA][CH376_CMD_CHECK_EXIST] setting data port to &%02x\n", data_out); - break; + data_out = ch376->cmd_data.CMD_CheckByte; + dbg_printf("[READ][DATA][CH376_CMD_CHECK_EXIST] setting data port to &%02x\n", data_out); + break; case CH376_CMD_READ_VAR32: - if(ch376->nb_bytes_in_cmd_data) + if(ch376->nb_bytes_in_cmd_data) + { + if(ch376->nb_bytes_in_cmd_data != ch376->pos_rw_in_cmd_data) { - if(ch376->nb_bytes_in_cmd_data != ch376->pos_rw_in_cmd_data) - { - data_out = ch376->cmd_data.CMD_VAR32[ch376->pos_rw_in_cmd_data]; + data_out = ch376->cmd_data.CMD_VAR32[ch376->pos_rw_in_cmd_data]; - dbg_printf("[READ][DATA][CH376_CMD_READ_VAR32] read &%02x from i/o buffer at position &%02x\n", data_out, ch376->pos_rw_in_cmd_data); + dbg_printf("[READ][DATA][CH376_CMD_READ_VAR32] read &%02x from i/o buffer at position &%02x\n", data_out, ch376->pos_rw_in_cmd_data); - if(++ch376->pos_rw_in_cmd_data == ch376->nb_bytes_in_cmd_data) - ch376->nb_bytes_in_cmd_data = 0; - } - } - else - { - data_out = 0; - dbg_printf("[READ][DATA][CH376_CMD_READ_VAR32] nothing to read from i/o buffer\n"); + if(++ch376->pos_rw_in_cmd_data == ch376->nb_bytes_in_cmd_data) + ch376->nb_bytes_in_cmd_data = 0; } + } + else + { + data_out = 0; + dbg_printf("[READ][DATA][CH376_CMD_READ_VAR32] nothing to read from i/o buffer\n"); + } - break; + break; case CH376_CMD_GET_IC_VER: - data_out = (0x40 | CH376_DATA_IC_VER) & 0x7f; - dbg_printf("[READ][DATA][CH376_CMD_GET_IC_VER] setting data port to &%02x\n", data_out); - break; + data_out = (0x40 | CH376_DATA_IC_VER) & 0x7f; + dbg_printf("[READ][DATA][CH376_CMD_GET_IC_VER] setting data port to &%02x\n", data_out); + break; case CH376_CMD_SET_USB_MODE: - if(ch376->usb_mode == CH376_ARG_SET_USB_MODE_INVALID) - { - data_out = CH376_RET_ABORT; - dbg_printf("[READ][DATA][CH376_SET_USB_MODE] aborted!\n"); - } - else - { - data_out = CH376_RET_SUCCESS; - dbg_printf("[READ][DATA][CH376_SET_USB_MODE] completed!\n"); - } - break; + if(ch376->usb_mode == CH376_ARG_SET_USB_MODE_INVALID) + { + data_out = CH376_RET_ABORT; + dbg_printf("[READ][DATA][CH376_SET_USB_MODE] aborted!\n"); + } + else + { + data_out = CH376_RET_SUCCESS; + dbg_printf("[READ][DATA][CH376_SET_USB_MODE] completed!\n"); + } + break; case CH376_CMD_GET_STATUS: - data_out = ch376->command_status; - dbg_printf("[READ][DATA][CH376_CMD_GET_STATUS] setting data port to &%02x\n", data_out); - break; + data_out = ch376->command_status; + dbg_printf("[READ][DATA][CH376_CMD_GET_STATUS] setting data port to &%02x\n", data_out); + break; case CH376_CMD_RD_USB_DATA0: - if(ch376->nb_bytes_in_cmd_data) + if(ch376->nb_bytes_in_cmd_data) + { + if(ch376->pos_rw_in_cmd_data == CMD_DATA_REQ_SIZE) { - if(ch376->pos_rw_in_cmd_data == CMD_DATA_REQ_SIZE) - { - data_out = ch376->nb_bytes_in_cmd_data; - ch376->pos_rw_in_cmd_data = 0; - dbg_printf("[READ][DATA][CH376_CMD_RD_USB_DATA0] read i/o buffer size: &%02x\n", data_out); - } - else if(ch376->nb_bytes_in_cmd_data != ch376->pos_rw_in_cmd_data) - { - data_out = ch376->cmd_data.CMD_IOBuffer[ch376->pos_rw_in_cmd_data]; - - dbg_printf("[READ][DATA][CH376_CMD_RD_USB_DATA0] read \"%c\" (&%02x) from i/o buffer at position &%02x\n", data_out, data_out, ch376->pos_rw_in_cmd_data); - - if(++ch376->pos_rw_in_cmd_data == ch376->nb_bytes_in_cmd_data) - ch376->nb_bytes_in_cmd_data = 0; - } + data_out = ch376->nb_bytes_in_cmd_data; + ch376->pos_rw_in_cmd_data = 0; + dbg_printf("[READ][DATA][CH376_CMD_RD_USB_DATA0] read i/o buffer size: &%02x\n", data_out); } - else + else if(ch376->nb_bytes_in_cmd_data != ch376->pos_rw_in_cmd_data) { - data_out = 0; - dbg_printf("[READ][DATA][CH376_CMD_RD_USB_DATA0] nothing to read from i/o buffer\n"); + data_out = ch376->cmd_data.CMD_IOBuffer[ch376->pos_rw_in_cmd_data]; + + dbg_printf("[READ][DATA][CH376_CMD_RD_USB_DATA0] read \"%c\" (&%02x) from i/o buffer at position &%02x\n", data_out, data_out, ch376->pos_rw_in_cmd_data); + + if(++ch376->pos_rw_in_cmd_data == ch376->nb_bytes_in_cmd_data) + ch376->nb_bytes_in_cmd_data = 0; } - break; + } + else + { + data_out = 0; + dbg_printf("[READ][DATA][CH376_CMD_RD_USB_DATA0] nothing to read from i/o buffer\n"); + } + break; case CH376_CMD_WR_REQ_DATA: - if(ch376->nb_bytes_in_cmd_data) - { - if(ch376->pos_rw_in_cmd_data == CMD_DATA_REQ_SIZE) - { - data_out = ch376->nb_bytes_in_cmd_data; - ch376->pos_rw_in_cmd_data = 0; - dbg_printf("[READ][DATA][CH376_CMD_WR_REQ_DATA] read i/o buffer size: &%02x\n", data_out); - } - } - else + if(ch376->nb_bytes_in_cmd_data) + { + if(ch376->pos_rw_in_cmd_data == CMD_DATA_REQ_SIZE) { - data_out = 0; - dbg_printf("[READ][DATA][CH376_CMD_WR_REQ_DATA] nothing to read from i/o buffer\n"); + data_out = ch376->nb_bytes_in_cmd_data; + ch376->pos_rw_in_cmd_data = 0; + dbg_printf("[READ][DATA][CH376_CMD_WR_REQ_DATA] read i/o buffer size: &%02x\n", data_out); } - break; + } + else + { + data_out = 0; + dbg_printf("[READ][DATA][CH376_CMD_WR_REQ_DATA] nothing to read from i/o buffer\n"); + } + break; // Emulate CH376 bug which returns the 1st byte in data buffer // when read is performed on an unexpected command default: - data_out = ch376->cmd_data.CMD_IOBuffer[0]; - break; - } + data_out = ch376->cmd_data.CMD_IOBuffer[0]; + break; + } - dbg_printf("<< [READ][DATA] for during command &%02x status &%02x\n", ch376->command, ch376->command_status); + dbg_printf("<< [READ][DATA] for during command &%02x status &%02x\n", ch376->command, ch376->command_status); return data_out; @@ -1955,494 +1956,494 @@ CH376_U8 ch376_read_data_port(struct ch376 *ch376) void ch376_write_command_port(struct ch376 *ch376, CH376_U8 command) { - dbg_printf(">> [WRITE][COMMAND] Write command &%02x status &%02x\n", command, ch376->command_status); + dbg_printf(">> [WRITE][COMMAND] Write command &%02x status &%02x\n", command, ch376->command_status); - ch376->interface_status = 0; + ch376->interface_status = 0; - // Emulate CH376 bug which can get the check byte - // from the command port instead of the data port! - if(ch376->command == CH376_CMD_CHECK_EXIST) - { - ch376->cmd_data.CMD_CheckByte = ~command; - dbg_printf("[WRITE][COMMAND][CH376_CMD_CHECK_EXIST] got check byte &%02x from command port!\n", command); - } + // Emulate CH376 bug which can get the check byte + // from the command port instead of the data port! + if(ch376->command == CH376_CMD_CHECK_EXIST) + { + ch376->cmd_data.CMD_CheckByte = ~command; + dbg_printf("[WRITE][COMMAND][CH376_CMD_CHECK_EXIST] got check byte &%02x from command port!\n", command); + } - switch(command) - { + switch(command) + { case CH376_CMD_CHECK_EXIST: - ch376->command = CH376_CMD_CHECK_EXIST; - dbg_printf("[WRITE][COMMAND][CH376_CMD_CHECK_EXIST] waiting for check byte\n"); - break; + ch376->command = CH376_CMD_CHECK_EXIST; + dbg_printf("[WRITE][COMMAND][CH376_CMD_CHECK_EXIST] waiting for check byte\n"); + break; case CH376_CMD_READ_VAR32: - ch376->command = CH376_CMD_READ_VAR32; - dbg_printf("[WRITE][COMMAND][CH376_CMD_READ_VAR32] wait for var offset byte\n"); - break; + ch376->command = CH376_CMD_READ_VAR32; + dbg_printf("[WRITE][COMMAND][CH376_CMD_READ_VAR32] wait for var offset byte\n"); + break; case CH376_CMD_GET_IC_VER: - ch376->command = CH376_CMD_GET_IC_VER; - dbg_printf("[WRITE][COMMAND][CH376_CMD_GET_IC_VER]\n"); - break; + ch376->command = CH376_CMD_GET_IC_VER; + dbg_printf("[WRITE][COMMAND][CH376_CMD_GET_IC_VER]\n"); + break; case CH376_CMD_SET_USB_MODE: - ch376->command = CH376_CMD_SET_USB_MODE; - dbg_printf("[WRITE][COMMAND][CH376_CMD_SET_USB_MODE] waiting for usb mode data\n"); - break; + ch376->command = CH376_CMD_SET_USB_MODE; + dbg_printf("[WRITE][COMMAND][CH376_CMD_SET_USB_MODE] waiting for usb mode data\n"); + break; case CH376_CMD_DISK_MOUNT: - ch376->command = CH376_CMD_DISK_MOUNT; - cancel_all_io(ch376); - // If directory is available, we consider that it's mounted! - if(ch376->usb_mode == CH376_ARG_SET_USB_MODE_SD_HOST) - ch376->root_dir_lock = system_obtain_directory_lock(&ch376->context, ch376->sdcard_drive_path, NULL); - else if(ch376->usb_mode == CH376_ARG_SET_USB_MODE_USB_HOST) - ch376->root_dir_lock = system_obtain_directory_lock(&ch376->context, ch376->usb_drive_path, NULL); - - if(ch376->root_dir_lock) - { - ch376->cmd_data.CMD_MountInfo.MOUNT_DeviceType = 0; - ch376->cmd_data.CMD_MountInfo.MOUNT_RemovableMedia = 0; - ch376->cmd_data.CMD_MountInfo.MOUNT_Versions = 0; - ch376->cmd_data.CMD_MountInfo.MOUNT_DataFormatAndEtc = 0; - ch376->cmd_data.CMD_MountInfo.MOUNT_AdditionalLength = 0; - ch376->cmd_data.CMD_MountInfo.MOUNT_Reserved1 = 0; - ch376->cmd_data.CMD_MountInfo.MOUNT_Reserved2 = 0; - ch376->cmd_data.CMD_MountInfo.MOUNT_MiscFlag = 0; - ch376->cmd_data.CMD_MountInfo.MOUNT_VendorIdStr[0] = 'J'; - ch376->cmd_data.CMD_MountInfo.MOUNT_VendorIdStr[1] = 'E'; - ch376->cmd_data.CMD_MountInfo.MOUNT_VendorIdStr[2] = 'D'; - ch376->cmd_data.CMD_MountInfo.MOUNT_VendorIdStr[3] = 'E'; - ch376->cmd_data.CMD_MountInfo.MOUNT_VendorIdStr[4] = '+'; - ch376->cmd_data.CMD_MountInfo.MOUNT_VendorIdStr[5] = 'O'; - ch376->cmd_data.CMD_MountInfo.MOUNT_VendorIdStr[6] = 'F'; - ch376->cmd_data.CMD_MountInfo.MOUNT_VendorIdStr[7] = 'T'; - ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[ 0] = 'C'; - ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[ 1] = 'H'; - ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[ 2] = '3'; - ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[ 3] = '7'; - ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[ 4] = '6'; - ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[ 5] = ' '; - ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[ 6] = 'E'; - ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[ 7] = 'M'; - ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[ 8] = 'U'; - ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[ 9] = 'L'; - ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[10] = 'A'; - ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[11] = 'T'; - ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[12] = 'O'; - ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[13] = 'R'; - ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[14] = ' '; - ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[15] = ' '; - ch376->cmd_data.CMD_MountInfo.MOUNT_ProductRevStr[0] = 'F'; - ch376->cmd_data.CMD_MountInfo.MOUNT_ProductRevStr[1] = 'A'; - ch376->cmd_data.CMD_MountInfo.MOUNT_ProductRevStr[2] = 'M'; - ch376->cmd_data.CMD_MountInfo.MOUNT_ProductRevStr[3] = 'E'; - - dbg_printf("[WRITE][COMMAND][CH376_CMD_DISK_MOUNT] drive directory is found (mounted :); additional data available\n"); - - ch376->nb_bytes_in_cmd_data = sizeof(ch376->cmd_data.CMD_MountInfo); - ch376->interface_status = 127; // Found :) - ch376->command_status = CH376_INT_SUCCESS; - } - else - { - dbg_printf("[WRITE][COMMAND][CH376_CMD_DISK_MOUNT] drive directory not found\n"); - ch376->command_status = 0x1f; // Don't know if it's this code - } - break; + ch376->command = CH376_CMD_DISK_MOUNT; + cancel_all_io(ch376); + // If directory is available, we consider that it's mounted! + if(ch376->usb_mode == CH376_ARG_SET_USB_MODE_SD_HOST) + ch376->root_dir_lock = system_obtain_directory_lock(&ch376->context, ch376->sdcard_drive_path, NULL); + else if(ch376->usb_mode == CH376_ARG_SET_USB_MODE_USB_HOST) + ch376->root_dir_lock = system_obtain_directory_lock(&ch376->context, ch376->usb_drive_path, NULL); + + if(ch376->root_dir_lock) + { + ch376->cmd_data.CMD_MountInfo.MOUNT_DeviceType = 0; + ch376->cmd_data.CMD_MountInfo.MOUNT_RemovableMedia = 0; + ch376->cmd_data.CMD_MountInfo.MOUNT_Versions = 0; + ch376->cmd_data.CMD_MountInfo.MOUNT_DataFormatAndEtc = 0; + ch376->cmd_data.CMD_MountInfo.MOUNT_AdditionalLength = 0; + ch376->cmd_data.CMD_MountInfo.MOUNT_Reserved1 = 0; + ch376->cmd_data.CMD_MountInfo.MOUNT_Reserved2 = 0; + ch376->cmd_data.CMD_MountInfo.MOUNT_MiscFlag = 0; + ch376->cmd_data.CMD_MountInfo.MOUNT_VendorIdStr[0] = 'J'; + ch376->cmd_data.CMD_MountInfo.MOUNT_VendorIdStr[1] = 'E'; + ch376->cmd_data.CMD_MountInfo.MOUNT_VendorIdStr[2] = 'D'; + ch376->cmd_data.CMD_MountInfo.MOUNT_VendorIdStr[3] = 'E'; + ch376->cmd_data.CMD_MountInfo.MOUNT_VendorIdStr[4] = '+'; + ch376->cmd_data.CMD_MountInfo.MOUNT_VendorIdStr[5] = 'O'; + ch376->cmd_data.CMD_MountInfo.MOUNT_VendorIdStr[6] = 'F'; + ch376->cmd_data.CMD_MountInfo.MOUNT_VendorIdStr[7] = 'T'; + ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[ 0] = 'C'; + ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[ 1] = 'H'; + ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[ 2] = '3'; + ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[ 3] = '7'; + ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[ 4] = '6'; + ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[ 5] = ' '; + ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[ 6] = 'E'; + ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[ 7] = 'M'; + ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[ 8] = 'U'; + ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[ 9] = 'L'; + ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[10] = 'A'; + ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[11] = 'T'; + ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[12] = 'O'; + ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[13] = 'R'; + ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[14] = ' '; + ch376->cmd_data.CMD_MountInfo.MOUNT_ProductIdStr[15] = ' '; + ch376->cmd_data.CMD_MountInfo.MOUNT_ProductRevStr[0] = 'F'; + ch376->cmd_data.CMD_MountInfo.MOUNT_ProductRevStr[1] = 'A'; + ch376->cmd_data.CMD_MountInfo.MOUNT_ProductRevStr[2] = 'M'; + ch376->cmd_data.CMD_MountInfo.MOUNT_ProductRevStr[3] = 'E'; + + dbg_printf("[WRITE][COMMAND][CH376_CMD_DISK_MOUNT] drive directory is found (mounted :); additional data available\n"); + + ch376->nb_bytes_in_cmd_data = sizeof(ch376->cmd_data.CMD_MountInfo); + ch376->interface_status = 127; // Found :) + ch376->command_status = CH376_INT_SUCCESS; + } + else + { + dbg_printf("[WRITE][COMMAND][CH376_CMD_DISK_MOUNT] drive directory not found\n"); + ch376->command_status = 0x1f; // Don't know if it's this code + } + break; case CH376_CMD_GET_STATUS: - ch376->command = CH376_CMD_GET_STATUS; - dbg_printf("[WRITE][COMMAND][CH376_CMD_GET_STATUS] waiting for status reading\n"); - break; + ch376->command = CH376_CMD_GET_STATUS; + dbg_printf("[WRITE][COMMAND][CH376_CMD_GET_STATUS] waiting for status reading\n"); + break; case CH376_CMD_SET_FILE_NAME: - ch376->command = CH376_CMD_SET_FILE_NAME; - ch376->pos_rw_in_cmd_data = 0; - dbg_printf("[WRITE][COMMAND][CH376_CMD_SET_FILE_NAME] waiting for file name\n"); - break; + ch376->command = CH376_CMD_SET_FILE_NAME; + ch376->pos_rw_in_cmd_data = 0; + dbg_printf("[WRITE][COMMAND][CH376_CMD_SET_FILE_NAME] waiting for file name\n"); + break; case CH376_CMD_FILE_OPEN: - ch376->command = CH376_CMD_FILE_OPEN; - // mounted? - if(ch376->root_dir_lock) + ch376->command = CH376_CMD_FILE_OPEN; + // mounted? + if(ch376->root_dir_lock) + { + int i = 0; + + // back to root? + if(ch376->cmd_data.CMD_FileName[i] == '/') { - int i = 0; - - // back to root? - if(ch376->cmd_data.CMD_FileName[i] == '/') - { - dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_OPEN] opening root directory\n"); - system_release_directory_lock(&ch376->context, ch376->current_dir_lock); - ch376->current_dir_lock = system_clone_directory_lock(&ch376->context, ch376->root_dir_lock); - i++; - } + dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_OPEN] opening root directory\n"); + system_release_directory_lock(&ch376->context, ch376->current_dir_lock); + ch376->current_dir_lock = system_clone_directory_lock(&ch376->context, ch376->root_dir_lock); + i++; + } - if(ch376->cmd_data.CMD_FileName[i] == '\0') - { - // We are done - ch376->interface_status = 127; // Found :) - ch376->command_status = CH376_ERR_OPEN_DIR; - ch376->current_file_is_directory = CH376_TRUE; - } - else - { - // wildcard? - if(strchr(ch376->cmd_data.CMD_FileName,'*') || strchr(ch376->cmd_data.CMD_FileName,'?')) - { - dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_OPEN] examining directory contents\n"); - - // Start a directory examine session - system_finish_examine_directory(&ch376->context, ch376->current_directory_browsing); - ch376->current_directory_browsing = system_start_examine_directory(&ch376->context, ch376->current_dir_lock); - normalize_pattern(ch376->cmd_data.CMD_FileName, ch376->dir_pattern); - - goto file_enum_go; - } - else - { - char fixed_file_name[13]; // Max = 8 + '.' + 3 + '\0' - CH376_LOCK current_dir_lock; - trim_file_name(&ch376->cmd_data.CMD_FileName[i], fixed_file_name); - - current_dir_lock = system_obtain_directory_lock(&ch376->context, fixed_file_name, ch376->current_dir_lock); - - // Enter new directory? - if(current_dir_lock) - { - dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_OPEN] entering directory: %s\n", &ch376->cmd_data.CMD_FileName[i]); - - system_release_directory_lock(&ch376->context, ch376->current_dir_lock); - ch376->current_dir_lock = current_dir_lock; - ch376->current_file_is_directory = CH376_TRUE; - - ch376->interface_status = 127; // Found :) - ch376->command_status = CH376_ERR_OPEN_DIR; - } - // Open existing file? - else - { - system_file_close(&ch376->context, ch376->current_file); - ch376->current_file = system_file_open_existing(&ch376->context, fixed_file_name, ch376->current_dir_lock); - - dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_OPEN] opening the file: %s\n", &ch376->cmd_data.CMD_FileName[i]); - - if(ch376->current_file) - { - ch376->interface_status = 127; // Found :) - ch376->command_status = CH376_INT_SUCCESS; - ch376->current_file_is_directory = CH376_FALSE; - } - else - { - ch376->interface_status = 0; - ch376->command_status = CH376_ERR_MISS_FILE; - } - } - } - } + if(ch376->cmd_data.CMD_FileName[i] == '\0') + { + // We are done + ch376->interface_status = 127; // Found :) + ch376->command_status = CH376_ERR_OPEN_DIR; + ch376->current_file_is_directory = CH376_TRUE; } else { - dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_OPEN] no operation possible (device not mounted)\n"); + // wildcard? + if(strchr(ch376->cmd_data.CMD_FileName,'*') || strchr(ch376->cmd_data.CMD_FileName,'?')) + { + dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_OPEN] examining directory contents\n"); - ch376->interface_status = 0; - ch376->command_status = CH376_RET_ABORT; - } - break; + // Start a directory examine session + system_finish_examine_directory(&ch376->context, ch376->current_directory_browsing); + ch376->current_directory_browsing = system_start_examine_directory(&ch376->context, ch376->current_dir_lock); + normalize_pattern(ch376->cmd_data.CMD_FileName, ch376->dir_pattern); - case CH376_CMD_FILE_CREATE: - ch376->command = CH376_CMD_FILE_CREATE; - // mounted? - if(ch376->root_dir_lock) - { - int i = 0; + goto file_enum_go; + } + else + { + char fixed_file_name[13]; // Max = 8 + '.' + 3 + '\0' + CH376_LOCK current_dir_lock; + trim_file_name(&ch376->cmd_data.CMD_FileName[i], fixed_file_name); - // back to root? - if(ch376->cmd_data.CMD_FileName[i] == '/') - { - dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_CREATE] opening root directory\n"); - system_release_directory_lock(&ch376->context, ch376->current_dir_lock); - ch376->current_dir_lock = system_clone_directory_lock(&ch376->context, ch376->root_dir_lock); - i++; - } + current_dir_lock = system_obtain_directory_lock(&ch376->context, fixed_file_name, ch376->current_dir_lock); - if(ch376->cmd_data.CMD_FileName[i] == '\0') + // Enter new directory? + if(current_dir_lock) { - // We are done - ch376->interface_status = 127; // Found :) - ch376->command_status = CH376_INT_SUCCESS; + dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_OPEN] entering directory: %s\n", &ch376->cmd_data.CMD_FileName[i]); + + system_release_directory_lock(&ch376->context, ch376->current_dir_lock); + ch376->current_dir_lock = current_dir_lock; + ch376->current_file_is_directory = CH376_TRUE; + + ch376->interface_status = 127; // Found :) + ch376->command_status = CH376_ERR_OPEN_DIR; } + // Open existing file? else { - char fixed_file_name[13]; // Max = 8 + '.' + 3 + '\0' - trim_file_name(&ch376->cmd_data.CMD_FileName[i], fixed_file_name); - - // Create file - system_file_close(&ch376->context, ch376->current_file); - ch376->current_file = system_file_open_new(&ch376->context, fixed_file_name, ch376->current_dir_lock); - - dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_CREATE] creating the file: %s\n", &ch376->cmd_data.CMD_FileName[i]); - - if(ch376->current_file) - { - ch376->interface_status = 127; // Found :) - ch376->command_status = CH376_INT_SUCCESS; - } - else - { - ch376->interface_status = 0; - ch376->command_status = CH376_ERR_MISS_FILE; - } + system_file_close(&ch376->context, ch376->current_file); + ch376->current_file = system_file_open_existing(&ch376->context, fixed_file_name, ch376->current_dir_lock); + + dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_OPEN] opening the file: %s\n", &ch376->cmd_data.CMD_FileName[i]); + + if(ch376->current_file) + { + ch376->interface_status = 127; // Found :) + ch376->command_status = CH376_INT_SUCCESS; + ch376->current_file_is_directory = CH376_FALSE; + } + else + { + ch376->interface_status = 0; + ch376->command_status = CH376_ERR_MISS_FILE; + } } + } + } + } + else + { + dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_OPEN] no operation possible (device not mounted)\n"); + + ch376->interface_status = 0; + ch376->command_status = CH376_RET_ABORT; + } + break; + + case CH376_CMD_FILE_CREATE: + ch376->command = CH376_CMD_FILE_CREATE; + // mounted? + if(ch376->root_dir_lock) + { + int i = 0; + + // back to root? + if(ch376->cmd_data.CMD_FileName[i] == '/') + { + dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_CREATE] opening root directory\n"); + system_release_directory_lock(&ch376->context, ch376->current_dir_lock); + ch376->current_dir_lock = system_clone_directory_lock(&ch376->context, ch376->root_dir_lock); + i++; + } + + if(ch376->cmd_data.CMD_FileName[i] == '\0') + { + // We are done + ch376->interface_status = 127; // Found :) + ch376->command_status = CH376_INT_SUCCESS; } else { - dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_CREATE] no operation possible (device not mounted)\n"); + char fixed_file_name[13]; // Max = 8 + '.' + 3 + '\0' + trim_file_name(&ch376->cmd_data.CMD_FileName[i], fixed_file_name); + + // Create file + system_file_close(&ch376->context, ch376->current_file); + ch376->current_file = system_file_open_new(&ch376->context, fixed_file_name, ch376->current_dir_lock); + dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_CREATE] creating the file: %s\n", &ch376->cmd_data.CMD_FileName[i]); + + if(ch376->current_file) + { + ch376->interface_status = 127; // Found :) + ch376->command_status = CH376_INT_SUCCESS; + } + else + { ch376->interface_status = 0; - ch376->command_status = CH376_RET_ABORT; + ch376->command_status = CH376_ERR_MISS_FILE; + } } - break; + } + else + { + dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_CREATE] no operation possible (device not mounted)\n"); + + ch376->interface_status = 0; + ch376->command_status = CH376_RET_ABORT; + } + break; case CH376_CMD_DIR_CREATE: - ch376->command = CH376_CMD_DIR_CREATE; - // mounted? - if(ch376->root_dir_lock) + ch376->command = CH376_CMD_DIR_CREATE; + // mounted? + if(ch376->root_dir_lock) + { + char fixed_file_name[13]; // Max = 8 + '.' + 3 + '\0' + CH376_FILE existing_file; + int i = 0; + + // back to root? + if(ch376->cmd_data.CMD_FileName[i] == '/') { - char fixed_file_name[13]; // Max = 8 + '.' + 3 + '\0' - CH376_FILE existing_file; - int i = 0; - - // back to root? - if(ch376->cmd_data.CMD_FileName[i] == '/') - { - dbg_printf("[WRITE][COMMAND][CH376_CMD_DIR_CREATE] opening root directory\n"); - system_release_directory_lock(&ch376->context, ch376->current_dir_lock); - ch376->current_dir_lock = system_clone_directory_lock(&ch376->context, ch376->root_dir_lock); - i++; - } + dbg_printf("[WRITE][COMMAND][CH376_CMD_DIR_CREATE] opening root directory\n"); + system_release_directory_lock(&ch376->context, ch376->current_dir_lock); + ch376->current_dir_lock = system_clone_directory_lock(&ch376->context, ch376->root_dir_lock); + i++; + } - trim_file_name(&ch376->cmd_data.CMD_FileName[i], fixed_file_name); + trim_file_name(&ch376->cmd_data.CMD_FileName[i], fixed_file_name); - existing_file = system_file_open_existing(&ch376->context, fixed_file_name, ch376->current_dir_lock); + existing_file = system_file_open_existing(&ch376->context, fixed_file_name, ch376->current_dir_lock); - if(existing_file) - { - system_file_close(&ch376->context, existing_file); - ch376->interface_status = 0; - ch376->command_status = CH376_ERR_FOUND_NAME; - } - else - { - CH376_LOCK created_dir_lock; - - // Already created? - created_dir_lock = system_obtain_directory_lock(&ch376->context, fixed_file_name, ch376->current_dir_lock); + if(existing_file) + { + system_file_close(&ch376->context, existing_file); + ch376->interface_status = 0; + ch376->command_status = CH376_ERR_FOUND_NAME; + } + else + { + CH376_LOCK created_dir_lock; - if (!created_dir_lock) - created_dir_lock = system_create_directory(&ch376->context, fixed_file_name, ch376->current_dir_lock); + // Already created? + created_dir_lock = system_obtain_directory_lock(&ch376->context, fixed_file_name, ch376->current_dir_lock); - // Actually created? - if(created_dir_lock) - { - dbg_printf("[WRITE][COMMAND][CH376_CMD_DIR_CREATE] entering created directory: %s\n", &ch376->cmd_data.CMD_FileName[i]); + if(!created_dir_lock) + created_dir_lock = system_create_directory(&ch376->context, fixed_file_name, ch376->current_dir_lock); - system_release_directory_lock(&ch376->context, ch376->current_dir_lock); - ch376->current_dir_lock = created_dir_lock; + // Actually created? + if(created_dir_lock) + { + dbg_printf("[WRITE][COMMAND][CH376_CMD_DIR_CREATE] entering created directory: %s\n", &ch376->cmd_data.CMD_FileName[i]); - ch376->interface_status = 127; - ch376->command_status = CH376_INT_SUCCESS; - } - else - { - dbg_printf("[WRITE][COMMAND][CH376_CMD_DIR_CREATE] directory could not be created: %s\n", &ch376->cmd_data.CMD_FileName[i]); + system_release_directory_lock(&ch376->context, ch376->current_dir_lock); + ch376->current_dir_lock = created_dir_lock; - ch376->interface_status = 0; - ch376->command_status = CH376_ERR_MISS_FILE; - } - } - } - else - { - dbg_printf("[WRITE][COMMAND][CH376_CMD_DIR_CREATE] no operation possible (device not mounted)\n"); + ch376->interface_status = 127; + ch376->command_status = CH376_INT_SUCCESS; + } + else + { + dbg_printf("[WRITE][COMMAND][CH376_CMD_DIR_CREATE] directory could not be created: %s\n", &ch376->cmd_data.CMD_FileName[i]); ch376->interface_status = 0; - ch376->command_status = CH376_RET_ABORT; + ch376->command_status = CH376_ERR_MISS_FILE; + } } - break; + } + else + { + dbg_printf("[WRITE][COMMAND][CH376_CMD_DIR_CREATE] no operation possible (device not mounted)\n"); + + ch376->interface_status = 0; + ch376->command_status = CH376_RET_ABORT; + } + break; case CH376_CMD_FILE_ERASE: - ch376->command = CH376_CMD_FILE_ERASE; - // mounted? - if(ch376->root_dir_lock) + ch376->command = CH376_CMD_FILE_ERASE; + // mounted? + if(ch376->root_dir_lock) + { + char fixed_file_name[13]; // Max = 8 + '.' + 3 + '\0' + int i = 0; + CH376_BOOL file_erased = CH376_FALSE; + + // back to root? + if(ch376->cmd_data.CMD_FileName[i] == '/') { - char fixed_file_name[13]; // Max = 8 + '.' + 3 + '\0' - int i = 0; - CH376_BOOL file_erased = CH376_FALSE; + dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_ERASE] opening root directory\n"); + system_release_directory_lock(&ch376->context, ch376->current_dir_lock); + ch376->current_dir_lock = system_clone_directory_lock(&ch376->context, ch376->root_dir_lock); + i++; + } - // back to root? - if(ch376->cmd_data.CMD_FileName[i] == '/') - { - dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_ERASE] opening root directory\n"); - system_release_directory_lock(&ch376->context, ch376->current_dir_lock); - ch376->current_dir_lock = system_clone_directory_lock(&ch376->context, ch376->root_dir_lock); - i++; - } + if(ch376->cmd_data.CMD_FileName[i] != 0) + { + trim_file_name(&ch376->cmd_data.CMD_FileName[i], fixed_file_name); - if (ch376->cmd_data.CMD_FileName[i] != 0) - { - trim_file_name(&ch376->cmd_data.CMD_FileName[i], fixed_file_name); - - if(ch376->current_file) - { - system_file_close(&ch376->context, ch376->current_file); - ch376->current_file = (CH376_FILE)0; - } - - if (ch376->current_file_is_directory) - file_erased = system_directory_delete(&ch376->context, ch376->current_dir_lock); - else - file_erased = system_file_delete(&ch376->context, fixed_file_name, ch376->current_dir_lock); - } + if(ch376->current_file) + { + system_file_close(&ch376->context, ch376->current_file); + ch376->current_file = (CH376_FILE)0; + } - if (file_erased) - { - dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_ERASE] file or directory deleted: %s\n", &ch376->cmd_data.CMD_FileName[i]); + if(ch376->current_file_is_directory) + file_erased = system_directory_delete(&ch376->context, ch376->current_dir_lock); + else + file_erased = system_file_delete(&ch376->context, fixed_file_name, ch376->current_dir_lock); + } - ch376->interface_status = 127; - ch376->command_status = CH376_INT_SUCCESS; - } - else - { - dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_ERASE] file or directory could not be deleted: %s\n", &ch376->cmd_data.CMD_FileName[i]); + if(file_erased) + { + dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_ERASE] file or directory deleted: %s\n", &ch376->cmd_data.CMD_FileName[i]); - ch376->interface_status = 0; - ch376->command_status = CH376_ERR_MISS_FILE; - } + ch376->interface_status = 127; + ch376->command_status = CH376_INT_SUCCESS; } else { - dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_ERASE] no operation possible (device not mounted)\n"); + dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_ERASE] file or directory could not be deleted: %s\n", &ch376->cmd_data.CMD_FileName[i]); - ch376->interface_status = 0; - ch376->command_status = CH376_RET_ABORT; + ch376->interface_status = 0; + ch376->command_status = CH376_ERR_MISS_FILE; } - break; + } + else + { + dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_ERASE] no operation possible (device not mounted)\n"); + + ch376->interface_status = 0; + ch376->command_status = CH376_RET_ABORT; + } + break; case CH376_CMD_RD_USB_DATA0: - ch376->command = CH376_CMD_RD_USB_DATA0; - ch376->pos_rw_in_cmd_data = CMD_DATA_REQ_SIZE; // Will be reset when size is sent - dbg_printf("[WRITE][COMMAND][CH376_CMD_RD_USB_DATA0] waiting for i/o buffer read\n"); - break; + ch376->command = CH376_CMD_RD_USB_DATA0; + ch376->pos_rw_in_cmd_data = CMD_DATA_REQ_SIZE; // Will be reset when size is sent + dbg_printf("[WRITE][COMMAND][CH376_CMD_RD_USB_DATA0] waiting for i/o buffer read\n"); + break; case CH376_CMD_WR_REQ_DATA: - ch376->command = CH376_CMD_WR_REQ_DATA; - ch376->pos_rw_in_cmd_data = CMD_DATA_REQ_SIZE; // Will be reset when size is sent - dbg_printf("[WRITE][COMMAND][CH376_CMD_WR_REQ_DATA] waiting for i/o buffer write\n"); - break; + ch376->command = CH376_CMD_WR_REQ_DATA; + ch376->pos_rw_in_cmd_data = CMD_DATA_REQ_SIZE; // Will be reset when size is sent + dbg_printf("[WRITE][COMMAND][CH376_CMD_WR_REQ_DATA] waiting for i/o buffer write\n"); + break; case CH376_CMD_FILE_ENUM_GO: - ch376->command = CH376_CMD_FILE_ENUM_GO; + ch376->command = CH376_CMD_FILE_ENUM_GO; file_enum_go: - if(system_go_examine_directory(&ch376->context, ch376->current_dir_lock, ch376->current_directory_browsing, &ch376->cmd_data.CMD_FatDirInfo, ch376->dir_pattern)) - { - dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_ENUM_GO] next directory entry in buffer\n"); - ch376->nb_bytes_in_cmd_data = sizeof(ch376->cmd_data.CMD_FatDirInfo); - ch376->interface_status = 127; - ch376->command_status = CH376_INT_DISK_READ; - } - else - { - dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_ENUM_GO] directory browsing finished\n"); + if(system_go_examine_directory(&ch376->context, ch376->current_dir_lock, ch376->current_directory_browsing, &ch376->cmd_data.CMD_FatDirInfo, ch376->dir_pattern)) + { + dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_ENUM_GO] next directory entry in buffer\n"); + ch376->nb_bytes_in_cmd_data = sizeof(ch376->cmd_data.CMD_FatDirInfo); + ch376->interface_status = 127; + ch376->command_status = CH376_INT_DISK_READ; + } + else + { + dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_ENUM_GO] directory browsing finished\n"); - system_finish_examine_directory(&ch376->context, ch376->current_directory_browsing); - ch376->current_directory_browsing = (CH376_DIR)0; + system_finish_examine_directory(&ch376->context, ch376->current_directory_browsing); + ch376->current_directory_browsing = (CH376_DIR)0; - ch376->interface_status = 0; - ch376->command_status = CH376_ERR_OPEN_DIR; - } - break; + ch376->interface_status = 0; + ch376->command_status = CH376_ERR_OPEN_DIR; + } + break; case CH376_CMD_DISK_CAPACITY: - ch376->command = CH376_CMD_DISK_CAPACITY; - // mounted? - if(system_get_disk_info(&ch376->context, ch376->root_dir_lock, &ch376->cmd_data.CMD_DiskQuery)) - { - dbg_printf("[WRITE][COMMAND][CH376_CMD_DISK_CAPACITY] sector capacity in buffer\n"); - // Only first 4 bytes of cmd_data.CMD_DiskQuery - ch376->nb_bytes_in_cmd_data = 4; - ch376->interface_status = 127; - ch376->command_status = CH376_INT_SUCCESS; - } - else - { - dbg_printf("[WRITE][COMMAND][CH376_CMD_DISK_CAPACITY] no operation possible (device not mounted)\n"); - ch376->interface_status = 0; - ch376->command_status = CH376_RET_ABORT; - } - break; + ch376->command = CH376_CMD_DISK_CAPACITY; + // mounted? + if(system_get_disk_info(&ch376->context, ch376->root_dir_lock, &ch376->cmd_data.CMD_DiskQuery)) + { + dbg_printf("[WRITE][COMMAND][CH376_CMD_DISK_CAPACITY] sector capacity in buffer\n"); + // Only first 4 bytes of cmd_data.CMD_DiskQuery + ch376->nb_bytes_in_cmd_data = 4; + ch376->interface_status = 127; + ch376->command_status = CH376_INT_SUCCESS; + } + else + { + dbg_printf("[WRITE][COMMAND][CH376_CMD_DISK_CAPACITY] no operation possible (device not mounted)\n"); + ch376->interface_status = 0; + ch376->command_status = CH376_RET_ABORT; + } + break; case CH376_CMD_DISK_QUERY: - ch376->command = CH376_CMD_DISK_QUERY; - // mounted? - if(system_get_disk_info(&ch376->context, ch376->root_dir_lock, &ch376->cmd_data.CMD_DiskQuery)) - { - dbg_printf("[WRITE][COMMAND][CH376_CMD_DISK_QUERY] sector capacity in buffer\n"); - ch376->nb_bytes_in_cmd_data = sizeof(ch376->cmd_data.CMD_DiskQuery); - ch376->interface_status = 127; - ch376->command_status = CH376_INT_SUCCESS; - } - else - { - dbg_printf("[WRITE][COMMAND][CH376_CMD_DISK_QUERY] no operation possible (device not mounted)\n"); - ch376->interface_status = 0; - ch376->command_status = CH376_RET_ABORT; - } - break; + ch376->command = CH376_CMD_DISK_QUERY; + // mounted? + if(system_get_disk_info(&ch376->context, ch376->root_dir_lock, &ch376->cmd_data.CMD_DiskQuery)) + { + dbg_printf("[WRITE][COMMAND][CH376_CMD_DISK_QUERY] sector capacity in buffer\n"); + ch376->nb_bytes_in_cmd_data = sizeof(ch376->cmd_data.CMD_DiskQuery); + ch376->interface_status = 127; + ch376->command_status = CH376_INT_SUCCESS; + } + else + { + dbg_printf("[WRITE][COMMAND][CH376_CMD_DISK_QUERY] no operation possible (device not mounted)\n"); + ch376->interface_status = 0; + ch376->command_status = CH376_RET_ABORT; + } + break; case CH376_CMD_BYTE_LOCATE: - ch376->command = CH376_CMD_BYTE_LOCATE; - dbg_printf("[WRITE][COMMAND][CH376_CMD_BYTE_LOCATE] waiting for seek position\n"); - ch376->pos_rw_in_cmd_data = 0; - break; + ch376->command = CH376_CMD_BYTE_LOCATE; + dbg_printf("[WRITE][COMMAND][CH376_CMD_BYTE_LOCATE] waiting for seek position\n"); + ch376->pos_rw_in_cmd_data = 0; + break; case CH376_CMD_BYTE_READ: - ch376->command = CH376_CMD_BYTE_READ; - dbg_printf("[WRITE][COMMAND][CH376_CMD_BYTE_READ] waiting for read size\n"); - ch376->pos_rw_in_cmd_data = 0; - break; + ch376->command = CH376_CMD_BYTE_READ; + dbg_printf("[WRITE][COMMAND][CH376_CMD_BYTE_READ] waiting for read size\n"); + ch376->pos_rw_in_cmd_data = 0; + break; case CH376_CMD_BYTE_RD_GO: - ch376->command = CH376_CMD_BYTE_RD_GO; - dbg_printf("[WRITE][COMMAND][CH376_CMD_BYTE_RD_GO] waiting for next chunk to read\n"); - file_read_chunk(ch376); - break; + ch376->command = CH376_CMD_BYTE_RD_GO; + dbg_printf("[WRITE][COMMAND][CH376_CMD_BYTE_RD_GO] waiting for next chunk to read\n"); + file_read_chunk(ch376); + break; case CH376_CMD_BYTE_WRITE: - ch376->command = CH376_CMD_BYTE_WRITE; - dbg_printf("[WRITE][COMMAND][CH376_CMD_BYTE_WRITE] waiting for write size\n"); - ch376->pos_rw_in_cmd_data = 0; - break; + ch376->command = CH376_CMD_BYTE_WRITE; + dbg_printf("[WRITE][COMMAND][CH376_CMD_BYTE_WRITE] waiting for write size\n"); + ch376->pos_rw_in_cmd_data = 0; + break; case CH376_CMD_BYTE_WR_GO: - ch376->command = CH376_CMD_BYTE_WR_GO; - dbg_printf("[WRITE][COMMAND][CH376_CMD_BYTE_WR_GO] waiting for next chunk to write\n"); - file_write_chunk(ch376); - break; + ch376->command = CH376_CMD_BYTE_WR_GO; + dbg_printf("[WRITE][COMMAND][CH376_CMD_BYTE_WR_GO] waiting for next chunk to write\n"); + file_write_chunk(ch376); + break; case CH376_CMD_FILE_CLOSE: - ch376->command = CH376_CMD_FILE_CLOSE; - dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_CLOSE] waiting for close mode\n"); - break; + ch376->command = CH376_CMD_FILE_CLOSE; + dbg_printf("[WRITE][COMMAND][CH376_CMD_FILE_CLOSE] waiting for close mode\n"); + break; default: - dbg_printf("[WRITE][COMMAND][Unsupported] command &%02x not implemented\n", ch376->command); - ch376->interface_status = 0; - ch376->command_status = CH376_RET_ABORT; - break; - } + dbg_printf("[WRITE][COMMAND][Unsupported] command &%02x not implemented\n", ch376->command); + ch376->interface_status = 0; + ch376->command_status = CH376_RET_ABORT; + break; + } - dbg_printf("<< [WRITE][COMMAND] Write command &%02x status &%02x\n", ch376->command, ch376->command_status); + dbg_printf("<< [WRITE][COMMAND] Write command &%02x status &%02x\n", ch376->command, ch376->command_status); } /* /// */ @@ -2456,214 +2457,214 @@ void ch376_write_data_port(struct ch376 *ch376, CH376_U8 data) switch(ch376->command) { case CH376_CMD_CHECK_EXIST: - ch376->cmd_data.CMD_CheckByte = ~data; - dbg_printf("[WRITE][DATA][CH376_CMD_CHECK_EXIST] got check byte &%02x\n", data); - break; + ch376->cmd_data.CMD_CheckByte = ~data; + dbg_printf("[WRITE][DATA][CH376_CMD_CHECK_EXIST] got check byte &%02x\n", data); + break; case CH376_CMD_READ_VAR32: - // dbg_printf("[WRITE][DATA][CH376_CMD_GET_FILE_SIZE] got &%02x byte\n", data); - if (data == CH376_VAR_FILE_SIZE) - { - CH376_S32 file_size = system_get_file_size(&ch376->context, ch376->current_file); - - ch376->cmd_data.CMD_VAR32[0] = (CH376_U8)((file_size & 0x000000ff) >> 0); - ch376->cmd_data.CMD_VAR32[1] = (CH376_U8)((file_size & 0x0000ff00) >> 8); - ch376->cmd_data.CMD_VAR32[2] = (CH376_U8)((file_size & 0x00ff0000) >> 16); - ch376->cmd_data.CMD_VAR32[3] = (CH376_U8)((file_size & 0xff000000) >> 24); + // dbg_printf("[WRITE][DATA][CH376_CMD_GET_FILE_SIZE] got &%02x byte\n", data); + if(data == CH376_VAR_FILE_SIZE) + { + CH376_S32 file_size = system_get_file_size(&ch376->context, ch376->current_file); - ch376->nb_bytes_in_cmd_data = sizeof(ch376->cmd_data.CMD_VAR32); - ch376->pos_rw_in_cmd_data = 0; + ch376->cmd_data.CMD_VAR32[0] = (CH376_U8)((file_size & 0x000000ff) >> 0); + ch376->cmd_data.CMD_VAR32[1] = (CH376_U8)((file_size & 0x0000ff00) >> 8); + ch376->cmd_data.CMD_VAR32[2] = (CH376_U8)((file_size & 0x00ff0000) >> 16); + ch376->cmd_data.CMD_VAR32[3] = (CH376_U8)((file_size & 0xff000000) >> 24); - dbg_printf("[WRITE][DATA][CH376_CMD_GET_FILE_SIZE] done, file size is %d, waiting for data read\n", file_size); - - // Lignes suivantes utiles? - ch376->interface_status = 127; - ch376->command_status = CH376_INT_SUCCESS; - } - else if(data == CH376_VAR_CURRENT_OFFSET) - { - CH376_S32 file_offset = system_get_file_offset(&ch376->context, ch376->current_file); + ch376->nb_bytes_in_cmd_data = sizeof(ch376->cmd_data.CMD_VAR32); + ch376->pos_rw_in_cmd_data = 0; - ch376->cmd_data.CMD_VAR32[0] = (CH376_U8)((file_offset & 0x000000ff) >> 0); - ch376->cmd_data.CMD_VAR32[1] = (CH376_U8)((file_offset & 0x0000ff00) >> 8); - ch376->cmd_data.CMD_VAR32[2] = (CH376_U8)((file_offset & 0x00ff0000) >> 16); - ch376->cmd_data.CMD_VAR32[3] = (CH376_U8)((file_offset & 0xff000000) >> 24); + dbg_printf("[WRITE][DATA][CH376_CMD_GET_FILE_SIZE] done, file size is %d, waiting for data read\n", file_size); - ch376->nb_bytes_in_cmd_data = sizeof(ch376->cmd_data.CMD_VAR32); - ch376->pos_rw_in_cmd_data = 0; + // Lignes suivantes utiles? + ch376->interface_status = 127; + ch376->command_status = CH376_INT_SUCCESS; + } + else if(data == CH376_VAR_CURRENT_OFFSET) + { + CH376_S32 file_offset = system_get_file_offset(&ch376->context, ch376->current_file); + + ch376->cmd_data.CMD_VAR32[0] = (CH376_U8)((file_offset & 0x000000ff) >> 0); + ch376->cmd_data.CMD_VAR32[1] = (CH376_U8)((file_offset & 0x0000ff00) >> 8); + ch376->cmd_data.CMD_VAR32[2] = (CH376_U8)((file_offset & 0x00ff0000) >> 16); + ch376->cmd_data.CMD_VAR32[3] = (CH376_U8)((file_offset & 0xff000000) >> 24); + + ch376->nb_bytes_in_cmd_data = sizeof(ch376->cmd_data.CMD_VAR32); + ch376->pos_rw_in_cmd_data = 0; - dbg_printf("[WRITE][DATA][CH376_CMD_GET_FILE_OFFSET] done, file position is %d, waiting for data read\n", file_offset); + dbg_printf("[WRITE][DATA][CH376_CMD_GET_FILE_OFFSET] done, file position is %d, waiting for data read\n", file_offset); - // Lignes suivantes utiles? - ch376->interface_status = 127; - ch376->command_status = CH376_INT_SUCCESS; - } - else - { - dbg_printf("[WRITE][DATA][CH376_CMD_READ_VAR32] wrong command byte: looking for &68 or &6c, got &%02x\n", data); + // Lignes suivantes utiles? + ch376->interface_status = 127; + ch376->command_status = CH376_INT_SUCCESS; + } + else + { + dbg_printf("[WRITE][DATA][CH376_CMD_READ_VAR32] wrong command byte: looking for &68 or &6c, got &%02x\n", data); - ch376->interface_status = 0; - ch376->command_status = CH376_RET_ABORT; - } - break; + ch376->interface_status = 0; + ch376->command_status = CH376_RET_ABORT; + } + break; case CH376_CMD_SET_USB_MODE: - cancel_all_io(ch376); - switch(data) - { + cancel_all_io(ch376); + switch(data) + { case CH376_ARG_SET_USB_MODE_USB_HOST: - ch376->usb_mode = CH376_ARG_SET_USB_MODE_USB_HOST; - dbg_printf("[WRITE][DATA][CH376_SET_USB_MODE] USB host set\n"); - break; + ch376->usb_mode = CH376_ARG_SET_USB_MODE_USB_HOST; + dbg_printf("[WRITE][DATA][CH376_SET_USB_MODE] USB host set\n"); + break; case CH376_ARG_SET_USB_MODE_SD_HOST: - ch376->usb_mode = CH376_ARG_SET_USB_MODE_SD_HOST; - dbg_printf("[WRITE][DATA][CH376_SET_USB_MODE] SD card set\n"); - break; + ch376->usb_mode = CH376_ARG_SET_USB_MODE_SD_HOST; + dbg_printf("[WRITE][DATA][CH376_SET_USB_MODE] SD card set\n"); + break; default: - ch376->usb_mode = CH376_ARG_SET_USB_MODE_INVALID; - dbg_printf("[WRITE][DATA][CH376_SET_USB_MODE_CODE_INVALID] set\n"); - break; - } - break; + ch376->usb_mode = CH376_ARG_SET_USB_MODE_INVALID; + dbg_printf("[WRITE][DATA][CH376_SET_USB_MODE_CODE_INVALID] set\n"); + break; + } + break; case CH376_CMD_SET_FILE_NAME: - dbg_printf("[WRITE][DATA][CH376_CMD_SET_FILE_NAME] got file name character \"%c\" (&%02x) for position %d\n", data, data, ch376->pos_rw_in_cmd_data); - // protect buffer overflow - if(ch376->pos_rw_in_cmd_data < sizeof(ch376->cmd_data.CMD_FileName)) - { - // store new filename character - ch376->cmd_data.CMD_FileName[ch376->pos_rw_in_cmd_data++] = data; - ch376->cmd_data.CMD_FileName[ch376->pos_rw_in_cmd_data] = '\0'; -// ch376->current_file_is_directory = CH376_FALSE; - } - break; + dbg_printf("[WRITE][DATA][CH376_CMD_SET_FILE_NAME] got file name character \"%c\" (&%02x) for position %d\n", data, data, ch376->pos_rw_in_cmd_data); + // protect buffer overflow + if(ch376->pos_rw_in_cmd_data < sizeof(ch376->cmd_data.CMD_FileName)) + { + // store new filename character + ch376->cmd_data.CMD_FileName[ch376->pos_rw_in_cmd_data++] = data; + ch376->cmd_data.CMD_FileName[ch376->pos_rw_in_cmd_data] = '\0'; + // ch376->current_file_is_directory = CH376_FALSE; + } + break; case CH376_CMD_BYTE_LOCATE: - if(ch376->pos_rw_in_cmd_data < sizeof(ch376->cmd_data.CMD_FileSeek)) + if(ch376->pos_rw_in_cmd_data < sizeof(ch376->cmd_data.CMD_FileSeek)) + { + dbg_printf("[WRITE][DATA][CH376_CMD_BYTE_LOCATE] got byte #%d with value &%02x\n", ch376->pos_rw_in_cmd_data, data); + ch376->cmd_data.CMD_FileSeek[ch376->pos_rw_in_cmd_data] = data; + + if(++ch376->pos_rw_in_cmd_data == sizeof(ch376->cmd_data.CMD_FileSeek)) { - dbg_printf("[WRITE][DATA][CH376_CMD_BYTE_LOCATE] got byte #%d with value &%02x\n", ch376->pos_rw_in_cmd_data, data); - ch376->cmd_data.CMD_FileSeek[ch376->pos_rw_in_cmd_data] = data; + CH376_S32 file_seek_pos = (ch376->cmd_data.CMD_FileSeek[0] << 0) + | (ch376->cmd_data.CMD_FileSeek[1] << 8) + | (ch376->cmd_data.CMD_FileSeek[2] << 16) + | (ch376->cmd_data.CMD_FileSeek[3] << 24); - if(++ch376->pos_rw_in_cmd_data == sizeof(ch376->cmd_data.CMD_FileSeek)) - { - CH376_S32 file_seek_pos = (ch376->cmd_data.CMD_FileSeek[0] << 0) - | (ch376->cmd_data.CMD_FileSeek[1] << 8) - | (ch376->cmd_data.CMD_FileSeek[2] << 16) - | (ch376->cmd_data.CMD_FileSeek[3] << 24); - - file_seek_pos = system_file_seek(&ch376->context, ch376->current_file, file_seek_pos); - - if(file_seek_pos >= 0) - { - dbg_printf("[WRITE][DATA][CH376_CMD_BYTE_LOCATE] all done: seek operated with success (waiting for data read)\n"); - - ch376->cmd_data.CMD_FileSeek[0] = (CH376_U8)((file_seek_pos & 0x000000ff) >> 0); - ch376->cmd_data.CMD_FileSeek[1] = (CH376_U8)((file_seek_pos & 0x0000ff00) >> 8); - ch376->cmd_data.CMD_FileSeek[2] = (CH376_U8)((file_seek_pos & 0x00ff0000) >> 16); - ch376->cmd_data.CMD_FileSeek[3] = (CH376_U8)((file_seek_pos & 0xff000000) >> 24); - - ch376->nb_bytes_in_cmd_data = sizeof(ch376->cmd_data.CMD_FileSeek); - ch376->interface_status = 127; - ch376->command_status = CH376_INT_SUCCESS; - } - else - { - dbg_printf("[WRITE][DATA][CH376_CMD_BYTE_LOCATE] all done: seek failure\n"); - - ch376->interface_status = 0; - ch376->command_status = CH376_RET_ABORT; - } - } - } - break; + file_seek_pos = system_file_seek(&ch376->context, ch376->current_file, file_seek_pos); - case CH376_CMD_WR_REQ_DATA: - if(ch376->nb_bytes_in_cmd_data - && ch376->pos_rw_in_cmd_data != CMD_DATA_REQ_SIZE) - { - CH376_U8 *raw = (CH376_U8 *)&ch376->cmd_data; + if(file_seek_pos >= 0) + { + dbg_printf("[WRITE][DATA][CH376_CMD_BYTE_LOCATE] all done: seek operated with success (waiting for data read)\n"); - if(ch376->nb_bytes_in_cmd_data != ch376->pos_rw_in_cmd_data) - { - raw[ch376->pos_rw_in_cmd_data] = data; + ch376->cmd_data.CMD_FileSeek[0] = (CH376_U8)((file_seek_pos & 0x000000ff) >> 0); + ch376->cmd_data.CMD_FileSeek[1] = (CH376_U8)((file_seek_pos & 0x0000ff00) >> 8); + ch376->cmd_data.CMD_FileSeek[2] = (CH376_U8)((file_seek_pos & 0x00ff0000) >> 16); + ch376->cmd_data.CMD_FileSeek[3] = (CH376_U8)((file_seek_pos & 0xff000000) >> 24); - dbg_printf("[WRITE][DATA][CH376_CMD_WR_REQ_DATA] write \"%c\" (&%02x) to i/o buffer at position &%02x\n", data, data, ch376->pos_rw_in_cmd_data); + ch376->nb_bytes_in_cmd_data = sizeof(ch376->cmd_data.CMD_FileSeek); + ch376->interface_status = 127; + ch376->command_status = CH376_INT_SUCCESS; + } + else + { + dbg_printf("[WRITE][DATA][CH376_CMD_BYTE_LOCATE] all done: seek failure\n"); - if(++ch376->pos_rw_in_cmd_data == ch376->nb_bytes_in_cmd_data) - { - ch376->interface_status = 0; - ch376->command_status = CH376_RET_SUCCESS; - } - } + ch376->interface_status = 0; + ch376->command_status = CH376_RET_ABORT; + } } - else + } + break; + + case CH376_CMD_WR_REQ_DATA: + if(ch376->nb_bytes_in_cmd_data + && ch376->pos_rw_in_cmd_data != CMD_DATA_REQ_SIZE) + { + CH376_U8 *raw = (CH376_U8 *)&ch376->cmd_data; + + if(ch376->nb_bytes_in_cmd_data != ch376->pos_rw_in_cmd_data) { - dbg_printf("[WRITE][DATA][CH376_CMD_WR_REQ_DATA] nothing to write to i/o buffer\n"); + raw[ch376->pos_rw_in_cmd_data] = data; + dbg_printf("[WRITE][DATA][CH376_CMD_WR_REQ_DATA] write \"%c\" (&%02x) to i/o buffer at position &%02x\n", data, data, ch376->pos_rw_in_cmd_data); + + if(++ch376->pos_rw_in_cmd_data == ch376->nb_bytes_in_cmd_data) + { ch376->interface_status = 0; - ch376->command_status = CH376_RET_ABORT; + ch376->command_status = CH376_RET_SUCCESS; + } } - break; + } + else + { + dbg_printf("[WRITE][DATA][CH376_CMD_WR_REQ_DATA] nothing to write to i/o buffer\n"); + + ch376->interface_status = 0; + ch376->command_status = CH376_RET_ABORT; + } + break; case CH376_CMD_BYTE_READ: - if(ch376->pos_rw_in_cmd_data < sizeof(ch376->cmd_data.CMD_FileReadWrite)) - { - dbg_printf("[WRITE][DATA][CH376_CMD_BYTE_READ] got byte #%d with value &%02x\n", ch376->pos_rw_in_cmd_data, data); - ch376->cmd_data.CMD_FileReadWrite[ch376->pos_rw_in_cmd_data] = data; + if(ch376->pos_rw_in_cmd_data < sizeof(ch376->cmd_data.CMD_FileReadWrite)) + { + dbg_printf("[WRITE][DATA][CH376_CMD_BYTE_READ] got byte #%d with value &%02x\n", ch376->pos_rw_in_cmd_data, data); + ch376->cmd_data.CMD_FileReadWrite[ch376->pos_rw_in_cmd_data] = data; - if(++ch376->pos_rw_in_cmd_data == sizeof(ch376->cmd_data.CMD_FileReadWrite)) - { - ch376->bytes_to_read_write = (ch376->cmd_data.CMD_FileReadWrite[0] << 0) - | (ch376->cmd_data.CMD_FileReadWrite[1] << 8); - file_read_chunk(ch376); - } + if(++ch376->pos_rw_in_cmd_data == sizeof(ch376->cmd_data.CMD_FileReadWrite)) + { + ch376->bytes_to_read_write = (ch376->cmd_data.CMD_FileReadWrite[0] << 0) + | (ch376->cmd_data.CMD_FileReadWrite[1] << 8); + file_read_chunk(ch376); } - break; + } + break; case CH376_CMD_BYTE_WRITE: - if(ch376->pos_rw_in_cmd_data < sizeof(ch376->cmd_data.CMD_FileReadWrite)) - { - dbg_printf("[WRITE][DATA][CH376_CMD_BYTE_WRITE] got byte #%d with value &%02x\n", ch376->pos_rw_in_cmd_data, data); - ch376->cmd_data.CMD_FileReadWrite[ch376->pos_rw_in_cmd_data] = data; + if(ch376->pos_rw_in_cmd_data < sizeof(ch376->cmd_data.CMD_FileReadWrite)) + { + dbg_printf("[WRITE][DATA][CH376_CMD_BYTE_WRITE] got byte #%d with value &%02x\n", ch376->pos_rw_in_cmd_data, data); + ch376->cmd_data.CMD_FileReadWrite[ch376->pos_rw_in_cmd_data] = data; - if(++ch376->pos_rw_in_cmd_data == sizeof(ch376->cmd_data.CMD_FileReadWrite)) - { - ch376->bytes_to_read_write = (ch376->cmd_data.CMD_FileReadWrite[0] << 0) - | (ch376->cmd_data.CMD_FileReadWrite[1] << 8); + if(++ch376->pos_rw_in_cmd_data == sizeof(ch376->cmd_data.CMD_FileReadWrite)) + { + ch376->bytes_to_read_write = (ch376->cmd_data.CMD_FileReadWrite[0] << 0) + | (ch376->cmd_data.CMD_FileReadWrite[1] << 8); - if(ch376->bytes_to_read_write > sizeof(ch376->cmd_data.CMD_IOBuffer)) - ch376->nb_bytes_in_cmd_data = sizeof(ch376->cmd_data.CMD_IOBuffer); - else - ch376->nb_bytes_in_cmd_data = (CH376_U8)ch376->bytes_to_read_write; + if(ch376->bytes_to_read_write > sizeof(ch376->cmd_data.CMD_IOBuffer)) + ch376->nb_bytes_in_cmd_data = sizeof(ch376->cmd_data.CMD_IOBuffer); + else + ch376->nb_bytes_in_cmd_data = (CH376_U8)ch376->bytes_to_read_write; - ch376->interface_status = 127; - ch376->command_status = CH376_INT_SUCCESS; - } + ch376->interface_status = 127; + ch376->command_status = CH376_INT_SUCCESS; } - break; + } + break; case CH376_CMD_FILE_CLOSE: - // Note: close mode is not implemented; size if always updated - dbg_printf("[WRITE][DATA][CH376_CMD_FILE_CLOSE] update size: %s\n", ch376->pos_rw_in_cmd_data == 0 ? "no" : "yes"); - if(ch376->current_file) - { - system_file_close(&ch376->context, ch376->current_file); - ch376->current_file = (CH376_FILE)0; + // Note: close mode is not implemented; size if always updated + dbg_printf("[WRITE][DATA][CH376_CMD_FILE_CLOSE] update size: %s\n", ch376->pos_rw_in_cmd_data == 0 ? "no" : "yes"); + if(ch376->current_file) + { + system_file_close(&ch376->context, ch376->current_file); + ch376->current_file = (CH376_FILE)0; - ch376->interface_status = 127; - ch376->command_status = CH376_INT_SUCCESS; - } - else - { - dbg_printf("[WRITE][DATA][CH376_CMD_FILE_CLOSE] failure: not file opened\n"); + ch376->interface_status = 127; + ch376->command_status = CH376_INT_SUCCESS; + } + else + { + dbg_printf("[WRITE][DATA][CH376_CMD_FILE_CLOSE] failure: not file opened\n"); - ch376->interface_status = 0; - ch376->command_status = CH376_RET_ABORT; - } - break; - } + ch376->interface_status = 0; + ch376->command_status = CH376_RET_ABORT; + } + break; + } - dbg_printf("<< [WRITE][DATA] Write data &%02x status &%02x\n", data, ch376->command_status); + dbg_printf("<< [WRITE][DATA] Write data &%02x status &%02x\n", data, ch376->command_status); } @@ -2671,69 +2672,69 @@ void ch376_write_data_port(struct ch376 *ch376, CH376_U8 data) /* /// "CH376 public init & clean" */ -struct ch376 * ch376_create(void *user_data) +struct ch376 * ch376_create(void* user_data) { - struct ch376 *ch376 = system_alloc_mem(sizeof(struct ch376)); + struct ch376 *ch376 = system_alloc_mem(sizeof(struct ch376)); - if(ch376) + if(ch376) + { + if(system_init_context(&ch376->context, user_data)) { - if(system_init_context(&ch376->context, user_data)) - { - ch376->sdcard_drive_path = clone_string("ch376_sdcard_drive/"); - ch376->usb_drive_path = clone_string("ch376_usb_drive/"); - clear_structure(ch376); - } - else - { - system_free_mem(ch376); - ch376 = NULL; - } + ch376->sdcard_drive_path = clone_string("ch376_sdcard_drive/"); + ch376->usb_drive_path = clone_string("ch376_usb_drive/"); + clear_structure(ch376); + } + else + { + system_free_mem(ch376); + ch376 = NULL; } - return ch376; + } + return ch376; } void ch376_destroy(struct ch376 *ch376) { - cancel_all_io(ch376); - system_free_mem(ch376->sdcard_drive_path); - system_free_mem(ch376->usb_drive_path); - system_clean_context(&ch376->context); - system_free_mem(ch376); + cancel_all_io(ch376); + system_free_mem(ch376->sdcard_drive_path); + system_free_mem(ch376->usb_drive_path); + system_clean_context(&ch376->context); + system_free_mem(ch376); } void ch376_reset(struct ch376 *ch376) { - cancel_all_io(ch376); - clear_structure(ch376); + cancel_all_io(ch376); + clear_structure(ch376); } /* /// */ /* /// "CH376 public configuration" */ -void ch376_set_sdcard_drive_path(struct ch376 *ch376, const char *path) +void ch376_set_sdcard_drive_path(struct ch376 *ch376, const char* path) { - dbg_printf("ch376_set_sdcard_drive_path: %s\n", path); - cancel_all_io(ch376); - system_free_mem(ch376->sdcard_drive_path); - ch376->sdcard_drive_path = clone_string(path); + dbg_printf("ch376_set_sdcard_drive_path: %s\n", path); + cancel_all_io(ch376); + system_free_mem(ch376->sdcard_drive_path); + ch376->sdcard_drive_path = clone_string(path); } -void ch376_set_usb_drive_path(struct ch376 *ch376, const char *path) +void ch376_set_usb_drive_path(struct ch376 *ch376, const char* path) { - dbg_printf("ch376_set_usb_drive_path: %s\n", path); - cancel_all_io(ch376); - system_free_mem(ch376->usb_drive_path); - ch376->usb_drive_path = clone_string(path); + dbg_printf("ch376_set_usb_drive_path: %s\n", path); + cancel_all_io(ch376); + system_free_mem(ch376->usb_drive_path); + ch376->usb_drive_path = clone_string(path); } -const char * ch376_get_sdcard_drive_path(struct ch376 *ch376) +const char* ch376_get_sdcard_drive_path(struct ch376 *ch376) { - return ch376->sdcard_drive_path; + return ch376->sdcard_drive_path; } -const char * ch376_get_usb_drive_path(struct ch376 *ch376) +const char* ch376_get_usb_drive_path(struct ch376 *ch376) { - return ch376->usb_drive_path; + return ch376->usb_drive_path; } /* /// */ diff --git a/plugins/ch376/ch376.h b/plugins/ch376/ch376.h index fe8cb32b..38adacb7 100644 --- a/plugins/ch376/ch376.h +++ b/plugins/ch376/ch376.h @@ -37,7 +37,10 @@ typedef BOOL CH376_BOOL; typedef BPTR CH376_FILE; typedef BPTR CH376_LOCK; typedef struct FileInfoBlock * CH376_DIR; -typedef struct { struct Library *DOSBase; } CH376_CONTEXT; +typedef struct +{ + struct Library *DOSBase; +} CH376_CONTEXT; #define CH376_TRUE TRUE #define CH376_FALSE FALSE @@ -60,10 +63,17 @@ typedef UINT64 CH376_U64; typedef INT64 CH376_S64; typedef BOOL CH376_BOOL; typedef HANDLE CH376_FILE; -typedef struct _CH376_LOCK { TCHAR path[MAX_PATH]; HANDLE handle; } * CH376_LOCK; +typedef struct _CH376_LOCK +{ + TCHAR path[MAX_PATH]; + HANDLE handle; +} * CH376_LOCK; typedef WIN32_FIND_DATA * CH376_DIR; -typedef struct { void *dummy; } CH376_CONTEXT; +typedef struct +{ + void* dummy; +} CH376_CONTEXT; #define CH376_TRUE TRUE #define CH376_FALSE FALSE @@ -87,9 +97,16 @@ typedef uint64_t CH376_U64; typedef int64_t CH376_S64; typedef bool CH376_BOOL; typedef FILE * CH376_FILE; -typedef char * CH376_LOCK; -typedef struct _CH376_DIR { DIR *handle; struct dirent *entry; } * CH376_DIR; -typedef struct { void *dummy; } CH376_CONTEXT; +typedef char* CH376_LOCK; +typedef struct _CH376_DIR +{ + DIR *handle; + struct dirent *entry; +} * CH376_DIR; +typedef struct +{ + void* dummy; +} CH376_CONTEXT; #define CH376_TRUE true #define CH376_FALSE false @@ -109,15 +126,15 @@ typedef struct { void *dummy; } CH376_CONTEXT; struct ch376; // Initialization -struct ch376 * ch376_create(void *user_data); +struct ch376 * ch376_create(void* user_data); void ch376_destroy(struct ch376 *ch376); void ch376_reset(struct ch376 *ch376); // Configuration -void ch376_set_sdcard_drive_path(struct ch376 *ch376, const char *path); -void ch376_set_usb_drive_path(struct ch376 *ch376, const char *path); -const char * ch376_get_sdcard_drive_path(struct ch376 *ch376); -const char * ch376_get_usb_drive_path(struct ch376 *ch376); +void ch376_set_sdcard_drive_path(struct ch376 *ch376, const char* path); +void ch376_set_usb_drive_path(struct ch376 *ch376, const char* path); +const char* ch376_get_sdcard_drive_path(struct ch376 *ch376); +const char* ch376_get_usb_drive_path(struct ch376 *ch376); // Runtime void ch376_write_command_port(struct ch376 *ch376, CH376_U8 command); diff --git a/plugins/ch376/oric_ch376_plugin.c b/plugins/ch376/oric_ch376_plugin.c index cbd5d6c6..9a6dbb12 100644 --- a/plugins/ch376/oric_ch376_plugin.c +++ b/plugins/ch376/oric_ch376_plugin.c @@ -15,10 +15,10 @@ #include "ch376.h" #include "stdio.h" -void dbg_printf(char *fmt, ...); +void dbg_printf(char* fmt, ...); -#define CH376_ORIC_EXTENSION_DATA_PORT 0x340 -#define CH376_ORIC_EXTENSION_COMMAND_PORT 0x341 +#define CH376_ORIC_EXTENSION_DATA_PORT 0x340 +#define CH376_ORIC_EXTENSION_COMMAND_PORT 0x341 struct ch376 * ch376_oric_init() @@ -43,29 +43,29 @@ void ch376_oric_config(struct ch376 *ch376) ch376_set_usb_drive_path(ch376, "usbdrive/"); } -void ch376_oric_write(struct ch376 *ch376, Uint16 addr, Uint8 data) +void ch376_oric_write(struct ch376 *ch376, Uint16 addr, Uint8 data) { - if (addr == CH376_ORIC_EXTENSION_DATA_PORT) + if(addr == CH376_ORIC_EXTENSION_DATA_PORT) { ch376_write_data_port(ch376, data); } - if (addr == CH376_ORIC_EXTENSION_COMMAND_PORT) + if(addr == CH376_ORIC_EXTENSION_COMMAND_PORT) { - ch376_write_command_port(ch376, data); + ch376_write_command_port(ch376, data); } } -unsigned char ch376_oric_read(struct ch376 *ch376, Uint16 addr) +unsigned char ch376_oric_read(struct ch376 *ch376, Uint16 addr) { unsigned char temp; - if (addr == CH376_ORIC_EXTENSION_DATA_PORT) + if(addr == CH376_ORIC_EXTENSION_DATA_PORT) { - temp=ch376_read_data_port(ch376); - return temp; + temp=ch376_read_data_port(ch376); + return temp; } - if (addr == CH376_ORIC_EXTENSION_COMMAND_PORT) + if(addr == CH376_ORIC_EXTENSION_COMMAND_PORT) { temp=ch376_read_command_port(ch376); return temp; diff --git a/plugins/ch376/oric_ch376_plugin.h b/plugins/ch376/oric_ch376_plugin.h index 3e04ddd5..2c26542d 100644 --- a/plugins/ch376/oric_ch376_plugin.h +++ b/plugins/ch376/oric_ch376_plugin.h @@ -1,7 +1,7 @@ struct ch376 * ch376_oric_init(void); void ch376_oric_reset(struct ch376 *ch376); void ch376_oric_write(struct ch376 *ch376, Uint16 addr, Uint8 data); -unsigned char ch376_oric_read(struct ch376 *ch376, Uint16 addr); +unsigned char ch376_oric_read(struct ch376 *ch376, Uint16 addr); void ch376_oric_config(struct ch376 *ch376); void ch376_oric_destroy(struct ch376 *ch376); void ch376_oric_reset(struct ch376 *ch376); diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.c b/plugins/twilighte_board/oric_twilighte_board_plugin.c index 989a7cd8..e9d969d8 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.c +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.c @@ -62,404 +62,413 @@ extern SDL_bool read_config_string(char* buf, char* token, char* dest, Sint32 ma static SDL_bool load_rom_twilighte(char* fname, int size, unsigned char where[]) { - SDL_RWops* f; - char* tmpname; - - // MinGW doesn't have asprintf :-( - tmpname = malloc(strlen(fname) + 10); - if (!tmpname) { - - return SDL_FALSE; - } + SDL_RWops* f; + char* tmpname; + + // MinGW doesn't have asprintf :-( + tmpname = malloc(strlen(fname) + 10); + if(!tmpname) + { + + return SDL_FALSE; + } + + sprintf(tmpname, "%s.rom", fname); + f = SDL_RWFromFile(tmpname, "rb"); + if(!f) + { + error_printf("Unable to open '%s'\n", tmpname); + free(tmpname); + return SDL_FALSE; + } - sprintf(tmpname, "%s.rom", fname); - f = SDL_RWFromFile(tmpname, "rb"); - if (!f) - { - error_printf("Unable to open '%s'\n", tmpname); - free(tmpname); - return SDL_FALSE; - } + if(size < 0) + { + int filesize; + SDL_RWseek(f, 0, SEEK_END); + filesize = SDL_RWtell(f); + SDL_RWseek(f, 0, SEEK_SET); - if (size < 0) + if(filesize > -size) { - int filesize; - SDL_RWseek(f, 0, SEEK_END); - filesize = SDL_RWtell(f); - SDL_RWseek(f, 0, SEEK_SET); - - if (filesize > -size) - { - error_printf("ROM '%s' exceeds %d bytes.\n", fname, -size); - SDL_RWclose(f); - free(tmpname); - return SDL_FALSE; - } - - where += (-size) - filesize; - size = filesize; + error_printf("ROM '%s' exceeds %d bytes.\n", fname, -size); + SDL_RWclose(f); + free(tmpname); + return SDL_FALSE; } - if (SDL_RWread(f, where, size, 1) != 1) - { - error_printf("Unable to read '%s'\n", tmpname); - SDL_RWclose(f); - free(tmpname); - return SDL_FALSE; - } + where += (-size) - filesize; + size = filesize; + } + if(SDL_RWread(f, where, size, 1) != 1) + { + error_printf("Unable to read '%s'\n", tmpname); SDL_RWclose(f); free(tmpname); - return SDL_TRUE; + return SDL_FALSE; + } + + SDL_RWclose(f); + free(tmpname); + return SDL_TRUE; } struct twilighte* twilighte_oric_init(void) { - FILE* f; - unsigned int i, j; - char* result; - char tbtmp[32]; - char tbtmpram[32]; - char line[1024]; - struct twilighte* twilighte = malloc(sizeof(struct twilighte)); - twilighte->t_banking_register = 0; - twilighte->microdisc=SDL_FALSE; - - twilighte->t_register = 128 + 1; // Firmware - - f = fopen("plugins/twilighte_board/twilighte.cfg", "r"); - if (!f) + FILE* f; + unsigned int i, j; + char* result; + char tbtmp[32]; + char tbtmpram[32]; + char line[1024]; + struct twilighte* twilighte = malloc(sizeof(struct twilighte)); + twilighte->t_banking_register = 0; + twilighte->microdisc=SDL_FALSE; + + twilighte->t_register = 128 + 1; // Firmware + + f = fopen("plugins/twilighte_board/twilighte.cfg", "r"); + if(!f) + { + error_printf("plugins/twilighte_board/twilighte.cfg not found\n"); + return NULL; + } + + for(j = 0; j < 32; j++) + { + twilighte->twilrombankfiles[j][0] = 0; + twilighte->twilrambankfiles[j][0] = 0; + } + + while(!feof(f)) + { + result = fgets(line, 1024, f); + if(result) { - error_printf("plugins/twilighte_board/twilighte.cfg not found\n"); - return NULL; + // FIXME: do something to silence the compiler warning ... } - for (j = 0; j < 32; j++) + if(read_config_int(line, "firmware", &twilighte->firmware_version, 1, 3)) { - twilighte->twilrombankfiles[j][0] = 0; - twilighte->twilrambankfiles[j][0] = 0; + // because we initialize board version to 1. If firmware_version is set, then we have a look to firmware_version. + // If it's equal to 1, then do not overlap the value + if(twilighte->firmware_version!=1) + { + twilighte->t_register=twilighte->t_register&0b11111110; // Remove bit 0 (firmware 1 which is the default when the .cfg does not contain firmware version) + twilighte->t_register = twilighte->t_register | (twilighte->firmware_version); + } + continue; } - while (!feof(f)) + if(read_config_bool(line, "microdisc", &twilighte->microdisc)) continue; + + for(j = 0; j < 32; j++) { - result = fgets(line, 1024, f); - if( result ) - { - // FIXME: do something to silence the compiler warning ... - } + sprintf(tbtmp, "twilbankrom%02d", j+1); + sprintf(tbtmpram, "twilbankram%02d", j+1); - if (read_config_int(line, "firmware", &twilighte->firmware_version, 1, 3)) + if(twilighte->twilrombankfiles[j][0] == 0) + { + if(read_config_string(line, tbtmp, twilighte->twilrombankfiles[j], 1024)) { - // because we initialize board version to 1. If firmware_version is set, then we have a look to firmware_version. - // If it's equal to 1, then do not overlap the value - if (twilighte->firmware_version!=1) { - twilighte->t_register=twilighte->t_register&0b11111110; // Remove bit 0 (firmware 1 which is the default when the .cfg does not contain firmware version) - twilighte->t_register = twilighte->t_register | (twilighte->firmware_version); - } - continue; + break; } + } - if( read_config_bool( line, "microdisc", &twilighte->microdisc ) ) continue; - - for (j = 0; j < 32; j++) + if(twilighte->twilrambankfiles[j][0] == 0) + { + if(read_config_string(line, tbtmpram, twilighte->twilrambankfiles[j], 1024)) { - sprintf(tbtmp, "twilbankrom%02d", j+1); - sprintf(tbtmpram, "twilbankram%02d", j+1); - - if (twilighte->twilrombankfiles[j][0] == 0) - { - if (read_config_string(line, tbtmp, twilighte->twilrombankfiles[j], 1024)) - { - break; - } - } - - if (twilighte->twilrambankfiles[j][0] == 0) - { - if (read_config_string(line, tbtmpram, twilighte->twilrambankfiles[j], 1024)) - { - break; - } - } - + break; } + } + } + } - fclose(f); + fclose(f); - // Now load rom - for (i = 0; i < 32; i++) + // Now load rom + for(i = 0; i < 32; i++) + { + if(twilighte->twilrombankfiles[i][0] != 0) { - if (twilighte->twilrombankfiles[i][0] != 0) - { - //error_printf("Load bank (ROM) #%d: %s", i, twilighte->twilrombankfiles[i]); - if (!load_rom_twilighte(twilighte->twilrombankfiles[i], -16384, twilighte->twilrombankdata[i])) - { - error_printf("Cannot load %s", twilighte->twilrombankfiles[i]); - return NULL; - } - } - - if (twilighte->twilrambankfiles[i][0] != 0) - { - //error_printf("Load bank (RAM) #%d: %s", i, twilighte->twilrambankfiles[i]); - if (!load_rom_twilighte(twilighte->twilrambankfiles[i], -16384, twilighte->twilrambankdata[i])) - { - error_printf("Cannot load %s", twilighte->twilrambankfiles[i]); - return NULL; - } - } + //error_printf("Load bank (ROM) #%d: %s", i, twilighte->twilrombankfiles[i]); + if(!load_rom_twilighte(twilighte->twilrombankfiles[i], -16384, twilighte->twilrombankdata[i])) + { + error_printf("Cannot load %s", twilighte->twilrombankfiles[i]); + return NULL; + } + } + if(twilighte->twilrambankfiles[i][0] != 0) + { + //error_printf("Load bank (RAM) #%d: %s", i, twilighte->twilrambankfiles[i]); + if(!load_rom_twilighte(twilighte->twilrambankfiles[i], -16384, twilighte->twilrambankdata[i])) + { + error_printf("Cannot load %s", twilighte->twilrambankfiles[i]); + return NULL; + } } - // Flush sram (first bank) - // for (j = 0; j < 16384; j++) twilighte->twilrambankdata[0][j] = 0; + } - twilighte->IORAh = 0x07; - twilighte->DDRA = 0b10100111; - twilighte->current_bank = 7; - twilighte->IORB = 0; - twilighte->DDRB = 0b11000000; - twilighte->mirror_0x314_write_detected=SDL_FALSE; + // Flush sram (first bank) + // for (j = 0; j < 16384; j++) twilighte->twilrambankdata[0][j] = 0; - // It's not really the behavior of the firmware 2, because it initialize 0X314 internal register of the twilighte board to 0 - if (twilighte->firmware_version==2) - twilighte->mirror_0x314=2; + twilighte->IORAh = 0x07; + twilighte->DDRA = 0b10100111; + twilighte->current_bank = 7; + twilighte->IORB = 0; + twilighte->DDRB = 0b11000000; + twilighte->mirror_0x314_write_detected=SDL_FALSE; - return twilighte; -} + // It's not really the behavior of the firmware 2, because it initialize 0X314 internal register of the twilighte board to 0 + if(twilighte->firmware_version==2) + twilighte->mirror_0x314=2; -unsigned char twilighte_board_mapping_software_bank(struct twilighte *twilighte) { - - unsigned char bank=0; - int current_bank = twilighte->IORAh & 0x07; - // RAM Overlay? - if (current_bank == 0) - bank = 0; - // Bank 7 downto 5 are always the same bank on any set - else if ( (current_bank >=5) && (current_bank <=7) ) - bank = current_bank; - // ROM - else if ( (twilighteboard_oric_read(twilighte, 0x342) & 0x20)==0 && twilighteboard_oric_read(twilighte, 0x343)<=3 && twilighteboard_oric_read(twilighte, 0x343)>=1) { - bank = current_bank+4*(twilighteboard_oric_read(twilighte, 0x343)+1); - } - else if ( (twilighteboard_oric_read(twilighte, 0x342) & 0x20)==0 && twilighteboard_oric_read(twilighte, 0x343)<=3 && twilighteboard_oric_read(twilighte, 0x343)==0) { - bank = current_bank; - } - else if ( (current_bank >=1) && (current_bank <=4) && (twilighteboard_oric_read(twilighte, 0x342) & 0x20)==0 && twilighteboard_oric_read(twilighte, 0x343)>4) { - bank = current_bank+4*twilighteboard_oric_read(twilighte, 0x343); - } - // Special case for bank 8,7,6,5 - else if ( (twilighteboard_oric_read(twilighte, 0x342) & 0x20)==0 && twilighteboard_oric_read(twilighte, 0x343)==4) { - bank = current_bank+4; - } - // RAM - else if ( (current_bank >=1) && (current_bank <=4) && (twilighteboard_oric_read(twilighte, 0x342) & 0x20)==0x20) - bank = current_bank+4*twilighteboard_oric_read(twilighte, 0x343)+32; + return twilighte; +} +unsigned char twilighte_board_mapping_software_bank(struct twilighte *twilighte) +{ - return bank; + unsigned char bank=0; + int current_bank = twilighte->IORAh & 0x07; + // RAM Overlay? + if(current_bank == 0) + bank = 0; + // Bank 7 downto 5 are always the same bank on any set + else if((current_bank >=5) && (current_bank <=7)) + bank = current_bank; + // ROM + else if((twilighteboard_oric_read(twilighte, 0x342) & 0x20)==0 && twilighteboard_oric_read(twilighte, 0x343)<=3 && twilighteboard_oric_read(twilighte, 0x343)>=1) + { + bank = current_bank+4*(twilighteboard_oric_read(twilighte, 0x343)+1); + } + else if((twilighteboard_oric_read(twilighte, 0x342) & 0x20)==0 && twilighteboard_oric_read(twilighte, 0x343)<=3 && twilighteboard_oric_read(twilighte, 0x343)==0) + { + bank = current_bank; + } + else if((current_bank >=1) && (current_bank <=4) && (twilighteboard_oric_read(twilighte, 0x342) & 0x20)==0 && twilighteboard_oric_read(twilighte, 0x343)>4) + { + bank = current_bank+4*twilighteboard_oric_read(twilighte, 0x343); + } + // Special case for bank 8,7,6,5 + else if((twilighteboard_oric_read(twilighte, 0x342) & 0x20)==0 && twilighteboard_oric_read(twilighte, 0x343)==4) + { + bank = current_bank+4; + } + // RAM + else if((current_bank >=1) && (current_bank <=4) && (twilighteboard_oric_read(twilighte, 0x342) & 0x20)==0x20) + bank = current_bank+4*twilighteboard_oric_read(twilighte, 0x343)+32; + + + return bank; } -unsigned char twilighte_board_mapping_bank(struct twilighte *twilighte) { - unsigned char bank; - // RAM Overlay? - if (twilighte->current_bank == 0) - bank = 7; +unsigned char twilighte_board_mapping_bank(struct twilighte *twilighte) +{ + unsigned char bank; + // RAM Overlay? + if(twilighte->current_bank == 0) + bank = 7; - // ROM - else if ( (twilighte->current_bank >=5) && (twilighte->current_bank <=7) ) - bank = twilighte->current_bank-1; + // ROM + else if((twilighte->current_bank >=5) && (twilighte->current_bank <=7)) + bank = twilighte->current_bank-1; - // ROM/RAM fonction du bit5 de twilighte->t_register - else if (twilighte->t_banking_register < 4) - bank = (twilighte->current_bank-1+twilighte->t_banking_register*8); + // ROM/RAM fonction du bit5 de twilighte->t_register + else if(twilighte->t_banking_register < 4) + bank = (twilighte->current_bank-1+twilighte->t_banking_register*8); - // ROM/RAM fonction du bit5 de twilighte->t_register - else if (twilighte->t_banking_register >= 4) - bank = (twilighte->current_bank+3+(twilighte->t_banking_register & 3)*8); + // ROM/RAM fonction du bit5 de twilighte->t_register + else if(twilighte->t_banking_register >= 4) + bank = (twilighte->current_bank+3+(twilighte->t_banking_register & 3)*8); - // Valeurs invalides - else - error_printf("Banking error: bank=%d, set=%d", twilighte->current_bank, twilighte->t_banking_register); + // Valeurs invalides + else + error_printf("Banking error: bank=%d, set=%d", twilighte->current_bank, twilighte->t_banking_register); - // error_printf("Banking[0]: set=%d, bank=%d ram/rom=%x => %d", twilighte->t_banking_register, twilighte->current_bank, (twilighte->t_register >> 5) & 1, bank); - return bank; + // error_printf("Banking[0]: set=%d, bank=%d ram/rom=%x => %d", twilighte->t_banking_register, twilighte->current_bank, (twilighte->t_register >> 5) & 1, bank); + return bank; } -unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte* twilighte, uint16_t addr) { - unsigned char data; - unsigned char bank; - - if (twilighte->firmware_version==2) - { - if (twilighte->mirror_0x314_write_detected==SDL_TRUE) - { - if ((twilighte->mirror_0x314&2)==0) - twilighte->current_bank = 0; - else - { - twilighte->current_bank = 6; - twilighte->t_banking_register=0; - twilighte->t_register=twilighte->t_register&0b1101111; - } - } - } +unsigned char twilighteboard_oric_ROM_RAM_read(struct twilighte* twilighte, uint16_t addr) +{ + unsigned char data; + unsigned char bank; - if (twilighte->current_bank == 0) + if(twilighte->firmware_version==2) + { + if(twilighte->mirror_0x314_write_detected==SDL_TRUE) { - data = twilighte->twilrambankdata[7][addr]; + if((twilighte->mirror_0x314&2)==0) + twilighte->current_bank = 0; + else + { + twilighte->current_bank = 6; + twilighte->t_banking_register=0; + twilighte->t_register=twilighte->t_register&0b1101111; + } } + } + + if(twilighte->current_bank == 0) + { + data = twilighte->twilrambankdata[7][addr]; + } + else + { + bank=twilighte_board_mapping_bank(twilighte); + + if((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? + data=twilighte->twilrambankdata[bank][addr]; else - { - bank=twilighte_board_mapping_bank(twilighte); - - if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? - data=twilighte->twilrambankdata[bank][addr]; - else - data=twilighte->twilrombankdata[bank][addr]; - } - return data; + data=twilighte->twilrombankdata[bank][addr]; + } + return data; } -unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte* twilighte, uint16_t addr, unsigned char data) +unsigned char twilighteboard_oric_ROM_RAM_write(struct twilighte* twilighte, uint16_t addr, unsigned char data) { - unsigned char bank; + unsigned char bank; - if (twilighte->firmware_version==2) + if(twilighte->firmware_version==2) + { + if(twilighte->mirror_0x314_write_detected==SDL_TRUE) { - if (twilighte->mirror_0x314_write_detected==SDL_TRUE) - { - if ((twilighte->mirror_0x314&2)==0) - twilighte->current_bank = 0; - else - { - twilighte->current_bank = 6; - twilighte->t_banking_register=0; - twilighte->t_register=twilighte->t_register&0b1101111; - } - } + if((twilighte->mirror_0x314&2)==0) + twilighte->current_bank = 0; + else + { + twilighte->current_bank = 6; + twilighte->t_banking_register=0; + twilighte->t_register=twilighte->t_register&0b1101111; + } } + } - if (twilighte->current_bank == 0) - { - twilighte->twilrambankdata[7][addr] = data; - } - else - { - bank=twilighte_board_mapping_bank(twilighte); + if(twilighte->current_bank == 0) + { + twilighte->twilrambankdata[7][addr] = data; + } + else + { + bank=twilighte_board_mapping_bank(twilighte); - if ((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? - twilighte->twilrambankdata[bank][addr]=data; + if((twilighte->t_register&32)==32 && twilighte->current_bank<5) // Is it a ram bank access ? + twilighte->twilrambankdata[bank][addr]=data; - // ROM is readonly - //else - // error_printf("Flash write: set=%d, bank=%d ram/rom=%x => %d, address=%04x, data=%02x", twilighte->t_banking_register, twilighte->current_bank, (twilighte->t_register >> 5) & 1, bank, addr, data); - } - return 0; + // ROM is readonly + //else + // error_printf("Flash write: set=%d, bank=%d ram/rom=%x => %d, address=%04x, data=%02x", twilighte->t_banking_register, twilighte->current_bank, (twilighte->t_register >> 5) & 1, bank, addr, data); + } + return 0; } -unsigned char twilighteboard_oric_read(struct twilighte* twilighte, uint16_t addr) +unsigned char twilighteboard_oric_read(struct twilighte* twilighte, uint16_t addr) { - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) - { - return twilighte->t_register; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) - { - return twilighte->DDRA; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_IORAh) - { - return twilighte->IORAh; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) - { - return twilighte->DDRB; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_IORB) - { - return twilighte->IORB; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) - { - return twilighte->t_banking_register; - } - - // In firmware mode 2, $314 is not returned by the twilighte board - // $314 is only writen in order to have information of the state of the overlay ram - // $314 register is returned by the disk controler - // That is why, it never returns here $314 register from the twilighte board register - - return 0; + if(addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) + { + return twilighte->t_register; + } + + if(addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) + { + return twilighte->DDRA; + } + + if(addr == TWILIGHTE_CARD_ORIC_EXTENSION_IORAh) + { + return twilighte->IORAh; + } + + if(addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) + { + return twilighte->DDRB; + } + + if(addr == TWILIGHTE_CARD_ORIC_EXTENSION_IORB) + { + return twilighte->IORB; + } + + if(addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) + { + return twilighte->t_banking_register; + } + + // In firmware mode 2, $314 is not returned by the twilighte board + // $314 is only writen in order to have information of the state of the overlay ram + // $314 register is returned by the disk controler + // That is why, it never returns here $314 register from the twilighte board register + + return 0; } -unsigned char twilighteboard_oric_write(struct twilighte* twilighte, uint16_t addr, unsigned char mask, unsigned char data) +unsigned char twilighteboard_oric_write(struct twilighte* twilighte, uint16_t addr, unsigned char mask, unsigned char data) { - // mask: $00 => lecture/écriture via - // mask: $ff => mise à jour du port joystick - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) - { - twilighte->DDRA = data; - } - - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_IORAh) - { + // mask: $00 => lecture/écriture via + // mask: $ff => mise à jour du port joystick - if (mask == 0) - twilighte->IORAh = data & twilighte->DDRA; - else - twilighte->IORAh = (twilighte->IORAh & twilighte->DDRA) | (data & (twilighte->DDRA ^ 0xff)); + if(addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRA) + { + twilighte->DDRA = data; + } - twilighte->current_bank = twilighte->IORAh & 7; - } + if(addr == TWILIGHTE_CARD_ORIC_EXTENSION_IORAh) + { - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) - { - twilighte->DDRB = data; - } + if(mask == 0) + twilighte->IORAh = data & twilighte->DDRA; + else + twilighte->IORAh = (twilighte->IORAh & twilighte->DDRA) | (data & (twilighte->DDRA ^ 0xff)); - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_IORB) - { + twilighte->current_bank = twilighte->IORAh & 7; + } - if (mask == 0) - twilighte->IORB = data & twilighte->DDRB; - else - twilighte->IORB = (twilighte->IORB & twilighte->DDRB) | (data & (twilighte->DDRB ^ 0xff)); - } + if(addr == TWILIGHTE_CARD_ORIC_EXTENSION_DDRB) + { + twilighte->DDRB = data; + } - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) - { - twilighte->t_register = data; - } + if(addr == TWILIGHTE_CARD_ORIC_EXTENSION_IORB) + { - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) + if(mask == 0) + twilighte->IORB = data & twilighte->DDRB; + else + twilighte->IORB = (twilighte->IORB & twilighte->DDRB) | (data & (twilighte->DDRB ^ 0xff)); + } + + if(addr == TWILIGHTE_CARD_ORIC_EXTENSION_REGISTER) + { + twilighte->t_register = data; + } + + if(addr == TWILIGHTE_CARD_ORIC_EXTENSION_BANKING_REGISTER) + { + twilighte->t_banking_register = data; + } + + if(twilighte->firmware_version==2) + { + if(addr == TWILIGHTE_CARD_ORIC_EXTENSION_MIRROR_314) { - twilighte->t_banking_register = data; + twilighte->mirror_0x314 = data; + // If bit 1 of $314 is equal to 0 (romdis low), then send bank 0 value + if((twilighte->mirror_0x314&2)==0) // Test bit 1 + { + twilighte->mirror_0x314_write_detected=SDL_TRUE; + } } - if (twilighte->firmware_version==2) - { - if (addr == TWILIGHTE_CARD_ORIC_EXTENSION_MIRROR_314) - { - twilighte->mirror_0x314 = data; - // If bit 1 of $314 is equal to 0 (romdis low), then send bank 0 value - if ((twilighte->mirror_0x314&2)==0) // Test bit 1 - { - twilighte->mirror_0x314_write_detected=SDL_TRUE; - } - } - - } - return 0; + } + return 0; } diff --git a/plugins/twilighte_board/oric_twilighte_board_plugin.h b/plugins/twilighte_board/oric_twilighte_board_plugin.h index 39e4ced1..8cfd86ce 100644 --- a/plugins/twilighte_board/oric_twilighte_board_plugin.h +++ b/plugins/twilighte_board/oric_twilighte_board_plugin.h @@ -1,32 +1,32 @@ struct twilbankinfo { - unsigned char type; - unsigned char *ptr; + unsigned char type; + unsigned char* ptr; }; struct twilighte { - unsigned char t_register; - unsigned char t_banking_register; - char twilrombankfiles[32][1024]; + unsigned char t_register; + unsigned char t_banking_register; + char twilrombankfiles[32][1024]; - char twilrambankfiles[32][1024]; + char twilrambankfiles[32][1024]; - unsigned char twilrombankdata[32][16834]; - unsigned char twilrambankdata[32][16834]; + unsigned char twilrombankdata[32][16834]; + unsigned char twilrambankdata[32][16834]; - int firmware_version; + int firmware_version; - SDL_bool microdisc; + SDL_bool microdisc; - unsigned char DDRA; - unsigned char IORAh; + unsigned char DDRA; + unsigned char IORAh; - unsigned char DDRB; - unsigned char IORB; - unsigned char current_bank; - unsigned char mirror_0x314; - unsigned char mirror_0x314_write_detected; + unsigned char DDRB; + unsigned char IORB; + unsigned char current_bank; + unsigned char mirror_0x314; + unsigned char mirror_0x314_write_detected; }; struct twilighte * twilighte_oric_init(void); diff --git a/render_gl.c b/render_gl.c index 5a3b9172..79409409 100644 --- a/render_gl.c +++ b/render_gl.c @@ -109,28 +109,30 @@ extern unsigned char thefont[]; // fcol = foreground colour // bcol = background colour // solidfont = use background colour -static void printchar( int i, int x, int y, unsigned char ch, Uint32 fcol, Uint32 bcol, SDL_bool solidfont ) +static void printchar(int i, int x, int y, unsigned char ch, Uint32 fcol, Uint32 bcol, SDL_bool solidfont) { int px, py, c; - unsigned char *fptr; + unsigned char* fptr; struct texture *ptx = &tx[i]; Uint32 *ptr; - if( ch > 127 ) return; + if(ch > 127) return; ptr = (Uint32 *)&ptx->buf[(y*ptx->w+x)*4]; fptr = &thefont[ch*12]; - for( py=0; py<12; py++ ) + for(py=0; py<12; py++) { - for( c=0x80, px=0; px<8; px++, c>>=1 ) + for(c=0x80, px=0; px<8; px++, c>>=1) { - if( (*fptr)&c ) + if((*fptr)&c) { *(ptr++) = fcol; - } else { - if( solidfont ) + } + else + { + if(solidfont) *(ptr++) = bcol; else ptr++; @@ -142,29 +144,29 @@ static void printchar( int i, int x, int y, unsigned char ch, Uint32 fcol, Uint3 } } -static void update_textzone_texture( struct machine *oric, int i ) +static void update_textzone_texture(struct machine *oric, int i) { int x, y, px, py, o; - if( !tz[i] ) return; - if( !tz[i]->modified ) return; - if( !tx[i+TEX_TZ].buf ) return; + if(!tz[i]) return; + if(!tz[i]->modified) return; + if(!tx[i+TEX_TZ].buf) return; o = 0; - for( y=0, py=0; yh; y++, py+=12 ) + for(y=0, py=0; yh; y++, py+=12) { - for( x=0, px=0; xw; x++, o++, px+=8 ) - printchar( i+TEX_TZ, px, py, tz[i]->tx[o], gpal[tz[i]->fc[o]], gpal[tz[i]->bc[o]], SDL_TRUE ); + for(x=0, px=0; xw; x++, o++, px+=8) + printchar(i+TEX_TZ, px, py, tz[i]->tx[o], gpal[tz[i]->fc[o]], gpal[tz[i]->bc[o]], SDL_TRUE); } - glBindTexture( GL_TEXTURE_2D, tex[i+TEX_TZ] ); - glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tx[i+TEX_TZ].w, tx[i+TEX_TZ].h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tx[i+TEX_TZ].buf ); + glBindTexture(GL_TEXTURE_2D, tex[i+TEX_TZ]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tx[i+TEX_TZ].w, tx[i+TEX_TZ].h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tx[i+TEX_TZ].buf); tz[i]->modified = SDL_FALSE; } -static void update_video_texture( struct machine *oric ) +static void update_video_texture(struct machine *oric) { int x, y, o, c; Uint8 *sptr; @@ -172,16 +174,16 @@ static void update_video_texture( struct machine *oric ) o = 0; sptr = oric->scr; - for( y=0; y<224; y++ ) + for(y=0; y<224; y++) { - if (!oric->vid_dirty[y]) + if(!oric->vid_dirty[y]) { sptr += 240; o += tx[TEX_VIDEO].w*4; continue; } - for( x=0; x<240; x++ ) + for(x=0; x<240; x++) { c = *(sptr++) * 3; tx[TEX_VIDEO].buf[o++] = oricpalette[c++]; @@ -202,7 +204,7 @@ static void update_video_texture( struct machine *oric ) } sptr -= 240; - for( x=0; x<240; x++ ) + for(x=0; x<240; x++) { c = *(sptr++) * 3; tx[TEX_VIDEO].buf[o++] = oricpalette[c++]; @@ -218,65 +220,73 @@ static void update_video_texture( struct machine *oric ) tx[TEX_VIDEO].buf[o++] = oricpalette[c-1]; tx[TEX_VIDEO].buf[o++] = 0xff; - glBindTexture( GL_TEXTURE_2D, tex[TEX_VIDEO] ); - glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tx[TEX_VIDEO].w, tx[TEX_VIDEO].h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tx[TEX_VIDEO].buf ); + glBindTexture(GL_TEXTURE_2D, tex[TEX_VIDEO]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tx[TEX_VIDEO].w, tx[TEX_VIDEO].h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tx[TEX_VIDEO].buf); } -void render_begin_gl( struct machine *oric ) +void render_begin_gl(struct machine *oric) { int i; refreshstatus = SDL_TRUE; - update_video_texture( oric ); - for( i=0; inewpopupstr ) + if(oric->newpopupstr) { - memset( tx[TEX_POPUP].buf, 0, tx[TEX_POPUP].w*tx[TEX_POPUP].h*4 ); - for( i=0; oric->popupstr[i]; i++ ) - printchar( TEX_POPUP, i*8, 0, oric->popupstr[i], gpal[1], gpal[0], SDL_TRUE ); - glBindTexture( GL_TEXTURE_2D, tex[TEX_POPUP] ); - glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tx[TEX_POPUP].w, tx[TEX_POPUP].h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tx[TEX_POPUP].buf ); + memset(tx[TEX_POPUP].buf, 0, tx[TEX_POPUP].w*tx[TEX_POPUP].h*4); + for(i=0; oric->popupstr[i]; i++) + printchar(TEX_POPUP, i*8, 0, oric->popupstr[i], gpal[1], gpal[0], SDL_TRUE); + glBindTexture(GL_TEXTURE_2D, tex[TEX_POPUP]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tx[TEX_POPUP].w, tx[TEX_POPUP].h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tx[TEX_POPUP].buf); oric->newpopupstr = SDL_FALSE; } - if( oric->newstatusstr ) + if(oric->newstatusstr) { - memset( tx[TEX_STATUS].buf, 0, tx[TEX_STATUS].w*tx[TEX_STATUS].h*4 ); - for( i=0; oric->statusstr[i]; i++ ) - printchar( TEX_STATUS, i*8, 0, oric->statusstr[i], gpal[1], gpal[0], SDL_FALSE ); - glBindTexture( GL_TEXTURE_2D, tex[TEX_STATUS] ); - glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tx[TEX_STATUS].w, tx[TEX_STATUS].h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tx[TEX_STATUS].buf ); + memset(tx[TEX_STATUS].buf, 0, tx[TEX_STATUS].w*tx[TEX_STATUS].h*4); + for(i=0; oric->statusstr[i]; i++) + printchar(TEX_STATUS, i*8, 0, oric->statusstr[i], gpal[1], gpal[0], SDL_FALSE); + glBindTexture(GL_TEXTURE_2D, tex[TEX_STATUS]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tx[TEX_STATUS].w, tx[TEX_STATUS].h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tx[TEX_STATUS].buf); } glClearColor(clrcol[0], clrcol[1], clrcol[2], 1.0f); - glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } -void render_end_gl( struct machine *oric ) +void render_end_gl(struct machine *oric) { - if( oric->emu_mode == EM_RUNNING ) + if(oric->emu_mode == EM_RUNNING) { - if( oric->popupstr[0] ) + if(oric->popupstr[0]) { - glBindTexture( GL_TEXTURE_2D, tex[TEX_POPUP] ); - glBegin( GL_QUADS ); - glTexCoord2f( 0.0f, 0.0f ); glVertex3f( 320.0f, 0.0f, 0.0f ); - glTexCoord2f( 320.0f/512.0f, 0.0f ); glVertex3f( 640.0f, 0.0f, 0.0f ); - glTexCoord2f( 320.0f/512.0f, 12.0f/32.0f ); glVertex3f( 640.0f, 12.0f, 0.0f ); - glTexCoord2f( 0.0f, 12.0f/32.0f ); glVertex3f( 320.0f, 12.0f, 0.0f ); + glBindTexture(GL_TEXTURE_2D, tex[TEX_POPUP]); + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(320.0f, 0.0f, 0.0f); + glTexCoord2f(320.0f/512.0f, 0.0f); + glVertex3f(640.0f, 0.0f, 0.0f); + glTexCoord2f(320.0f/512.0f, 12.0f/32.0f); + glVertex3f(640.0f, 12.0f, 0.0f); + glTexCoord2f(0.0f, 12.0f/32.0f); + glVertex3f(320.0f, 12.0f, 0.0f); glEnd(); } - if( oric->statusstr[0] ) + if(oric->statusstr[0]) { - glBindTexture( GL_TEXTURE_2D, tex[TEX_STATUS] ); - glBegin( GL_QUADS ); - glTexCoord2f( 0.0f, 0.0f ); glVertex3f( 0.0f, 466.0f, 0.0f ); - glTexCoord2f( 320.0f/512.0f, 0.0f ); glVertex3f( 320.0f, 466.0f, 0.0f ); - glTexCoord2f( 320.0f/512.0f, 12.0f/32.0f ); glVertex3f( 320.0f, 478.0f, 0.0f ); - glTexCoord2f( 0.0f, 12.0f/32.0f ); glVertex3f( 0.0f, 478.0f, 0.0f ); + glBindTexture(GL_TEXTURE_2D, tex[TEX_STATUS]); + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(0.0f, 466.0f, 0.0f); + glTexCoord2f(320.0f/512.0f, 0.0f); + glVertex3f(320.0f, 466.0f, 0.0f); + glTexCoord2f(320.0f/512.0f, 12.0f/32.0f); + glVertex3f(320.0f, 478.0f, 0.0f); + glTexCoord2f(0.0f, 12.0f/32.0f); + glVertex3f(0.0f, 478.0f, 0.0f); glEnd(); } } @@ -284,7 +294,7 @@ void render_end_gl( struct machine *oric ) SDL_COMPAT_GL_SwapBuffers(); } -static unsigned int rounduppow2( unsigned int x ) +static unsigned int rounduppow2(unsigned int x) { x--; x |= x >> 1; @@ -297,25 +307,25 @@ static unsigned int rounduppow2( unsigned int x ) return x; } -void render_textzone_alloc_gl( struct machine *oric, int i ) +void render_textzone_alloc_gl(struct machine *oric, int i) { - render_textzone_free_gl( oric, i ); + render_textzone_free_gl(oric, i); - if( !tz[i] ) return; + if(!tz[i]) return; #ifdef __amigaos4__ -// seems to be a bug in OS4 SDL or GL that reallocating the texture -// a different size causes problems :-/ Or it might just be me being -// stupid, but i can't see how at this time. Anyway; say hello to mr. -// ugly workaround + // seems to be a bug in OS4 SDL or GL that reallocating the texture + // a different size causes problems :-/ Or it might just be me being + // stupid, but i can't see how at this time. Anyway; say hello to mr. + // ugly workaround tx[i+TEX_TZ].w = 512; tx[i+TEX_TZ].h = 512; #else - tx[i+TEX_TZ].w = rounduppow2( tz[i]->w * 8 ); - tx[i+TEX_TZ].h = rounduppow2( tz[i]->h * 12 ); + tx[i+TEX_TZ].w = rounduppow2(tz[i]->w * 8); + tx[i+TEX_TZ].h = rounduppow2(tz[i]->h * 12); #endif - tx[i+TEX_TZ].buf = malloc( tx[i+TEX_TZ].w*tx[i+TEX_TZ].h*4 ); - if( !tx[i+TEX_TZ].buf ) + tx[i+TEX_TZ].buf = malloc(tx[i+TEX_TZ].w*tx[i+TEX_TZ].h*4); + if(!tx[i+TEX_TZ].buf) { tx[i+TEX_TZ].w = 0; tx[i+TEX_TZ].h = 0; @@ -325,21 +335,21 @@ void render_textzone_alloc_gl( struct machine *oric, int i ) tx[i+TEX_TZ].tw = ((float)(tz[i]->w*8)) / ((float)tx[i+TEX_TZ].w); tx[i+TEX_TZ].th = ((float)(tz[i]->h*12)) / ((float)tx[i+TEX_TZ].h); - glBindTexture( GL_TEXTURE_2D, tex[i+TEX_TZ] ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tx[i+TEX_TZ].w, tx[i+TEX_TZ].h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tx[i+TEX_TZ].buf ); + glBindTexture(GL_TEXTURE_2D, tex[i+TEX_TZ]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tx[i+TEX_TZ].w, tx[i+TEX_TZ].h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tx[i+TEX_TZ].buf); tz[i]->modified = SDL_TRUE; } -void render_textzone_free_gl( struct machine *oric, int i ) +void render_textzone_free_gl(struct machine *oric, int i) { - if( tx[i+TEX_TZ].buf ) + if(tx[i+TEX_TZ].buf) { - free( tx[i+TEX_TZ].buf ); + free(tx[i+TEX_TZ].buf); tx[i+TEX_TZ].buf = NULL; } @@ -347,36 +357,44 @@ void render_textzone_free_gl( struct machine *oric, int i ) tx[i+TEX_TZ].h = 0; } -void render_textzone_gl( struct machine *oric, int i ) +void render_textzone_gl(struct machine *oric, int i) { - if( !tz[i] ) return; - if( !tx[i+TEX_TZ].buf ) return; - - glBindTexture( GL_TEXTURE_2D, tex[i+TEX_TZ] ); - glBegin( GL_QUADS ); - glTexCoord2f( 0.0f, 0.0f ); glVertex3f( tz[i]->x, tz[i]->y, 0.0f ); - glTexCoord2f( tx[i+TEX_TZ].tw, 0.0f ); glVertex3f( tz[i]->x+tz[i]->w*8, tz[i]->y, 0.0f ); - glTexCoord2f( tx[i+TEX_TZ].tw, tx[i+TEX_TZ].th ); glVertex3f( tz[i]->x+tz[i]->w*8, tz[i]->y+tz[i]->h*12, 0.0f ); - glTexCoord2f( 0.0f, tx[i+TEX_TZ].th ); glVertex3f( tz[i]->x, tz[i]->y+tz[i]->h*12, 0.0f ); + if(!tz[i]) return; + if(!tx[i+TEX_TZ].buf) return; + + glBindTexture(GL_TEXTURE_2D, tex[i+TEX_TZ]); + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(tz[i]->x, tz[i]->y, 0.0f); + glTexCoord2f(tx[i+TEX_TZ].tw, 0.0f); + glVertex3f(tz[i]->x+tz[i]->w*8, tz[i]->y, 0.0f); + glTexCoord2f(tx[i+TEX_TZ].tw, tx[i+TEX_TZ].th); + glVertex3f(tz[i]->x+tz[i]->w*8, tz[i]->y+tz[i]->h*12, 0.0f); + glTexCoord2f(0.0f, tx[i+TEX_TZ].th); + glVertex3f(tz[i]->x, tz[i]->y+tz[i]->h*12, 0.0f); glEnd(); } -void render_clear_area_gl( int x, int y, int w, int h ) +void render_clear_area_gl(int x, int y, int w, int h) { } -void render_gimg_gl( int i, Sint32 xp, Sint32 yp ) +void render_gimg_gl(int i, Sint32 xp, Sint32 yp) { - glBindTexture( GL_TEXTURE_2D, tex[i+TEX_GIMG] ); - glBegin( GL_QUADS ); - glTexCoord2f( 0.0f, 0.0f ); glVertex3f( xp, yp, 0.0f ); - glTexCoord2f( tx[i+TEX_GIMG].tw, 0.0f ); glVertex3f( xp+gimgs[i].w, yp, 0.0f ); - glTexCoord2f( tx[i+TEX_GIMG].tw, tx[i+TEX_GIMG].th ); glVertex3f( xp+gimgs[i].w, yp+gimgs[i].h, 0.0f ); - glTexCoord2f( 0.0f, tx[i+TEX_GIMG].th ); glVertex3f( xp, yp+gimgs[i].h, 0.0f ); + glBindTexture(GL_TEXTURE_2D, tex[i+TEX_GIMG]); + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(xp, yp, 0.0f); + glTexCoord2f(tx[i+TEX_GIMG].tw, 0.0f); + glVertex3f(xp+gimgs[i].w, yp, 0.0f); + glTexCoord2f(tx[i+TEX_GIMG].tw, tx[i+TEX_GIMG].th); + glVertex3f(xp+gimgs[i].w, yp+gimgs[i].h, 0.0f); + glTexCoord2f(0.0f, tx[i+TEX_GIMG].th); + glVertex3f(xp, yp+gimgs[i].h, 0.0f); glEnd(); } -void render_gimgpart_gl( int i, Sint32 xp, Sint32 yp, Sint32 ox, Sint32 oy, Sint32 w, Sint32 h ) +void render_gimgpart_gl(int i, Sint32 xp, Sint32 yp, Sint32 ox, Sint32 oy, Sint32 w, Sint32 h) { float texl, text, texr, texb; @@ -385,34 +403,40 @@ void render_gimgpart_gl( int i, Sint32 xp, Sint32 yp, Sint32 ox, Sint32 oy, Sint texr = ((float)ox+w)/((float)tx[i+TEX_GIMG].w); texb = ((float)oy+h)/((float)tx[i+TEX_GIMG].h); - glBindTexture( GL_TEXTURE_2D, tex[i+TEX_GIMG] ); - glBegin( GL_QUADS ); - glTexCoord2f( texl, text ); glVertex3f( xp, yp, 0.0f ); - glTexCoord2f( texr, text ); glVertex3f( xp+w, yp, 0.0f ); - glTexCoord2f( texr, texb ); glVertex3f( xp+w, yp+h, 0.0f ); - glTexCoord2f( texl, texb ); glVertex3f( xp, yp+h, 0.0f ); + glBindTexture(GL_TEXTURE_2D, tex[i+TEX_GIMG]); + glBegin(GL_QUADS); + glTexCoord2f(texl, text); + glVertex3f(xp, yp, 0.0f); + glTexCoord2f(texr, text); + glVertex3f(xp+w, yp, 0.0f); + glTexCoord2f(texr, texb); + glVertex3f(xp+w, yp+h, 0.0f); + glTexCoord2f(texl, texb); + glVertex3f(xp, yp+h, 0.0f); glEnd(); } -void render_video_gl( struct machine *oric, SDL_bool doublesize ) +void render_video_gl(struct machine *oric, SDL_bool doublesize) { float l, r, t, b; int y; - glBindTexture( GL_TEXTURE_2D, tex[TEX_VIDEO] ); + glBindTexture(GL_TEXTURE_2D, tex[TEX_VIDEO]); - if( doublesize ) + if(doublesize) { - if( oric->hstretch ) + if(oric->hstretch) { l = 0.0f; r = 640.f; t = 14.0f; b = 462.0f; - } else { + } + else + { l = 320.0f-240.0f; r = 320.0f+240.0f; - if( oric->aratio && oric->vid_freq ) + if(oric->aratio && oric->vid_freq) { t = 14.0f + (448.0f-448.0f*(260.0f/308.0f))/2; b = 462.0f - (448.0f-448.0f*(260.0f/308.0f))/2; @@ -424,57 +448,73 @@ void render_video_gl( struct machine *oric, SDL_bool doublesize ) } } - glBegin( GL_QUADS ); - glTexCoord2f( 0.0f, 0.0f ); glVertex3f( l, t, 0.0f ); - glTexCoord2f( 240.0f/256.0f, 0.0f ); glVertex3f( r, t, 0.0f ); - glTexCoord2f( 240.0f/256.0f, 224.0f/256.0f ); glVertex3f( r, b, 0.0f ); - glTexCoord2f( 0.0f, 224.0f/256.0f ); glVertex3f( l, b, 0.0f ); + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(l, t, 0.0f); + glTexCoord2f(240.0f/256.0f, 0.0f); + glVertex3f(r, t, 0.0f); + glTexCoord2f(240.0f/256.0f, 224.0f/256.0f); + glVertex3f(r, b, 0.0f); + glTexCoord2f(0.0f, 224.0f/256.0f); + glVertex3f(l, b, 0.0f); glEnd(); - if( oric->palghost ) + if(oric->palghost) { float offs = (oric->hstretch) ? 3.2f : 2.2f; - glColor4ub( 255, 255, 255, 64 ); - glBegin( GL_QUADS ); - glTexCoord2f( 0.0f, 0.0f ); glVertex3f( l+offs, t, 0.0f ); - glTexCoord2f( 240.0f/256.0f, 0.0f ); glVertex3f( r+offs, t, 0.0f ); - glTexCoord2f( 240.0f/256.0f, 224.0f/256.0f ); glVertex3f( r+offs, b, 0.0f ); - glTexCoord2f( 0.0f, 224.0f/256.0f ); glVertex3f( l+offs, b, 0.0f ); + glColor4ub(255, 255, 255, 64); + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(l+offs, t, 0.0f); + glTexCoord2f(240.0f/256.0f, 0.0f); + glVertex3f(r+offs, t, 0.0f); + glTexCoord2f(240.0f/256.0f, 224.0f/256.0f); + glVertex3f(r+offs, b, 0.0f); + glTexCoord2f(0.0f, 224.0f/256.0f); + glVertex3f(l+offs, b, 0.0f); glEnd(); - glColor4ub( 255, 255, 255, 255 ); + glColor4ub(255, 255, 255, 255); } - if( !oric->scanlines ) return; + if(!oric->scanlines) return; - glBindTexture( GL_TEXTURE_2D, tex[TEX_SCANLINES] ); - glBegin( GL_QUADS ); - for( y=14; y<224*2+14; y+=32 ) + glBindTexture(GL_TEXTURE_2D, tex[TEX_SCANLINES]); + glBegin(GL_QUADS); + for(y=14; y<224*2+14; y+=32) { - glTexCoord2f( 0.0f, 0.0f ); glVertex3f( l, y, 0.0f ); - glTexCoord2f( 1.0f, 0.0f ); glVertex3f( r, y, 0.0f ); - glTexCoord2f( 1.0f, 1.0f ); glVertex3f( r, y+32, 0.0f ); - glTexCoord2f( 0.0f, 1.0f ); glVertex3f( l, y+32, 0.0f ); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(l, y, 0.0f); + glTexCoord2f(1.0f, 0.0f); + glVertex3f(r, y, 0.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex3f(r, y+32, 0.0f); + glTexCoord2f(0.0f, 1.0f); + glVertex3f(l, y+32, 0.0f); } glEnd(); return; } - glBegin( GL_QUADS ); - glTexCoord2f( 0.0f, 0.0f ); glVertex3f( 0.0f, 4.0f, 0.0f ); - glTexCoord2f( 240.0f/256.0f, 0.0f ); glVertex3f( 240.0f, 4.0f, 0.0f ); - glTexCoord2f( 240.0f/256.0f, 224.0f/256.0f ); glVertex3f( 240.0f, 228.0f, 0.0f ); - glTexCoord2f( 0.0f, 224.0f/256.0f ); glVertex3f( 0.0f, 228.0f, 0.0f ); + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(0.0f, 4.0f, 0.0f); + glTexCoord2f(240.0f/256.0f, 0.0f); + glVertex3f(240.0f, 4.0f, 0.0f); + glTexCoord2f(240.0f/256.0f, 224.0f/256.0f); + glVertex3f(240.0f, 228.0f, 0.0f); + glTexCoord2f(0.0f, 224.0f/256.0f); + glVertex3f(0.0f, 228.0f, 0.0f); glEnd(); } -void preinit_render_gl( struct machine *oric ) +void preinit_render_gl(struct machine *oric) { Sint32 i; screen = NULL; dodeltex = SDL_FALSE; - for( i=0; ishut_render( oric ); + oric->shut_render(oric); fullscreen = !fullscreen; - if( oric->init_render( oric ) ) return SDL_TRUE; - set_render_mode( oric, RENDERMODE_NULL ); + if(oric->init_render(oric)) return SDL_TRUE; + set_render_mode(oric, RENDERMODE_NULL); oric->emu_mode = EM_PLEASEQUIT; return SDL_FALSE; #endif } -static SDL_bool go_go_gadget_texture( int i, int w, int h, int blendtype, SDL_bool callteximg2d ) +static SDL_bool go_go_gadget_texture(int i, int w, int h, int blendtype, SDL_bool callteximg2d) { tx[i].w = w; tx[i].h = h; - tx[i].buf = malloc( w*h*4 ); - if( !tx[i].buf ) return SDL_FALSE; + tx[i].buf = malloc(w*h*4); + if(!tx[i].buf) return SDL_FALSE; - memset( tx[i].buf, 0, w*h*4 ); + memset(tx[i].buf, 0, w*h*4); - glBindTexture( GL_TEXTURE_2D, tex[i] ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, blendtype ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, blendtype ); - if( callteximg2d )glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tx[i].buf ); + glBindTexture(GL_TEXTURE_2D, tex[i]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, blendtype); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, blendtype); + if(callteximg2d)glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tx[i].buf); return SDL_TRUE; } -SDL_bool init_render_gl( struct machine *oric ) +SDL_bool init_render_gl(struct machine *oric) { - Uint32 flags = SDL_COMPAT_OPENGL | ( fullscreen? SDL_COMPAT_FULLSCREEN : 0 ); + Uint32 flags = SDL_COMPAT_OPENGL | (fullscreen? SDL_COMPAT_FULLSCREEN : 0); int BitsPerPixel = SDL_COMPAT_GetBitsPerPixel(); int depth = 32; - int y = 480 + ( oric->show_keyboard? 240:0 ); + int y = 480 + (oric->show_keyboard? 240:0); int x = 640; int i; - if( BitsPerPixel ) + if(BitsPerPixel) depth = BitsPerPixel; - screen = SDL_COMPAT_SetVideoMode( x, y, depth, flags ); + screen = SDL_COMPAT_SetVideoMode(x, y, depth, flags); - if( !screen ) + if(!screen) { - printf( "SDL video failed\n" ); + printf("SDL video failed\n"); return SDL_FALSE; } - glMatrixMode( GL_PROJECTION ); - if (oric->show_keyboard) { - glOrtho( 0.0f, 640.0f, 480.0f+240.0f, 0.0f, 0.0f, 1.0f ); - } else { - glOrtho( 0.0f, 640.0f, 480.0f, 0.0f, 0.0f, 1.0f ); + glMatrixMode(GL_PROJECTION); + if(oric->show_keyboard) + { + glOrtho(0.0f, 640.0f, 480.0f+240.0f, 0.0f, 0.0f, 1.0f); + } + else + { + glOrtho(0.0f, 640.0f, 480.0f, 0.0f, 0.0f, 1.0f); } - glMatrixMode( GL_MODELVIEW ); + glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - glDisable( GL_DEPTH_TEST ); - glColor4ub( 255, 255, 255, 255 ); + glDisable(GL_DEPTH_TEST); + glColor4ub(255, 255, 255, 255); - glGenTextures( NUM_TEXTURES, tex ); + glGenTextures(NUM_TEXTURES, tex); dodeltex = SDL_TRUE; - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); - glEnable( GL_TEXTURE_2D ); - glEnable( GL_BLEND ); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_TEXTURE_2D); + glEnable(GL_BLEND); // Allocate texture buffers - if( !go_go_gadget_texture( TEX_VIDEO, 256, 256, GL_LINEAR, SDL_TRUE ) ) return SDL_FALSE; - if( !go_go_gadget_texture( TEX_SCANLINES, 32, 32, GL_NEAREST, SDL_FALSE ) ) return SDL_FALSE; - if( !go_go_gadget_texture( TEX_STATUS, 512, 32, GL_NEAREST, SDL_TRUE ) ) return SDL_FALSE; - if( !go_go_gadget_texture( TEX_POPUP, 512, 32, GL_NEAREST, SDL_TRUE ) ) return SDL_FALSE; + if(!go_go_gadget_texture(TEX_VIDEO, 256, 256, GL_LINEAR, SDL_TRUE)) return SDL_FALSE; + if(!go_go_gadget_texture(TEX_SCANLINES, 32, 32, GL_NEAREST, SDL_FALSE)) return SDL_FALSE; + if(!go_go_gadget_texture(TEX_STATUS, 512, 32, GL_NEAREST, SDL_TRUE)) return SDL_FALSE; + if(!go_go_gadget_texture(TEX_POPUP, 512, 32, GL_NEAREST, SDL_TRUE)) return SDL_FALSE; - for( y=0; y<32; y++ ) + for(y=0; y<32; y++) { - for( x=0; x<32*4; ) + for(x=0; x<32*4;) { tx[TEX_SCANLINES].buf[y*32*4+x++] = 0x00; tx[TEX_SCANLINES].buf[y*32*4+x++] = 0x00; @@ -576,19 +619,19 @@ SDL_bool init_render_gl( struct machine *oric ) tx[TEX_SCANLINES].buf[y*32*4+x++] = (y&1) ? 0x30 : 0x00; } } - glBindTexture( GL_TEXTURE_2D, tex[TEX_SCANLINES] ); - glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tx[TEX_SCANLINES].w, tx[TEX_SCANLINES].h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tx[TEX_SCANLINES].buf ); + glBindTexture(GL_TEXTURE_2D, tex[TEX_SCANLINES]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tx[TEX_SCANLINES].w, tx[TEX_SCANLINES].h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tx[TEX_SCANLINES].buf); - for( i=0; inewpopupstr ) + if(oric->newpopupstr) { dst_scanline = (Uint8*)screen->pixels; dst_scanline += 320 * pixel_size; - if( oric->sw_depth == 16 ) + if(oric->sw_depth == 16) { Uint16 *dst_pixel; - for( y=12; y!=0; --y, dst_scanline += screen->pitch) + for(y=12; y!=0; --y, dst_scanline += screen->pitch) { dst_pixel = (Uint16 *)dst_scanline; - for( x=320; x<640; x++, dst_pixel++ ) + for(x=320; x<640; x++, dst_pixel++) *dst_pixel = gpal[0]; } - } else { + } + else + { Uint32 *dst_pixel; - for( y=12; y!=0; --y, dst_scanline += screen->pitch) + for(y=12; y!=0; --y, dst_scanline += screen->pitch) { dst_pixel = (Uint32 *)dst_scanline; - for( x=320; x<640; x++, dst_pixel++ ) + for(x=320; x<640; x++, dst_pixel++) *dst_pixel = gpal[0]; } } oric->newpopupstr = SDL_FALSE; } - - if( oric->newstatusstr ) + + if(oric->newstatusstr) { refreshstatus = SDL_TRUE; oric->newstatusstr = SDL_FALSE; } } -void render_end_sw( struct machine *oric ) +void render_end_sw(struct machine *oric) { int i; Uint32 char_pitch; @@ -150,42 +152,42 @@ void render_end_sw( struct machine *oric ) char_pitch = 8 * pixel_size; - if( oric->emu_mode == EM_RUNNING ) + if(oric->emu_mode == EM_RUNNING) { - if( oric->popupstr[0] ) + if(oric->popupstr[0]) { dst_pixel = (Uint8*)screen->pixels; dst_pixel += 320 * pixel_size; - for( i=0; oric->popupstr[i]; i++, dst_pixel += char_pitch ) - printchar( dst_pixel, oric->popupstr[i], gpal[1], gpal[0], SDL_TRUE ); + for(i=0; oric->popupstr[i]; i++, dst_pixel += char_pitch) + printchar(dst_pixel, oric->popupstr[i], gpal[1], gpal[0], SDL_TRUE); } - - if( oric->statusstr[0] ) + + if(oric->statusstr[0]) { dst_pixel = (Uint8*)screen->pixels; dst_pixel += 466 * screen->pitch; - for( i=0; oric->statusstr[i]; i++, dst_pixel += char_pitch ) - printchar( dst_pixel, oric->statusstr[i], gpal[1], 0, SDL_FALSE ); + for(i=0; oric->statusstr[i]; i++, dst_pixel += char_pitch) + printchar(dst_pixel, oric->statusstr[i], gpal[1], 0, SDL_FALSE); } } - if( SDL_MUSTLOCK( screen ) ) - SDL_UnlockSurface( screen ); + if(SDL_MUSTLOCK(screen)) + SDL_UnlockSurface(screen); - SDL_COMPAT_Flip( screen ); + SDL_COMPAT_Flip(screen); } -void render_textzone_alloc_sw( struct machine *oric, int i ) +void render_textzone_alloc_sw(struct machine *oric, int i) { } -void render_textzone_free_sw( struct machine *oric, int i ) +void render_textzone_free_sw(struct machine *oric, int i) { } -void render_textzone_sw( struct machine *oric, int i ) +void render_textzone_sw(struct machine *oric, int i) { int x, y, o; Uint32 char_pitch; @@ -198,18 +200,18 @@ void render_textzone_sw( struct machine *oric, int i ) dst_scanline += screen->pitch * ptz->y + pixel_size * ptz->x; o = 0; - for( y=ptz->h; y!=0; --y, dst_scanline+=12*screen->pitch ) + for(y=ptz->h; y!=0; --y, dst_scanline+=12*screen->pitch) { dst_pixel = dst_scanline; - for( x=ptz->w; x!=0; --x, ++o, dst_pixel+=char_pitch ) - printchar( dst_pixel, ptz->tx[o], gpal[ptz->fc[o]], gpal[ptz->bc[o]], SDL_TRUE ); + for(x=ptz->w; x!=0; --x, ++o, dst_pixel+=char_pitch) + printchar(dst_pixel, ptz->tx[o], gpal[ptz->fc[o]], gpal[ptz->bc[o]], SDL_TRUE); } } // Clear an area to background -void render_clear_area_sw( int x, int y, int w, int h ) +void render_clear_area_sw(int x, int y, int w, int h) { Uint8 *dst_scanline; Sint32 i; @@ -217,12 +219,12 @@ void render_clear_area_sw( int x, int y, int w, int h ) dst_scanline = (Uint8 *)screen->pixels; dst_scanline += screen->pitch * y + pixel_size * x; - for( i=0; ipitch ) - memset( dst_scanline, 0, pixel_size*w ); + for(i=0; ipitch) + memset(dst_scanline, 0, pixel_size*w); } // Draw a GUI image at X,Y -void render_gimg_sw( int img_id, Sint32 xp, Sint32 yp ) +void render_gimg_sw(int img_id, Sint32 xp, Sint32 yp) { struct guiimg *gi = &gimgs[img_id]; Uint8 *src_scanline, *dst_scanline; @@ -233,12 +235,12 @@ void render_gimg_sw( int img_id, Sint32 xp, Sint32 yp ) dst_scanline = (Uint8 *)screen->pixels; dst_scanline += screen->pitch * yp + pixel_size * xp; - for( i=gi->h; i!=0; --i, src_scanline+=pixel_size*gi->w, dst_scanline+=screen->pitch ) - memcpy( dst_scanline, src_scanline, pixel_size*gi->w ); + for(i=gi->h; i!=0; --i, src_scanline+=pixel_size*gi->w, dst_scanline+=screen->pitch) + memcpy(dst_scanline, src_scanline, pixel_size*gi->w); } // Draw part of an image (xp,yp = screen location, ox, oy = offset into image, w, h = dimensions) -void render_gimgpart_sw( int img_id, Sint32 xp, Sint32 yp, Sint32 ox, Sint32 oy, Sint32 w, Sint32 h ) +void render_gimgpart_sw(int img_id, Sint32 xp, Sint32 yp, Sint32 ox, Sint32 oy, Sint32 w, Sint32 h) { struct guiimg *gi = &gimgs[img_id]; Uint8 *src_scanline, *dst_scanline; @@ -250,12 +252,12 @@ void render_gimgpart_sw( int img_id, Sint32 xp, Sint32 yp, Sint32 ox, Sint32 oy, dst_scanline = (Uint8 *)screen->pixels; dst_scanline += screen->pitch * yp + pixel_size * xp; - for( i=h; i!=0; --i, src_scanline+=pixel_size*gi->w, dst_scanline+=screen->pitch ) - memcpy( dst_scanline, src_scanline, pixel_size*w ); + for(i=h; i!=0; --i, src_scanline+=pixel_size*gi->w, dst_scanline+=screen->pitch) + memcpy(dst_scanline, src_scanline, pixel_size*w); } // Copy the video output buffer to the SDL surface, assuming 16bpp video mode -void render_video_sw_16bpp( struct machine *oric, SDL_bool doublesize ) +void render_video_sw_16bpp(struct machine *oric, SDL_bool doublesize) { int x, y; Uint8 *src_pixel; @@ -265,12 +267,12 @@ void render_video_sw_16bpp( struct machine *oric, SDL_bool doublesize ) Uint16 *dst_pixel; Uint32 *dst_even_pixel, *dst_odd_pixel; - if( !oric->scr ) + if(!oric->scr) return; - if( doublesize ) + if(doublesize) { - if( needclr ) + if(needclr) { SDL_FillRect(screen, NULL, gpal[0]); needclr = SDL_FALSE; @@ -285,11 +287,11 @@ void render_video_sw_16bpp( struct machine *oric, SDL_bool doublesize ) dst_odd_scanline = dst_even_scanline; dst_odd_scanline += screen->pitch; - if( oric->scanlines ) + if(oric->scanlines) { - for( y=0; y<224; y++, dst_even_scanline+=dst_pitch_x2, dst_odd_scanline+=dst_pitch_x2 ) + for(y=0; y<224; y++, dst_even_scanline+=dst_pitch_x2, dst_odd_scanline+=dst_pitch_x2) { - if (!oric->vid_dirty[y]) + if(!oric->vid_dirty[y]) { src_pixel += 240; continue; @@ -297,7 +299,7 @@ void render_video_sw_16bpp( struct machine *oric, SDL_bool doublesize ) dst_even_pixel = (Uint32*)dst_even_scanline; dst_odd_pixel = (Uint32*)dst_odd_scanline; - for( x=240; x!=0; --x ) + for(x=240; x!=0; --x) { c = *(src_pixel++); *(dst_even_pixel++) = dpal[c]; @@ -306,10 +308,12 @@ void render_video_sw_16bpp( struct machine *oric, SDL_bool doublesize ) oric->vid_dirty[y] = SDL_FALSE; } - } else { - for( y=0; y<224; y++, dst_even_scanline+=dst_pitch_x2, dst_odd_scanline+=dst_pitch_x2 ) + } + else + { + for(y=0; y<224; y++, dst_even_scanline+=dst_pitch_x2, dst_odd_scanline+=dst_pitch_x2) { - if (!oric->vid_dirty[y]) + if(!oric->vid_dirty[y]) { src_pixel += 240; continue; @@ -317,11 +321,11 @@ void render_video_sw_16bpp( struct machine *oric, SDL_bool doublesize ) dst_even_pixel = (Uint32*)dst_even_scanline; dst_odd_pixel = (Uint32*)dst_odd_scanline; - for( x=240; x!=0; --x ) + for(x=240; x!=0; --x) { - c = dpal[*(src_pixel++)]; - *(dst_even_pixel++) = c; - *(dst_odd_pixel++) = c; + c = dpal[*(src_pixel++)]; + *(dst_even_pixel++) = c; + *(dst_odd_pixel++) = c; } oric->vid_dirty[y] = SDL_FALSE; } @@ -334,22 +338,22 @@ void render_video_sw_16bpp( struct machine *oric, SDL_bool doublesize ) src_pixel = oric->scr; dst_scanline = (Uint8*)screen->pixels; - for( y=0; y<4; y++ ) + for(y=0; y<4; y++) { - memset( dst_scanline, 0, 240*pixel_size ); + memset(dst_scanline, 0, 240*pixel_size); dst_scanline += screen->pitch; } - for( ; y<228; y++, dst_scanline+=screen->pitch ) + for(; y<228; y++, dst_scanline+=screen->pitch) { dst_pixel = (Uint16*)dst_scanline; - for( x=240; x!=0; --x ) + for(x=240; x!=0; --x) *(dst_pixel++) = (Uint16)pal[*(src_pixel++)]; } } // Copy the video output buffer to the SDL surface, assuming 32bpp video mode -void render_video_sw_32bpp( struct machine *oric, SDL_bool doublesize ) +void render_video_sw_32bpp(struct machine *oric, SDL_bool doublesize) { int x, y; Uint8 *src_pixel; @@ -358,12 +362,12 @@ void render_video_sw_32bpp( struct machine *oric, SDL_bool doublesize ) Uint8 *dst_scanline, *dst_even_scanline, *dst_odd_scanline; Uint32 *dst_pixel, *dst_even_pixel, *dst_odd_pixel; - if( !oric->scr ) + if(!oric->scr) return; - if( doublesize ) + if(doublesize) { - if( needclr ) + if(needclr) { SDL_FillRect(screen, NULL, gpal[0]); needclr = SDL_FALSE; @@ -378,11 +382,11 @@ void render_video_sw_32bpp( struct machine *oric, SDL_bool doublesize ) dst_odd_scanline = dst_even_scanline; dst_odd_scanline += screen->pitch; - if( oric->scanlines ) + if(oric->scanlines) { - for( y=0; y<224; y++, dst_even_scanline+=dst_pitch_x2, dst_odd_scanline+=dst_pitch_x2 ) + for(y=0; y<224; y++, dst_even_scanline+=dst_pitch_x2, dst_odd_scanline+=dst_pitch_x2) { - if (!oric->vid_dirty[y]) + if(!oric->vid_dirty[y]) { src_pixel += 240; continue; @@ -390,7 +394,7 @@ void render_video_sw_32bpp( struct machine *oric, SDL_bool doublesize ) dst_even_pixel = (Uint32*)dst_even_scanline; dst_odd_pixel = (Uint32*)dst_odd_scanline; - for( x=240; x!=0; --x ) + for(x=240; x!=0; --x) { c2 = pal[(*src_pixel)+8]; c = pal[*(src_pixel++)]; @@ -404,10 +408,12 @@ void render_video_sw_32bpp( struct machine *oric, SDL_bool doublesize ) oric->vid_dirty[y] = SDL_FALSE; } - } else { - for( y=0; y<224; y++, dst_even_scanline+=dst_pitch_x2, dst_odd_scanline+=dst_pitch_x2 ) + } + else + { + for(y=0; y<224; y++, dst_even_scanline+=dst_pitch_x2, dst_odd_scanline+=dst_pitch_x2) { - if (!oric->vid_dirty[y]) + if(!oric->vid_dirty[y]) { src_pixel += 240; continue; @@ -415,15 +421,15 @@ void render_video_sw_32bpp( struct machine *oric, SDL_bool doublesize ) dst_even_pixel = (Uint32*)dst_even_scanline; dst_odd_pixel = (Uint32*)dst_odd_scanline; - for( x=240; x!=0; --x ) - { - c = pal[*(src_pixel++)]; + for(x=240; x!=0; --x) + { + c = pal[*(src_pixel++)]; - *(dst_even_pixel++) = c; - *(dst_even_pixel++) = c; - *(dst_odd_pixel++) = c; - *(dst_odd_pixel++) = c; - } + *(dst_even_pixel++) = c; + *(dst_even_pixel++) = c; + *(dst_odd_pixel++) = c; + *(dst_odd_pixel++) = c; + } oric->vid_dirty[y] = SDL_FALSE; } } @@ -435,22 +441,22 @@ void render_video_sw_32bpp( struct machine *oric, SDL_bool doublesize ) src_pixel = oric->scr; dst_scanline = (Uint8*)screen->pixels; - for( y=0; y<4; y++ ) + for(y=0; y<4; y++) { - memset( dst_scanline, 0, 240*pixel_size ); + memset(dst_scanline, 0, 240*pixel_size); dst_scanline += screen->pitch; } - for( ; y<228; y++, dst_scanline+=screen->pitch ) + for(; y<228; y++, dst_scanline+=screen->pitch) { dst_pixel = (Uint32*)dst_scanline; - for( x=240; x!=0; --x ) + for(x=240; x!=0; --x) *(dst_pixel++) = pal[*(src_pixel++)]; } } -void render_sw_detectvideo( struct machine *oric ) +void render_sw_detectvideo(struct machine *oric) { #ifndef __ANDROID__ int BitsPerPixel = SDL_COMPAT_GetBitsPerPixel(); @@ -458,14 +464,14 @@ void render_sw_detectvideo( struct machine *oric ) // Guess the suitable video mode, either 16bpp or 32bpp oric->sw_depth = 16; - switch( BitsPerPixel ) + switch(BitsPerPixel) { // Great, cases we handle case 8: case 16: case 24: case 32: - oric->sw_depth = BitsPerPixel; + oric->sw_depth = BitsPerPixel; break; // Damn, cases we don't handle. Let's say 16 bpp gonna be ok default: @@ -476,7 +482,7 @@ void render_sw_detectvideo( struct machine *oric ) #endif } -void preinit_render_sw( struct machine *oric ) +void preinit_render_sw(struct machine *oric) { Sint32 i; @@ -484,15 +490,15 @@ void preinit_render_sw( struct machine *oric ) screen = NULL; // Images are not set yet - for( i=0; ishut_render( oric ); + oric->shut_render(oric); fullscreen = !fullscreen; - if( oric->init_render( oric ) ) return SDL_TRUE; - set_render_mode( oric, RENDERMODE_NULL ); - oric->emu_mode = EM_PLEASEQUIT; + if(oric->init_render(oric)) return SDL_TRUE; + set_render_mode(oric, RENDERMODE_NULL); + oric->emu_mode = EM_PLEASEQUIT; return SDL_FALSE; #endif } @@ -541,7 +547,7 @@ DEFINE_guiimg_to_img_X_bpp(32) // --- end of guiimg_to_img_X_bpp template function --------------------------- -SDL_bool init_render_sw( struct machine *oric ) +SDL_bool init_render_sw(struct machine *oric) { int i; unsigned char* pal_it; @@ -550,55 +556,64 @@ SDL_bool init_render_sw( struct machine *oric ) pixel_size = oric->sw_depth / 8; surfacemode = fullscreen ? SDL_COMPAT_FULLSCREEN : SDL_SWSURFACE; - if( hwsurface ) { surfacemode &= ~SDL_SWSURFACE; surfacemode |= SDL_COMPAT_HWSURFACE; } + if(hwsurface) + { + surfacemode &= ~SDL_SWSURFACE; + surfacemode |= SDL_COMPAT_HWSURFACE; + } // Try to setup the video display - if (oric->show_keyboard) { - screen = SDL_COMPAT_SetVideoMode( 640, 480+240, oric->sw_depth, surfacemode ); - } else { - screen = SDL_COMPAT_SetVideoMode( 640, 480, oric->sw_depth, surfacemode ); + if(oric->show_keyboard) + { + screen = SDL_COMPAT_SetVideoMode(640, 480+240, oric->sw_depth, surfacemode); } - - if( !screen ) + else { - printf( "SDL video failed\n" ); + screen = SDL_COMPAT_SetVideoMode(640, 480, oric->sw_depth, surfacemode); + } + + if(!screen) + { + printf("SDL video failed\n"); return SDL_FALSE; } - SDL_COMPAT_WM_SetCaption( APP_NAME_FULL, APP_NAME_FULL ); + SDL_COMPAT_WM_SetCaption(APP_NAME_FULL, APP_NAME_FULL); // Set the video bit depth dependent function - if (oric->sw_depth == 16) { + if(oric->sw_depth == 16) + { printchar = printchar_16bpp; guiimg_to_img = guiimg_to_img_16bpp; -// SDL_COMPAT_WM_SetCaption( "16bit video", "16bit video" ); + // SDL_COMPAT_WM_SetCaption( "16bit video", "16bit video" ); } - else if (oric->sw_depth == 32) { + else if(oric->sw_depth == 32) + { printchar = printchar_32bpp; guiimg_to_img = guiimg_to_img_32bpp; -// SDL_COMPAT_WM_SetCaption( "32bit video", "32bit video" ); + // SDL_COMPAT_WM_SetCaption( "32bit video", "32bit video" ); } // Convert the GUI palette to the screen format bti depth pal_it = sgpal; - for( i=0; iformat, pal_it[0], pal_it[1], pal_it[2] ); + for(i=0; iformat, pal_it[0], pal_it[1], pal_it[2]); // Convert the Oric palette to the screen format bti depth pal_it = oricpalette; - for( i=0; i<8; i++, pal_it+=3 ) + for(i=0; i<8; i++, pal_it+=3) { - pal[i ] = SDL_MapRGB( screen->format, pal_it[0], pal_it[1], pal_it[2] ); - pal[i+8] = SDL_MapRGB( screen->format, pal_it[0]/2, pal_it[1]/2, pal_it[2]/2 ); + pal[i ] = SDL_MapRGB(screen->format, pal_it[0], pal_it[1], pal_it[2]); + pal[i+8] = SDL_MapRGB(screen->format, pal_it[0]/2, pal_it[1]/2, pal_it[2]/2); } // Get the images for the GUI - for( i=0; ipitch; offset_top += pixel_size * 80; - ula_set_dirty( oric ); + ula_set_dirty(oric); // Job done return SDL_TRUE; } -void shut_render_sw( struct machine *oric ) +void shut_render_sw(struct machine *oric) { Sint32 i; - for( i=0; i 127 ) return; - + + if(ch > 127) return; + src_byte = &thefont[ch*12]; dst_scanline = ptr; - - for( y=12; y!=0; --y, ++src_byte, dst_scanline+=screen->pitch ) + + for(y=12; y!=0; --y, ++src_byte, dst_scanline+=screen->pitch) { dst_pixel = dst_scanline; - - for( mask=0x80, x=8; x!=0; --x, ++dst_pixel, mask>>=1 ) + + for(mask=0x80, x=8; x!=0; --x, ++dst_pixel, mask>>=1) { - if( (*src_byte)&mask ) + if((*src_byte)&mask) *dst_pixel = fcol; - else if( solidfont ) + else if(solidfont) *dst_pixel = bcol; } } } -void render_begin_sw8( struct machine *oric ) +void render_begin_sw8(struct machine *oric) { int y; Uint8 *dst_scanline; - - if( SDL_MUSTLOCK( screen ) ) - SDL_LockSurface( screen ); - - if( oric->newpopupstr ) + + if(SDL_MUSTLOCK(screen)) + SDL_LockSurface(screen); + + if(oric->newpopupstr) { dst_scanline = (Uint8*)screen->pixels; dst_scanline += 320; - - for( y=12; y!=0; --y, dst_scanline += screen->pitch) + + for(y=12; y!=0; --y, dst_scanline += screen->pitch) memset(dst_scanline, GPAL_FIRSTPEN, 320); oric->newpopupstr = SDL_FALSE; } - - if( oric->newstatusstr ) + + if(oric->newstatusstr) { refreshstatus = SDL_TRUE; oric->newstatusstr = SDL_FALSE; } } -void render_end_sw8( struct machine *oric ) +void render_end_sw8(struct machine *oric) { int i; Uint32 char_pitch; Uint8 *dst_pixel; - + char_pitch = 8; - - if( oric->emu_mode == EM_RUNNING ) + + if(oric->emu_mode == EM_RUNNING) { - if( oric->popupstr[0] ) + if(oric->popupstr[0]) { dst_pixel = (Uint8*)screen->pixels; dst_pixel += 320; - - for( i=0; oric->popupstr[i]; i++, dst_pixel += char_pitch ) - printchar( dst_pixel, oric->popupstr[i], GPAL_FIRSTPEN+1, GPAL_FIRSTPEN, SDL_TRUE ); + + for(i=0; oric->popupstr[i]; i++, dst_pixel += char_pitch) + printchar(dst_pixel, oric->popupstr[i], GPAL_FIRSTPEN+1, GPAL_FIRSTPEN, SDL_TRUE); } - - if( oric->statusstr[0] ) + + if(oric->statusstr[0]) { dst_pixel = (Uint8*)screen->pixels; dst_pixel += 466 * screen->pitch; - - for( i=0; oric->statusstr[i]; i++, dst_pixel += char_pitch ) - printchar( dst_pixel, oric->statusstr[i], GPAL_FIRSTPEN+1, 0, SDL_FALSE ); + + for(i=0; oric->statusstr[i]; i++, dst_pixel += char_pitch) + printchar(dst_pixel, oric->statusstr[i], GPAL_FIRSTPEN+1, 0, SDL_FALSE); } } - - if( SDL_MUSTLOCK( screen ) ) - SDL_UnlockSurface( screen ); - - SDL_COMPAT_Flip( screen ); + + if(SDL_MUSTLOCK(screen)) + SDL_UnlockSurface(screen); + + SDL_COMPAT_Flip(screen); } -void render_textzone_alloc_sw8( struct machine *oric, int i ) +void render_textzone_alloc_sw8(struct machine *oric, int i) { } -void render_textzone_free_sw8( struct machine *oric, int i ) +void render_textzone_free_sw8(struct machine *oric, int i) { } -void render_textzone_sw8( struct machine *oric, int i ) +void render_textzone_sw8(struct machine *oric, int i) { int x, y, o; struct textzone *ptz = tz[i]; Uint8 *dst_scanline, *dst_pixel; - + dst_scanline = (Uint8 *)screen->pixels; dst_scanline += screen->pitch * ptz->y + ptz->x; - + o = 0; - for( y=ptz->h; y!=0; --y, dst_scanline+=12*screen->pitch ) + for(y=ptz->h; y!=0; --y, dst_scanline+=12*screen->pitch) { dst_pixel = dst_scanline; - - for( x=ptz->w; x!=0; --x, ++o, dst_pixel+=8 ) - printchar( dst_pixel, ptz->tx[o], GPAL_FIRSTPEN+ptz->fc[o], GPAL_FIRSTPEN+ptz->bc[o], SDL_TRUE ); + + for(x=ptz->w; x!=0; --x, ++o, dst_pixel+=8) + printchar(dst_pixel, ptz->tx[o], GPAL_FIRSTPEN+ptz->fc[o], GPAL_FIRSTPEN+ptz->bc[o], SDL_TRUE); } } // Clear an area to background -void render_clear_area_sw8( int x, int y, int w, int h ) +void render_clear_area_sw8(int x, int y, int w, int h) { Uint8 *dst_scanline; Sint32 i; - + dst_scanline = (Uint8 *)screen->pixels; dst_scanline += screen->pitch * y + x; - - for( i=0; ipitch ) - memset( dst_scanline, 0, w ); + + for(i=0; ipitch) + memset(dst_scanline, 0, w); } // Draw a GUI image at X,Y -void render_gimg_sw8( int img_id, Sint32 xp, Sint32 yp ) +void render_gimg_sw8(int img_id, Sint32 xp, Sint32 yp) { struct guiimg *gi = &gimgs[img_id]; Uint8 *src_scanline, *dst_scanline; Sint32 i; - + src_scanline = mgimg[img_id]; - + dst_scanline = (Uint8 *)screen->pixels; dst_scanline += screen->pitch * yp + xp; - - for( i=gi->h; i!=0; --i, src_scanline+=gi->w, dst_scanline+=screen->pitch ) - memcpy( dst_scanline, src_scanline, gi->w ); + + for(i=gi->h; i!=0; --i, src_scanline+=gi->w, dst_scanline+=screen->pitch) + memcpy(dst_scanline, src_scanline, gi->w); } // Draw part of an image (xp,yp = screen location, ox, oy = offset into image, w, h = dimensions) -void render_gimgpart_sw8( int img_id, Sint32 xp, Sint32 yp, Sint32 ox, Sint32 oy, Sint32 w, Sint32 h ) +void render_gimgpart_sw8(int img_id, Sint32 xp, Sint32 yp, Sint32 ox, Sint32 oy, Sint32 w, Sint32 h) { struct guiimg *gi = &gimgs[img_id]; Uint8 *src_scanline, *dst_scanline; Sint32 i; - + src_scanline = mgimg[img_id]; src_scanline += gi->w * oy + ox; - + dst_scanline = (Uint8 *)screen->pixels; dst_scanline += screen->pitch * yp + xp; - - for( i=h; i!=0; --i, src_scanline+=gi->w, dst_scanline+=screen->pitch ) - memcpy( dst_scanline, src_scanline, w ); + + for(i=h; i!=0; --i, src_scanline+=gi->w, dst_scanline+=screen->pitch) + memcpy(dst_scanline, src_scanline, w); } // Copy the video output buffer to the SDL surface, assuming 16bpp video mode -void render_video_sw8( struct machine *oric, SDL_bool doublesize ) +void render_video_sw8(struct machine *oric, SDL_bool doublesize) { int x, y; Uint16 *src_pixel; @@ -234,60 +234,62 @@ void render_video_sw8( struct machine *oric, SDL_bool doublesize ) Uint32 c; Uint8 *dst_scanline, *dst_even_scanline, *dst_odd_scanline; Uint32 *dst_even_pixel, *dst_odd_pixel; - - if( !oric->scr ) + + if(!oric->scr) return; - - if( doublesize ) + + if(doublesize) { - if( needclr ) + if(needclr) { SDL_FillRect(screen, NULL, GPAL_FIRSTPEN); needclr = SDL_FALSE; } - + src_pixel = (Uint16 *)oric->scr; - + dst_pitch_x2 = 2 * screen->pitch; - + dst_even_scanline = ((Uint8*)screen->pixels) + offset_top; - + dst_odd_scanline = dst_even_scanline; dst_odd_scanline += screen->pitch; - - if( oric->scanlines ) + + if(oric->scanlines) { - for( y=0; y<224; y++, dst_even_scanline+=dst_pitch_x2, dst_odd_scanline+=dst_pitch_x2 ) + for(y=0; y<224; y++, dst_even_scanline+=dst_pitch_x2, dst_odd_scanline+=dst_pitch_x2) { - if (!oric->vid_dirty[y]) + if(!oric->vid_dirty[y]) { src_pixel += 120; continue; } dst_even_pixel = (Uint32*)dst_even_scanline; dst_odd_pixel = (Uint32*)dst_odd_scanline; - - for( x=0; x<120; x++ ) + + for(x=0; x<120; x++) { c = *(src_pixel++); *(dst_even_pixel++) = qpen[c]; *(dst_odd_pixel++) = qpen[c+8*257]; } oric->vid_dirty[y] = SDL_FALSE; - + } - } else { - for( y=0; y<224; y++, dst_even_scanline+=dst_pitch_x2, dst_odd_scanline+=dst_pitch_x2 ) + } + else + { + for(y=0; y<224; y++, dst_even_scanline+=dst_pitch_x2, dst_odd_scanline+=dst_pitch_x2) { - if (!oric->vid_dirty[y]) + if(!oric->vid_dirty[y]) { src_pixel += 120; continue; } dst_even_pixel = (Uint32*)dst_even_scanline; dst_odd_pixel = (Uint32*)dst_odd_scanline; - - for( x=0; x<120; x++ ) + + for(x=0; x<120; x++) { c = qpen[*(src_pixel++)]; *(dst_even_pixel++) = c; @@ -298,47 +300,47 @@ void render_video_sw8( struct machine *oric, SDL_bool doublesize ) } return; } - + needclr = SDL_TRUE; - + src_pixel = (Uint16 *)oric->scr; dst_scanline = (Uint8*)screen->pixels; - - for( y=0; y<4; y++ ) + + for(y=0; y<4; y++) { - memset( dst_scanline, 0, 240 ); + memset(dst_scanline, 0, 240); dst_scanline += screen->pitch; } - for( ; y<228; y++, dst_scanline+=screen->pitch ) + for(; y<228; y++, dst_scanline+=screen->pitch) { memcpy(dst_scanline, src_pixel, 240); src_pixel += 240; } } -void preinit_render_sw8( struct machine *oric ) +void preinit_render_sw8(struct machine *oric) { // Screen surface is not set yet screen = NULL; } -SDL_bool render_togglefullscreen_sw8( struct machine *oric ) +SDL_bool render_togglefullscreen_sw8(struct machine *oric) { #if defined(__amigaos4__) || defined(__linux__) // Use SDL_WM_ToggleFullScreen on systems where it is supported - if( SDL_COMPAT_WM_ToggleFullScreen( screen ) ) + if(SDL_COMPAT_WM_ToggleFullScreen(screen)) { fullscreen = !fullscreen; return SDL_TRUE; } - + return SDL_FALSE; #else - oric->shut_render( oric ); + oric->shut_render(oric); fullscreen = !fullscreen; - if( oric->init_render( oric ) ) return SDL_TRUE; - set_render_mode( oric, RENDERMODE_NULL ); - oric->emu_mode = EM_PLEASEQUIT; + if(oric->init_render(oric)) return SDL_TRUE; + set_render_mode(oric, RENDERMODE_NULL); + oric->emu_mode = EM_PLEASEQUIT; return SDL_FALSE; #endif } @@ -352,34 +354,34 @@ static int find_best_pen(Uint8 r, int g, int b) { int i; int closest_pen=-1, closest_distance=8000; - + /* First, look for an exact match */ - for( i=0; i= 256) + if(next_gimgcol >= 256) return closest_pen; - + colours[next_gimgcol].r = r; colours[next_gimgcol].g = g; colours[next_gimgcol].b = b; - + return next_gimgcol++; } @@ -388,46 +390,49 @@ static SDL_bool guiimg_to_img(Uint8** dst, const struct guiimg* src) size_t i; const Uint8 *src_pixel; Uint8 *dst_pixel; - - (*dst) = (Uint8 *)malloc( src->w*src->h ); - if ((*dst) == NULL) + + (*dst) = (Uint8 *)malloc(src->w*src->h); + if((*dst) == NULL) return SDL_FALSE; - + src_pixel = src->buf; dst_pixel = *dst; - - for( i=src->w*src->h; i!=0; --i, src_pixel += 3, ++dst_pixel ) + + for(i=src->w*src->h; i!=0; --i, src_pixel += 3, ++dst_pixel) (*dst_pixel) = find_best_pen(src_pixel[0], src_pixel[1], src_pixel[2]); - + return SDL_TRUE; } -SDL_bool init_render_sw8( struct machine *oric ) +SDL_bool init_render_sw8(struct machine *oric) { int i, j; Sint32 surfacemode; - + surfacemode = SDL_COMPAT_HWPALETTE; - if( fullscreen ) surfacemode |= SDL_COMPAT_FULLSCREEN; - if( hwsurface ) surfacemode |= SDL_COMPAT_HWSURFACE; - + if(fullscreen) surfacemode |= SDL_COMPAT_FULLSCREEN; + if(hwsurface) surfacemode |= SDL_COMPAT_HWSURFACE; + // Try to setup the video display - screen = SDL_COMPAT_SetVideoMode( 640, 480, 8, surfacemode ); - if (oric->show_keyboard) { - screen = SDL_COMPAT_SetVideoMode( 640, 480+240, 8, surfacemode ); - } else { - screen = SDL_COMPAT_SetVideoMode( 640, 480, 8, surfacemode ); + screen = SDL_COMPAT_SetVideoMode(640, 480, 8, surfacemode); + if(oric->show_keyboard) + { + screen = SDL_COMPAT_SetVideoMode(640, 480+240, 8, surfacemode); } - - if( !screen ) + else { - printf( "SDL video failed\n" ); + screen = SDL_COMPAT_SetVideoMode(640, 480, 8, surfacemode); + } + + if(!screen) + { + printf("SDL video failed\n"); return SDL_FALSE; } - - SDL_COMPAT_WM_SetCaption( APP_NAME_FULL, APP_NAME_FULL ); - - for( i=0; i<8; i++ ) + + SDL_COMPAT_WM_SetCaption(APP_NAME_FULL, APP_NAME_FULL); + + for(i=0; i<8; i++) { colours[i].r = oricpalette[i*3 ]; colours[i+8].r = oricpalette[i*3 ]/2; @@ -436,42 +441,42 @@ SDL_bool init_render_sw8( struct machine *oric ) colours[i].b = oricpalette[i*3+2]; colours[i+8].b = oricpalette[i*3+2]/2; } - - for( i=0; ipitch + 80; - - ula_set_dirty( oric ); - + + ula_set_dirty(oric); + // Job done return SDL_TRUE; } -void shut_render_sw8( struct machine *oric ) +void shut_render_sw8(struct machine *oric) { // The surface will be freed by SDL_Quit, or a call to SDL_COMPAT_SetVideoMode from a different render module } diff --git a/render_sw8.h b/render_sw8.h index f114779b..6b54daf4 100644 --- a/render_sw8.h +++ b/render_sw8.h @@ -19,17 +19,17 @@ ** Software rendering */ -void render_begin_sw8( struct machine *oric ); -void render_end_sw8( struct machine *oric ); -void render_textzone_alloc_sw8( struct machine *oric, int i ); -void render_textzone_free_sw8( struct machine *oric, int i ); -void render_textzone_sw8( struct machine *oric, int i ); -void render_gimg_sw8( int i, Sint32 xp, Sint32 yp ); -void render_gimgpart_sw8( int i, Sint32 xp, Sint32 yp, Sint32 ox, Sint32 oy, Sint32 w, Sint32 h ); -void render_video_sw8( struct machine *oric, SDL_bool doublesize ); -void render_clear_area_sw8( int x, int y, int w, int h ); -SDL_bool render_togglefullscreen_sw8( struct machine *oric ); -void preinit_render_sw8( struct machine *oric ); -SDL_bool init_render_sw8( struct machine *oric ); -void shut_render_sw8( struct machine *oric ); +void render_begin_sw8(struct machine *oric); +void render_end_sw8(struct machine *oric); +void render_textzone_alloc_sw8(struct machine *oric, int i); +void render_textzone_free_sw8(struct machine *oric, int i); +void render_textzone_sw8(struct machine *oric, int i); +void render_gimg_sw8(int i, Sint32 xp, Sint32 yp); +void render_gimgpart_sw8(int i, Sint32 xp, Sint32 yp, Sint32 ox, Sint32 oy, Sint32 w, Sint32 h); +void render_video_sw8(struct machine *oric, SDL_bool doublesize); +void render_clear_area_sw8(int x, int y, int w, int h); +SDL_bool render_togglefullscreen_sw8(struct machine *oric); +void preinit_render_sw8(struct machine *oric); +SDL_bool init_render_sw8(struct machine *oric); +void shut_render_sw8(struct machine *oric); diff --git a/snapshot.c b/snapshot.c index 152f1cea..76425911 100644 --- a/snapshot.c +++ b/snapshot.c @@ -48,14 +48,14 @@ extern char diskpath[]; #define MAX_BLOCK (262144) -static unsigned char *buf; +static unsigned char* buf; static int offs = 0; #define PUTU32(val) ok=putu32(ok, (Uint32)val) static SDL_bool putu32(SDL_bool stillok, Uint32 val) { - if (!stillok) return SDL_FALSE; - if ((offs+4) > MAX_BLOCK) return SDL_FALSE; + if(!stillok) return SDL_FALSE; + if((offs+4) > MAX_BLOCK) return SDL_FALSE; buf[offs++] = (val>>24)&0xff; buf[offs++] = (val>>16)&0xff; buf[offs++] = (val>>8)&0xff; @@ -66,8 +66,8 @@ static SDL_bool putu32(SDL_bool stillok, Uint32 val) #define PUTU16(val) ok=putu16(ok, (Uint16)val) static SDL_bool putu16(SDL_bool stillok, Uint16 val) { - if (!stillok) return SDL_FALSE; - if ((offs+2) > MAX_BLOCK) return SDL_FALSE; + if(!stillok) return SDL_FALSE; + if((offs+2) > MAX_BLOCK) return SDL_FALSE; buf[offs++] = (val>>8)&0xff; buf[offs++] = val&0xff; return SDL_TRUE; @@ -76,35 +76,35 @@ static SDL_bool putu16(SDL_bool stillok, Uint16 val) #define PUTU8(val) ok=putu8(ok, (Uint8)val) static SDL_bool putu8(SDL_bool stillok, Uint8 val) { - if (!stillok) return SDL_FALSE; - if (offs >= MAX_BLOCK) return SDL_FALSE; + if(!stillok) return SDL_FALSE; + if(offs >= MAX_BLOCK) return SDL_FALSE; buf[offs++] = val&0xff; return SDL_TRUE; } #define PUTDATA(data, size) ok=putdata(ok, data, size) -static SDL_bool putdata(SDL_bool stillok, unsigned char *data, Uint32 size) +static SDL_bool putdata(SDL_bool stillok, unsigned char* data, Uint32 size) { - if (!stillok) return SDL_FALSE; - if ((offs+size) > MAX_BLOCK) return SDL_FALSE; - memcpy( &buf[offs], data, size ); + if(!stillok) return SDL_FALSE; + if((offs+size) > MAX_BLOCK) return SDL_FALSE; + memcpy(&buf[offs], data, size); offs += size; return SDL_TRUE; } #define PUTSTR(str) ok=putstr(ok, str) -static SDL_bool putstr(SDL_bool stillok, char *str) +static SDL_bool putstr(SDL_bool stillok, char* str) { - if (!stillok) return SDL_FALSE; + if(!stillok) return SDL_FALSE; stillok = putu32(stillok, (int)strlen(str)+1); - return putdata(stillok, (unsigned char *)str, (int)strlen(str)+1); + return putdata(stillok, (unsigned char*)str, (int)strlen(str)+1); } #define WRITEBLOCK() ok=writeblock(ok, f) static SDL_bool writeblock(SDL_bool stillok, FILE *f) { - if (!stillok) return SDL_FALSE; - if (offs <= 8) return SDL_TRUE; // No block to write + if(!stillok) return SDL_FALSE; + if(offs <= 8) return SDL_TRUE; // No block to write buf[4] = ((offs-8)>>24)&0xff; buf[5] = ((offs-8)>>16)&0xff; @@ -118,11 +118,11 @@ static SDL_bool writeblock(SDL_bool stillok, FILE *f) // ID must be 4 bytes long! #define NEWBLOCK(id) ok=newblock(ok, id, f) -static SDL_bool newblock(SDL_bool stillok, char *id, FILE *f) +static SDL_bool newblock(SDL_bool stillok, char* id, FILE *f) { - if (!stillok) return SDL_FALSE; + if(!stillok) return SDL_FALSE; // Got an old block? - if (!writeblock(stillok, f)) return SDL_FALSE; + if(!writeblock(stillok, f)) return SDL_FALSE; // Start a new one! memcpy(buf, id, 4); @@ -131,14 +131,14 @@ static SDL_bool newblock(SDL_bool stillok, char *id, FILE *f) } #define DATABLOCK(data, len) ok = datablock(ok, data, len, f) -static SDL_bool datablock(SDL_bool stillok, unsigned char *data, Uint32 len, FILE *f) +static SDL_bool datablock(SDL_bool stillok, unsigned char* data, Uint32 len, FILE *f) { Uint32 lenbe = _BE32(len); - if (!stillok) return SDL_FALSE; + if(!stillok) return SDL_FALSE; // Anything to write? - if (len == 0) return SDL_TRUE; + if(len == 0) return SDL_TRUE; // Got an old block? - if (!writeblock(stillok, f)) return SDL_FALSE; + if(!writeblock(stillok, f)) return SDL_FALSE; stillok = (fwrite("DATA", 4, 1, f) == 1); stillok &= (fwrite(&lenbe, 4, 1, f) == 1); @@ -148,7 +148,7 @@ static SDL_bool datablock(SDL_bool stillok, unsigned char *data, Uint32 len, FIL return stillok; } -SDL_bool save_snapshot(struct machine *oric, char *filename) +SDL_bool save_snapshot(struct machine *oric, char* filename) { SDL_bool ok = SDL_TRUE; struct m6502 *cpu = &oric->cpu; @@ -157,14 +157,14 @@ SDL_bool save_snapshot(struct machine *oric, char *filename) FILE *f = NULL; buf = malloc(MAX_BLOCK); - if (!buf) + if(!buf) { msgbox(oric, MSGBOX_OK, "Snapshot failed: out of memory (1)\n"); return SDL_FALSE; } f = fopen(filename, "wb"); - if (!f) + if(!f) { msgbox(oric, MSGBOX_OK, "Unable to create snapshot file (2)"); free(buf); @@ -252,24 +252,24 @@ SDL_bool save_snapshot(struct machine *oric, char *filename) PUTU8(oric->ay.bmode); PUTU8(oric->ay.creg); PUTDATA(&oric->ay.eregs[0], NUM_AY_REGS); - for (i=0; i<8; i++) + for(i=0; i<8; i++) PUTU8(oric->ay.keystates[i]); - for (i=0; i<3; i++) + for(i=0; i<3; i++) PUTU32(oric->ay.toneper[i]); PUTU32(oric->ay.noiseper); PUTU32(oric->ay.envper); - for (i=0; i<3; i++) + for(i=0; i<3; i++) { PUTU16(oric->ay.tonebit[i]); PUTU16(oric->ay.noisebit[i]); PUTU16(oric->ay.vol[i]); } PUTU16(oric->ay.newout); - for (i=0; i<3; i++) + for(i=0; i<3; i++) PUTU32(oric->ay.ct[i]); PUTU32(oric->ay.ctn); PUTU32(oric->ay.cte); - for (i=0; i<3; i++) + for(i=0; i<3; i++) { PUTU32(oric->ay.tonepos[i]); PUTU32(oric->ay.tonestep[i]); @@ -319,7 +319,7 @@ SDL_bool save_snapshot(struct machine *oric, char *filename) PUTU32(oric->via.irqbit); - switch (oric->drivetype) + switch(oric->drivetype) { case DRV_JASMIN: NEWBLOCK("JSM\x00"); @@ -338,55 +338,55 @@ SDL_bool save_snapshot(struct machine *oric, char *filename) break; case DRV_PRAVETZ: - { - Uint8 tmp[PRAV_TRACKS_PER_DISK*PRAV_RAW_TRACK_SIZE*2]; - NEWBLOCK("PRV\x00"); - PUTU8(oric->pravetz.olay); // 1 - PUTU8(oric->pravetz.romdis); // 2 - PUTU16(oric->pravetz.extension); // 4 - PUTU8(oric->wddisk.c_drive); // 5 - PUTU32(oric->wddisk.currentop); // 9 - - for (i=0; i<2; i++) { - PUTU8(oric->pravetz.drv[i].volume); // +1 - PUTU8(oric->pravetz.drv[i].select); // +2 - PUTU8(oric->pravetz.drv[i].motor_on); // +3 - PUTU8(oric->pravetz.drv[i].write_ready); // +4 - PUTU16(oric->pravetz.drv[i].byte); // +6 - PUTU16(oric->pravetz.drv[i].half_track); // +8 - PUTU8(oric->pravetz.drv[i].dirty); // +9 - PUTU8(oric->pravetz.drv[i].prot); // +10 - } - - /* Snapshot format is limited to one datablock per block, */ - /* concatenate these into a temporary one... */ - memcpy(tmp, &oric->pravetz.drv[0].image[0][0], PRAV_TRACKS_PER_DISK*PRAV_RAW_TRACK_SIZE); - memcpy(&tmp[PRAV_TRACKS_PER_DISK*PRAV_RAW_TRACK_SIZE], &oric->pravetz.drv[1].image[0][0], PRAV_TRACKS_PER_DISK*PRAV_RAW_TRACK_SIZE); - DATABLOCK(tmp, PRAV_TRACKS_PER_DISK*PRAV_RAW_TRACK_SIZE*2); + Uint8 tmp[PRAV_TRACKS_PER_DISK*PRAV_RAW_TRACK_SIZE*2]; + NEWBLOCK("PRV\x00"); + PUTU8(oric->pravetz.olay); // 1 + PUTU8(oric->pravetz.romdis); // 2 + PUTU16(oric->pravetz.extension); // 4 + PUTU8(oric->wddisk.c_drive); // 5 + PUTU32(oric->wddisk.currentop); // 9 + + for(i=0; i<2; i++) + { + PUTU8(oric->pravetz.drv[i].volume); // +1 + PUTU8(oric->pravetz.drv[i].select); // +2 + PUTU8(oric->pravetz.drv[i].motor_on); // +3 + PUTU8(oric->pravetz.drv[i].write_ready); // +4 + PUTU16(oric->pravetz.drv[i].byte); // +6 + PUTU16(oric->pravetz.drv[i].half_track); // +8 + PUTU8(oric->pravetz.drv[i].dirty); // +9 + PUTU8(oric->pravetz.drv[i].prot); // +10 + } - for (i=0; i<2; i++) - { - if ((oric->pravetz.drv[i].pimg == NULL) || - (oric->pravetz.drv[i].pimg->rawimage == NULL)) - break; + /* Snapshot format is limited to one datablock per block, */ + /* concatenate these into a temporary one... */ + memcpy(tmp, &oric->pravetz.drv[0].image[0][0], PRAV_TRACKS_PER_DISK*PRAV_RAW_TRACK_SIZE); + memcpy(&tmp[PRAV_TRACKS_PER_DISK*PRAV_RAW_TRACK_SIZE], &oric->pravetz.drv[1].image[0][0], PRAV_TRACKS_PER_DISK*PRAV_RAW_TRACK_SIZE); + DATABLOCK(tmp, PRAV_TRACKS_PER_DISK*PRAV_RAW_TRACK_SIZE*2); - NEWBLOCK("PVD\x00"); - PUTU16(i); - PUTU32(oric->wddisk.disk[i]->rawimagelen); - /* Convert sector_ptr to an offset */ - if ((oric->pravetz.drv[i].sector_ptr == NULL) || - (oric->pravetz.drv[i].pimg == NULL) || - (oric->pravetz.drv[i].pimg->rawimage == NULL)) - PUTU32(0xffffffff); - else - PUTU32((Uint32)(oric->pravetz.drv[i].sector_ptr - oric->pravetz.drv[i].pimg->rawimage)); - DATABLOCK(oric->wddisk.disk[i]->rawimage, oric->wddisk.disk[i]->rawimagelen); + for(i=0; i<2; i++) + { + if((oric->pravetz.drv[i].pimg == NULL) || + (oric->pravetz.drv[i].pimg->rawimage == NULL)) + break; + + NEWBLOCK("PVD\x00"); + PUTU16(i); + PUTU32(oric->wddisk.disk[i]->rawimagelen); + /* Convert sector_ptr to an offset */ + if((oric->pravetz.drv[i].sector_ptr == NULL) || + (oric->pravetz.drv[i].pimg == NULL) || + (oric->pravetz.drv[i].pimg->rawimage == NULL)) + PUTU32(0xffffffff); + else + PUTU32((Uint32)(oric->pravetz.drv[i].sector_ptr - oric->pravetz.drv[i].pimg->rawimage)); + DATABLOCK(oric->wddisk.disk[i]->rawimage, oric->wddisk.disk[i]->rawimagelen); + } } - } } - if( do_wd17xx ) + if(do_wd17xx) { NEWBLOCK("WDD\x00"); PUTU8(oric->wddisk.r_status); @@ -407,9 +407,9 @@ SDL_bool save_snapshot(struct machine *oric, char *filename) PUTU32(oric->wddisk.ddstatus); PUTU32(oric->wddisk.crc); - for (i=0; i<4; i++) + for(i=0; i<4; i++) { - if( oric->wddisk.disk[i] ) + if(oric->wddisk.disk[i]) { NEWBLOCK("DSK\x00"); PUTU16(oric->wddisk.disk[i]->drivenum); @@ -424,11 +424,11 @@ SDL_bool save_snapshot(struct machine *oric, char *filename) } } - if (oric->type == MACH_TELESTRAT) + if(oric->type == MACH_TELESTRAT) { // Bank info NEWBLOCK("BNK\x00"); - for (i=0; i<8; i++) + for(i=0; i<8; i++) PUTU8(oric->tele_bank[i].type); PUTU8(oric->tele_currbank); @@ -474,10 +474,10 @@ SDL_bool save_snapshot(struct machine *oric, char *filename) } // Symbols - if (oric->romsyms.numsyms) + if(oric->romsyms.numsyms) { NEWBLOCK("SYR\x00"); - for (i=0; iromsyms.numsyms; i++) + for(i=0; iromsyms.numsyms; i++) { PUTSTR(oric->romsyms.syms[i].name); PUTU16(oric->romsyms.syms[i].addr); @@ -485,10 +485,10 @@ SDL_bool save_snapshot(struct machine *oric, char *filename) } } - if (oric->usersyms.numsyms) + if(oric->usersyms.numsyms) { NEWBLOCK("SYU\x00"); - for (i=0; iusersyms.numsyms; i++) + for(i=0; iusersyms.numsyms; i++) { PUTSTR(oric->usersyms.syms[i].name); PUTU16(oric->usersyms.syms[i].addr); @@ -496,16 +496,16 @@ SDL_bool save_snapshot(struct machine *oric, char *filename) } } - if (oric->type == MACH_TELESTRAT) + if(oric->type == MACH_TELESTRAT) { - for (j=0; j<8; j++) + for(j=0; j<8; j++) { - if (oric->tele_banksyms[j].numsyms) + if(oric->tele_banksyms[j].numsyms) { char name[8]; sprintf(name, "SY%d%c", j, 0); NEWBLOCK(name); - for (i=0; itele_banksyms[j].numsyms; i++) + for(i=0; itele_banksyms[j].numsyms; i++) { PUTSTR(oric->tele_banksyms[j].syms[i].name); PUTU16(oric->romsyms.syms[i].addr); @@ -516,12 +516,12 @@ SDL_bool save_snapshot(struct machine *oric, char *filename) } // Breakpoints - if ((cpu->anybp) || (cpu->anymbp)) + if((cpu->anybp) || (cpu->anymbp)) { NEWBLOCK("BKP\x00"); - for (i=0; i<16; i++) + for(i=0; i<16; i++) PUTU32(cpu->breakpoints[i]); - for (i=0; i<16; i++) + for(i=0; i<16; i++) { PUTU8(cpu->membreakpoints[i].flags); PUTU8(cpu->membreakpoints[i].lastval); @@ -533,16 +533,17 @@ SDL_bool save_snapshot(struct machine *oric, char *filename) fclose(f); free(buf); - if (!ok) + if(!ok) msgbox(oric, MSGBOX_OK, "Snapshot failed! (3)"); #ifdef WWW // sync from memory state to persisted - EM_ASM( - FS.syncfs(function (err) { - assert(!err); - }); - ); + EM_ASM( + FS.syncfs(function(err) + { + assert(!err); + }); + ); #endif return ok; @@ -555,7 +556,7 @@ struct blockheader unsigned char id[4]; unsigned int offset; unsigned int size; - unsigned char *buf; + unsigned char* buf; struct blockheader *datablock; int offs; }; @@ -577,9 +578,9 @@ static SDL_bool getheaders(struct machine *oric, FILE *f) /* and make sure the file structure is sane. */ offset = 0; numhdrs = 0; - while (offset < filesize) + while(offset < filesize) { - if (fread(hdr, 8, 1, f) != 1) + if(fread(hdr, 8, 1, f) != 1) { msgbox(oric, MSGBOX_OK, "Snapshot load failed: Read error (4)"); numhdrs = 0; @@ -587,7 +588,7 @@ static SDL_bool getheaders(struct machine *oric, FILE *f) } size = (hdr[4]<<24)|(hdr[5]<<16)|(hdr[6]<<8)|hdr[7]; - if ((size == 0) || ((offset+size) > filesize)) + if((size == 0) || ((offset+size) > filesize)) { msgbox(oric, MSGBOX_OK, "Snapshot load failed: Invalid file structure (5)"); numhdrs = 0; @@ -601,7 +602,7 @@ static SDL_bool getheaders(struct machine *oric, FILE *f) /* Allocate memory to store all the block headers */ bkh = (struct blockheader *)malloc(numhdrs*sizeof(struct blockheader)); - if (!bkh) + if(!bkh) { msgbox(oric, MSGBOX_OK, "Snapshot load failed: Out of memory (6)"); numhdrs = 0; @@ -613,9 +614,9 @@ static SDL_bool getheaders(struct machine *oric, FILE *f) fseek(f, 0, SEEK_SET); offset = 0; i = 0; - while (offset < filesize) + while(offset < filesize) { - if (fread(hdr, 8, 1, f) != 1) + if(fread(hdr, 8, 1, f) != 1) { msgbox(oric, MSGBOX_OK, "Snapshot load failed: Read error (7)"); free(bkh); @@ -625,7 +626,7 @@ static SDL_bool getheaders(struct machine *oric, FILE *f) } size = (hdr[4]<<24)|(hdr[5]<<16)|(hdr[6]<<8)|hdr[7]; - if ((size == 0) || ((offset+size) > filesize)) + if((size == 0) || ((offset+size) > filesize)) { msgbox(oric, MSGBOX_OK, "Snapshot load failed: Invalid file structure (8)"); free(bkh); @@ -640,7 +641,7 @@ static SDL_bool getheaders(struct machine *oric, FILE *f) bkh[i].size = size; //printf("Block: %c%c%c%c (@ %d, size %d)\n", bkh[i].id[0], bkh[i].id[1], (bkh[i].id[2]>31)?bkh[i].id[2]:'.', (bkh[i].id[3]>31)?bkh[i].id[3]:'.', bkh[i].offset, bkh[i].size); - if ((i>0) && (memcmp(bkh[i].id, "DATA", 4)==0)) + if((i>0) && (memcmp(bkh[i].id, "DATA", 4)==0)) { bkh[i-1].datablock = &bkh[i]; } @@ -655,7 +656,7 @@ static SDL_bool getheaders(struct machine *oric, FILE *f) static void free_block(struct blockheader *blk) { - if ((!blk)||(!blk->buf)) return; + if((!blk)||(!blk->buf)) return; free(blk->buf); blk->buf = NULL; } @@ -664,63 +665,63 @@ static void free_blockheaders(void) { int i; - if (!bkh) return; + if(!bkh) return; - for (i=0; i31)?id[2]:'.', (id[3]>31)?id[3]:'.'); - if (required) msgbox(oric, MSGBOX_OK, "Snapshot load failed: Invalid file (9)"); + if(required) msgbox(oric, MSGBOX_OK, "Snapshot load failed: Invalid file (9)"); return NULL; } - if ((datarequired) && (bkh[i].datablock == NULL)) + if((datarequired) && (bkh[i].datablock == NULL)) { - if (required) msgbox(oric, MSGBOX_OK, "Snapshot load failed: Invalid file (10)"); + if(required) msgbox(oric, MSGBOX_OK, "Snapshot load failed: Invalid file (10)"); return NULL; } - if ((expectedsize != -1) && (bkh[i].size != expectedsize)) + if((expectedsize != -1) && (bkh[i].size != expectedsize)) { //printf("Size for %c%c%c%c is %d, expected %d\n", id[0], id[1], (id[2]>31)?id[2]:'.', (id[3]>31)?id[3]:'.', bkh[i].size, expectedsize); - if (required) msgbox(oric, MSGBOX_OK, "Snapshot load failed: Invalid file (11)"); + if(required) msgbox(oric, MSGBOX_OK, "Snapshot load failed: Invalid file (11)"); return NULL; } /* Already loaded it?! */ - if (bkh[i].buf) + if(bkh[i].buf) { bkh[i].offs = 0; return &bkh[i]; } bkh[i].buf = malloc(bkh[i].size); - if (!bkh[i].buf) + if(!bkh[i].buf) { - if (required) msgbox(oric, MSGBOX_OK, "Snapshot load failed: Out of memory (12)"); + if(required) msgbox(oric, MSGBOX_OK, "Snapshot load failed: Out of memory (12)"); return NULL; } fseek(f, bkh[i].offset, SEEK_SET); - if (fread(bkh[i].buf, bkh[i].size, 1, f) != 1) + if(fread(bkh[i].buf, bkh[i].size, 1, f) != 1) { - if (required) msgbox(oric, MSGBOX_OK, "Snapshot load failed: Read error (13)"); + if(required) msgbox(oric, MSGBOX_OK, "Snapshot load failed: Read error (13)"); return NULL; } @@ -728,24 +729,24 @@ static struct blockheader *load_block(struct machine *oric, char *id, FILE *f, S return &bkh[i]; } -static SDL_bool read_block(struct machine *oric, struct blockheader *blk, FILE *f, SDL_bool required, unsigned char *destbuf) +static SDL_bool read_block(struct machine *oric, struct blockheader *blk, FILE *f, SDL_bool required, unsigned char* destbuf) { - if (!blk) + if(!blk) { - if (required) msgbox(oric, MSGBOX_OK, "Snapshot load failed: Internal error (14)"); + if(required) msgbox(oric, MSGBOX_OK, "Snapshot load failed: Internal error (14)"); return SDL_FALSE; } - if (blk->buf) + if(blk->buf) { memcpy(destbuf, blk->buf, blk->size); return SDL_TRUE; } fseek(f, blk->offset, SEEK_SET); - if (fread(destbuf, blk->size, 1, f) != 1) + if(fread(destbuf, blk->size, 1, f) != 1) { - if (required) msgbox(oric, MSGBOX_OK, "Snapshot load failed: Read error (15)"); + if(required) msgbox(oric, MSGBOX_OK, "Snapshot load failed: Read error (15)"); return SDL_FALSE; } @@ -787,13 +788,13 @@ static Uint8 getu8(struct blockheader *blk) return blk->buf[blk->offs++]; } -static void getdata(struct blockheader *blk, unsigned char *dest, unsigned int size) +static void getdata(struct blockheader *blk, unsigned char* dest, unsigned int size) { memcpy(dest, &blk->buf[blk->offs], size); blk->offs += size; } -SDL_bool load_snapshot(struct machine *oric, char *filename) +SDL_bool load_snapshot(struct machine *oric, char* filename) { struct m6502 *cpu = &oric->cpu; int i; @@ -803,7 +804,7 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) struct blockheader *blk = NULL; f = fopen(filename, "rb"); - if (!f) + if(!f) { msgbox(oric, MSGBOX_OK, "Unable to open snapshot file (16)"); return SDL_FALSE; @@ -817,7 +818,7 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) /* Get the main block */ blk = load_block(oric, "OSN\x00", f, SDL_TRUE, 21, SDL_TRUE); - if (!blk) + if(!blk) { free_blockheaders(); fclose(f); @@ -828,7 +829,7 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) type = blk->buf[0]; drivetype = blk->buf[14]; - if (type >= MACH_LAST) + if(type >= MACH_LAST) { msgbox(oric, MSGBOX_OK, "Snapshot load failed: Invalid file (17)"); free_blockheaders(); @@ -840,27 +841,27 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) /* Perform some validation */ if((oric->drivetype != drivetype) || // Unrecognised or invalid drive type - (oric->memsize != blk->datablock->size)) // Memsize incorrect for type + (oric->memsize != blk->datablock->size)) // Memsize incorrect for type { msgbox(oric, MSGBOX_OK, "Snapshot load failed: Invalid file (18)"); free_blockheaders(); fclose(f); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); return SDL_FALSE; } /* Read in the memory */ - if (!read_block(oric, blk->datablock, f, SDL_TRUE, oric->mem)) + if(!read_block(oric, blk->datablock, f, SDL_TRUE, oric->mem)) { free_blockheaders(); fclose(f); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); return SDL_FALSE; } /* Clear things that will get replaced */ - clear_patches( oric ); - if (oric->tapebuf) + clear_patches(oric); + if(oric->tapebuf) { free(oric->tapebuf); oric->tapebuf = NULL; @@ -871,35 +872,37 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) oric->overclockmult = getu32(blk); oric->overclockshift = getu32(blk); oric->vsync = getu16(blk); - oric->romdis = getu8 (blk); - oric->romon = getu8 (blk); - oric->vsynchack = getu8 (blk); + oric->romdis = getu8(blk); + oric->romon = getu8(blk); + oric->vsynchack = getu8(blk); blk->offs++; // Skip drivetype (already got it) - oric->tapeturbo = getu8 (blk); - oric->vid_mode = getu8 (blk); + oric->tapeturbo = getu8(blk); + oric->vid_mode = getu8(blk); oric->keymap = getu32(blk); // Finished with this one free_block(blk); oric->vid_freq = oric->vid_mode&2; - if( oric->vid_mode & 4 ) + if(oric->vid_mode & 4) { oric->vid_addr = oric->vidbases[0]; oric->vid_ch_base = &oric->mem[oric->vidbases[1]]; - } else { + } + else + { oric->vid_addr = oric->vidbases[2]; oric->vid_ch_base = &oric->mem[oric->vidbases[3]]; } /* Get the CPU block */ blk = load_block(oric, "CPU\x00", f, SDL_TRUE, 21, SDL_FALSE); - if (!blk) + if(!blk) { free_blockheaders(); fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); return SDL_FALSE; } @@ -908,28 +911,28 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) cpu->lastpc = getu16(blk); cpu->calcpc = getu16(blk); cpu->calcint = getu16(blk); - cpu->nmi = getu8 (blk); - cpu->a = getu8 (blk); - cpu->x = getu8 (blk); - cpu->y = getu8 (blk); - cpu->sp = getu8 (blk); - i = getu8 (blk); + cpu->nmi = getu8(blk); + cpu->a = getu8(blk); + cpu->x = getu8(blk); + cpu->y = getu8(blk); + cpu->sp = getu8(blk); + i = getu8(blk); SETFLAGS(i); - cpu->irq = getu8 (blk); - cpu->nmicount = getu8 (blk); - cpu->calcop = getu8 (blk); + cpu->irq = getu8(blk); + cpu->nmicount = getu8(blk); + cpu->calcop = getu8(blk); // Finished with this one free_block(blk); /* Get the AY block */ blk = load_block(oric, "AY\x00\x00", f, SDL_TRUE, 153, SDL_FALSE); - if (!blk) + if(!blk) { free_blockheaders(); fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); return SDL_FALSE; } @@ -937,24 +940,24 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) oric->ay.creg = getu8(blk); getdata(blk, &oric->ay.eregs[0], NUM_AY_REGS); memcpy(&oric->ay.regs[0], &oric->ay.eregs[0], NUM_AY_REGS); - for (i=0; i<8; i++) + for(i=0; i<8; i++) oric->ay.keystates[i] = getu8(blk); - for (i=0; i<3; i++) + for(i=0; i<3; i++) oric->ay.toneper[i] = getu32(blk); oric->ay.noiseper = getu32(blk); oric->ay.envper = getu32(blk); - for (i=0; i<3; i++) + for(i=0; i<3; i++) { oric->ay.tonebit[i] = getu16(blk); oric->ay.noisebit[i] = getu16(blk); oric->ay.vol[i] = getu16(blk); } oric->ay.newout = getu16(blk); - for (i=0; i<3; i++) + for(i=0; i<3; i++) oric->ay.ct[i] = getu32(blk); oric->ay.ctn = getu32(blk); oric->ay.cte = getu32(blk); - for (i=0; i<3; i++) + for(i=0; i<3; i++) { oric->ay.tonepos[i] = getu32(blk); oric->ay.tonestep[i] = getu32(blk); @@ -972,47 +975,47 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) /* Get the VIA block */ blk = load_block(oric, "VIA\x00", f, SDL_TRUE, 39, SDL_FALSE); - if (!blk) + if(!blk) { free_blockheaders(); fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); return SDL_FALSE; } - oric->via.ifr = getu8 (blk); - oric->via.irb = getu8 (blk); - oric->via.orb = getu8 (blk); - oric->via.irbl = getu8 (blk); - oric->via.ira = getu8 (blk); - oric->via.ora = getu8 (blk); - oric->via.iral = getu8 (blk); - oric->via.ddra = getu8 (blk); - oric->via.ddrb = getu8 (blk); - oric->via.t1l_l = getu8 (blk); - oric->via.t1l_h = getu8 (blk); + oric->via.ifr = getu8(blk); + oric->via.irb = getu8(blk); + oric->via.orb = getu8(blk); + oric->via.irbl = getu8(blk); + oric->via.ira = getu8(blk); + oric->via.ora = getu8(blk); + oric->via.iral = getu8(blk); + oric->via.ddra = getu8(blk); + oric->via.ddrb = getu8(blk); + oric->via.t1l_l = getu8(blk); + oric->via.t1l_h = getu8(blk); oric->via.t1c = getu16(blk); - oric->via.t2l_l = getu8 (blk); - oric->via.t2l_h = getu8 (blk); + oric->via.t2l_l = getu8(blk); + oric->via.t2l_h = getu8(blk); oric->via.t2c = getu16(blk); - oric->via.sr = getu8 (blk); - oric->via.acr = getu8 (blk); - oric->via.pcr = getu8 (blk); - oric->via.ier = getu8 (blk); - oric->via.ca1 = getu8 (blk); - oric->via.ca2 = getu8 (blk); - oric->via.cb1 = getu8 (blk); - oric->via.cb2 = getu8 (blk); - oric->via.srcount = getu8 (blk); - oric->via.t1reload = getu8 (blk); - oric->via.t2reload = getu8 (blk); + oric->via.sr = getu8(blk); + oric->via.acr = getu8(blk); + oric->via.pcr = getu8(blk); + oric->via.ier = getu8(blk); + oric->via.ca1 = getu8(blk); + oric->via.ca2 = getu8(blk); + oric->via.cb1 = getu8(blk); + oric->via.cb2 = getu8(blk); + oric->via.srcount = getu8(blk); + oric->via.t1reload = getu8(blk); + oric->via.t2reload = getu8(blk); oric->via.srtime = getu16(blk); - oric->via.t1run = getu8 (blk); - oric->via.t2run = getu8 (blk); - oric->via.ca2pulse = getu8 (blk); - oric->via.cb2pulse = getu8 (blk); - oric->via.srtrigger= getu8 (blk); + oric->via.t1run = getu8(blk); + oric->via.t2run = getu8(blk); + oric->via.ca2pulse = getu8(blk); + oric->via.cb2pulse = getu8(blk); + oric->via.srtrigger= getu8(blk); oric->via.irqbit = getu32(blk); // Finished with this one @@ -1020,18 +1023,18 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) /* Get the tape block */ blk = load_block(oric, "TAP\x00", f, SDL_TRUE, 46, SDL_FALSE); - if (!blk) + if(!blk) { free_blockheaders(); fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); return SDL_FALSE; } - oric->tapebit = getu8 (blk); - oric->tapeout = getu8 (blk); - oric->tapeparity = getu8 (blk); + oric->tapebit = getu8(blk); + oric->tapeout = getu8(blk); + oric->tapeparity = getu8(blk); oric->tapelen = getu32(blk); oric->tapeoffs = getu32(blk); oric->tapecount = getu32(blk); @@ -1039,14 +1042,14 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) oric->tapedupbytes= getu32(blk); oric->tapehdrend = getu32(blk); oric->tapedelay = getu32(blk); - oric->tapemotor = getu8 (blk); + oric->tapemotor = getu8(blk); oric->tapeturbo_forceoff= getu8(blk); - oric->rawtape = getu8 (blk); + oric->rawtape = getu8(blk); oric->nonrawend = getu32(blk); oric->tapehitend = getu32(blk); oric->tapeturbo_syncstack = getu32(blk); - if (!blk->datablock) + if(!blk->datablock) { oric->tapelen = 0; oric->tapeoffs = 0; @@ -1054,22 +1057,22 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) else { oric->tapebuf = malloc(blk->datablock->size); - if (!oric->tapebuf) + if(!oric->tapebuf) { msgbox(oric, MSGBOX_OK, "Snapshot load failed: Out of memory (19)"); free_blockheaders(); fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); return SDL_FALSE; } - if (!read_block(oric, blk->datablock, f, SDL_TRUE, oric->tapebuf)) + if(!read_block(oric, blk->datablock, f, SDL_TRUE, oric->tapebuf)) { free_blockheaders(); fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); return SDL_FALSE; } } @@ -1078,7 +1081,7 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) free_block(blk); /* Get the patch block */ - if ((blk = load_block(oric, "PCH\x00", f, SDL_FALSE, 76, SDL_FALSE))) + if((blk = load_block(oric, "PCH\x00", f, SDL_FALSE, 76, SDL_FALSE))) { oric->pch_fd_cload_getname_pc = getu32(blk); oric->pch_fd_csave_getname_pc = getu32(blk); @@ -1099,25 +1102,25 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) oric->pch_tt_store_end_pc = getu32(blk); oric->pch_tt_writeleader_pc = getu32(blk); oric->pch_tt_writeleader_end_pc = getu32(blk); - oric->pch_tt_readbyte_setcarry = getu8 (blk); - oric->pch_tt_available = getu8 (blk); - oric->pch_tt_save_available = getu8 (blk); + oric->pch_tt_readbyte_setcarry = getu8(blk); + oric->pch_tt_available = getu8(blk); + oric->pch_tt_save_available = getu8(blk); // Finished with this one free_block(blk); } - switch (oric->drivetype) + switch(oric->drivetype) { case DRV_JASMIN: /* Get the jasmin block */ blk = load_block(oric, "JSM\x00", f, SDL_TRUE, 2, SDL_FALSE); - if (!blk) + if(!blk) { free_blockheaders(); fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); return SDL_FALSE; } @@ -1133,12 +1136,12 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) case DRV_MICRODISC: /* Get the microdisc block */ blk = load_block(oric, "MDC\x00", f, SDL_TRUE, 4, SDL_FALSE); - if (!blk) + if(!blk) { free_blockheaders(); fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); return SDL_FALSE; } @@ -1154,155 +1157,155 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) break; case DRV_PRAVETZ: - { - Uint8 tmp[PRAV_TRACKS_PER_DISK*PRAV_RAW_TRACK_SIZE*2]; - Uint32 offs_; - - /* Get the pravetz block */ - blk = load_block(oric, "PRV\x00", f, SDL_TRUE, 9+2*10, SDL_TRUE); - if (!blk) - { - free_blockheaders(); - fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); - return SDL_FALSE; - } - - oric->pravetz.olay = getu8(blk); - oric->pravetz.romdis = getu8(blk); - oric->pravetz.extension = getu16(blk); - oric->wddisk.c_drive = getu8(blk); - oric->wddisk.currentop = getu32(blk); - - for (i=0; i<2; i++) - { - oric->pravetz.drv[i].volume = getu8(blk); - oric->pravetz.drv[i].select = getu8(blk); - oric->pravetz.drv[i].motor_on = getu8(blk); - oric->pravetz.drv[i].write_ready = getu8(blk); - oric->pravetz.drv[i].byte = getu16(blk); - oric->pravetz.drv[i].half_track = getu16(blk); - oric->pravetz.drv[i].dirty = getu8(blk); - oric->pravetz.drv[i].prot = getu8(blk); - } - - if (!read_block(oric, blk->datablock, f, SDL_TRUE, tmp)) { - free_blockheaders(); - fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); - return SDL_FALSE; - } - - memcpy(&oric->pravetz.drv[0].image[0][0], tmp, PRAV_TRACKS_PER_DISK*PRAV_RAW_TRACK_SIZE); - memcpy(&oric->pravetz.drv[1].image[0][0], &tmp[PRAV_TRACKS_PER_DISK*PRAV_RAW_TRACK_SIZE], PRAV_TRACKS_PER_DISK*PRAV_RAW_TRACK_SIZE); + Uint8 tmp[PRAV_TRACKS_PER_DISK*PRAV_RAW_TRACK_SIZE*2]; + Uint32 offs_; - free_block(blk); - - // Get the disk images - while ((blk = load_block(oric, "PVD\x00", f, SDL_FALSE, -1, SDL_FALSE))) - { - // Get the drive associated with this disk image - i = getu16(blk); - if ((i<0) || (i>1) || (oric->wddisk.disk[i] != NULL) || (!blk->datablock) || (blk->size != 10)) + /* Get the pravetz block */ + blk = load_block(oric, "PRV\x00", f, SDL_TRUE, 9+2*10, SDL_TRUE); + if(!blk) { - msgbox(oric, MSGBOX_OK, "Snapshot load failed: Invalid file (PVD1)"); free_blockheaders(); fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); return SDL_FALSE; } - // Allocate a diskimage header - oric->wddisk.disk[i] = (struct diskimage *)malloc(sizeof(struct diskimage)); - if (!oric->wddisk.disk[i]) - { - msgbox(oric, MSGBOX_OK, "Snapshot load failed: Out of memory (PVD2)"); - free_blockheaders(); - fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); - return SDL_FALSE; - } - memset(oric->wddisk.disk[i], 0, sizeof(struct diskimage)); + oric->pravetz.olay = getu8(blk); + oric->pravetz.romdis = getu8(blk); + oric->pravetz.extension = getu16(blk); + oric->wddisk.c_drive = getu8(blk); + oric->wddisk.currentop = getu32(blk); - // Allocate space for the disk image - oric->wddisk.disk[i]->rawimage = malloc(blk->datablock->size); - if (!oric->wddisk.disk[i]) + for(i=0; i<2; i++) { - free(oric->wddisk.disk[i]); - oric->wddisk.disk[i] = NULL; - msgbox(oric, MSGBOX_OK, "Snapshot load failed: Out of memory (PVD3)"); - free_blockheaders(); - fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); - return SDL_FALSE; + oric->pravetz.drv[i].volume = getu8(blk); + oric->pravetz.drv[i].select = getu8(blk); + oric->pravetz.drv[i].motor_on = getu8(blk); + oric->pravetz.drv[i].write_ready = getu8(blk); + oric->pravetz.drv[i].byte = getu16(blk); + oric->pravetz.drv[i].half_track = getu16(blk); + oric->pravetz.drv[i].dirty = getu8(blk); + oric->pravetz.drv[i].prot = getu8(blk); } - // Read in the disk image - if (!read_block(oric, blk->datablock, f, SDL_TRUE, oric->wddisk.disk[i]->rawimage)) + if(!read_block(oric, blk->datablock, f, SDL_TRUE, tmp)) { - free(oric->wddisk.disk[i]->rawimage); - free(oric->wddisk.disk[i]); - oric->wddisk.disk[i] = NULL; free_blockheaders(); fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); return SDL_FALSE; } - oric->wddisk.disk[i]->cachedtrack = -1; - oric->wddisk.disk[i]->cachedside = -1; - - // Fill out the disk image header - oric->wddisk.disk[i]->drivenum = i; - oric->wddisk.disk[i]->rawimagelen = getu32(blk); + memcpy(&oric->pravetz.drv[0].image[0][0], tmp, PRAV_TRACKS_PER_DISK*PRAV_RAW_TRACK_SIZE); + memcpy(&oric->pravetz.drv[1].image[0][0], &tmp[PRAV_TRACKS_PER_DISK*PRAV_RAW_TRACK_SIZE], PRAV_TRACKS_PER_DISK*PRAV_RAW_TRACK_SIZE); - sprintf(oric->wddisk.disk[i]->filename, "%s%cSNAPDISK%d.DSK", diskpath, PATHSEP, i); - - offs_ = getu32(blk); - oric->pravetz.drv[i].pimg = oric->wddisk.disk[i]; - if (offs_ == 0xffffffff) - oric->pravetz.drv[i].sector_ptr = NULL; - else - oric->pravetz.drv[i].sector_ptr = &oric->pravetz.drv[i].pimg->rawimage[offs_]; - - blk->id[0] = 0; // Don't find this one again free_block(blk); + + // Get the disk images + while((blk = load_block(oric, "PVD\x00", f, SDL_FALSE, -1, SDL_FALSE))) + { + // Get the drive associated with this disk image + i = getu16(blk); + if((i<0) || (i>1) || (oric->wddisk.disk[i] != NULL) || (!blk->datablock) || (blk->size != 10)) + { + msgbox(oric, MSGBOX_OK, "Snapshot load failed: Invalid file (PVD1)"); + free_blockheaders(); + fclose(f); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); + return SDL_FALSE; + } + + // Allocate a diskimage header + oric->wddisk.disk[i] = (struct diskimage *)malloc(sizeof(struct diskimage)); + if(!oric->wddisk.disk[i]) + { + msgbox(oric, MSGBOX_OK, "Snapshot load failed: Out of memory (PVD2)"); + free_blockheaders(); + fclose(f); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); + return SDL_FALSE; + } + memset(oric->wddisk.disk[i], 0, sizeof(struct diskimage)); + + // Allocate space for the disk image + oric->wddisk.disk[i]->rawimage = malloc(blk->datablock->size); + if(!oric->wddisk.disk[i]) + { + free(oric->wddisk.disk[i]); + oric->wddisk.disk[i] = NULL; + msgbox(oric, MSGBOX_OK, "Snapshot load failed: Out of memory (PVD3)"); + free_blockheaders(); + fclose(f); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); + return SDL_FALSE; + } + + // Read in the disk image + if(!read_block(oric, blk->datablock, f, SDL_TRUE, oric->wddisk.disk[i]->rawimage)) + { + free(oric->wddisk.disk[i]->rawimage); + free(oric->wddisk.disk[i]); + oric->wddisk.disk[i] = NULL; + free_blockheaders(); + fclose(f); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); + return SDL_FALSE; + } + + oric->wddisk.disk[i]->cachedtrack = -1; + oric->wddisk.disk[i]->cachedside = -1; + + // Fill out the disk image header + oric->wddisk.disk[i]->drivenum = i; + oric->wddisk.disk[i]->rawimagelen = getu32(blk); + + sprintf(oric->wddisk.disk[i]->filename, "%s%cSNAPDISK%d.DSK", diskpath, PATHSEP, i); + + offs_ = getu32(blk); + oric->pravetz.drv[i].pimg = oric->wddisk.disk[i]; + if(offs_ == 0xffffffff) + oric->pravetz.drv[i].sector_ptr = NULL; + else + oric->pravetz.drv[i].sector_ptr = &oric->pravetz.drv[i].pimg->rawimage[offs_]; + + blk->id[0] = 0; // Don't find this one again + free_block(blk); + } } - } } - if (do_wd17xx) + if(do_wd17xx) { Uint8 disks[4]; /* Get the wd17xx block */ blk = load_block(oric, "WDD\x00", f, SDL_TRUE, 38, SDL_FALSE); - if (!blk) + if(!blk) { free_blockheaders(); fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); return SDL_FALSE; } - oric->wddisk.r_status = getu8 (blk); - oric->wddisk.r_track = getu8 (blk); - oric->wddisk.r_sector = getu8 (blk); - oric->wddisk.r_data = getu8 (blk); - oric->wddisk.c_drive = getu8 (blk); - oric->wddisk.c_side = getu8 (blk); - oric->wddisk.c_track = getu8 (blk); - oric->wddisk.c_sector = getu8 (blk); - oric->wddisk.sectype = getu8 (blk); - oric->wddisk.last_step_in = getu8 (blk); + oric->wddisk.r_status = getu8(blk); + oric->wddisk.r_track = getu8(blk); + oric->wddisk.r_sector = getu8(blk); + oric->wddisk.r_data = getu8(blk); + oric->wddisk.c_drive = getu8(blk); + oric->wddisk.c_side = getu8(blk); + oric->wddisk.c_track = getu8(blk); + oric->wddisk.c_sector = getu8(blk); + oric->wddisk.sectype = getu8(blk); + oric->wddisk.last_step_in = getu8(blk); getdata(blk, disks, 4); oric->wddisk.currentop = getu32(blk); oric->wddisk.curroffs = getu32(blk); @@ -1316,59 +1319,59 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) free_block(blk); // Get the disk images - while ((blk = load_block(oric, "DSK\x00", f, SDL_FALSE, -1, SDL_FALSE))) + while((blk = load_block(oric, "DSK\x00", f, SDL_FALSE, -1, SDL_FALSE))) { int track_to_cache=-1, side_to_cache=-1; // Get the drive associated with this disk image i = getu16(blk); - if ((i<0) || (i>3) || (oric->wddisk.disk[i] != NULL) || (!blk->datablock) || (blk->size != 16)) + if((i<0) || (i>3) || (oric->wddisk.disk[i] != NULL) || (!blk->datablock) || (blk->size != 16)) { msgbox(oric, MSGBOX_OK, "Snapshot load failed: Invalid file (20)"); free_blockheaders(); fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); return SDL_FALSE; } // Allocate a diskimage header oric->wddisk.disk[i] = (struct diskimage *)malloc(sizeof(struct diskimage)); - if (!oric->wddisk.disk[i]) + if(!oric->wddisk.disk[i]) { msgbox(oric, MSGBOX_OK, "Snapshot load failed: Out of memory (21)"); free_blockheaders(); fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); return SDL_FALSE; } memset(oric->wddisk.disk[i], 0, sizeof(struct diskimage)); // Allocate space for the disk image oric->wddisk.disk[i]->rawimage = malloc(blk->datablock->size); - if (!oric->wddisk.disk[i]) + if(!oric->wddisk.disk[i]) { free(oric->wddisk.disk[i]); oric->wddisk.disk[i] = NULL; msgbox(oric, MSGBOX_OK, "Snapshot load failed: Out of memory (22)"); free_blockheaders(); fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); return SDL_FALSE; } // Read in the disk image - if (!read_block(oric, blk->datablock, f, SDL_TRUE, oric->wddisk.disk[i]->rawimage)) + if(!read_block(oric, blk->datablock, f, SDL_TRUE, oric->wddisk.disk[i]->rawimage)) { free(oric->wddisk.disk[i]->rawimage); free(oric->wddisk.disk[i]); oric->wddisk.disk[i] = NULL; free_blockheaders(); fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); return SDL_FALSE; } @@ -1384,10 +1387,10 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) side_to_cache = gets16(blk); oric->wddisk.disk[i]->rawimagelen = getu32(blk); - if ((track_to_cache != -1) && (side_to_cache != -1)) + if((track_to_cache != -1) && (side_to_cache != -1)) diskimage_cachetrack(oric->wddisk.disk[i], track_to_cache, side_to_cache); - if (oric->wddisk.c_drive == i) + if(oric->wddisk.c_drive == i) oric->wddisk.currsector = wd17xx_find_sector(&oric->wddisk, oric->wddisk.r_sector); sprintf(oric->wddisk.disk[i]->filename, "%s%cSNAPDISK%d.DSK", diskpath, PATHSEP, i); @@ -1397,20 +1400,20 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) } } - if (oric->type == MACH_TELESTRAT) + if(oric->type == MACH_TELESTRAT) { /* Get the bank information block */ blk = load_block(oric, "BNK\x00", f, SDL_TRUE, 9, SDL_FALSE); - if (!blk) + if(!blk) { free_blockheaders(); fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); return SDL_FALSE; } - for (i=0; i<8; i++) + for(i=0; i<8; i++) oric->tele_bank[i].type = getu8(blk); oric->tele_currbank = getu8(blk); @@ -1419,12 +1422,12 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) /* Get the ACIA block */ blk = load_block(oric, "ACI\x00", f, SDL_TRUE, ACIA_LAST, SDL_FALSE); - if (!blk) + if(!blk) { free_blockheaders(); fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); return SDL_FALSE; } @@ -1435,12 +1438,12 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) /* Get the AUX ACIA block */ blk = load_block(oric, "AUX\x00", f, SDL_TRUE, ACIA_LAST, SDL_FALSE); - if (!blk) + if(!blk) { free_blockheaders(); fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); return SDL_FALSE; } @@ -1449,47 +1452,47 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) /* Get the VIA block */ blk = load_block(oric, "TVA\x00", f, SDL_TRUE, 39, SDL_FALSE); - if (!blk) + if(!blk) { free_blockheaders(); fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); return SDL_FALSE; } - oric->tele_via.ifr = getu8 (blk); - oric->tele_via.irb = getu8 (blk); - oric->tele_via.orb = getu8 (blk); - oric->tele_via.irbl = getu8 (blk); - oric->tele_via.ira = getu8 (blk); - oric->tele_via.ora = getu8 (blk); - oric->tele_via.iral = getu8 (blk); - oric->tele_via.ddra = getu8 (blk); - oric->tele_via.ddrb = getu8 (blk); - oric->tele_via.t1l_l = getu8 (blk); - oric->tele_via.t1l_h = getu8 (blk); + oric->tele_via.ifr = getu8(blk); + oric->tele_via.irb = getu8(blk); + oric->tele_via.orb = getu8(blk); + oric->tele_via.irbl = getu8(blk); + oric->tele_via.ira = getu8(blk); + oric->tele_via.ora = getu8(blk); + oric->tele_via.iral = getu8(blk); + oric->tele_via.ddra = getu8(blk); + oric->tele_via.ddrb = getu8(blk); + oric->tele_via.t1l_l = getu8(blk); + oric->tele_via.t1l_h = getu8(blk); oric->tele_via.t1c = getu16(blk); - oric->tele_via.t2l_l = getu8 (blk); - oric->tele_via.t2l_h = getu8 (blk); + oric->tele_via.t2l_l = getu8(blk); + oric->tele_via.t2l_h = getu8(blk); oric->tele_via.t2c = getu16(blk); - oric->tele_via.sr = getu8 (blk); - oric->tele_via.acr = getu8 (blk); - oric->tele_via.pcr = getu8 (blk); - oric->tele_via.ier = getu8 (blk); - oric->tele_via.ca1 = getu8 (blk); - oric->tele_via.ca2 = getu8 (blk); - oric->tele_via.cb1 = getu8 (blk); - oric->tele_via.cb2 = getu8 (blk); - oric->tele_via.srcount = getu8 (blk); - oric->tele_via.t1reload = getu8 (blk); - oric->tele_via.t2reload = getu8 (blk); + oric->tele_via.sr = getu8(blk); + oric->tele_via.acr = getu8(blk); + oric->tele_via.pcr = getu8(blk); + oric->tele_via.ier = getu8(blk); + oric->tele_via.ca1 = getu8(blk); + oric->tele_via.ca2 = getu8(blk); + oric->tele_via.cb1 = getu8(blk); + oric->tele_via.cb2 = getu8(blk); + oric->tele_via.srcount = getu8(blk); + oric->tele_via.t1reload = getu8(blk); + oric->tele_via.t2reload = getu8(blk); oric->tele_via.srtime = getu16(blk); - oric->tele_via.t1run = getu8 (blk); - oric->tele_via.t2run = getu8 (blk); - oric->tele_via.ca2pulse = getu8 (blk); - oric->tele_via.cb2pulse = getu8 (blk); - oric->tele_via.srtrigger= getu8 (blk); + oric->tele_via.t1run = getu8(blk); + oric->tele_via.t2run = getu8(blk); + oric->tele_via.ca2pulse = getu8(blk); + oric->tele_via.cb2pulse = getu8(blk); + oric->tele_via.srtrigger= getu8(blk); oric->tele_via.irqbit = getu32(blk); // Finished with this one @@ -1498,26 +1501,26 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) #ifdef WWW_MONITOR /* Get the rom symbols block */ - if ((blk = load_block(oric, "SYR\x00", f, SDL_FALSE, -1, SDL_FALSE))) + if((blk = load_block(oric, "SYR\x00", f, SDL_FALSE, -1, SDL_FALSE))) { mon_symsfromsnapshot(&oric->romsyms, blk->buf, blk->size); free_block(blk); } /* Get the user symbols block */ - if ((blk = load_block(oric, "SYU\x00", f, SDL_FALSE, -1, SDL_FALSE))) + if((blk = load_block(oric, "SYU\x00", f, SDL_FALSE, -1, SDL_FALSE))) { mon_symsfromsnapshot(&oric->usersyms, blk->buf, blk->size); free_block(blk); } - if (oric->type == MACH_TELESTRAT) + if(oric->type == MACH_TELESTRAT) { - for (i=0; i<8; i++) + for(i=0; i<8; i++) { char name[8]; sprintf(name, "SY%d%c", i, 0); - if ((blk = load_block(oric, name, f, SDL_FALSE, -1, SDL_FALSE))) + if((blk = load_block(oric, name, f, SDL_FALSE, -1, SDL_FALSE))) { mon_symsfromsnapshot(&oric->tele_banksyms[i], blk->buf, blk->size); free_block(blk); @@ -1526,23 +1529,23 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) } /* ... and finally, breakpoints! */ - if ((blk = load_block(oric, "BKP\x00", f, SDL_FALSE, -1, SDL_FALSE))) + if((blk = load_block(oric, "BKP\x00", f, SDL_FALSE, -1, SDL_FALSE))) { cpu->anybp = SDL_FALSE; cpu->anymbp = SDL_FALSE; - for (i=0; i<16; i++) + for(i=0; i<16; i++) { cpu->breakpoints[i] = gets32(blk); - if (cpu->breakpoints[i] != -1) cpu->anybp = SDL_TRUE; + if(cpu->breakpoints[i] != -1) cpu->anybp = SDL_TRUE; } - for (i=0; i<16; i++) + for(i=0; i<16; i++) { cpu->membreakpoints[i].flags = getu8(blk); cpu->membreakpoints[i].lastval = getu8(blk); cpu->membreakpoints[i].addr = getu16(blk); - if (cpu->membreakpoints[i].flags) cpu->anymbp = SDL_TRUE; + if(cpu->membreakpoints[i].flags) cpu->anymbp = SDL_TRUE; } free_block(blk); @@ -1551,8 +1554,8 @@ SDL_bool load_snapshot(struct machine *oric, char *filename) free_blockheaders(); fclose(f); - setmenutoggles( oric ); - if (back2mon) setemumode(oric, NULL, EM_DEBUG); + setmenutoggles(oric); + if(back2mon) setemumode(oric, NULL, EM_DEBUG); return SDL_TRUE; } diff --git a/snapshot.h b/snapshot.h index de71c9ab..c59b3cf3 100644 --- a/snapshot.h +++ b/snapshot.h @@ -20,6 +20,6 @@ ** */ -SDL_bool save_snapshot(struct machine *oric, char *filename); -SDL_bool load_snapshot(struct machine *oric, char *filename); +SDL_bool save_snapshot(struct machine *oric, char* filename); +SDL_bool load_snapshot(struct machine *oric, char* filename); diff --git a/system.h b/system.h index ced9e137..215d4378 100644 --- a/system.h +++ b/system.h @@ -61,13 +61,13 @@ #else - #define PATHSEP '/' - #define PATHSEPSTR "/" - #define ROMPREFIX "roms"PATHSEPSTR - #define IMAGEPREFIX "images"PATHSEPSTR +#define PATHSEP '/' +#define PATHSEPSTR "/" +#define ROMPREFIX "roms"PATHSEPSTR +#define IMAGEPREFIX "images"PATHSEPSTR #endif -const char *get_fileprefix(); +const char* get_fileprefix(); /* SDL related stuff */ #include "system_sdl.h" diff --git a/system_sdl.c b/system_sdl.c index bdf8c19a..a6dc4394 100644 --- a/system_sdl.c +++ b/system_sdl.c @@ -97,7 +97,7 @@ static void FreeResources(void) g_glcontext = NULL; } - if (g_texture) + if(g_texture) { SDL_DestroyTexture(g_texture); g_texture = NULL; @@ -144,9 +144,9 @@ int SDL_COMPAT_Init(Uint32 flags) fprintf(stderr,"\n"); #endif - rc = SDL_Init( flags ); - if( rc < 0 ) - error_printf( "SDL init failed: %s", SDL_GetError() ); + rc = SDL_Init(flags); + if(rc < 0) + error_printf("SDL init failed: %s", SDL_GetError()); return rc; } @@ -156,11 +156,11 @@ int SDL_COMPAT_GetWMInfo(SDL_SysWMinfo *info) { // NOTE: see above for SDL_GetWMInfo in macros // #if defined(__MORPHOS__)||defined(__APPLE__) - #if defined(__MORPHOS__) +#if defined(__MORPHOS__) return 0; - #else +#else return SDL_GetWMInfo(info); - #endif +#endif } #else int SDL_COMPAT_GetWMInfo(SDL_SysWMinfo *info) @@ -182,12 +182,12 @@ void SDL_COMPAT_WM_SetIcon(SDL_Surface *icon, Uint8 *mask) } #if SDL_MAJOR_VERSION == 1 -void SDL_COMPAT_WM_SetCaption(const char *title, const char *icon) +void SDL_COMPAT_WM_SetCaption(const char* title, const char* icon) { SDL_WM_SetCaption(title, icon); } #else -void SDL_COMPAT_WM_SetCaption(const char *title, const char *icon) +void SDL_COMPAT_WM_SetCaption(const char* title, const char* icon) { if(g_window) SDL_SetWindowTitle(g_window, title); @@ -203,7 +203,7 @@ SDL_bool SDL_COMPAT_IsAppActive(SDL_Event* event) } SDL_bool SDL_COMPAT_IsAppFocused(SDL_Event* event) { - switch( event->active.type ) + switch(event->active.type) { case SDL_APPINPUTFOCUS: case SDL_APPACTIVE: @@ -228,7 +228,7 @@ SDL_bool SDL_COMPAT_IsAppFocused(SDL_Event* event) * case SDL_WINDOWEVENT_ENTER: * return SDL_TRUE; * break; -} */ + } */ return SDL_FALSE; } #endif @@ -276,10 +276,11 @@ SDL_COMPAT_KEY SDL_COMPAT_GetKeysymUnicode(SDL_COMPAT_KEYSYM keysym) { // FIXME #ifdef DEBUG_KEY_DUMP - char c = 0x7f & keysym.sym; c = (c < ' ')? ' ' : c; + char c = 0x7f & keysym.sym; + c = (c < ' ')? ' ' : c; key_dump("SDL : GetKeysymUnicode: " - "c=|%c| scancode=$%.4X, sym=$%.4X, mod=$%.4X, unicode=$%.4X -> unicode=$%.4X\n", - c, keysym.scancode, keysym.sym, keysym.mod, keysym.unicode, keysym.unicode); + "c=|%c| scancode=$%.4X, sym=$%.4X, mod=$%.4X, unicode=$%.4X -> unicode=$%.4X\n", + c, keysym.scancode, keysym.sym, keysym.mod, keysym.unicode, keysym.unicode); #endif // FIXME @@ -289,10 +290,11 @@ SDL_COMPAT_KEY SDL_COMPAT_TranslateUnicode(SDL_COMPAT_KEYSYM keysym) { // FIXME #ifdef DEBUG_KEY_DUMP - char c = 0x7f & keysym.sym; c = (c < ' ')? ' ' : c; + char c = 0x7f & keysym.sym; + c = (c < ' ')? ' ' : c; key_dump("SDL : TranslateUnicode: " - "c=|%c| scancode=$%.4X, sym=$%.4X, mod=$%.4X, unicode=$%.4X -> unicode=$%.4X\n", - c, keysym.scancode, keysym.sym, keysym.mod, keysym.unicode, keysym.unicode); + "c=|%c| scancode=$%.4X, sym=$%.4X, mod=$%.4X, unicode=$%.4X -> unicode=$%.4X\n", + c, keysym.scancode, keysym.sym, keysym.mod, keysym.unicode, keysym.unicode); #endif // FIXME return keysym.unicode; @@ -302,10 +304,11 @@ SDL_COMPAT_KEY SDL_COMPAT_GetKeysymUnicode(SDL_COMPAT_KEYSYM keysym) { // FIXME #ifdef DEBUG_KEY_DUMP - char c = 0x7f & keysym.sym; c = (c < ' ')? ' ' : c; + char c = 0x7f & keysym.sym; + c = (c < ' ')? ' ' : c; key_dump("SDL2: GetKeysymUnicode: " - "c=|%c| scancode=$%.4X, sym=$%.4X, mod=$%.4X, unicode=----- -> keysym.sym=$%.4X\n", - c, keysym.scancode, keysym.sym, keysym.mod, keysym.sym); + "c=|%c| scancode=$%.4X, sym=$%.4X, mod=$%.4X, unicode=----- -> keysym.sym=$%.4X\n", + c, keysym.scancode, keysym.sym, keysym.mod, keysym.sym); #endif // FIXME return keysym.sym; @@ -322,27 +325,69 @@ SDL_COMPAT_KEY SDL_COMPAT_TranslateUnicode(SDL_COMPAT_KEYSYM keysym) { switch(keysym.sym) { - case '0' : sym_out = ')'; break; - case '1' : sym_out = '!'; break; - case '2' : sym_out = '@'; break; - case '3' : sym_out = '#'; break; - case '4' : sym_out = '$'; break; - case '5' : sym_out = '%'; break; - case '6' : sym_out = '^'; break; - case '7' : sym_out = '&'; break; - case '8' : sym_out = '*'; break; - case '9' : sym_out = '('; break; - case ';' : sym_out = ':'; break; - case '\'' : sym_out = '"'; break; - case '\\' : sym_out = '|'; break; - case ',' : sym_out = '<'; break; - case '.' : sym_out = '>'; break; - case '/' : sym_out = '?'; break; - case '`' : sym_out = '~'; break; - case '-' : sym_out = '_'; break; - case '=' : sym_out = '+'; break; - case '[' : sym_out = '{'; break; - case ']' : sym_out = '}'; break; + case '0' : + sym_out = ')'; + break; + case '1' : + sym_out = '!'; + break; + case '2' : + sym_out = '@'; + break; + case '3' : + sym_out = '#'; + break; + case '4' : + sym_out = '$'; + break; + case '5' : + sym_out = '%'; + break; + case '6' : + sym_out = '^'; + break; + case '7' : + sym_out = '&'; + break; + case '8' : + sym_out = '*'; + break; + case '9' : + sym_out = '('; + break; + case ';' : + sym_out = ':'; + break; + case '\'' : + sym_out = '"'; + break; + case '\\' : + sym_out = '|'; + break; + case ',' : + sym_out = '<'; + break; + case '.' : + sym_out = '>'; + break; + case '/' : + sym_out = '?'; + break; + case '`' : + sym_out = '~'; + break; + case '-' : + sym_out = '_'; + break; + case '=' : + sym_out = '+'; + break; + case '[' : + sym_out = '{'; + break; + case ']' : + sym_out = '}'; + break; default: sym_out = keysym.sym = toupper(keysym.sym); break; @@ -350,10 +395,11 @@ SDL_COMPAT_KEY SDL_COMPAT_TranslateUnicode(SDL_COMPAT_KEYSYM keysym) } // FIXME #ifdef DEBUG_KEY_DUMP - char c = 0x7f & keysym.sym; c = (c < ' ')? ' ' : c; + char c = 0x7f & keysym.sym; + c = (c < ' ')? ' ' : c; key_dump("SDL2: TranslateUnicode: " - "c=|%c| scancode=$%.4X, sym=$%.4X, mod=$%.4X, unicode=----- -> keysym.sym=$%.4X\n", - c, keysym.scancode, sym_in, keysym.mod, sym_out); + "c=|%c| scancode=$%.4X, sym=$%.4X, mod=$%.4X, unicode=----- -> keysym.sym=$%.4X\n", + c, keysym.scancode, sym_in, keysym.mod, sym_out); #endif // FIXME @@ -425,7 +471,7 @@ SDL_Surface* SDL_COMPAT_SetVideoMode(int width, int height, int bitsperpixel, Ui FreeResources(); // NOTE: SDL_WM_SetIcon function must be called before the first call to SDL_SetVideoMode. - if (g_icon) + if(g_icon) SDL_WM_SetIcon(g_icon, NULL); return SDL_SetVideoMode(width, height, bitsperpixel, flags); @@ -441,10 +487,10 @@ SDL_Surface* SDL_COMPAT_SetVideoMode(int width, int height, int bitsperpixel, Ui // When leaving fullscreen mode, X and Y coordinates // should be recentered relative to the display. - if ( !(flags & SDL_WINDOW_FULLSCREEN) ) + if(!(flags & SDL_WINDOW_FULLSCREEN)) { - g_lastx = SDL_WINDOWPOS_CENTERED; - g_lasty = SDL_WINDOWPOS_CENTERED; + g_lastx = SDL_WINDOWPOS_CENTERED; + g_lasty = SDL_WINDOWPOS_CENTERED; } #ifndef __ANDROID__ @@ -454,7 +500,7 @@ SDL_Surface* SDL_COMPAT_SetVideoMode(int width, int height, int bitsperpixel, Ui g_window = SDL_CreateWindow("oricutron", SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED, 0, 0, SDL_WINDOW_FULLSCREEN_DESKTOP); #endif - if (g_icon) + if(g_icon) SDL_SetWindowIcon(g_window, g_icon); if(flags & SDL_WINDOW_OPENGL) @@ -512,7 +558,7 @@ void SDL_COMPAT_SetEventFilter(SDL_EventFilter filter) void SDL_COMPAT_Quit(SDL_bool freeall) { FreeResources(); - if (g_icon && freeall) + if(g_icon && freeall) { // ...and the surface containing the icon pixel data is no longer required. SDL_FreeSurface(g_icon); @@ -540,10 +586,10 @@ SDL_Surface * flipVert(SDL_Surface* sfc) { int line; SDL_Surface* result = SDL_CreateRGBSurface(sfc->flags, sfc->w, sfc->h, - sfc->format->BytesPerPixel * 8, sfc->format->Rmask, sfc->format->Gmask, - sfc->format->Bmask, sfc->format->Amask); + sfc->format->BytesPerPixel * 8, sfc->format->Rmask, sfc->format->Gmask, + sfc->format->Bmask, sfc->format->Amask); - if (result) + if(result) { Uint8* pixels = (Uint8*) sfc->pixels; Uint8* rpixels = (Uint8*) result->pixels; @@ -561,7 +607,7 @@ SDL_Surface * flipVert(SDL_Surface* sfc) return result; } #if SDL_MAJOR_VERSION == 1 -void SDL_COMPAT_TakeScreenshot(char *fname) +void SDL_COMPAT_TakeScreenshot(char* fname) { SDL_Surface *g_screen = SDL_GetVideoSurface(); @@ -590,7 +636,7 @@ void SDL_COMPAT_TakeScreenshot(char *fname) SDL_SaveBMP(g_screen, fname); } #else -void SDL_COMPAT_TakeScreenshot(char *fname) +void SDL_COMPAT_TakeScreenshot(char* fname) { // 24 Bits // SDL_Surface *surf = SDL_CreateRGBSurface(SDL_SWSURFACE, g_width, g_height, 24, RMASK, BMASK, GMASK, 0); @@ -598,7 +644,7 @@ void SDL_COMPAT_TakeScreenshot(char *fname) // 32 Bits SDL_Surface *surf = SDL_CreateRGBSurface(SDL_SWSURFACE, g_width, g_height, g_bpp, RMASK, GMASK, BMASK, AMASK); - if (surf == NULL) + if(surf == NULL) return; // 24 Bits @@ -616,12 +662,12 @@ void SDL_COMPAT_TakeScreenshot(char *fname) #endif #else #if SDL_MAJOR_VERSION == 1 -void SDL_COMPAT_TakeScreenshot(char *fname) +void SDL_COMPAT_TakeScreenshot(char* fname) { SDL_SaveBMP(SDL_GetVideoSurface(), fname); } #else -void SDL_COMPAT_TakeScreenshot(char *fname) +void SDL_COMPAT_TakeScreenshot(char* fname) { SDL_SaveBMP(g_screen, fname); } diff --git a/system_sdl.h b/system_sdl.h index 55d59e5d..241291d0 100644 --- a/system_sdl.h +++ b/system_sdl.h @@ -133,7 +133,7 @@ int SDL_COMPAT_GetWMInfo(SDL_SysWMinfo *info); int SDL_COMPAT_Init(Uint32 flags); void SDL_COMPAT_WM_SetIcon(SDL_Surface *icon, Uint8 *mask); -void SDL_COMPAT_WM_SetCaption(const char *title, const char *icon); +void SDL_COMPAT_WM_SetCaption(const char* title, const char* icon); SDL_bool SDL_COMPAT_IsAppActive(SDL_Event* event); SDL_bool SDL_COMPAT_IsAppFocused(SDL_Event* event); int SDL_COMPAT_EnableKeyRepeat(int delay, int interval); @@ -147,7 +147,7 @@ SDL_Surface* SDL_COMPAT_SetVideoMode(int width, int height, int bitsperpixel, Ui int SDL_COMPAT_SetPalette(SDL_Surface *surface, int flags, SDL_Color *colors, int firstcolor, int ncolors); void SDL_COMPAT_SetEventFilter(SDL_EventFilter filter); void SDL_COMPAT_Quit(SDL_bool freeall); -void SDL_COMPAT_TakeScreenshot(char *fname); +void SDL_COMPAT_TakeScreenshot(char* fname); const char* SDL_COMPAT_JoystickName(SDL_Joystick *joystick); #ifdef __OPENGL_AVAILABLE__ @@ -162,7 +162,7 @@ void SDL_COMPAT_GL_SwapBuffers(void); #define error_printf(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) #else #define debug_printf(...) fprintf(stdout,__VA_ARGS__) -void error_printf( char *fmt, ... ); +void error_printf(char* fmt, ...); #endif #endif /* ORICUTRON_SYSTEM_SDL_H */ diff --git a/tape.c b/tape.c index e01bc8a0..032d5d2f 100644 --- a/tape.c +++ b/tape.c @@ -47,36 +47,37 @@ extern char filetmp[]; // Pop-up the name of the currently inserted tape // image file (or an eject symbol if no tape image). -void tape_popup( struct machine *oric ) +void tape_popup(struct machine *oric) { char tmp[40]; - if( !oric->tapename[0] ) + if(!oric->tapename[0]) { // Eject symbol - do_popup( oric, "\x0f\x10\x13" ); + do_popup(oric, "\x0f\x10\x13"); return; } // Tape image name - sprintf( tmp, "\x0f\x10""%c %-16s", oric->tapemotor ? 18 : 17, oric->tapename ); - do_popup( oric, tmp ); + sprintf(tmp, "\x0f\x10""%c %-16s", oric->tapemotor ? 18 : 17, oric->tapename); + do_popup(oric, tmp); } -void toggletapecap( struct machine *oric, struct osdmenuitem *mitem, int dummy ) +void toggletapecap(struct machine *oric, struct osdmenuitem *mitem, int dummy) { char ortheader[] = { 'O', 'R', 'T', 0 }; // Oric Raw Tape, Version 0 /* If capturing, stop */ - if( oric->tapecap ) + if(oric->tapecap) { - fclose( oric->tapecap ); + fclose(oric->tapecap); #ifdef WWW // sync from memory state to persisted EM_ASM( - FS.syncfs(function (err) { - assert(!err); - }); + FS.syncfs(function(err) + { + assert(!err); + }); ); #endif oric->tapecap = NULL; @@ -86,36 +87,36 @@ void toggletapecap( struct machine *oric, struct osdmenuitem *mitem, int dummy ) } /* Otherwise, prompt for the file to capture */ - if( !filerequester( oric, "Capture tape output", tapepath, tmptapename, FR_TAPESAVEORT ) ) + if(!filerequester(oric, "Capture tape output", tapepath, tmptapename, FR_TAPESAVEORT)) { // Never mind return; } - if( tmptapename[0] == 0 ) return; + if(tmptapename[0] == 0) return; /* If it ends in ".tap", we need to change it to ".ort", because we're capturing real signals here folks! */ - if( (strlen(tmptapename)>3) && (strcasecmp(&tmptapename[strlen(tmptapename)-4], ".tap")==0) ) + if((strlen(tmptapename)>3) && (strcasecmp(&tmptapename[strlen(tmptapename)-4], ".tap")==0)) tmptapename[strlen(tmptapename)-4] = 0; /* Add .ort extension, if necessary */ - if( (strlen(tmptapename)<4) || (strcasecmp(&tmptapename[strlen(tmptapename)-4], ".ort")!=0) ) + if((strlen(tmptapename)<4) || (strcasecmp(&tmptapename[strlen(tmptapename)-4], ".ort")!=0)) strncat(tmptapename, ".ort", 4095); tmptapename[4095] = 0; - joinpath( tapepath, tmptapename ); + joinpath(tapepath, tmptapename); /* Open the file */ - oric->tapecap = fopen( filetmp, "wb" ); - if( !oric->tapecap ) + oric->tapecap = fopen(filetmp, "wb"); + if(!oric->tapecap) { /* Oh well */ - msgbox( oric, MSGBOX_OK, "Unable to create file" ); + msgbox(oric, MSGBOX_OK, "Unable to create file"); return; } /* Write header */ - fwrite( ortheader, 4, 1, oric->tapecap); + fwrite(ortheader, 4, 1, oric->tapecap); /* Counter reset */ oric->tapecapcount = -1; @@ -135,31 +136,31 @@ void toggletapecap( struct machine *oric, struct osdmenuitem *mitem, int dummy ) ** Only call it when you think you're at a tape leader since it doesn't do many ** sanity checks. */ -void tape_setup_header( struct machine *oric ) +void tape_setup_header(struct machine *oric) { int i; oric->tapedupbytes = 0; oric->tapehdrend = 0; - if( oric->tapebuf[oric->tapeoffs] != 0x16 ) + if(oric->tapebuf[oric->tapeoffs] != 0x16) return; /* Does it look like a header? */ - for( i=0; oric->tapebuf[oric->tapeoffs+i]==0x16; i++ ) + for(i=0; oric->tapebuf[oric->tapeoffs+i]==0x16; i++) { - if( (oric->tapeoffs+i) >= oric->tapelen ) + if((oric->tapeoffs+i) >= oric->tapelen) return; } - if( ( i < 3 ) || ( oric->tapebuf[oric->tapeoffs+i] != 0x24 ) ) + if((i < 3) || (oric->tapebuf[oric->tapeoffs+i] != 0x24)) return; i++; - if( (oric->tapeoffs+i+9) >= oric->tapelen ) + if((oric->tapeoffs+i+9) >= oric->tapelen) return; i+=9; - while( oric->tapebuf[oric->tapeoffs+i] != 0 ) + while(oric->tapebuf[oric->tapeoffs+i] != 0) { - if( (oric->tapeoffs+i) >= oric->tapelen ) + if((oric->tapeoffs+i) >= oric->tapelen) return; i++; } @@ -170,46 +171,46 @@ void tape_setup_header( struct machine *oric ) } -void tape_orbchange( struct via *via ) +void tape_orbchange(struct via *via) { struct machine *oric = via->oric; unsigned char buffer[4], tapebit, bufwrite; unsigned int count; /* Capturing tape output? */ - if( !oric->tapecap ) return; + if(!oric->tapecap) return; /* Saving a tap section? */ - if( oric->tapecap == oric->tsavf ) return; + if(oric->tapecap == oric->tsavf) return; tapebit = (via->orb & via->ddrb) >> 7; - if( tapebit == oric->tapecaplastbit ) return; + if(tapebit == oric->tapecaplastbit) return; oric->tapecaplastbit = tapebit; /* Were we waiting for the first toggle? */ - if( oric->tapecapcount < 0 ) + if(oric->tapecapcount < 0) { /* Well, we found it */ oric->tapecapcount = 0; - fputc( tapebit, oric->tapecap ); + fputc(tapebit, oric->tapecap); return; } count = (oric->tapecapcount>>1); - if( count < 0xfc ) + if(count < 0xfc) { buffer[0] = count; bufwrite = 1; } - else if( count < 0x100 ) + else if(count < 0x100) { buffer[0] = 0xfc; buffer[1] = count; bufwrite = 2; } - else if( count < 0x10000 ) + else if(count < 0x10000) { buffer[0] = 0xfd; buffer[1] = (count>>8)&0xff; @@ -224,30 +225,30 @@ void tape_orbchange( struct via *via ) bufwrite = 3; } - fwrite( buffer, bufwrite, 1, oric->tapecap ); + fwrite(buffer, bufwrite, 1, oric->tapecap); oric->tapecapcount = 0; } // Set the tape motor on or off -void tape_setmotor( struct machine *oric, SDL_bool motoron ) +void tape_setmotor(struct machine *oric, SDL_bool motoron) { - if( motoron == oric->tapemotor ) + if(motoron == oric->tapemotor) return; // Refresh the tape status icon in the status bar refreshtape = SDL_TRUE; // "Real" tape emulation? - if( ( !oric->tapeturbo ) || ( !oric->pch_tt_available ) ) + if((!oric->tapeturbo) || (!oric->pch_tt_available)) { - if( ( !oric->rawtape ) || ( oric->tapeoffs < oric->nonrawend ) ) + if((!oric->rawtape) || (oric->tapeoffs < oric->nonrawend)) { // If we're stopping part way through a byte, just move // the current position on to the start of the next byte - if( !motoron ) + if(!motoron) { - if( oric->tapebit > 0 ) + if(oric->tapebit > 0) oric->tapeoffs++; oric->tapebit = 0; } @@ -256,10 +257,10 @@ void tape_setmotor( struct machine *oric, SDL_bool motoron ) // is at a sync header, generate a bunch of dummy // sync bytes. This makes the Oric Atmos welcome tape // work without turbo tape enabled, for example. - if( ( motoron ) && - ( oric->tapebuf ) && - ( oric->tapeoffs < oric->tapelen ) && - ( oric->tapebuf[oric->tapeoffs] == 0x16 ) ) + if((motoron) && + (oric->tapebuf) && + (oric->tapeoffs < oric->tapelen) && + (oric->tapebuf[oric->tapeoffs] == 0x16)) { tape_setup_header(oric); } @@ -268,43 +269,43 @@ void tape_setmotor( struct machine *oric, SDL_bool motoron ) // Set the new status and do a popup oric->tapemotor = motoron; - if( oric->tapename[0] ) tape_popup( oric ); + if(oric->tapename[0]) tape_popup(oric); } // Free up the current tape image -void tape_eject( struct machine *oric ) +void tape_eject(struct machine *oric) { - if( oric->tapebuf ) free( oric->tapebuf ); + if(oric->tapebuf) free(oric->tapebuf); oric->tapebuf = NULL; oric->tapelen = 0; oric->tapename[0] = 0; - tape_popup( oric ); + tape_popup(oric); refreshtape = SDL_TRUE; } -void tape_next_raw_count( struct machine *oric ) +void tape_next_raw_count(struct machine *oric) { unsigned int n; int nonrawend; - if( oric->tapeoffs >= oric->tapelen ) + if(oric->tapeoffs >= oric->tapelen) { - if( oric->nonrawend != oric->tapelen ) + if(oric->nonrawend != oric->tapelen) oric->tapehitend = 3; return; } n = oric->tapebuf[oric->tapeoffs++]; - if (n < 0xfc) + if(n < 0xfc) { oric->tapecount = n<<1; return; } - switch (n) + switch(n) { case 0xff: // non-raw section - if( oric->tapeoffs >= (oric->tapelen-1) ) + if(oric->tapeoffs >= (oric->tapelen-1)) { oric->tapeoffs = oric->tapelen; oric->tapehitend = 3; @@ -312,7 +313,7 @@ void tape_next_raw_count( struct machine *oric ) } nonrawend = ((oric->tapebuf[oric->tapeoffs]<<8)|oric->tapebuf[oric->tapeoffs+1]) + oric->tapeoffs+2; - if( nonrawend > oric->tapelen ) + if(nonrawend > oric->tapelen) { oric->tapeoffs = oric->tapelen; oric->tapehitend = 3; @@ -324,11 +325,11 @@ void tape_next_raw_count( struct machine *oric ) oric->tapebit = 0; oric->tapecount = 2; oric->tapeout = 0; - tape_setup_header( oric ); + tape_setup_header(oric); return; case 0xfc: - if( oric->tapeoffs >= oric->tapelen ) + if(oric->tapeoffs >= oric->tapelen) { oric->tapehitend = 3; return; @@ -338,7 +339,7 @@ void tape_next_raw_count( struct machine *oric ) return; case 0xfd: - if( oric->tapeoffs >= (oric->tapelen-1) ) + if(oric->tapeoffs >= (oric->tapelen-1)) { oric->tapeoffs = oric->tapelen; oric->tapehitend = 3; @@ -356,16 +357,16 @@ void tape_next_raw_count( struct machine *oric ) } // Rewind to the start of the tape -void tape_rewind( struct machine *oric ) +void tape_rewind(struct machine *oric) { oric->nonrawend = 0; - if( oric->rawtape ) + if(oric->rawtape) { oric->tapeout = oric->tapebuf[4]; - via_write_CB1( &oric->via, oric->tapeout ); + via_write_CB1(&oric->via, oric->tapeout); oric->tapeoffs = 5; - tape_next_raw_count( oric ); + tape_next_raw_count(oric); } else { @@ -375,8 +376,8 @@ void tape_rewind( struct machine *oric ) oric->tapeout = 0; oric->tapedupbytes = 0; - if( oric->tapebuf ) - tape_setup_header( oric ); + if(oric->tapebuf) + tape_setup_header(oric); } oric->tapehitend = 0; oric->tapedelay = 0; @@ -386,22 +387,22 @@ void tape_rewind( struct machine *oric ) // This is used by the "tapsections" function. It returns the next time // value from an ort buffer, or -1 for invalid (or if an existing tapsection // is found) -static int next_ort_value( unsigned char *ortdata, int *offset, int end, SDL_bool *anytapsec ) +static int next_ort_value(unsigned char* ortdata, int* offset, int end, SDL_bool *anytapsec) { int val=0, skip; - while ((*offset) < end) + while((*offset) < end) { - switch (ortdata[*offset]) + switch(ortdata[*offset]) { case 0xfc: - if ((*offset) >= (end-1)) return 0; + if((*offset) >= (end-1)) return 0; val = ortdata[(*offset)+1]; (*offset) += 2; return val; case 0xfd: - if ((*offset) >= (end-2)) return 0; + if((*offset) >= (end-2)) return 0; val = (ortdata[(*offset)+1]<<8)|ortdata[(*offset)+2]; (*offset) += 3; return val; @@ -410,10 +411,10 @@ static int next_ort_value( unsigned char *ortdata, int *offset, int end, SDL_boo return 0; case 0xff: - if ((*offset) >= (end-2)) return 0; + if((*offset) >= (end-2)) return 0; skip = (ortdata[(*offset)+1]<<8)|ortdata[(*offset)+2]; (*offset)+=3; - if ((*offset) >= (end-skip)) return 0; + if((*offset) >= (end-skip)) return 0; (*offset)+=skip; (*anytapsec) = SDL_TRUE; break; @@ -440,14 +441,14 @@ enum static int validbyte(int accum) { int i, parity = 0; - if ((accum&3)!=1) return 0; - for (i=4; i!=0x800; i<<=1) - if (accum&i) parity ^= 1; + if((accum&3)!=1) return 0; + for(i=4; i!=0x800; i<<=1) + if(accum&i) parity ^= 1; return parity; } // This converts oric standard encoded waveforms to decoded TAP sections -static int tapsections( unsigned char *ortbuf, int ortbuflen, unsigned char *scratch, SDL_bool slow ) +static int tapsections(unsigned char* ortbuf, int ortbuflen, unsigned char* scratch, SDL_bool slow) { int ort_offs, tapebit, ort_val, cyccount; int accum, state, thisbit, leaderstart=0, leadercount=0; @@ -462,20 +463,20 @@ static int tapsections( unsigned char *ortbuf, int ortbuflen, unsigned char *scr accum = 0; bitcount = 0; - for (i=0; i<20; i++) + for(i=0; i<20; i++) last_offsets[i] = 5; // Loop through the ORT data - while (ort_offs < ortbuflen) + while(ort_offs < ortbuflen) { // Shuffle the offset array - for (i=0; i<19; i++) + for(i=0; i<19; i++) last_offsets[i] = last_offsets[i+1]; last_offsets[19] = ort_offs; ort_val = next_ort_value(ortbuf, &ort_offs, ortbuflen, &anytapsec); // Invalid ORT data? - if (ort_val < 1) return ortbuflen; + if(ort_val < 1) return ortbuflen; // Count these cycles cyccount += ort_val; @@ -484,24 +485,24 @@ static int tapsections( unsigned char *ortbuf, int ortbuflen, unsigned char *scr tapebit ^= 1; // Rising edge? - if (tapebit) + if(tapebit) { // smaller than 100? filter it out - if (cyccount < 100) + if(cyccount < 100) continue; // Convert to 1/0 thisbit = TIME_TO_BIT(cyccount); // Seen a value that is outside the bounds of Oric standard encoding? - if (thisbit == -1) + if(thisbit == -1) { -// if ((state != TAPSEC_STATE_SEARCH) || (slow0s>0) || (slow1s>0)) -// { -// if (cyccount < TAPE_DECODE_1_MIN) printf("%d is too fast\n", cyccount); -// if (cyccount > TAPE_DECODE_0_MAX) printf("%d is too slow\n", cyccount); -// fflush(stdout); -// } + // if ((state != TAPSEC_STATE_SEARCH) || (slow0s>0) || (slow1s>0)) + // { + // if (cyccount < TAPE_DECODE_1_MIN) printf("%d is too fast\n", cyccount); + // if (cyccount > TAPE_DECODE_0_MAX) printf("%d is too slow\n", cyccount); + // fflush(stdout); + // } state = TAPSEC_STATE_SEARCH; cyccount = 0; accum = 0; @@ -511,16 +512,16 @@ static int tapsections( unsigned char *ortbuf, int ortbuflen, unsigned char *scr else { // Slow mode? - if (slow) + if(slow) { - if (thisbit==1) + if(thisbit==1) { slow1s++; slow0s=0; - if (slow1s != 2) + if(slow1s != 2) { - if (slow1s >= 8) + if(slow1s >= 8) slow1s = 0; cyccount=0; continue; @@ -531,9 +532,9 @@ static int tapsections( unsigned char *ortbuf, int ortbuflen, unsigned char *scr slow0s++; slow1s=0; - if (slow0s != 2) + if(slow0s != 2) { - if (slow0s >= 4) + if(slow0s >= 4) slow0s = 0; cyccount=0; continue; @@ -545,43 +546,43 @@ static int tapsections( unsigned char *ortbuf, int ortbuflen, unsigned char *scr accum = (accum>>1) | (thisbit<<10); // What are we doing? - switch (state) + switch(state) { case TAPSEC_STATE_SEARCH: // Look for 0x058 (0x16 encoded with start bit and parity) - if ((accum&0x7fe) == 0x58) + if((accum&0x7fe) == 0x58) { -// printf("Seen 0x16 @ %d\n", ort_offs); -// fflush(stdout); + // printf("Seen 0x16 @ %d\n", ort_offs); + // fflush(stdout); leaderstart = last_offsets[8]; leadercount = 1; state = TAPSEC_STATE_LEADER; bitcount = 0; } - else if (validbyte(accum)) + else if(validbyte(accum)) { -// printf("Saw %02X @ %d\n", (accum>>2)&0xff, ort_offs); -// fflush(stdout); + // printf("Saw %02X @ %d\n", (accum>>2)&0xff, ort_offs); + // fflush(stdout); } break; case TAPSEC_STATE_LEADER: bitcount = (bitcount+1)%14; - if ((bitcount==13)&&validbyte(accum)) bitcount = 0; - if (!bitcount) + if((bitcount==13)&&validbyte(accum)) bitcount = 0; + if(!bitcount) { -// printf("Byte @ %d is %03x\n", ort_offs, accum&0x7fe); -// fflush(stdout); - if ((accum&0x7fe) != 0x58) + // printf("Byte @ %d is %03x\n", ort_offs, accum&0x7fe); + // fflush(stdout); + if((accum&0x7fe) != 0x58) { -// printf("Which is NOT 0x58 :-(\n"); + // printf("Which is NOT 0x58 :-(\n"); state = TAPSEC_STATE_SEARCH; cyccount = 0; break; } leadercount++; - if (leadercount==4) + if(leadercount==4) { state = TAPSEC_STATE_FINDHEADER; break; @@ -591,15 +592,15 @@ static int tapsections( unsigned char *ortbuf, int ortbuflen, unsigned char *scr case TAPSEC_STATE_FINDHEADER: bitcount = (bitcount+1)%14; - if ((bitcount==13)&&validbyte(accum)) bitcount = 0; - if (!bitcount) + if((bitcount==13)&&validbyte(accum)) bitcount = 0; + if(!bitcount) { -// printf("Byte @ %d is %03x\n", ort_offs, accum&0x7fe); -// fflush(stdout); - if ((accum&0x7fe) == 0x490) // 0x24 fully encoded + // printf("Byte @ %d is %03x\n", ort_offs, accum&0x7fe); + // fflush(stdout); + if((accum&0x7fe) == 0x490) // 0x24 fully encoded { -// printf("At the header...\n"); -// fflush(stdout); + // printf("At the header...\n"); + // fflush(stdout); scratch[0] = 0x16; scratch[1] = 0x16; scratch[2] = 0x16; @@ -612,23 +613,23 @@ static int tapsections( unsigned char *ortbuf, int ortbuflen, unsigned char *scr case TAPSEC_STATE_HEADER: bitcount = (bitcount+1)%14; - if ((bitcount==13)&&validbyte(accum)) bitcount = 0; - if (!bitcount) + if((bitcount==13)&&validbyte(accum)) bitcount = 0; + if(!bitcount) { -// printf("Byte @ %d is %03x (%02X)\n", ort_offs, accum&0x7fe, (accum>>2)&0xff); -// fflush(stdout); + // printf("Byte @ %d is %03x (%02X)\n", ort_offs, accum&0x7fe, (accum>>2)&0xff); + // fflush(stdout); scratch[tapbytes++] = (accum>>2)&0xff; - if (tapbytes == 13) + if(tapbytes == 13) { int load_start, load_end; load_start = (scratch[10]<<8)|scratch[11]; load_end = (scratch[ 8]<<8)|scratch[ 9]; -// printf("Load start = %04X, Load end = %04X\n", load_start, load_end); -// fflush(stdout); + // printf("Load start = %04X, Load end = %04X\n", load_start, load_end); + // fflush(stdout); - if (load_end <= load_start) + if(load_end <= load_start) { state = TAPSEC_STATE_SEARCH; cyccount = 0; @@ -638,21 +639,21 @@ static int tapsections( unsigned char *ortbuf, int ortbuflen, unsigned char *scr data_bytes = (load_end-load_start)+1; state = TAPSEC_STATE_FILENAME; -// printf("Lets try and load %d bytes!\n", data_bytes); -// fflush(stdout); + // printf("Lets try and load %d bytes!\n", data_bytes); + // fflush(stdout); } } break; case TAPSEC_STATE_FILENAME: bitcount = (bitcount+1)%14; - if ((bitcount==13)&&validbyte(accum)) bitcount = 0; - if (!bitcount) + if((bitcount==13)&&validbyte(accum)) bitcount = 0; + if(!bitcount) { -// printf("Filename byte = %03x (%02x) %c\n", accum&0x7fe, (accum>>2)&0xff, (accum>>2)&0xff); -// fflush(stdout); + // printf("Filename byte = %03x (%02x) %c\n", accum&0x7fe, (accum>>2)&0xff, (accum>>2)&0xff); + // fflush(stdout); scratch[tapbytes++] = (accum>>2)&0xff; - if (scratch[tapbytes-1] == 0) + if(scratch[tapbytes-1] == 0) { state = TAPSEC_STATE_FINDDATA; } @@ -661,10 +662,10 @@ static int tapsections( unsigned char *ortbuf, int ortbuflen, unsigned char *scr case TAPSEC_STATE_FINDDATA: // Look for a valid byte (start bits, valid parity) - if (validbyte(accum)) + if(validbyte(accum)) { -// printf("Data starts @ %d\n", ort_offs); -// fflush(stdout); + // printf("Data starts @ %d\n", ort_offs); + // fflush(stdout); scratch[tapbytes++] = (accum>>2)&0xff; data_bytes--; bitcount=0; @@ -674,25 +675,25 @@ static int tapsections( unsigned char *ortbuf, int ortbuflen, unsigned char *scr case TAPSEC_STATE_DATA: bitcount = (bitcount+1)%14; - if ((bitcount==13)&&validbyte(accum)) bitcount = 0; - if (!bitcount) + if((bitcount==13)&&validbyte(accum)) bitcount = 0; + if(!bitcount) { scratch[tapbytes++] = (accum>>2)&0xff; data_bytes--; -// printf("%d to go..\n", data_bytes); -// fflush(stdout); + // printf("%d to go..\n", data_bytes); + // fflush(stdout); // ?? - if (data_bytes < 0) + if(data_bytes < 0) { state = TAPSEC_STATE_SEARCH; break; } - if (data_bytes > 0) + if(data_bytes > 0) break; - if ((!anytapsec) && (leaderstart < 512)) + if((!anytapsec) && (leaderstart < 512)) leaderstart = 5; // Got a whole standard oric tap section! @@ -708,8 +709,8 @@ static int tapsections( unsigned char *ortbuf, int ortbuflen, unsigned char *scr accum = 0; anytapsec = SDL_TRUE; -// printf("Back to scanning...\n"); -// fflush(stdout); + // printf("Back to scanning...\n"); + // fflush(stdout); } break; } @@ -726,7 +727,7 @@ static int tapsections( unsigned char *ortbuf, int ortbuflen, unsigned char *scr // file (either 8 or 16bit), and returns it as a signed value. No scaling // is performed, so it returns -128 to 127 for 8bit wavs, and -32768 to // 32767 for 16bit wavs. -static inline signed short getsmp(unsigned char *buf, SDL_bool is8bit) +static inline signed short getsmp(unsigned char* buf, SDL_bool is8bit) { return is8bit ? ((short)*buf)-128 : (short)((buf[1]<<8)|buf[0]); } @@ -736,13 +737,13 @@ static inline signed short getsmp(unsigned char *buf, SDL_bool is8bit) // any DC offset in the recording. It also calls "tapsections" to convert // any standard oric tape format waveforms it finds into non-raw "tap" // style sections to enable turbo loading of those parts. -SDL_bool wav_convert( struct machine *oric ) +SDL_bool wav_convert(struct machine *oric) { // Chunk pointers - unsigned char *p=oric->tapebuf, *data=NULL, *ortbuf=NULL; + unsigned char* p=oric->tapebuf, *data=NULL, *ortbuf=NULL; unsigned int i, j, k, l, chunklen, bps=0, freq=0, smpdelta=0, datalen=0, ortlen; signed int smaxl, sminl, smaxr, sminr, dcoffs=0, dcoffsav; - signed int *lastsmps = NULL; + signed int* lastsmps = NULL; signed short smp=0; // Cycles per sample double cps, count, pcount; @@ -750,50 +751,56 @@ SDL_bool wav_convert( struct machine *oric ) // Basic validation i = 12; - while ((!fmtseen) || (!data)) + while((!fmtseen) || (!data)) { // Run out of data? - if (i >= (oric->tapelen-8)) return SDL_FALSE; + if(i >= (oric->tapelen-8)) return SDL_FALSE; // Length of this chunk chunklen = (p[i+7]<<24)|(p[i+6]<<16)|(p[i+5]<<8)|p[i+4]; // Sane length? - if ((i+chunklen+8) > oric->tapelen) + if((i+chunklen+8) > oric->tapelen) return SDL_FALSE; // Format chunk? - if (memcmp(&p[i], "fmt ", 4) == 0) + if(memcmp(&p[i], "fmt ", 4) == 0) { // PCM? - if ((chunklen != 16) || (((p[i+9]<<8)|p[i+8])!=1)) + if((chunklen != 16) || (((p[i+9]<<8)|p[i+8])!=1)) return SDL_FALSE; // Channels - switch ((p[i+11]<<8)|(p[i+10])) + switch((p[i+11]<<8)|(p[i+10])) { - case 1: stereo = SDL_FALSE; break; - case 2: stereo = SDL_TRUE; break; - default: return SDL_FALSE; break; + case 1: + stereo = SDL_FALSE; + break; + case 2: + stereo = SDL_TRUE; + break; + default: + return SDL_FALSE; + break; } // Frequency freq = (p[i+15]<<24)|(p[i+14]<<16)|(p[i+13]<<8)|p[i+12]; - if( !freq ) return SDL_FALSE; + if(!freq) return SDL_FALSE; // Sample delta smpdelta = (p[i+21]<<16)|p[i+20]; // Bits per sample bps = (p[i+23]<<16)|p[i+22]; - if ((bps!=8)&&(bps!=16)) return SDL_FALSE; + if((bps!=8)&&(bps!=16)) return SDL_FALSE; // Bytes per sample bps /= 8; fmtseen = SDL_TRUE; } - else if (memcmp(&p[i], "data", 4) == 0) + else if(memcmp(&p[i], "data", 4) == 0) { data = &p[i+8]; datalen = chunklen; @@ -803,29 +810,29 @@ SDL_bool wav_convert( struct machine *oric ) i += chunklen+8; } -// printf("wavsize = %d\n", datalen); + // printf("wavsize = %d\n", datalen); smaxl = -70000; sminl = 70000; smaxr = -70000; sminr = 70000; - for (i=0; i smaxl) smaxl = smp; + if(smp < sminl) sminl = smp; + if(smp > smaxl) smaxl = smp; - if (stereo) + if(stereo) { smp = getsmp(&data[i+bps], bps==1); - if (smp < sminr) sminr = smp; - if (smp > smaxr) smaxr = smp; + if(smp < sminr) sminr = smp; + if(smp > smaxr) smaxr = smp; } } // Use the loudest channel - if ((stereo) && ((smaxr-sminr)>(smaxl-sminl))) + if((stereo) && ((smaxr-sminr)>(smaxl-sminl))) { useright = SDL_TRUE; } @@ -835,49 +842,49 @@ SDL_bool wav_convert( struct machine *oric ) } dcoffsav = freq / 700; - if (dcoffsav) + if(dcoffsav) { lastsmps = malloc(dcoffsav * sizeof(int)); - if (lastsmps) memset(lastsmps, 0, dcoffsav * sizeof(int)); + if(lastsmps) memset(lastsmps, 0, dcoffsav * sizeof(int)); } dcoffsav--; // Now convert to a 1/0 squarewave j = 0; - for (i=0; i smaxl) smaxl = lastsmps[k]; + if(lastsmps[k] < sminl) sminl = lastsmps[k]; + if(lastsmps[k] > smaxl) smaxl = lastsmps[k]; } dcoffs = ((smaxl-sminl)/2)+sminl; } - if (j >= oric->tapelen) + if(j >= oric->tapelen) { -// printf("Oh dear\n"); -// fflush(stdout); + // printf("Oh dear\n"); + // fflush(stdout); break; } oric->tapebuf[j++] = (smp>dcoffs) ? 1 : 0; } -// printf("ortsize = %d\n", j); -// fflush(stdout); + // printf("ortsize = %d\n", j); + // fflush(stdout); // Calculate cycles per sample cps = 500000 / ((double)freq); // .ORT is 500khz @@ -887,24 +894,24 @@ SDL_bool wav_convert( struct machine *oric ) i = oric->tapebuf[0]; count = 0.0f; pcount = 0.0f; - for (k=1; ktapebuf[k] != i) + if(oric->tapebuf[k] != i) { i = oric->tapebuf[k]; - if (((int)count) < 1) + if(((int)count) < 1) { // Just a spike? - if (ortlen>5) ortlen--; + if(ortlen>5) ortlen--; count += pcount; } - else if (((int)count) < 0xfc) + else if(((int)count) < 0xfc) { ortlen++; pcount = count; count = 0.0f; } - else if (((int)count) < 0x100) + else if(((int)count) < 0x100) { ortlen+=2; pcount = count; @@ -920,10 +927,10 @@ SDL_bool wav_convert( struct machine *oric ) count+=cps; } - free( lastsmps ); + free(lastsmps); // Allocate a buffer for the converted data ortbuf = malloc(ortlen); - if (!ortbuf) return SDL_FALSE; + if(!ortbuf) return SDL_FALSE; // Write the header memcpy(ortbuf, "ORT\0", 4); @@ -934,27 +941,27 @@ SDL_bool wav_convert( struct machine *oric ) count = 0.0f; pcount = 0.0f; l = 5; - for (k=1; ktapebuf[k] != i) + if(oric->tapebuf[k] != i) { i = oric->tapebuf[k]; - if (((int)count) < 1) + if(((int)count) < 1) { // Just a spike. Cancel the last swap. - if (l==5) + if(l==5) ortbuf[4] = i; else l--; count += pcount; } - else if (((int)count) < 0xfc) + else if(((int)count) < 0xfc) { ortbuf[l++] = count; pcount = count; count = 0.0f; } - else if (((int)count) < 0x100) + else if(((int)count) < 0x100) { ortbuf[l++] = 0xfc; ortbuf[l++] = count; @@ -987,67 +994,67 @@ SDL_bool wav_convert( struct machine *oric ) } // Insert a new tape image -SDL_bool tape_load_tap( struct machine *oric, char *fname ) +SDL_bool tape_load_tap(struct machine *oric, char* fname) { FILE *f; // First make sure the image file exists - f = fopen( fname, "rb" ); - if( !f ) return SDL_FALSE; + f = fopen(fname, "rb"); + if(!f) return SDL_FALSE; // Eject any old image - tape_eject( oric ); + tape_eject(oric); // Get the image size - fseek( f, 0, SEEK_END ); - oric->tapelen = (int)ftell( f ); - fseek( f, 0, SEEK_SET ); + fseek(f, 0, SEEK_END); + oric->tapelen = (int)ftell(f); + fseek(f, 0, SEEK_SET); - if( oric->tapelen <= 4 ) // Even worth loading it? + if(oric->tapelen <= 4) // Even worth loading it? { - fclose( f ); + fclose(f); return SDL_FALSE; } // Allocate memory for the tape image and read it in - oric->tapebuf = malloc( oric->tapelen+1 ); - if( !oric->tapebuf ) + oric->tapebuf = malloc(oric->tapelen+1); + if(!oric->tapebuf) { - fclose( f ); + fclose(f); oric->tapelen = 0; return SDL_FALSE; } - if( fread( &oric->tapebuf[0], oric->tapelen, 1, f ) != 1 ) + if(fread(&oric->tapebuf[0], oric->tapelen, 1, f) != 1) { - fclose( f ); - tape_eject( oric ); + fclose(f); + tape_eject(oric); return SDL_FALSE; } - fclose( f ); + fclose(f); // WAV - if ((oric->tapelen >= 36) && + if((oric->tapelen >= 36) && (memcmp(oric->tapebuf, "RIFF", 4) == 0) && (memcmp(oric->tapebuf+8, "WAVE", 4) == 0)) { - if (!wav_convert( oric )) + if(!wav_convert(oric)) { - msgbox( oric, MSGBOX_OK, "Invalid wav file" ); - tape_eject( oric ); + msgbox(oric, MSGBOX_OK, "Invalid wav file"); + tape_eject(oric); return SDL_FALSE; } oric->rawtape = SDL_TRUE; } // ORT - else if (memcmp(oric->tapebuf, "ORT\0", 4) == 0) + else if(memcmp(oric->tapebuf, "ORT\0", 4) == 0) { oric->rawtape = SDL_TRUE; } // TAP - else if (memcmp(oric->tapebuf, "\x16\x16\x16", 3) == 0) + else if(memcmp(oric->tapebuf, "\x16\x16\x16", 3) == 0) { oric->rawtape = SDL_FALSE; @@ -1058,92 +1065,95 @@ SDL_bool tape_load_tap( struct machine *oric, char *fname ) // ??? else { - tape_eject( oric ); - msgbox( oric, MSGBOX_OK, "Unrecognised tape format" ); + tape_eject(oric); + msgbox(oric, MSGBOX_OK, "Unrecognised tape format"); return SDL_FALSE; } // Rewind the tape - tape_rewind( oric ); + tape_rewind(oric); // Make a displayable version of the image filename - if( strlen( fname ) > 31 ) + if(strlen(fname) > 31) { - strncpy( oric->tapename, &fname[strlen(fname)-31], 32 ); + strncpy(oric->tapename, &fname[strlen(fname)-31], 32); oric->tapename[0] = 22; - } else { - strncpy( oric->tapename, fname, 32 ); + } + else + { + strncpy(oric->tapename, fname, 32); } oric->tapename[31] = 0; // Show it in the popup - tape_popup( oric ); + tape_popup(oric); return SDL_TRUE; } -void tape_autoinsert( struct machine *oric ) +void tape_autoinsert(struct machine *oric) { - char *odir; + char* odir; int i; SDL_bool tape_found; - if( strncmp( (char *)&oric->mem[oric->pch_fd_getname_addr], oric->lasttapefile, 16 ) == 0 ) + if(strncmp((char*)&oric->mem[oric->pch_fd_getname_addr], oric->lasttapefile, 16) == 0) oric->mem[oric->pch_fd_getname_addr] = 0; // Try and load the tape image - strcpy( tapefile, oric->lasttapefile ); + strcpy(tapefile, oric->lasttapefile); i = (int)strlen(tapefile); - odir = getcwd( NULL, 0 ); - chdir( tapepath ); - tape_found = tape_load_tap( oric, tapefile ); - if( !tape_found ) + odir = getcwd(NULL, 0); + chdir(tapepath); + tape_found = tape_load_tap(oric, tapefile); + if(!tape_found) { // Try appending .tap - strcpy( &tapefile[i], ".tap" ); - tape_found = tape_load_tap( oric, tapefile ); + strcpy(&tapefile[i], ".tap"); + tape_found = tape_load_tap(oric, tapefile); } - if( !tape_found ) + if(!tape_found) { // Try appending .ort - strcpy( &tapefile[i], ".ort" ); - tape_load_tap( oric, tapefile ); + strcpy(&tapefile[i], ".ort"); + tape_load_tap(oric, tapefile); } - if( oric->tapebuf ) + if(oric->tapebuf) { // We already inserted this one. Don't re-insert it when we get to the end. */ oric->lasttapefile[0] = 0; } - chdir( odir ); - free( odir ); + chdir(odir); + free(odir); } -void tape_stop_savepatch( struct machine *oric ) +void tape_stop_savepatch(struct machine *oric) { - if( !oric->tsavf ) return; + if(!oric->tsavf) return; - if( oric->tsavf == oric->tapecap ) + if(oric->tsavf == oric->tapecap) { unsigned char bufdata[2]; - fseek( oric->tsavf, oric->tapecapsavoffs, SEEK_SET ); + fseek(oric->tsavf, oric->tapecapsavoffs, SEEK_SET); bufdata[0] = (oric->tapecapsavbytes>>8)&0xff; bufdata[1] = oric->tapecapsavbytes&0xff; - fwrite( bufdata, 2, 1, oric->tsavf ); + fwrite(bufdata, 2, 1, oric->tsavf); oric->tapecapsavoffs = 0; oric->tapecapsavbytes = 0; } else { - fclose( oric->tsavf ); + fclose(oric->tsavf); #ifdef WWW // sync from memory state to persisted EM_ASM( - FS.syncfs(function (err) { - assert(!err); - }); + FS.syncfs(function(err) + { + assert(!err); + }); ); #endif } @@ -1152,185 +1162,185 @@ void tape_stop_savepatch( struct machine *oric ) } // Do the tape patches (must be done after every m6502 setcycles) -void tape_patches( struct machine *oric ) +void tape_patches(struct machine *oric) { Sint32 i, j; - setromon( oric) ; + setromon(oric) ; - if( oric->romon ) + if(oric->romon) { - if( oric->pch_fd_available ) + if(oric->pch_fd_available) { // Patch CLOAD to insert a tape image specified. // Unfortunately the way the ROM works means we // only have up to 16 chars. - if( ( oric->cpu.calcpc == oric->pch_fd_cload_getname_pc ) || - ( oric->cpu.calcpc == oric->pch_fd_recall_getname_pc ) ) + if((oric->cpu.calcpc == oric->pch_fd_cload_getname_pc) || + (oric->cpu.calcpc == oric->pch_fd_recall_getname_pc)) { // Read in the filename from RAM - for( i=0; i<16; i++ ) + for(i=0; i<16; i++) { - j = oric->cpu.read( &oric->cpu, oric->pch_fd_getname_addr+i ); - if( !j ) break; + j = oric->cpu.read(&oric->cpu, oric->pch_fd_getname_addr+i); + if(!j) break; oric->lasttapefile[i] = j; } oric->lasttapefile[i] = 0; - if( ( oric->cpu.read( &oric->cpu, oric->pch_fd_getname_addr ) != 0 ) && - ( oric->autoinsert ) ) + if((oric->cpu.read(&oric->cpu, oric->pch_fd_getname_addr) != 0) && + (oric->autoinsert)) { // Only do this if there is no tape inserted, or we're at the // end of the current tape, or the filename ends in .TAP, .ORT or .WAV - if( ( !oric->tapebuf ) || - ( oric->tapeoffs >= oric->tapelen -1 ) || - ( ( i > 3 ) && ( strcasecmp( &oric->lasttapefile[i-4], ".tap" ) == 0 ) ) || - ( ( i > 3 ) && ( strcasecmp( &oric->lasttapefile[i-4], ".ort" ) == 0 ) ) || - ( ( i > 3 ) && ( strcasecmp( &oric->lasttapefile[i-4], ".wav" ) == 0 ) ) ) + if((!oric->tapebuf) || + (oric->tapeoffs >= oric->tapelen -1) || + ((i > 3) && (strcasecmp(&oric->lasttapefile[i-4], ".tap") == 0)) || + ((i > 3) && (strcasecmp(&oric->lasttapefile[i-4], ".ort") == 0)) || + ((i > 3) && (strcasecmp(&oric->lasttapefile[i-4], ".wav") == 0))) { - tape_autoinsert( oric ); - oric->cpu.write( &oric->cpu, oric->pch_fd_getname_addr, 0 ); + tape_autoinsert(oric); + oric->cpu.write(&oric->cpu, oric->pch_fd_getname_addr, 0); } } } - else if( ( ( oric->cpu.calcpc == oric->pch_fd_csave_getname_pc ) || - ( oric->cpu.calcpc == oric->pch_fd_store_getname_pc ) ) && - ( ( !oric->tapecap ) || ( oric->tapeturbo ) ) ) + else if(((oric->cpu.calcpc == oric->pch_fd_csave_getname_pc) || + (oric->cpu.calcpc == oric->pch_fd_store_getname_pc)) && + ((!oric->tapecap) || (oric->tapeturbo))) { // Did we miss the end of a previous one? - if( oric->tsavf ) - tape_stop_savepatch( oric ); + if(oric->tsavf) + tape_stop_savepatch(oric); // If we're doing tape capture, we can just use that - if( oric->tapecap ) + if(oric->tapecap) { oric->tsavf = oric->tapecap; - if( oric->tapecapcount < 0 ) - fputc( 0, oric->tapecap ); - fputc( 0xff, oric->tapecap ); + if(oric->tapecapcount < 0) + fputc(0, oric->tapecap); + fputc(0xff, oric->tapecap); oric->tapecapsavoffs = (int)ftell(oric->tapecap); - fputc( 0x00, oric->tapecap ); - fputc( 0x00, oric->tapecap ); + fputc(0x00, oric->tapecap); + fputc(0x00, oric->tapecap); oric->tapecapsavbytes = 0; } else { - char *odir = NULL; + char* odir = NULL; // Read in the filename from RAM - for( i=0; i<16; i++ ) + for(i=0; i<16; i++) { - j = oric->cpu.read( &oric->cpu, oric->pch_fd_getname_addr+i ); - if( !j ) break; + j = oric->cpu.read(&oric->cpu, oric->pch_fd_getname_addr+i); + if(!j) break; tmptapename[i] = j; } tmptapename[i] = 0; // If no name, prompt for one - if( tmptapename[0] == 0 ) + if(tmptapename[0] == 0) { - if( !filerequester( oric, "Save to tape", tapepath, tmptapename, FR_TAPESAVETAP ) ) + if(!filerequester(oric, "Save to tape", tapepath, tmptapename, FR_TAPESAVETAP)) tmptapename[0] = 0; } // If there is one, append .TAP - if( tmptapename[0] ) + if(tmptapename[0]) { - if( (strlen(tmptapename) < 4) || (strcasecmp(&tmptapename[strlen(tmptapename)-4], ".tap") != 0) ) + if((strlen(tmptapename) < 4) || (strcasecmp(&tmptapename[strlen(tmptapename)-4], ".tap") != 0)) { - if (strlen(tmptapename)+5tsavf = fopen(tmptapename, "wb"); - chdir( odir ); - free( odir ); + chdir(odir); + free(odir); } } } - else if( ( oric->cpu.calcpc == oric->pch_tt_csave_end_pc ) || - ( oric->cpu.calcpc == oric->pch_tt_store_end_pc ) ) + else if((oric->cpu.calcpc == oric->pch_tt_csave_end_pc) || + (oric->cpu.calcpc == oric->pch_tt_store_end_pc)) { SDL_bool justtap = (oric->tsavf != oric->tapecap); - tape_stop_savepatch( oric ); - if( justtap ) + tape_stop_savepatch(oric); + if(justtap) { // filetmp defined in gui.c as filetmp[4096+512+4] - snprintf( filetmp, 4096+512+4-1, "\x0f\x10 Saved to %s", tmptapename ); + snprintf(filetmp, 4096+512+4-1, "\x0f\x10 Saved to %s", tmptapename); filetmp[31] = 0; - if (strlen(tmptapename) > 20) + if(strlen(tmptapename) > 20) { filetmp[30] = '\x16'; } - do_popup( oric, filetmp ); + do_popup(oric, filetmp); } tmptapename[0] = 0; } } - if( ( oric->pch_tt_save_available ) && ( ( !oric->tapecap ) || ( oric->tapeturbo ) ) ) + if((oric->pch_tt_save_available) && ((!oric->tapecap) || (oric->tapeturbo))) { - if( oric->cpu.calcpc == oric->pch_tt_putbyte_pc ) + if(oric->cpu.calcpc == oric->pch_tt_putbyte_pc) { - if( oric->tsavf ) + if(oric->tsavf) { - fputc( oric->cpu.a, oric->tsavf ); - if( oric->tsavf == oric->tapecap ) + fputc(oric->cpu.a, oric->tsavf); + if(oric->tsavf == oric->tapecap) oric->tapecapsavbytes++; } oric->cpu.calcpc = oric->pch_tt_putbyte_end_pc; - oric->cpu.calcop = oric->cpu.read( &oric->cpu, oric->cpu.calcpc ); + oric->cpu.calcop = oric->cpu.read(&oric->cpu, oric->cpu.calcpc); } - else if( oric->cpu.calcpc == oric->pch_tt_writeleader_pc ) + else if(oric->cpu.calcpc == oric->pch_tt_writeleader_pc) { - if( oric->tsavf ) + if(oric->tsavf) { unsigned char leader[] = { 0x16, 0x16, 0x16, 0x16 }; - fwrite( leader, 4, 1, oric->tsavf ); - if( oric->tsavf == oric->tapecap ) + fwrite(leader, 4, 1, oric->tsavf); + if(oric->tsavf == oric->tapecap) oric->tapecapsavbytes += 4; } oric->cpu.calcpc = oric->pch_tt_writeleader_end_pc; - oric->cpu.calcop = oric->cpu.read( &oric->cpu, oric->cpu.calcpc ); + oric->cpu.calcop = oric->cpu.read(&oric->cpu, oric->cpu.calcpc); } } } -// Only do turbotape past this point! + // Only do turbotape past this point! // No tape? Motor off? - if( ( !oric->tapebuf ) || ( !oric->tapemotor ) ) + if((!oric->tapebuf) || (!oric->tapemotor)) { - if( ( oric->pch_tt_available ) && ( oric->tapeturbo ) && ( oric->romon ) && ( oric->cpu.calcpc == oric->pch_tt_getsync_pc ) ) + if((oric->pch_tt_available) && (oric->tapeturbo) && (oric->romon) && (oric->cpu.calcpc == oric->pch_tt_getsync_pc)) oric->tapeturbo_syncstack = oric->cpu.sp; return; } - if( ( oric->tapeturbo_forceoff ) && ( oric->pch_tt_available ) && ( oric->romon ) && ( oric->cpu.calcpc == oric->pch_tt_getsync_end_pc ) ) + if((oric->tapeturbo_forceoff) && (oric->pch_tt_available) && (oric->romon) && (oric->cpu.calcpc == oric->pch_tt_getsync_end_pc)) oric->tapeturbo_forceoff = SDL_FALSE; // Don't do turbotape if we have a raw tape // Turbotape can't work with rawtape. TODO: Auto enable warpspeed when CLOADing/CSAVEing rawtape - if(( oric->rawtape ) && ( oric->tapeoffs >= oric->nonrawend )) return; + if((oric->rawtape) && (oric->tapeoffs >= oric->nonrawend)) return; - if(( !oric->tapebuf ) || ( oric->tapeoffs >= oric->tapelen )) return; + if((!oric->tapebuf) || (oric->tapeoffs >= oric->tapelen)) return; // Maybe do turbotape - if( ( oric->pch_tt_available ) && ( oric->tapeturbo ) && ( !oric->tapeturbo_forceoff ) && ( oric->romon ) ) + if((oric->pch_tt_available) && (oric->tapeturbo) && (!oric->tapeturbo_forceoff) && (oric->romon)) { SDL_bool dosyncpatch; dosyncpatch = SDL_FALSE; - if( oric->cpu.calcpc == oric->pch_tt_getsync_loop_pc ) + if(oric->cpu.calcpc == oric->pch_tt_getsync_loop_pc) { // Cassette sync was called when there was no valid // tape to sync, so the normal cassette sync hack failed @@ -1339,7 +1349,7 @@ void tape_patches( struct machine *oric ) // sync routine. // Did we spot the entry into the cassette sync routine? - if( oric->tapeturbo_syncstack == -1 ) + if(oric->tapeturbo_syncstack == -1) { // No. Give up. oric->tapeturbo_forceoff = SDL_TRUE; @@ -1352,10 +1362,10 @@ void tape_patches( struct machine *oric ) dosyncpatch = SDL_TRUE; } - if( ( oric->cpu.calcpc == oric->pch_tt_getsync_pc ) || ( dosyncpatch ) ) + if((oric->cpu.calcpc == oric->pch_tt_getsync_pc) || (dosyncpatch)) { // Currently at a sync byte? - if( oric->tapebuf[oric->tapeoffs] != 0x16 ) + if(oric->tapebuf[oric->tapeoffs] != 0x16) { // Find the next sync byte do @@ -1363,12 +1373,13 @@ void tape_patches( struct machine *oric ) oric->tapeoffs++; // Give up at end of image - if( oric->tapeoffs >= oric->tapelen ) + if(oric->tapeoffs >= oric->tapelen) { refreshtape = SDL_TRUE; return; } - } while( oric->tapebuf[oric->tapeoffs] != 0x16 ); + } + while(oric->tapebuf[oric->tapeoffs] != 0x16); } // "Jump" to the end of the cassette sync routine @@ -1377,7 +1388,7 @@ void tape_patches( struct machine *oric ) return; } - if( oric->cpu.calcpc == oric->pch_tt_readbyte_pc ) + if(oric->cpu.calcpc == oric->pch_tt_readbyte_pc) { // Read the next byte directly into A oric->cpu.a = oric->tapebuf[oric->tapeoffs++]; @@ -1387,22 +1398,22 @@ void tape_patches( struct machine *oric ) oric->cpu.f_c = oric->pch_tt_readbyte_setcarry ? 1 : 0; // Simulate the effects of the read byte routine - if( oric->pch_tt_readbyte_storebyte_addr != -1 ) oric->cpu.write( &oric->cpu, oric->pch_tt_readbyte_storebyte_addr, oric->cpu.a ); - if( oric->pch_tt_readbyte_storezero_addr != -1 ) oric->cpu.write( &oric->cpu, oric->pch_tt_readbyte_storezero_addr, 0x00 ); + if(oric->pch_tt_readbyte_storebyte_addr != -1) oric->cpu.write(&oric->cpu, oric->pch_tt_readbyte_storebyte_addr, oric->cpu.a); + if(oric->pch_tt_readbyte_storezero_addr != -1) oric->cpu.write(&oric->cpu, oric->pch_tt_readbyte_storezero_addr, 0x00); // Jump to the end of the read byte routine oric->cpu.calcpc = oric->pch_tt_readbyte_end_pc; - oric->cpu.calcop = oric->cpu.read( &oric->cpu, oric->cpu.calcpc ); - if( oric->tapeoffs >= oric->tapelen ) refreshtape = SDL_TRUE; + oric->cpu.calcop = oric->cpu.read(&oric->cpu, oric->cpu.calcpc); + if(oric->tapeoffs >= oric->tapelen) refreshtape = SDL_TRUE; } } } // Emulate the specified cpu-cycles time for the tape -void tape_ticktock( struct machine *oric, int cycles ) +void tape_ticktock(struct machine *oric, int cycles) { // Update the counter since last PB7 toggle - if( ( oric->tapecap ) && ( oric->tapecapcount != -1 ) ) + if((oric->tapecap) && (oric->tapecapcount != -1)) oric->tapecapcount += cycles; // The VSync hack is triggered in the video emulation @@ -1415,46 +1426,46 @@ void tape_ticktock( struct machine *oric, int cycles ) // If the VSync hack is active, we pull CB1 low // while the above counter is active and it's value // is less 260. - if( oric->vsynchack ) + if(oric->vsynchack) { unsigned char j = (0 == oric->vsync || 260 < oric->vsync); - if( oric->via.cb1 != j ) - via_write_CB1( &oric->via, j ); + if(oric->via.cb1 != j) + via_write_CB1(&oric->via, j); } - if( oric->vsync > 0 ) + if(oric->vsync > 0) { oric->vsync -= cycles; - if( oric->vsync < 0 ) + if(oric->vsync < 0) oric->vsync = 0; } // No tape? Motor off? - if( ( !oric->tapebuf ) || ( !oric->tapemotor ) ) + if((!oric->tapebuf) || (!oric->tapemotor)) return; // Tape offset outside the tape image limits? - if( ( oric->tapeoffs < 0 ) || ( oric->tapeoffs >= oric->tapelen ) ) + if((oric->tapeoffs < 0) || (oric->tapeoffs >= oric->tapelen)) { - if( oric->tapehitend > 2 ) + if(oric->tapehitend > 2) { // Try to autoinsert a tape image - if( ( oric->lasttapefile[0] ) && ( oric->autoinsert ) ) + if((oric->lasttapefile[0]) && (oric->autoinsert)) { - tape_autoinsert( oric ); + tape_autoinsert(oric); oric->lasttapefile[0] = 0; } } } // Abort if turbotape is on - if( ( oric->pch_tt_available ) && ( oric->tapeturbo ) && ( !oric->tapeturbo_forceoff ) && ( oric->romon ) && ( !oric->rawtape ) ) + if((oric->pch_tt_available) && (oric->tapeturbo) && (!oric->tapeturbo_forceoff) && (oric->romon) && (!oric->rawtape)) return; - if( oric->tapehitend > 2 ) + if(oric->tapehitend > 2) return; - if( ( oric->tapehdrend != 0 ) && ( oric->tapeoffs == oric->tapehdrend ) ) + if((oric->tapehdrend != 0) && (oric->tapeoffs == oric->tapehdrend)) { oric->tapedelay = 1281; oric->tapehdrend = 0; @@ -1462,13 +1473,13 @@ void tape_ticktock( struct machine *oric, int cycles ) // No turbotape. Do "real" tape emulation. // Count down the cycle counter - if( oric->tapecount > cycles ) + if(oric->tapecount > cycles) { oric->tapecount -= cycles; - if( oric->tapedelay > 0 ) + if(oric->tapedelay > 0) { oric->tapedelay -= cycles; - if( oric->tapedelay < 0 ) + if(oric->tapedelay < 0) oric->tapedelay = 1; } return; @@ -1476,18 +1487,18 @@ void tape_ticktock( struct machine *oric, int cycles ) // Toggle the tape input oric->tapeout ^= 1; - if( !oric->vsynchack ) + if(!oric->vsynchack) { // Update the audio if tape noise is enabled - if( oric->tapenoise ) + if(oric->tapenoise) { - ay_lockaudio( &oric->ay ); // Gets unlocked at the end of each frame - if( oric->ay.do_logcycle_reset ) + ay_lockaudio(&oric->ay); // Gets unlocked at the end of each frame + if(oric->ay.do_logcycle_reset) { oric->ay.logcycle = oric->ay.newlogcycle; oric->ay.do_logcycle_reset = SDL_FALSE; } - if( oric->ay.tlogged < TAPELOG_SIZE ) + if(oric->ay.tlogged < TAPELOG_SIZE) { oric->ay.tapelog[oric->ay.tlogged ].cycle = oric->ay.logcycle; oric->ay.tapelog[oric->ay.tlogged++].val = oric->tapeout; @@ -1495,15 +1506,15 @@ void tape_ticktock( struct machine *oric, int cycles ) } // Put tape signal onto CB1 - via_write_CB1( &oric->via, oric->tapeout ); + via_write_CB1(&oric->via, oric->tapeout); } - if( oric->tapedelay > 0 ) + if(oric->tapedelay > 0) { oric->tapedelay -= cycles; - if( oric->tapedelay <= 0) + if(oric->tapedelay <= 0) { - if( oric->tapebit == 1 ) + if(oric->tapebit == 1) oric->tapedelay = 1; else oric->tapedelay = 0; @@ -1512,12 +1523,16 @@ void tape_ticktock( struct machine *oric, int cycles ) return; } - if( oric->tapeoffs >= oric->tapelen ) + if(oric->tapeoffs >= oric->tapelen) { - switch( oric->tapehitend ) + switch(oric->tapehitend) { - case 0: oric->tapecount = TAPE_1_PULSE; break; - case 1: oric->tapecount = 0x36*2; break; + case 0: + oric->tapecount = TAPE_1_PULSE; + break; + case 1: + oric->tapecount = 0x36*2; + break; } oric->tapehitend++; refreshtape = SDL_TRUE; @@ -1525,13 +1540,13 @@ void tape_ticktock( struct machine *oric, int cycles ) } // Raw tape - if( oric->rawtape ) + if(oric->rawtape) { // In a non-raw section? - if( oric->tapeoffs >= oric->nonrawend ) + if(oric->tapeoffs >= oric->nonrawend) { - tape_next_raw_count( oric ); - if( oric->tapehitend > 2 ) + tape_next_raw_count(oric); + if(oric->tapehitend > 2) refreshtape = SDL_TRUE; return; } @@ -1539,9 +1554,9 @@ void tape_ticktock( struct machine *oric, int cycles ) // .TAP real tape simulation // Tape signal rising edge - if( oric->tapeout ) + if(oric->tapeout) { - switch( oric->tapebit ) + switch(oric->tapebit) { case 0: // Start of a new byte. Send a 1 pulse oric->tapetime = TAPE_1_PULSE; @@ -1553,17 +1568,19 @@ void tape_ticktock( struct machine *oric, int cycles ) break; default: // For bit numbers 2 to 9, send actual byte bits 0 to 7 - if( oric->tapebuf[oric->tapeoffs]&(1<<(oric->tapebit-2)) ) + if(oric->tapebuf[oric->tapeoffs]&(1<<(oric->tapebit-2))) { oric->tapetime = TAPE_1_PULSE; oric->tapeparity ^= 1; - } else { + } + else + { oric->tapetime = TAPE_0_PULSE; } break; case 10: // Then a parity bit - if( oric->tapeparity ) + if(oric->tapeparity) oric->tapetime = TAPE_1_PULSE; else oric->tapetime = TAPE_0_PULSE; @@ -1578,9 +1595,9 @@ void tape_ticktock( struct machine *oric, int cycles ) // Move on to the next bit oric->tapebit = (oric->tapebit+1)%14; - if( !oric->tapebit ) + if(!oric->tapebit) { - if( oric->tapedupbytes > 0 ) + if(oric->tapedupbytes > 0) oric->tapedupbytes--; else oric->tapeoffs++; diff --git a/tape.h b/tape.h index 13ac6571..c656c92d 100644 --- a/tape.h +++ b/tape.h @@ -28,12 +28,12 @@ #define TIME_TO_BIT(t) ((tvid_textattrs & 1 ) + if(oric->vid_textattrs & 1) { oric->vid_ch_data = &oric->vid_ch_base[128*8]; - } else { + } + else + { oric->vid_ch_data = oric->vid_ch_base; } } // Decode an oric video attribute -static inline void ula_decode_attr( struct machine *oric, int attr, int y ) +static inline void ula_decode_attr(struct machine *oric, int attr, int y) { - switch( attr & 0x18 ) + switch(attr & 0x18) { case 0x00: // Foreground colour oric->vid_fg_col = attr & 0x07; @@ -64,8 +66,8 @@ static inline void ula_decode_attr( struct machine *oric, int attr, int y ) case 0x08: // Text attribute oric->vid_textattrs = attr & 0x07; oric->vid_blinkmask = attr & 0x04 ? 0x00 : 0x3f; - ula_refresh_charset( oric ); - if( oric->vid_textattrs & 0x02 ) + ula_refresh_charset(oric); + if(oric->vid_textattrs & 0x02) oric->vid_chline = (y>>1) & 0x07; else oric->vid_chline = y & 0x07; @@ -81,21 +83,23 @@ static inline void ula_decode_attr( struct machine *oric, int attr, int y ) oric->vid_mode = attr & 0x07; // Set up pointers for new mode - if( oric->vid_mode & 4 ) + if(oric->vid_mode & 4) { oric->vid_addr = oric->vidbases[0]; oric->vid_ch_base = &oric->mem[oric->vidbases[1]]; - } else { + } + else + { oric->vid_addr = oric->vidbases[2]; oric->vid_ch_base = &oric->mem[oric->vidbases[3]]; } - ula_refresh_charset( oric ); + ula_refresh_charset(oric); break; } } -static inline void ula_raster_default( struct machine *oric ) +static inline void ula_raster_default(struct machine *oric) { oric->vid_fg_col = 7; oric->vid_textattrs = 0; @@ -103,20 +107,20 @@ static inline void ula_raster_default( struct machine *oric ) oric->vid_bg_col = 0; oric->vid_bitptr = (Uint16 *)(&bittab[(oric->vid_fg_col<<12) | (oric->vid_bg_col<<9)]); oric->vid_inv_bitptr = (Uint16 *)(&bittab[((oric->vid_fg_col^7)<<12) | ((oric->vid_bg_col^7)<<9)]); - ula_refresh_charset( oric ); + ula_refresh_charset(oric); } -void ula_powerup_default( struct machine *oric ) +void ula_powerup_default(struct machine *oric) { - ula_decode_attr( oric, 0x1a, 0 ); + ula_decode_attr(oric, 0x1a, 0); } // Render a 6x1 block -static void ula_render_block( struct machine *oric, SDL_bool inverted, int data, int y ) +static void ula_render_block(struct machine *oric, SDL_bool inverted, int data, int y) { Uint16 *ptr; - if( inverted ) + if(inverted) { ptr = oric->vid_inv_bitptr + (data<<2); } @@ -125,17 +129,20 @@ static void ula_render_block( struct machine *oric, SDL_bool inverted, int data, ptr = oric->vid_bitptr + (data<<2); } - *((Uint16 *)oric->scrpt) = *(ptr++); oric->scrpt+=2; - *((Uint16 *)oric->scrpt) = *(ptr++); oric->scrpt+=2; - *((Uint16 *)oric->scrpt) = *(ptr++); oric->scrpt+=2; + *((Uint16 *)oric->scrpt) = *(ptr++); + oric->scrpt+=2; + *((Uint16 *)oric->scrpt) = *(ptr++); + oric->scrpt+=2; + *((Uint16 *)oric->scrpt) = *(ptr++); + oric->scrpt+=2; } -static void ula_render_block_checkdirty( struct machine *oric, SDL_bool inverted, int data, int y ) +static void ula_render_block_checkdirty(struct machine *oric, SDL_bool inverted, int data, int y) { Uint16 *ptr; int i; - if( inverted ) + if(inverted) { ptr = oric->vid_inv_bitptr + (data<<2); } @@ -144,9 +151,9 @@ static void ula_render_block_checkdirty( struct machine *oric, SDL_bool inverted ptr = oric->vid_bitptr + (data<<2); } - for( i=0; i<3; i++) + for(i=0; i<3; i++) { - if (*((Uint16 *)oric->scrpt) != *ptr) + if(*((Uint16 *)oric->scrpt) != *ptr) { *((Uint16 *)oric->scrpt) = *ptr; oric->vid_dirty[y] = SDL_TRUE; @@ -158,7 +165,7 @@ static void ula_render_block_checkdirty( struct machine *oric, SDL_bool inverted } // Render current screen (used by the monitor) -void ula_renderscreen( struct machine *oric ) +void ula_renderscreen(struct machine *oric) { Uint8 *scrpt, *rptr; int b, y, c, cy, bitmask; @@ -166,68 +173,80 @@ void ula_renderscreen( struct machine *oric ) scrpt = oric->scrpt; oric->scrpt = oric->scr; - for( y=0; y<224; y++) + for(y=0; y<224; y++) { cy = (y>>3) * 40; // Always start each scanline with white on black - ula_raster_default( oric ); + ula_raster_default(oric); oric->vid_chline = y & 0x07; - if( y < 200 ) + if(y < 200) { - if( oric->vid_mode & 0x04 ) // HIRES? + if(oric->vid_mode & 0x04) // HIRES? { hires = SDL_TRUE; rptr = &oric->mem[oric->vid_addr + y*40 -1]; - } else { + } + else + { hires = SDL_FALSE; rptr = &oric->mem[oric->vid_addr + cy -1]; } - } else { + } + else + { hires = SDL_FALSE; rptr = &oric->mem[oric->vidbases[2] + cy -1]; // bb80 = bf68 - (200/8*40) } bitmask = (oric->frames&0x10)?0x3f:oric->vid_blinkmask; - for( b=0; b<40; b++ ) + for(b=0; b<40; b++) { c = *(++rptr); /* if bits 6 and 5 are zero, the byte contains a serial attribute */ - if( ( c & 0x60 ) == 0 ) + if((c & 0x60) == 0) { - ula_decode_attr( oric, c, y ); - ula_render_block( oric, (c & 0x80)!=0, 0, y ); - if( y < 200 ) + ula_decode_attr(oric, c, y); + ula_render_block(oric, (c & 0x80)!=0, 0, y); + if(y < 200) { - if( oric->vid_mode & 0x04 ) // HIRES? + if(oric->vid_mode & 0x04) // HIRES? { hires = SDL_TRUE; rptr = &oric->mem[oric->vid_addr + b + y*40]; - } else { + } + else + { hires = SDL_FALSE; rptr = &oric->mem[oric->vid_addr + b + cy]; } - } else { + } + else + { hires = SDL_FALSE; rptr = &oric->mem[oric->vidbases[2] + b + cy]; // bb80 = bf68 - (200/8*40) } bitmask = (oric->frames&0x10)?0x3f:oric->vid_blinkmask; - } else { - if( hires ) + } + else + { + if(hires) + { + ula_render_block(oric, (c & 0x80)!=0, c & bitmask, y); + } + else { - ula_render_block( oric, (c & 0x80)!=0, c & bitmask, y ); - } else { int ch_ix, ch_dat; ch_ix = c & 0x7f; - ch_dat = oric->vid_ch_data[ (ch_ix<<3) | oric->vid_chline ] & bitmask; + ch_dat = oric->vid_ch_data[(ch_ix<<3) | oric->vid_chline ] & bitmask; - ula_render_block( oric, (c & 0x80)!=0, ch_dat, y ); + ula_render_block(oric, (c & 0x80)!=0, ch_dat, y); } } } @@ -236,7 +255,7 @@ void ula_renderscreen( struct machine *oric ) } // Draw one rasterline -SDL_bool ula_doraster( struct machine *oric ) +SDL_bool ula_doraster(struct machine *oric) { int b, c, bitmask; SDL_bool hires, needrender; @@ -246,28 +265,28 @@ SDL_bool ula_doraster( struct machine *oric ) needrender = SDL_FALSE; oric->vid_raster++; - if( oric->vid_raster == oric->vid_maxrast ) + if(oric->vid_raster == oric->vid_maxrast) { - if( vidcap ) + if(vidcap) { // If we're recording with sound, and they do warp speed, // stop writing frames to the AVI, since it'll just get out of sync. - if ( ( !vidcap->dosnd ) || ( !warpspeed ) ) + if((!vidcap->dosnd) || (!warpspeed)) { // If the oric refresh rate and AVI refresh rate match, just output every frame - if( vidcap->is50hz == oric->vid_freq ) + if(vidcap->is50hz == oric->vid_freq) { - ay_lockaudio( &oric->ay ); // Gets unlocked at the end of each frame - avi_addframe( &vidcap, oric->scr ); + ay_lockaudio(&oric->ay); // Gets unlocked at the end of each frame + avi_addframe(&vidcap, oric->scr); } // Check for 60hz oric & 50 hz AVI - else if( vidcap->is50hz ) + else if(vidcap->is50hz) { // In this case we need to throw away every sixth frame - if( (vidcap->frameadjust%6) != 5 ) + if((vidcap->frameadjust%6) != 5) { - ay_lockaudio( &oric->ay ); // Gets unlocked at the end of each frame - avi_addframe( &vidcap, oric->scr ); + ay_lockaudio(&oric->ay); // Gets unlocked at the end of each frame + avi_addframe(&vidcap, oric->scr); } vidcap->frameadjust++; @@ -276,11 +295,11 @@ SDL_bool ula_doraster( struct machine *oric ) else { // In this case we need to duplicate every fifth frame - ay_lockaudio( &oric->ay ); // Gets unlocked at the end of each frame - avi_addframe( &vidcap, oric->scr ); + ay_lockaudio(&oric->ay); // Gets unlocked at the end of each frame + avi_addframe(&vidcap, oric->scr); - if( (vidcap->frameadjust%5) == 4 ) - avi_addframe( &vidcap, oric->scr ); + if((vidcap->frameadjust%5) == 4) + avi_addframe(&vidcap, oric->scr); vidcap->frameadjust++; } @@ -288,7 +307,7 @@ SDL_bool ula_doraster( struct machine *oric ) } oric->vid_raster = 0; - + // store current T1 counter oric->vid_offset = oric->via.t1c/64; @@ -316,7 +335,7 @@ SDL_bool ula_doraster( struct machine *oric ) needrender = SDL_TRUE; oric->frames++; - if( oric->vid_freq != (oric->vid_mode&2) ) + if(oric->vid_freq != (oric->vid_mode&2)) { oric->vid_freq = oric->vid_mode&2; @@ -329,14 +348,16 @@ SDL_bool ula_doraster( struct machine *oric ) // NTSC = 60Hz = 1,000,000/60 = 16667 cpu cycles/frame // 264 scanlines/frame, so 16667/260 = ~64 cpu cycles / scanline - if( oric->vid_freq ) + if(oric->vid_freq) { // PAL50 - T1 period 19966 oric->cyclesperraster = 64; oric->vid_maxrast = 308 + 4; /* VSync */ oric->vid_start = (oric->vid_maxrast - 224) /2; oric->vid_end = oric->vid_start + 224; - } else { + } + else + { // NTSC - T1 period 16894 oric->cyclesperraster = 64; oric->vid_maxrast = 260 + 4; /* VSync */ @@ -347,8 +368,8 @@ SDL_bool ula_doraster( struct machine *oric ) } // Are we on a visible rasterline? - if( ( oric->vid_raster < oric->vid_start ) || - ( oric->vid_raster >= oric->vid_end ) ) return needrender; + if((oric->vid_raster < oric->vid_start) || + (oric->vid_raster >= oric->vid_end)) return needrender; y = oric->vid_raster - oric->vid_start; oric->scrpt = &oric->scr[y*240]; @@ -356,67 +377,79 @@ SDL_bool ula_doraster( struct machine *oric ) cy = (y>>3) * 40; // Always start each scanline with white on black - ula_raster_default( oric ); + ula_raster_default(oric); oric->vid_chline = y & 0x07; // warpspeed does frameskipping, so lines may still be dirty oric->vid_block_func = oric->vid_dirty[y] ? ula_render_block : ula_render_block_checkdirty; - if( y < 200 ) + if(y < 200) { - if( oric->vid_mode & 0x04 ) // HIRES? + if(oric->vid_mode & 0x04) // HIRES? { hires = SDL_TRUE; rptr = &oric->mem[oric->vid_addr + y*40 -1]; - } else { + } + else + { hires = SDL_FALSE; rptr = &oric->mem[oric->vid_addr + cy -1]; } - } else { + } + else + { hires = SDL_FALSE; rptr = &oric->mem[oric->vidbases[2] + cy -1]; // bb80 = bf68 - (200/8*40) } bitmask = (oric->frames&0x10)?0x3f:oric->vid_blinkmask; - for( b=0; b<40; b++ ) + for(b=0; b<40; b++) { c = *(++rptr); /* if bits 6 and 5 are zero, the byte contains a serial attribute */ - if( ( c & 0x60 ) == 0 ) + if((c & 0x60) == 0) { - ula_decode_attr( oric, c, y ); - oric->vid_block_func( oric, (c & 0x80)!=0, 0, y ); - if( y < 200 ) + ula_decode_attr(oric, c, y); + oric->vid_block_func(oric, (c & 0x80)!=0, 0, y); + if(y < 200) { - if( oric->vid_mode & 0x04 ) // HIRES? + if(oric->vid_mode & 0x04) // HIRES? { hires = SDL_TRUE; rptr = &oric->mem[oric->vid_addr + b + y*40]; - } else { + } + else + { hires = SDL_FALSE; rptr = &oric->mem[oric->vid_addr + b + cy]; } - } else { - if (hires) + } + else + { + if(hires) { hires = SDL_FALSE; rptr = &oric->mem[oric->vidbases[2] + b + cy]; // bb80 = bf68 - (200/8*40) } } bitmask = (oric->frames&0x10)?0x3f:oric->vid_blinkmask; - } else { - if( hires ) + } + else + { + if(hires) + { + oric->vid_block_func(oric, (c & 0x80)!=0, c & bitmask, y); + } + else { - oric->vid_block_func( oric, (c & 0x80)!=0, c & bitmask, y ); - } else { int ch_ix, ch_dat; ch_ix = c & 0x7f; - ch_dat = oric->vid_ch_data[ (ch_ix<<3) | oric->vid_chline ] & bitmask; + ch_dat = oric->vid_ch_data[(ch_ix<<3) | oric->vid_chline ] & bitmask; - oric->vid_block_func( oric, (c & 0x80)!=0, ch_dat, y ); + oric->vid_block_func(oric, (c & 0x80)!=0, ch_dat, y); } } } @@ -424,17 +457,17 @@ SDL_bool ula_doraster( struct machine *oric ) return needrender; } -void ula_set_dirty( struct machine *oric ) +void ula_set_dirty(struct machine *oric) { int i; - for( i=0; i<224; i++ ) + for(i=0; i<224; i++) { oric->vid_dirty[i] = SDL_TRUE; } } -void preinit_ula( struct machine *oric ) +void preinit_ula(struct machine *oric) { oric->scr = NULL; oric->aratio = SDL_TRUE; @@ -443,26 +476,26 @@ void preinit_ula( struct machine *oric ) oric->palghost = SDL_TRUE; } -SDL_bool init_ula( struct machine *oric ) +SDL_bool init_ula(struct machine *oric) { int fg, bg, bits, offs, mask; - oric->scr = (Uint8 *)malloc( 240*224 ); - if( !oric->scr ) return SDL_FALSE; + oric->scr = (Uint8 *)malloc(240*224); + if(!oric->scr) return SDL_FALSE; memset(oric->scr, 0, 240*224); - ula_set_dirty( oric ); + ula_set_dirty(oric); /* Precalc all 6 bit combinations for all colour combinations */ - for( fg=0; fg<8; fg++ ) + for(fg=0; fg<8; fg++) { - for( bg=0; bg<8; bg++ ) + for(bg=0; bg<8; bg++) { - for( bits=0; bits<64; bits++) + for(bits=0; bits<64; bits++) { // FFFBBBbbbbbb000 offs = (fg<<12)|(bg<<9)|(bits<<3); - for( mask=0x20; mask; mask>>=1 ) + for(mask=0x20; mask; mask>>=1) { bittab[offs++] = (bits&mask) ? fg : bg; } @@ -473,8 +506,8 @@ SDL_bool init_ula( struct machine *oric ) return SDL_TRUE; } -void shut_ula( struct machine *oric ) +void shut_ula(struct machine *oric) { - if( oric->scr ) free( oric->scr ); + if(oric->scr) free(oric->scr); oric->scr = NULL; } diff --git a/ula.h b/ula.h index eb50a219..7200482c 100644 --- a/ula.h +++ b/ula.h @@ -19,10 +19,10 @@ ** Oric video ULA */ -void preinit_ula( struct machine *oric ); -SDL_bool init_ula( struct machine *oric ); -void shut_ula( struct machine *oric ); -SDL_bool ula_doraster( struct machine *oric ); -void ula_powerup_default( struct machine *oric ); -void ula_renderscreen( struct machine *oric ); -void ula_set_dirty( struct machine *oric ); +void preinit_ula(struct machine *oric); +SDL_bool init_ula(struct machine *oric); +void shut_ula(struct machine *oric); +SDL_bool ula_doraster(struct machine *oric); +void ula_powerup_default(struct machine *oric); +void ula_renderscreen(struct machine *oric); +void ula_set_dirty(struct machine *oric); diff --git a/via.c b/via.c index 943958cb..9054fb52 100644 --- a/via.c +++ b/via.c @@ -43,74 +43,76 @@ // do the response from the printer, the // other to close the printer_out.txt filehandle // after the printer is idle for a while. -void lprintchar( struct machine *oric, char c ) +void lprintchar(struct machine *oric, char c) { - if( oric->printenable ) + if(oric->printenable) { // Filter out chars that are probably not meant for the printer - if( ( !oric->printfilter ) || ( c == 9 ) || ( c == 10 ) || ( c == 13 ) || ( c == 17 ) || - ( c == 18 ) || ( c == 27 ) || (( c >= 32 ) && ( c <= 127 )) ) + if((!oric->printfilter) || (c == 9) || (c == 10) || (c == 13) || (c == 17) || + (c == 18) || (c == 27) || ((c >= 32) && (c <= 127))) { // If the printer handle isn't currently open, // open it and do a popup to tell the user. - if( !oric->prf ) + if(!oric->prf) { - oric->prf = fopen( "printer_out.txt", "a" ); - if( !oric->prf ) + oric->prf = fopen("printer_out.txt", "a"); + if(!oric->prf) { - do_popup( oric, "Printing failed :-(" ); + do_popup(oric, "Printing failed :-("); return; } - do_popup( oric, "Printing to 'printer_out.txt'" ); + do_popup(oric, "Printing to 'printer_out.txt'"); } // Put the char to the file, set up the timers - fputc( c, oric->prf ); + fputc(c, oric->prf); oric->prclose = 64*312*50*5; } // emulate ack signal oric->prclock = 40; - via_write_CA1( &oric->via, 1 ); + via_write_CA1(&oric->via, 1); } } // Update the CPU IRQ flags depending on the state of the VIA -static inline void via_check_irq( struct via *v ) +static inline void via_check_irq(struct via *v) { - if( ( v->ier & v->ifr )&0x7f ) + if((v->ier & v->ifr)&0x7f) { v->oric->cpu.irq |= v->irqbit; v->ifr |= 0x80; - } else { + } + else + { v->oric->cpu.irq &= ~v->irqbit; v->ifr &= 0x7f; } } // Set a bit in the IFR -static inline void via_set_irq( struct via *v, unsigned char bit ) +static inline void via_set_irq(struct via *v, unsigned char bit) { v->ifr |= bit; - if( ( v->ier & v->ifr )&0x7f ) + if((v->ier & v->ifr)&0x7f) v->ifr |= 0x80; - if( ( v->ier & bit ) == 0 ) return; + if((v->ier & bit) == 0) return; v->oric->cpu.irq |= v->irqbit; } // Clear a bit in the IFR -static inline void via_clr_irq( struct via *v, unsigned char bit ) +static inline void via_clr_irq(struct via *v, unsigned char bit) { - if( bit & VIRQF_CA1 ) + if(bit & VIRQF_CA1) v->iral = v->ira; - if( bit & VIRQF_CA2 ) + if(bit & VIRQF_CA2) v->irbl = v->irb; v->ifr &= ~bit; - if( (( v->ier & v->ifr )&0x7f) == 0 ) + if(((v->ier & v->ifr)&0x7f) == 0) { v->oric->cpu.irq &= ~v->irqbit; v->ifr &= 0x7f; @@ -118,63 +120,63 @@ static inline void via_clr_irq( struct via *v, unsigned char bit ) } -void via_main_w_iorb( struct via *v, unsigned char oldorb ) +void via_main_w_iorb(struct via *v, unsigned char oldorb) { // Look for negative edge on printer strobe - if( ( (oldorb&v->ddrb&0x10) != 0 ) && - ( (v->orb&v->ddrb&0x10) == 0 ) ) + if(((oldorb&v->ddrb&0x10) != 0) && + ((v->orb&v->ddrb&0x10) == 0)) { - lprintchar( v->oric, v->ora ); + lprintchar(v->oric, v->ora); } - tape_setmotor( v->oric, (v->orb&v->ddrb&0x40) != 0 ); + tape_setmotor(v->oric, (v->orb&v->ddrb&0x40) != 0); - if( (v->pcr&PCRF_CB2CON) == 0x80 ) - ay_set_bdir( &v->oric->ay, 0 ); + if((v->pcr&PCRF_CB2CON) == 0x80) + ay_set_bdir(&v->oric->ay, 0); - ay_update_keybits( &v->oric->ay ); + ay_update_keybits(&v->oric->ay); } -void via_main_w_iora( struct via *v ) +void via_main_w_iora(struct via *v) { - if( (v->pcr&PCRF_CA2CON) == 0x08 ) - ay_set_bc1( &v->oric->ay, 0 ); + if((v->pcr&PCRF_CA2CON) == 0x08) + ay_set_bc1(&v->oric->ay, 0); - ay_modeset( &v->oric->ay ); - joy_buildmask( v->oric ); + ay_modeset(&v->oric->ay); + joy_buildmask(v->oric); } -void via_main_w_iora2( struct via *v ) +void via_main_w_iora2(struct via *v) { - ay_modeset( &v->oric->ay ); - joy_buildmask( v->oric ); + ay_modeset(&v->oric->ay); + joy_buildmask(v->oric); } -void via_main_w_ddra( struct via *v ) +void via_main_w_ddra(struct via *v) { - joy_buildmask( v->oric ); + joy_buildmask(v->oric); } -void via_main_w_ddrb( struct via *v ) +void via_main_w_ddrb(struct via *v) { - joy_buildmask( v->oric ); - ay_update_keybits( &v->oric->ay ); + joy_buildmask(v->oric); + ay_update_keybits(&v->oric->ay); } -void via_main_w_pcr( struct via *v ) +void via_main_w_pcr(struct via *v) { SDL_bool updateay = SDL_FALSE; - switch( v->pcr & PCRF_CA2CON ) + switch(v->pcr & PCRF_CA2CON) { case 0x0c: updateay = SDL_TRUE; break; } -// if( (v->acr&ACRF_SRCON) == 0 ) + // if( (v->acr&ACRF_SRCON) == 0 ) { - switch( v->pcr & PCRF_CB2CON ) + switch(v->pcr & PCRF_CB2CON) { case 0xc0: case 0xe0: @@ -183,167 +185,167 @@ void via_main_w_pcr( struct via *v ) } } - if( updateay ) ay_set_bcmode( &v->oric->ay, v->ca2, v->cb2 ); + if(updateay) ay_set_bcmode(&v->oric->ay, v->ca2, v->cb2); } -void via_main_w_ca2ext( struct via *v ) +void via_main_w_ca2ext(struct via *v) { - switch( v->pcr & PCRF_CA2CON ) + switch(v->pcr & PCRF_CA2CON) { case 0x00: // Interrupt on negative transition case 0x02: // Independent negative transition case 0x04: // Interrupt on positive transition case 0x06: // Independent positive transition - ay_set_bc1( &v->oric->ay, v->ca2 ); + ay_set_bc1(&v->oric->ay, v->ca2); break; - // 0x08, 0x0a, 0x0c, 0x0e: output modes. Nothing to do :) + // 0x08, 0x0a, 0x0c, 0x0e: output modes. Nothing to do :) } } -void via_main_w_cb2ext( struct via *v ) +void via_main_w_cb2ext(struct via *v) { - switch( v->pcr & PCRF_CB2CON ) + switch(v->pcr & PCRF_CB2CON) { case 0x00: case 0x20: case 0x40: case 0x60: - ay_set_bdir( &v->oric->ay, v->cb2 ); + ay_set_bdir(&v->oric->ay, v->cb2); break; } } -void via_main_r_iora( struct via *v ) +void via_main_r_iora(struct via *v) { - ay_modeset( &v->oric->ay ); - if( (v->pcr&PCRF_CA2CON) == 0x08 ) - ay_set_bc1( &v->oric->ay, 0 ); + ay_modeset(&v->oric->ay); + if((v->pcr&PCRF_CA2CON) == 0x08) + ay_set_bc1(&v->oric->ay, 0); } -void via_main_r_iora2( struct via *v ) +void via_main_r_iora2(struct via *v) { - ay_modeset( &v->oric->ay ); + ay_modeset(&v->oric->ay); } -void via_main_r_iorb( struct via *v ) +void via_main_r_iorb(struct via *v) { - if( (v->pcr&PCRF_CB2CON) == 0x80 ) - ay_set_bdir( &v->oric->ay, 0 ); + if((v->pcr&PCRF_CB2CON) == 0x80) + ay_set_bdir(&v->oric->ay, 0); } -void via_main_ca2pulsed( struct via *v ) +void via_main_ca2pulsed(struct via *v) { - ay_set_bc1( &v->oric->ay, 1 ); + ay_set_bc1(&v->oric->ay, 1); } -void via_main_cb2pulsed( struct via *v ) +void via_main_cb2pulsed(struct via *v) { - ay_set_bdir( &v->oric->ay, v->cb2 ); + ay_set_bdir(&v->oric->ay, v->cb2); } // Telestrat VIA2 -void via_tele_w_iorb( struct via *v, unsigned char oldorb ) +void via_tele_w_iorb(struct via *v, unsigned char oldorb) { - joy_buildmask( v->oric ); + joy_buildmask(v->oric); } -void via_tele_w_iora( struct via *v ) +void via_tele_w_iora(struct via *v) { int invddra = (v->ddra&7)^7; v->oric->tele_currbank = (v->oric->tele_currbank&invddra)|(v->ora&v->ddra&0x07); v->oric->tele_banktype = v->oric->tele_bank[v->oric->tele_currbank].type; v->oric->rom = v->oric->tele_bank[v->oric->tele_currbank].ptr; - joy_buildmask( v->oric ); + joy_buildmask(v->oric); } -void via_tele_w_iora2( struct via *v ) +void via_tele_w_iora2(struct via *v) { int invddra = (v->ddra&7)^7; v->oric->tele_currbank = (v->oric->tele_currbank&invddra)|(v->ora&v->ddra&0x07); v->oric->tele_banktype = v->oric->tele_bank[v->oric->tele_currbank].type; v->oric->rom = v->oric->tele_bank[v->oric->tele_currbank].ptr; - joy_buildmask( v->oric ); + joy_buildmask(v->oric); } -void via_tele_w_ddra( struct via *v ) +void via_tele_w_ddra(struct via *v) { int invddra = (v->ddra&7)^7; v->oric->tele_currbank = (v->oric->tele_currbank&invddra)|(v->ora&v->ddra&0x07); v->oric->tele_banktype = v->oric->tele_bank[v->oric->tele_currbank].type; v->oric->rom = v->oric->tele_bank[v->oric->tele_currbank].ptr; - joy_buildmask( v->oric ); + joy_buildmask(v->oric); } -void via_tele_w_ddrb( struct via *v ) +void via_tele_w_ddrb(struct via *v) { - joy_buildmask( v->oric ); + joy_buildmask(v->oric); } // Read ports from external device -unsigned char via_read_porta( struct via *v ) +unsigned char via_read_porta(struct via *v) { return v->ora & v->ddra; } -unsigned char via_read_portb( struct via *v ) +unsigned char via_read_portb(struct via *v) { return v->orb & v->ddrb; } // Write ports from external device -void via_main_write_porta( struct via *v, unsigned char mask, unsigned char data ) +void via_main_write_porta(struct via *v, unsigned char mask, unsigned char data) { v->ira = (v->ira&~mask)|(data&mask); - if( (!(v->acr&ACRF_PALATCH)) || - (!(v->ifr&VIRQF_CA1)) ) + if((!(v->acr&ACRF_PALATCH)) || + (!(v->ifr&VIRQF_CA1))) v->iral = v->ira; } -void via_tele_write_porta( struct via *v, unsigned char mask, unsigned char data ) +void via_tele_write_porta(struct via *v, unsigned char mask, unsigned char data) { v->ira = (v->ira&~mask)|(data&mask); - if( (!(v->acr&ACRF_PALATCH)) || - (!(v->ifr&VIRQF_CA1)) ) + if((!(v->acr&ACRF_PALATCH)) || + (!(v->ifr&VIRQF_CA1))) v->iral = v->ira; } -void via_write_portb( struct via *v, unsigned char mask, unsigned char data ) +void via_write_portb(struct via *v, unsigned char mask, unsigned char data) { unsigned char lastpb6; lastpb6 = v->irb&0x40; v->irb = (v->irb&~mask)|(data&mask); - if( (!(v->acr&ACRF_PBLATCH)) || - (!(v->acr&VIRQF_CB1)) ) + if((!(v->acr&ACRF_PBLATCH)) || + (!(v->acr&VIRQF_CB1))) v->irbl = v->irb; // Is timer 2 counting PB6 negative transitions? - if( ( v->acr & ACRF_T2CON ) == 0 ) return; + if((v->acr & ACRF_T2CON) == 0) return; // Was there a negative transition? - if( ( !lastpb6 ) || ( v->irb&0x40 ) ) return; + if((!lastpb6) || (v->irb&0x40)) return; // Count it v->t2c--; - if( v->t2run ) + if(v->t2run) { - if( v->t2c == 0 ) + if(v->t2c == 0) { - via_set_irq( v, VIRQF_T2 ); + via_set_irq(v, VIRQF_T2); v->t2run = SDL_FALSE; } } } // Init/Reset VIA -void via_init( struct via *v, struct machine *oric, int viatype ) +void via_init(struct via *v, struct machine *oric, int viatype) { v->orb = 0; v->ora = 0; @@ -379,7 +381,7 @@ void via_init( struct via *v, struct machine *oric, int viatype ) v->cb2pulse = SDL_FALSE; v->oric = oric; - switch( viatype ) + switch(viatype) { case VIA_MAIN: v->w_iorb = via_main_w_iorb; @@ -430,73 +432,73 @@ void via_init( struct via *v, struct machine *oric, int viatype ) } // Move timers on etc. -void via_clock( struct via *v, unsigned int cycles ) +void via_clock(struct via *v, unsigned int cycles) { unsigned int crem; // Move on the tape emulation - tape_ticktock( v->oric, cycles ); + tape_ticktock(v->oric, cycles); - if( !cycles ) return; + if(!cycles) return; // Simulate the feedback from the printer - if( v->oric->prclock > 0 ) + if(v->oric->prclock > 0) { v->oric->prclock -= cycles; - if( v->oric->prclock <= 0 ) + if(v->oric->prclock <= 0) { v->oric->prclock = 0; - if( v->oric->printenable ) - via_write_CA1( v, 0 ); + if(v->oric->printenable) + via_write_CA1(v, 0); } } // This is just a timer to close the // "printer_out.txt" filehandle if the // oric printer is idle for a while - if( v->oric->prclose > 0 ) + if(v->oric->prclose > 0) { v->oric->prclose -= cycles; - if( v->oric->prclose <= 0 ) + if(v->oric->prclose <= 0) { v->oric->prclose = 0; - if( v->oric->prf ) - fclose( v->oric->prf ); + if(v->oric->prf) + fclose(v->oric->prf); v->oric->prf = NULL; } } - if( v->ca2pulse ) + if(v->ca2pulse) { v->ca2 = 1; - if( v->ca2pulsed ) v->ca2pulsed( v ); + if(v->ca2pulsed) v->ca2pulsed(v); v->ca2pulse = SDL_FALSE; } - if( v->cb2pulse ) + if(v->cb2pulse) { -// if( (v->acr&ACRF_SRCON) == 0 ) + // if( (v->acr&ACRF_SRCON) == 0 ) { v->cb2 = 1; - if( v->cb2pulsed ) v->cb2pulsed( v ); + if(v->cb2pulsed) v->cb2pulsed(v); } v->cb2pulse = SDL_FALSE; } // Timer 1 tick-tock - switch( v->acr&ACRF_T1CON ) + switch(v->acr&ACRF_T1CON) { case 0x00: // One-shot, no output case 0x80: // One-shot, PB7 low while counting - if( v->t1run ) // Doing the one-shot still? + if(v->t1run) // Doing the one-shot still? { - if( cycles > v->t1c ) // Going to end the timer run? + if(cycles > v->t1c) // Going to end the timer run? { - via_set_irq( v, VIRQF_T1 ); - if( v->acr&0x80 ) + via_set_irq(v, VIRQF_T1); + if(v->acr&0x80) { v->orb |= 0x80; // PB7 high now that the timer has finished - if (v->orbchange) v->orbchange( v ); + if(v->orbchange) v->orbchange(v); } v->t1run = SDL_FALSE; } @@ -508,25 +510,25 @@ void via_clock( struct via *v, unsigned int cycles ) case 0xc0: // Continuous, output on PB7 crem = cycles; - if( v->t1reload ) + if(v->t1reload) { crem--; v->t1c = (v->t1l_h<<8)|v->t1l_l; // Reload timer v->t1reload = SDL_FALSE; } - while( crem > v->t1c ) + while(crem > v->t1c) { crem -= (v->t1c+1); // Clock down to 0xffff v->t1c = 0xffff; - via_set_irq( v, VIRQF_T1 ); - if( v->acr&0x80 ) + via_set_irq(v, VIRQF_T1); + if(v->acr&0x80) { v->orb ^= 0x80; // PB7 low now that the timer has finished - if( v->orbchange ) v->orbchange( v ); + if(v->orbchange) v->orbchange(v); } - if( !crem ) + if(!crem) { v->t1reload = SDL_TRUE; break; @@ -541,46 +543,46 @@ void via_clock( struct via *v, unsigned int cycles ) } // Timer 2 tick-tock - if( ( v->acr & ACRF_T2CON ) == 0 ) + if((v->acr & ACRF_T2CON) == 0) { - crem = cycles; - if( v->t2reload ) - { - crem--; - v->t2reload = 0; - } + crem = cycles; + if(v->t2reload) + { + crem--; + v->t2reload = 0; + } // Timer 2 is one-shot - if( v->t2run ) + if(v->t2run) { - if( crem > v->t2c ) + if(crem > v->t2c) { - via_set_irq( v, VIRQF_T2 ); + via_set_irq(v, VIRQF_T2); v->t2run = SDL_FALSE; } } v->t2c -= crem; } - switch( v->acr & ACRF_SRCON ) + switch(v->acr & ACRF_SRCON) { case 0x00: // Disabled case 0x04: // Shift in under T2 control (not implemented) case 0x08: // Shift in under O2 control (not implemented) case 0x0c: // Shift in under control of external clock (not implemented) case 0x1c: // Shift out under control of external clock (not implemented) - if( v->ifr&VIRQF_SR ) - via_clr_irq( v, VIRQF_SR ); + if(v->ifr&VIRQF_SR) + via_clr_irq(v, VIRQF_SR); v->srcount = 0; v->srtrigger = SDL_FALSE; break; case 0x10: // Shift out free-running at T2 rate - if( !v->srtrigger ) break; + if(!v->srtrigger) break; // Count down the SR timer v->srtime -= cycles; - while( v->srtime <= 0 ) + while(v->srtime <= 0) { // SR timer elapsed! Reload it v->srtime += v->t2l_l+1; @@ -589,11 +591,11 @@ void via_clock( struct via *v, unsigned int cycles ) v->cb1 ^= 1; // Need to change cb2? - if( !v->cb1 ) + if(!v->cb1) { v->cb2 = (v->sr & 0x80) ? 1 : 0; v->sr = (v->sr<<1)|v->cb2; - if( v->cb2shifted ) v->cb2shifted( v ); + if(v->cb2shifted) v->cb2shifted(v); v->srcount = (v->srcount+1)%8; } @@ -601,12 +603,12 @@ void via_clock( struct via *v, unsigned int cycles ) break; case 0x14: // Shift out under T2 control - if( !v->srtrigger ) break; - if( v->srcount == 8 ) break; + if(!v->srtrigger) break; + if(v->srcount == 8) break; // Count down the SR timer v->srtime -= cycles; - while( v->srtime <= 0 ) + while(v->srtime <= 0) { // SR timer elapsed! Reload it v->srtime += v->t2l_l+1; @@ -615,16 +617,16 @@ void via_clock( struct via *v, unsigned int cycles ) v->cb1 ^= 1; // Need to change cb2? - if( !v->cb1 ) + if(!v->cb1) { v->cb2 = (v->sr & 0x80) ? 1 : 0; v->sr = (v->sr<<1)|v->cb2; - if( v->cb2shifted ) v->cb2shifted( v ); + if(v->cb2shifted) v->cb2shifted(v); v->srcount++; - if( v->srcount == 8 ) + if(v->srcount == 8) { - via_set_irq( v, VIRQF_SR ); + via_set_irq(v, VIRQF_SR); v->srtime = 0; v->srtrigger = SDL_FALSE; break; @@ -634,23 +636,23 @@ void via_clock( struct via *v, unsigned int cycles ) break; case 0x18: // Shift out under O2 control - if( !v->srtrigger ) break; - if( v->srcount == 8 ) break; + if(!v->srtrigger) break; + if(v->srcount == 8) break; // Toggle the clock! v->cb1 ^= 1; // Need to change cb2? - if( !v->cb1 ) + if(!v->cb1) { v->cb2 = (v->sr & 0x80) ? 1 : 0; v->sr = (v->sr<<1)|v->cb2; - if( v->cb2shifted ) v->cb2shifted( v ); + if(v->cb2shifted) v->cb2shifted(v); v->srcount++; - if( v->srcount == 8 ) + if(v->srcount == 8) { - via_set_irq( v, VIRQF_SR ); + via_set_irq(v, VIRQF_SR); v->srtrigger = SDL_FALSE; } } @@ -659,44 +661,44 @@ void via_clock( struct via *v, unsigned int cycles ) } // Write VIA from CPU -void via_write( struct via *v, int offset, unsigned char data ) +void via_write(struct via *v, int offset, unsigned char data) { unsigned char tmp; offset &= 0xf; - switch( offset ) + switch(offset) { case VIA_IORB: tmp = v->orb; v->orb = data; - via_clr_irq( v, VIRQF_CB1 ); - switch( v->pcr & PCRF_CB2CON ) + via_clr_irq(v, VIRQF_CB1); + switch(v->pcr & PCRF_CB2CON) { case 0x00: case 0x40: - via_clr_irq( v, VIRQF_CB2 ); + via_clr_irq(v, VIRQF_CB2); break; case 0xa0: v->cb2pulse = SDL_TRUE; case 0x80: -// if( (v->acr&ACRF_SRCON) != 0 ) - v->cb2 = 0; + // if( (v->acr&ACRF_SRCON) != 0 ) + v->cb2 = 0; break; } - if( v->w_iorb ) v->w_iorb( v, tmp ); - if( v->orbchange ) v->orbchange( v ); - ay_soundloop( &v->oric->ay, tmp, data ); + if(v->w_iorb) v->w_iorb(v, tmp); + if(v->orbchange) v->orbchange(v); + ay_soundloop(&v->oric->ay, tmp, data); break; case VIA_IORA: v->ora = data; - via_clr_irq( v, VIRQF_CA1 ); - switch( v->pcr & PCRF_CA2CON ) + via_clr_irq(v, VIRQF_CA1); + switch(v->pcr & PCRF_CA2CON) { case 0x00: case 0x04: - via_clr_irq( v, VIRQF_CA2 ); + via_clr_irq(v, VIRQF_CA2); break; case 0x0a: @@ -705,26 +707,26 @@ void via_write( struct via *v, int offset, unsigned char data ) v->ca2 = 0; break; } - if( v->w_iora ) v->w_iora( v ); + if(v->w_iora) v->w_iora(v); break; case VIA_DDRB: v->ddrb = data; - if( v->w_ddrb ) v->w_ddrb( v ); + if(v->w_ddrb) v->w_ddrb(v); break; case VIA_DDRA: v->ddra = data; - if( v->w_ddra ) v->w_ddra( v ); + if(v->w_ddra) v->w_ddra(v); break; case VIA_T1C_H: v->t1l_h = data; v->t1c = (v->t1l_h<<8)|v->t1l_l; v->t1reload = 1; - via_clr_irq( v, VIRQF_T1 ); + via_clr_irq(v, VIRQF_T1); v->t1run = SDL_TRUE; - if( (v->acr&ACRF_T1CON) == 0x80 ) + if((v->acr&ACRF_T1CON) == 0x80) { v->orb &= 0x7f; - if( v->orbchange ) v->orbchange( v ); + if(v->orbchange) v->orbchange(v); } break; case VIA_T1C_L: @@ -733,7 +735,7 @@ void via_write( struct via *v, int offset, unsigned char data ) break; case VIA_T1L_H: v->t1l_h = data; - via_clr_irq( v, VIRQF_T1 ); + via_clr_irq(v, VIRQF_T1); break; case VIA_T2C_L: v->t2l_l = data; @@ -741,8 +743,8 @@ void via_write( struct via *v, int offset, unsigned char data ) case VIA_T2C_H: v->t2l_h = data; v->t2c = (v->t2l_h<<8)|v->t2l_l; - v->t2reload = 1; - via_clr_irq( v, VIRQF_T2 ); + v->t2reload = 1; + via_clr_irq(v, VIRQF_T2); v->t2run = SDL_TRUE; break; case VIA_SR: @@ -750,31 +752,31 @@ void via_write( struct via *v, int offset, unsigned char data ) v->srcount = 0; v->srtime = 0; v->srtrigger = SDL_TRUE; - via_clr_irq( v, VIRQF_SR ); + via_clr_irq(v, VIRQF_SR); break; case VIA_ACR: // Disabling SR? -/* - if( ( (v->acr&ACRF_SRCON) != 0 ) && - ( (data&ACRF_SRCON) == 0 ) ) - { - switch( v->pcr & PCRF_CB2CON ) - { - case 0xc0: - v->cb2 = 0; - v->cb2pulse = SDL_FALSE; - break; - - case 0xe0: - v->cb2 = 1; - break; - } - ay_set_bcmode( &v->oric->ay, v->ca2, v->cb2 ); - } -*/ + /* + if( ( (v->acr&ACRF_SRCON) != 0 ) && + ( (data&ACRF_SRCON) == 0 ) ) + { + switch( v->pcr & PCRF_CB2CON ) + { + case 0xc0: + v->cb2 = 0; + v->cb2pulse = SDL_FALSE; + break; + + case 0xe0: + v->cb2 = 1; + break; + } + ay_set_bcmode( &v->oric->ay, v->ca2, v->cb2 ); + } + */ v->acr = data; - if( ( ( data & ACRF_T1CON ) != 0x40 ) && - ( ( data & ACRF_T1CON ) != 0xc0 ) ) + if(((data & ACRF_T1CON) != 0x40) && + ((data & ACRF_T1CON) != 0xc0)) v->t1reload = SDL_FALSE; break; case 0x40: // Continuous, no output @@ -782,7 +784,7 @@ void via_write( struct via *v, int offset, unsigned char data ) break; case VIA_PCR: v->pcr = data; - switch( v->pcr & PCRF_CA2CON ) + switch(v->pcr & PCRF_CA2CON) { case 0x0c: v->ca2 = 0; @@ -794,9 +796,9 @@ void via_write( struct via *v, int offset, unsigned char data ) break; } -// if( (v->acr&ACRF_SRCON) == 0 ) + // if( (v->acr&ACRF_SRCON) == 0 ) { - switch( v->pcr & PCRF_CB2CON ) + switch(v->pcr & PCRF_CB2CON) { case 0xc0: v->cb2 = 0; @@ -809,38 +811,38 @@ void via_write( struct via *v, int offset, unsigned char data ) } } - if( v->w_pcr ) v->w_pcr( v ); + if(v->w_pcr) v->w_pcr(v); break; case VIA_IFR: - if( data & VIRQF_CA1 ) v->iral = v->ira; - if( data & VIRQF_CB1 ) v->irbl = v->irb; + if(data & VIRQF_CA1) v->iral = v->ira; + if(data & VIRQF_CB1) v->irbl = v->irb; v->ifr &= (~data)&0x7f; - if( ( v->ier & v->ifr )&0x7f ) + if((v->ier & v->ifr)&0x7f) v->ifr |= 0x80; else v->oric->cpu.irq &= ~v->irqbit; break; case VIA_IER: - if( data & 0x80 ) + if(data & 0x80) v->ier |= (data&0x7f); else v->ier &= ~(data&0x7f); - via_check_irq( v ); + via_check_irq(v); break; case VIA_IORA2: v->ora = data; - if( v->w_iora2 ) v->w_iora2( v ); + if(v->w_iora2) v->w_iora2(v); break; } } // Read without side-effects for monitor -unsigned char via_mon_read( struct via *v, int offset ) +unsigned char via_mon_read(struct via *v, int offset) { offset &= 0xf; - switch( offset ) + switch(offset) { case VIA_IORB: return (v->orb&v->ddrb)|(v->irbl&(~v->ddrb)); @@ -880,39 +882,39 @@ unsigned char via_mon_read( struct via *v, int offset ) } // Read VIA from CPU -unsigned char via_read( struct via *v, int offset ) +unsigned char via_read(struct via *v, int offset) { offset &= 0xf; - switch( offset ) + switch(offset) { case VIA_IORB: - via_clr_irq( v, VIRQF_CB1 ); - switch( v->pcr & PCRF_CB2CON ) + via_clr_irq(v, VIRQF_CB1); + switch(v->pcr & PCRF_CB2CON) { case 0x00: case 0x40: - via_clr_irq( v, VIRQF_CB2 ); + via_clr_irq(v, VIRQF_CB2); break; case 0xa0: v->cb2pulse = SDL_TRUE; case 0x80: -// if( (v->acr&ACRF_SRCON) == 0 ) + // if( (v->acr&ACRF_SRCON) == 0 ) { v->cb2 = 0; } break; } - if( v->r_iorb ) v->r_iorb( v ); + if(v->r_iorb) v->r_iorb(v); return (v->orb&v->ddrb)|(v->irbl&(~v->ddrb)); case VIA_IORA: - via_clr_irq( v, VIRQF_CA1 ); - switch( v->pcr & PCRF_CA2CON ) + via_clr_irq(v, VIRQF_CA1); + switch(v->pcr & PCRF_CA2CON) { case 0x00: case 0x04: - via_clr_irq( v, VIRQF_CA2 ); + via_clr_irq(v, VIRQF_CA2); break; case 0x0a: @@ -921,14 +923,14 @@ unsigned char via_read( struct via *v, int offset ) v->ca2 = 0; break; } - if( v->r_iora ) v->r_iora( v ); + if(v->r_iora) v->r_iora(v); return (v->ora&v->ddra)|(v->iral&(~v->ddra)); case VIA_DDRB: return v->ddrb; case VIA_DDRA: return v->ddra; case VIA_T1C_L: - via_clr_irq( v, VIRQF_T1 ); + via_clr_irq(v, VIRQF_T1); return v->t1c&0xff; case VIA_T1C_H: return v->t1c>>8; @@ -937,7 +939,7 @@ unsigned char via_read( struct via *v, int offset ) case VIA_T1L_H: return v->t1l_h; case VIA_T2C_L: - via_clr_irq( v, VIRQF_T2 ); + via_clr_irq(v, VIRQF_T2); return v->t2c&0xff; case VIA_T2C_H: return v->t2c>>8; @@ -945,7 +947,7 @@ unsigned char via_read( struct via *v, int offset ) v->srcount = 0; v->srtime = 0; v->srtrigger = SDL_TRUE; - via_clr_irq( v, VIRQF_SR ); + via_clr_irq(v, VIRQF_SR); return v->sr; case VIA_ACR: return v->acr; @@ -963,89 +965,93 @@ unsigned char via_read( struct via *v, int offset ) } // For the monitor -void via_mon_write_ifr( struct via *v, unsigned char data ) +void via_mon_write_ifr(struct via *v, unsigned char data) { - if( !( data & VIRQF_CA1 ) ) v->iral = v->ira; - if( !( data & VIRQF_CB1 ) ) v->irbl = v->irb; + if(!(data & VIRQF_CA1)) v->iral = v->ira; + if(!(data & VIRQF_CB1)) v->irbl = v->irb; v->ifr = data&0x7f; - if( ( v->ier & v->ifr )&0x7f ) + if((v->ier & v->ifr)&0x7f) v->ifr |= 0x80; else v->oric->cpu.irq &= ~v->irqbit; } // Write CA1,CA2,CB1,CB2 from external device -void via_write_CA1( struct via *v, unsigned char data ) +void via_write_CA1(struct via *v, unsigned char data) { - if( ( !v->ca1 ) && ( data != 0 ) ) // Positive transition? + if((!v->ca1) && (data != 0)) // Positive transition? + { + if(v->pcr & PCRF_CA1CON) + via_set_irq(v, VIRQF_CA1); + } + else if((v->ca1) && (data == 0)) // Negative transition? { - if( v->pcr & PCRF_CA1CON ) - via_set_irq( v, VIRQF_CA1 ); - } else if( ( v->ca1 ) && ( data == 0 ) ) { // Negative transition? - if( !(v->pcr & PCRF_CA1CON) ) - via_set_irq( v, VIRQF_CA1 ); + if(!(v->pcr & PCRF_CA1CON)) + via_set_irq(v, VIRQF_CA1); } v->ca1 = data != 0; } -void via_write_CA2( struct via *v, unsigned char data ) +void via_write_CA2(struct via *v, unsigned char data) { - switch( v->pcr & PCRF_CA2CON ) + switch(v->pcr & PCRF_CA2CON) { case 0x00: // Interrupt on negative transition case 0x02: // Independent negative transition - if( ( v->ca2 ) && ( data == 0 ) ) - via_set_irq( v, VIRQF_CA2 ); + if((v->ca2) && (data == 0)) + via_set_irq(v, VIRQF_CA2); v->ca2 = data != 0; break; case 0x04: // Interrupt on positive transition case 0x06: // Independent positive transition - if( ( !v->ca2 ) && ( data != 0 ) ) - via_set_irq( v, VIRQF_CA2 ); + if((!v->ca2) && (data != 0)) + via_set_irq(v, VIRQF_CA2); v->ca2 = data != 0; break; - // 0x08, 0x0a, 0x0c, 0x0e: output modes. Nothing to do :) + // 0x08, 0x0a, 0x0c, 0x0e: output modes. Nothing to do :) } - if( v->w_ca2ext ) v->w_ca2ext( v ); + if(v->w_ca2ext) v->w_ca2ext(v); } -void via_write_CB1( struct via *v, unsigned char data ) +void via_write_CB1(struct via *v, unsigned char data) { - if( ( !v->cb1 ) && ( data != 0 ) ) // Positive transition? + if((!v->cb1) && (data != 0)) // Positive transition? + { + if(v->pcr & PCRF_CB1CON) + via_set_irq(v, VIRQF_CB1); + } + else if((v->cb1) && (data == 0)) // Negative transition? { - if( v->pcr & PCRF_CB1CON ) - via_set_irq( v, VIRQF_CB1 ); - } else if( ( v->cb1 ) && ( data == 0 ) ) { // Negative transition? - if( !(v->pcr & PCRF_CB1CON) ) - via_set_irq( v, VIRQF_CB1 ); + if(!(v->pcr & PCRF_CB1CON)) + via_set_irq(v, VIRQF_CB1); } v->cb1 = data != 0; } -void via_write_CB2( struct via *v, unsigned char data ) +void via_write_CB2(struct via *v, unsigned char data) { - switch( v->pcr & PCRF_CB2CON ) + switch(v->pcr & PCRF_CB2CON) { case 0x00: case 0x20: - if( ( v->cb2 ) && ( data == 0 ) ) - via_set_irq( v, VIRQF_CB2 ); + if((v->cb2) && (data == 0)) + via_set_irq(v, VIRQF_CB2); v->cb2 = data != 0; break; case 0x40: case 0x60: - if( ( !v->cb2 ) && ( data != 0 ) ) - via_set_irq( v, VIRQF_CB2 ); + if((!v->cb2) && (data != 0)) + via_set_irq(v, VIRQF_CB2); v->cb2 = data != 0; break; } - if( v->w_cb2ext ) v->w_cb2ext( v ); + if(v->w_cb2ext) v->w_cb2ext(v); } diff --git a/via.h b/via.h index 1fffead1..b23d5a71 100644 --- a/via.h +++ b/via.h @@ -36,7 +36,7 @@ struct via unsigned char t1l_h; unsigned short t1c; unsigned char t2l_l; - unsigned char t2l_h; + unsigned char t2l_h; unsigned short t2c; unsigned char sr; unsigned char acr; @@ -128,32 +128,32 @@ struct via #define VIRQB_T1 6 #define VIRQF_T1 (1< Date: Fri, 23 Jan 2026 22:37:35 +0100 Subject: [PATCH 143/143] Less OpenGL warnings for Mac --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 508acd6d..e4068355 100644 --- a/Makefile +++ b/Makefile @@ -327,7 +327,7 @@ ifeq ($(PLATFORM),osx) ifneq (,$(CROSS_CFLAGS)) CFLAGS += -D__OPENGL_AVAILABLE__ -D__CBCOPY__ -D__CBPASTE__ $(CROSS_CFLAGS) else -CFLAGS += -D__OPENGL_AVAILABLE__ -D__CBCOPY__ -D__CBPASTE__ $(shell $(SDL_LIB)-config --cflags) +CFLAGS += -D__OPENGL_AVAILABLE__ -D__CBCOPY__ -D__CBPASTE__ -DGL_SILENCE_DEPRECATION $(shell $(SDL_LIB)-config --cflags) endif ifneq (,$(CROSS_LFLAGS)) LFLAGS += $(CROSS_LFLAGS)