home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / prog / utils / adev1120.lha / examples / monitor / download.a < prev    next >
Text File  |  1992-09-18  |  6KB  |  345 lines

  1.         PROCESSOR 68HC11
  2. *
  3. * "DOWNLOAD"
  4. *
  5. * DESCRIPTION:
  6. *
  7. *    DOWNLOAD is a monitor that resides within the EEPROM of the HC11.
  8. *    Its main task is to initialize the HC11 and download S record
  9. *    format files into external RAM for execution.  Among initialization
  10. *    tasks are the definition of the memory map and the chip selects.
  11. *    All external memory locations are also tested prior to
  12. *    proceeding with the monitor function.
  13. *
  14. *
  15. * INCLUDE FILES
  16. *
  17. REG_FILE EQU    $9000        *START LOCATION OF REGISTER FILE
  18.     INCLUDE ADev11:68HC11.INC
  19. *
  20. *
  21. *
  22.  
  23.     XREF    SCI_JMP,SPI_JMP,PULSE_IN_JMP,PULSE_OVF_JMP,TIMER_OVF_JMP
  24.     XREF    TIMER_IC4_JMP,TIMER_OC4_JMP,TIMER_OC3_JMP,TIMER_OC2_JMP
  25.     XREF    TIMER_OC1_JMP,TIMER_IC3_JMP,TIMER_IC2_JMP,TIMER_IC1_JMP
  26.     XREF    RT_INTR_JMP,IRQ_JMP,XIRQ_JMP,SWI_JMP,OPC_JMP,COP_FAIL_JMP
  27.     XREF    MON_FAIL_JMP
  28.     XREF    EXT_TABLE
  29.     XREF    STACK,CHECKSUM,KEY1,KEY2,I_BUFFER
  30.  
  31. ZPAGE_SIZE    EQU    $100
  32. USR_RAM_SIZE    EQU    $8000-ZPAGE_SIZE
  33. STACK_SIZE    EQU    $100
  34. *
  35.         SEG.U    EXT_RAM
  36. USR_RAM
  37.  
  38.  
  39.     SEG    EEPROM
  40.  
  41.     jmp    GETC
  42.     jmp    GETS
  43.     jmp    PUTC
  44.     jmp    PUTS
  45.     jmp    PCRLF
  46.     jmp    RDBYTE
  47.     jmp    str_cmp
  48.  
  49. START
  50.     LDS    #STACK+STACK_SIZE-1
  51.  
  52.     LDAA    #$89        HC11 ram @ $8000, regs @ $9000
  53.     STAA    INIT
  54.  
  55.     LDX    #REG_FILE
  56.     LDAA    #$90        enable A/D system, STOP delay on
  57.     STAA    OPTION-REG_FILE,X
  58.  
  59.     LDAA    #$00
  60.     STAA    PORTG-REG_FILE,X
  61.     LDAA    #$7F
  62.     STAA    DDRG-REG_FILE,X
  63.  
  64. *            SETUP CHIP SELECT OUTPUTS
  65.     LDAA    #$08        CSGEN has priority, others disabled
  66.     STAA    CSCTL-REG_FILE,X
  67.     LDAA    #$01        CSGEN accesses 32K,active low
  68.     STAA    CSGSIZ-REG_FILE,X
  69.     LDAA    #$00
  70.     STAA    CSGADR-REG_FILE,X
  71.  
  72.     ldaa    #$21        divider = 19.2 Kbaud range, baud = 9600
  73.     staa    BAUD-REG_FILE,X
  74.     ldaa    #$0C
  75.     staa    SCCR2-REG_FILE,X
  76.  
  77.  
  78. *** MEMORY CHECKS ***
  79. mem_chk
  80. *** non-destructive read/write check
  81.     LDX    #USR_RAM    *SETUP POINTER TO RAM
  82. NEXT_ADDR_CHK
  83.     ldaa    0,X
  84.     coma
  85.     staa    0,X        *WRITE DATA TO EXTERNAL RAM
  86.     cmpa    0,X
  87.     bne    MEM_ERR2
  88.     coma
  89.     staa    0,X
  90.     cmpa    0,X
  91.     bne    MEM_ERR2
  92.     inx
  93.     CPX    #USR_RAM+USR_RAM_SIZE    *CHECK IF LAST LOCATION EXCEEDED
  94.     BNE    NEXT_ADDR_CHK    *NO, THEN CONTINUE RAM CHECK
  95.     bra    INIT_SYS
  96. MEM_ERR2
  97.     LDX    #MEM_FAULT
  98.     bsr    PUTS
  99.  
  100. INIT_SYS
  101. *** CHECK FOR PREVIOUS PROGRAM (BEFORE BOOT)
  102.     LDD    KEY1
  103.     cpd    #REF_KEY1
  104.     bne    INIT_CLEAR
  105.     ldd    KEY2
  106.     cpd    #REF_KEY2
  107.     beq    INIT_WITH_PROGRAM
  108. INIT_CLEAR
  109.     ldd    #0        *INITIALIZE PROGRAM VECTOR TO FALSE
  110.     std    EXT_TABLE
  111.     bra    SYS_START
  112. INIT_WITH_PROGRAM
  113.     ldx    EXT_TABLE
  114. INIT_W0    ldaa    0,x        find and execute first command in program
  115.     beq    INIT_W1
  116.     inx
  117.     bra    INIT_W0
  118. INIT_W1    inx
  119.     ldx    0,x
  120.     jsr    0,x
  121.  
  122. *
  123. *
  124. *
  125. SYS_START
  126.     bsr    PCRLF
  127. MONITOR
  128.     ldaa    #'>
  129.     bsr    PUTC
  130.     ldx    #I_BUFFER
  131.     bsr    GETS        *get a line of text, X -> line
  132.     ldy    #FUNC_TABLE
  133.     jsr    SCAN_FUNC_TABLE
  134.     bne    MONITOR        *a function match was found
  135. *
  136.     ldy    EXT_TABLE    *CHECK IF EXTERNAL TABLE SET
  137.     beq    MON_ERR
  138.     jsr    SCAN_FUNC_TABLE
  139.     bne    MONITOR
  140. MON_ERR    ldx    #NO_FUNC_STR
  141.     bsr    PUTS
  142.     bra    MONITOR
  143. *
  144. *
  145. *
  146. * GETS
  147. GETS    pshx
  148. gets1    bsr    GETC
  149.     bsr    PUTC
  150.     cmpa    #$D
  151.     beq    gets2
  152.     cmpa    #$A
  153.     beq    gets2
  154.     staa    0,x
  155.     inx
  156.     bra    gets1
  157. gets2    clr    0,x
  158.     bsr    PCRLF
  159.     pulx
  160.     rts
  161. *
  162. *
  163. *
  164. GETC    ldaa    SCSR
  165.     bita    #RDRF
  166.     beq    GETC
  167.     ldaa    SCDR
  168.     rts
  169. *
  170. PCRLF    LDX    #CRLF
  171.     bra    PUTS
  172. *
  173. *
  174. puts1    bsr    PUTC
  175.     inx
  176. PUTS    ldaa    0,x
  177.     bne    puts1
  178.     rts
  179. *
  180. *
  181. * char in A
  182. PUTC    ldab    SCSR
  183.     bitb    #TDRE
  184.     beq    PUTC
  185.     staa    SCDR
  186.     rts
  187. *
  188. *
  189. DO_S0
  190.     rts
  191. *
  192. DO_S1
  193.     bsr    RD_SREC
  194.     inc    CHECKSUM    $FF -> $00
  195.     beq    NO_ERR_S1
  196. ERR_S1    ldx    #CHK_FAIL_STR
  197.     bsr    PUTS
  198. NO_ERR_S1    rts
  199. *
  200. DO_S9
  201.     BSR    RD_SREC
  202.     inc    CHECKSUM    $FF -> $00
  203.     bne    ERR_S1
  204.  
  205.     LDD    #REF_KEY1
  206.     STD    KEY1
  207.     LDD    #REF_KEY2
  208.     STD    KEY2
  209.  
  210.     jmp    0,y
  211.  
  212. *
  213. RD_SREC    clr    CHECKSUM
  214.     BSR    RDBYTE        *READ BYTE COUNT OF S1 RECORD INTO ACCB
  215.     TBA            *STORE IT IN ACCA
  216.     BSR    GETADR        *GET LOAD ADDRESS INTO Y REGISTER
  217.     SUBA    #3        *REMOVE LOAD ADDRESS & CHECKSUM BYTES FROM COUNT
  218.     beq    RDBYTE        if no data bytes read checksum
  219. NEXT_BYTE
  220.     BSR    RDBYTE
  221.     STAB    0,Y        STORE BYTE AT ADDRESS
  222.     INY            *ADVANCE TO NEXT LOAD ADDRESS
  223.     DECA            WHEN ALL BYTES read, read checksum
  224.     BNE    NEXT_BYTE
  225.  
  226. * WARNING!!! - flows into RDBYTE
  227.  
  228. *                *READ DATA BYTE
  229. RDBYTE    psha
  230.     LDAB    2,X        *1st READ MS NIBBLE
  231.     INX
  232.     BSR    HEXBIN        *CONVERT TO BINARY
  233.     LSLB            *AND MOVE TO UPPER NIBBLE
  234.     LSLB
  235.     LSLB
  236.     LSLB
  237.     tba
  238.     LDAB    2,X        *GET ASCII CHAR IN ACCB
  239.     INX
  240.     BSR    HEXBIN
  241.     aba
  242.     tab
  243.     adda    CHECKSUM
  244.     staa    CHECKSUM
  245.     pula
  246.     RTS            *RETURN WITH BYTE IN ACCB
  247. *
  248. GETADR
  249.     PSHA            *SAVE BYTE COUNTER
  250.     BSR    RDBYTE        *READ MS BYTE OF ADDRESS
  251.     TBA            *AND PUT IT IN MSBYTE OF ACCD
  252.     BSR    RDBYTE        *READ LS BYTE OF ADDRESS INTO LS BYTE OF ACCD
  253.     XGDY            *PUT LOAD ADDRESS IN Y
  254.     PULA            *RESTORE BYTE COUNTER
  255.     RTS            *AND RETURN
  256. *
  257. *                *CONVERT ASCII HEX TO BINARY
  258. HEXBIN
  259.     CMPB    #'9        *IF ACCB>9 THEN ASSUME ITS A-F
  260.     BLS    HEXNUM
  261.     ADDB    #9
  262. HEXNUM
  263.     ANDB    #$F
  264.     RTS
  265.  
  266. *
  267. * X must not change, Y must move to char past null, terms on null of Y
  268. str_cmp    pshx
  269. str_cmp_1    ldaa    0,y
  270.     beq    str_cmp_pass
  271.     cmpa    0,x
  272.     bne    str_cmp_fail
  273.     inx
  274.     iny
  275.     bra    str_cmp_1
  276. str_cmp_fail    iny
  277.     ldaa    0,y
  278.     bne    str_cmp_fail
  279.     iny
  280.     ldaa    #1
  281.     pulx
  282.     rts
  283. str_cmp_pass    iny
  284.     clra
  285.     pulx
  286.     rts
  287. *
  288. *
  289. SCAN_FUNC_TABLE
  290.     bsr    str_cmp
  291.     beq    do_func
  292.     iny
  293.     iny
  294.     tst    0,y
  295.     bne    SCAN_FUNC_TABLE
  296.     rts
  297. do_func    ldy    0,y
  298.     jsr    0,y
  299.     ldaa    #1        clear Z flag
  300.     rts
  301. *
  302. *
  303. *
  304. FUNC_TABLE
  305.     DC.B    "S0",0
  306.     DC.W    DO_S0
  307.     DC.B    "S1",0
  308.     DC.W    DO_S1
  309.     DC.B    "S9",0
  310.     DC.W    DO_S9
  311.     DC.B    0
  312. *
  313. REF_KEY2    FDB $D709
  314. REF_KEY1    FDB $EB35    complement of inside nybbles
  315.  
  316. NO_FUNC_STR    FCB "Command Not Found",$D,$A,0
  317. CHK_FAIL_STR    FCB "Checksum Error"    flows into next string
  318. CRLF        FCB $D,$A,0
  319. MEM_FAULT    FCB "Memory Fault",0
  320.  
  321.     SEG    VECTORS
  322.     FDB    SCI_JMP
  323.     FDB    SPI_JMP
  324.     FDB    PULSE_IN_JMP
  325.     FDB    PULSE_OVF_JMP
  326.     FDB    TIMER_OVF_JMP
  327.     FDB    TIMER_IC4_JMP
  328.     FDB    TIMER_OC4_JMP
  329.     FDB    TIMER_OC3_JMP
  330.     FDB    TIMER_OC2_JMP
  331.     FDB    TIMER_OC1_JMP
  332.     FDB    TIMER_IC3_JMP
  333.     FDB    TIMER_IC2_JMP
  334.     FDB    TIMER_IC1_JMP
  335.     FDB    RT_INTR_JMP
  336.     FDB    IRQ_JMP
  337.     FDB    XIRQ_JMP
  338.     FDB    SWI_JMP
  339.     FDB    OPC_JMP
  340.     FDB    COP_FAIL_JMP
  341.     FDB    MON_FAIL_JMP
  342.     FDB    START
  343.  
  344.     END
  345.