print in assembler - ich verzweifle

1, 2

print in assembler - ich verzweifle

von Heaven_tqa » So 6. Aug 2006, 16:16
in meinem (zukünftigen) diablo lookalike... funktioniert die verdammte print routine nicht wie ich es mir vorgestellt habe. was mache ich falsch?

Code: Alles auswählen
;***** system
dlistv   equ 560
nmien   equ $d40e
random   equ 53770
stick0   equ 632
strig0   equ $d010
dliv   equ 512
scrv   equ 88
cursorx   equ 85   ;86
cursory   equ 84
cursoroff equ 755

ICCOM   equ $342 ;COMMAND BYTE (CONTROLS CIO OPERATIONS)
ICBAL   equ $344 ;BUFFER ADDRESS (LOW BYTE)
ICBAH    equ $345 ;BUFFER ADDRESS (HIGH BYTE)
ICBLL   equ $348 ;BUFFER LENGTH (LOW BYTE)
ICBLH   equ $349 ;BUFFER LENGTH (HIGH BYTE)
ICAX1   equ $34A ;AUXILIARY BYTE NO.1
ICAX2   equ $34B ;AUXILIARY BYTE NO.2
CIOV   equ $E456 ;CIO VECTOR


;print weapon into status line3
print_armor_weapon      
      lda #<statusbar3>statusbar3
      sta scrv+1
      lda #0
      sta cursorx
      sta cursorx+1
      sta cursory
      tax
;      ldx pl_ac_id
      lda item_normal_texttabl,x
      ldy item_normal_texttabh,x
      tax
      jsr print
      
      lda #20
      sta cursorx
      lda #0
      sta cursory
      sta cursorx+1
;      lda 53770
;      and #7
;      tax
      ldx pl_weapon_id
      lda item_normal_texttabl,x
      ldy item_normal_texttabh,x
      tax
print   stx icbal
      sty icbah      
      lda   #9             ;put record
      STA ICCOM
      lda #127
      sta ICBLL
      ldx #0            ;editor is ICB0
      stx icblh
      jmp CIOV


vielleicht bin ich einfach zu blöd...aber dies funktioniert nur einmal, wenn ich ein zweites mal printen will wird kein bzw. der text irgendwo ausgegeben, aber nicht in meiner statusleiste...

hat irgendjemand nur ansatzweise eine idee was ich falsch mache?

von Heaven_tqa » So 6. Aug 2006, 16:18
Code: Alles auswählen
lda #<statusbar3>statusbar3
sta scrv+1

von Heaven_tqa » So 6. Aug 2006, 16:19
komisch... dann halt ohne formatierung

lda #<statusbar3>statusbar3
sta scrv+1

von Heaven_tqa » So 6. Aug 2006, 16:21
was ist denn das für ein dreck...

lda #statusline3
sta scrv
lda #statusline/256
sta scrv+1

friss es endlich... ;)

von Heaven_tqa » So 6. Aug 2006, 19:04
jetzt wirds immer lustiger... ich habe jetzt meine eigene print replace routine geschrieben und die liefert das gleiche ergebnis, der 2. text wird nicht ausgegeben... warum auch immer... zeropage variablen habe ich auch schon umhergeschoben, daran scheint es nicht zu liegen.

was mache ich falsch?

Code: Alles auswählen
;print weapon into status line3
print_armor_weapon      
      lda #<statusbar3>statusbar3
      sta scrv+1
      ldx pl_ac_id
      jsr print
      
      lda #20
      clc
      adc scrv
      sta scrv
      lda scrv+1
      adc #0
      sta scrv+1
      ldx pl_weapon_id
      lda 53770
      and #7
      tax
print   lda item_normal_texttabl,x
      sta textad
      lda item_normal_texttabh,x
      sta textad+1

      ldy #0
print2   lda (textad),y
      cmp #$9b
      beq printend
;      ora 53770
      sta (scrv),y
      iny
      bne print2
printend rts


seit 2 wochen docktere ich daran rumm...

von Schmutzpuppe » So 6. Aug 2006, 23:15
Ich kenne mich mit XASM leider nicht aus, was bedeutet denn lda #<statusbar3>statusbar3 ?
Und das verstehe ich nicht:
Code: Alles auswählen
      ldx pl_weapon_id
      lda 53770
      and #7
      tax

Erst lädst du pl_weapon_id in das X Register um es dann wieder mit tax zu überschreiben ohne das X Register verwendet zu haben?
Wird der erste Text denn an mehreren Stellen ausgegeben oder nur einmal?
Wäre vielleicht hilftreich wenn du etwas mehr Code postet.
Z.B. wird vor dem ersten print nur in scrv+1 nicht aber in scrv geschrieben (hat aber vielleicht auch etwas mit dem XASM #<statusbar3>statusbar3 zu tun?).
Vielleicht wird es auch vorher initialisiert aber man sieht es hier nur nicht?

von Heaven_tqa » Mo 7. Aug 2006, 17:45
ne...das liegt nicht an XASM, sondern am Forum hier, dass diese Zeile falsch dargestellt wird...

in SCRV kommt eigentlich die Adresse im VRAM, ab wo der text ausgegeben werden soll, nichts weiter... ;)

von cas » Mo 7. Aug 2006, 19:17
Hier ist die Assembler Print Routine die ich immer benutze (aus dem Atari Technik Handbuch)

Code: Alles auswählen
03790 ------------------------------
03800 ; PRINT INLINE STRING
03810 ; END MARKER '@'
03820 ;
03830 PRINT    PLA         get Return address
03840          STA $D0     from Stack
03850          PLA         and store
03860          STA $D1     as pointer
03870 ;
03880 INCP     INC $D0     increase
03890          BNE .1      pointer
03900          INC $D1
03910 .1       LDX #0      read Char from RAM
03920          LDA ($D0,X)
03930          CMP #'@     End?
03940          BEQ ENDPR   yes==>
03950          JSR PUTCHAR Print Char
03960          JMP INCP    back to loop
03970 ;
03980 ENDPR    LDA $D1     store pointer
03990          PHA         as new
04000          LDA $D0     return address
04010          PHA         on stack
04020          RTS         continue pgm
04030 ;            after text
04040 ------------------------------
04050 PUTCHAR  TAX         Print char
04060          LDA $E407   with OS
04070          PHA         Routine
04080          LDA $E406
04090          PHA
04100          TXA
04110          RTS         JUMP
04120 ------------------------------
04130 CR       LDA #$9B
04140          JMP PUTCHAR
04150 ------------------------------
04160 WAITDEVICE
04170          JSR PRINT
04180          .HX 9B
04190          .AS "ATARI USB HID DRIVER"
04200          .HX 9B
04210          .AS "Version 2.0 / GNU License"
04220          .HX 9B
04230          .AS "(c) 2004 ABBUC e.V."
04240          .HX 9B
04250          .AS "H. Reminder, T. Grasel, C. Strotmann"
04260          .HX 9B9B40
04270          JSR PRINTDEVICE
04280          JSR CR
04290          JSR PRINTVERSION
04300          JSR CR
04310          JSR PRINTCOPY
04320          JSR CR
04330          JSR CR
04350          JSR PRINT
04360          .AS "WAIT FOR DEVICE, [START] TO SKIP..."
04370          .HX 9B40

von Schmutzpuppe » Mo 7. Aug 2006, 19:25
Heaven_tqa hat geschrieben:ne...das liegt nicht an XASM, sondern am Forum hier, dass diese Zeile falsch dargestellt wird...

in SCRV kommt eigentlich die Adresse im VRAM, ab wo der text ausgegeben werden soll, nichts weiter... ;)

