From cb69c22828c9ea0b6d217ac06b85c7dd4fcbe3ff Mon Sep 17 00:00:00 2001 From: edit12-scratcher <320305553+edit12-scratcher@users.noreply.github.com> Date: Mon, 24 Aug 2026 09:22:03 +0000 Subject: [PATCH] Examples: add line-buster-6502 (from issue #171) Co-authored-by: edit12-scratcher <320305553+edit12-scratcher@users.noreply.github.com> Signed-off-by: edit12-scratcher <320305553+edit12-scratcher@users.noreply.github.com> --- packages/examples/examples.ts | 1 + packages/examples/line-buster-6502/index.ts | 8 + .../line-buster-6502/line-buster-6502.asm | 860 ++++++++++++++++++ .../line-buster-6502/line-buster-6502.meta.ts | 13 + 4 files changed, 882 insertions(+) create mode 100644 packages/examples/line-buster-6502/index.ts create mode 100644 packages/examples/line-buster-6502/line-buster-6502.asm create mode 100644 packages/examples/line-buster-6502/line-buster-6502.meta.ts diff --git a/packages/examples/examples.ts b/packages/examples/examples.ts index 28dab0ff..a16f65c5 100644 --- a/packages/examples/examples.ts +++ b/packages/examples/examples.ts @@ -1,4 +1,5 @@ export * from "./commented-snake"; export * from "./dino-run"; +export * from "./line-buster-6502"; export * from "./snake"; export * from "./stack-example"; diff --git a/packages/examples/line-buster-6502/index.ts b/packages/examples/line-buster-6502/index.ts new file mode 100644 index 00000000..3042646f --- /dev/null +++ b/packages/examples/line-buster-6502/index.ts @@ -0,0 +1,8 @@ +import { default as lineBuster6502Code } from "./line-buster-6502.asm"; +import lineBuster6502Meta from "./line-buster-6502.meta.ts"; +import type { ExampleMeta } from "../example-meta.ts"; +const lineBuster6502: ExampleMeta = { + ...lineBuster6502Meta, + code: lineBuster6502Code, +}; +export { lineBuster6502 }; diff --git a/packages/examples/line-buster-6502/line-buster-6502.asm b/packages/examples/line-buster-6502/line-buster-6502.asm new file mode 100644 index 00000000..b69a4228 --- /dev/null +++ b/packages/examples/line-buster-6502/line-buster-6502.asm @@ -0,0 +1,860 @@ +; Line Buster 6502 +; by edit12 + +BEGINNING: + +LDX #$1C ;NUMBER POSITION +STX $0A + +LDX #$0 +STX $06 ;ONES +LDX #$0 +STX $07 ;TENS +LDX #$0 +STX $08 ;HUNDREDS +LDX #$0 +STX $09 ;THOUSANDS + +DIRECTNUMBERSET: +LDA #$00 +LDX #$1C +LDY #$00 +JSR DRAWNUMBER0 ;ONES +LDA #$00 +LDX #$18 +LDY #$00 +JSR DRAWNUMBER0 ;TENS +LDA #$00 +LDX #$14 +LDY #$00 +JSR DRAWNUMBER0 ;HUNDREDS +LDA #$00 +LDX #$10 +LDY #$00 +JSR DRAWNUMBER0 ;THOUSANDS + +LDA #$01 +LDX #$00 +LDY #$00 +JSR DRAWLINES + +;0---------------------------- + +DRAWNUMBER0: +LDA DIGIT0,Y +STA $0200,X +INX +INY +LDA DIGIT0,Y +STA $0200,X +INX +INY +LDA DIGIT0,Y +STA $0200,X +INX +INY +LDA DIGIT0,Y +STA $0200,X +INX +INY +STY $00 +LDY #$00 + +CLEARX0: +DEX +INY +CPY #$04 +BNE CLEARX0 +LDY #$00 +NEXTY0: +INX +INY +CPY #$20 +BNE NEXTY0 +LDY $00 +CPY #$10 +BNE DRAWNUMBER0 +RTS + +;1-------------------------- + +DRAWNUMBER1: +LDA DIGIT1,Y +STA $0200,X +INX +INY +LDA DIGIT1,Y +STA $0200,X +INX +INY +LDA DIGIT1,Y +STA $0200,X +INX +INY +LDA DIGIT1,Y +STA $0200,X +INX +INY +STY $00 +LDY #$00 + +CLEARX1: +DEX +INY +CPY #$04 +BNE CLEARX1 +LDY #$00 +NEXTY1: +INX +INY +CPY #$20 +BNE NEXTY1 +LDY $00 +CPY #$10 +BNE DRAWNUMBER1 +RTS + +;2------------------------ + +DRAWNUMBER2: +LDA DIGIT2,Y +STA $0200,X +INX +INY +LDA DIGIT2,Y +STA $0200,X +INX +INY +LDA DIGIT2,Y +STA $0200,X +INX +INY +LDA DIGIT2,Y +STA $0200,X +INX +INY +STY $00 +LDY #$00 + +CLEARX2: +DEX +INY +CPY #$04 +BNE CLEARX2 +LDY #$00 +NEXTY2: +INX +INY +CPY #$20 +BNE NEXTY2 +LDY $00 +CPY #$10 +BNE DRAWNUMBER2 +RTS + +;3------------------------ + +DRAWNUMBER3: +LDA DIGIT3,Y +STA $0200,X +INX +INY +LDA DIGIT3,Y +STA $0200,X +INX +INY +LDA DIGIT3,Y +STA $0200,X +INX +INY +LDA DIGIT3,Y +STA $0200,X +INX +INY +STY $00 +LDY #$00 + +CLEARX3: +DEX +INY +CPY #$04 +BNE CLEARX3 +LDY #$00 +NEXTY3: +INX +INY +CPY #$20 +BNE NEXTY3 +LDY $00 +CPY #$10 +BNE DRAWNUMBER3 +RTS + +;4------------------------ + +DRAWNUMBER4: +LDA DIGIT4,Y +STA $0200,X +INX +INY +LDA DIGIT4,Y +STA $0200,X +INX +INY +LDA DIGIT4,Y +STA $0200,X +INX +INY +LDA DIGIT4,Y +STA $0200,X +INX +INY +STY $00 +LDY #$00 + +CLEARX4: +DEX +INY +CPY #$04 +BNE CLEARX4 +LDY #$00 +NEXTY4: +INX +INY +CPY #$20 +BNE NEXTY4 +LDY $00 +CPY #$10 +BNE DRAWNUMBER4 +RTS + +;5------------------------ + +DRAWNUMBER5: +LDA DIGIT5,Y +STA $0200,X +INX +INY +LDA DIGIT5,Y +STA $0200,X +INX +INY +LDA DIGIT5,Y +STA $0200,X +INX +INY +LDA DIGIT5,Y +STA $0200,X +INX +INY +STY $00 +LDY #$00 + +CLEARX5: +DEX +INY +CPY #$04 +BNE CLEARX5 +LDY #$00 +NEXTY5: +INX +INY +CPY #$20 +BNE NEXTY5 +LDY $00 +CPY #$10 +BNE DRAWNUMBER5 +RTS + +;6------------------------ + +DRAWNUMBER6: +LDA DIGIT6,Y +STA $0200,X +INX +INY +LDA DIGIT6,Y +STA $0200,X +INX +INY +LDA DIGIT6,Y +STA $0200,X +INX +INY +LDA DIGIT6,Y +STA $0200,X +INX +INY +STY $00 +LDY #$00 + +CLEARX6: +DEX +INY +CPY #$04 +BNE CLEARX6 +LDY #$00 +NEXTY6: +INX +INY +CPY #$20 +BNE NEXTY6 +LDY $00 +CPY #$10 +BNE DRAWNUMBER6 +RTS + +;7------------------------ + +DRAWNUMBER7: +LDA DIGIT7,Y +STA $0200,X +INX +INY +LDA DIGIT7,Y +STA $0200,X +INX +INY +LDA DIGIT7,Y +STA $0200,X +INX +INY +LDA DIGIT7,Y +STA $0200,X +INX +INY +STY $00 +LDY #$00 + +CLEARX7: +DEX +INY +CPY #$04 +BNE CLEARX7 +LDY #$00 +NEXTY7: +INX +INY +CPY #$20 +BNE NEXTY7 +LDY $00 +CPY #$10 +BNE DRAWNUMBER7 +RTS + +;8------------------------ + +DRAWNUMBER8: +LDA DIGIT8,Y +STA $0200,X +INX +INY +LDA DIGIT8,Y +STA $0200,X +INX +INY +LDA DIGIT8,Y +STA $0200,X +INX +INY +LDA DIGIT8,Y +STA $0200,X +INX +INY +STY $00 +LDY #$00 + +CLEARX8: +DEX +INY +CPY #$04 +BNE CLEARX8 +LDY #$00 +NEXTY8: +INX +INY +CPY #$20 +BNE NEXTY8 +LDY $00 +CPY #$10 +BNE DRAWNUMBER8 +RTS + +;9------------------------ + +DRAWNUMBER9: +LDA DIGIT9,Y +STA $0200,X +INX +INY +LDA DIGIT9,Y +STA $0200,X +INX +INY +LDA DIGIT9,Y +STA $0200,X +INX +INY +LDA DIGIT9,Y +STA $0200,X +INX +INY +STY $00 +LDY #$00 + +CLEARX9: +DEX +INY +CPY #$04 +BNE CLEARX9 +LDY #$00 +NEXTY9: +INX +INY +CPY #$20 +BNE NEXTY9 +LDY $00 +CPY #$10 +BNE DRAWNUMBER9 +RTS + + +RESETDRAWLINES: +LDX #$00 +LDY #$00 +LDA #$01 +DRAWLINES: +STA $0300,X +INX +INY +CPY #$1F ;NUMBER OF LINE PIXELS +BNE DRAWLINES +STA $0300,X +LDY #$00 +NEXTLINEY: +INX +INY +CPY #$21 +BNE NEXTLINEY +LDY #$00 +CPX #$00 ;ARE THE LINES FINISHED GENERATING? +BNE DRAWLINES + +PADDLEANDBALL: +LDY #$00 ;BALL'S DIRECTION +STY $03 +LDX #$04 ;POSITION OF THE BALL +STX $01 +LDY #$01 ;STRIP CHANGER +STY $02 +LDX #$8F ;PADDLE'S POSITION +LDA #$00 +TXS + +RESETCLEARLINE: +LDX #$80 +CLEARLINE: +LDA #$00 +STA $0500,X +INX +CPX #$A0 +BNE CLEARLINE + +RESET: +LDA #$01 +LDY #$00 +TSX +DRAW: +STA $0500,X +INX +INY +CPY #$04 +BNE DRAW +LDX #$00 +FREQ: +INX +CPX #$10 ;HOW MANY TIMES DELAYED IN EACH FRAME +BNE FREQ + +CHECKKEYS: +LDA $FF +CMP #$64 +BEQ RIGHT +CMP #$61 +BEQ LEFT +BNE BALL + +RIGHT: +TSX +INX +CPX #$9D +BEQ BLOCKRIGHT +BACKTORIGHT: +TXS +LDY #$00 +LDA #$00 +JMP BALL + +LEFT: +TSX +DEX +CPX #$7F +BEQ BLOCKLEFT +BACKTOLEFT: +TXS +LDY #$00 +LDA #$00 +JMP BALL + +BLOCKRIGHT: +DEX +JMP BACKTORIGHT + +BLOCKLEFT: +INX +JMP BACKTOLEFT + +BALL: +LDX $01 +LDA #$00 +LDY $02 +CPY #$00 +BEQ STOREON4 +CPY #$01 +BEQ STOREON3 +CPY #$02 +BEQ STOREON2 +CPY #$01 +BEQ STOREON1 +FURTHERINBALL: +LDY $03 +CPY #$00 +BEQ DOWNRIGHT +CPY #$01 +BEQ UPRIGHT +DOWNRIGHT: +LDY #$00 +MOVEDOWNRIGHT: +INX +INY +CPX #$FF +BEQ CHANGESTRIPDOWN +CPY #$21 +BNE MOVEDOWNRIGHT +JMP CONTINUEBALL +UPRIGHT: +LDY #$00 +MOVEUPRIGHT: +DEX +INY +CPX #$00 +BEQ CHANGESTRIPUP +CPY #$1F +BNE MOVEUPRIGHT +JMP CONTINUEBALL +CONTINUEBALL: +LDA $0500,X ;CHECK COLLISION ON STRIP 4 +CMP #$01 +BEQ PADDLEROTATEBALL +LDY $02 +LDA #$01 +CPY #$00 +BEQ STOREON4DRAW +CPY #$01 +BEQ STOREON3DRAW +CPY #$02 +BEQ STOREON2DRAW +CPY #$03 +BEQ STOREON1DRAW +FURTHERINBALL2: +STX $01 +JMP RESETCLEARLINE + +STOREON4: +STA $0500,X +JMP FURTHERINBALL +STOREON3: +STA $0400,X +JMP FURTHERINBALL +STOREON2: +STA $0300,X +JMP FURTHERINBALL +STOREON1: +STA $0200,X +JMP FURTHERINBALL + +STOREON4DRAW: +STA $0500,X +JMP FURTHERINBALL2 + +STOREON3DRAW: +STA $0400,X +JMP FURTHERINBALL2 + +STOREON2DRAW: +LDA $0300,X ;CHECK COLLISION ON STRIP 2 +CMP #$01 +BEQ BUMPFROMTOP +LDA #$01 +STA $0300,X +JMP FURTHERINBALL2 + +STOREON1DRAW: +JMP RESETDRAWLINES +STA $0200,X +JMP FURTHERINBALL2 + +CHANGESTRIPDOWN: +INX +INY +CPY #$21 +BNE CHANGESTRIPDOWN +LDY $02 +CPY #$00 +BEQ STOPPROGRAM +DEY +STY $02 +JMP CONTINUEBALL + +CHANGESTRIPUP: +DEX +INY +CPY #$1F +BNE CHANGESTRIPUP +JSR LOADSTRIP +JMP CONTINUEBALL + +LOADSTRIP: +LDY $02 +INY +STY $02 +RTS + +PADDLEROTATEBALL: ;IF THE BALL BUMPED ON THE PADDLE +TXA ;A=BALL POS +TSX ;X=PADDLE POS +INX +INX +STX $05 +CMP $05 ;CHECK IF THE BALL HIT THE LEFT PADDLE SIDE +LDY $03 +LDY #$01 +STY $03 +JMP RESETCLEARLINE + +BUMPFROMTOP: +LDA #$00 ;BREAK IT! +STA $0300,X +INX +STA $0300,X +DEX +DEX +STA $0300,X +INX + +JSR COUNTSCORE1 + +LDY $03 ;CHANGE BALL'S DIRECTION +LDY #$00 +STY $03 +JMP RESETCLEARLINE + +STOPPROGRAM: +BRK ;GAMEOVER + +COUNTSCORE1: +LDX $0A +LDX #$1C +STX $0A +LDX $06 +INX +INX +INX +INX +INX +STX $06 +CHECKNUMBER: +CPX #$00 +BEQ CALL0 +CPX #$01 +BEQ CALL1 +CPX #$02 +BEQ CALL2 +CPX #$03 +BEQ CALL3 +CPX #$04 +BEQ CALL4 +CPX #$05 +BEQ CALL5 +CPX #$06 +BEQ CALL6 +CPX #$07 +BEQ CALL7 +CPX #$08 +BEQ CALL8 +CPX #$09 +BEQ CALL9 +CPX #$0A +BEQ COUNT10 + +CALL0: +LDA #$00 +LDX $0A +LDY #$00 +JSR DRAWNUMBER0 +RTS + +CALL1: +LDA #$00 +LDX $0A +LDY #$00 +JSR DRAWNUMBER1 +RTS + +CALL2: +LDA #$00 +LDX $0A +LDY #$00 +JSR DRAWNUMBER2 +RTS + +CALL3: +LDA #$00 +LDX $0A +LDY #$00 +JSR DRAWNUMBER3 +RTS + +CALL4: +LDA #$00 +LDX $0A +LDY #$00 +JSR DRAWNUMBER4 +RTS + +CALL5: +LDA #$00 +LDX $0A +LDY #$00 +JSR DRAWNUMBER5 +RTS + +CALL6: +LDA #$00 +LDX $0A +LDY #$00 +JSR DRAWNUMBER6 +RTS + +CALL7: +LDA #$00 +LDX $0A +LDY #$00 +JSR DRAWNUMBER7 +RTS + +CALL8: +LDA #$00 +LDX $0A +LDY #$00 +JSR DRAWNUMBER8 +RTS + +CALL9: +LDA #$00 +LDX $0A +LDY #$00 +JSR DRAWNUMBER9 +RTS + +COUNT10: +LDX #$00 +STX $06 +JSR CALL0 +LDX $0A +LDX #$18 +STX $0A +LDX $07 +INX +STX $07 +CPX #$0A +BEQ COUNT100 +CONTCOUNT10: +JMP CHECKNUMBER + +COUNT100: +LDX #$00 +STX $07 +JSR CALL0 +LDX $0A +LDX #$14 +STX $0A +LDX $08 +INX +STX $08 +CPX #$0A +BEQ COUNT1000 +JMP CHECKNUMBER + +COUNT1000: +LDX #$00 +STX $08 +JSR CALL0 +LDX $0A +LDX #$10 +STX $0A +LDX $09 +INX +STX $09 +JMP CHECKNUMBER + +DIGIT0: +DCB $0,$1,$0,$0 +DCB $1,$0,$1,$0 +DCB $1,$0,$1,$0 +DCB $0,$1,$0,$0 +DIGIT1: +DCB $0,$1,$0,$0 +DCB $1,$1,$0,$0 +DCB $0,$1,$0,$0 +DCB $1,$1,$1,$0 +DIGIT2: +DCB $1,$1,$0,$0 +DCB $0,$0,$1,$0 +DCB $1,$1,$0,$0 +DCB $1,$1,$1,$0 +DIGIT3: +DCB $1,$1,$0,$0 +DCB $0,$1,$1,$0 +DCB $0,$0,$1,$0 +DCB $1,$1,$0,$0 +DIGIT4: +DCB $1,$0,$1,$0 +DCB $1,$0,$1,$0 +DCB $1,$1,$1,$0 +DCB $0,$0,$1,$0 +DIGIT5: +DCB $1,$1,$1,$0 +DCB $1,$1,$0,$0 +DCB $0,$0,$1,$0 +DCB $1,$1,$0,$0 +DIGIT6: +DCB $0,$1,$1,$0 +DCB $1,$1,$0,$0 +DCB $1,$0,$1,$0 +DCB $0,$1,$0,$0 +DIGIT7: +DCB $1,$1,$1,$0 +DCB $0,$0,$1,$0 +DCB $0,$1,$0,$0 +DCB $1,$0,$0,$0 +DIGIT8: +DCB $0,$1,$1,$0 +DCB $1,$0,$1,$0 +DCB $1,$1,$1,$0 +DCB $1,$1,$0,$0 +DIGIT9: +DCB $0,$1,$0,$0 +DCB $1,$0,$1,$0 +DCB $0,$1,$1,$0 +DCB $1,$1,$0,$0 diff --git a/packages/examples/line-buster-6502/line-buster-6502.meta.ts b/packages/examples/line-buster-6502/line-buster-6502.meta.ts new file mode 100644 index 00000000..a1e7b562 --- /dev/null +++ b/packages/examples/line-buster-6502/line-buster-6502.meta.ts @@ -0,0 +1,13 @@ +import { _ } from "@learn6502/core"; +import type { ExampleMetaJson } from "../example-meta.ts"; +export default { + slug: "line-buster-6502", + // TRANSLATORS: Example title for Line Buster 6502 + title: _("Line Buster 6502"), + // TRANSLATORS: Example description for Line Buster 6502 + description: _("Break the blocks with the paddle and ball."), + author: "edit12", + license: "CC-BY-4.0", + displayMemory: + "00000000000000000000000000000000000100000001000000010000000100000000000000000000000000000000000001000100010001000100010001000100000000000000000000000000000000000100010001000100010001000100010000000000000000000000000000000000000100000001000000010000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010101010101010101010101010101010101010101010101010101010101010100000000000000000000000000000000000000000000000000000000000000000101010101010101010101010101010101010101010101010101010101010101000000000000000000000000000000000000000000000000000000000000000001010101010101010101010101010101010101010101010101010101010101010000000000000000000000000000000000000000000000000000000000000000010101010101010101010101010101010101010101010101010101010101010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", +} as ExampleMetaJson;