Visualizzazione post con etichetta C64Debugger. Mostra tutti i post
Visualizzazione post con etichetta C64Debugger. Mostra tutti i post

giovedì 27 gennaio 2022

Visual Code Assembler C64

Qualche tempo fa avevo provato CBM Prg Studio ma aveva diverse limitazioni (la prima fra tutte girare solo su Windows)



Per una soluzione multi piattaforma si puo' usare Visual Studio con l'estensione Kick Assembler 8-bit Retro Studio, Kick Assembler, Vice e C64 Debugger

Una volta installata la estensione si devono impostare nei settaggi del plugin le path dei vari componenti

Su Debian ho avuto diversi problemi con C64Debugger...installando la versione binaria viene generato il seguente errore 


sudo ln -sf libxcb-util.so.0 libxcb-util.so.1

il problema e' che la libreria non e' disponibile in apt e fare un symlink semplicemente blocca X al riavvio successivo

Per installare C64debugger da sorgenti si devono seguire i passi seguenti


apt install upx-ucl

git clone git://git.code.sf.net/p/c64-debugger/code c64-debugger-code
cd MTEngine

modificare Makefile aggiungendo -fcommon alle CFlags

make

venerdì 13 luglio 2018

Mandelbrot (per pigri) modalita' grafica con CC65


Sono riuscito ad attivare la modalita' grafica su CC65. Compilando il codice ed usando gli esempi senza modifiche avevo sempre l'errore


Error #2 initialising graphics
Cannot load driver

quando cercavo di usare TGI. Grazie al suggerimento degli sviluppatore basta flaggare a zero

#  define DYN_DRV       1





e si usa il driver in modalita' statica. La prima prova e' andata bene ma non troppo....Su VICE in modalita' velocita' 100% ho impiegato 3659.9 secondi !!!!!! (quasi quasi ritorno a Simons Basic)...non capisco ....CC65 e' compilato mentre Simons Basic e' interpretato e non c'e' un guadagno sensibile e c'e' pure il trucco della integer math contro i float si Simons...gia' la integer math...se si prova a disegnare le bande di fuga si vede che queste vengono a cuspide mentre dovrebbero essere tondeggianti e cio' deriva dalla approssimazione apportata da matematica per interi


Poi capito su questo sito http://retro64.altervista.org/blog/the-mandelbrot-set-c64-assembly-program-to-draw-it-fast-using-integer-math-part-1/ con un esempio in Assembler che genera Mandelbrot in  12 minuti ....tempo per me di attaccare la tastiera al chiodo

cl65 -O -l man.lst -vm -m man -o man.prg -t c64 man.c

man.c
--------------------------------------------------

#include <stdlib.h>
#include <conio.h>
#include <cc65.h>
#include <tgi.h>


#define SCREEN_X        320
#define SCREEN_Y        200
#define MAXCOL          2


#define maxiterations   25
#define fpshift         (14)
#define tofp(_x)        ((_x)<<fpshift) // bitwise shift left
#define fromfp(_x)      ((_x)>>fpshift)
#define fpabs(_x)       (abs(_x))

#define mulfp(_a,_b)    ((((signed long)_a)*(_b))>>fpshift)
#define divfp(_a,_b)    ((((signed long)_a)<<fpshift)/(_b))


#pragma static-locals (1);



void mandelbrot (signed short x1, signed short y1, signed short x2,
                 signed short y2)
{
    // le variabili register sono quelle che il compilatore mette in pagina zero
    // e quindi quelle a piu' rapido accesso
    register unsigned char count;
    register signed short r, r1, i;
    register signed short xs, ys, xx, yy;
    register signed short x, y;

    /* Calc stepwidth */
    xs = ((x2 - x1) / (SCREEN_X));
    ys = ((y2 - y1) / (SCREEN_Y));

    yy = y1;
    for (y = 0; y < (SCREEN_Y); y++) {
        yy += ys;
        xx = x1;
        for (x = 0; x < (SCREEN_X); x++) {
            xx += xs;
            /* Do iterations */
            r = 0;
            i = 0;
            for (count = 0; (count < maxiterations) &&
                 (fpabs (r) < tofp (2)) && (fpabs (i) < tofp (2));
                 ++count) {
                r1 = (mulfp (r, r) - mulfp (i, i)) + xx;
                /* i = (mulfp(mulfp(r,i),tofp(2)))+yy; */
                i = (((signed long) r * i) >> (fpshift - 1)) + yy;
                r = r1;
            }
            if (count == maxiterations) {
                 tgi_setcolor (0);
            } else {
                 tgi_setcolor (count%2);
          }
            tgi_setpixel (x, y);
        }
    }
}


