Comme j'avais quelques heures à perdre ces dernières semaines, j'ai eu envie de faire un petit essai...
Bon comme le dit le titre, c'est très "basique". Il s'affiche en 160x200 en mode 0. Les touches fléchées servent au déplacement.
Voici le source, commenté
Code :
org #9000 run $ start: DI LD BC,#7F8C OUT (C),C LD H,Laby/256 ; Adresse <HI> de la "map" EXX DrawView: LD A,#20 ; Angle SUB 40 ; A2 = Angle - 40, on va tracer des lignes verticales de angle-40 à angle+39 => 80 octets en largeur LD (BclDrawView+1),A XOR A LD (DrawX+1),A BclDrawView: LD HL,TabCos/2 LD A,L ; A2 ADD HL,HL LD C,(HL) INC HL LD B,(HL) LD (stepy+1),BC LD H,TabCos/512 ADD A,64 ; A2 + 64 (TabCos[Angle+64]=TabSin[Angle]) LD L,A ADD HL,HL LD C,(HL) INC HL LD B,(HL) LD (stepx+1),BC PosY: LD HL,#2800 ; yy PosX: LD DE,#3800 ; xx XOR A LoopLabyView: EX AF,AF' ; Sauvegarde dist LD A,H ADD A,A ADD A,A AND #F0 LD B,A ; b = yy >> 6 = ( yy >>10 ) << 4 LD A,D RRA SRA A ; a = xx >> 10 ADD A,B EXX LD L,A LD A,(HL) ; Laby[ ( xx >> 10 ) + ( yy >> 10 ) << 4 ] EXX AND A JR NZ,EndLoopLaby stepy: LD BC,0 ADD HL,BC ; HL = PosY + stepy EX DE,HL stepx: LD BC,0 ADD HL,BC EX DE,HL ; DE = PosX + stepx EX AF,AF' INC A ; Dist = Dist + 1 JR LoopLabyView EndLoopLaby: LD C,A ; couleur LD H,TabHeight/256 EX AF,AF' LD L,A ; En fonction de la distance LD B,(HL) ; On déduit la hauteur LD A,25 ; ; Trace une ligne verticale avec L = x, B = hauteur, C = couleur ; SUB B LD (MinHauteur+1),A ; Hauteur mini = 25 - hauteur ADD A,B ADD A,B LD (MaxHauteur+1),A ; Hauteur maxi = 25 + hauteur DrawX: LD HL,#C000 ; Position x LD DE,#C050 ; Pour ajustement mémoire vidéo LD B,50 ; hauteur totale BclY: LD A,B MaxHauteur: CP 0 ; Hauteur max à tracer JR NC,DrawVide MinHauteur: CP 0 ; Hauteur min à tracer JR C,DrawVide LD A,C ; Octet mode 0 représentant la couleur du mur JR DrawOk DrawVide: XOR A ; Pas de mur DrawOk: LD (HL),A ; Ecriture dans Ligne n SET 3,H ; Ligne n + 1 LD (HL),A ; Ecriture SET 4,H ; Ligne n + 3 LD (HL),A ; Ecriture RES 3,H ; Ligne n + 2 LD (HL),A ; Ecriture LD A,H ; Ici H a déja été augmenté de #10 (avec le SET 4) ADD A,#10 ; Passage à la ligne n+4 LD H,A JR NC,Suite ADD HL,DE ; Ajustement si débordement Suite: DJNZ BclY ; Nombre de Y terminés ? LD A,(BclDrawView+1) INC A ; Incrémeter A2 (angle de traçage) LD (BclDrawView+1),A LD A,(DrawX+1) INC A ; Incrémenter position de traçage (mémoire vidéo) LD (DrawX+1),A CP 80 ; 80 lignes tracées ? JP C,BclDrawView ; Sinon on continue ; ; Lecture Clavier ; LD BC,#F40E OUT (C),C LD BC,#F6C0 OUT (C),C XOR A OUT (C),A LD BC,#F792 OUT (C),C LD A,#40 LD HL,MatClavier ReadClav1: LD B,#F6 OUT (C),A LD B,#F4 INI INC A CP #42 ; Pas besoin d'aller plus loin pour lire les flèches JR C,ReadClav1 LD BC,#F782 OUT (C),C
DEC HL LD A,(HL) RRA ; Left JR C,TstRight LD A,(DrawView+1) SUB 4 ; Angle = Angle - 4 LD (DrawView+1),A
TstRight: DEC HL LD A,(HL) BIT 1,A ; Right JR NZ,TstUp LD A,(DrawView+1) ADD A,4 ; Angle = Angle + 4 LD (DrawView+1),A
TstUp: LD A,(HL) RRA ; Up JR c,TstDown LD DE,#4000 ; Déplacement en avant => +cos[A+64] en x et +cos[A] en y JR Move
TstDown: BIT 1,A ; Down JP NZ,DrawView
LD DE,#C080 ; Déplacement en arrière => +cos[A-64] en x et +cos[A+128] en y Move: LD H,TabCos/512 LD A,(DrawView+1) ADD A,D LD L,A SUB D ADD A,E ; D = E + 64 (TabCos[Angle+64]=TabSin[Angle]) ADD HL,HL ; TabCos est un tableau de mot (16 bits) LD C,(HL) INC HL LD B,(HL) LD HL,(PosX+1) ADD HL,BC ADD HL,BC ADD HL,BC ADD HL,BC ; PosX + TabCos[ Angle + D ] << 2 EX DE,HL ; DE = newPx LD H,TabCos/512 LD L,A ADD HL,HL LD C,(HL) INC HL LD B,(HL) LD HL,(PosY+1) ADD HL,BC ADD HL,BC ADD HL,BC ADD HL,BC ; HL = newPy (PosY + TabCos[ Angle + E ] << 2) LD A,H ADD A,A ADD A,A AND #F0 LD B,A ; b = newpy >> 6 LD A,D RRA SRA A ; a = newpx >> 10 ADD A,B EXX LD L,A LD A,(HL) ; Lecture valeur laby[ ( newpx >> 10 ) + ( newpy >> 10 ) << 4 ] EXX AND A JR NZ,NoMove ; Si laby[ newpos ] non vide, pas de déplacement possible LD (PosY+1),HL EX DE,HL LD (PosX+1),HL NoMove: JP DrawView
; ; Les données suivantes doivent commencer à une adresse divisible par 256 ;-) ; org #9200
Wouaah ! très intéressent, tu peu m'explique comment marche l'encodage de la map ?
C'est très simple : J'affiche des "doubles pixels mode 0" (soit un octet). Si je veux donc un pixel de couleur 1, je code #C0 dans la map (#C0 = pixel 0 et pixel 1 de couleur 1, en mode 0) Si je veux un pixel de couleur 2, je code #0C dans la map Et ainsi de suite...
Avec ce système, on pourrait même créer des "murs rayés" : contenant deux couleurs, par exemple en codant #48 dans la map, on aurait un pixel de couleur 2 suivi d'un pixel de couleur 1
Petit update, version optimisée en vitesse (au détriment de la précision d'affichage...)
Code :
org #9000 run $ start: DI LD BC,#7F8C OUT (C),C LD H,Laby/256 ; Adresse <HI> de la "map" EXX
DrawView: LD A,#00 ; Angle SUB 40 ; A2 = Angle - 40, on va tracer des lignes verticales de angle-40 à angle+39 => 80 octets en largeur LD (BclDrawView+1),A XOR A LD (DrawX+1),A BclDrawView: LD HL,TabCos/2 LD A,L ; A2 LD D,A ADD HL,HL LD A,(HL) INC HL LD B,(HL) RLA RL B RLA RL B RLA RL B RLA RL B LD C,A LD (stepy+1),BC LD H,TabCos/512 LD A,D ADD A,64 ; A2 + 64 (TabCos[Angle+64]=TabSin[Angle]) LD L,A ADD HL,HL LD C,(HL) INC HL LD B,(HL) LD (stepx+1),BC PosX: LD DE,#0400 ; xx PosY: LD HL,#1000 ; yy XOR A LoopLabyView: EX AF,AF' ; Sauvegarde dist LD A,H AND #F0 OR D EXX LD L,A LD A,(HL) ; Laby[ ( xx >> 10 ) + ( yy >> 10 ) << 4 ] EXX AND A JR NZ,EndLoopLaby stepy: LD BC,0 ADD HL,BC ; HL = PosY + stepy EX DE,HL stepx: LD BC,0 ADD HL,BC EX DE,HL ; DE = PosX + stepx EX AF,AF' INC A ; Dist = Dist + 1 JR LoopLabyView EndLoopLaby: LD C,A ; couleur LD H,TabHeight/256 EX AF,AF' LD L,A ; En fonction de la distance LD B,(HL) ; On déduit la hauteur LD A,25 ; ; Trace une ligne verticale avec L = x, B = hauteur, C = couleur ; SUB B LD (MinHauteur+1),A ; Hauteur mini = 25 - hauteur ADD A,B ADD A,B LD (MaxHauteur+1),A ; Hauteur maxi = 25 + hauteur DrawX: LD HL,#C000 ; Position x LD DE,#C050 ; Pour ajustement mémoire vidéo LD B,50 ; hauteur totale BclY: LD A,B MaxHauteur: CP 0 ; Hauteur max à tracer JR NC,DrawVide MinHauteur: CP 0 ; Hauteur min à tracer JR C,DrawVide LD A,C ; Octet mode 0 représentant la couleur du mur JR DrawOk DrawVide: XOR A ; Pas de mur DrawOk: LD (HL),A ; Ecriture dans Ligne n SET 3,H ; Ligne n + 1 LD (HL),A ; Ecriture SET 4,H ; Ligne n + 3 LD (HL),A ; Ecriture RES 3,H ; Ligne n + 2 LD (HL),A ; Ecriture LD A,H ; Ici H a déja été augmenté de #10 (avec le SET 4) ADD A,#10 ; Passage à la ligne n+4 LD H,A JR NC,Suite ADD HL,DE ; Ajustement si débordement Suite: DJNZ BclY ; Nombre de Y terminés ? LD A,(BclDrawView+1) INC A ; Incrémeter A2 (angle de traçage) LD (BclDrawView+1),A LD A,(DrawX+1) INC A LD (DrawX+1),A CP 80 JP C,BclDrawView LD BC,#F40E OUT (C),C LD BC,#F6C0 OUT (C),C XOR A OUT (C),A LD BC,#F792 OUT (C),C LD A,#40 LD HL,MatClavier ReadClav1: LD B,#F6 OUT (C),A LD B,#F4 INI INC A CP #42 ; Pas besoin d'aller plus loin pour lire les flèches JR C,ReadClav1 LD BC,#F782 OUT (C),C
DEC HL LD A,(HL) RRA ; Left JR C,TstRight LD A,(DrawView+1) SUB 4 ; Angle = Angle - 4 LD (DrawView+1),A
TstRight: DEC HL LD A,(HL) BIT 1,A ; Right JR NZ,TstUp LD A,(DrawView+1) ADD A,4 ; Angle = Angle + 4 LD (DrawView+1),A
TstUp: LD A,(HL) RRA ; Up JR c,TstDown LD DE,#4000 ; Déplacement en avant => +cos[A+64] en x et +cos[A] en y JR Move
TstDown: BIT 1,A ; Down JP NZ,DrawView
LD DE,#C080 ; Déplacement en arrière => +cos[A-64] en x et +cos[A+128] en y Move: LD H,TabCos/512 LD A,(DrawView+1) ADD A,D LD L,A SUB D ADD A,E ; D = E + 64 (TabCos[Angle+64]=TabSin[Angle]) ADD HL,HL ; TabCos est un tableau de mot (16 bits) LD C,(HL) INC HL LD B,(HL) LD HL,(PosX+1) ADD HL,BC EX DE,HL ; DE = newPx LD H,TabCos/512 LD L,A ADD HL,HL LD A,(HL) INC HL LD B,(HL) RLA RL B RLA RL B RLA RL B RLA RL B LD C,A LD HL,(PosY+1) ADD HL,BC ; HL = newPy (PosY + TabCos[ Angle + E ] << 1) LD A,H AND #F0 OR D EXX LD L,A LD A,(HL) ; Lecture valeur laby[ ( newpx >> 10 ) + ( newpy >> 10 ) << 4 ] EXX AND A JP NZ,DrawView ; Si laby[ newpos ] non vide, pas de déplacement possible LD (PosY+1),HL EX DE,HL LD (PosX+1),HL JP DrawView
C'est plutôt pas mal. Heureux de te revoir... Il faudra un jour qu'on assemble toutes ses routines 'from scratch' et qu'on en sorte quelque chose pour ce bon vieu Cpc. À bientôt Ludo.
C'est plutôt pas mal. Heureux de te revoir... Il faudra un jour qu'on assemble toutes ses routines 'from scratch' et qu'on en sorte quelque chose pour ce bon vieu Cpc. À bientôt Ludo.
Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 7 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