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: