diff --git a/.cursor/rules/package-app-android.mdc b/.cursor/rules/package-app-android.mdc index 6056899f..ef40aa34 100644 --- a/.cursor/rules/package-app-android.mdc +++ b/.cursor/rules/package-app-android.mdc @@ -9,7 +9,7 @@ alwaysApply: false Android app with deep platform integration. **Stack:** TypeScript + NativeScript (no Angular/Vue). **UI:** Custom TypeScript components wrapping native Android widgets (e.g., `fab.ts` → `ExtendedFloatingActionButton`), Material Design 3, native look/feel. -**Events:** Use `packages/6502/event-dispatcher.ts` for cross-platform consistency. +**Events:** Use `packages/core/event-dispatcher.ts` for cross-platform consistency. **Focus:** Platform integration, touch-friendly UI, mobile performance, reuse `6502` core + `common-ui`. **APIs:** Direct Android SDK via NativeScript. **Build:** NativeScript + Gradle. diff --git a/.cursor/rules/package-app-gnome.mdc b/.cursor/rules/package-app-gnome.mdc index 555af6fb..5ebdd5c2 100644 --- a/.cursor/rules/package-app-gnome.mdc +++ b/.cursor/rules/package-app-gnome.mdc @@ -10,7 +10,7 @@ alwaysApply: false - **UI:** - Leverages native GNOME libraries and Adwaita for a consistent look and feel. - UI logic primarily in GJS/TypeScript. -- **Event Handling:** Prefers the custom `event-dispatcher.ts` from `packages/6502/` over raw GNOME signals where appropriate, to maintain consistency with other platforms. +- **Event Handling:** Prefers the custom `event-dispatcher.ts` from `packages/core/` over raw GNOME signals where appropriate, to maintain consistency with other platforms. - **Key Focus:** Deep native GNOME integration, adherence to GNOME HIG, leveraging `6502` core and `common-ui` components. - **Platform APIs:** Directly utilizes native GNOME platform APIs through GJS for all system interactions. - **Build:** Typically involves Meson. If Vite is used, it's likely for specific web-technology parts within GJS. diff --git a/.cursor/rules/package-6502.mdc b/.cursor/rules/package-core.mdc similarity index 96% rename from .cursor/rules/package-6502.mdc rename to .cursor/rules/package-core.mdc index 0c970b5c..935881bc 100644 --- a/.cursor/rules/package-6502.mdc +++ b/.cursor/rules/package-core.mdc @@ -1,6 +1,6 @@ --- description: -globs: packages/6502/**/* +globs: packages/core/**/* alwaysApply: false --- ## Package: `6502` (Core Emulator) diff --git a/AGENTS.md b/AGENTS.md index 3ccbb1c4..35bdf254 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -11,7 +11,7 @@ Principles: maximize code reuse via `common-ui`/`6502` packages; keep platform c | Package | Path | Purpose | Stack | | --------------------- | --------------------------------- | --------------------------------------------------------------- | --------------------------------------------------- | -| 6502 (core) | `packages/6502/` | Platform-independent assembler, simulator, disassembler | TypeScript, zero deps, no UI | +| 6502 (core) | `packages/core/` | Platform-independent assembler, simulator, disassembler | TypeScript, zero deps, no UI | | common-ui | `packages/common-ui/` | Shared UI logic, controllers, interfaces — 4-layer architecture | TypeScript, no platform deps | | app-gnome | `packages/app-gnome/` | GNOME desktop app | TypeScript, GJS, GTK 4, Adwaita, Vite, Meson | | app-web | `packages/app-web/` | Web app | TypeScript, HTML, CSS, Vite, Jekyll | @@ -105,7 +105,7 @@ Applies to all files in `packages/app-gnome/`. Blueprint rules apply to all `.bl Native GNOME desktop app — deep integration, GNOME HIG adherence. Stack: TypeScript + GJS + GTK 4 + Adwaita + Vite + Meson. -Events: prefer `event-dispatcher.ts` from `packages/6502/` over raw GNOME signals. +Events: prefer `event-dispatcher.ts` from `packages/core/` over raw GNOME signals. ### Adwaita styling references @@ -253,7 +253,7 @@ s.append_scaled_texture( Applies to all files in `packages/app-android/`. Stack: TypeScript + NativeScript (no Angular/Vue). UI: custom TS components wrapping native Android widgets, Material Design 3. -Events: `packages/6502/event-dispatcher.ts`. Build: NativeScript + Gradle. +Events: `packages/core/event-dispatcher.ts`. Build: NativeScript + Gradle. ### Reference projects diff --git a/README.md b/README.md index c64a3579..0975a5fd 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ This project is a fork of the [original web-based easy6502 tutorial](https://git - [app-gnome](./packages/app-gnome/): Main GNOME desktop application with Adwaita styling - [app-android](./packages/app-android/): Android application with NativeScript - [app-web](./packages/app-web/): Web application version -- [6502](./packages/6502/): Core 6502 assembler, simulator, and disassembler +- [core](./packages/core/): Core 6502 assembler, simulator, and disassembler (published as `@learn6502/core`) - [common-ui](./packages/common-ui/): Shared UI components and controllers - [learn](./packages/learn/): Tutorial content and learning materials - [translations](./packages/translations/): Localization files and build system diff --git a/packages/6502/README.md b/packages/6502/README.md deleted file mode 100644 index 3ffea45c..00000000 --- a/packages/6502/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# 6502 Package - -This package contains a TypeScript implementation of a 6502 assembler and simulator, originally developed by Stian Soreng and adapted by Nick Morgan for the easy6502 tutorial. - -## Features - -- **Assembler**: Convert 6502 assembly code to machine code -- **Simulator**: Execute 6502 machine code with cycle-accurate emulation -- **Debugger Support**: Monitor registers, flags, and memory in real-time -- **Memory Management**: Handle the 6502's 16-bit address space -- **Instruction Set**: Support for all 6502 instructions and addressing modes - -## History - -- Original implementation by Stian Soreng (2006-2010) - www.6502asm.com -- Adapted by Nick Morgan for easy6502 tutorial - https://github.com/skilldrick/6502js -- Further adapted for this project to support both GNOME and web applications - -## Usage - -This package is used internally by both the GNOME application and web version to provide the core 6502 emulation functionality. It's not meant to be used directly, but rather as a dependency for the main applications. - -## Development - -To build this package: - -```bash -gjsify run build -``` - -## License - -This package is licensed under the [GNU General Public License](http://gnu.org/licenses/gpl.html). diff --git a/packages/app-android/app/i18n/de.json b/packages/app-android/app/i18n/de.json index 2398136f..d42c3553 100644 --- a/packages/app-android/app/i18n/de.json +++ b/packages/app-android/app/i18n/de.json @@ -349,7 +349,7 @@ "Snake Game Data ($00-$15)": "Snake-Spieldaten ($00-$15)", "Snake Game Memory Usage": "Speichernutzung im Snake-Spiel", "So far we're only able to write basic programs without any branching logic. Let's change that.": "Bisher können wir nur einfache Programme ohne Verzweigungslogik schreiben. Lass uns das ändern.", - "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "Also, lass uns loslegen! Diese Anwendung enthält einen JavaScript 6502 Assembler und Simulator, den ich für dieses interaktive Tutorial angepasst habe. Klicke auf den Kopieren-Button im Code-Block unten, um den Beispielcode in den Editor zu kopieren. Verwende dann Assemblieren, um den Code zu assemblieren, und Ausführen, um ihn auszuführen. Du findest diese Aktionen als Buttons oder im Menü.", + "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "Also, lass uns loslegen! Diese Anwendung enthält einen JavaScript 6502 Assembler und Simulator, den ich für dieses interaktive Tutorial angepasst habe. Klicke auf den Kopieren-Button im Code-Block unten, um den Beispielcode in den Editor zu kopieren. Verwende dann Assemblieren, um den Code zu assemblieren, und Ausführen, um ihn auszuführen. Du findest diese Aktionen als Buttons oder im Menü.", "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location.": "Wenn wir also upKey betrachten und die aktuelle Richtung nach unten ist (4), wird der Bit-Test Null sein. BNE bedeutet \"verzweige, wenn das Zero-Flag nicht gesetzt ist\", also werden wir in diesem Fall zu illegalMove verzweigen, was einfach aus dem Unterprogramm zurückkehrt. Andernfalls wird die neue Richtung (in diesem Fall 1) in der entsprechenden Speicheradresse gespeichert.", "So, the instruction STA $0200 stores the value of the A register to memory location $0200. Click Step four more times to execute the rest of the instructions, keeping an eye on the A register as it changes.": "Die Anweisung STA $0200 speichert also den Wert des A-Registers an der Speicheradresse $0200. Klicke noch vier Mal auf Schritt, um die restlichen Anweisungen auszuführen, und beobachte dabei, wie sich das A-Register verändert.", "So, what's this program actually doing? Let's step through it. Hit Reset, then use Step to execute the program one instruction at a time. The Debug view shows the registers and memory — it's a separate tab on a small window, and the panel below the game console on a wide one. Click Step once and you'll notice in the debug view that A= changed from $00 to $01, and PC= changed from $0600 to $0602.": "Was macht dieses Programm eigentlich? Lass uns es Schritt für Schritt durchgehen. Klicke auf Zurücksetzen und verwende dann Schritt, um das Programm Anweisung für Anweisung auszuführen. Die Debug-Ansicht zeigt die Register und den Speicher — auf einem kleinen Fenster ist sie ein eigener Tab, auf einem breiten das Panel unter der Spielkonsole. Klicke einmal auf Schritt und du wirst in der Debug-Ansicht sehen, dass sich A= von $00 zu $01 und PC= von $0600 zu $0602 geändert hat.", diff --git a/packages/app-android/app/i18n/en.default.json b/packages/app-android/app/i18n/en.default.json index 4e41155a..f63e1ca3 100644 --- a/packages/app-android/app/i18n/en.default.json +++ b/packages/app-android/app/i18n/en.default.json @@ -349,7 +349,7 @@ "Snake Game Data ($00-$15)": "Snake Game Data ($00-$15)", "Snake Game Memory Usage": "Snake Game Memory Usage", "So far we're only able to write basic programs without any branching logic. Let's change that.": "So far we're only able to write basic programs without any branching logic. Let's change that.", - "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.", + "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.", "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location.": "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location.", "So, the instruction STA $0200 stores the value of the A register to memory location $0200. Click Step four more times to execute the rest of the instructions, keeping an eye on the A register as it changes.": "So, the instruction STA $0200 stores the value of the A register to memory location $0200. Click Step four more times to execute the rest of the instructions, keeping an eye on the A register as it changes.", "So, what's this program actually doing? Let's step through it. Hit Reset, then use Step to execute the program one instruction at a time. The Debug view shows the registers and memory — it's a separate tab on a small window, and the panel below the game console on a wide one. Click Step once and you'll notice in the debug view that A= changed from $00 to $01, and PC= changed from $0600 to $0602.": "So, what's this program actually doing? Let's step through it. Hit Reset, then use Step to execute the program one instruction at a time. The Debug view shows the registers and memory — it's a separate tab on a small window, and the panel below the game console on a wide one. Click Step once and you'll notice in the debug view that A= changed from $00 to $01, and PC= changed from $0600 to $0602.", diff --git a/packages/app-android/app/i18n/es.json b/packages/app-android/app/i18n/es.json index 1764ca44..41a65598 100644 --- a/packages/app-android/app/i18n/es.json +++ b/packages/app-android/app/i18n/es.json @@ -349,7 +349,7 @@ "Snake Game Data ($00-$15)": "Datos del juego Snake ($00-$15)", "Snake Game Memory Usage": "Uso de memoria del juego Snake", "So far we're only able to write basic programs without any branching logic. Let's change that.": "Hasta ahora solo podemos escribir programas básicos sin lógica de ramificación. Cambiemos eso.", - "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "¡Vamos allá! Esta aplicación contiene un ensamblador y simulador 6502 en JavaScript que he adaptado para este tutorial interactivo. Haz clic en el botón Copiar del bloque de código de abajo para copiar el ejemplo al editor. Después usa Ensamblar para ensamblar el código y Ejecutar para ejecutarlo. Encontrarás estas acciones como botones o en el menú.", + "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "¡Vamos allá! Esta aplicación contiene un ensamblador y simulador 6502 en JavaScript que he adaptado para este tutorial interactivo. Haz clic en el botón Copiar del bloque de código de abajo para copiar el ejemplo al editor. Después usa Ensamblar para ensamblar el código y Ejecutar para ejecutarlo. Encontrarás estas acciones como botones o en el menú.", "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location.": "Así que, mirando upKey, si la dirección actual es hacia abajo (4), la prueba de bits será cero. BNE significa \"salta si el indicador cero está limpio\", por lo que en este caso saltaremos a illegalMove, que simplemente retorna de la subrutina. En caso contrario, se almacena la nueva dirección (1 en este caso) en la ubicación de memoria correspondiente.", "So, the instruction STA $0200 stores the value of the A register to memory location $0200. Click Step four more times to execute the rest of the instructions, keeping an eye on the A register as it changes.": "Así que, la instrucción STA $0200 almacena el valor del registro A en la dirección de memoria $0200. Haz clic en Paso cuatro veces más para ejecutar el resto de instrucciones, observando cómo cambia el registro A.", "So, what's this program actually doing? Let's step through it. Hit Reset, then use Step to execute the program one instruction at a time. The Debug view shows the registers and memory — it's a separate tab on a small window, and the panel below the game console on a wide one. Click Step once and you'll notice in the debug view that A= changed from $00 to $01, and PC= changed from $0600 to $0602.": "Entonces, ¿qué hace realmente este programa? Recorrámoslo paso a paso. Pulsa Reiniciar y luego usa Paso para ejecutar el programa instrucción por instrucción. La vista Depurar muestra los registros y la memoria: es una pestaña aparte en una ventana pequeña, y el panel debajo de la consola del juego en una ventana ancha. Haz clic en Paso una vez y verás en la vista Depurar que A= cambia de $00 a $01, y PC= de $0600 a $0602.", diff --git a/packages/app-android/app/i18n/fi.json b/packages/app-android/app/i18n/fi.json index 6b1ae419..de78366f 100644 --- a/packages/app-android/app/i18n/fi.json +++ b/packages/app-android/app/i18n/fi.json @@ -349,7 +349,7 @@ "Snake Game Data ($00-$15)": "Matopelin data ($00-$15)", "Snake Game Memory Usage": "Matopelin muistinkäyttö", "So far we're only able to write basic programs without any branching logic. Let's change that.": "Toistaiseksi osaamme kirjoittaa vain perusohjelmia ilman haarautumislogiikkaa. Muutetaan se.", - "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "Sukellaan siis mukaan! Tämä sovellus sisältää JavaScript 6502 -assemblerin ja -simulaattorin, jonka olen mukauttanut tätä vuorovaikutteista opasta varten. Napsauta alla olevan koodilohkon Kopioi-painiketta kopioidaksesi esimerkkikoodin muokkaimeen. Käytä sitten Käännä konekielelle-toimintoa koodin kääntämiseen ja Suorita-toimintoa sen suorittamiseen. Löydät nämä toiminnot painikkeina tai valikosta.", + "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "Sukellaan siis mukaan! Tämä sovellus sisältää JavaScript 6502 -assemblerin ja -simulaattorin, jonka olen mukauttanut tätä vuorovaikutteista opasta varten. Napsauta alla olevan koodilohkon Kopioi-painiketta kopioidaksesi esimerkkikoodin muokkaimeen. Käytä sitten Käännä konekielelle-toimintoa koodin kääntämiseen ja Suorita-toimintoa sen suorittamiseen. Löydät nämä toiminnot painikkeina tai valikosta.", "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location.": "Tarkastellaan siis upKey:tä: jos nykyinen suunta on alas (4), bittitestin tulos on nolla. BNE tarkoittaa \"haaraudu, jos nollalippu on nollattu\", joten tässä tapauksessa haaraudumme illegalMove-kohtaan, joka yksinkertaisesti palaa aliohjelmasta. Muussa tapauksessa uusi suunta (tässä tapauksessa 1) tallennetaan asianmukaiseen muistiosoitteeseen.", "So, the instruction STA $0200 stores the value of the A register to memory location $0200. Click Step four more times to execute the rest of the instructions, keeping an eye on the A register as it changes.": "Käsky STA $0200 siis tallentaa A-rekisterin arvon muistiosoitteeseen $0200. Napsauta Askel vielä neljä kertaa suorittaaksesi loput käskyt ja seuraa A-rekisterin muuttumista.", "So, what's this program actually doing? Let's step through it. Hit Reset, then use Step to execute the program one instruction at a time. The Debug view shows the registers and memory — it's a separate tab on a small window, and the panel below the game console on a wide one. Click Step once and you'll notice in the debug view that A= changed from $00 to $01, and PC= changed from $0600 to $0602.": "Mitä tämä ohjelma siis oikeastaan tekee? Käydään se läpi askel kerrallaan. Paina Nollaa ja käytä sitten Askel-toimintoa suorittaaksesi ohjelman käsky kerrallaan. Vianjäljitys-näkymä näyttää rekisterit ja muistin — se on erillinen välilehti pienessä ikkunassa ja pelikonsolin alapuolella oleva paneeli leveässä. Napsauta Askel kerran ja huomaat vianjäljitysnäkymässä, että A= muuttui $00:sta $01:ksi ja PC= muuttui $0600:sta $0602:ksi.", diff --git a/packages/app-android/app/i18n/fr.json b/packages/app-android/app/i18n/fr.json index 20318772..c00a0efd 100644 --- a/packages/app-android/app/i18n/fr.json +++ b/packages/app-android/app/i18n/fr.json @@ -349,7 +349,7 @@ "Snake Game Data ($00-$15)": "Données du jeu Snake ($00-$15)", "Snake Game Memory Usage": "Utilisation mémoire du jeu Snake", "So far we're only able to write basic programs without any branching logic. Let's change that.": "Jusqu'à présent, nous ne pouvons écrire que des programmes basiques sans logique de branchement. Changeons ça.", - "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "Allons-y ! Cette application contient un assembleur et simulateur JavaScript 6502 que j'ai adapté pour ce tutoriel interactif. Cliquez sur le bouton Copier dans le bloc de code ci-dessous pour copier le code d'exemple dans l'éditeur. Utilisez ensuite Assembler pour assembler le code, puis Exécuter pour le lancer. Vous trouverez ces actions sous forme de boutons ou dans le menu.", + "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "Allons-y ! Cette application contient un assembleur et simulateur JavaScript 6502 que j'ai adapté pour ce tutoriel interactif. Cliquez sur le bouton Copier dans le bloc de code ci-dessous pour copier le code d'exemple dans l'éditeur. Utilisez ensuite Assembler pour assembler le code, puis Exécuter pour le lancer. Vous trouverez ces actions sous forme de boutons ou dans le menu.", "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location.": "En regardant upKey, si la direction actuelle est bas (4), le test de bit sera zéro. BNE signifie \"branch if the zero flag is clear\" (branche si le drapeau zéro est effacé), donc dans ce cas nous branchons vers illegalMove, qui retourne simplement de la sous-routine. Sinon, la nouvelle direction (1 dans ce cas) est stockée à l'emplacement mémoire approprié.", "So, the instruction STA $0200 stores the value of the A register to memory location $0200. Click Step four more times to execute the rest of the instructions, keeping an eye on the A register as it changes.": "L'instruction STA $0200 stocke la valeur du registre A à l'emplacement mémoire $0200. Cliquez sur Step quatre fois de plus pour exécuter le reste des instructions, en gardant un œil sur le registre A pendant qu'il change.", "So, what's this program actually doing? Let's step through it. Hit Reset, then use Step to execute the program one instruction at a time. The Debug view shows the registers and memory — it's a separate tab on a small window, and the panel below the game console on a wide one. Click Step once and you'll notice in the debug view that A= changed from $00 to $01, and PC= changed from $0600 to $0602.": "Que fait réellement ce programme ? Parcourons-le étape par étape. Cliquez sur Réinitialiser, puis utilisez Pas à pas pour exécuter le programme une instruction à la fois. La vue Déboguer affiche les registres et la mémoire — c'est un onglet séparé sur une petite fenêtre, et le panneau sous la console de jeu sur une fenêtre large. Cliquez une fois sur Pas à pas et vous remarquerez dans la vue Déboguer que A= est passé de $00 à $01, et PC= de $0600 à $0602.", diff --git a/packages/app-android/app/i18n/he.json b/packages/app-android/app/i18n/he.json index 14382457..a572dd3c 100644 --- a/packages/app-android/app/i18n/he.json +++ b/packages/app-android/app/i18n/he.json @@ -349,7 +349,7 @@ "Snake Game Data ($00-$15)": "נתונים של משחק הסנייק ($00-$15)", "Snake Game Memory Usage": "שימוש בזיכרון של משחק הסנייק", "So far we're only able to write basic programs without any branching logic. Let's change that.": "בנתיים אנחנו יכולים לכתוב רק תוכנות פשוטות בלי שום הסתעפות לוגית. בואו נשנה את זה.", - "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "אז בואו נתחיל! הישומון הזה מכיל מאסף וסימולטור של 6502 בג'אווה־סקריפט שהתאמתי למדריך האינטראקטיבי הזה. לחצו על הכפתור העתק במסגרת הקוד למטה כדי להעתיק את דוגמת הקוד לעורך. אחר כך השתמשו ב־הַרְכֵּב כדי להרכיב את הקוד, וב־להריץ כדי להריץ אותו. אתם יכולים למצוא את הפעולות האלו ככפתורים או בתפריט.", + "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "אז בואו נתחיל! הישומון הזה מכיל מאסף וסימולטור של 6502 בג'אווה־סקריפט שהתאמתי למדריך האינטראקטיבי הזה. לחצו על הכפתור העתק במסגרת הקוד למטה כדי להעתיק את דוגמת הקוד לעורך. אחר כך השתמשו ב־הַרְכֵּב כדי להרכיב את הקוד, וב־להריץ כדי להריץ אותו. אתם יכולים למצוא את הפעולות האלו ככפתורים או בתפריט.", "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location.": "אז, אם ניקח את upKey, אם הכיוון הנוכחי הוא למטה (4), ביט הבדיקה יהיה אפס. BNE פירושו \"הסתעף אם דגל האפס אינו מוגדר\", אז במקרה הזה אנחנו נסתעף ל־illegalMove, שפשוט חוזר מהתהליכון. אחרת, הכיוון החדש (1 במקרה הזה) נשמר בנקודת הזכרון המתאימה.", "So, the instruction STA $0200 stores the value of the A register to memory location $0200. Click Step four more times to execute the rest of the instructions, keeping an eye on the A register as it changes.": "אז הפקודה STA $0200 שומרת את הערך של האוגר A בנקודת הזכרון $0200. לחצו על צעד עוד ארבעה פעמים כדי להריץ את שאר הפקודות, ושימו עין על אוגר A לראות איך הוא משתנה.", "So, what's this program actually doing? Let's step through it. Hit Reset, then use Step to execute the program one instruction at a time. The Debug view shows the registers and memory — it's a separate tab on a small window, and the panel below the game console on a wide one. Click Step once and you'll notice in the debug view that A= changed from $00 to $01, and PC= changed from $0600 to $0602.": "אז מה באמת התוכנה הזאת עושה? בואו נצעד דרכה. לחצו על איפוס, ואז השתמשו ב־צעד כדי להריץ את התוכנה פקודה אחת בכל פעם. תצוגת ניפוי שגיאות מראה את האוגרים והזיכרון — בחלון קטן זה לשונית נפרדת, ובחלון רחב זה הלוח שמתחת לקונסולת המשחק. לחצו צעד פעם אחת ותבחינו בתצוגת ניפוי השגיאות ש־A= השתנה מ־$00 ל־$01, ו־PC= השתנה מ־$0600 ל־$0602.", diff --git a/packages/app-android/app/i18n/ia.json b/packages/app-android/app/i18n/ia.json index aebe2b8d..c5f276de 100644 --- a/packages/app-android/app/i18n/ia.json +++ b/packages/app-android/app/i18n/ia.json @@ -349,7 +349,7 @@ "Snake Game Data ($00-$15)": "Datos de joco Snake ($00-$15)", "Snake Game Memory Usage": "Usage de memoria del joco Snake", "So far we're only able to write basic programs without any branching logic. Let's change that.": "Usque ora nos solo pote scriber programmas basic sin logica de ramification. Cambiemos illo.", - "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "Assi, immergiamo nos! Iste application contine un JavaScript 6502 Assembler e Simulator que io ha adaptate pro iste tutorial interactive. Clicca le button Copiar in le bloco de codice infra pro copiar le codice de exemplo al editor. Pois usa Assemblar pro assemblar le codice, e Executar pro executar lo. Tu pote trovar iste actiones como buttones o in le menu.", + "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "Assi, immergiamo nos! Iste application contine un JavaScript 6502 Assembler e Simulator que io ha adaptate pro iste tutorial interactive. Clicca le button Copiar in le bloco de codice infra pro copiar le codice de exemplo al editor. Pois usa Assemblar pro assemblar le codice, e Executar pro executar lo. Tu pote trovar iste actiones como buttones o in le menu.", "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location.": "Assi, reguardante upKey, si le direction currente es bassum (4), le test de bit sera zero. BNE significa \"ramificar si le bandiera de zero es clar\", assi in iste caso nos ramificara a illegalMove, que solo retorna del subrutina. Alteremente, le nove direction (1 in iste caso) es immagazinate in le location de memoria appropriate.", "So, the instruction STA $0200 stores the value of the A register to memory location $0200. Click Step four more times to execute the rest of the instructions, keeping an eye on the A register as it changes.": "Assi, le instruction STA $0200 immagazina le valor del registro A a location de memoria $0200. Clicca Passo quatro vices plus pro executar le resto del instructiones, reguardante le registro A como illo cambia.", "So, what's this program actually doing? Let's step through it. Hit Reset, then use Step to execute the program one instruction at a time. The Debug view shows the registers and memory — it's a separate tab on a small window, and the panel below the game console on a wide one. Click Step once and you'll notice in the debug view that A= changed from $00 to $01, and PC= changed from $0600 to $0602.": "Assi, que face iste programma actualmente? Passa per illo. Pulsa Reinitialisar, pois usa Passo pro executar le programma un instruction a un vice. Le vista Debug monstra le registros e le memoria — illo es un scheda separate in un fenestra parve, e le pannello sub le consola de joco in un large. Clicca Passo un vice e tu notara in le vista debug que A= cambiate de $00 a $01, e PC= cambiate de $0600 a $0602.", diff --git a/packages/app-android/app/i18n/id.json b/packages/app-android/app/i18n/id.json index 31cbecd4..d338635f 100644 --- a/packages/app-android/app/i18n/id.json +++ b/packages/app-android/app/i18n/id.json @@ -349,7 +349,7 @@ "Snake Game Data ($00-$15)": "Data Permainan Snake ($00-$15)", "Snake Game Memory Usage": "Penggunaan Memori Permainan Snake", "So far we're only able to write basic programs without any branching logic. Let's change that.": "Sejauh ini kita hanya dapat menulis program dasar tanpa logika percabangan. Mari kita ubah itu.", - "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "Jadi, mari kita mulai! Aplikasi ini berisi Assembler dan Simulator 6502 berbasis JavaScript yang telah saya adaptasi untuk tutorial interaktif ini. Klik tombol Salin pada blok kode di bawah untuk menyalin contoh kode ke editor. Kemudian gunakan Assemble untuk meng-assemble kode, dan Jalankan untuk menjalankannya. Anda dapat menemukan tindakan-tindakan ini sebagai tombol atau di dalam menu.", + "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "Jadi, mari kita mulai! Aplikasi ini berisi Assembler dan Simulator 6502 berbasis JavaScript yang telah saya adaptasi untuk tutorial interaktif ini. Klik tombol Salin pada blok kode di bawah untuk menyalin contoh kode ke editor. Kemudian gunakan Assemble untuk meng-assemble kode, dan Jalankan untuk menjalankannya. Anda dapat menemukan tindakan-tindakan ini sebagai tombol atau di dalam menu.", "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location.": "Jadi, melihat upKey, jika arah saat ini adalah bawah (4), pengujian bit akan menghasilkan nol. BNE berarti \"branch jika flag zero clear\", sehingga dalam hal ini kita akan melakukan branch ke illegalMove, yang hanya kembali dari subrutin. Jika tidak, arah baru (1 dalam hal ini) disimpan di lokasi memori yang sesuai.", "So, the instruction STA $0200 stores the value of the A register to memory location $0200. Click Step four more times to execute the rest of the instructions, keeping an eye on the A register as it changes.": "Jadi, instruksi STA $0200 menyimpan nilai register A ke lokasi memori $0200. Klik Step empat kali lagi untuk mengeksekusi sisa instruksi, sambil mengamati register A saat berubah.", "So, what's this program actually doing? Let's step through it. Hit Reset, then use Step to execute the program one instruction at a time. The Debug view shows the registers and memory — it's a separate tab on a small window, and the panel below the game console on a wide one. Click Step once and you'll notice in the debug view that A= changed from $00 to $01, and PC= changed from $0600 to $0602.": "Jadi, apa yang sebenarnya dilakukan program ini? Mari kita telusuri langkah demi langkah. Tekan Reset, lalu gunakan Step untuk mengeksekusi program satu instruksi sekaligus. Tampilan Debug menampilkan register dan memori — ini adalah tab terpisah pada jendela kecil, dan panel di bawah konsol permainan pada jendela lebar. Klik Step sekali dan Anda akan melihat di tampilan debug bahwa A= berubah dari $00 menjadi $01, dan PC= berubah dari $0600 menjadi $0602.", diff --git a/packages/app-android/app/i18n/ja.json b/packages/app-android/app/i18n/ja.json index 55b681a3..8149e9d5 100644 --- a/packages/app-android/app/i18n/ja.json +++ b/packages/app-android/app/i18n/ja.json @@ -349,7 +349,7 @@ "Snake Game Data ($00-$15)": "スネークゲームデータ ($00-$15)", "Snake Game Memory Usage": "スネークゲームのメモリ使用", "So far we're only able to write basic programs without any branching logic. Let's change that.": "これまでは分岐のない基本的なプログラムしか書けませんでした。ここから変えていきましょう。", - "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "それでは始めましょう!このアプリには、このインタラクティブチュートリアル向けに調整したJavaScript 6502 アセンブラとシミュレーターが含まれています。下のコードブロックにあるコピーボタンを押して例のコードをエディターへコピーし、アセンブルでコードをアセンブルし、実行で実行します。これらの操作はボタンまたはメニューから行えます。", + "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "それでは始めましょう!このアプリには、このインタラクティブチュートリアル向けに調整したJavaScript 6502 アセンブラとシミュレーターが含まれています。下のコードブロックにあるコピーボタンを押して例のコードをエディターへコピーし、アセンブルでコードをアセンブルし、実行で実行します。これらの操作はボタンまたはメニューから行えます。", "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location.": "upKey を見ると、現在の方向が下(4)ならビットテストは 0 になります。BNE は「ゼロフラグがクリアなら分岐」を意味するので、この場合は illegalMove に分岐し、サブルーチンから単に戻ります。そうでなければ新しい方向(この場合は 1)を適切なメモリ位置に保存します。", "So, the instruction STA $0200 stores the value of the A register to memory location $0200. Click Step four more times to execute the rest of the instructions, keeping an eye on the A register as it changes.": "つまり STA $0200A の値を $0200 に保存します。ステップをさらに4回押して残りを実行し、A の変化に注目してください。", "So, what's this program actually doing? Let's step through it. Hit Reset, then use Step to execute the program one instruction at a time. The Debug view shows the registers and memory — it's a separate tab on a small window, and the panel below the game console on a wide one. Click Step once and you'll notice in the debug view that A= changed from $00 to $01, and PC= changed from $0600 to $0602.": "ではこのプログラムは何をしているのでしょう?ステップ実行して見てみましょう。リセットを押し、続いてステップ実行でプログラムを1命令ずつ実行します。デバッグビューはレジスタとメモリを表示します。小さなウィンドウでは別タブに、広いウィンドウではゲームコンソール下のパネルに表示されます。ステップ実行を1回押すと、デバッグビューでA=$00から$01に、PC=$0600から$0602へ変わるのが分かります。", diff --git a/packages/app-android/app/i18n/nl.json b/packages/app-android/app/i18n/nl.json index 05be2412..72c8ef4c 100644 --- a/packages/app-android/app/i18n/nl.json +++ b/packages/app-android/app/i18n/nl.json @@ -349,7 +349,7 @@ "Snake Game Data ($00-$15)": "Snake‑spelgegevens ($00-$15)", "Snake Game Memory Usage": "Geheugengebruik van Snake‑spel", "So far we're only able to write basic programs without any branching logic. Let's change that.": "Tot nu toe kunnen we alleen basisprogramma's schrijven zonder vertakkingslogica. Laten we dat veranderen.", - "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "Dus, laten we erin duiken! Deze applicatie bevat een JavaScript 6502 Assembler en Simulator die ik voor deze interactieve tutorial heb aangepast. Klik op de knop Kopiëren in het codeblok hieronder om de voorbeeldcode naar de editor te kopiëren. Gebruik vervolgens Assembleren om de code te assembleren en Uitvoeren om hem uit te voeren. Je vindt deze acties als knoppen of in het menu.", + "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "Dus, laten we erin duiken! Deze applicatie bevat een JavaScript 6502 Assembler en Simulator die ik voor deze interactieve tutorial heb aangepast. Klik op de knop Kopiëren in het codeblok hieronder om de voorbeeldcode naar de editor te kopiëren. Gebruik vervolgens Assembleren om de code te assembleren en Uitvoeren om hem uit te voeren. Je vindt deze acties als knoppen of in het menu.", "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location.": "Kijkend naar upKey: als de huidige richting omlaag (4) is, zal de bittest nul zijn. BNE betekent \"vertak als de zero‑vlag niet gezet is\", dus in dit geval vertakken we naar illegalMove, dat simpelweg uit de subroutine terugkeert. Anders wordt de nieuwe richting (hier 1) opgeslagen op de juiste geheugenlocatie.", "So, the instruction STA $0200 stores the value of the A register to memory location $0200. Click Step four more times to execute the rest of the instructions, keeping an eye on the A register as it changes.": "De instructie STA $0200 slaat de waarde van het A-register op in geheugenlocatie $0200. Klik nog vier keer op Stap om de rest van de instructies uit te voeren en houd het A-register in de gaten terwijl het verandert.", "So, what's this program actually doing? Let's step through it. Hit Reset, then use Step to execute the program one instruction at a time. The Debug view shows the registers and memory — it's a separate tab on a small window, and the panel below the game console on a wide one. Click Step once and you'll notice in the debug view that A= changed from $00 to $01, and PC= changed from $0600 to $0602.": "Wat doet dit programma eigenlijk? Laten we het stap voor stap doorlopen. Klik op Resetten en gebruik vervolgens Stap om het programma instructie voor instructie uit te voeren. De Debug-weergave toont de registers en het geheugen — het is een apart tabblad in een klein venster en het paneel onder de spelconsole in een breed venster. Klik één keer op Stap en je ziet in de Debug-weergave dat A= veranderde van $00 naar $01, en PC= van $0600 naar $0602.", diff --git a/packages/app-android/app/i18n/pl.json b/packages/app-android/app/i18n/pl.json index 1a6e891b..c36827ea 100644 --- a/packages/app-android/app/i18n/pl.json +++ b/packages/app-android/app/i18n/pl.json @@ -349,7 +349,7 @@ "Snake Game Data ($00-$15)": "Dane gry Snake ($00-$15)", "Snake Game Memory Usage": "Użycie pamięci w grze Snake", "So far we're only able to write basic programs without any branching logic. Let's change that.": "Do tej pory potrafimy pisać tylko podstawowe programy bez jakiejkolwiek logiki rozgałęzień. Zmieńmy to.", - "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "Zacznijmy więc! Ta aplikacja zawiera JavaScript 6502 Assembler and Simulator, który zaadoptowałem do tego interaktywnego tutorialu. Kliknij przycisk Kopiuj w bloku kodu poniżej, aby skopiować przykładowy kod do edytora. Następnie użyj Złóż, aby złożyć kod, oraz Uruchom, aby go uruchomić. Te akcje znajdziesz jako przyciski lub w menu.", + "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "Zacznijmy więc! Ta aplikacja zawiera JavaScript 6502 Assembler and Simulator, który zaadoptowałem do tego interaktywnego tutorialu. Kliknij przycisk Kopiuj w bloku kodu poniżej, aby skopiować przykładowy kod do edytora. Następnie użyj Złóż, aby złożyć kod, oraz Uruchom, aby go uruchomić. Te akcje znajdziesz jako przyciski lub w menu.", "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location.": "Patrząc więc na upKey, jeśli bieżący kierunek to dół (4), test bitu będzie zerem. BNE oznacza \"rozgałęź, jeśli flaga zero jest wyczyszczona\", więc w tym przypadku rozgałęzimy do illegalMove, które po prostu powraca z podprogramu. W przeciwnym razie nowy kierunek (1 w tym przypadku) jest przechowywany w odpowiedniej lokalizacji pamięci.", "So, the instruction STA $0200 stores the value of the A register to memory location $0200. Click Step four more times to execute the rest of the instructions, keeping an eye on the A register as it changes.": "Instrukcja STA $0200 więc przechowuje wartość rejestru A w lokalizacji pamięci $0200. Kliknij Krok cztery razy więcej, aby wykonać resztę instrukcji, obserwując rejestr A, jak się zmienia.", "So, what's this program actually doing? Let's step through it. Hit Reset, then use Step to execute the program one instruction at a time. The Debug view shows the registers and memory — it's a separate tab on a small window, and the panel below the game console on a wide one. Click Step once and you'll notice in the debug view that A= changed from $00 to $01, and PC= changed from $0600 to $0602.": "Co więc tak naprawdę robi ten program? Przejdźmy przez niego krok po kroku. Naciśnij Resetuj, następnie użyj Krok, aby wykonać program jedną instrukcję na raz. Widok Debuguj pokazuje rejestry i pamięć — w małym oknie jest osobną kartą, a w szerokim panelem pod konsolą gry. Kliknij Krok raz, a zauważysz w widoku debuguj, że A= zmieniło się z $00 na $01, a PC= zmieniło się z $0600 na $0602.", diff --git a/packages/app-android/app/i18n/pt.json b/packages/app-android/app/i18n/pt.json index 7ecc1ff9..d6479b64 100644 --- a/packages/app-android/app/i18n/pt.json +++ b/packages/app-android/app/i18n/pt.json @@ -349,7 +349,7 @@ "Snake Game Data ($00-$15)": "Dados do Jogo Snake ($00-$15)", "Snake Game Memory Usage": "Uso de Memória do Jogo Snake", "So far we're only able to write basic programs without any branching logic. Let's change that.": "Até agora só conseguimos escrever programas básicos sem qualquer lógica de ramificação. Vamos mudar isso.", - "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "Vamos mergulhar! Esta aplicação contém um Assemblador e Simulador 6502 em JavaScript que adaptei para este tutorial interativo. Clica no botão Copiar no bloco de código abaixo para copiar o código de exemplo para o editor. De seguida usa Montar para montar o código, e Executar para o executar. Podes encontrar estas ações como botões ou no menu.", + "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "Vamos mergulhar! Esta aplicação contém um Assemblador e Simulador 6502 em JavaScript que adaptei para este tutorial interativo. Clica no botão Copiar no bloco de código abaixo para copiar o código de exemplo para o editor. De seguida usa Montar para montar o código, e Executar para o executar. Podes encontrar estas ações como botões ou no menu.", "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location.": "Assim, olhando para upKey, se a direção atual é para baixo (4), o teste de bits será zero. BNE significa \"ramificar se a flag zero estiver limpa\", então neste caso ramificaremos para illegalMove, que simplesmente retorna da sub-rotina. Caso contrário, a nova direção (1 neste caso) é armazenada na localização de memória apropriada.", "So, the instruction STA $0200 stores the value of the A register to memory location $0200. Click Step four more times to execute the rest of the instructions, keeping an eye on the A register as it changes.": "Assim, a instrução STA $0200 armazena o valor do registo A na localização de memória $0200. Clica em Step mais quatro vezes para executar o resto das instruções, mantendo o olho no registo A à medida que muda.", "So, what's this program actually doing? Let's step through it. Hit Reset, then use Step to execute the program one instruction at a time. The Debug view shows the registers and memory — it's a separate tab on a small window, and the panel below the game console on a wide one. Click Step once and you'll notice in the debug view that A= changed from $00 to $01, and PC= changed from $0600 to $0602.": "Então, o que é que este programa está realmente a fazer? Vamos percorrê-lo passo a passo. Carrega em Reiniciar e, de seguida, usa Passo para executar o programa uma instrução de cada vez. A vista Depurar mostra os registos e a memória — é um separador à parte numa janela pequena, e o painel abaixo da consola de jogo numa janela larga. Clica em Passo uma vez e notarás na vista de depuração que A= mudou de $00 para $01, e PC= mudou de $0600 para $0602.", diff --git a/packages/app-android/app/i18n/pt_BR.json b/packages/app-android/app/i18n/pt_BR.json index 5435f001..c99f4237 100644 --- a/packages/app-android/app/i18n/pt_BR.json +++ b/packages/app-android/app/i18n/pt_BR.json @@ -349,7 +349,7 @@ "Snake Game Data ($00-$15)": "Dados do Jogo Snake ($00-$15)", "Snake Game Memory Usage": "Uso de Memória do Jogo Snake", "So far we're only able to write basic programs without any branching logic. Let's change that.": "Até agora só conseguimos escrever programas básicos sem qualquer lógica de ramificação. Vamos mudar isso.", - "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "Vamos mergulhar! Este aplicativo contém um Assemblador e Simulador 6502 em JavaScript que adaptei para este tutorial interativo. Clique no botão Copiar no bloco de código abaixo para copiar o código de exemplo para o editor. Depois use Montar para montar o código e Executar para executá-lo. Você encontra essas ações como botões ou no menu.", + "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "Vamos mergulhar! Este aplicativo contém um Assemblador e Simulador 6502 em JavaScript que adaptei para este tutorial interativo. Clique no botão Copiar no bloco de código abaixo para copiar o código de exemplo para o editor. Depois use Montar para montar o código e Executar para executá-lo. Você encontra essas ações como botões ou no menu.", "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location.": "Assim, olhando para upKey, se a direção atual é para baixo (4), o teste de bits será zero. BNE significa \"ramificar se a flag zero estiver limpa\", então neste caso ramificaremos para illegalMove, que simplesmente retorna da sub-rotina. Caso contrário, a nova direção (1 neste caso) é armazenada no endereço de memória apropriada.", "So, the instruction STA $0200 stores the value of the A register to memory location $0200. Click Step four more times to execute the rest of the instructions, keeping an eye on the A register as it changes.": "Assim, a instrução STA $0200 armazena o valor do registro A no endereço de memória $0200. Clique em Step mais quatro vezes para executar o resto das instruções, mantendo o olho no registro A à medida que muda.", "So, what's this program actually doing? Let's step through it. Hit Reset, then use Step to execute the program one instruction at a time. The Debug view shows the registers and memory — it's a separate tab on a small window, and the panel below the game console on a wide one. Click Step once and you'll notice in the debug view that A= changed from $00 to $01, and PC= changed from $0600 to $0602.": "Então, o que esse programa está fazendo de fato? Vamos percorrê-lo passo a passo. Clique em Reiniciar e depois use Passo para executar o programa uma instrução de cada vez. A visão Depurar mostra os registros e a memória — é uma aba separada em uma janela pequena e o painel abaixo do console do jogo em uma janela larga. Clique em Passo uma vez e você notará na visão de depuração que A= mudou de $00 para $01, e PC= mudou de $0600 para $0602.", diff --git a/packages/app-android/app/i18n/uk.json b/packages/app-android/app/i18n/uk.json index 0170f612..07712480 100644 --- a/packages/app-android/app/i18n/uk.json +++ b/packages/app-android/app/i18n/uk.json @@ -349,7 +349,7 @@ "Snake Game Data ($00-$15)": "Дані гри «Змійка» ($00-$15)", "Snake Game Memory Usage": "Використання пам'яті грою «Змійка»", "So far we're only able to write basic programs without any branching logic. Let's change that.": "Поки що ми пишемо лише базові програми без розгалужень. Змінимо це.", - "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "Отже, почнемо! У застосунку є асемблер і симулятор 6502 на JavaScript, які адаптовано для цього інтерактивного посібника. Натисніть кнопку Копіювати в блоці коду нижче, щоб скопіювати приклад у редактор. Потім скористайтеся дією Зібрати, щоб зібрати код, і Запустити, щоб виконати його. Ці дії доступні у вигляді кнопок або в меню.", + "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "Отже, почнемо! У застосунку є асемблер і симулятор 6502 на JavaScript, які адаптовано для цього інтерактивного посібника. Натисніть кнопку Копіювати в блоці коду нижче, щоб скопіювати приклад у редактор. Потім скористайтеся дією Зібрати, щоб зібрати код, і Запустити, щоб виконати його. Ці дії доступні у вигляді кнопок або в меню.", "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location.": "Розгляньмо upKey: якщо поточний напрямок — вниз (4), перевірка біта дасть нуль. BNE означає «перейти, якщо нульовий прапорець не встановлено», тож у цьому разі відбудеться перехід до illegalMove, яка просто повертається з підпрограми. Інакше новий напрямок (тут 1) зберігається у відповідній комірці пам’яті.", "So, the instruction STA $0200 stores the value of the A register to memory location $0200. Click Step four more times to execute the rest of the instructions, keeping an eye on the A register as it changes.": "Отже, інструкція STA $0200 зберігає значення регістра A у комірку пам’яті $0200. Натисніть Крок ще чотири рази, щоб виконати решту інструкцій, стежачи за змінами регістра A.", "So, what's this program actually doing? Let's step through it. Hit Reset, then use Step to execute the program one instruction at a time. The Debug view shows the registers and memory — it's a separate tab on a small window, and the panel below the game console on a wide one. Click Step once and you'll notice in the debug view that A= changed from $00 to $01, and PC= changed from $0600 to $0602.": "То що ж робить ця програма? Пройдімо її крок за кроком. Натисніть Скинути, потім скористайтеся кнопкою Крок, щоб виконувати програму по одній інструкції за раз. Вкладка Налагодження показує регістри та пам’ять — це окрема вкладка на малому вікні та панель під ігровою консоллю на широкому. Натисніть Крок один раз, і ви помітите у вкладці налагодження, що A= змінився з $00 на $01, а PC= — з $0600 на $0602.", diff --git a/packages/app-android/app/i18n/vi.json b/packages/app-android/app/i18n/vi.json index 927ebb08..e6dab880 100644 --- a/packages/app-android/app/i18n/vi.json +++ b/packages/app-android/app/i18n/vi.json @@ -349,7 +349,7 @@ "Snake Game Data ($00-$15)": "Dữ Liệu Trò Chơi Rắn Săn Mồi($00-$15)", "Snake Game Memory Usage": "Sử Dụng Bộ Nhớ Trò Chơi Rắn Săn Mồi", "So far we're only able to write basic programs without any branching logic. Let's change that.": "Cho đến nay chúng ta chỉ có thể viết các chương trình cơ bản mà không có bất kỳ logic phân nhánh nào. Hãy thay đổi điều đó.", - "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "Vì vậy, hãy đi sâu vào! Ứng dụng này chứa Trình biên dịch và Trình mô phỏng JavaScript 6502 mà tôi đã điều chỉnh cho phù hợp với hướng dẫn tương tác này. Nhấp vào nút Sao Chép trong khối mã bên dưới để sao chép mã mẫu vào trình chỉnh sửa. Sau đó dùng Tập Hợp để lắp ráp mã, và Chạy để chạy nó. Bạn có thể tìm thấy các hành động này dưới dạng nút bấm hoặc trong menu.", + "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "Vì vậy, hãy đi sâu vào! Ứng dụng này chứa Trình biên dịch và Trình mô phỏng JavaScript 6502 mà tôi đã điều chỉnh cho phù hợp với hướng dẫn tương tác này. Nhấp vào nút Sao Chép trong khối mã bên dưới để sao chép mã mẫu vào trình chỉnh sửa. Sau đó dùng Tập Hợp để lắp ráp mã, và Chạy để chạy nó. Bạn có thể tìm thấy các hành động này dưới dạng nút bấm hoặc trong menu.", "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location.": "Vì vậy, nhìn vào upKey, nếu hướng hiện tại hướng xuống (4), kiểm tra bit sẽ bằng 0. BNE có nghĩa là \"phân nhánh nếu cờ 0 rõ ràng\", vì vậy trong trường hợp này chúng ta sẽ phân nhánh thành illegalMove, vốn chỉ trả về từ chương trình con. Ngược lại, hướng mới (1 trong trường hợp này) được lưu ở vị trí bộ nhớ thích hợp.", "So, the instruction STA $0200 stores the value of the A register to memory location $0200. Click Step four more times to execute the rest of the instructions, keeping an eye on the A register as it changes.": "Vì vậy, lệnh STA $0200 lưu trữ giá trị của thanh ghi A vào vị trí bộ nhớ $0200. Nhấp vào Bước bốn lần nữa để thực hiện phần còn lại của hướng dẫn, chú ý đến thanh ghi A khi nó thay đổi.", "So, what's this program actually doing? Let's step through it. Hit Reset, then use Step to execute the program one instruction at a time. The Debug view shows the registers and memory — it's a separate tab on a small window, and the panel below the game console on a wide one. Click Step once and you'll notice in the debug view that A= changed from $00 to $01, and PC= changed from $0600 to $0602.": "Vậy thực chất chương trình này đang làm gì? Hãy xem qua từng bước. Nhấn Đặt Lại, sau đó dùng Bước để thực hiện từng lệnh một của chương trình. Khung Gỡ lỗi hiển thị các thanh ghi và bộ nhớ — đó là một tab riêng trên cửa sổ nhỏ, và là khung bên dưới console trò chơi trên cửa sổ rộng. Nhấp Bước một lần và bạn sẽ nhận thấy trong khung gỡ lỗi rằng A= đã thay đổi từ $00 thành $01, và PC= đã thay đổi từ $0600 thành $0602.", diff --git a/packages/app-android/app/i18n/zh_Hans.json b/packages/app-android/app/i18n/zh_Hans.json index c6bac2b1..9db55538 100644 --- a/packages/app-android/app/i18n/zh_Hans.json +++ b/packages/app-android/app/i18n/zh_Hans.json @@ -349,7 +349,7 @@ "Snake Game Data ($00-$15)": "贪吃蛇游戏数据($00–$15)", "Snake Game Memory Usage": "贪吃蛇内存使用情况", "So far we're only able to write basic programs without any branching logic. Let's change that.": "到目前为止我们只能编写没有分支逻辑的基础程序。让我们改变这一点。", - "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "那么,让我们开始吧!本应用包含我为该交互式教程改造的 JavaScript 6502 汇编器与模拟器。点击下方代码块中的 复制 按钮将示例代码复制到编辑器,然后用 汇编 汇编代码,再用 运行 运行它。这些操作既可以作为按钮使用,也可以在菜单中找到。", + "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu.": "那么,让我们开始吧!本应用包含我为该交互式教程改造的 JavaScript 6502 汇编器与模拟器。点击下方代码块中的 复制 按钮将示例代码复制到编辑器,然后用 汇编 汇编代码,再用 运行 运行它。这些操作既可以作为按钮使用,也可以在菜单中找到。", "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location.": "以 upKey 为例,若当前方向为下(4),位测试结果为零。BNE 表示“若零标志清除则分支”,因此将跳转到 illegalMove,该分支仅从子程序返回。否则将新方向(此例为 1)写入相应内存位置。", "So, the instruction STA $0200 stores the value of the A register to memory location $0200. Click Step four more times to execute the rest of the instructions, keeping an eye on the A register as it changes.": "指令 STA $0200 将寄存器 A 的值写入内存位置 $0200。再点击 Step 四次执行其余指令,并留意 A 的变化。", "So, what's this program actually doing? Let's step through it. Hit Reset, then use Step to execute the program one instruction at a time. The Debug view shows the registers and memory — it's a separate tab on a small window, and the panel below the game console on a wide one. Click Step once and you'll notice in the debug view that A= changed from $00 to $01, and PC= changed from $0600 to $0602.": "那么这个程序实际上在做什么?我们来单步看看。点击 重置,然后用 单步 逐条执行程序。调试 视图会显示寄存器与内存——在小窗口上它是一个独立标签页,在宽屏窗口上它是游戏控制台下方的面板。点击一次 单步,你会在调试视图中看到 A=$00 变为 $01PC=$0600 变为 $0602。", diff --git a/packages/app-android/data/Android/src/main/res/values-de/strings.xml b/packages/app-android/data/Android/src/main/res/values-de/strings.xml index 4355e389..0276455d 100644 --- a/packages/app-android/data/Android/src/main/res/values-de/strings.xml +++ b/packages/app-android/data/Android/src/main/res/values-de/strings.xml @@ -140,7 +140,7 @@ "Alle Zahlen mit dem Präfix <tt>$</tt> in der 6502-Assemblersprache (und folglich auch in diesem Buch) sind im Hexadezimal-(Hex)-Format. Wenn du mit Hexadezimalzahlen nicht vertraut bist, empfehle ich dir, <a href=\"https://en.wikipedia.org/wiki/Hexadecimal\">den Wikipedia-Artikel</a> zu lesen. Alles mit dem Präfix <tt>#</tt> ist ein Literalwert. Alle anderen Zahlen beziehen sich auf Speicheradressen." "Was macht dieses Programm eigentlich? Lass uns es Schritt für Schritt durchgehen. Klicke auf <b>Zurücksetzen</b> und wähle dann <b>Schritt</b> aus dem Dropdown-Menü. Der Button wechselt in den Schritt-Modus, wodurch du das Programm Anweisung für Anweisung ausführen kannst. Nach einem Klick wirst du im Debugger sehen, dass sich <tt>A=</tt> von <tt>$00</tt> zu <tt>$01</tt> und <tt>PC=</tt> von <tt>$0600</tt> zu <tt>$0602</tt> geändert hat." "Der schwarze Spielkonsolenbildschirm sollte jetzt drei farbige \"Pixel\" oben links zeigen." - "Also, lass uns loslegen! Diese Anwendung enthält einen <a href=\"https://github.com/JumpLink/Learn6502/tree/main/packages/6502\">JavaScript 6502 Assembler und Simulator</a>, den ich für dieses interaktive Tutorial angepasst habe. Klicke auf den <b>Kopieren</b>-Button im Code-Block unten, um den Beispielcode in den Editor zu kopieren. Klicke dann auf den Button oben rechts, um den Code zu assemblieren, und klicke erneut, um das Programm auszuführen. Diese Aktionen kannst du auch über das Dropdown-Menü aufrufen." + "Also, lass uns loslegen! Diese Anwendung enthält einen <a href=\"https://github.com/JumpLink/Learn6502/tree/main/packages/core\">JavaScript 6502 Assembler und Simulator</a>, den ich für dieses interaktive Tutorial angepasst habe. Klicke auf den <b>Kopieren</b>-Button im Code-Block unten, um den Beispielcode in den Editor zu kopieren. Klicke dann auf den Button oben rechts, um den Code zu assemblieren, und klicke erneut, um das Programm auszuführen. Diese Aktionen kannst du auch über das Dropdown-Menü aufrufen." "Unser erstes Programm" "Warum dann 6502? Warum nicht eine <i>nützliche</i> Assemblersprache wie <a href=\"https://en.wikipedia.org/wiki/X86\">x86</a>? Nun, ich denke nicht, dass das Lernen von x86 nützlich ist. Ich glaube nicht, dass du jemals in deinem Arbeitsalltag Assemblersprache <i>schreiben</i> musst - dies ist eine rein akademische Übung, etwas um deinen Geist und dein Denken zu erweitern. 6502 wurde ursprünglich in einer anderen Zeit geschrieben, als die Mehrheit der Entwickler direkt in Assembler programmierte, statt in diesen neumodischen höheren Programmiersprachen. Daher wurde es für Menschen geschrieben. Modernere Assemblersprachen sind dafür gedacht, von Compilern geschrieben zu werden, also überlassen wir es ihnen. Außerdem macht 6502 <i>Spaß</i>. Niemand hat je x86 als <i>spaßig</i> bezeichnet." "Aber ernsthaft, ich denke es ist wertvoll, ein Verständnis für Assemblersprache zu haben. Assemblersprache ist die niedrigste Abstraktionsebene in Computern - der Punkt, an dem der Code noch lesbar ist. Assemblersprache wird direkt in die Bytes übersetzt, die von deinem Computerprozessor ausgeführt werden. Wenn du verstehst, wie es funktioniert, bist du im Grunde ein Computer-<a href=\"https://www.skilldrick.co.uk/2011/04/magic-in-software-development/\">Magier</a> geworden." diff --git a/packages/app-android/data/Android/src/main/res/values-fr/strings.xml b/packages/app-android/data/Android/src/main/res/values-fr/strings.xml index 611a14fd..bb4f510b 100644 --- a/packages/app-android/data/Android/src/main/res/values-fr/strings.xml +++ b/packages/app-android/data/Android/src/main/res/values-fr/strings.xml @@ -141,7 +141,7 @@ "Any numbers prefixed with <tt>$</tt> in 6502 assembly language (and by extension, in this book) are in hexadecimal (hex) format. If you\'re not familiar with hex numbers, I recommend you read <a href=\"https://en.wikipedia.org/wiki/Hexadecimal\">the Wikipedia article</a>. Anything prefixed with <tt>#</tt> is a literal number value. Any other number refers to a memory location." "So, what\'s this program actually doing? Let\'s step through it. Hit <b>Reset</b>, then select <b>Step</b> from the dropdown menu. The button will switch to step mode, allowing you to execute the program one instruction at a time. Click once and you\'ll notice in the debugger that <tt>A=</tt> changed from <tt>$00</tt> to <tt>$01</tt>, and <tt>PC=</tt> changed from <tt>$0600</tt> to <tt>$0602</tt>." "The black game console screen now should show three coloured \"pixels\" at the top left." - "So, let\'s dive in! This application contains a <a href=\"https://github.com/JumpLink/Learn6502/tree/main/packages/6502\">JavaScript 6502 Assembler and Simulator</a> that I have adapted for this interactive tutorial. Click the <b>Copy</b> button in the code block below to copy the example code to the editor. Then click the button in the top right to assemble the code, then click it again to run the program. You can also access these actions through the dropdown menu." + "So, let\'s dive in! This application contains a <a href=\"https://github.com/JumpLink/Learn6502/tree/main/packages/core\">JavaScript 6502 Assembler and Simulator</a> that I have adapted for this interactive tutorial. Click the <b>Copy</b> button in the code block below to copy the example code to the editor. Then click the button in the top right to assemble the code, then click it again to run the program. You can also access these actions through the dropdown menu." "Our first program" "Then why 6502? Why not a <i>useful</i> assembly language, like <a href=\"https://en.wikipedia.org/wiki/X86\">x86</a>? Well, I don\'t think learning x86 is useful. I don\'t think you\'ll ever have to <i>write</i> assembly language in your day job - this is purely an academic exercise, something to expand your mind and your thinking. 6502 was originally written in a different age, a time when the majority of developers were writing assembly directly, rather than in these new-fangled high-level programming languages. So, it was designed to be written by humans. More modern assembly languages are meant to written by compilers, so let\'s leave it to them. Plus, 6502 is <i>fun</i>. Nobody ever called x86 <i>fun</i>." "Seriously though, I think it\'s valuable to have an understanding of assembly language. Assembly language is the lowest level of abstraction in computers - the point at which the code is still readable. Assembly language translates directly to the bytes that are executed by your computer\'s processor. If you understand how it works, you\'ve basically become a computer <a href=\"https://www.skilldrick.co.uk/2011/04/magic-in-software-development/\">magician</a>." diff --git a/packages/app-android/data/Android/src/main/res/values/strings.xml b/packages/app-android/data/Android/src/main/res/values/strings.xml index b83f59bf..ba44f1ca 100644 --- a/packages/app-android/data/Android/src/main/res/values/strings.xml +++ b/packages/app-android/data/Android/src/main/res/values/strings.xml @@ -140,7 +140,7 @@ "Any numbers prefixed with <tt>$</tt> in 6502 assembly language (and by extension, in this book) are in hexadecimal (hex) format. If you\'re not familiar with hex numbers, I recommend you read <a href=\"https://en.wikipedia.org/wiki/Hexadecimal\">the Wikipedia article</a>. Anything prefixed with <tt>#</tt> is a literal number value. Any other number refers to a memory location." "So, what\'s this program actually doing? Let\'s step through it. Hit <b>Reset</b>, then select <b>Step</b> from the dropdown menu. The button will switch to step mode, allowing you to execute the program one instruction at a time. Click once and you\'ll notice in the debugger that <tt>A=</tt> changed from <tt>$00</tt> to <tt>$01</tt>, and <tt>PC=</tt> changed from <tt>$0600</tt> to <tt>$0602</tt>." "The black game console screen now should show three coloured \"pixels\" at the top left." - "So, let\'s dive in! This application contains a <a href=\"https://github.com/JumpLink/Learn6502/tree/main/packages/6502\">JavaScript 6502 Assembler and Simulator</a> that I have adapted for this interactive tutorial. Click the <b>Copy</b> button in the code block below to copy the example code to the editor. Then click the button in the top right to assemble the code, then click it again to run the program. You can also access these actions through the dropdown menu." + "So, let\'s dive in! This application contains a <a href=\"https://github.com/JumpLink/Learn6502/tree/main/packages/core\">JavaScript 6502 Assembler and Simulator</a> that I have adapted for this interactive tutorial. Click the <b>Copy</b> button in the code block below to copy the example code to the editor. Then click the button in the top right to assemble the code, then click it again to run the program. You can also access these actions through the dropdown menu." "Our first program" "Then why 6502? Why not a <i>useful</i> assembly language, like <a href=\"https://en.wikipedia.org/wiki/X86\">x86</a>? Well, I don\'t think learning x86 is useful. I don\'t think you\'ll ever have to <i>write</i> assembly language in your day job - this is purely an academic exercise, something to expand your mind and your thinking. 6502 was originally written in a different age, a time when the majority of developers were writing assembly directly, rather than in these new-fangled high-level programming languages. So, it was designed to be written by humans. More modern assembly languages are meant to written by compilers, so let\'s leave it to them. Plus, 6502 is <i>fun</i>. Nobody ever called x86 <i>fun</i>." "Seriously though, I think it\'s valuable to have an understanding of assembly language. Assembly language is the lowest level of abstraction in computers - the point at which the code is still readable. Assembly language translates directly to the bytes that are executed by your computer\'s processor. If you understand how it works, you\'ve basically become a computer <a href=\"https://www.skilldrick.co.uk/2011/04/magic-in-software-development/\">magician</a>." diff --git a/packages/app-web/index.markdown b/packages/app-web/index.markdown index 46746455..823379bd 100644 --- a/packages/app-web/index.markdown +++ b/packages/app-web/index.markdown @@ -46,7 +46,7 @@ leave it to them. Plus, 6502 is _fun_. Nobody ever called x86 _fun_.

Our first program

So, let's dive in! That thing below is a little [JavaScript 6502 assembler and -simulator](https://github.com/JumpLink/Learn6502/tree/main/packages/6502) that I adapted for this book. +simulator](https://github.com/JumpLink/Learn6502/tree/main/packages/core) that I adapted for this book. Click **Assemble** then **Run** to assemble and run the snippet of assembly language. {% include start.html %} diff --git a/packages/core/README.md b/packages/core/README.md new file mode 100644 index 00000000..16a3a361 --- /dev/null +++ b/packages/core/README.md @@ -0,0 +1,158 @@ +# @learn6502/core + +A standalone **6502 assembler, simulator and disassembler** written in TypeScript. + +This is the engine behind [Learn 6502 Assembly](https://github.com/JumpLink/Learn6502) — the +GNOME / Web / Android learning app — extracted as a dependency-free, runtime-agnostic library. It +has **no runtime dependencies** and runs anywhere modern JavaScript does: Node.js, [GJS](https://gjs.guide/) +(GNOME / SpiderMonkey) and the browser. + +## What it does + +- **Assemble** 6502 assembly source into machine code. +- **Simulate** that machine code with a full 6502 CPU emulation (registers, flags, stack, the + 64 KB address space, a memory-mapped display region and a keypress input cell). +- **Disassemble** machine code back into readable, structured instructions. +- **Observe everything** through typed events — assembly success/failure, every executed step, + memory writes, label resolution, and more. + +## Installation + +```bash +npm install @learn6502/core +# or +yarn add @learn6502/core +# or +pnpm add @learn6502/core +``` + +The package ships ES modules with bundled TypeScript declarations. + +## Quick start + +The library is built around four small classes. The `Assembler` and the `Simulator` operate on a +**shared** `Memory` and `Labels` instance — assemble into memory, then run it: + +```ts +import { Memory, Labels, Assembler, Simulator } from "@learn6502/core"; + +// 1. Wire up the four core pieces (Assembler + Simulator share Memory + Labels). +const memory = new Memory(); +const labels = new Labels(); +const assembler = new Assembler(memory, labels); +const simulator = new Simulator(memory, labels); + +// 2. React to assembly + execution via typed events. +assembler.on("assemble-failure", (e) => console.error("Assembly error:", e.message)); +simulator.on("stop", () => { + console.log("Accumulator (A):", simulator.info.regA); + console.log("$0200 =", memory.get(0x0200)); +}); + +// 3. Assemble a small program — machine code is written into memory at $0600. +const ok = assembler.assembleCode(` + LDA #$07 ; load 7 into the accumulator + STA $0200 ; store it to the top-left display pixel + BRK ; stop the program +`); + +// 4. Run it. Execution is asynchronous (driven by a timer); the "stop" event +// above fires when the program reaches BRK. +if (ok) simulator.runBinary(); +``` + +## Core classes + +| Class | Constructor | Purpose | +|-------|-------------|---------| +| `Memory` | `new Memory()` | The 64 KB (`0x0000`–`0xFFFF`) address space. `get(addr)` / `set(addr, val)`, `getWord(addr)`, `storeKeypress(val)`, `format(...)`. | +| `Labels` | `new Labels()` | Symbol table mapping label names to addresses. `find(name)`, `getPC(name)`, `reset()`. | +| `Assembler` | `new Assembler(memory, labels)` | `assembleCode(src)` → writes machine code to memory; `disassemble()`, `hexdump(...)`, `getCurrentPC()`. | +| `Simulator` | `new Simulator(memory, labels)` | `runBinary()` (start/stop), `debugExecStep()`, `reset()`, `gotoAddr(...)`, `enableStepper()` / `stopStepper()`; `info` and `state` getters. | + +`new Assembler(memory, labels)` and `new Simulator(memory, labels)` must be given the **same** +`memory` and `labels` objects so the assembled program and the simulator share state. + +### Reading CPU state + +```ts +const { regA, regX, regY, regP, regPC, regSP } = simulator.info; +``` + +### `SimulatorState` + +`simulator.state` returns a value of the exported `SimulatorState` enum: + +```ts +import { SimulatorState } from "@learn6502/core"; + +// "initialized" | "ready" | "running" | "paused" +// | "debugging" | "debugging_paused" | "completed" +if (simulator.state === SimulatorState.COMPLETED) { /* … */ } +``` + +## Events + +`Memory`, `Labels`, `Assembler` and `Simulator` each expose a typed event API — `on(event, listener)`, +`off(event, listener)` and `once(event, listener)` — with a per-class event map so payloads are fully +typed. + +| Emitter | Events | +|---------|--------| +| `Assembler` | `assemble-success`, `assemble-failure`, `hexdump`, `disassembly`, `assemble-info` | +| `Simulator` | `start`, `step`, `multistep`, `reset`, `stop`, `goto`, `simulator-failure`, `simulator-info`, `pseudo-op` | +| `Memory` | `changed` — `{ addr, val }` for every byte written | +| `Labels` | `labels-info`, `labels-failure` | + +```ts +// Drive a live display from memory writes inside the display region. +memory.on("changed", ({ addr, val }) => { + if (addr >= 0x0200 && addr <= 0x05ff) drawPixel(addr - 0x0200, val); +}); +``` + +The same generic mechanism is exported as `EventDispatcher` if you want a typed +event emitter for your own integration code. + +## Disassembly + +```ts +const { formatted, instructions } = assembler.disassemble(); + +console.log(formatted); +// instructions[i] = { +// address, bytes, hexBytes, opCode, mode, args, +// formattedArgs, formattedInstruction +// } +``` + +## Memory map + +| Range | Use | +|-------|-----| +| `0x0000`–`0x00FF` | Zero page | +| `0x0100`–`0x01FF` | Stack | +| `0x0200`–`0x05FF` | Display memory (512 bytes) — see the exported `DisplayAddressRange` enum | +| `0x0600`+ | Program code (the assembler writes here; the CPU starts here) | +| `0xFF` | Last-keypress input cell (`memory.storeKeypress(value)`) | + +## Utilities + +A few helpers used throughout the engine are exported for convenience: + +- `addr2hex(addr)` — format a 16-bit address as a hex string (e.g. `"0600"`). +- `num2hex(nr)` — format an 8-bit value as a hex string (e.g. `"2a"`). +- `hexToRgb(hex)` — parse a hex colour into normalized `{ red, green, blue }`. +- `throttle(fn, ms)` / `debounce(fn, ms)` — rate-limiters. +- `formatMessage(message, params)` — `%s` / `%d` / `%%` substitution. + +## History + +- Original implementation by **Stian Søreng** (2006–2010) — www.6502asm.com +- Adapted by **Nick Morgan** for the easy6502 tutorial — https://github.com/skilldrick/6502js +- Further adapted for [Learn 6502 Assembly](https://github.com/JumpLink/Learn6502), refactored into + a typed, dependency-free, cross-runtime library and split into this `@learn6502/core` package. + +## License + +[GNU General Public License v3.0 only](https://www.gnu.org/licenses/gpl-3.0). diff --git a/packages/6502/global.d.ts b/packages/core/global.d.ts similarity index 100% rename from packages/6502/global.d.ts rename to packages/core/global.d.ts diff --git a/packages/6502/package.json b/packages/core/package.json similarity index 95% rename from packages/6502/package.json rename to packages/core/package.json index 4b4eb19a..88324186 100644 --- a/packages/6502/package.json +++ b/packages/core/package.json @@ -24,7 +24,7 @@ "repository": { "type": "git", "url": "git+https://github.com/JumpLink/Learn6502.git", - "directory": "packages/6502" + "directory": "packages/core" }, "publishConfig": { "access": "public" diff --git a/packages/6502/src/assembler.ts b/packages/core/src/assembler.ts similarity index 100% rename from packages/6502/src/assembler.ts rename to packages/core/src/assembler.ts diff --git a/packages/6502/src/constants.ts b/packages/core/src/constants.ts similarity index 100% rename from packages/6502/src/constants.ts rename to packages/core/src/constants.ts diff --git a/packages/6502/src/event-dispatcher.ts b/packages/core/src/event-dispatcher.ts similarity index 100% rename from packages/6502/src/event-dispatcher.ts rename to packages/core/src/event-dispatcher.ts diff --git a/packages/6502/src/index.ts b/packages/core/src/index.ts similarity index 100% rename from packages/6502/src/index.ts rename to packages/core/src/index.ts diff --git a/packages/6502/src/labels.ts b/packages/core/src/labels.ts similarity index 100% rename from packages/6502/src/labels.ts rename to packages/core/src/labels.ts diff --git a/packages/6502/src/memory.ts b/packages/core/src/memory.ts similarity index 100% rename from packages/6502/src/memory.ts rename to packages/core/src/memory.ts diff --git a/packages/6502/src/simulator.ts b/packages/core/src/simulator.ts similarity index 100% rename from packages/6502/src/simulator.ts rename to packages/core/src/simulator.ts diff --git a/packages/6502/src/types/README.md b/packages/core/src/types/README.md similarity index 100% rename from packages/6502/src/types/README.md rename to packages/core/src/types/README.md diff --git a/packages/6502/src/types/assembler-events-map.ts b/packages/core/src/types/assembler-events-map.ts similarity index 100% rename from packages/6502/src/types/assembler-events-map.ts rename to packages/core/src/types/assembler-events-map.ts diff --git a/packages/6502/src/types/assembler-events.ts b/packages/core/src/types/assembler-events.ts similarity index 100% rename from packages/6502/src/types/assembler-events.ts rename to packages/core/src/types/assembler-events.ts diff --git a/packages/6502/src/types/disassembled-data.ts b/packages/core/src/types/disassembled-data.ts similarity index 100% rename from packages/6502/src/types/disassembled-data.ts rename to packages/core/src/types/disassembled-data.ts diff --git a/packages/6502/src/types/disassembled-event.ts b/packages/core/src/types/disassembled-event.ts similarity index 100% rename from packages/6502/src/types/disassembled-event.ts rename to packages/core/src/types/disassembled-event.ts diff --git a/packages/6502/src/types/event-listener.ts b/packages/core/src/types/event-listener.ts similarity index 100% rename from packages/6502/src/types/event-listener.ts rename to packages/core/src/types/event-listener.ts diff --git a/packages/6502/src/types/event-map.ts b/packages/core/src/types/event-map.ts similarity index 100% rename from packages/6502/src/types/event-map.ts rename to packages/core/src/types/event-map.ts diff --git a/packages/6502/src/types/index.ts b/packages/core/src/types/index.ts similarity index 100% rename from packages/6502/src/types/index.ts rename to packages/core/src/types/index.ts diff --git a/packages/6502/src/types/instruction-data.ts b/packages/core/src/types/instruction-data.ts similarity index 100% rename from packages/6502/src/types/instruction-data.ts rename to packages/core/src/types/instruction-data.ts diff --git a/packages/6502/src/types/labels-events-map.ts b/packages/core/src/types/labels-events-map.ts similarity index 100% rename from packages/6502/src/types/labels-events-map.ts rename to packages/core/src/types/labels-events-map.ts diff --git a/packages/6502/src/types/labels-events.ts b/packages/core/src/types/labels-events.ts similarity index 100% rename from packages/6502/src/types/labels-events.ts rename to packages/core/src/types/labels-events.ts diff --git a/packages/6502/src/types/memory-events-map.ts b/packages/core/src/types/memory-events-map.ts similarity index 100% rename from packages/6502/src/types/memory-events-map.ts rename to packages/core/src/types/memory-events-map.ts diff --git a/packages/6502/src/types/memory-events.ts b/packages/core/src/types/memory-events.ts similarity index 100% rename from packages/6502/src/types/memory-events.ts rename to packages/core/src/types/memory-events.ts diff --git a/packages/6502/src/types/simulator-base-event.ts b/packages/core/src/types/simulator-base-event.ts similarity index 100% rename from packages/6502/src/types/simulator-base-event.ts rename to packages/core/src/types/simulator-base-event.ts diff --git a/packages/6502/src/types/simulator-events-map.ts b/packages/core/src/types/simulator-events-map.ts similarity index 100% rename from packages/6502/src/types/simulator-events-map.ts rename to packages/core/src/types/simulator-events-map.ts diff --git a/packages/6502/src/types/simulator-events.ts b/packages/core/src/types/simulator-events.ts similarity index 100% rename from packages/6502/src/types/simulator-events.ts rename to packages/core/src/types/simulator-events.ts diff --git a/packages/6502/src/types/simulator-state.ts b/packages/core/src/types/simulator-state.ts similarity index 100% rename from packages/6502/src/types/simulator-state.ts rename to packages/core/src/types/simulator-state.ts diff --git a/packages/6502/src/types/symbols.ts b/packages/core/src/types/symbols.ts similarity index 100% rename from packages/6502/src/types/symbols.ts rename to packages/core/src/types/symbols.ts diff --git a/packages/6502/src/utils.ts b/packages/core/src/utils.ts similarity index 100% rename from packages/6502/src/utils.ts rename to packages/core/src/utils.ts diff --git a/packages/6502/tsconfig.json b/packages/core/tsconfig.json similarity index 100% rename from packages/6502/tsconfig.json rename to packages/core/tsconfig.json diff --git a/packages/learn/tutorial.mdx b/packages/learn/tutorial.mdx index f59a0fea..71305abb 100644 --- a/packages/learn/tutorial.mdx +++ b/packages/learn/tutorial.mdx @@ -45,7 +45,7 @@ There's also a very practical reason: retro game development. The homebrew scene ## Our first program -So, let's dive in! This application contains a [JavaScript 6502 Assembler and Simulator](https://github.com/JumpLink/Learn6502/tree/main/packages/6502) that I have adapted for this interactive tutorial. +So, let's dive in! This application contains a [JavaScript 6502 Assembler and Simulator](https://github.com/JumpLink/Learn6502/tree/main/packages/core) that I have adapted for this interactive tutorial. Click the **Copy** button in the code block below to copy the example code to the editor. Then use **Assemble** to assemble the code, and **Run** to run it. You can find these actions as buttons or in the menu. diff --git a/packages/translations/build.js b/packages/translations/build.js index 862beaad..dd10a17d 100644 --- a/packages/translations/build.js +++ b/packages/translations/build.js @@ -7,7 +7,7 @@ const VERSION = JSON.parse(readFileSync("./package.json", "utf8")).version; // Extract translatable strings from source files to create a POT template const xgettext = xgettextPlugin({ sources: [ - "../6502/src/**/*.{ts,tsx,js}", + "../core/src/**/*.{ts,tsx,js}", "../common-ui/src/**/*.{ts,tsx,js}", "../app-gnome/src/**/*.{ts,tsx,js,blp,xml,ui,desktop}", "../app-gnome/data/**/*.xml.in", diff --git a/packages/translations/de.po b/packages/translations/de.po index dd3d388a..21f4313e 100644 --- a/packages/translations/de.po +++ b/packages/translations/de.po @@ -1444,8 +1444,8 @@ msgid "So far we're only able to write basic programs without any branching logi msgstr "Bisher können wir nur einfache Programme ohne Verzweigungslogik schreiben. Lass uns das ändern." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx -msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." -msgstr "Also, lass uns loslegen! Diese Anwendung enthält einen JavaScript 6502 Assembler und Simulator, den ich für dieses interaktive Tutorial angepasst habe. Klicke auf den Kopieren-Button im Code-Block unten, um den Beispielcode in den Editor zu kopieren. Verwende dann Assemblieren, um den Code zu assemblieren, und Ausführen, um ihn auszuführen. Du findest diese Aktionen als Buttons oder im Menü." +msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." +msgstr "Also, lass uns loslegen! Diese Anwendung enthält einen JavaScript 6502 Assembler und Simulator, den ich für dieses interaktive Tutorial angepasst habe. Klicke auf den Kopieren-Button im Code-Block unten, um den Beispielcode in den Editor zu kopieren. Verwende dann Assemblieren, um den Code zu assemblieren, und Ausführen, um ihn auszuführen. Du findest diese Aktionen als Buttons oder im Menü." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx msgid "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location." diff --git a/packages/translations/es.po b/packages/translations/es.po index 1c082c86..84f909b4 100644 --- a/packages/translations/es.po +++ b/packages/translations/es.po @@ -1441,8 +1441,8 @@ msgid "So far we're only able to write basic programs without any branching logi msgstr "Hasta ahora solo podemos escribir programas básicos sin lógica de ramificación. Cambiemos eso." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx -msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." -msgstr "¡Vamos allá! Esta aplicación contiene un ensamblador y simulador 6502 en JavaScript que he adaptado para este tutorial interactivo. Haz clic en el botón Copiar del bloque de código de abajo para copiar el ejemplo al editor. Después usa Ensamblar para ensamblar el código y Ejecutar para ejecutarlo. Encontrarás estas acciones como botones o en el menú." +msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." +msgstr "¡Vamos allá! Esta aplicación contiene un ensamblador y simulador 6502 en JavaScript que he adaptado para este tutorial interactivo. Haz clic en el botón Copiar del bloque de código de abajo para copiar el ejemplo al editor. Después usa Ensamblar para ensamblar el código y Ejecutar para ejecutarlo. Encontrarás estas acciones como botones o en el menú." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx msgid "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location." diff --git a/packages/translations/eu.jumplink.Learn6502.pot b/packages/translations/eu.jumplink.Learn6502.pot index 2a452389..ce84f90f 100644 --- a/packages/translations/eu.jumplink.Learn6502.pot +++ b/packages/translations/eu.jumplink.Learn6502.pot @@ -1434,7 +1434,7 @@ msgid "So far we're only able to write basic programs without any branching logi msgstr "" #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx -msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." +msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." msgstr "" #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx diff --git a/packages/translations/fi.po b/packages/translations/fi.po index a6ecfdc0..d9e3b826 100644 --- a/packages/translations/fi.po +++ b/packages/translations/fi.po @@ -1439,8 +1439,8 @@ msgid "So far we're only able to write basic programs without any branching logi msgstr "Toistaiseksi osaamme kirjoittaa vain perusohjelmia ilman haarautumislogiikkaa. Muutetaan se." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx -msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." -msgstr "Sukellaan siis mukaan! Tämä sovellus sisältää JavaScript 6502 -assemblerin ja -simulaattorin, jonka olen mukauttanut tätä vuorovaikutteista opasta varten. Napsauta alla olevan koodilohkon Kopioi-painiketta kopioidaksesi esimerkkikoodin muokkaimeen. Käytä sitten Käännä konekielelle-toimintoa koodin kääntämiseen ja Suorita-toimintoa sen suorittamiseen. Löydät nämä toiminnot painikkeina tai valikosta." +msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." +msgstr "Sukellaan siis mukaan! Tämä sovellus sisältää JavaScript 6502 -assemblerin ja -simulaattorin, jonka olen mukauttanut tätä vuorovaikutteista opasta varten. Napsauta alla olevan koodilohkon Kopioi-painiketta kopioidaksesi esimerkkikoodin muokkaimeen. Käytä sitten Käännä konekielelle-toimintoa koodin kääntämiseen ja Suorita-toimintoa sen suorittamiseen. Löydät nämä toiminnot painikkeina tai valikosta." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx msgid "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location." diff --git a/packages/translations/fr.po b/packages/translations/fr.po index ae95a3dc..74d531ba 100644 --- a/packages/translations/fr.po +++ b/packages/translations/fr.po @@ -1440,8 +1440,8 @@ msgid "So far we're only able to write basic programs without any branching logi msgstr "Jusqu'à présent, nous ne pouvons écrire que des programmes basiques sans logique de branchement. Changeons ça." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx -msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." -msgstr "Allons-y ! Cette application contient un assembleur et simulateur JavaScript 6502 que j'ai adapté pour ce tutoriel interactif. Cliquez sur le bouton Copier dans le bloc de code ci-dessous pour copier le code d'exemple dans l'éditeur. Utilisez ensuite Assembler pour assembler le code, puis Exécuter pour le lancer. Vous trouverez ces actions sous forme de boutons ou dans le menu." +msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." +msgstr "Allons-y ! Cette application contient un assembleur et simulateur JavaScript 6502 que j'ai adapté pour ce tutoriel interactif. Cliquez sur le bouton Copier dans le bloc de code ci-dessous pour copier le code d'exemple dans l'éditeur. Utilisez ensuite Assembler pour assembler le code, puis Exécuter pour le lancer. Vous trouverez ces actions sous forme de boutons ou dans le menu." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx msgid "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location." diff --git a/packages/translations/he.po b/packages/translations/he.po index c56818f6..10ae9cf1 100644 --- a/packages/translations/he.po +++ b/packages/translations/he.po @@ -1439,8 +1439,8 @@ msgid "So far we're only able to write basic programs without any branching logi msgstr "בנתיים אנחנו יכולים לכתוב רק תוכנות פשוטות בלי שום הסתעפות לוגית. בואו נשנה את זה." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx -msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." -msgstr "אז בואו נתחיל! הישומון הזה מכיל מאסף וסימולטור של 6502 בג'אווה־סקריפט שהתאמתי למדריך האינטראקטיבי הזה. לחצו על הכפתור העתק במסגרת הקוד למטה כדי להעתיק את דוגמת הקוד לעורך. אחר כך השתמשו ב־הַרְכֵּב כדי להרכיב את הקוד, וב־להריץ כדי להריץ אותו. אתם יכולים למצוא את הפעולות האלו ככפתורים או בתפריט." +msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." +msgstr "אז בואו נתחיל! הישומון הזה מכיל מאסף וסימולטור של 6502 בג'אווה־סקריפט שהתאמתי למדריך האינטראקטיבי הזה. לחצו על הכפתור העתק במסגרת הקוד למטה כדי להעתיק את דוגמת הקוד לעורך. אחר כך השתמשו ב־הַרְכֵּב כדי להרכיב את הקוד, וב־להריץ כדי להריץ אותו. אתם יכולים למצוא את הפעולות האלו ככפתורים או בתפריט." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx msgid "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location." diff --git a/packages/translations/ia.po b/packages/translations/ia.po index b4c29172..bbad962c 100644 --- a/packages/translations/ia.po +++ b/packages/translations/ia.po @@ -1437,8 +1437,8 @@ msgid "So far we're only able to write basic programs without any branching logi msgstr "Usque ora nos solo pote scriber programmas basic sin logica de ramification. Cambiemos illo." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx -msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." -msgstr "Assi, immergiamo nos! Iste application contine un JavaScript 6502 Assembler e Simulator que io ha adaptate pro iste tutorial interactive. Clicca le button Copiar in le bloco de codice infra pro copiar le codice de exemplo al editor. Pois usa Assemblar pro assemblar le codice, e Executar pro executar lo. Tu pote trovar iste actiones como buttones o in le menu." +msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." +msgstr "Assi, immergiamo nos! Iste application contine un JavaScript 6502 Assembler e Simulator que io ha adaptate pro iste tutorial interactive. Clicca le button Copiar in le bloco de codice infra pro copiar le codice de exemplo al editor. Pois usa Assemblar pro assemblar le codice, e Executar pro executar lo. Tu pote trovar iste actiones como buttones o in le menu." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx msgid "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location." diff --git a/packages/translations/id.po b/packages/translations/id.po index 36eac59e..50c73e04 100644 --- a/packages/translations/id.po +++ b/packages/translations/id.po @@ -1439,8 +1439,8 @@ msgid "So far we're only able to write basic programs without any branching logi msgstr "Sejauh ini kita hanya dapat menulis program dasar tanpa logika percabangan. Mari kita ubah itu." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx -msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." -msgstr "Jadi, mari kita mulai! Aplikasi ini berisi Assembler dan Simulator 6502 berbasis JavaScript yang telah saya adaptasi untuk tutorial interaktif ini. Klik tombol Salin pada blok kode di bawah untuk menyalin contoh kode ke editor. Kemudian gunakan Assemble untuk meng-assemble kode, dan Jalankan untuk menjalankannya. Anda dapat menemukan tindakan-tindakan ini sebagai tombol atau di dalam menu." +msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." +msgstr "Jadi, mari kita mulai! Aplikasi ini berisi Assembler dan Simulator 6502 berbasis JavaScript yang telah saya adaptasi untuk tutorial interaktif ini. Klik tombol Salin pada blok kode di bawah untuk menyalin contoh kode ke editor. Kemudian gunakan Assemble untuk meng-assemble kode, dan Jalankan untuk menjalankannya. Anda dapat menemukan tindakan-tindakan ini sebagai tombol atau di dalam menu." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx msgid "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location." diff --git a/packages/translations/ja.po b/packages/translations/ja.po index a76315ef..10a4cbc9 100644 --- a/packages/translations/ja.po +++ b/packages/translations/ja.po @@ -1438,8 +1438,8 @@ msgid "So far we're only able to write basic programs without any branching logi msgstr "これまでは分岐のない基本的なプログラムしか書けませんでした。ここから変えていきましょう。" #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx -msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." -msgstr "それでは始めましょう!このアプリには、このインタラクティブチュートリアル向けに調整したJavaScript 6502 アセンブラとシミュレーターが含まれています。下のコードブロックにあるコピーボタンを押して例のコードをエディターへコピーし、アセンブルでコードをアセンブルし、実行で実行します。これらの操作はボタンまたはメニューから行えます。" +msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." +msgstr "それでは始めましょう!このアプリには、このインタラクティブチュートリアル向けに調整したJavaScript 6502 アセンブラとシミュレーターが含まれています。下のコードブロックにあるコピーボタンを押して例のコードをエディターへコピーし、アセンブルでコードをアセンブルし、実行で実行します。これらの操作はボタンまたはメニューから行えます。" #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx msgid "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location." diff --git a/packages/translations/nl.po b/packages/translations/nl.po index c2197668..175bf6fe 100644 --- a/packages/translations/nl.po +++ b/packages/translations/nl.po @@ -1439,8 +1439,8 @@ msgid "So far we're only able to write basic programs without any branching logi msgstr "Tot nu toe kunnen we alleen basisprogramma's schrijven zonder vertakkingslogica. Laten we dat veranderen." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx -msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." -msgstr "Dus, laten we erin duiken! Deze applicatie bevat een JavaScript 6502 Assembler en Simulator die ik voor deze interactieve tutorial heb aangepast. Klik op de knop Kopiëren in het codeblok hieronder om de voorbeeldcode naar de editor te kopiëren. Gebruik vervolgens Assembleren om de code te assembleren en Uitvoeren om hem uit te voeren. Je vindt deze acties als knoppen of in het menu." +msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." +msgstr "Dus, laten we erin duiken! Deze applicatie bevat een JavaScript 6502 Assembler en Simulator die ik voor deze interactieve tutorial heb aangepast. Klik op de knop Kopiëren in het codeblok hieronder om de voorbeeldcode naar de editor te kopiëren. Gebruik vervolgens Assembleren om de code te assembleren en Uitvoeren om hem uit te voeren. Je vindt deze acties als knoppen of in het menu." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx msgid "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location." diff --git a/packages/translations/pl.po b/packages/translations/pl.po index e3e855d8..7a3d6aab 100644 --- a/packages/translations/pl.po +++ b/packages/translations/pl.po @@ -1439,8 +1439,8 @@ msgid "So far we're only able to write basic programs without any branching logi msgstr "Do tej pory potrafimy pisać tylko podstawowe programy bez jakiejkolwiek logiki rozgałęzień. Zmieńmy to." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx -msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." -msgstr "Zacznijmy więc! Ta aplikacja zawiera JavaScript 6502 Assembler and Simulator, który zaadoptowałem do tego interaktywnego tutorialu. Kliknij przycisk Kopiuj w bloku kodu poniżej, aby skopiować przykładowy kod do edytora. Następnie użyj Złóż, aby złożyć kod, oraz Uruchom, aby go uruchomić. Te akcje znajdziesz jako przyciski lub w menu." +msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." +msgstr "Zacznijmy więc! Ta aplikacja zawiera JavaScript 6502 Assembler and Simulator, który zaadoptowałem do tego interaktywnego tutorialu. Kliknij przycisk Kopiuj w bloku kodu poniżej, aby skopiować przykładowy kod do edytora. Następnie użyj Złóż, aby złożyć kod, oraz Uruchom, aby go uruchomić. Te akcje znajdziesz jako przyciski lub w menu." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx msgid "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location." diff --git a/packages/translations/pt.po b/packages/translations/pt.po index 3ae443f9..95878c77 100644 --- a/packages/translations/pt.po +++ b/packages/translations/pt.po @@ -1438,8 +1438,8 @@ msgid "So far we're only able to write basic programs without any branching logi msgstr "Até agora só conseguimos escrever programas básicos sem qualquer lógica de ramificação. Vamos mudar isso." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx -msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." -msgstr "Vamos mergulhar! Esta aplicação contém um Assemblador e Simulador 6502 em JavaScript que adaptei para este tutorial interativo. Clica no botão Copiar no bloco de código abaixo para copiar o código de exemplo para o editor. De seguida usa Montar para montar o código, e Executar para o executar. Podes encontrar estas ações como botões ou no menu." +msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." +msgstr "Vamos mergulhar! Esta aplicação contém um Assemblador e Simulador 6502 em JavaScript que adaptei para este tutorial interativo. Clica no botão Copiar no bloco de código abaixo para copiar o código de exemplo para o editor. De seguida usa Montar para montar o código, e Executar para o executar. Podes encontrar estas ações como botões ou no menu." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx msgid "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location." diff --git a/packages/translations/pt_BR.po b/packages/translations/pt_BR.po index 58a3badb..1024be98 100644 --- a/packages/translations/pt_BR.po +++ b/packages/translations/pt_BR.po @@ -1438,8 +1438,8 @@ msgid "So far we're only able to write basic programs without any branching logi msgstr "Até agora só conseguimos escrever programas básicos sem qualquer lógica de ramificação. Vamos mudar isso." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx -msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." -msgstr "Vamos mergulhar! Este aplicativo contém um Assemblador e Simulador 6502 em JavaScript que adaptei para este tutorial interativo. Clique no botão Copiar no bloco de código abaixo para copiar o código de exemplo para o editor. Depois use Montar para montar o código e Executar para executá-lo. Você encontra essas ações como botões ou no menu." +msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." +msgstr "Vamos mergulhar! Este aplicativo contém um Assemblador e Simulador 6502 em JavaScript que adaptei para este tutorial interativo. Clique no botão Copiar no bloco de código abaixo para copiar o código de exemplo para o editor. Depois use Montar para montar o código e Executar para executá-lo. Você encontra essas ações como botões ou no menu." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx msgid "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location." diff --git a/packages/translations/uk.po b/packages/translations/uk.po index 42fba3ff..49bbba5d 100644 --- a/packages/translations/uk.po +++ b/packages/translations/uk.po @@ -1438,8 +1438,8 @@ msgid "So far we're only able to write basic programs without any branching logi msgstr "Поки що ми пишемо лише базові програми без розгалужень. Змінимо це." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx -msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." -msgstr "Отже, почнемо! У застосунку є асемблер і симулятор 6502 на JavaScript, які адаптовано для цього інтерактивного посібника. Натисніть кнопку Копіювати в блоці коду нижче, щоб скопіювати приклад у редактор. Потім скористайтеся дією Зібрати, щоб зібрати код, і Запустити, щоб виконати його. Ці дії доступні у вигляді кнопок або в меню." +msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." +msgstr "Отже, почнемо! У застосунку є асемблер і симулятор 6502 на JavaScript, які адаптовано для цього інтерактивного посібника. Натисніть кнопку Копіювати в блоці коду нижче, щоб скопіювати приклад у редактор. Потім скористайтеся дією Зібрати, щоб зібрати код, і Запустити, щоб виконати його. Ці дії доступні у вигляді кнопок або в меню." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx msgid "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location." diff --git a/packages/translations/vi.po b/packages/translations/vi.po index 7632563f..428ae466 100644 --- a/packages/translations/vi.po +++ b/packages/translations/vi.po @@ -1439,8 +1439,8 @@ msgid "So far we're only able to write basic programs without any branching logi msgstr "Cho đến nay chúng ta chỉ có thể viết các chương trình cơ bản mà không có bất kỳ logic phân nhánh nào. Hãy thay đổi điều đó." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx -msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." -msgstr "Vì vậy, hãy đi sâu vào! Ứng dụng này chứa Trình biên dịch và Trình mô phỏng JavaScript 6502 mà tôi đã điều chỉnh cho phù hợp với hướng dẫn tương tác này. Nhấp vào nút Sao Chép trong khối mã bên dưới để sao chép mã mẫu vào trình chỉnh sửa. Sau đó dùng Tập Hợp để lắp ráp mã, và Chạy để chạy nó. Bạn có thể tìm thấy các hành động này dưới dạng nút bấm hoặc trong menu." +msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." +msgstr "Vì vậy, hãy đi sâu vào! Ứng dụng này chứa Trình biên dịch và Trình mô phỏng JavaScript 6502 mà tôi đã điều chỉnh cho phù hợp với hướng dẫn tương tác này. Nhấp vào nút Sao Chép trong khối mã bên dưới để sao chép mã mẫu vào trình chỉnh sửa. Sau đó dùng Tập Hợp để lắp ráp mã, và Chạy để chạy nó. Bạn có thể tìm thấy các hành động này dưới dạng nút bấm hoặc trong menu." #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx msgid "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location." diff --git a/packages/translations/zh_Hans.po b/packages/translations/zh_Hans.po index 5374243e..eec03ab5 100644 --- a/packages/translations/zh_Hans.po +++ b/packages/translations/zh_Hans.po @@ -1439,8 +1439,8 @@ msgid "So far we're only able to write basic programs without any branching logi msgstr "到目前为止我们只能编写没有分支逻辑的基础程序。让我们改变这一点。" #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx -msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." -msgstr "那么,让我们开始吧!本应用包含我为该交互式教程改造的 JavaScript 6502 汇编器与模拟器。点击下方代码块中的 复制 按钮将示例代码复制到编辑器,然后用 汇编 汇编代码,再用 运行 运行它。这些操作既可以作为按钮使用,也可以在菜单中找到。" +msgid "So, let's dive in! This application contains a JavaScript 6502 Assembler and Simulator that I have adapted for this interactive tutorial. Click the Copy button in the code block below to copy the example code to the editor. Then use Assemble to assemble the code, and Run to run it. You can find these actions as buttons or in the menu." +msgstr "那么,让我们开始吧!本应用包含我为该交互式教程改造的 JavaScript 6502 汇编器与模拟器。点击下方代码块中的 复制 按钮将示例代码复制到编辑器,然后用 汇编 汇编代码,再用 运行 运行它。这些操作既可以作为按钮使用,也可以在菜单中找到。" #. TRANSLATORS: MDX-derived text from packages/learn/tutorial.mdx msgid "So, looking at upKey, if the current direction is down (4), the bit test will be zero. BNE means \"branch if the zero flag is clear\", so in this case we'll branch to illegalMove, which just returns from the subroutine. Otherwise, the new direction (1 in this case) is stored in the appropriate memory location."