Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : mazertoc
CALLX de BigOnOff
Bonjour à tous,
C'est peut-être mon côté radin mais les macros de BigOnOff supposent qu'on utilise les 4 pages de code disponibles sur les pics étudiés, Ce n'est pas toujours le cas, moi, je me suis toujours satisfait d'une seule, parfois un peu juste certes mais ...
Le fichier ci-dessous qu'on peut intégrer dans un développement avec un include reprend toutes les définitions de BigOnOff en gérant une constante à définir avant l'include qui donne le nombre de pages utilisées.
Comment s'en servir :
Il est supposé que si, par exemple, le programme utilise deux pages, ce sont les pages 0 et 1
Ci-dessous, le code de ce module sur lequel tout commentaire est superflu
C'est peut-être mon côté radin mais les macros de BigOnOff supposent qu'on utilise les 4 pages de code disponibles sur les pics étudiés, Ce n'est pas toujours le cas, moi, je me suis toujours satisfait d'une seule, parfois un peu juste certes mais ...
Le fichier ci-dessous qu'on peut intégrer dans un développement avec un include reprend toutes les définitions de BigOnOff en gérant une constante à définir avant l'include qui donne le nombre de pages utilisées.
Comment s'en servir :
Code : Tout sélectionner
#define NbPages 2
include "callx.inc" ; préciser le répertoire éventuellement
Il est supposé que si, par exemple, le programme utilise deux pages, ce sont les pages 0 et 1
Ci-dessous, le code de ce module sur lequel tout commentaire est superflu
Code : Tout sélectionner
ifndef _CallX
#DEFINE _CallX
; Module CallX
; Date création : 02/03/2019
; Auteur : JJE
; Historique
; version 1 : 15/03/2019
; Ce module définit les macros CALLX et GOTOX de BigOnOff
; en exploitant la possibilité de définir le nombre de pages
; de programme Pic utilisées par le programme. On fait l'hypothèse
; qu'elles sont utilisées dans l'ordre croissant.
; ceci permet de gagner jusqu'à 2 octets de code pour un GOTOX
; et jusqu'à 4 pour un CALLX
;
; utilise l'étiquette NbPages qui doit être définie comme égale à
; 1, 2, 3 ou 4. Toute autre valeur entraîne une erreur
; si elle n'est pas définie AVANT la lecture de ce fichier,
; elle est prise comme égale à 4
; version 2 : 17/03/2019
; ajout de PCLAX de CALLSX et de GOTOSX qui permettent d'enchaîner
; plusieurs CALL en limitant les changements de page
ifndef NbPages
#DEFINE NbPages 4
messg " "
messg "Attention, NbPages n'est pas défini"
messg "on lui attribue la valeur 4"
messg " "
else
if NbPages==0 || NbPages >=5
messg " "
error "NbPages doit être compris entre 1 et 4, compris"
messg " "
endif ;if NbPages==0 || NbPages >=5
endif ; def NbPages
; goto inter-banques
; ------------------
; adapté de BigOnOff
; réalise un goto avec gestion de PCLATH
if NbPages == 4 || NbPages == 3
GOTOX macro ADRESSE
local BIT3 = (ADRESSE & 0x0800) ; voir bit 11
local BIT4 = (ADRESSE & 0x1000) ; voir bit 12
local ICI
ICI
local PICI = (ICI+2 & 0x1800) ; page du saut
IF BIT3 ; si ADRESSE dans page 1 ou 3
bsf PCLATH , 3 ; b3 de PCLATH = 1
ELSE ; sinon
bcf PCLATH , 3 ; b3 de PCLATH = 0
ENDIF
IF BIT4 ; si ADRESSE dans page 2 ou 4
bsf PCLATH , 4 ; b4 de PCLATH = 1
ELSE ; sinon
bcf PCLATH , 4 ; b4 de PCLATH = 0
ENDIF
goto (ADRESSE & 0x7FF | PICI) ; adresse simulée
endm
else ; NbPages == 4 || NbPages == 3
if NbPages == 2
GOTOX macro ADRESSE
local BIT3 = (ADRESSE & 0x0800) ; voir bit 11
local ICI
ICI
local PICI = (ICI+2 & 0x1800) ; page du saut
IF BIT3 ; si ADRESSE dans page 1 ou 3
bsf PCLATH , 3 ; b3 de PCLATH = 1
ELSE ; sinon
bcf PCLATH , 3 ; b3 de PCLATH = 0
ENDIF
goto (ADRESSE & 0x7FF | PICI) ; adresse simulée
endm
else
; Nombre de pages ==1
GOTOX macro ADRESSE
local ICI
ICI
local PICI = (ICI+1 & 0x1800) ; page du saut
goto (ADRESSE & 0x7FF | PICI) ; adresse simulée
endm
endif ; NbPages == 2
endif ; NbPages == 4 || NbPages == 3
; Sous-routines inter-banques
; ----------------------------
; tiré de BigOnOff
; réalise un call avec gestion de PCLATH
if NbPages == 4 || NbPages == 3
CALLX macro ADRESSE ; call inter-page
local BIT3 = (ADRESSE & 0x0800) ; voir bit 11
local BIT4 = (ADRESSE & 0x1000) ; voir bit 12
local ICI
ICI
local PICI = (ICI+2 & 0x1800) ; page du saut
IF BIT3 ; si page 1 ou 3
bsf PCLATH , 3 ; b3 de PCLATH = 1
ELSE
bcf PCLATH , 3 ; b3 de PCLATH = 0
ENDIF
IF BIT4 ; si page 2 ou 4
bsf PCLATH , 4 ; b4 de PCLATH = 1
ELSE
bcf PCLATH , 4 ; b3 de PCLATH = 0
ENDIF
call (ADRESSE & 0x7FF | PICI) ; adresse simulée
local BIT3 = (ICI+5 & 0x0800) ; voir bit 11
local BIT4 = (ICI+5 & 0x1000) ; voir bit 12
IF BIT3 ; si page 1 ou 3
bsf PCLATH , 3 ; b3 de PCLATH = 0
ELSE
bcf PCLATH , 3 ; b3 de PCLATH = 1
ENDIF
IF BIT4 ; si page 2 ou 4
bsf PCLATH , 4 ; b4 de PCLATH = 0
ELSE
bcf PCLATH , 4 ; b3 de PCLATH = 1
ENDIF
endm
else ; NbPages == 4 || NbPages == 3
if NbPages == 2
CALLX macro ADRESSE ; call inter-page
local BIT3 = (ADRESSE & 0x0800) ; voir bit 11
local ICI
ICI
local PICI = (ICI+2 & 0x1800) ; page du saut
IF BIT3 ; si page 1 ou 3
bsf PCLATH , 3 ; b3 de PCLATH = 1
ELSE
bcf PCLATH , 3 ; b3 de PCLATH = 0
ENDIF
call (ADRESSE & 0x7FF | PICI) ; adresse simulée
local BIT3 = (ICI+3 & 0x0800) ; voir bit 11
local BIT4 = (ICI+3 & 0x1000) ; voir bit 12
IF BIT3 ; si page 1 ou 3
bsf PCLATH , 3 ; b3 de PCLATH = 0
ELSE
bcf PCLATH , 3 ; b3 de PCLATH = 1
ENDIF
endm
else
CALLX macro ADRESSE ; call inter-page
; Nombre de pages ==1
local ICI
ICI
local PICI = (ICI+1 & 0x1800) ; page du saut
call (ADRESSE & 0x7FF | PICI) ; adresse simulée
endm
endif ; NbPages == 2
endif ; NbPages == 4 || NbPages == 3
; Changement de page
; -------------------
if NbPages == 4 || NbPages == 3
PCLAX macro ADRESSE ; positionne PCLATH pour les sauts sans le saut
local BIT4 = (ADRESSE & 0x1000) ; voir bit 12
local BIT3 = (ADRESSE & 0x0800) ; voir bit 11
IF BIT3 ; si page 1 ou 3
bsf PCLATH , 3 ; b3 de PCLATH = 1
ELSE ; sinon
bcf PCLATH , 3 ; b3 de PCLATH = 0
ENDIF
IF BIT4 ; si page 2 ou 3
bsf PCLATH , 4 ; b4 de PCLATH = 1
ELSE ; sinon
bcf PCLATH , 4 ; b4 de PCLATH = 0
ENDIF
Endm
else ; NbPages == 4 || NbPages == 3
if NbPages == 2
PCLAX macro ADRESSE ; call inter-page
local BIT3 = (ADRESSE & 0x0800) ; voir bit 11
local ICI
ICI
local PICI = (ICI+2 & 0x1800) ; page du saut
IF BIT3 ; si page 1 ou 3
bsf PCLATH , 3 ; b3 de PCLATH = 1
ELSE
bcf PCLATH , 3 ; b3 de PCLATH = 0
ENDIF
Endm
endif ; NbPages == 2
endif ; NbPages == 4 || NbPages == 3
; saut sans sélection de page
; évite le warning
; ----------------
GOTOSX macro ADRESSE ; saut sans sélection de PCLATH
local ICI ; adresse courante
local PICI = (ICI & 0x1800) ; page du saut
ICI
goto (ADRESSE & 0x7FF | PICI) ; adresse simulée
endm
; appel ssp sans sélection de page
; évite le warning
; ----------------
CALLSX macro ADRESSE ; appel sous-programme sans sélection de PCLATH
local ICI ; adresse courante
local PICI = (ICI & 0x1800) ; page du saut
ICI
call (ADRESSE & 0x7FF | PICI) ; adresse simulée
endm
endif ; def _CallX
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 19 invités