diff --git a/examples/README.md b/examples/README.md index eb17c7f7..4f2f88fc 100644 --- a/examples/README.md +++ b/examples/README.md @@ -18,7 +18,7 @@ * [Bell](crossplatform/bell.mfk) (Apple II/ZX Spectrum) – a program that goes \*ding!\* -* [Life](crossplatform/life.mfk) (C64/ZX Spectrum) – Conway's game of life +* [Life](crossplatform/life.mfk) (C64/C16/Atari/ZX Spectrum) – Conway's game of life ## Commodore 64 examples diff --git a/examples/crossplatform/life.mfk b/examples/crossplatform/life.mfk index 8044cc9f..184bd6d6 100644 --- a/examples/crossplatform/life.mfk +++ b/examples/crossplatform/life.mfk @@ -1,4 +1,4 @@ -#if CBM_64 +#if CBM_64 || CBM_264 const byte width = 40 const byte height = 25 #endif @@ -6,17 +6,22 @@ const byte height = 25 const byte width = 32 const byte height = 24 #endif +#if ATARI_8 +const byte width = 40 +const byte height = 24 +#endif const word area = word(width) * word(height) // representation: $1 live now $80 live soon const byte ALIVE = $81 +const byte DEAD = 0 array buffer [width * height] align(256) void init_buffer() { pointer p for p,buffer.addr,paralleluntil,buffer.addr+area { - p[0] = 0 + p[0] = DEAD } // glider: buffer[1*width + 2] = ALIVE @@ -59,8 +64,8 @@ void do_round() align(fast) { p = buffer.addr for j,0,paralleluntil,height { for x,0,paralleluntil,width { - if p[x] & $80 != 0 { p[x] = $81 } - else { p[x] = 0 } + if p[x] & $80 != 0 { p[x] = ALIVE } + else { p[x] = DEAD } } p += width } @@ -103,6 +108,66 @@ void wait_frame() align(fast) { } #endif +#if CBM_264 + +void init_gfx() { +} + +void redraw() align(fast) { + pointer src, dest + byte x, y + src = buffer.addr + dest = $c00 + for y,0,until,height { + for x,0,until,width { + if src[x] != 0 { + dest[x] = 128 + ' ' + } else { + dest[x] = ' ' + } + } + src += width + dest += width + } +} + +void wait_frame() align(fast) { + while ted_raster_y != $ff {} + while ted_raster_y == $ff {} +} +#endif + +#if ATARI_8 + +pointer screen_start @$58 +byte clock @$14 + +void init_gfx() { +} + +void redraw() align(fast) { + pointer src, dest + byte x, y + src = buffer.addr + dest = screen_start + for y,0,until,height { + for x,0,until,width { + if src[x] != 0 { + dest[x] = 128 + ' 'scr + } else { + dest[x] = ' 'scr + } + } + src += width + dest += width + } +} + +void wait_frame() align(fast) { + while clock != clock {} +} +#endif + #if ZX_SPECTRUM void init_gfx() {