Autore Topic: Editor Di Disegno  (Letto 3298 volte)

Envil

  • Neo-iscritto
  • *
  • Post: 11
  • Gioco Preferito: Turrican II
Editor Di Disegno
« il: 18 Aprile 2007, 00:11:03 »
 Ciao a tutti. Mi sto cimentando nella realizzazione di un editor di disegno: per ora sono solo all'inizio, ci sono tante cose da aggiungere correggere e migliorare,pero' lo posto magari puo' aiutare  ;)

Lo terro' aggiornato.


source

Se avete domande sul sorgente e suggerimenti son qui. :martello:

ps. scusate l'hosting esterno del file.
                          ...Defending Metal Faith...

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Editor Di Disegno
« Risposta #1 il: 18 Aprile 2007, 01:37:17 »
 Davvero un buon inizio, come gia' ti ho anticipato in chat, devo farti sia i complimenti ma anche farti notare un errore grossolano.
La tua routine di fill, nell'intento di azzerare da $2000 a $3f3f, e' completamente sballata, e a lungo andare finirai per sovrascrivere anche il tuo stesso programma a $c000.
Codice: [Seleziona]
fills   lda #$20
        sta $03
        lda #$00
        sta $02
        tay
fills1  sta ($02),y
        iny
        bne fills1

        ldx $03; questo modo di incrementare e' un po'
        inx     ; arzigogolato :)
        stx $03
        cpx #$3f
        bne fills1; l'errore e' sicuramente qua

fills2  sta ($02),y
        iny
        cpy #$40
        bne fills2
        rts

sostituiscilo con un piu' semplice

Codice: [Seleziona]
fills   ldx #$20; sia hi byte di $2000 che contatore di pagine da azzerare.
        stx $03 ; $2000-3fff, non importa se azzeri anche dopo $3f3f
        ldy #$00
        sty $02
        tya
fills1  sta ($02),y
        iny
        bne fills1
        inc $03
        dex
        bne fills1
        rts

Stessa cosa dicasi per la fillc, basta una semplice scrittura diretta senza nemmeno disturbare la zp

Codice: [Seleziona]
fillc
        ldy #$00
        lda colors
fillc1
        sta $0400,y
        sta $0500,y
        sta $0600,y
        sta $0700,y; se non hai sprites non importa se sovrascrivi $07f8-07ff
        iny
        bne fillc1
        rts
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Envil

  • Neo-iscritto
  • *
  • Post: 11
  • Gioco Preferito: Turrican II
Editor Di Disegno
« Risposta #2 il: 18 Aprile 2007, 15:49:53 »
Allora, ho sostitutito la routine di fill del colore con questa:

Citazione
fillc   ldx #$00
   lda colors
fillc1   sta $400,x
   sta $4c8,x
   sta $590,x
   sta $658,x
   sta $720,x
   inx
   cpx #$c8
   bne fillc1
   rts

Arriva precisa ad azzerare da $400 a $7e7.
Conto di usare degli sprites, per cui ci tengo a non "oltrepassare".
Per quanto riguarda il fill da $2000 a $3f3f, sei sicuro che e' sbagliato?
A me funzia, azzera da $2000 a $3f3f preciso o forse non ho capito cosa intendevi dire..

comunque ho splittato il sorgente in 2, allego qui solo la parte del codice, i dati non li ho cambiati.
Ho notato un nuovo bug, prova a premere f1 2 volte veloce mentre disegni o tieni fermo il pennello, esce dal programma.Ora devo capire perche';)
« Ultima modifica: 21 Gennaio 2015, 22:45:03 da eregil »
                          ...Defending Metal Faith...

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Editor Di Disegno
« Risposta #3 il: 18 Aprile 2007, 21:15:04 »
 Si, di solito non mi metto a parlare a vanvera. :P
Dopo un po' di volte che si premeva F1, crashava.
Facendo m c000 ho visto che il programma era sparito.
Ho verificato da vice debugger con "watch store c000" che era quello il loop che sovrascriveva $c000, perche' $03 conteneva gia' piu' di $3f e quindi continuava ad essere incrementato.
E si, il tuo loop e' errato.
Se non ci credi metti anche tu un watch store $c000 e continua a premere F1.
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Envil

  • Neo-iscritto
  • *
  • Post: 11
  • Gioco Preferito: Turrican II
