Omnimaga

Calculator Community => Other Calc-Related Projects and Ideas => TI Z80 => Topic started by: Xeda112358 on June 21, 2013, 05:48:39 pm

Title: [Z80-Asm] Plasma
Post by: Xeda112358 on June 21, 2013, 05:48:39 pm
Based on code that Matrefeytontias gave me, I put together a plasma program in assembly :) I am pleased with the speed, but it can be made a bit faster. First, I am using the OS bcall _GrBufCpy which is not that fast, and second, if I include a custom routine, it will be interleaved with the program so updating the LCD will cost almost no extra time. Using some mathy things and Wabbit's code counter, I estimate cutting out 167000 t-states every loop by ditching the OS routine and using an interleaved routine.
Anyways, here is what it looks like at 6MHz and the code I through together for this first version :)
Code: [Select]
#include    "ti83plus.inc"
#define     progStart   $9D95
.org        progStart-2
.db         $BB,$6D
MainLoop:
     .db 3Eh    ;start of ld a,*
smc_index:
     .db 0
     inc a
     and 1Fh
     ld (smc_index),a
     ld hl,LUT
     add a,l
     jr nc,$+3
     inc h
     ld l,a
     ld c,(hl)
     .db 16h     ;ld d,*
smc_yskew:
     .db 40
     call C_div_D
     ld a,c
; ld a,(hl)
; rlca \ rlca \ rlca \ and 7
     ld (smc_ycomponent),a

     ld a,(smc_index)
     add a,a
     .db $C6
smc_var1:
     .db 0
     and 31
     ld hl,LUT
     add a,l
     jr nc,$+3
     inc h
     ld l,a
     ld c,(hl)
     .db 16h     ;ld d,*
smc_xskew:
     .db 32
     call C_div_D
     ld a,c
; ld a,(hl)
; rlca \ rlca \ rlca \ and 7
     ld (smc_xcomponent),a
     ld ix,933Fh
     ld hl,0
while_y_lt_32:
     ld a,l
     .db $C6
smc_ycomponent:
     .db 0
     and 31
     ld de,LUT
     add a,e
     jr nc,$+3
     inc d
     ld e,a
     ld a,(de)
     ld (smc_m),a
while_x_lt_48:
     ld a,h
     .db $C6       ;add a,*
smc_xcomponent:
     .db 0
     and 31
     ld de,LUT
     add a,e
     jr nc,$+3
     inc d
     ld e,a
     ld a,(de)
     .db $C6
smc_m:
     .db 0
     ld b,0
     jr nc,$+3
     inc b
     ld c,a
     push bc
     ld de,(smc_ycomponent)
     ld a,(smc_xcomponent)
     add a,e
     add a,h
     add a,l
     ld c,a
     ld a,(smc_index)
     add a,c
     and 31
     ld de,LUT
     add a,e
     jr nc,$+3
     inc d
     ld e,a
     ld a,(de)
     pop bc
     add a,c
     jr nc,$+3
     inc b
     rr b \ rra
     rr b \ rra
     ld b,a          ;color
     ld a,h \ and 3
     jr nz,$+10
       inc ix
       ld (ix),a
       ld (ix+12),a
     rl (ix) \ rl (ix)
     rl (ix+12) \ rl (ix+12)
     ld a,b
     cp 144 \ jr nc,$+5
     inc (ix)
     cp 96 \ jr nc,$+8
     inc (ix+12)
     inc (ix+12)
     cp 48 \ jr nc,$+11
     inc (ix+12)
     inc (ix)
     inc (ix)
     inc h
     ld a,h
     cp 48
     jr nz,while_x_lt_48
     ld h,0
     ld de,12
     add ix,de
     inc l
     ld a,l
     cp 32
     jp nz,while_y_lt_32

     bcall(486Ah)
     bcall(4744h)
     cp 15
     ret z
     ld hl,(smc_xskew)
     ld de,(smc_yskew)
     ld bc,(smc_var1)
     cp 3
     jr nz,$+3
       inc l
     cp 2
     jr nz,$+3
       dec l
     cp 1
     jr nz,$+3
       inc e
     cp 4
     jr nz,$+3
       dec e
     cp 10
     jr nz,$+3
       inc c
     cp 11
     jr nz,$+3
       dec c
     ld a,c
     and 31
     ld (smc_var1),a
     ld a,e
     cp 64
     jr nc,$+5
       ld (smc_yskew),a
     ld a,l
     cp 64
     jr nc,$+5
       ld (smc_xskew),a
     jp MainLoop

LUT:
.db 255,254,246,234,219,199,177,153,128,103,79,57,37,22,10,2,0,2,10,22,37,57,79,103,128,153,177,199,219,234,246,254
C_Div_D:
;Inputs:
;     C is the numerator
;     D is the denominator
;Outputs:
;     A is the remainder
;     B is 0
;     C is the result of C/D
;     D,E,H,L are not changed
;

     xor a
     sla c
     rla
     sla c
     rla
     cp d
     jr c,$+4
       inc c
       sub d
     sla c
     rla
     cp d
     jr c,$+4
       inc c
       sub d
     sla c
     rla
     cp d
     jr c,$+4
       inc c
       sub d
     sla c
     rla
     cp d
     jr c,$+4
       inc c
       sub d
     sla c
     rla
     cp d
     jr c,$+4
       inc c
       sub d
     sla c
     rla
     cp d
     jr c,$+4
       inc c
       sub d
     sla c
     rla
     cp d
     ret c
     inc c
     sub d
     ret
Controls:
Arrows change the skew value. I actually have no idea what effect these have except that small number produce more noticeable effects. The upper limit is 63, I think the lower limit is 0 (which will result in dividing by 0).
+ and - change a value to, and I also don't know precisely how that value is changing things.
Title: Re: [Z80-Asm] Plasma
Post by: Sorunome on June 21, 2013, 05:59:25 pm
lol, it is far faster than the axe version, nice job :D
Title: Re: [Z80-Asm] Plasma
Post by: DJ Omnimaga on June 21, 2013, 11:00:13 pm
Looks very nice.

By the way, I wonder how cool would a racing or tunnel game be if the track was made of an animated plasma effect? Basically, the white would be black and the gray white, and you would have to stay inside the white area.
Title: Re: [Z80-Asm] Plasma
Post by: Matrefeytontias on June 22, 2013, 11:08:54 am
Cool, but the plasma looks weird IMO ...

lol, it is far faster than the axe version, nice job :D
Of course it is, since it's ASM :P

By the way, I wonder how cool would a racing or tunnel game be if the track was made of an animated plasma effect? Basically, the white would be black and the gray white, and you would have to stay inside the white area.
I don't really see how you could make a game out of a plasma ... excepting maybe a texture for a raycaster like I did with nRayC ???
Title: Re: Re: [Z80-Asm] Plasma
Post by: DJ Omnimaga on June 22, 2013, 11:47:03 am
It could maybe prove to be fun and challenging since you would have to dodge the road sides, but it would have to not move too fast so that winning the game is possible. :P
Title: Re: [Z80-Asm] Plasma
Post by: utz on June 22, 2013, 05:02:24 pm
I'm with Matrefeytontias, looks kinda weird for plasma. But I'm too stupid to do any demoscene fx so I shouldn't talk :P
Title: Re: [Z80-Asm] Plasma
Post by: Sorunome on June 23, 2013, 05:03:23 am
Looks very nice.

By the way, I wonder how cool would a racing or tunnel game be if the track was made of an animated plasma effect? Basically, the white would be black and the gray white, and you would have to stay inside the white area.
mind=blowen
awesome idea coming up there