home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / develop / hc11dev / talkers / talker51.asc < prev    next >
Text File  |  1995-02-27  |  8KB  |  214 lines

  1. ************************ TALKER51.ASC 9/8/89 *****************************
  2. *   Written by R.Soja, Motorola, East Kilbride                           *
  3. *   Motorola Copyright 1989                                              *
  4. *   MCU resident, Interrupt driven Communication routines for HC11JC     *
  5. *   monitor. Provides low level memory and stack read/write operations.  *
  6. *   Works with Host user interface program PCBUG11.EXE and 65C51 ACIA.   *
  7. *   Includes subroutine to boot up DSP56001 with code to simulate SPI2.  *
  8. *
  9. * CONSTANTS
  10. TALKBASE  equ $6000
  11. TALKVECT  equ $FFF4       Start address of vectors used by TALKER51
  12. ACIA      equ $9000
  13. uS500     equ 1000/7      500uS delay with DEY/BNE loop
  14. BRKCODE   equ $4A         Break point signal code to host.
  15. BRKACK    equ $B5         Break point acknowledge code from host.
  16. *
  17. * ACIA MASKS
  18. TDRE      equ $10
  19. RDRF      equ $08
  20. FE        equ $02
  21. *
  22. * PROGRAM
  23.           org TALKBASE
  24. *
  25. TALKSTART EQU *
  26.           LDS #$1FF
  27.           LDD #$C91E    Init ACIA to 9600 baud, 8 bit, no parity, Rx intr.
  28.           STD ACIA+2    Note: Control reg set up for 1.843MHz xtal.
  29.           JSR LOADSPI2  Load DSP and start it.
  30. *
  31. USERSTART EQU *         This is entry point of user defined reset.
  32.           TPA           XIRQ must be enabled (Clear X bit in CCR)
  33.           ANDA #$BF
  34.           TAP
  35. IDLE      JMP IDLE      Now hang around for interruption from host.
  36. * A RESET from host changes above jump destination to start of user code.
  37. *
  38. XIRQSRV   EQU *
  39.           LDAA ACIA+1   If ACIA has generated interrupt, then
  40.           BMI TXIRQ     Talker code processes received data
  41.           JMP >TXIRQEX
  42. * Above 3 bytes are replaced by JMP USERXIRQ instruction from host monitor, if
  43. * user specified XIRQ vector is detected during download of user code.
  44. *
  45. XIRQUJMP  EQU *-2       Label equates to JMP operand.
  46. *
  47. TXIRQ     EQU *
  48.           LDAA ACIA     Read command byte, & echo it as acknowledge
  49.           BSR OUTACIA   to host.
  50.           BMI INH1      If command bit 7 set, then process inherent command
  51.           BSR INACIA    else read byte count from host into ACCB.(0=256)
  52.           XGDX          Save command and byte count.
  53.           BSR INACIA    Read high address byte
  54.           TBA           into ACCA
  55.           BSR INACIA    then low address byte into ACCB
  56.           XGDX          Restore command in ACCA,count in ACCB,address in X
  57.           CMPA #$01
  58.           BNE TXIRQ1    If command is memory read, then
  59. *
  60. TREADMEM  EQU *         REPEAT
  61.           LDAA ,X       read required address
  62.           BSR OUTACIA   send it to host
  63.           TBA           (save byte count)
  64.           BSR INACIA    and wait for acknowledge
  65.           TAB           (restore byte count)
  66.           INX           Increment address
  67.           DECB          Decrement byte count
  68.           BNE TREADMEM  UNTIL all done
  69.           RTI           and return to idle loop or user code.
  70. *
  71. TXIRQ1    EQU *
  72.           CMPA #$41
  73.           BNE TXIRQEX   If command is memory write then
  74. *
  75.           TBA           move byte count to ACCA
  76. TWRITMEM  EQU *         REPEAT
  77.           BSR INACIA    Read next byte from host into ACCB,
  78.           STAB ,X       and store at required address.
  79.           LDY #20000/14 Set up timeout count of ~10mS
  80. *
  81. WAITPOLL  CMPB ,X       Wait until read back data matches written data
  82.           BEQ WAITEND
  83.           DEY           or timeout reached,
  84.           BNE WAITPOLL
  85.           BRA USERSTART in which case, restart without reloading DSP.
  86. *
  87. WAITEND   LDAB ,X       Read stored byte and
  88.           STAB ACIA     echo it back to host,
  89.           INX
  90.           DECA          Decrement byte count
  91.           BNE TWRITMEM  UNTIL all done
  92. *
  93.           LDY #4000/7   Wait ~2mS to permit PCBUG11 to enable write protect
  94. TXWAITEX  DEY
  95.           BNE TXWAITEX
  96. TXIRQEX   RTI           and return
  97. *
  98. INACIA    EQU *
  99.           LDAB ACIA+1
  100.           BITB #FE      If break detected then
  101.           BEQ INACIA1   clean up stack and
  102.           LDS #$1FF     restart from user start,
  103.           BRA USERSTART
  104. *
  105. INACIA1   ANDB #RDRF    else if new data received from host
  106.           BEQ INACIA
  107.           LDAB ACIA     then read it
  108.           RTS           and return with data in ACCB
  109. *
  110. OUTACIA   EQU *         Only register Y modified.
  111.           XGDY          Enter with data to send in ACCA, saved in Y
  112. OUTACIA1  LDAA ACIA+1
  113.           ANDA #TDRE
  114.           BEQ OUTACIA1
  115.           XGDY          Restore ACCA
  116.           LDY #$180
  117. OUTDELAY  DEY           Wait until transmission complete (@ 9600 baud)
  118.           BNE OUTDELAY  (to fix spurious loss of transmitted character!)
  119.           STAA ACIA     Important - Updates CCR!
  120.           RTS
  121. *
  122. INH1      EQU *
  123.           CMPA #$81     If command is read MCU registers then
  124.           BNE INH2
  125. *
  126. INH1A     TSX           Move stack pointer to X
  127.           XGDX          then to ACCD
  128.           BSR OUTACIA   send stack pointer to host (high byte first)
  129.           TBA
  130.           BSR OUTACIA   then low byte
  131.           TSX           Restore X (=stack pointer)
  132.           LDAB #9       then return 9 bytes on stack
  133.           BRA TREADMEM  i.e. CCR,ACCB,ACCA,IXH,IXL,IYH,IYL,PCH,PCL
  134. *
  135. INH2      EQU *
  136.           CMPA #$C1     If command is write MCU registers then
  137.           BNE SWISRV1
  138. *
  139.           BSR INACIA    get stack pointer from host (High byte first)
  140.           TBA
  141.           BSR INACIA
  142.           XGDX          Move to X reg
  143.           TXS           and copy to stack pointer
  144.           LDAA #9       Then put next 9 bytes from host on to stack
  145.           BRA TWRITMEM
  146. *
  147. SWISRV    EQU *         Breakpoints generated by host-placed SWI instruction.
  148.           LDAA #BRKCODE Force host to process breakpoints
  149.           BSR OUTACIA   by sending it the break signal
  150. SWIIDLE   BRA SWIIDLE   then wait for response from host. (Ibit=1,Xbit=0)
  151. *
  152. SWISRV1   EQU *
  153.           CMPA #BRKACK  If host has acknowledged breakpoint state then
  154.           BNE TXIRQEX
  155.           TSX           move stack pointer to SWI stack frame and
  156.           LDAB #9
  157.           ABX
  158.           TXS
  159.           LDD 7,X       Send user code breakpoint return address to host
  160.           BSR OUTACIA   (high byte first)
  161.           TBA
  162.           BSR OUTACIA   (low byte next)
  163.           LDD #IDLE     force idle loop on return from breakpoint processing
  164.           STD 7,X
  165.           BRA INH1A     but first return all MCU registers to host
  166. *
  167. ILLOPSRV  equ *
  168.           STOP
  169.           BRA ILLOPSRV
  170. *
  171. ***************************************************************************
  172. *             Loader for LME HC11FCCSIC SPI2 code.                        *
  173. *     SPI2 is simulated by the DSP56001 running in bootstrap mode.        *
  174. *                                                                         *
  175. *                                                                         *
  176. LOADSPI2  LDX #SPI2CODE
  177. *
  178. LOADINIT  LDY #$8005       Set up pointers to load DSP code into its host
  179.           LDAB #3          receive registers.
  180. LOADBYTE  LDAA ,X
  181.           STAA ,Y
  182.           INY
  183.           INX
  184.           DECB
  185.           BNE LOADBYTE
  186.           CPX #SPI2END
  187.           BLS LOADINIT
  188.  
  189. *
  190.           LDX #$8000       Now start execution of DSP code in internal RAM
  191.           BSET 0,X,#8      by setting HF0 bit in ICR register.
  192.           RTS
  193. *
  194. SPI2CODE  EQU *
  195.           FCB $08,$F4,$AC,$00,$00,$01,$08,$F4,$AD,$00,$3E,$3F,$08,$F4,$A1,$00
  196.           FCB $01,$F8,$08,$F4,$A0,$00,$00,$01,$65,$F4,$00,$00,$FF,$E8,$67,$F4
  197.           FCB $00,$00,$FF,$EB,$66,$F4,$00,$00,$FF,$EF,$30,$08,$00,$31,$18,$00
  198.           FCB $0A,$65,$23,$0A,$65,$04,$46,$F4,$00,$00,$80,$00,$47,$F4,$00,$00
  199.           FCB $00,$80,$25,$00,$00,$0A,$A9,$80,$00,$00,$17,$45,$65,$00,$44,$E7
  200.           FCB $00,$20,$00,$D0,$50,$66,$00,$0A,$AE,$87,$00,$00,$1D,$44,$E6,$00
  201.           FCB $20,$00,$C0,$54,$67,$00,$60,$65,$00,$0A,$A9,$80,$00,$00,$17,$61
  202.           FCB $65,$00,$44,$E7,$00,$0C,$00,$17
  203. SPI2END   EQU *
  204. *
  205.           org TALKVECT
  206.           FDB XIRQSRV
  207.           FDB TXIRQEX   SWI (Changed by Break and Trace monitor cmds)
  208.           FDB ILLOPSRV
  209.           FDB TXIRQEX   COP Software fail (Unused)
  210.           FDB TXIRQEX   COP Clock Monitor fail (Reassigned by PCBUG11 Reset)
  211.           FDB TALKSTART
  212. *
  213.           END
  214.