From 823452b54baab15c39517fee7e2eb5db6d73c9d4 Mon Sep 17 00:00:00 2001 From: Astatin Date: Sun, 24 Aug 2025 17:16:57 +0200 Subject: Fix the example for current assembler version + add an example for serial communication --- examples/minimal.gbasm | 2 +- examples/serial.gbasm | 73 ++++++++++++++++++++++++++ examples/wave.gbasm | 136 +++++++++++++++++++++++++++++++++++++++++++++++++ examples/zoom.gbasm | 125 --------------------------------------------- 4 files changed, 210 insertions(+), 126 deletions(-) create mode 100644 examples/serial.gbasm create mode 100644 examples/wave.gbasm delete mode 100644 examples/zoom.gbasm diff --git a/examples/minimal.gbasm b/examples/minimal.gbasm index 33405c3..4f51339 100644 --- a/examples/minimal.gbasm +++ b/examples/minimal.gbasm @@ -15,7 +15,7 @@ Checksum: ; The bytes 0x134-0x14d need to add up to 0xe7 (= 0xff - 0x19) Start: Wait_VBlank: - LD A, (0xFF00+$41) + LD A, ($41) AND $03 CP $01 JR NZ, =Wait_VBlank diff --git a/examples/serial.gbasm b/examples/serial.gbasm new file mode 100644 index 0000000..d4b4937 --- /dev/null +++ b/examples/serial.gbasm @@ -0,0 +1,73 @@ +; This ROM is a simple example of how to use serial connections. +; It will wait to receive text via the serial connection, save the text in memory until it encounters a new line (without overflow check), then send back in ASCII "Astatin" and a new line followed by the text that was received. + +.PADTO 0x0058 + JP =Serial_Recv + +.PADTO 0x0100 +Entry: + JP =Start + +.PADTO 0x0104 +Nintendo_Logo: ; The Nintendo logo must be stored in bytes 0x104-133 + .DB $CE,$ED,$66,$66,$CC,$0D,$00,$0B,$03,$73,$00,$83,$00,$0C,$00,$0D + .DB $00,$08,$11,$1F,$88,$89,$00,$0E,$DC,$CC,$6E,$E6,$DD,$DD,$D9,$99 + .DB $BB,$BB,$67,$63,$6E,$0E,$EC,$CC,$DD,$DC,$99,$9F,$BB,$B9,$33,$3E + +.PADTO 0x0134 +Checksum: ; The bytes 0x134-0x14d need to add up to 0xe7 (= 0xff - 0x19) + .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 + .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$e7 + +Start: + LD SP, $fffe + + LD A, $00 + LD ($40), A + + LD A, $08 + LD ($ff), A + + LD HL, $c000 + EI + + Lock: + HALT + EI + JR =Lock + +Serial_Recv: + LD A, ($01) + CP $0a + CALL Z, =Read_back + LD (HL+), A + RETI + +Read_back: + LD (HL), $00 + LD HL, =Astatin_ASCII + CALL =Print + LD HL, $c000 + CALL =Print + JP =Start + +Astatin_ASCII: +.DB $41, $73, $74, $61, $74, $69, $6e, $0a $00 + +Print: + .send_loop: + LD A, (HL+) + CP $00 + RET Z + + LD ($01), A + + LD A, $81 + + LD ($02), A + + .wait_transfer: + LD A, ($02) + BIT 7, A + JR NZ, =.wait_transfer + JR =.send_loop diff --git a/examples/wave.gbasm b/examples/wave.gbasm new file mode 100644 index 0000000..a63fc43 --- /dev/null +++ b/examples/wave.gbasm @@ -0,0 +1,136 @@ +.PADTO 0x0040 +Interrupt_VBlank: + JP =VBlank + +.PADTO 0x0048 +Interrupt_Stat: + JP =Effect + +.PADTO 0x0100 + JP =Start + +.PADTO 0x0104 +Nintendo_Logo: ; The Nintendo logo must be stored in bytes 0x104-133 + .DB $CE,$ED,$66,$66,$CC,$0D,$00,$0B,$03,$73,$00,$83,$00,$0C,$00,$0D + .DB $00,$08,$11,$1F,$88,$89,$00,$0E,$DC,$CC,$6E,$E6,$DD,$DD,$D9,$99 + .DB $BB,$BB,$67,$63,$6E,$0E,$EC,$CC,$DD,$DC,$99,$9F,$BB,$B9,$33,$3E + +.PADTO 0x0134 +Checksum: ; The bytes 0x134-0x14d need to add up to 0xe7 (= 0xff - 0x19) + .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 + .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$e7 + +.DEFINE Wave_Top $c0 +Start: + LD A, ($42) + LD ($82), A + LD A, ($43) + LD ($83), A + LD C, $01 + LD A, $03 + LD ($FF), A + LD A, $40 + LD ($41), A + LD A, $01 + LD ($44), A + LD B, $00 + LD C, $30 + LD H, $Wave_Top + LD L, $00 + LD A, $00 + Clean_Wave.loop: + LD (HL+), A + CP L + JR NZ, =Clean_Wave.loop + EI +Halt_loop: + HALT + JP =Halt_loop + +Effect: + LD A, ($44) + INC A + AND $7f + LD ($45), A + LD E, A + LD D, $Wave_Top + LD A, (DE) + LD D, $02 + LD E, A + LD A, (DE) + + AND $c0 + RRCA + RRCA + RRCA + RRCA + RRCA + RRCA + SUB $02 + + LD D, A + + LD A, ($83) + ADD D + LD ($43), A + + LD A, ($82) + ADD D + LD ($42), A + RETI + +VBlank: + INC B + LD A, B + AND $03 + JR NZ, =VBlank.end + CP C + JR Z, =Wave_Draw + INC C + Wave_Draw: + LD H, $Wave_Top + LD L, $00 + VBlank.loop: + LD A, (HL) + ADD $08 + LD (HL+), A + LD A, C + CP L + JR NZ, =VBlank.loop + VBlank.end: + RETI + +.PADTO 0x0200 +Sin_wave: + .DB 0x80, 0x83, 0x86, 0x89, 0x8C, 0x90, 0x93, 0x96 + .DB 0x99, 0x9C, 0x9F, 0xA2, 0xA5, 0xA8, 0xAB, 0xAE + .DB 0xB1, 0xB3, 0xB6, 0xB9, 0xBC, 0xBF, 0xC1, 0xC4 + .DB 0xC7, 0xC9, 0xCC, 0xCE, 0xD1, 0xD3, 0xD5, 0xD8 + .DB 0xDA, 0xDC, 0xDE, 0xE0, 0xE2, 0xE4, 0xE6, 0xE8 + .DB 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4 + .DB 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC + .DB 0xFD, 0xFD, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF + .DB 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD + .DB 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6 + .DB 0xF5, 0xF4, 0xF3, 0xF1, 0xF0, 0xEF, 0xED, 0xEB + .DB 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC + .DB 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9 + .DB 0xC7, 0xC4, 0xC1, 0xBF, 0xBC, 0xB9, 0xB6, 0xB3 + .DB 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C + .DB 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83 + .DB 0x80, 0x7D, 0x7A, 0x77, 0x74, 0x70, 0x6D, 0x6A + .DB 0x67, 0x64, 0x61, 0x5E, 0x5B, 0x58, 0x55, 0x52 + .DB 0x4F, 0x4D, 0x4A, 0x47, 0x44, 0x41, 0x3F, 0x3C + .DB 0x39, 0x37, 0x34, 0x32, 0x2F, 0x2D, 0x2B, 0x28 + .DB 0x26, 0x24, 0x22, 0x20, 0x1E, 0x1C, 0x1A, 0x18 + .DB 0x16, 0x15, 0x13, 0x11, 0x10, 0x0F, 0x0D, 0x0C + .DB 0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04 + .DB 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01 + .DB 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03 + .DB 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A + .DB 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15 + .DB 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x24 + .DB 0x26, 0x28, 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37 + .DB 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D + .DB 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x64 + .DB 0x67, 0x6A, 0x6D, 0x70, 0x74, 0x77, 0x7A, 0x7D diff --git a/examples/zoom.gbasm b/examples/zoom.gbasm deleted file mode 100644 index 6ed92a1..0000000 --- a/examples/zoom.gbasm +++ /dev/null @@ -1,125 +0,0 @@ -.PADTO 0x0040 -Interrupt_VBlank: - JP =VBlank - -.PADTO 0x0048 -Interrupt_Stat: - JP =Effect - -.PADTO 0x0100 - JP =Start - -.PADTO 0x0104 -Nintendo_Logo: ; The Nintendo logo must be stored in bytes 0x104-133 - .DB $CE,$ED,$66,$66,$CC,$0D,$00,$0B,$03,$73,$00,$83,$00,$0C,$00,$0D - .DB $00,$08,$11,$1F,$88,$89,$00,$0E,$DC,$CC,$6E,$E6,$DD,$DD,$D9,$99 - .DB $BB,$BB,$67,$63,$6E,$0E,$EC,$CC,$DD,$DC,$99,$9F,$BB,$B9,$33,$3E - -.PADTO 0x0134 -Checksum: ; The bytes 0x134-0x14d need to add up to 0xe7 (= 0xff - 0x19) - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$e7 - -.DEFINE Wave_Top $c0 -Start: - LD C, $01 - LD A, $03 - LD ($FF), A - LD A, $40 - LD ($41), A - LD A, $01 - LD ($44), A - LD B, $00 - LD C, $30 - LD H, $Wave_Top - LD L, $00 - LD A, $00 - Clean_Wave.loop: - LD (HL+), A - CP L - JR NZ, =Clean_Wave.loop - EI -Halt_loop: - HALT - JP Halt_loop - -Effect: - LD A, ($44) - INC A - AND $7f - LD ($45), A - LD E, A - LD D, $Wave_Top - LD A, (DE) - LD D, $02 - LD E, A - LD A, (DE) - - AND $c0 - RRCA - RRCA - RRCA - RRCA - RRCA - RRCA - SUB $02 - - LD ($43), A - LD ($42), A - RETI - -VBlank: - INC B - LD A, B - AND $03 - JR NZ, =VBlank.end - CP C - JR Z, =Wave_Draw - INC C - Wave_Draw: - LD H, $Wave_Top - LD L, $00 - VBlank.loop: - LD A, (HL) - ADD $08 - LD (HL+), A - LD A, C - CP L - JR NZ, =VBlank.loop - VBlank.end: - RETI - -.PADTO 0x0200 -Sin_wave: - .DB 0x80, 0x83, 0x86, 0x89, 0x8C, 0x90, 0x93, 0x96 - .DB 0x99, 0x9C, 0x9F, 0xA2, 0xA5, 0xA8, 0xAB, 0xAE - .DB 0xB1, 0xB3, 0xB6, 0xB9, 0xBC, 0xBF, 0xC1, 0xC4 - .DB 0xC7, 0xC9, 0xCC, 0xCE, 0xD1, 0xD3, 0xD5, 0xD8 - .DB 0xDA, 0xDC, 0xDE, 0xE0, 0xE2, 0xE4, 0xE6, 0xE8 - .DB 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4 - .DB 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC - .DB 0xFD, 0xFD, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF - .DB 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD - .DB 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6 - .DB 0xF5, 0xF4, 0xF3, 0xF1, 0xF0, 0xEF, 0xED, 0xEB - .DB 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC - .DB 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9 - .DB 0xC7, 0xC4, 0xC1, 0xBF, 0xBC, 0xB9, 0xB6, 0xB3 - .DB 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C - .DB 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83 - .DB 0x80, 0x7D, 0x7A, 0x77, 0x74, 0x70, 0x6D, 0x6A - .DB 0x67, 0x64, 0x61, 0x5E, 0x5B, 0x58, 0x55, 0x52 - .DB 0x4F, 0x4D, 0x4A, 0x47, 0x44, 0x41, 0x3F, 0x3C - .DB 0x39, 0x37, 0x34, 0x32, 0x2F, 0x2D, 0x2B, 0x28 - .DB 0x26, 0x24, 0x22, 0x20, 0x1E, 0x1C, 0x1A, 0x18 - .DB 0x16, 0x15, 0x13, 0x11, 0x10, 0x0F, 0x0D, 0x0C - .DB 0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04 - .DB 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01 - .DB 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03 - .DB 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A - .DB 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15 - .DB 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x24 - .DB 0x26, 0x28, 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37 - .DB 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D - .DB 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x64 - .DB 0x67, 0x6A, 0x6D, 0x70, 0x74, 0x77, 0x7A, 0x7D -- cgit v1.2.3-70-g09d2