int main (void)
{
    tgi_install (tgi_static_stddrv);
    tgi_init ();
    tgi_clear ();
    
    mandelbrot (tofp (-2), tofp (-2), tofp (2), tofp (2));
    cgetc ();
    tgi_uninstall ();
    return 0;
}

mercoledì 11 luglio 2018

C64 Joystick Assembler

Esempio commentato di come leggere lo stato del joystick di un C64 per muovere un carattere sullo schermo




Da notare che per la scrittura a schermo vengono usate due tecniche. La prima, nel clear screen, prevede la scrittura diretta in memoria video (che si trova a partire da $0400 ed ha le dimensioni di 1Kb, 1000 bytes per una dimensione di 40x25 celle); nella soconda viene effettuata una chiamata diretta al KERNAL

Un metodo alternativo per ripulire la memoria video con ACME e' il comando
*=$0400
!fill 1000,$20

---------------------------------------------------------------------------------------------
!cpu 6502
!to "joy.prg",cbm

; per simulare  il joystick in C64 Debugger premere CTRL+Y 
; nella finestra C64 e premere i tasti freccia

JOY = $DC00

!macro stampa .carattere{
  JSR $E50C
  lda #.carattere
  JSR $FFD2
 
}

* = $c000
; pulisce lo schermo e lo mette nero con carattere blu
lda #$00
sta $d020
sta $d021
tax
lda #$20
loop
sta $0400,x
sta $0500,x
sta $0600,x
sta $0700,x
dex
bne loop


ldx #$14       ; lo schermo testo di C64 e' 40x25 caratteri
ldy #$0c      ; qui siamo piu' o meno al centro
+stampa 65

lda #$0 ; inizializza il valore della locazione 2 a zero
sta $02

start    lda $02        ; viene usata la locazione di memoria 2 della pagina zero 
; che non e' usata dal sistema operativa
         cmp JOY      ; in DC00 c'e' la porta del joystick 2 
          ; a seconda della bitmask si capisce se e' stato
          ; cliccato verso l'alto,basso,destra,sinistra o fire
          ; bit 0 attivato = alto
          ; bit 1 attivato = basso
          ; bit 2 attivato = sinistra
          ; bit 3 attivato = destra
          ; bit 4 attivato = fire
          ; per esempio il valore 17 (10001b) indica che il joystickhelpsys 
          ; e' in alto ed e' premuto il fire
         beq start      ; loop until the joystick register changes.

         lda JOY      ; salva lo stato del joystick nella locazione 2
         sta $02

         lda #000001 ; controlla se e'attivato il primo bit
         bit JOY      ; 
         bne cont1      ; se non e' attivato segue
         +stampa 32
         inx ; altrimenti incrementa X
         +stampa 65    ; e sposta il cursore con il KERNAL

cont1    lda #000010 ; continua con gli altri bit 
         bit JOY      ; joystick giu'
         bne cont2      ; 
         +stampa 32
         dex            ; 
         +stampa 65    ;

cont2    lda #000100 ; joystick a sinistra
         bit JOY      ; 
         bne cont3      ; 
         +stampa 32
         iny            ; incrementa il registro Y
         +stampa 65

cont3    lda #001000 ; joystick a destra 
         bit JOY      ; 
         bne cont4      ; 
         +stampa 32
         dey            ; 
         +stampa 65
         

cont4    lda #010000 ; fire 
         bit JOY      ; 
         bne start      ; esce se e' stato premuto Fire altrimenti torna all'inizio 
         rts            ; back to basic

Geologi

  E so anche espatriare senza praticamente toccare strada asfaltata