print in assembler - ich verzweifle
1,
2print 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