negative bcd variablen?


negative bcd variablen?

von Heaven_tqa » So 20. Aug 2006, 13:25
mein action rollenspiel benutzt zut zeit mehr als 4096 verschiedene items... einige davon beeinflussen die spieler attribute negativ...

die items werden bei laufzeit generiert (genau wie bei diablo). so und nun folgendes problem.

auf dem schirm sollen die werte korrekt angezeigt werden, z.b.

Strärke +5 oder Geschicklichkeit -3

d.h. auf dem info screen hat mein charakter "Stärke 32-3 = 29" wenn er so einen gegenstand anlegt...

die statistiken der items sind normale signed hex werte... diese werden von einer "bin2bcd" in ascii gewandelt. meine frage...

wie behandelt der 6502 im dezimal mode das vorzeichen? macht er das überhaupt wie im binärmode? oder muss ich simulieren?

wie würdet ihr das machen?

von Heaven_tqa » So 20. Aug 2006, 14:03
problem auf eine simple art gelöst...

Code: Alles auswählen
      org $4000
      
init cld
   lda #-5
   
   jsr writebcd_ascii
   
ende jmp ende

writebcd_ascii jsr bin2bcd
      lda bcd

writebcd_ascii_direct pha
      lsr @
      lsr @
      lsr @
      lsr @
      ldy #0
      jsr writenumber_ascii
      pla
      and #$0f
writenumber_ascii clc
      adc #48
      sta ascii+1,y
      iny
      rts



;first convert A into BCD
bin2bcd   tax
      lda #"+"
      sta ascii
      txa
      bpl INBCD8      ;if already positive then procede as normal
;negative value so make it positve
      eor #$ff
      clc
      adc #1
      ldx #"-"
      stx ascii
INBCD8   SED      ; Switch to decimal mode
      sta bin
      LDA #0      ; Ensure the result is clear
      STA BCD+0
      STA BCD+1
      LDX #8      ; The number of source bits
      
CNVBIT   ASL BIN      ; Shift out one bit
      LDA BCD   ; And add into result
      ADC BCD
      STA BCD
      LDA BCD+1   ; propagating any carry
      ADC BCD+1
      STA BCD+1
      DEX      ; And repeat for next bit
      BNE CNVBIT
      CLD      ; Back to binary
      rts

      
      org $0600
bin      dta 0
bcd      dta 0,0

ascii   dta c"+00",0            ;holds 2 digits in ascii and the sign

   
   run init