Ladda in bild och rendera (koala)

Diskussioner om programmering

Moderatorer: Fanta_gbg, e5frog, stonan, Zlasher, hollowman

Ladda in bild och rendera (koala)

Inläggav ekman » 14 juni 2016, 02:32

Jaha, då var man här igen :D

jag har följt den här tutorialen: https://digitalerr0r.wordpress.com/2011 ... g-bitmaps/

Och en sak jag inte förstår, är att man laddar in bilden på adress $1FFE ( 2000 - 2bytes ). Men han hämtar datan från adress $3f40 ?
Varför hämtas den inte från $2000 ?
ekman
Nybörjare
Nybörjare
 
Inlägg: 15
Blev medlem: 20 juni 2014, 14:32

Re: Ladda in bild och rendera (koala)

Inläggav carlsson » 14 juni 2016, 11:06

Bildformatet i exemplet är uppbyggt så här:

Bitmap (pixlar) på $2000 - $3f3f (8000 bytes = 40 kolumner x 200 rader)
För/bakgrundsfärg på $3f40 - $4327 (1000 bytes = 40 x 25)
Extra färg på $4328 - $470f (1000 bytes, för multicolour-bilder)
Ramfärg på $4710 (tror inte att $D021 behövs här)

Bitmappen hamnar alltså på rätt ställe från början när han laddar in filen, det är färgdatat som måste kopieras till respektive plats. Att han hämtar den på $1FFE beror på att han är lat och använder en PRG med egen inladdningsadress. Om du fimpar adressen så det blir en ren binärfil kan du inkludera den på $2000. Hade bilden laddats dynamiskt skulle den ändå laddats in där, då de två första bytes i PRG-filen säger var filen ska hamna och inte självt lagras i minnet.

I stort sätt ser väl OCP Advanced Art Studio ut på samma sätt i formatet, möjligen omvänd ordning. Det finns många ritprogram som har samma uppbyggnad på datat.

Observera att författaren utelämnar dollartecken, så de flesta siffror avser hexadecimalt även om det inte syns, dvs 2000 bytes = $2000 bytes (8192 bytes decimalt), 400 bytes = $400 = 1024 bytes decimalt.
Användarvisningsbild
carlsson
VIC-20 Guru
VIC-20 Guru
 
Inlägg: 2357
Blev medlem: 10 oktober 2007, 16:24
Ort: Västerås

Re: Ladda in bild och rendera (koala)

Inläggav Redreamer » 14 juni 2016, 16:01

Nu har jag inte läst denna tutorial men jag skulle absolut rekommendera att du skummar igenom Programmers reference guide till 64.an. Finns en del ok pdf versioner av den på nätet om du söker. Tutorials i all ära men ibland tycker jag de krånglar till saker.
It always return one day!
Användarvisningsbild
Redreamer
Stormästare
Stormästare
 
Inlägg: 1431
Blev medlem: 1 maj 2005, 10:07
Ort: Borås

Re: Ladda in bild och rendera (koala)

Inläggav carlsson » 14 juni 2016, 23:28

Vid närmare eftertanke spelar nog $D021 roll i multicolourläge, men i gengäld är jag osäker på vilka ritprogram som använder samma värde för ramen $D020 och bakgrunden $D021, men det är en liten detalj i sammanhanget.
Användarvisningsbild
carlsson
VIC-20 Guru
VIC-20 Guru
 
Inlägg: 2357
Blev medlem: 10 oktober 2007, 16:24
Ort: Västerås

Re: Ladda in bild och rendera (koala)

Inläggav ekman » 15 juni 2016, 03:14

okej, så om jag ska försöka på mig en tolkning.

Så det är förutbestämt att $2000 - $3f3f är till för att innehålla pixel data och användas när man slår på Bitmap Mode. Och han kopierar endast färg datan tills din riktiga plats?

Det är så att jag har försökt ladda in fler koala bilder på andra platser utan att lyckats. Jag har försökt ladda in bilden på $3FFE ( $4000 - 2 bytes), för att sedan byta till bank 1 ( %10 ).
ekman
Nybörjare
Nybörjare
 
Inlägg: 15
Blev medlem: 20 juni 2014, 14:32

Re: Ladda in bild och rendera (koala)

Inläggav bjonte » 15 juni 2016, 06:19

ekman skrev:Det är så att jag har försökt ladda in fler koala bilder på andra platser utan att lyckats. Jag har försökt ladda in bilden på $3FFE ( $4000 - 2 bytes), för att sedan byta till bank 1 ( %10 ).


Det funkar om du gör allt rätt. Saken är den att flera bitmaps och skärminnehåll får plats i en VIC-bank så du måste ange platsen för bitmapminne och skärmminne inom banken genom att skriva till adress $d018. Bit 3 kontrollerar om bitmap ska vara på offset 0 eller $2000 i banken. Du måste alltså ändra den och banken om du ska flytta bitmap från $2000 till $4000. Bit 4-7 ställer in vilken offset skärmminnet ska ligga på i steg om $1000 i banken.

Du kan prova att flytta till samma plats i en annan bank bara. Testa $6000 så ska det funka utan att ändra på $d018.
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 2021
Blev medlem: 17 april 2006, 23:12

Re: Ladda in bild och rendera (koala)

Inläggav carlsson » 16 juni 2016, 07:57

Fast lägger man bitmappen på $6000 måste ändå koden ändras så $0400 blir något annat, sannolikt $4400. Färgminnet på $D800 har du tur att det inte flyttas.
Användarvisningsbild
carlsson
VIC-20 Guru
VIC-20 Guru
 
Inlägg: 2357
Blev medlem: 10 oktober 2007, 16:24
Ort: Västerås

Re: Ladda in bild och rendera (koala)

Inläggav bjonte » 16 juni 2016, 10:14

Ja, precis. Jag menade att allt skulle flyttas, men det var ju inte alls självklart.
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 2021
Blev medlem: 17 april 2006, 23:12

Re: Ladda in bild och rendera (koala)

Inläggav ekman » 27 juni 2016, 19:21

Ja, jag fattar inte. Men jag försöker ändå. Men jag tycker det ser ut som att det bara är bitmap mode första raderna, och sen är det text mode resten av skärmen?
Bilagor
fel.png
bitmapmode bara högst upp?
fel.png (14.27 KiB) Visad 9909 gånger
ekman
Nybörjare
Nybörjare
 
Inlägg: 15
Blev medlem: 20 juni 2014, 14:32

Re: Ladda in bild och rendera (koala)

Inläggav bjonte » 27 juni 2016, 20:17

Det är bitmap-mode. Det är bara nollor i minnet i nedre delen och skärmminnet har valt färger för bakgrunden på varje 8x8-pixlarsruta så det är därför det blir blockigt.

Du pekar nog inte ut rätt bank eller rätt bitmapplats.
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 2021
Blev medlem: 17 april 2006, 23:12

Re: Ladda in bild och rendera (koala)

Inläggav bjonte » 28 juni 2016, 05:48

Jag använder den här koden för att ställa in grafikläget med enkla adresser. Anpassa koden efter din assembler.

Kod: Markera allt
const BANK_ADDR = $c000
const SCREEN_ADDR = $cc00
const CHAR_ADDR = $e000
const BITMAP_ADDR = $e000
const FRAME_CONTROL_BITMAP = ((BITMAP_ADDR >> 10) & %1110) | ((SCREEN_ADDR >> 6) & %11110000)
const FRAME_CONTROL_SCREEN = ((CHAR_ADDR >> 10) & %1110) | ((SCREEN_ADDR >> 6) & %11110000)

// set bank
lda #3 - (BANK_ADDR >> 14)
sta CI2PRA

// set bitmap, screen and character address
lda #FRAME_CONTROL_BITMAP // eller FRAME_CONTROL_SCREEN beroende på skärmläget
sta VMCSB


CI2PRA är $dd00 och VMCSB är $d018.
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 2021
Blev medlem: 17 april 2006, 23:12

Re: Ladda in bild och rendera (koala)

Inläggav ekman » 28 juni 2016, 08:25

Okej, men det är ju bra. Så slipper jag fundera över det. Men är det så att CPU'n kan adressera hela minnnet men VIC chippet kan bara adressera 16k bytes och därför ändrar man bank?

Jag tror jag har hittat rätt bank nu ialf.. men kopierar "För/bakgrundsfärg" till fel plats tror jag. Kan ju visa koden
Kod: Markera allt
* = $3FFE ; aka $4000
   .binary "b0.kla"
   
*= $0801
    .word (+), 2005  ;pointer, line number
    .null $9e, ^begin;will be sys 4096
+   .word 0          ;basic line end

* = $0810

begin:
   ;byt till Bank #1, $4000-$7FFF
   LDA $DD00
   AND #$FC ; FC -> 1111 1100
   ORA #2 ; OR on Accumulator
   STA $DD00
   
   ;$DD00 - Port A, serial bus access. Bits:

   ;Bits #0-#1: VIC bank. Values:
   ;%00, 0: Bank #3, $C000-$FFFF, 49152-65535.
   ;%01, 1: Bank #2, $8000-$BFFF, 32768-49151.
   ;%10, 2: Bank #1, $4000-$7FFF, 16384-32767.
   ;%11, 3: Bank #0, $0000-$3FFF, 0-16383. <--- Default
   ;Bit #2: RS232 TXD line, output bit.
   ;Bit #3: Serial bus ATN OUT; 0 = High; 1 = Low.
   ;Bit #4: Serial bus CLOCK OUT; 0 = High; 1 = Low.
   ;Bit #5: Serial bus DATA OUT; 0 = High; 1 = Low.
   ;Bit #6: Serial bus CLOCK IN; 0 = Low; 1 = High.
   ;Bit #7: Serial bus DATA IN; 0 = Low; 1 = High.
   
   lda   #$0 ;$18 -> 0001 1000     $1d -> 0001 1101   $15 - >0001 0101
   sta   $d018
   
   ;$d018 - Memory setup register. Bits:

   ;Bits #1-#3: In text mode, pointer to character memory (bits #11-#13), relative to VIC bank, memory address $DD00. Values:
   ;%000, 0: $0000-$07FF, 0-2047.
   ;%001, 1: $0800-$0FFF, 2048-4095.
   ;%010, 2: $1000-$17FF, 4096-6143.
   ;%011, 3: $1800-$1FFF, 6144-8191.
   ;%100, 4: $2000-$27FF, 8192-10239.
   ;%101, 5: $2800-$2FFF, 10240-12287. <- default (tror jag)
   ;%110, 6: $3000-$37FF, 12288-14335.
   ;%111, 7: $3800-$3FFF, 14336-16383.

   ;Values %010 and %011 in VIC bank #0 and #2 select Character ROM instead.
   ;In bitmap mode, pointer to bitmap memory (bit #13), relative to VIC bank, memory address $DD00. Values:

   ;%0xx, 0: $0000-$1FFF, 0-8191.
   ;%1xx, 4: $2000-$3FFF, 8192-16383. <- default (tror jag)

   ;Bits #4-#7: Pointer to screen memory (bits #10-#13), relative to VIC bank, memory address $DD00. Values:
   ;%0000, 0: $0000-$03FF, 0-1023.
   ;%0001, 1: $0400-$07FF, 1024-2047. <- default (tror jag)
   ;%0010, 2: $0800-$0BFF, 2048-3071.
   ;%0011, 3: $0C00-$0FFF, 3072-4095.
   ;%0100, 4: $1000-$13FF, 4096-5119.
   ;%0101, 5: $1400-$17FF, 5120-6143.
   ;%0110, 6: $1800-$1BFF, 6144-7167.
   ;%0111, 7: $1C00-$1FFF, 7168-8191.
   ;%1000, 8: $2000-$23FF, 8192-9215.
   ;%1001, 9: $2400-$27FF, 9216-10239.
   ;%1010, 10: $2800-$2BFF, 10240-11263.
   ;%1011, 11: $2C00-$2FFF, 11264-12287.
   ;%1100, 12: $3000-$33FF, 12288-13311.
   ;%1101, 13: $3400-$37FF, 13312-14335. <<<<<<
   ;%1110, 14: $3800-$3BFF, 14336-15359.
   ;%1111, 15: $3C00-$3FFF, 15360-16383.
      
   ; Bitmap Mode On
   lda #$3b
   sta $d011

   ;$d011  -  Screen control register #1. Bits:
   ;Bits #0-#2: Vertical raster scroll.
   ;Bit #3: Screen height; 0 = 24 rows; 1 = 25 rows.
   ;Bit #4: 0 = Screen off, complete screen is covered by border; 1 = Screen on, normal screen contents are visible.
   ;Bit #5: 0 = Text mode; 1 = Bitmap mode.
   ;Bit #6: 1 = Extended background mode on.
   ;Bit #7: Read: Current raster line (bit #8).
   ;Write: Raster line to generate interrupt at (bit #8).
   ;Default: $1B, %00011011.   
      

   ldx   #$00         ;set X-register to zero
      
   ;Display bitmap code
    state1:
   ;Copying the data to screen RAM ( Nya adressen för bg färgen $4000 + 8000(dec) bytes = $5f40) <-- verkar vara fel. koden nedanför visar inga ändringar i emu
   lda   $5f40,x      
   sta $0400,x   
   lda   $6040,x
   sta   $0500,x   
   lda   $6140,x
   sta   $0600,x   
   lda   $6240,x
   sta   $0700,x   

   ;Copying the color RAM for the image to $d800
   lda $6326,X
   sta $d800,x
   lda $6426,x
   sta $d900,x
   lda $6526,x
   sta $da00,x
   lda   $6626,x
   sta   $db00,x
      
   inx               ;increase x
   bne   state1   ; if x is NOT 0, jump to state1      


   ; MultiColor On
   lda #$d8
   sta $d016
   
      
loop: jmp loop
Bilagor
battre2.png
ekman
Nybörjare
Nybörjare
 
Inlägg: 15
Blev medlem: 20 juni 2014, 14:32

Re: Ladda in bild och rendera (koala)

Inläggav bjonte » 28 juni 2016, 09:28

ekman skrev:Men är det så att CPU'n kan adressera hela minnnet men VIC chippet kan bara adressera 16k bytes och därför ändrar man bank?


Ja, exakt så är det.
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 2021
Blev medlem: 17 april 2006, 23:12

Re: Ladda in bild och rendera (koala)

Inläggav carlsson » 30 juni 2016, 13:00

Just nu laddar du in grafikdatat på $4000, byter VIC-bank till samma men petar in skärmminnet på $0400, som ligger utanför det område VIC-II för tillfället kan se.

Som Bjonte skrev, testa att lägga grafikdatat på $6000 istället, så kommer du ha skärmminnet på $4400 med någon slags automagi. Alternativt måste du ändra på värdet i 53272 så du lägger skärmminnet på t.ex. $7000 och kopierar datat från filen dit. Tyvärr går det väl inte att peka skärmminnet till att börja på en godtycklig byte, så du skulle slippa att kopiera datat.
Användarvisningsbild
carlsson
VIC-20 Guru
VIC-20 Guru
 
Inlägg: 2357
Blev medlem: 10 oktober 2007, 16:24
Ort: Västerås

Re: Ladda in bild och rendera (koala)

Inläggav ekman » 4 juli 2016, 19:26

Jag vill gärna få till det på adress $4000 då jag hade tänkt ladda in flera bilder på dom kvarvarande adresserna.

Men det slog mig nu att när man byter VIC bank så ändras adressen för Skärmminnet som VIC'n kan se. För jag trodde jag hade pekade allt rätt, pekade skärmminnet till $400 och kopierade dit data. Men när man har bytt bank kan ju inte VIC'en se den adressen, så skärmminnet kommer hamna nånstans inom den nya VIC banken.

Så i mitt fall då jag ändrade till bank 1 som kan adressera $4000-$7FFF, så blir det nya skärmminnet adressen $4000 + $400 = $4400 (om man behåller standard $400 värdet)

Kanske jag borde förstått det från era svar som hjälpte mycket ändå och jag tackar för :D


Hur som helst, nu till nästa problem.
Som jag visar på bilden så blir det en "grafik" bugg om man väljer att bitmap adressen ska börja från $0 istället för $2000 i $d018 registret. Jag har testat stänga av interupptsen med SEI utan att det ändrade nått.
Det måste ju vara nått c64 skriver egen data till den adressen? nånstans mellan $4400 - $4500. Några idéer vad det kan vara?
Bilagor
Untitled-2.jpg
ekman
Nybörjare
Nybörjare
 
Inlägg: 15
Blev medlem: 20 juni 2014, 14:32

Nästa

Återgå till Programmering/prog.-verktyg

Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 1 gäst

Banners

BOA Japon Mediapalatset Nostalgibutiken
Quartex Retro Overlays Retroplay Spel och sånt
Super Motaro Söders Serie & Skivhandel vintagegames.se RG 2016
cron