UrForth: more superinstruction optimising patterns ("TO" optimisation)
[urasm.git] / samples / matrix.zas
blobe66228e4bd2debae68d8c4a58486f7b79357377c
1 ; http://www.retroprogramming.com/2015/10/the-matrix-digital-rain-for-zx-spectrum.html
2   org 08000h
4 ; black border / black attributes
6   xor   a
7   ld    hl,05AFFh
8   halt
9   out   (0FEh),a
10 attr:
11   ld    (hl),a
12   dec   hl
13   bit   2,h
14   jr    z,attr
16   ; fill screen with random characters
17   ld    e,a
18 fillscr:
19   ld    d,040h
20 fill:
21   call  rndchar
22   ld    a,d
23   cp    058h
24   jr    nz,fill
25   inc   e
26   jr    nz,fillscr
28   ; digital rain loop
29 frame:
30   ld    b,06h
31   halt
32 column:
33   push  bc
35   ; randomize one character
36   call  random
37   and   018h
38   jr    z,docol
39   add   a,038h
40   ld    d,a
41   call  random
42   ld    e,a
43   call  rndchar
45   ; select a random column
46 docol:
47   call  random
48   and   01Fh
49   ld    l,a
50   ld    h,058h
52   ; ~1% chance black -> white
53   ld    a,(hl)
54   or    a
55   ld    bc,0247h
56   jr    z,check
58   ; white -> bright green
59 white:
60   cp    c
61   ld    c,044h
62   jr    z,movecol
64   ; bright green -> green
65   cp    c
66   ld    c,04h
67   jr    z,movecol
69   ; ~6% chance green -> black
70   ld    bc,0F00h
71 check:
72   call  random
73   cp    b
74   jr    c,movecol
75   ld    c,(hl)
77   ; move column down
78 movecol:
79   ld    de,020h
80   ld    b,018h
81 down:
82   ld    a,(hl)
83   ld    (hl),c
84   ld    c,a
85   add   hl,de
86   djnz  down
87   pop   bc
88   djnz  column
90   ; test for keypress
91   ld    bc,07FFEh
92   in    a,(c)
93   rrca
94   jr    c,frame
95   ret
98 ; display a random glyph
99 rndchar:
100   call  random
101 crange:
102   sub   05Fh
103   jr    nc,crange
104   ;k8: replaced with this
105   ; calculate ROM char address
106   ld    l,a
107   add   hl,hl
108   ld    h,15
109   add   hl,hl
110   add   hl,hl
111   ;add   a,a
112   ;ld    l,a
113   ;ld    h,0
114   ;add   hl,hl
115   ;add   hl,hl
116   ;ld    bc,(05C36h)
117   ;add   hl,bc
118   ld    b,8
119 char:
120   ld    a,(hl)
121   ld    (de),a
122   inc   d
123   inc   hl
124   djnz  char
125   ret
128 ; get a byte from the ROM
129 random:
130   push  hl
131   ld    hl,(seed)
132   inc   hl
133   ld    a,h
134   and   01Fh
135   ld    h,a
136   ld    (seed),hl
137   ld    a,(hl)
138   pop   hl
139   ret
141 seed defw 0