Normalement le VBL se déclanche en haut de l'écran. Les codeurs de démos sur CPC arrivent à modifier l'attente du raster où ils veulent. Je voudrais connaitre l'astuce de programmation avec un OUT et accompagné d'une explication.
Inscription : 12 Juin 2008, 20:29 Message(s) : 1709
qu'est-ce que tu veux faire exactement ?
en fait, il suffit de prendre la main en asm (sans les interruptions amsdos) et de créer un programme asm qui fait en sorte que l'écran ne soit plus synchronisé à 50hz...
Si je décrypte la question, l'idée n'est pas de modifier le début de la VBL, mais plutôt de savoir comment faire des changement de palettes et de mode. Le plus simple, c'est de récupérer un exemple de routine de rasters, si elle n'est pas pourrite, tout devrait s'éclairer .
La technique est assez simple en fait, si on veut changer une couleur à une ligne précise de l'écran, il faut :
1) Virer les interruptions avec un DI et détourner le vecteur &38 en lui pokant un EI RET (FB C9). Si on ne détourne pas ce vecteur, le "raster" ne sera pas parfaitement stable.
2) se synchroniser sur le début de la VBL (avec l'équivalent d'un CALL &BD19), la routine décrite au dessus par CMP
3) attendre... - soit en utilisant des commandes HALT (en n'oubliant alors pas de remettre les interruptions en ligne par un EI NOP) dont la fonction est en gros d'attendre 300ms (soit 1/6ème de la hauteur de l'écran). - soit avec une simple boucle qui incrémente un registre 16 bits. En général, on mélange plutôt les deux méthodés
Inscription : 29 Août 2007, 09:29 Message(s) : 49 Localisation : lille
voilà en gros ce que disais TOM
ORG #1000 ; ENT $ ; ; DI LD hl,(#38) LD (INTER),hl LD hl,#c9fb LD (#38),hl ; ; EI main LD b,#F5 syn IN a,(c) RRA JR nc,syn ; HALT ;Les halts arrivent tous les 52lignes donc 52*6=312,5 HALT ; ld bc,#7F00 out (c),c ld a,#5C out (c),c
; HALT ld bc,#7F00 out (c),c ld a,#4C out (c),c
; HALT ld bc,#7F00 out (c),c ld a,#4E out (c),c
; HALT ld bc,#7F00 out (c),c ld a,#54 out (c),c
;test space LD bc,#F40E OUT (c),c LD bc,#F6C0 OUT (c),c XOR a OUT (c),a LD bc,#F792 OUT (c),c DEC b LD c,#45 OUT (c),c LD b,#F4 IN a,(c) LD bc,#F782 OUT (c),c DEC b LD c,#00 OUT (c),c AND #80 JP nz,main ; ; retour au systeme et restaure interruption z80 sys ; LD bc,#bc04 OUT (c),c INC b LD c,38 OUT (c),c ; LD bc,#bc02 OUT (c),c INC b LD c,46 OUT (c),c ; LD bc,#bc01 OUT (c),c INC b LD c,40 OUT (c),c ; LD bc,#bc07 OUT (c),c INC b LD c,30 OUT (c),c LD bc,#bc06 OUT (c),c INC b LD c,25 OUT (c),c ; LD bc,#bc0C OUT (c),c LD bc,#bd30 OUT (c),c LD bc,#bc0D OUT (c),c LD bc,#BD00 OUT (c),c ; ; LD hl,(INTER) LD (#38),HL EI ; RET INTER DW 0
Ta routine CMP ne marchera toujours pas de la même façon sur tous les CPC... Exemple sur CRTC 1, ton premier HALT choppera l'interruption qui a lieu en même temps que la VBL tandis que sur les autres tu seras sur la 2ème... Pour palier à cela, un petit LB B,32:DJNZ $ avant le premier HALT te permettra au moins d'éviter cela.
Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 80 invité(s)
Vous ne pouvez pas publier de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas insérer de pièces jointes dans ce forum