A few days ago I coded The Matrix digital rain effect, a fictional representation of the code for the virtual reality of The Matrix. The technique is simple: fill the screen with random characters and scroll down columns of attributes, occasionally switching between black and green.
Here's the final code - 147 bytes of Z80 using the default Sinclair font:
        org 08000h
; black border / black attributes
        xor a
        out (0FEh),a
        ld hl,05AFFh
attr:   ld (hl),a
        dec hl
        bit 2,h
        jr z,attr
; fill screen with random characters
        ld e,a
fillscr:ld d,040h
fill:   call rndchar
        ld a,d
        cp 058h
        jr nz,fill
        inc e
        jr nz,fillscr
; digital rain loop
frame:  ld b,06h
        halt
column: push bc
; randomize one character
        call random
        and 018h
        jr z,docol
        add a,038h
        ld d,a
        call random
        ld e,a
        call rndchar
; select a random column
docol:  call random
        and 01Fh
        ld l,a
        ld h,058h
; ~1% chance black -> white
        ld a,(hl)
        or a
        ld bc,0247h
        jr z,check
; white -> bright green
white:  cp c
        ld c,044h
        jr z,movecol
; bright green -> green
        cp c
        ld c,04h
        jr z,movecol
; ~6% chance green -> black
        ld bc,0F00h
check:  call random
        cp b
        jr c,movecol
        ld c,(hl)
; move column down
movecol:ld de,020h
        ld b,018h
down:   ld a,(hl)
        ld (hl),c
        ld c,a
        add hl,de
        djnz down
        pop bc
        djnz column
; test for keypress
        ld bc,07FFEh
        in a,(c)
        rrca
        jr c,frame
        ret
; display a random glyph
rndchar:call random
crange: sub 05Fh
        jr nc,crange
        add a,a
        ld l,a
        ld h,0
        add hl,hl
        add hl,hl
        ld bc,(05C36h)
        add hl,bc
        ld b,8
char:   ld a,(hl)
        ld (de),a
        inc d
        inc hl
        djnz char
        ret
; get a byte from the ROM
random: push hl
        ld hl,(seed)
        inc hl
        ld a,h
        and 01Fh
        ld h,a
        ld (seed),hl
        ld a,(hl)
        pop hl
        ret
seed:

Hi!
ReplyDeleteI assembled this code snippet using zeus (cross-assembler by Mottershead and Brattel), and ran it in the zeus built-in emulator and also in spectaculator,
However, the code stops on the halt instruction. Only if I comment it out will the code run properly on both emulators.
Since both emulators have no issues running large programs and spectaculator runs most existing games, I'm curious as to why this doesn't work?
/// Magnus
Did it in BASIC on a TRS-80 MC-10:
ReplyDeletehttps://youtu.be/53OgDv_BuQk
Cool stuff :-)
ReplyDelete