Fahrt 002

weitersagen ...
Tweet about this on TwitterShare on FacebookShare on Google+Share on LinkedIn

C64 StudioEin eigener Zeichensatz

Bisher haben wir unsere ‚Grafiken‚ mit Hilfe des Standardzeichensatzes erstellt. Nun wollen wir aber eine etwas detailliertere und farbenfrohere Anzeige, dazu gäbe es zum einen natürlich die Möglichkeit mit Bitmaps zu arbeiten. Da diese aber sehr viel Speicher benötigen und für ein ‘schnelles‚ Spiel zu langsam sind, wollen wir diesmal einen eigenen Zeichsatz verwenden.
Falls ihr euch für BITMAPs interessiert, könnt ihr ja mal einen Blick auf ‚VIC-II: Grafikmodes – BITMAP (Hi-Res)‚ oder ‚VIC-II: Grafikmodes – BITMAP (Multi-Color)‚ werfen.

Benutzt als Basis bitte den Dowload aus ‚Fahrt 001‚.

 

Für unser Spiel, schaut euch bitte vorher ‚VIC-II: Eigener Zeichensatz‚ an!

 

Wir werden einen Multi-Color-Zeichensatz verwenden und beginnen damit unsere Fahrtstrecke zu entwickeln. Dafür benötigen zunächst mal einen etwas unregelmäßtigen Untergrund. Dazu starten wir den Zeichsatz-Editor. Hier ist es nun eigentlich egal, welchen Editor ihr verwendet. Als Erstes bietet sich der aus dem hier verwendeten C64-Studio an (den benutzen wir auch gleich), aber man kann auch den Editor vom CBM prg Studio oder einen anderen nehmen. Wichtig ist nur, dass wir die Daten später als Binär-Datei speichern können, um diese in unser Programm einzubinden. Dabei kann es evtl. notwendig sein die binären Daten mit angepassten Funktionen zu verarbeiten.

Um jetzt einen eigenen Zeichensatz mit dem C64 Studio zu erzeugen, klickt am besten mit der rechten Maustaste im ‚Solution Explorer‚ auf den ersten Eintrag (den Projektnamen) und hangelt euch dann durch die Menüs: Add -> New -> Character Set.

Zeichensatz hinzufügen
Zeichensatz hinzufügen

Gebt anschließend im sich öffnenden Dialog den Namen für den Zeichensatz ein (ich nehme rover.charsetproject). Als Belohnung erhaltet ihr einen leeren Zeichensatz.

Der Zeichnsatzeditor
Der Zeichnsatzeditor

Wir könnten jetzt natürlich von null anfangen, aber lasst uns doch den Standardzeichensatz als Basis nehmen. Wechselt dazu im Zeichensatzeditor zum Tab Project und klickt dort, auf der rechten Seite unter Import, auf den Button Default Uppercase.

Standard-Zeichensatz laden...
Erst den Standard-Zeichensatz laden…

Kehrt ihr dann zum ersten Tab Character zurück, dann seht ihr den uns bekannten C64-Zeichensatz.

Der Standard-Zeichensatz des C64.
… und schon können wir den Standard-Zeichensatz des C64 bearbeiten.

Um möglichst einfach auf Buchstaben, Zahlen und Satzzeichen zugreifen zu können schlage ich vor, wir belassen die vorhandenen Zeichen bis zum  ? an ihrer angestammten Position und verwenden den Rest für unsere eigenen Grafikzeichen. Natürlich können wir das Aussehen der Buchstaben usw. ändern, nur sollten die Zeichen weiter an der bisherigen Stelle bleiben. Ihr könnt Buchstaben und Zahlen durchaus beliebig im Zeichensatz platzieren, müsst dann aber darauf achten, dass ihr die Zeichen im Assembler bei Verwendung von !TEXT auf die richtigen Positionen im Zeichsatz ‚mappt‚. Dazu dient beim C64-Studio bekanntlich !CONVTAB. Wir sparen uns diese Arbeit, wie eben erwähnt, aber.