Jo, hast es ja weiter oben auch geschrieben, habe ich nicht gesehen.
Komische Sache das er das nicht darstellt.
Das einzige was mir einfällt ist das textad/textad+1 auf auf den falschen Speicherbereich zeigt und der 0, also kein Zeichen, enthält oder scrv/scrv+1 weisst auf einen Speicherbereich ausserhalb des Darstellungsbereichs.

von Heaven_tqa » Mo 7. Aug 2006, 22:09
also in meinem Atari Technik Handbuch vom Abbuc steht kein Source Code da für die Printroutine... ;) da hatte ich gleich geschaut...

danke, dass du den source abgedruckt hast.... mal schauen, trotzallem scheint mir das nicht gerade sehr performant zu sein, aber interessant finde ich, die nicht beschränkte textlänge, so kann ich dann wie bei diablo in theorie einen komplette text seite ausgeben und muss dann nur die variablen entsprechend mitausgeben... wie ich es auch jetzt schon mache.

von Heaven_tqa » Mo 7. Aug 2006, 22:25
was bringt eigentlich dieses unorthodoxe

ldx #0
lda ($d0,x)

hat das vorteile gegenüber

ldy #0
lda ($d0),y

?

von Heaven_tqa » Mo 7. Aug 2006, 23:54
also... es geht ums verrecken nicht... irgendwas im spiel verhindert oder irritiert die printroutine, egal ob OS bzw. meine eigene...

ich bin doch nicht blöd...finde aber den fehler nicht...

wenn ihr mir helfen wollt findet ihr alle files zum assemblieren hier:

http://www.atariage.com/forums/index.ph ... opic=91750

danke!

von Schmutzpuppe » Di 8. Aug 2006, 00:00
Heaven_tqa hat geschrieben:was bringt eigentlich dieses unorthodoxe

ldx #0
lda ($d0,x)

hat das vorteile gegenüber

ldy #0
lda ($d0),y

?

Die bearbeitungs Reihenfolge ist eine andere.
Beim ersten wird erst indiziert und dann der indirekte Wert gelesen, beim zweiten ist es anders herum.
D.h. das z.B. lda ($f0,x) mit x=2 nicht indirekt aus $f0/$f1 gelesen wird sondern aus $f2/$f3.
Hast du den Fehler jetzt gefunden?

von Schmutzpuppe » Di 8. Aug 2006, 01:16
Ich habe mir den Source mal angeschaut und die neue Printroutine durch deine alte ersetzt.
Im Grunde hat dann alles gut funktioniert nachdem ich
Code: Alles auswählen
lda #20   
clc       
adc scrv 
sta scrv 
lda scrv+1
adc #0   
sta scrv+1

rausgenommen habe weil dadurch der Text ausserhalb des Textbereichs geschrieben wurde.
Ich habe ein paar Schwerter eingesammelt und hatte immer einen anderen Text.

von Heaven_tqa » Di 8. Aug 2006, 07:37
??? das soll es gewesen sein?

aber an dem code ist doch nichts falsch... ich verschiebe einfach den start des bildschirms um 20 zeichen, d.h. in die mitte der zeile....

von Heaven_tqa » Di 8. Aug 2006, 07:39
was meinst du mit meiner "alten" ersetzt? kannst du einfach die jetzt funktionierende subroutine hier reinkopieren? d.h. die print_armor_weapon?

danke!

von cas » Di 8. Aug 2006, 09:05
Heaven_tqa hat geschrieben:also in meinem Atari Technik Handbuch vom Abbuc steht kein Source Code da für die Printroutine... ;) da hatte ich gleich geschaut...


Die Routine wird in Kapitel 5.1 erklärt, der komplette Quellcode ist auf der zum Buch gehörenden Diskette.

von Schmutzpuppe » Di 8. Aug 2006, 10:36
Heaven_tqa hat geschrieben:??? das soll es gewesen sein?

aber an dem code ist doch nichts falsch... ich verschiebe einfach den start des bildschirms um 20 zeichen, d.h. in die mitte der zeile....

