home *** CD-ROM | disk | FTP | other *** search
/ Peanuts NeXT Software Archives / Peanuts-2.iso / Developer / hardware / dsp / drbub / sloader.asm < prev    next >
Encoding:
Assembly Source File  |  1991-09-07  |  6.1 KB  |  167 lines

  1. ; sloader.asm
  2. ; Wed Aug  2 23:56:14 PDT 1989
  3. ; This file originally came from Motorola's Dr. BuB DSP board.
  4. ; Slightly modified by Todd Day (todd@ivucsb.sba.ca.us)
  5. ;    to echo characters received.
  6.  
  7. ;       Serial Loader for the DSP56000.
  8. ;       This loader initializes the serial communications interface (SCI)
  9. ;       on the DSP56001 for 9600 baud and then loads OMF records (output
  10. ;       by the DSP56000 assembler) into internal memory.  The loader takes
  11. ;       the upper 128 bytes of P memory allowing the lower memory from
  12. ;       $0000-(LDRMEM-1) to be used by the user.  The following records are
  13. ;       interpreted:
  14. ;           _DATA X ADDR
  15. ;           _DATA Y ADDR
  16. ;           _DATA P ADDR
  17. ;           _END ADDR
  18. ;       After the END record is encountered, the loader jumps to the address
  19. ;       in the END record.  Note that an address MUST be present in the
  20. ;       END record (the program must contain at least one P segment).
  21. ;
  22. ;       To generate a EPROM of this loader (8Kx8), perform the following:
  23. ;       $ asm56000 -b -l -a sloader
  24. ;       $ srec sloader
  25. ;
  26. ;       The EPROM is in file SLOADER.P.  To program the EPROM, set the
  27. ;       programmer to MOTOROLA S record format, download the file with
  28. ;       a zero address offset and program the part.
  29. ;
  30. ;    BTW, S record format is LSB MidSB MSB (what! Intel format? :-)
  31. ;    Took me a few hours to figure this one out!
  32. ;
  33. ;    If you don't have the program srec (where can I get this?),
  34. ;    you have to do some gnarly contortions on the .LOD file.
  35. ;
  36. ;    So, if your .LOD file resulting from compiling this program
  37. ;    looks like this:
  38. ;
  39. ;    _START SLOADER 0000 0000
  40. ;
  41. ;    _DATA P 0020
  42. ;    010203 040506 070809
  43. ;    _END 0020
  44. ;
  45. ;    then, program your PROM with this sequence:
  46. ;    $0020    0302  0106  0504  0908  07..... etc. (Fun, eh? :)
  47. ;
  48. ;
  49. ;       The loader loads the following memory spaces:
  50. ;           X - 0 to FF
  51. ;           Y - 0 to FF
  52. ;           P - 0 to LDRMEM-1
  53. ;
  54.         PAGE    68,66,1,1
  55.  
  56. SCR     EQU     $FFF0           ;SCI CONTROL REGISTER
  57. SCCR    EQU     $FFF2           ;SCI CLOCK CONTROL REGISTER
  58. PCC     EQU     $FFE1           ;PORT C CONTROL REGISTER
  59. RDRF    EQU     $2              ;RECEIVE DATA REGISTER FULL FLAG
  60. SSR     EQU     $FFF1           ;SCI STATUS REGISTER
  61. SRXH    EQU     $FFF6           ;SCI RECEIVE IN HIGH BYTE
  62. LDRMEM  EQU     $19D            ;START OF LOADER IN P MEMORY
  63.  
  64.         ORG     P:$0000         ;RESET VECTOR FOR BOOTING
  65. RVEC
  66.         JMP     LOAD            ;GO EXECUTE LOADER
  67.  
  68.         ORG     P:LDRMEM,P:3*LDRMEM
  69. LOAD
  70.         MOVEP   #$0302,X:SCR    ;ENABLE TX,RX: 8 BIT 1 START, 1 STOP
  71.  
  72.                 ; *** You will probably have to
  73.                 ; *** change the line below!
  74.         MOVEP   #$0020,X:SCCR   ;CD=32 (/33), INT CLK @ 9600 BAUD
  75.         MOVEP   #$0007,X:PCC    ;ENABLE SCI
  76. WTUS
  77.         JSR     GETCH           ;INPUT CHARACTER
  78.         MOVE    #'_',X0         ;GET UNDERSCORE CHARACTER
  79.         CMP     X0,A            ;SEE IF "_" YET
  80.         JNE     WTUS            ;NO
  81. GOTUS
  82.         JSR     GETCH           ;GET A CHARACTER
  83.         MOVE    #'D',X0         ;GET A D FOR DATA
  84.         CMP     X0,A    #'E',X0 ;COMPARE TO D, GET E
  85.         JEQ     DATAREC         ;IF "D", THEN DATA RECORD
  86.         CMP     X0,A            ;SEE IF END RECORD
  87.         JNE     WTUS            ;NO, GO WAIT FOR ANOTHER UNDERSCORE
  88. _WTSPC
  89.         JSR     GETCH           ;GET CHARACTER
  90.         MOVE    #$20,X0         ;GET SPACE
  91.         CMP     X0,A            ;WAIT FOR SPACE AFTER "END"
  92.         JNE     _WTSPC          ;WAIT FOR SPACE
  93.         JSR     IN4             ;GET TRANSFER ADDRESS
  94.         MOVE    B1,R0           ;MOVE TRANSFER ADDRESS
  95.         NOP                     ;CLEAR ADDRESS PIPE
  96.         JMP     (R0)            ;GO EXECUTE USER CODE
  97. DATAREC
  98.         JSR     GETCH           ;GET CHARACTER
  99.         MOVE    #$20,X0         ;GET SPACE
  100.         CMP     X0,A            ;SEE IF SPACE
  101.         JNE     DATAREC         ;NO
  102.         JSR     GETCH           ;GET [P,X,Y]
  103.         MOVE    A1,Y0           ;SAVE CHARACTER
  104.         JSR     IN4             ;GET ADDRESS OF DATA RECORD
  105.         MOVE    B1,R0           ;SAVE ADDRESS
  106.         MOVE            #'X',A  ;GET X
  107.         CMP     Y0,A    #'Y',A  ;SEE IF X, GET Y
  108.         JEQ     _LDX            ;LOAD DATA INTO X MEMORY
  109.         CMP     Y0,A            ;SEE IF Y
  110.         JEQ     _LDY            ;LOAD DATA INTO Y MEMORY
  111. _LDP
  112.         JSR     IN6             ;GET DATA
  113.         MOVE    B1,P:(R0)+      ;LOAD P MEMORY
  114.         JMP     _LDP
  115. _LDX
  116.         JSR     IN4             ;GET DATA
  117.         MOVE    B1,X:(R0)+      ;LOAD X MEMORY
  118.         JMP     _LDX
  119. _LDY
  120.         JSR     IN4             ;GET DATA
  121.         MOVE    B1,Y:(R0)+      ;LOAD Y MEMORY
  122.         JMP     _LDY
  123.  
  124. GETCH
  125.         JCLR    #RDRF,X:SSR,*   ;WAIT FOR DATA IN SCI
  126.         MOVEP   X:SRXH,A        ;GET SCI DATA IN HIGH BYTE
  127.         LSL     A               ;SHIFT OUT PARITY
  128.         LSR     A               ;PUT 0 IN PARITY BIT
  129.         MOVE    A1,A            ;SIGN EXTEND AND ZERO
  130.     MOVEP    A,X:SRXH    ;put sci data in high byte
  131.         RTS
  132.  
  133. IN4
  134.         CLR     B       #>4,X0  ;CLEAR VALUE, GET 4
  135.         JMP     READHEX         ;READ 4 HEX CHARACTERS
  136. IN6
  137.         CLR     B       #>6,X0  ;CLEAR VALUE, GET 6
  138. READHEX
  139.         DO      X0,_READHEX     ;READ ASCII HEX AND CONVERT TO BINARY
  140. _GET
  141.         JSR     GETCH           ;GET A CHARACTER
  142.         MOVE    #'_',X0         ;GET UNDERSCORE
  143.         CMP     X0,A    #'F',X0 ;SEE IF UNDERSCORE
  144.         JNE     _NOTUS          ;NO
  145.         ENDDO                   ;EXIT LOOP
  146.         MOVE    SSH,X0          ;POP RETURN ADDRESS
  147.         JMP     GOTUS           ;GO PROCESS NEW INPUT RECORD
  148. _NOTUS
  149.         CMP     X0,A    #'0',X0 ;SEE IF GREATER THAN F
  150.         JGT     _GET            ;YES, IGNORE
  151.         CMP     X0,A            ;SEE IF LESS THAN 0
  152.         JLT     _GET            ;YES, IGNORE
  153.         SUB     X0,A    #10,X0  ;ADJUST FOR ASCII TO BINARY
  154.         CMP     X0,A    #7,X0   ;SEE IF A-F
  155.         JLT     _NOTALPHA       ;NO
  156.         SUB     X0,A            ;ADJUST FOR 1-F
  157. _NOTALPHA
  158.         REP     #4              ;SHIFT OLD VALUE LEFT 1 NIBBLE
  159.         LSL     B
  160.         REP     #16             ;SHIFT NEW NIBBLE DOWN TO LSB
  161.         LSR     A
  162.         ADD     A,B             ;ADD NEW NIBBLE IN
  163. _READHEX
  164.         RTS
  165.  
  166.         END
  167.