PASM Hilfe bei Text-Tile-Berechnung

Dein Hive sagt kein Pieps mehr? Du hörst kein Heartbeat-Ton? Hier findest Du Hilfe.
ShiaPrime
Beiträge: 54
Registriert: Do 15. Okt 2015, 23:03
Wohnort: Bremen

PASM Hilfe bei Text-Tile-Berechnung

Beitrag von ShiaPrime »

Liebe Drohnen,

momentan beschäftige ich mich etwas mit PASM um es zu lernen. Ich versuche ein Zeichen in der oberen linken Ecke auszugeben, allerdings habe ich wohl einen gewaltigen Logikfehler in der Berechnung. Irgendwie habe ich gerade keine Ahnung wo der Fehler liegt.

Hier mal mein fehlerhafter Code:

Code: Alles auswählen

DAT

                        org     0

entry
                        mov     ptr,    PAR             'pointer
                        mov     c,      #$21            'zeichen setzen
                        mov     color,  #0              'farbwert setzen

                        mov     reg_a,  color           'spin:   k := color << 1 + c & 1
                        shl     reg_a,  #1              '
                        mov     reg_b,  c               '
                        and     reg_b,  #1              '
                        mov     k,      reg_b           '
                        add     k,      reg_a           '

                        mov     i,      #0              'spin:   i := $8000 + (c & $FE) << 6 + k
                        and     c,      #$FE            '
                        shl     c,      #6              '
                        add     i,      c               '
                        add     i,      k               '
                        shl     i,      #8              '


                        wrword  i,      ptr
                        or      i,      #$40
                        add     ptr,    #$40*2
                        wrword  i,  ptr

loop
                        jmp     #loop
ptr     res   1
k       res   1
i       res   1
reg_a   res   1
reg_b   res   1
c       res   1
color   res   1
Der Code gibt es was in der Ecke aus, ist aber eher "Murks". Würde mich über eine kleine Hilfe freuen, da ich pasm-technisch noch sehr unerfahren bin.

Viele Grüße und schöne Ostertage,

Eric
drohne420
Benutzeravatar
PIC18F2550
Beiträge: 2831
Registriert: Fr 30. Sep 2011, 13:08

Re: PASM Hilfe bei Text-Tile-Berechnung

Beitrag von PIC18F2550 »

Der rest vom Code würde helfen.
Ich vermute mal.

du wilst ein ascii zeichen ausgeben.

also zeichen umwandeln in zeichensatz code und diesen in viedeospeicher schreiben.
Gruß
PIC18F2550

drone265/278
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
ShiaPrime
Beiträge: 54
Registriert: Do 15. Okt 2015, 23:03
Wohnort: Bremen

Re: PASM Hilfe bei Text-Tile-Berechnung

Beitrag von ShiaPrime »

Genau so ist es. Der Rest des Codes ist der übliche Spincode mit dem VGA-Treiber...

Code: Alles auswählen

CON

_CLKMODE        = XTAL1 + PLL16X
_XINFREQ        = 5_000_000

OBJ

  vga     : "vga-treiber"

VAR

  long  array[tiles/2]

PUB main

  vga.start(8, @array, @vgacolors, 0, 0, 0)
  coginit(cogid, @entry, @array)
Sowie den obligatorischen DAT-Bereich mit den Farbwerten.
Mit anderen Worten: ich starte eine Cog und übergebe die Adresse des Arrays als Parameter. Nun soll dort ein Zeichen z.B. "A" in die Speicherstelle im hRAM geschrieben werden und somit ausgegeben werden. Meine Schwierigkeit besteht momentan in der korrekten Codierung des Zeichens inkl. Farbwert. Da habe ich sicher einen Berechnungsfehler im Code.
drohne420
Benutzeravatar
PIC18F2550
Beiträge: 2831
Registriert: Fr 30. Sep 2011, 13:08

Re: PASM Hilfe bei Text-Tile-Berechnung

Beitrag von PIC18F2550 »

ich vermisse den djnz befehl.
Gruß
PIC18F2550

drone265/278
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
ShiaPrime
Beiträge: 54
Registriert: Do 15. Okt 2015, 23:03
Wohnort: Bremen

Re: PASM Hilfe bei Text-Tile-Berechnung

Beitrag von ShiaPrime »

Momentan möchte ich nur ein Zeichen ausgeben und keinen ganzen String. Dann benötige ich doch keine Schleife, oder? Wie gesagt: Es sind meine ersten PASM-Gehversuche.
drohne420
Benutzeravatar
PIC18F2550
Beiträge: 2831
Registriert: Fr 30. Sep 2011, 13:08

Re: PASM Hilfe bei Text-Tile-Berechnung

Beitrag von PIC18F2550 »

du musst das zeichen in die zeichsatzcodiierung übersetzen.
diese bytes musst du dan an die entsprechenden stellen im videoram schreiben.

aber welchen vga treiber verwendest du?
Gruß
PIC18F2550

