URL
https://opencores.org/ocsvn/diogenes/diogenes/trunk
Subversion Repositories diogenes
[/] [diogenes/] [trunk/] [video/] [snake2.asm] - Rev 236
Compare with Previous | Blame | View Log
@ l7: stack
@ l6: push_function
@ l0: return address of leavfuction (push pop im speziell)
stio l0, [l0]
LDL l0, :start
LDL l6, :push
ldi l7, 0x03
jump <l0>
lsi l7, 0xff
push:
st h0, [l7]
adi l7, -1
st h1, [l7]
adi l7, -1
st h2, [l7]
adi l7, -1
st h3, [l7]
adi l7, -1
st h4, [l7]
adi l7, -1
st h5, [l7]
adi l7, -1
st h6, [l7]
adi l7, -1
st h7, [l7]
jump <l0>
adi l7, -1
pop:
adi l7, 1
ld h7, [l7]
adi l7, 1
ld h6, [l7]
adi l7, 1
ld h5, [l7]
adi l7, 1
ld h4, [l7]
adi l7, 1
ld h3, [l7]
adi l7, 1
ld h2, [l7]
adi l7, 1
ld h1, [l7]
adi l7, 1
ld h0, [l7]
nop
nop
jump <h0>
nop
start:
@ initialize snake
ldi h1, 8
l0:
st h1, [h1]
brnz h1, :l0
adi h1, -1
ldi h1, 4
ldi h2, 0
@ initialize vmem
LDL h4, :set_tile
ldi l3, 59 @ max y
hloop:
ldi l2, 79 @ max x
pixloop:
call h0, <h4>
ldi l1, 0x6b @ white=0x7f (black = 6b)
brnz l2, :pixloop
adi l2, -1
brnz l3, :hloop
adi l3, -1
LDL h3, :delay
LDL h5, :update
loop:
ldi l0, 0
ldio l0, [l0]
ldi l1, 0x01
and l2, l0, l1 @ select bit for right
sub h2, h2, l2 @ add bit to direction
shi l0, -1 @ shift input
and l2, l0, l1
add h2, h2, l2 @ add bit to direction
stio h2, [l0]
call h0, <h5>
mov l1, h2
call h0, <h3> @ call delay
ldi l1, 22 @ 2^20 steps
brnz h5, :loop
nop
update:
call l0, <l6>
nop
ldi l0, 0
ld l1, [l0]
@ extract tile,y,x (l1=tile, l2=x, l3=y)
ldi l4, 0xff
and l2, l1, l4
shi l1, -8
and l3, l1, l4
ldi l1, 0x6b
LDL l0, :set_tile
call h0, <l0>
nop
ldi l0, 0
ldi l2, 1
cloop:
ld l1, [l2] @ src
adi l2, 1 @ src + 1
st l1, [l0] @ dst
cmpl l3, l0, h1 @ until dst=highest address)
brnz l3, :cloop
adi l0, 1 @ dst + 1
ldi l5, 3
and h2, h2, l5 @ trunc direction
@ extract tile,y,x (l1=tile, l2=x, l3=y)
ldi l4, 0xff
and l2, l1, l4
shi l1, -8
and l3, l1, l4
shi l1, -8 @ old direction
shi l1, 4 @ old direction << 2
or l1, l1, h2 @ 00OO 00NN (old new combination)
adi l1, 4
mov h5, l0
mov h6, l2
mov h7, l3
LDL l4, :set_tile
call h0, <l4>
nop
mov l0, h5
mov l2, h6
mov l3, h7
down:
xor l4, h2, l5
brnz l4, :up
nop
adi l3, 1
ldi l1, 8
up:
ldi l5, 1
xor l4, h2, l5
brnz l4, :right
nop
adi l3, -1
ldi l1, 9
right:
brnz h2, :left
ldi l5, 2
adi l2, 1
ldi l1, 10
left:
xor l4, h2, l5
brnz l4, :end_key
nop
adi l2, -1
ldi l1, 11
end_key:
mov l4, h2
shi l4, 8
or l4, l4, l3
shi l4, 8
or l4, l4, l2
st l4, [l0] @ write new head
LDL l0, :set_tile
call h0, <l0>
nop
ldi l0, 0
ld l1, [l0]
@ extract tail tile,y,x (l1=tile, l2=x, l3=y)
ldi l4, 0xff
and l2, l1, l4
shi l1, -8
and l3, l1, l4
ldi l0, 1
ld l1, [l0]
nop
shi l1, -16 @ old direction
adi l1, 0x0c
LDL l0, :set_tile
call h0, <l0>
nop
adi h6, l6, 17
jump <h6>
nop
set_stile:
call l0, <l6>
nop
ldi l0, 0xff
and l2, l1, l0
shi l1, -8
and l3, l1, l0
LDL h4, :set_tile
call h0, <h4>
shi l1, -8
adi h6, l6, 17
jump <h6>
nop
set_tile:
call l0, <l6>
nop
ldi l4, 0xc0 @ vmem starts at 0xc000
shi l4, 8
shi h3, l3, 7
add l0, l2, h3
add l0, l0, l4
stio l1, [l0]
adi h6, l6, 17
jump <h6>
nop
delay:
call l0, <l6>
nop
ldi l0, 1
sh l0, l0, l1
delay_loop:
brnz l0, :delay_loop
adi l0, -1
adi h6, l6, 17
jump <h6>
nop
stop