Pas de neige ici, il fait trop doux pour ca
J'ai fait un petit programme pour tester le mode graphic 2, (j'ai enlevé les datas pour ne pas surcharger le post) :
J'ai essayé de commenter au maximum le code pour que cela soit le plus compréhensible possible, après on peut faire mieux mais
le principal c'est que ca soit fonctionnel, j'ai vérifié le code en émulation ca devrait fonctionner correctement, mais il peut y avoir
un bug qui soit passé à travers (erreur adresse vdp, index de boucle,...) !!!
Code : Tout sélectionner
;--------------
;(c) 2020
; by 65602man
;
; test VDP9938
; sur Tavernier
; pour michel G.
; VDP I/O Ports
;---------------
VDPCTRL .EQU $E101 ; PORT #1
VDPDATA .EQU $E100 ; PORT #0
VDPPALETTE .EQU $E102 ; PORT #2
VDPRegInd .EQU $E103 ; PORT #3 ; registres indirectes
ORG $D000
Main:
JSR InitVDP
; remmpli la VRAM
LDD #$0000
LDX #$0000
JSR SetVDPAddress ; $0.0000
LDX #ScreenA
LDY #$1800
JSR FillVram
LDD #$0000
LDX #$0060
JSR SetVDPAddress ; $0.1800
LDU #VDPDATA ; adresse ecriture P1 VDP
LDX #$0003 ; 3 blocs de 256 octets
CLRA
BigloopFilnamVram:
LDB #$FF
FillNamVram:
STA,U
INCA
DECB
BNE FillNamVram
TFR X,D
SUBD #$01
TFR D,X
BNE BigloopFilnamVram
LDD #$0000
LDX #$0080
JSR SetVDPAddress ; $0.2000
LDX #ScreenB
LDY #$1800
JSR FillVram
End:
BRA End ;
FillVram:
LDU #VDPDATA ; adresse ecriture P1 VDP
LoopWriteVram:
LDA ,X+
STA ,U ; Write data sur P1
TFR Y,D
SUBD #$01
TFR D,Y
BNE LoopWriteVram
RTS
InitVDP:
LDB #24 ; 12 registres à ecrires
LDX #VdpRegdatas ; adresse des données
LDU #VDPCTRL ; adresse ecriture registre VDP
LoopInitVdp:
LDA ,X+
STA ,U ; WRITE data
DECB
BNE LoopInitVdp
RTS
;-------------------------------------------
; Fixe l'adresse d'ecriture du VDP
; VRAM 00000h-1FFFFh
; { Reg #45 = 0 MSX MXD MXS DIY DIX EQ MAJ } not necessary
; Reg #14 = 0 0 0 0 0 A16 A15 A14
; PORT #1 = A7 A6 A5 A4 A3 A2 A1 A0
; PORT #1 = 0 R/W A13 A12 A11 A10 A9 A8
; after read or write by PORT #0
;-------------------------------------------
; IN:
; A = A16:4 A15:2 A14:1 (R14)
; B = A7 A6 A5 A4 A3 A2 A1 A0 (P1)
; X = 0 0 0 0 0 0 0 0 A13:32 A12:16 A11:8 ... (P1)
;-------------------------------------------
SetVDPAddress:
LDU #VDPCTRL ; adresse ecriture registre VDP
STA ,U ; WRITE data ; A==>R14
LDA #14+$80
STA ,U ; WRITE n° registre ; R14
STB ,U ; Write data
TFR X,D
ADDB #$40 ; mode ecriture
STB ,U ; Write data
RTS
VdpRegdatas:
; R0 R1 R2 =$1800 R3=$2000 R4=$0000 R5 R6 R7
FCB $02,$80, $60,$81, $06,$82, $ff,$83, $03,$84, $36,$85, $07,$86, $01,$87
; R8 R9 R10 R11
FCB $08,$88, $02,$89, $00,$8a ,$00,$8b
; ---- GRAPHIC MODE 2 ----
; R0 = 0 DG IE2 IE1 0 0 1 0
; R1 = 0 BL IE0 0 0 0 SI MAG
; R2 = 0 A16 A15 A14 A13 A12 A11 A10 ;pattern name table adresse
; R3 = A13 1 1 1 1 1 1 1 ; color table adresse
; R10= 0 0 0 0 0 A16 A15 A14 ; " " "
; R4 = 0 0 A16 A15 A14 A13 1 1 ;Pattern generator adresse
; R5 = A14 A13 A12 A11 A10 A9 A8 A7 ;Sprites attributes adresse
; R11= 0 0 0 0 0 0 A16 A15 ; " " "
; R6 = 0 0 A16 A15 A14 A13 A12 A11 ;Sprites pattern adresse
; R7 = 0 0 0 0 BD3 BD2 BD1 BD0 ; Color back/borderground
; R8 = MS LP TP CB VR 0 SPD BW
; R9 = LN 0 S0 S1 IL E0 NT DC
; --- DATAS SCREEN ---
ScreenA:
FCB 0,0,0,.................... les datas sont dans le fichier joint ;)
ScreenB:
FCB 0,0,0,.................... les datas sont dans le fichier joint ;)
Le binaire et le source :
La seule partie qui nécessiterais plus d'explications est celle la :
Un affichage d'une page en SCREEN GRAPHIC 2 est organisé selon les valeurs des registres (voir la partie du code concerné) définissant l'adresses
des différentes parties constituant une page écran ( couleurs, formes, sprites) .
Donc ont commence par remplir la zone du générateur de patterns (c'est à dires la forme des dessins constituant un bloc de 8x8 = 8 lignes par bloc) :
Code : Tout sélectionner
; rempli la VRAM
LDD #$0000
LDX #$0000
JSR SetVDPAddress ; $0.0000
LDX #ScreenA
LDY #$1800
JSR FillVram
Ensuite on rempli la zone des noms de patterns (c'est à dires la carte des patterns (pour un bloc de 8x8)) :
Code : Tout sélectionner
LDD #$0000
LDX #$0060
JSR SetVDPAddress ; $0.1800
LDU #VDPDATA ; adresse ecriture P1 VDP
LDX #$0003 ; 3 blocs de 256 octets
CLRA
BigloopFilnamVram:
LDB #$FF
FillNamVram:
STA,U
INCA
DECB
BNE FillNamVram
TFR X,D
SUBD #$01
TFR D,X
BNE BigloopFilnamVram
Et pour finir on rempli la zone des couleurs de patterns (c'est à dires la couleur (2 par bloc de 8 pixels de large) pour chaque ligne de patterns) :
Code : Tout sélectionner
LDD #$0000
LDX #$0080
JSR SetVDPAddress ; $0.2000
LDX #ScreenB
LDY #$1800
JSR FillVram
Et pour finir le mode Graphic 2 divise la zone écran en 3 bloc de 256 patterns soit 768 patterns de 8 lignes, mais attention un pattern ne peut être utilisé que dans son bloc de définition
Oui j'ai perdu un peu de monde en route, et toi au fond qui est entrain de ronfler
Voila si ca peux te permettre d'avancer sur ton projet.