home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1996 September / pcwk_09_96.iso / demo / wgelectr / pk51demo / files.2 / EXAMPLES / BL51_EX1 / L51_BANK.A51 < prev   
Text File  |  1995-09-27  |  9KB  |  326 lines

  1. $NOCOND DEBUGPUBLICS
  2. ;------------------------------------------------------------------------------
  3. ;  This file is part of the BL51 Banked Linker/Locater package
  4. ;  Copyright KEIL ELEKTRONIK GmbH 1991 - 1995
  5. ;  Version 1.4
  6. ;------------------------------------------------------------------------------
  7. ;************************ Configuration Section *******************************
  8. ?B_NBANKS       EQU     3        ; Define max. Number of Banks                *
  9. ;                                ; the max. value for ?B_BANKS is 32          *
  10. ;                                                                             *
  11. ?B_MODE         EQU     0        ; 0 for Bank-Switching via 8051 Port         *
  12. ;                                ; 1 for Bank-Switching via XDATA Port        *
  13. ;                                                                             *
  14. IF  ?B_MODE = 0;                                                              *
  15. ;-----------------------------------------------------------------------------*
  16. ; if ?BANK?MODE is 0 define the following values                              *
  17. ; For Bank-Switching via 8051 Port define Port Address / Bits                 *
  18. ?B_PORT         EQU     P1       ; default is P1                              *
  19. ?B_FIRSTBIT     EQU     3        ; default is Bit 3                           *
  20. ;-----------------------------------------------------------------------------*
  21. ENDIF;                                                                        *
  22. ;                                                                             *
  23. IF  ?B_MODE = 1;                                                              *
  24. ;-----------------------------------------------------------------------------*
  25. ; if ?BANK?MODE is 1 define the following values                              *
  26. ; For Bank-Switching via XDATA Port define XDATA Port Address / Bits          *
  27. ?B_XDATAPORT    EQU     0FFFFH   ; default is XDATA Port Address 0FFFFH       *
  28. ?B_FIRSTBIT     EQU     0        ; default is Bit 0                           *
  29. ;-----------------------------------------------------------------------------*
  30. ENDIF;                                                                        *
  31. ;                                                                             *
  32. ;******************************************************************************
  33.  
  34.                 NAME    ?BANK?SWITCHING
  35.  
  36.                 PUBLIC  ?B_NBANKS, ?B_MODE, ?B_CURRENTBANK, ?B_MASK
  37.                 PUBLIC  ?B_FACTOR
  38.         PUBLIC    _SWITCHBANK
  39.  
  40. ?B_FACTOR    EQU    1 SHL ?B_FIRSTBIT
  41.  
  42. IF  ?B_MODE = 0
  43. ?B_CURRENTBANK  EQU     ?B_PORT
  44. ENDIF
  45.  
  46. IF  ?B_MODE = 1
  47.  
  48. ?C_INITSEG      SEGMENT   CODE          ; Segment zur Initialisierung
  49.                 RSEG    ?C_INITSEG
  50.                 DB      01H             ; IData
  51.                 DB      ?B_CURRENTBANK  ; Init Current Bank
  52.                 DB      0               ; Set to Zero
  53.                 DB      41H             ; XData
  54.                 DW      ?B_XDATAPORT    ; Init XDATA Port
  55.                 DB      0               ; Set to Zero
  56.  
  57.                 PUBLIC  ?B_XDATAPORT
  58.  
  59. ?BANK?DATA      SEGMENT DATA
  60.                 RSEG    ?BANK?DATA
  61. ?B_CURRENTBANK: DS      1
  62. ENDIF
  63.  
  64. ; generate Mask and Bank Number Information
  65. IF      ?B_NBANKS <= 2
  66.   MASK          EQU     00000001B
  67. ELSEIF  ?B_NBANKS <= 4
  68.   MASK          EQU     00000011B
  69. ELSEIF  ?B_NBANKS <= 8
  70.   MASK          EQU     00000111B
  71. ELSEIF  ?B_NBANKS <= 16
  72.   MASK          EQU     00001111B
  73. ELSE
  74.   MASK          EQU     00011111B
  75. ENDIF     
  76.  
  77. ?B_MASK         EQU     MASK SHL ?B_FIRSTBIT
  78.  
  79. BANKN           MACRO   N
  80. BANK&N           EQU     N SHL ?B_FIRSTBIT
  81.                 ENDM
  82.  
  83. CNT             SET     0
  84.  
  85.                 REPT    ?B_NBANKS
  86.                 BANKN   %CNT
  87. CNT             SET     CNT+1
  88.                 ENDM
  89.  
  90. IF ?B_MODE = 0 OR ?B_NBANKS > 16
  91.   ; Convert Bank No in Accu to Address * 8
  92.  
  93.   IF  ?B_FIRSTBIT = 0
  94.   CONVBANKNO    MACRO
  95.                 SWAP    A
  96.                 RR      A
  97.                 ENDM
  98.   ENDIF
  99.  
  100.   IF  ?B_FIRSTBIT = 1
  101.   CONVBANKNO    MACRO
  102.                 RL      A
  103.                 RL      A
  104.                 ENDM
  105.   ENDIF
  106.  
  107.   IF  ?B_FIRSTBIT = 2
  108.   CONVBANKNO    MACRO
  109.                 RL      A
  110.                 ENDM
  111.   ENDIF
  112.  
  113.   IF  ?B_FIRSTBIT = 3
  114.   CONVBANKNO    MACRO
  115.                 ENDM
  116.   ENDIF
  117.  
  118.   IF  ?B_FIRSTBIT = 4
  119.   CONVBANKNO    MACRO
  120.                 RR      A
  121.                 ENDM
  122.   ENDIF
  123.  
  124.   IF  ?B_FIRSTBIT = 5
  125.   CONVBANKNO    MACRO
  126.                 RR      A
  127.                 RR      A
  128.                 ENDM
  129.   ENDIF
  130.  
  131.   IF  ?B_FIRSTBIT = 6
  132.   CONVBANKNO    MACRO
  133.                 SWAP    A
  134.                 RL      A
  135.                 ENDM
  136.   ENDIF
  137.  
  138.   IF  ?B_FIRSTBIT = 7
  139.   CONVBANKNO    MACRO
  140.                 SWAP    A
  141.                 ENDM
  142.   ENDIF
  143. ENDIF
  144.  
  145.  
  146. IF ?B_MODE = 1 AND ?B_NBANKS <= 16
  147.   ; Convert Bank No in Accu to Address * 16
  148.   IF  ?B_FIRSTBIT = 0
  149.   CONVBANKNO    MACRO
  150.                 SWAP    A
  151.                 ENDM
  152.   ENDIF
  153.  
  154.   IF  ?B_FIRSTBIT = 1
  155.   CONVBANKNO    MACRO
  156.                 SWAP    A
  157.                 RR      A
  158.                 ENDM
  159.   ENDIF
  160.  
  161.   IF  ?B_FIRSTBIT = 2
  162.   CONVBANKNO    MACRO
  163.                 RL      A
  164.                 RL      A
  165.                 ENDM
  166.   ENDIF
  167.  
  168.   IF  ?B_FIRSTBIT = 3
  169.   CONVBANKNO    MACRO
  170.                 RL      A
  171.                 ENDM
  172.   ENDIF
  173.  
  174.   IF  ?B_FIRSTBIT = 4
  175.   CONVBANKNO    MACRO
  176.                 ENDM
  177.   ENDIF
  178.  
  179.   IF  ?B_FIRSTBIT = 5
  180.   CONVBANKNO    MACRO
  181.                 RR      A
  182.                 ENDM
  183.   ENDIF
  184.  
  185.   IF  ?B_FIRSTBIT = 6
  186.   CONVBANKNO    MACRO
  187.                 RR      A
  188.                 RR      A
  189.                 ENDM
  190.   ENDIF
  191.  
  192.   IF  ?B_FIRSTBIT = 7
  193.   CONVBANKNO    MACRO
  194.                 SWAP    A
  195.                 RL      A
  196.                 ENDM
  197.   ENDIF
  198. ENDIF
  199.  
  200.  
  201. SELECT          MACRO   N
  202. LOCAL           XLABEL, YLABEL
  203.  
  204.                 PUBLIC  ?B_BANK&N
  205. ?B_BANK&N:      
  206.                 MOV     A,?B_CURRENTBANK
  207.                 ANL     A,#?B_MASK
  208.                 CJNE    A,#BANK&N,XLABEL
  209.  
  210. IF ?B_MODE = 0
  211.                 CLR     A
  212.                 JMP     @A+DPTR
  213. ENDIF
  214.  
  215. IF ?B_MODE = 1
  216.                 SJMP    YLABEL
  217. ENDIF
  218.  
  219. XLABEL:         CONVBANKNO         ; Convert Bank Number to Address
  220.                 PUSH    ACC
  221.         MOV     A,#HIGH ?BANK?SWITCH
  222.                 PUSH    ACC
  223. YLABEL:         PUSH    DPL
  224.                 PUSH    DPH
  225.                 LJMP    ?B_SWITCH&N
  226.  
  227.                 ENDM
  228.  
  229.  
  230. ?BANK?SELECT    SEGMENT  CODE
  231.  
  232.                 RSEG    ?BANK?SELECT
  233. CNT             SET     0
  234.  
  235.                 REPT    ?B_NBANKS
  236.                 SELECT  %CNT
  237. CNT             SET     CNT+1
  238.  
  239.                 ENDM
  240.  
  241.  
  242. SWITCH          MACRO   N
  243.   IF  ?B_MODE = 0
  244.                 ORG     N * 8
  245.                 PUBLIC  ?B_SWITCH&N
  246.     ?B_SWITCH&N:
  247.                 ORL     ?B_CURRENTBANK,#?B_MASK
  248.     IF  N <> (?B_NBANKS-1)
  249.                 ANL     ?B_CURRENTBANK,#(BANK&N OR NOT ?B_MASK) 
  250.     ENDIF
  251.                 RET
  252.   ENDIF
  253.  
  254.  
  255.   IF  ?B_MODE = 1 AND ?B_NBANKS <= 16
  256.                 ORG     N * 16
  257.                 PUBLIC  ?B_SWITCH&N
  258.     ?B_SWITCH&N:
  259.                 MOV     R0,A
  260.                 MOV     A,#BANK&N
  261.                 MOV     DPTR,#?B_XDATAPORT
  262.                 MOV     ?B_CURRENTBANK,A
  263.                 MOVX    @DPTR,A
  264.                 MOV     A,R0
  265.                 RET
  266.   ENDIF
  267.  
  268.   IF  ?B_MODE = 1 AND ?B_NBANKS > 16
  269.         ORG    N * 8
  270.                 PUBLIC  ?B_SWITCH&N
  271.     ?B_SWITCH&N:
  272.         MOV    R0,A
  273.         MOV    A,#BANK&N
  274.         LJMP    SWITCHNOW
  275.   ENDIF
  276.  
  277.                 ENDM
  278.  
  279.  
  280. ?BANK?SWITCH    SEGMENT  CODE  PAGE
  281.  
  282.                 RSEG    ?BANK?SWITCH
  283. CNT             SET     0
  284.  
  285.                 REPT    ?B_NBANKS
  286.                 SWITCH  %CNT
  287.  
  288. CNT             SET     CNT+1
  289.                 ENDM
  290.  
  291.  
  292.   IF  ?B_MODE = 1 AND ?B_NBANKS > 16
  293.     SWITCHNOW:  MOV     DPTR,#?B_XDATAPORT
  294.                 MOV     ?B_CURRENTBANK,A
  295.                 MOVX    @DPTR,A
  296.                 MOV     A,R0
  297.                 RET
  298.   ENDIF
  299.  
  300.  
  301.  
  302. RSEG        ?BANK?SELECT
  303.  
  304. ;************************  SWITCHBANK FUNCTION  *******************************
  305. ;                                                                             *
  306. ; SWITCHBANK allows use of bank-switching for C programs                      *
  307. ;                                                                             *
  308. ; prototype:   extern switchbank (unsigned char bank_number);                 *
  309. ;                                                                             *
  310. ;******************************************************************************
  311.  
  312. _SWITCHBANK:    MOV    A,R7
  313. IF ?B_MODE = 0  OR  ?B_NBANKS > 16
  314.         SWAP    A
  315.         RR    A
  316. ENDIF
  317.  
  318. IF ?B_MODE = 1  AND  ?B_NBANKS <= 16
  319.         SWAP    A
  320. ENDIF
  321.         MOV    DPTR,#?BANK?SWITCH
  322.         JMP    @A+DPTR
  323.  
  324.  
  325.                 END
  326.