Stimmt, sehe ich ebenso aber schau mal hier:
Code: Alles auswählen
 13  20 4923 LDA #$14              ; 2cyc ; A=9b S=f5 X=04 Y=06 P=--*BD-ZC
 13  22 4925 CLC                   ; 2cyc ; A=14 S=f5 X=04 Y=06 P=--*BD--C
 13  24 4926 ADC $C4               ; 3cyc ; A=14 S=f5 X=04 Y=06 P=--*BD---
 13  27 4928 STA $C4               ; 3cyc ; A=69 S=f5 X=04 Y=06 P=--*BD--C
 13  31 492A LDA $C5               ; 3cyc ; A=69 S=f5 X=04 Y=06 P=--*BD--C
 13  35 492C ADC #$00              ; 2cyc ; A=4a S=f5 X=04 Y=06 P=--*BD--C
 13  38 492E STA $C5               ; 3cyc ; A=51 S=f5 X=04 Y=06 P=--*BD---

Das ist der Debug Code aus dem Emu.
Nach meinem Verständnis müsste nach dem adc #$00 eigentlich $4b in $c5 gschrieben werden, das ist aber nicht der Fall.
Gestern war ich zu müde um eine Erklärung zu finden und jetzt muss ich ("leider") arbeiten.
Eventuell übersehe ich aber auch etwas ganz Offensichtliches!?

von cas » Di 8. Aug 2006, 11:16
Schmutzpuppe hat geschrieben:
Heaven_tqa hat geschrieben:??? das soll es gewesen sein?

aber an dem code ist doch nichts falsch... ich verschiebe einfach den start des bildschirms um 20 zeichen, d.h. in die mitte der zeile....

Stimmt, sehe ich ebenso aber schau mal hier:
Code: Alles auswählen
 13  20 4923 LDA #$14              ; 2cyc ; A=9b S=f5 X=04 Y=06 P=--*BD-ZC
 13  22 4925 CLC                   ; 2cyc ; A=14 S=f5 X=04 Y=06 P=--*BD--C
 13  24 4926 ADC $C4               ; 3cyc ; A=14 S=f5 X=04 Y=06 P=--*BD---
 13  27 4928 STA $C4               ; 3cyc ; A=69 S=f5 X=04 Y=06 P=--*BD--C
 13  31 492A LDA $C5               ; 3cyc ; A=69 S=f5 X=04 Y=06 P=--*BD--C
 13  35 492C ADC #$00              ; 2cyc ; A=4a S=f5 X=04 Y=06 P=--*BD--C
 13  38 492E STA $C5               ; 3cyc ; A=51 S=f5 X=04 Y=06 P=--*BD---

Das ist der Debug Code aus dem Emu.
Nach meinem Verständnis müsste nach dem adc #$00 eigentlich $4b in $c5 gschrieben werden, das ist aber nicht der Fall.
Gestern war ich zu müde um eine Erklärung zu finden und jetzt muss ich ("leider") arbeiten.
Eventuell übersehe ich aber auch etwas ganz Offensichtliches!?


Ich sehe auch keinen Fehler, aber vielleicht funkioniert es so:

Code: Alles auswählen
LDA #$14
CLC
ADC $C4
STA $C4
BCC .1
INC $C5
.1 ...


(spart auch ein paar Bytes und Takte ... )

von Schmutzpuppe » Di 8. Aug 2006, 11:40
cas hat geschrieben:
Ich sehe auch keinen Fehler, aber vielleicht funkioniert es so:

Code: Alles auswählen
LDA #$14
CLC
ADC $C4
STA $C4
BCC .1
INC $C5
.1 ...


(spart auch ein paar Bytes und Takte ... )

Sofern man das Carry nach der Operation nicht benötigt (wie hier) ist das in der Tat auch mal eine elegante Variante.
Habe ich bisher noch nicht gesehen.
Trotzdem ist es mir schleierhaft wie er von $4a auf $51 kommt...
1, 2