Editor Di Disegno
« Risposta #4 il: 20 Aprile 2007, 20:11:21 »
Rieccomi con il programma aggiornato;)
Ian coog, le macro per creare le tabelle di dati in dasm devo ancora vedermele bene, percui pensavo di usare il tuo codice che mi avevi dato, ma la tabella che genera e' differente (ho fatto la modifica che mi dicesti ma lo stesso).
Per cui ora allego il sorgente con il codice (bitmap2.asm) e linko anche il nuovo data.asm ancora "in chiaro".
Appena ho tempo mi creo la tabella con le macro del dasm.
Nel programma inserito la funzione che muove il pennello senza disegnare,e il ritorno al menu durante il disegno.
ho dovuto generalizzare tutta la routine, e' un po' piu' lenta ma non nei punti "critici", per cui non credo si noti.
Devo correggere il tempo di pressione del fire button che e' un po' scomodo e sballato.
E poi mi domandavo una cosa:

Codice: [Seleziona]
        sei ;disable irqs for stlable effetcs and setting interrupt vectors
jsr ciaswc;disable cias
lda #$00;I love BLACK
sta $d020
sta $d021
jsr blnkswc
jsr fillc;clear bitmap colors ($400-$7e7)
jsr fills;clear bitmap matrix
lda #%00110111;set char video at $c00 and lowercase
sta $d018
lda #$0c;inform kernal (for using routines) video segment
sta $288;putting mem pag of video segment into $288
jsr $e544; !!!!!!!!!!!!!!!!!!!!!!!!

ldx #$00;reset color parser
flash0 ldy #31 ;set count register
flash1 lda flash,x;flash effect
pha
rast0  lda $d011
bpl rast0;flickless
lda $d012
cmp #$20
bne rast0
pla
sta $d020
backf inx ;increment color parser
dey ;decrement counter
bne flash1
lda xcor;for repeat effect one more time
eor #$01;putting orig count value
sta xcor;for future use or restart
beq flashe;after repeat onetime quit flashing effect
lda #$ca;change inx to dex, for decrement parser
sta backf
jmp flash0
flashe lda #$e8;put original code (future restart?)
sta backf

 
jsr text0
jsr blnkswc
jsr loopcl
lda #<irq;set irq routine to start at custom memory location
sta $314
lda #>irq
sta $315
jsr chrbmp
jsr bmpswc
cli ;enable irqs


Codice: [Seleziona]
menu
        sei
jsr ciaswc
jsr chrbmp
jsr bmpswc
dec menuf
lda #$31
sta $314
lda #$ea
sta $315
cli
jsr loopcl
jsr chrbmp
jsr bmpswc
lda #<irq;set irq routine to start at custom memory location
sta $314
lda #>irq
sta $315
; cli
jmp loop

come mai (confrontanto i 2 pezzi di codice) le primo caso la routine loopcl fa la scansione della tastiera con un SEI precedentemente settato e nel secondo caso avendo il SEI settato ho bisogno del CLI (e quindi di reimpostare la main entry irq di default) perche la jsr $e544 contenuta nella loopcl abbia effetto?
Non so se mi sono spiegato in modo decente :huh:

data.asm
« Ultima modifica: 21 Gennaio 2015, 22:45:48 da eregil »
                          ...Defending Metal Faith...

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Editor Di Disegno
« Risposta #5 il: 20 Aprile 2007, 22:30:51 »
 le macro in chat te le avevo fatte un po' in fretta, non mi ero accorto che la ytabh incrementa di 2 anziche' di 1 ogni 4 righe da 8 byte.
si rimedia facilmente
Codice: [Seleziona]
ytabh
M SET 0
REPEAT 6
REPEAT 4

REPEAT 8
        byte M
REPEND

M SET M+1

REPEND
M SET M+1
REPEND
REPEAT 8
        byte M
REPEND
;------------------

ytabl
M SET 0
REPEAT 25
N SET 0
REPEAT 8
        byte M+N
N SET N+1
REPEND

M SET [M+64]&255

REPEND
;------------------