drone265/278
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
ShiaPrime
Beiträge: 54
Registriert: Do 15. Okt 2015, 23:03
Wohnort: Bremen

Re: PASM Hilfe bei Text-Tile-Berechnung

Beitrag von ShiaPrime »

Es ist der "VGA 1024x768 Tile Driver v0.9"-Treiber von Chip Gracey.
du musst das zeichen in die zeichsatzcodiierung übersetzen.
Genau da liegt der Hund begraben.
drohne420
Benutzeravatar
kuroneko
Beiträge: 202
Registriert: Sa 22. Okt 2011, 13:05
Wohnort: FN, Germany

Re: PASM Hilfe bei Text-Tile-Berechnung

Beitrag von kuroneko »

ShiaPrime hat geschrieben:

Code: Alles auswählen

DAT
                        mov     i,      #0              'spin:   i := $8000 + (c & $FE) << 6 + k
                        and     c,      #$FE            '
                        shl     c,      #6              '
                        add     i,      c               '
                        add     i,      k               '
                        shl     i,      #8              '
Was hier fehlt ist die $8000 (ROM font base) and irgendwie erschliesst sich mir das shl i, #8 nicht ganz. Untested:

Code: Alles auswählen

        shr     c, #1 wc
        rcl     color, #1              ' color << 1 + c & 1

        mov     i, #$100               ' $0100
        or      i, c                   ' $0100 + (c & $FE) >> 1
        shl     i, #7                  ' $8000 + (c & $FE) << 6
        add     i, color               ' $8000 + (c & $FE) << 6 + k
ShiaPrime
Beiträge: 54
Registriert: Do 15. Okt 2015, 23:03
Wohnort: Bremen

Re: PASM Hilfe bei Text-Tile-Berechnung

Beitrag von ShiaPrime »

Super. Mit dem Code läuft es. Vielen Dank für die Hilfe.
drohne420
ShiaPrime
Beiträge: 54
Registriert: Do 15. Okt 2015, 23:03
Wohnort: Bremen

Re: PASM Hilfe bei Text-Tile-Berechnung

Beitrag von ShiaPrime »

Liebe Drohnen,

leider habe ich ein kleines Problem mit der Berechnung des Zeilenumbruchs. Hier erstmal der Code:

Code: Alles auswählen

DAT

                        org     0

entry
                        mov     PTR,    PAR             'pointer auf hRAM
                        mov     dira,   DINP            'bus auf eingabe schalten

                        mov     color,  #2              'farbwert setzen
                        mov     col,    #1              'col setzen
                        mov     row,    #1              'row setzen

:next                   call    #get                    'wert einlesen
                        tjnz    in, #:l1                'wert>0?
                        jmp     #:next                  'rücksprung
:l1                     call    #pchar
                        jmp     #:next


loop
                        jmp     #loop

' ---------------------------------------------------------------------
' screen-routinen
' ---------------------------------------------------------------------

pchar                   'schreibt zeichen an aktuelle position zählt position weiter
                        call    #schar
                        add     col,    #1
                        test    col,    #$40    wc
              if_c      call    #cr
pchar_ret               ret



schar                   'schreibt zeichen an aktuelle position ohne cursorposition zu verändern
                        mov     REG_A,  in
                        mov     REG_B,  color
                        shr     REG_A,  #1      wc
                        rcl     REG_B,  #1              'color << 1 + c & 1

                        mov     REG_D,  #$100           '$0100
                        or      REG_D,  REG_A           '$0100 + (c & $FE) >> 1
                        shl     REG_D,  #7              '$8000 + (c & $FE) << 6
                        add     REG_D,  REG_B           '$8000 + (c & $FE) << 6 + k

                        mov     REG_B,  col
                        sub     REG_B,  #1
                        shl     REG_B,  #1
                        mov     REG_C,  row
                        sub     REG_C,  #1
                        shl     REG_C,  #1

                        add     REG_B,  PTR

                        tjz     REG_C,  #:l2
:l1                     add     REG_B,  #$40*2
                        djnz    REG_C,  #:l1

:l2                     wrword  REG_D,  REG_B
                        or      REG_D,  #$40
                        add     REG_B,  #$40*2
                        wrword  REG_D,  REG_B
schar_ret               ret



cr
                        mov     col,    #1
                        add     row,    #1
cr_ret                  ret
Das Problem ist, dass die 64. Spalte nicht beschrieben, sondern der Zeilenumbruch nach der 63. Spalte erfolgt. Dieses sollte jedoch mit dem Befehl

Code: Alles auswählen

test    col,    #$41    wc
in der pchar-Routine nicht passieren. Allerdings erhalte ich durch diese Veränderung eine sehr merkwürdige Screen-Ausgabe. Es werden lediglich zwei Zeichen pro Zeile (1. und 2. Spalte) dargestellt und es erfolgt sofort ein Zeilenumbruch. Leider finde ich den Fehler in der Berechnung nicht. Vielleicht hat jemand von euch eine Idee.

Gruß,

Eric
drohne420
Antworten