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 ---
Forum général sur l'Assembleur !

Modérateur : mazertoc

CALLX de BigOnOff
JJE
Passioné
Passioné
Messages : 335
Âge : 78
Enregistré en : novembre 2017
Localisation : Picardie

#1 Message par JJE » ven. 22 mars 2019 18:07

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 :

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
==|| NbPages >=5
        messg   
" "
        error   "NbPages doit être compris entre 1 et 4, compris"
        messg   " "
    endif       ;if NbPages==|| 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+& 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+& 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+& 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+& 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+& 0x0800) ; voir bit 11
        local BIT4 
= (ICI+& 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+& 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+& 0x0800) ; voir bit 11
            local BIT4 
= (ICI+& 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+& 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+& 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
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité