Re: A86: How do you get the value in OP1 into a register?
[Prev][Next][Index][Thread]
Re: A86: How do you get the value in OP1 into a register?
What exactly is the point of this program?
At 04:52 PM 5/24/98 -0500, you wrote:
>
>I have been trying to port this TI-BASIC program that I made into
>assembly because it runs SOOO slow. Here is the program:
>:ClDrw:FnOff
>:PlOff :AxesOff
>:Goto start
>:Lbl plot
>:PxOn(iPart (64-Y*64),x)
>:Goto A
>:Lbl start
>:For(x,0,127)
>:2.5+(x/84)->X
>:0.5->Y
>:For(N,0,150)
>:X*Y(1-Y)->Y
>:If N>100
>:Goto plot
>:Lbl A
>:End
>:End
>Anyways, I was trying to convert this into assembly and I ran into a
>problem. I'll show the source before attempting to explain my problem.
>It's kind of long so please, just stay with me.
>#include "ti86asm.inc"
>#include "Ti86math.inc"
>#include "TI86ops.inc"
>
>.org _asm_exec_ram
>
> call _clrLCD
> ld e,0 ;e = x counter and x coordinate of
>screen
>XLOOP:
> ld a,e ;2.5+(x/84), OP1=x
> call _SetXXOP1
> ld a,84 ;OP2=84
> call _SetXXOP2
> call _FPDIV ;OP1=x/84
> ld hl, TWOPT5
> call _MOV10TOOP2 ;OP2=2.5
> call _FPADD ;OP1=2.5+(x/84)
> call _OP1TOOP5 ;OP5=OP1, OP5 will store X for calculations
> ld hl, PT5 ;y = .5
> call _MOV10TOOP2 ;OP2=y
> call _OP2TOOP6 ;OP6=y
> ld c,0 ;c = iteration counter
>CALC:
> call _OP6TOOP1 ;OP1=y
> call _OP2SET1 ;OP2=1
> call _FPSUB ;OP1=y-1
> call _OP6TOOP2 ;OP2=y
> call _FPMULT ;OP1=y(y-1)
> call _OP5TOOP2 ;OP2=x
> call _FPMULT ;OP1=x*y(y-1)
> call _OP1TOOP6 ;y now equals new value
> ld a,c
> ld b,100 ;if c>100 goto PLOT
> cp b
> jr nc, Plot
>Return:
> inc c
> ld a,c
> ld b,150 ;if c>150 next x
> cp b
> jr nz, CALC
> inc e ;increment x counter
> ld a,e
> ld b,128
> cp b
> jr nz, XLOOP
> call _getkey
> call _clrLCD
> ret
>
>
>TWOPT5: .db $00, $00, $FC, $25, $00, $00, $00, $00, $00, $00
>PT5: .db $00, $FE, $FB, $50, $00, $00, $00, $00, $00, $00
>
>Plot:
> call _OP6TOOP1 ;OP1=y
> ld a,64
> call _SetXXOP2 ;OP2=64
> call _FPMULT ;OP1=y*64
> call _OP1TOOP2 ;OP2=OP1
> call _SetXXOP1 ;OP1=64
> call _FPSUB ;OP1=64-y*64
> call _INTGR ;get integer value of OP1
>;what do I need to put in order to get d to equal the value in OP1
> ld d,0 ;this line is here because I just wanted
>to test and see if the rest worked
> call FindPixel
> or (hl)
> ld (hl), a
> jr Return
>
>FindPixel:
> ld hl,FP_Bits
> ld a,e
> and %00000111
> add a,l
> ld l,a
> adc a,h
> sub l
> ld h,a
> ld c,(hl)
> ld hl,FP_RLD
> ld (hl),d
>
> ld a,e
> rrca
> rrca
> rrca
> rld
> or $FC
> ld l,(hl)
> ld h,a
> ld a,c
> ret
>
>FP_RLD: .db $00
>FP_Bits: .db $80,$40,$20,$10,$08,$04,$02,$01
>.end
>
>Okay, now back to the problems. As I put in the comments, I don't know
>how to get the value in OP1 into the d register so that the findpixel
>routine can run. Also, when I ran the above code I got an overflow
>error. Any ideas why? Also, since I'm just a beginning asm programmer
>(thanks Matt for your very helpful page) any other errors that you could
>find and help me out with would be greatly appreciated. Thanks.
>
>--Blake Johnson
>
>
>
>
// David Phillips
// mailto:electrum@tfs.net
// AIM: electrum32
References: