Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1.                 CPU     68HC12X
  2.  
  3. ;###########################################
  4. ;# SYMBOLS #
  5. ;###########################################
  6.  
  7. SCI_REGS        EQU     $00C8           ;SCI register space
  8. SCIBDH          EQU     SCI_REGS+$00    ;SCI Baud Rate Register
  9. SCICR2          EQU     SCI_REGS+$03    ;SCI Control Register 2
  10. SCISR1          EQU     SCI_REGS+$04    ;SCI Status Register 1
  11. SCIDRL          EQU     SCI_REGS+$07    ;SCI Control Register 2
  12. TIE             EQU     $80             ;TIE bit mask
  13. TE              EQU     $08             ;TE bit mask
  14. RE              EQU     $04             ;RE bit mask
  15. SCI_VEC         EQU     $D6             ;SCI vector number
  16. INT_REGS        EQU     $0120           ;S12X_INT register space
  17. INT_CFADDR      EQU     INT_REGS+$07    ;Interrupt Configuration Address Register
  18. INT_CFDATA      EQU     INT_REGS+$08    ;Interrupt Configuration Data Registers
  19. RQST            EQU     $80             ;RQST bit mask
  20. XGATE_REGS      EQU     $0380           ;XGATE register space
  21. XGMCTL          EQU     XGATE_REGS+$00  ;XGATE Module Control Register
  22. XGMCTL_CLEAR    EQU     $F902
  23. XGEM            EQU     $8000
  24. XGDBGM          EQU     $2000
  25. XGE             EQU     $0080
  26. XGDBG           EQU     $0020
  27. XGSWEIF         EQU     $0002
  28. XGCHID          EQU     XGATE_REGS+$02  ;XGATE Channel ID Register
  29. XGVBR           EQU     XGATE_REGS+$06  ;XGATE Vector Base Register
  30. XGIF            EQU     XGATE_REGS+$08  ;XGATE Interrupt Flag Vector
  31. XGSWT           EQU     XGATE_REGS+$18  ;XGATE Software Trigger Register
  32. XGSEM           EQU     XGATE_REGS+$1A  ;XGATE Semaphore Register
  33. RPAGE           EQU     $0016
  34. RAM_SIZE        EQU     20*$400         ;20k RAM
  35. RAM_START_GLOBAL EQU    $100000-RAM_SIZE
  36. RAM_START_XGATE EQU     $10000-RAM_SIZE
  37. RAM_START_S12   EQU     $1000
  38. RPAGE_VALUE     EQU     RAM_START_GLOBAL>>12
  39. XGATE_VECTORS   EQU     RAM_START_S12
  40. XGATE_DATA      EQU     RAM_START_S12+(4*128)
  41. XGATE_OFFSET    EQU     (RAM_START_XGATE+(4*128))-XGATE_DATA_BEGIN
  42. BUS_FREQ_HZ     EQU     40000000
  43.  
  44. ;###########################################
  45. ;# RESET VECTOR #
  46. ;###########################################
  47.  
  48.                 ORG     $FFFE
  49.                 ADR     START_OF_CODE
  50.                 ORG     $FF00
  51. START_OF_CODE
  52.  
  53. ;###########################################
  54. ;# INITIALIZE SCI #
  55. ;###########################################
  56.  
  57. INIT_SCI        MOVW    #(BUS_FREQ_HZ/(16*9600)), SCIBDH ;set baud rate
  58.                 MOVB    #(TIE|TE|RE), SCICR2 ;enable tx buffer empty interrupt
  59.  
  60. ;###########################################
  61. ;# INITIALIZE S12X_INT #
  62. ;###########################################
  63.  
  64. INIT_INT        SEI                     ;disable interrupts
  65.                 MOVB    #(SCI_VEC&$F0), INT_CFADDR ;switch SCI interrupts to XGATE
  66.                 MOVB    #RQST|$01, INT_CFDATA+((SCI_VEC&$0F)>>1)
  67.  
  68. ;###########################################
  69. ;# INITIALIZE XGATE #
  70. ;###########################################
  71.  
  72. INIT_XGATE      MOVW    #XGMCTL_CLEAR, XGMCTL ;clear all XGMCTL bits
  73.                 BRSET   XGCHID, $FF, INIT_XGATE ;wait until current thread is done
  74.                 MOVW    #$10000-RAM_SIZE, XGVBR ;set vector base register
  75.                 LDX     #XGIF           ;clear all channel interrupt flags
  76.                 LDD     #$FFFF
  77.                 STD     2,X+
  78.                 STD     2,X+
  79.                 STD     2,X+
  80.                 STD     2,X+
  81.                 STD     2,X+
  82.                 STD     2,X+
  83.                 STD     2,X+
  84.                 STD     2,X+
  85.                 MOVW    #$FF00, XGSWT   ;clear all software triggers
  86.  
  87. ;###########################################
  88. ;# INITIALIZE XGATE VECTOR SPACE #
  89. ;###########################################
  90.  
  91. INIT_XGATE_VECTOR_SPACE
  92.                 MOVB    #(RAM_START_GLOBAL>>12), RPAGE ;set all vectors to dummy service routine
  93.                 LDX     #128
  94.                 LDY     #RAM_START_S12
  95.                 LDD     #XGATE_DUMMY+XGATE_OFFSET
  96. INIT_XGATE_VECTOR_SPACE_LOOP
  97.                 STD     4,Y+
  98.                 DBNE    X,INIT_XGATE_VECTOR_SPACE_LOOP
  99. ;set SCI INTERRUPT VECTOR
  100.                 MOVW    #XGATE_CODE_BEGIN+XGATE_OFFSET, RAM_START_S12+(2*SCI_VEC)
  101.                 MOVW    #XGATE_DATA_BEGIN+XGATE_OFFSET, RAM_START_S12+(2*SCI_VEC)+2
  102.  
  103. ;###########################################
  104. ;# COPY XGATE CODE #
  105. ;###########################################
  106.  
  107. COPY_XGATE_CODE
  108.                 LDX     #XGATE_DATA_BEGIN
  109. COPY_XGATE_CODE_LOOP
  110.                 MOVW    2,X+, 2,Y+
  111.                 MOVW    2,X+, 2,Y+
  112.                 MOVW    2,X+, 2,Y+
  113.                 MOVW    2,X+, 2,Y+
  114.                 CPX     #XGATE_CODE_END
  115.                 BLS     COPY_XGATE_CODE_LOOP
  116.  
  117. ;###########################################
  118. ;# START XGATE #
  119. ;###########################################
  120.  
  121. START_XGATE     MOVW    #(XGE|XGDBGM|XGSWEIF), XGMCTL ;enable XGATE
  122.                 BRA     *
  123.  
  124.                 CPU XGATE
  125.  
  126. ;###########################################
  127. ;# XGATE DATA #
  128. ;###########################################
  129.  
  130.                 ALIGN 2
  131. XGATE_DATA_BEGIN
  132. XGATE_DATA_SCI_PTR ADR  SCI_REGS        ;pointer to SCI register space
  133. XGATE_DATA_MSG_IDX BYT  XGATE_DATA_MSG-XGATE_DATA_BEGIN ;string pointer
  134. XGATE_DATA_MSG  FCC "Hello World!"      ;ASCII string
  135. XGATE_DATA_END  BYT $0D                 ;CR
  136.  
  137. ;###########################################
  138. ;# XGATE CODE #
  139. ;###########################################
  140.  
  141.                 ALIGN 2
  142. XGATE_CODE_BEGIN
  143.                 LDW     R2,(R1,#(XGATE_DATA_SCI_PTR-XGATE_DATA_BEGIN)) ;SCI -> R2
  144.                 LDB     R3,(R1,#(XGATE_DATA_MSG_IDX-XGATE_DATA_BEGIN));msg -> R3
  145.                 LDB     R4,(R1,R3+)     ;curr. char -> R4
  146.                 STB     R3,(R1,#(XGATE_DATA_MSG_IDX-XGATE_DATA_BEGIN));R3 -> idx
  147.                 LDB     R0,(R2,#(SCISR1-SCI_REGS)) ;initiate SCI transmit
  148.                 STB     R4,(R2,#(SCIDRL-SCI_REGS)) ;initiate SCI transmit
  149.                 CMPL    R4,#$0D
  150.                 BEQ     XGATE_CODE_DONE
  151.                 RTS
  152. XGATE_CODE_DONE LDL     R4,#$00         ;disable SCI interrupts
  153.                 STB     R4,(R2,#(SCICR2-SCI_REGS))
  154.                 LDL     R3,#(XGATE_DATA_MSG-XGATE_DATA_BEGIN);reset R3
  155.                 STB     R3,(R1,#(XGATE_DATA_MSG_IDX-XGATE_DATA_BEGIN))
  156. XGATE_CODE_END  RTS
  157. XGATE_DUMMY     EQU XGATE_CODE_END
  158.