;ytabl
xtab0

M SET 0
REPEAT 32
REPEAT 8
        byte M
REPEND

M SET M+8

REPEND
;------------------
xtab1
M SET 0
REPEAT 8
REPEAT 8
        byte M
REPEND

M SET M+8

REPEND
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Envil

  • Neo-iscritto
  • *
  • Post: 11
  • Gioco Preferito: Turrican II
Editor Di Disegno
« Risposta #6 il: 23 Aprile 2007, 10:15:08 »
 il problema riguardo sei e cli che avevo esposto prima, credo di esserci arrivato e ne   sono rimasto un po' sconvolto:


*= $c000

sei
lda #sta $314
lda #>irq
sta $315
lda #$20
jsr $f1ca         ;o altre routine del kernal
 
jmp *

irq   inc $d020  
      jmp $ea31

senza il cli, ma chiamando una routine del kernal, va in irq e incrementa $d020.
Per cui mi chiedo, come posso in un programma, settare l'irq, e poi chiamarla quando dico io anche se nel frattempo uso per esempio un jsr $f1ca ?
Grazie.

 
                          ...Defending Metal Faith...

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Editor Di Disegno
« Risposta #7 il: 23 Aprile 2007, 20:53:18 »
 Se la routine di kernal chiamata fa una CLI da qualche parte ottieni questo effetto.
Guarda caso la jsr $f1ca fa sia una SEI che una CLI durante il percorso. Basta seguirla nel disassemblato (AAY64). Ergo, non usare routine di kernal finche' non sei sicuro che non vuoi che vengano riattivate le IRQ. Tra l'altro volevo farti notare che non setti $d011/d012 nel tuo irq handler. E' necessario per stabilire a quale linea vuoi che scatti l'IRQ.
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Envil

  • Neo-iscritto
  • *
  • Post: 11
  • Gioco Preferito: Turrican II
Editor Di Disegno
« Risposta #8 il: 23 Aprile 2007, 22:25:29 »
 ok grazie mille!
avevo visto i percorsi del $f1ca, ma si diramavano parecchio e mi son perso, non avendo incontrato delle cli. ci guardero' meglio.
avevo omesso il write raster for compare tanto era solo un esempio comunque grazie.
 
                          ...Defending Metal Faith...

djwiper

  • Utente
  • **
  • Post: 197
  • Gioco Preferito: Sim City
Editor Di Disegno
« Risposta #9 il: 25 Aprile 2007, 00:01:57 »
Citazione da: "Envil"
avevo visto i percorsi del $f1ca, ma si diramavano parecchio e mi son perso
So benissimo che qui si parla di cose serie, chiedo scusa, ma giusto per fare un pò di ironia spicciola a sfondo sessuale come non quotare? Non vi disturbo più, giuro...
Ho capito di odiare le firme...

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Editor Di Disegno
« Risposta #10 il: 25 Aprile 2007, 00:36:22 »
 Sarebbe anche piu' divertente se fosse invertita la funzione con la successiva:
Codice: [Seleziona]
$F1CA/61898      Output One Character
$F20E/61966      Set Input Device
:ciapet:

 
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Envil

  • Neo-iscritto
  • *
  • Post: 11
  • Gioco Preferito: Turrican II
Editor Di Disegno
« Risposta #11 il: 30 Aprile 2007, 15:10:15 »
Finalmente sono arrivato a una semispecie di beta del mio prog (che adesso ha anche un nome davvero lamero!).
Ho inserito diverse cose,quelle scritte nel menu del programma sono tutte funzionanti ora(tranne l'exit); in futuro mettero' il save/load da disketto (anche se non credo lo utilizzero' mai perche' vado giu' di dump con vice  :sgrat: ) , step undo/repeat e l'exit dal programma che dovra' essere trasparente in  modo da poterlo riavviare senza resettare.

i file che allego sono 2 compressi, bmpedit64.zip contenente il prg e il codice, e data.zip contenente i dati e il sid.

se ci son domande o consigli suggerimenti come sempre son qui  :idea:
bmpedit64
« Ultima modifica: 21 Gennaio 2015, 22:46:30 da eregil »
                          ...Defending Metal Faith...