Ich habe nun erstmal alle überflüssigen Zeichen gelöscht, den Multicolor-Modus aktiviert und die Farben voreingestellt. Da wir nur einen sehr einfachen Zeichsatz verwenden und die Farben später im Programm setzen, ist es hier nicht wirklich wichtig, welche ihr im Editor benutzt.

Grundeinstellungen
Grundeinstellungen

Der rot markierte Haken wirkt sich nur aufs aktuelle Zeichen aus. Damit ihr diesen nicht laufend neu setzen müsst, könnt ihr mit dem ganz unten zu findenen Button Force Multicolor alle Zeichen umschalten.

Entwickelt nun einfach einige Bauteile für die Fahrtstrecke. Diese sollten sich später zu einer längeren Strecke zusammenbauen lassen.

Macht euch nicht zuviel Mühe: Wir wollen hier erstmal nur ein Beispiel erstellen.

Die ersten Bauteile
Die ersten Bauteile

Sobald ihr mit eurer Arbeit zufrieden seid, speichert diese über den oben zusehenden Menüpunkt.

Leider bietet das C64-Studio bisher keine Möglichkeit den Zeichensatz direkt ins Programm einzubinden. Wir müssen diesen dafür extra in eine Binär-Datei exportieren.

Zeichsatz exportieren.
Zeichsatz exportieren.

Wechselt dazu zum Tab Project, klickt unter  Export auf  To File... und speichert die Datei im Projekt-Verzeichnis unter einem beliebigen Dateinamen (hier  rover.chr).

Nun wollen wir den Zeichsatz laden und eine Testausgabe vornehmen. Dazu ergänzen wir den vorhandenen Source rover.asm erstmal. Ich habe im letzten Beitrag eine Kleinigkeit vergessen! Wir wollten doch das BASIC-ROM ausblenden. Also müssen dies bei  main (am besten direkt vor dem  CLI) noch machen. Ergänzt das Programm um die folgenden drei Zeilen.

Falls ihr vergessen habt, was es mit der Speicherstelle  $01 auf sich hat, werft doch nochmal einen Blick in die ‚Kleine Hardwarekunde‚.

Jetzt machen wir hinter dem CLI und direkt vor der Endlosschleife JMP * weiter. Wir müssen den Multi-Color-Modus aktivieren und unsere Farben setzen.

Hier gibt es wohl keine Probleme.

Als vorläufig Letztes fügen wir noch den Aufruf für eine Funktion, die den Zeichensatz kopiert, hinzu.

Den Zeichensatz binden wir ganz unten ins Projekt ein. Aus Spaß fügen wir zwei Label hinzu, über die wir die Größe des Zeichensatzes berechnen.

Ihr müsst hier natürlich statt rover.chr ggf. den von euch verwendeten Namen für den Export des Zeichensatzes nehmen. Wir richten die Daten an einer Pagegrenze aus, damit unsere Kopierfunktion, wie geplant funktioniert und gleichzeitig aus Geschwindigkeitsgründen (die hier aber eigentlich zu vernachlässigen sind).

Wir kopieren hier aus Bequemlichkeit immer 256-BYTEs am Stück (dies ist auch der Grund, weshalb wir die Daten eben auf die Pagegrenze ausgerichtet haben). Selbst wenn wir nur einen 1BYTE großen Zeichensatz hätten, werden also 256-BYTEs kopiert. Wir legen im X-Register die Anzahl der 256-BYTE-Seiten ab. Diese berechnen wir einfach durch die Formel (charsetend-charsetstart)/256+1. Den Rest erledigt ein sich selbstverändernder Kopier-Block.

Startet ihr das Programm jetzt, dann hat sich die Anzeige geringfügig verändert.

Multi-Color & unser Zeichsatz.
Multi-Color & unser Zeichensatz.

Jetzt wollen wir den Bildschirm löschen, dazu fügen wir hinter jsr copycharset den Aufruf für unsere Löschroutine hinzu.

Die dazugehörige Funktion ist auch wieder sehr einfach:

Nun ist der Bildschirm zwar ‘sauber‚ aber auch langweilig. Wir wollen daher abschließend noch eine kleine Testausgabe einbauen. Dazu legen wir uns erstmal einige Steckendaten an, die wir direkt vor dem Zeichsatz einfügen.

Hier verwenden wir einfach die eben entworfenen Zeichen, um eine drei Zeilen hohe Fahrbahn zu erstellen. Macht euch auch hier nicht zuviel Arbeit, dies ist nur ein Beispiel. Das Ende der Daten kennzeichnen wir mit einer 0.

Jetzt brauchen wir natürlich noch eine Funktion, um die demoroad auf den Bildschirm zu bringen. Da auch dies nur ein kurzer Versuch ist, reicht diese Routine.

Auch hier seht ihr wieder die Vorteile, die die erweiterten Rechenmöglichkeiten des C64-Studios gegenüber dem CBM prg Studio bieten. Wir können so recht einfach unsere Ausgabe am unteren Bildschirm vornehmen. Das Kopieren sollte auch wieder selbsterklärend sein.

Jetzt noch vor JMP * den Aufruf der Testausgabe vornehmen

und schon ist das Programm startbereit.

So kann es mal aussehen.
So kann es mal aussehen.

Dies soll erstmal reichen. Wir haben hier die Grundlagen für den nächsten Schritt erarbeitet. Beim nächsten Mal legen wir endgültig unsere Strukturen fest und werden die Fahrtstrecke ‚zufällig‚ erstellen. Direkt starten könnt ihr das Programm wie gewohnt mit dem Java-Emulator (auch wenn es wenig zu sehen gibt). Außerdem gibt es wieder alles als


Schrott!!Naja...Geht so...Ganz gut...SUPER! (2 Bewertungen | Ø 5,00 von 5 | 100,00%)

Loading...


 

<<< zurück | weiter >>>

 

weitersagen ...
Tweet about this on TwitterShare on FacebookShare on Google+Share on LinkedIn

3 Gedanken zu „Fahrt 002“

  1. Multicolor
    Erst die .CHR-Datei laden und mit gedrückter Shift-Taste im Zeichensatzfenster alles per Cursortasten auswählen.
    Dann markiert man im Char-Editor „Force Multicolor“ und „Mode: Multicolor“.
    Als Char-Col. in der ComboBox wählt man eine Farbe >8 z.B. Hellgrün/Grün.
    Der Schwarz-Weiss-Zeichensatz ist nun wieder Multicol. wie beim Speichern.

  2. c64Studio 5.1
    Bei mir gibt es keine Multicolor-Checkbox und beim BigPaste wird nur 1 Zeichen auf Multicolor gesetzt. Wie kann man alle übrigen Zeichen zu Multicolor umwandeln?
    Kann es noch eine Anleitung zum 320-Pixel $d010 Bit geben? Meine Lösung ist bisher folgende:
    ;*** Startadresse BASIC-Zeile
    *=$0801
    !BYTE $0B,$08,$DD,$07,$9E,$20,$32,$30,$36,$32,$00,$00,$00

    spriteadress = $07f8 ; 8 sprites from here
    sprite0x = $d000
    sprite0y = $d001

    spritex320 = $d010
    spriteactive = $d015
    spritemulticol= $d01c
    spritecount = $01

    main:
    jsr loadspritedata:

    loopmain:
    jsr setspriteposition:
    jsr movesprite:

    lda #$04
    sta screentextpos+1
    jsr processorstatusout:

    lda #$05
    sta screentextpos+1
    jsr xposout:

    jsr wait:
    jsr wait:
    jsr wait:
    jsr wait:
    jsr wait:
    jsr wait:

    jmp loopmain:

    loadspritedata:
    ldx #spritecount ; nr of sprites
    loopls:
    stx temp
    txa
    adc #$7f ; $80 (128) * 64 = $2000
    sta spriteadress
    lda spriteactive
    ora temp ; set this sprite active
    sta spriteactive
    lda spritemulticol
    ora temp
    sta spritemulticol
    dex
    bne loopls:

    lda #$00
    sta spritex320
    rts

    screentextpos
    !byte $00,$04

    binaryout:
    ldy #$08
    pha
    lda screentextpos
    sta $fb
    lda screentextpos+1
    sta $fc
    pla
    loopbin:
    lsr
    bcs one: ; is a 1 in carry?
    pha
    lda #"0"
    jmp weiter:
    one:
    pha
    lda #"1"
    weiter:
    sta ($fb),Y
    pla
    dey
    bne loopbin:
    rts

    processorstatusout:
    php ; push processor status
    pla
    jsr binaryout:
    rts

    xposout:
    lda sprite0xsum
    jsr binaryout:
    rts

    wait:
    lda $d012
    cmp #$ff
    bne wait:
    rts

    movesprite:
    lda sprite0xsum
    tax
    cmp #$17 ; is x position less than 23?
    bcs xgreaterthan0: ; greater so branch
    lda spritex320 ; load $d010
    and #%00000001
    cmp #$01
    beq xgreaterthan0: ; above 255 right of the screen? so branch
    lda #$01 ; left of 255 so change direction to right
    sta direction ; now to the right

    xgreaterthan0:
    cmp #$43 ; above 65
    bmi xless320: ; no so branch
    lda spritex320
    and #%000000001
    cmp #$01 ; right of 255?
    bne xless320: ; no so branch
    ; x > 320
    lda #$02 ; change direction to left again
    sta direction
    xless320:
    lda direction
    cmp #$01 ; to the right?
    bne leftms: ; no
    ; right
    txa
    adc xstep
    sta sprite0xsum ; increase position right
    cmp #254 ; greater than 254?
    bcc weiterms: ; no
    lda spritex320
    ora #$01
    sta spritex320 ; turn on 320px bit
    jmp weiterms:
    leftms:
    lda direction
    cmp #$02 ; to the left?
    bne stop:
    txa
    sbc xstep
    sta sprite0xsum ; decrease position left
    cmp #254 ; 255 again?
    bcc weiterms: ; no
    lda spritex320
    and #%11111110
    sta spritex320 ; turn off 320px bit
    jmp weiterms:
    stop:
    weiterms:

    rts

    setspriteposition:
    ldx #spritecount ; nr of sprites
    loopsp:
    lda sprite0xsum-1,X
    sta sprite0x ; store in register $d000 + X
    lda sprite0ysum-1,X
    sta sprite0y ; store in register $d000 + X
    dex
    bne loopsp:
    rts

    sprite0xsum
    !byte $40,$00
    sprite0ysum
    !byte $40,$00
    xstep
    !byte $01
    direction
    !byte $01

    temp
    !byte $00

    *=$2000
    ;spritedata
    !byte $a8,$08,$2a,$80,$00,$02,$80,$00,$02,$80,$00,$02,$c0,$0c,$03,$d5,$5d,$57,$c0,$0c,$03,$c0,$0c,$03,$00,$00,$00,$00,$00,$00,$8f,$c8,$f2,$00,$00,$00,$00,$00,$00,$c0,$0c,$03,$c0,$0c,$03,$d5,$5d,$57,$c0,$0c,$03,$80,$0c,$02,$80,$00,$02,$80,$00,$02,$aa,$08,$2a,$8f
    !byte $55,$55,$55,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$55,$55,$55,$81
    !byte $ff,$ff,$ff,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$01
    !byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$01

Schreibe einen Kommentar


Beachtet bitte, dass ich eure Kommentare erst manuell freigegeben muß, bevor sie auf der Seite erscheinen! Da ich nicht pausenlos am Rechner sitze, kann es schon mal etwas dauern, bis ein Kommentar für alle sichtbar ist.

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Protected by WP Anti Spam