home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols200 / vol250 / cpm68k.txt < prev    next >
Text File  |  1986-02-11  |  10KB  |  420 lines

  1. ; An article relating to the following code appeared in the Vol 1 No 5
  2. ; issue of Micro/Systems Journal and is presented here with the per-
  3. ; mission of the publisher. The code alone should be sufficient to
  4. ; use the program.  However, back copies of the article are available from
  5. ; Micro/Systems Journal, Box 1192, Mountainside, NJ 07092.
  6. \p\#12
  7.                             LISTING 1
  8.  
  9.  
  10. ********************************************************************
  11. *                                                                  *
  12. *     A MONITOR FOR THE MOTOROLA 68000 MICROPROCESSOR TO ENABLE    *
  13. *   LOADING PROGRAMS, CHANGING DATA VALUES, AND BEGIN EXECUTION    *
  14. *     AT ANY MEMORY LOCATION.   68000 ASSEMBLY LANGUAGE LISTING.   *
  15. *                                                                  *
  16. *   Copyright (C) 1985, Jack L. Calaway.  All rights reserved.     *
  17. *                                                                  *
  18. ********************************************************************
  19. *
  20.  
  21. * EQUATES
  22. *
  23. DATA    EQU.L    $0FF0010        * CONSOLE UART DATA
  24. STATUS    EQU.L    $0FF0011        * CONSOLE UART STATUS
  25. SDATA    EQU.L    $0FF0020        * DOWN LOAD UART DATA
  26. SSTAT    EQU.L    $0FF0021        * DOWN LOAD UART STATUS
  27. STACK    EQU.L    $0000300        * STACK BELOW CP/M-68K
  28.  
  29.     ORG    $0FD0000
  30.  
  31. *
  32. * START UP CODE FOR GODBOUT CPU
  33. *   ON HARDWARE RESET, PROMS ON CPU BOARD ARE GLOBAL
  34. *
  35.  
  36.     DC.L    $8            * FIRST INSTRUCTION ADDRESS
  37.     DC.L    STACK            * INITAL STACK VALUE
  38.     JSR.L    INIT            * SWITCH PROMS TO REAL ADDRESS
  39.  
  40. *
  41. * DO INITIALIZING TASKS
  42. *
  43.  
  44. INIT:
  45.     MOVEA.L    #STACK,A7        * SET STACK POINTER
  46.  
  47.     BSR    CRLF            * OUTPUT A CR/LF PAIR
  48.     MOVEQ    #$04D,D0        * THEN LOAD AND OUTPUT   
  49.     BSR    OUTCH                   * THE MONITOR SIGN-ON
  50.     MOVEQ    #$036,D0        * MESSAGE: M68K
  51.     BSR    OUTCH
  52.     MOVEQ    #$038,D0        
  53.     BSR    OUTCH
  54.     MOVEQ    #$04B,D0    
  55.     BSR    OUTCH
  56.  
  57. *
  58. * BEGIN PROCESSING COMMANDS.  THE PROGRAM 
  59. * RETURNS TO THIS POINT BETWEEN COMMANDS
  60. START:
  61.     MOVEA.L    #STACK,A7        * RESET STACK POINTER
  62.     BSR    CRLF            * NEXT LINE
  63.     MOVEQ    #$02E,D0        * OUTPUT THE MONITOR
  64.     BSR    OUTCH                   * PROMPT CHARACTER: '.'
  65.     BSR    INCH            * GET A COMMAND
  66.     CMPI.B    #$0D,D0
  67.     BEQ.S    START            * IGNORE CARRIAGE RETURN
  68.     BSR    OUTCH            * ECHO THE CHARACTER
  69.     CMPI.B    #$053,D0        * 'S' = SUBSTITUTE
  70.     BNE.S    START1            * NOT 'S', TRY NEXT COMMAND
  71.     BSR    SUBST            * ON 'S' GO TO SUBSTITUTE
  72.     BSR    CRLF                    * ROUTINE.
  73.     BRA.S    START                   * BACK TO START
  74.  
  75. START1:
  76.     CMPI.B    #$047,D0        * IF COMMAND IS A 'G',
  77.     BNE.S    START2                  * JUMP TO GOTO AND BEGIN
  78.     BSR    GOTO            * EXECUTION
  79.     BSR    CRLF
  80.     BRA.S    START
  81.  
  82. START2:
  83.     CMPI.B    #$04C,D0        * ON 'L' COMMAND, JUMP
  84.     BNE.S    START                   * TO THE LOAD ROUTINE
  85.     BSR    LOAD
  86.     BSR    CRLF
  87.     BRA.S    START                   * NONE OF THE ABOVE
  88.  
  89.  
  90. **********************************************************************
  91. *                                                                    *
  92. *                           GOTO                                     *
  93. *   THIS ROUTINE WILL JUMP TO INPUT ADDRESS AND BEGIN EXECUTION      *
  94. *                                                                    *
  95. **********************************************************************
  96.  
  97.  
  98. GOTO:
  99.     BSR    INADR            * GET THE ADDRESS
  100.     JMP    (A0)            * JUMP TO IT
  101.  
  102. *********************************************************************
  103. *                                                                   *
  104. *                           LOAD                                    *
  105. *   THIS ROUTINE WILL DOWN LOAD AN S-FILE INTO THE 68000 MEMORY     *
  106. *                                                                   *
  107. *********************************************************************
  108.  
  109.  
  110. LOAD:
  111.     BSR    CRLF            * WE ARE HERE
  112.  
  113. *è* FIND THE S-RECORD HEADER
  114. *
  115.  
  116. LOAD1:
  117.     CLR.B    D4            * D4=LENGTH FLAG
  118.     BSR    GCHR            * GET CHARACTER
  119.     CMPI.B    #$053,D0        * IS IT AN 'S'?
  120.     BNE.S    LOAD1            * IF NOT, TRY AGAIN 
  121.     BSR    GCHR
  122.     CMPI.B    #$030,D0        * CHARACTER EQUALS ZERO
  123.     BEQ.S    LOAD1            * TRY AGAIN IF SO
  124.     CMPI.B    #$039,D0        * CHECK FOR FILE END, (9)
  125.     BEQ.S    LOADX            * DONE IF SO
  126.     CMPI.B    #$032,D0        * 4, OR 6 BYTES OF ADDRESS
  127.     BEQ.S    LOAD3
  128.     ADDQ.B    #$001,D4        * PUT 1 IN LENGTH FLAG
  129.  
  130. *
  131. * GET BYTE COUNT
  132. *
  133.  
  134. LOAD3:
  135.     BSR    GHEX            * GET RECORD LENGTH
  136.     MOVE.B    D0,D2            * SAVE IN COUNTER
  137.     SUBI.B    #$03,D2            * ADJUST COUNT, AND TEST
  138.     TST.B    D4            * AND TEST FOR LONG OR SHORT ADDRESS
  139.     BNE.S    LOAD4            * SHORT
  140.     SUBQ.B    #$001,D2        * LONG, SUBTRACT ONE MORE
  141.  
  142. *
  143. * GET LOAD ADDRESS OF RECORD
  144. *
  145.  
  146. LOAD4:
  147.     BSR    GADR            
  148.  
  149. *
  150. * NOW GET FILE DATA
  151. *
  152.  
  153. LOAD2:
  154.     BSR    GHEX            * GET BYTE OF DATA
  155.     MOVE.B    D0,(A0)+        * STORE IN MEMORY 
  156.     SUBQ.B    #$001,D2        * DECREMENT COUNT
  157.     BNE.S    LOAD2            * CONTINUE
  158.     BRA.S    LOAD1            * SKIP CHECKSUM
  159.  
  160.  
  161. LOADX:
  162.     RTS                * RETURN FOR NEW COMMAND
  163.  
  164.  
  165. *
  166. * GET TWO ASCII CHARACTERS FROM SERIAL PORT
  167. * AND CONVERT TO ONE BINARY BYTEè* RETURNS THE DATA IN THE D0 REGISTER
  168. * D1 IS CLOBBERED
  169. *
  170.  
  171. GHEX:
  172.     CLR.B    D1            * CLEAR TEMPORARY
  173.     JSR    CAHEX            * GET HIGH NIBBLE
  174.     ASL.B    #$4,D1                  * SHIFT TEMPORARY LEFT
  175.     OR.B    D0,D1                   * 'OR' WITH D1
  176.     JSR    CAHEX            * GET LOW NIBBLE
  177.     ASL.B    #$4,D1                  * POSITION HIGH NIBBLE
  178.     OR    D1,D0                   * COMBINE LOW AND HIGH
  179.     ANDI.L    #$0000FF,D0
  180.     RTS
  181.  
  182. *
  183. * CONVERT ASCII TO HEX
  184. *
  185.  
  186. CAHEX:
  187.     BSR    GCHR            * GET CHARACTER
  188.     SUBI.B    #$030,D0        * REMOVE ASCII
  189.     CMPI.B    #$00A,D0        * A-F?
  190.     BLT.S    CAHEX1            * NO
  191.     SUBI.B    #$007,D0        * YES, SUBTRACT 7
  192.  
  193. CAHEX1:
  194.     RTS
  195.  
  196. *
  197. * GET LOAD ADDRESS FROM SERIAL PORT
  198. * RETURNS WITH THE ADDRESS IN REGISTER A0
  199. * WORKS JUST LIKE GHEX, BUT DOES 2 OR 3 BYTES
  200. * RATHER THAN JUST ONE
  201. *
  202.  
  203. GADR:
  204.     CLR.L    D3            * TEMPORARY=0
  205.     BSR    GHEX
  206.     ASL.L    #$08,D3            * MAKE ROOM FOR NIBBLE
  207.     OR.L    D0,D3
  208.     BSR    GHEX
  209.     ASL.L    #$08,D3
  210.     OR.L    D0,D3
  211.     TST.B    D4            * LONG OR SHORT ADDRESS?
  212.     BNE.S    GADRX            * SHORT
  213.     BSR    GHEX
  214.     ASL.L    #$08,D3            * LAST BYTE
  215.     OR.L    D0,D3
  216.  
  217. GADRX:
  218.     MOVE.L    D3,A0
  219.     RTS
  220.  
  221. *è* GET SERIAL CHAR
  222. *
  223.  
  224. GCHR:
  225.     ANDI.B    #$02,SSTAT        * ANY WAITING?
  226.     BEQ.S    GCHR            * NO
  227.     MOVE.B    SDATA,D0        * GET IT
  228.     ANDI.B    #$07F,D0        * STRIP HIGH BIT
  229.     RTS
  230.  
  231. *******************************************************************
  232. *                                                                 *
  233. *                        SUBSTITUTE                               *
  234. *   THIS ROUTINE WILL SUBSTITUTE DATA AT ANY MEMORY LOCATION      *
  235. *                                                                 *
  236. *******************************************************************
  237.  
  238.  
  239. SUBST:
  240.     BSR    INADR            * GET ADDRESS
  241.     BSR    CRLF            * CLEAN UP
  242.  
  243. SUBST1:
  244.     BSR    CRLF            * FOR NEW LINE
  245.     BSR    PADR            * PRINT ADDRESS
  246.     MOVEQ    #$020,D0        * SPACE
  247.     BSR    OUTCH
  248.     MOVE.B    (A0),D0
  249.     BSR    PHEX            * PRINT CURRENT DATA
  250.     MOVEQ    #$020,D0
  251.     BSR    OUTCH            * SPACE
  252.     BSR    INCH            * GET KEYBOARD CHAR
  253.     CMPI.B    #$0D,D0            * NEXT ADDRESS?
  254.     BEQ.S    SUBST4            * YES
  255.     BSR    OUTCH            * ECHO
  256.     CMPI.B    #$02E,D0        * PERIOD EQUAL DONE?
  257.     BEQ.S    SUBSTX            * YES, EXIT
  258.  
  259. *
  260. * INPUT NEW BYTE OF DATA 
  261. *
  262.     CLR.B    D1            * CLEAR REGISTER
  263.  
  264. *
  265. * CONVERT 1 OR 2 ASCII CHARACTER
  266. * TO BINARY BYTE
  267. *
  268.  
  269. SUBST2:
  270.     SUBI.B    #$030,D0        * STRIP ASCII
  271.     CMPI.B    #$0A,D0
  272.     BLT.S    SUBST3
  273.     SUBI.B    #$07,D0
  274. SUBST3:
  275.     ANDI.L    #$0000000F,D0è    ASL.L    #$04,D1
  276.     OR.L    D0,D1
  277.     BSR    INCH            * NEXT
  278.     CMPI.B    #$0D,D0            * DONE?
  279.     BEQ.S    SUBST5            * YES
  280.     BSR    OUTCH            * NO
  281.     BRA.S    SUBST2
  282. SUBST5:
  283.     MOVE.B    D1,(A0)            * STORE NEW DATA
  284. SUBST4:
  285.     ADDQ.L    #$001,A0        * NEXT MEMORY ADDRESS
  286.     BRA.S    SUBST1
  287. SUBSTX:
  288.     RTS                * FINI
  289.  
  290. *
  291. * INPUT ADDRESS FROM CONSLOE
  292. * EXIT WITH A0=ADDRESS
  293. *
  294.  
  295. INADR:
  296.     CLR.L    D1            * TEMPORAY = 0
  297. INADR1:
  298.     BSR.S    INCH            * GET ASCII CHARACTER
  299.     CMPI.B    #$0D,D0            * CR=END?
  300.     BEQ.S    INADRX            * YES
  301.     BSR    OUTCH            * SHOW
  302.     SUBI.B    #$030,D0        * STRIP ASCII
  303.     CMPI.B    #$0A,D0            * 0-9
  304.     BLT.S    INADR2
  305.     SUBI.B    #$07,D0            * FOR A-F
  306. INADR2:
  307.     ANDI.L    #$0000000F,D0        * CLEAR
  308.     ASL.L    #$04,D1            * POSITION HIGH NIBBLE
  309.     OR.L    D0,D1            * MAKE ONE BYTE FROM TWO NIBBLES
  310.     BRA.S    INADR1
  311. INADRX:
  312.     MOVE.L    D1,A0            * ADDRESS TO ADDRESS REGISTER
  313.     RTS
  314.  
  315. *
  316. * PRINT ADDRESS
  317. * (A0)=DATA
  318. *
  319.  
  320. PADR:
  321.     MOVEQ    #$04,D2            * PRINT FOUR BYTES
  322.     MOVE.L    A0,D1            * COPY ADDRESS
  323. PADR1:
  324.     ROL.L    #$08,D1            * SHIFT BYTES
  325.     MOVE.B    D1,D0
  326.     ANDI.B    #$0FF,D0
  327.     BSR.S    PHEX            * PRINT BYTE
  328.     SUBQ.B    #$001,D2        * COUNTER -1
  329.     BNE.S    PADR1            * MORE TO PRINTè    RTS
  330.  
  331. *
  332. * PRINT HEX
  333. * D0=DATA
  334. *
  335.  
  336. PHEX:
  337.     MOVE.B    D0,-(SP)        * SAVE LOW NIBBLE
  338.     ROR.B    #$04,D0            * PRINT HIGH NIBBLE FIRST
  339.     BSR.S    PHEX1
  340.     MOVE.B    (SP)+,D0        * GET LOW NIBBLE BACK
  341. PHEX1:
  342.     ANDI.B    #$0F,D0            * CLEAR LOW NIBBLE
  343.     CMP.B    #$0A,D0            * A-F?
  344.     BLT.S    PHEX2            * NO
  345.     ADD.B    #$07,D0            * YES - CORRECT
  346. PHEX2:
  347.     ADD.B    #$030,D0        * MAKE ASCII
  348.     BSR.S    OUTCH
  349.     RTS
  350.  
  351. *
  352. * CRLF TO CONSOLE
  353. *
  354.  
  355. CRLF:
  356.     MOVEQ    #$0D,D0            * CR
  357.     BSR.S    OUTCH
  358.     MOVEQ    #$0A,D0            * LF
  359.  
  360. *
  361. * PRINT CHAR IN REG D0 TO CONSOLE
  362. *
  363.  
  364. OUTCH:
  365.     ANDI.B    #$01,STATUS        * BUSY?
  366.     BEQ.S    OUTCH            * YES
  367.     MOVE.B    D0,DATA            * SEND
  368.     RTS
  369.  
  370. *
  371. * INPUT CHAR FROM CONSOLE
  372. *
  373.  
  374. INCH:
  375.     ANDI.B    #$02,STATUS        * WAITING
  376.     BEQ.S    INCH            * NO
  377.     MOVE.B    DATA,D0            * GET IT
  378.     ANDI.B    #$07F,D0        * CLEAR HIGH BIT
  379.     RTS
  380.  
  381. *********************************************************************
  382. *                                                                   *
  383. *           T H A T ' S   A L L  F O L K S                          *è*                                                                   *
  384. *********************************************************************
  385.  
  386.     END
  387.  
  388. -----------------------------------------------------------------
  389.  
  390.                             LISTING 2
  391.  
  392.  
  393. ****************************************************************
  394. *                                                              *
  395. *                        BTEST                                 *
  396. *      A PROGRAM TO TEST THE BIOS CHANGES IN 68000 SYSTEM.     *
  397. *             *  WRITTEN BY J. L. CALAWAY, 03/17/85            *
  398. *                                                              *
  399. ****************************************************************
  400.  
  401. *
  402. * ENTER THIS TEST PROGRAM WITH A CALL AFTER FIRST PATCHING THE
  403. * REQUIRED VALUES IN REGISTERS D0, D1, AND D2 WITH THE MONITOR.
  404. *
  405.  
  406.     ORG.L    $002000    
  407.  
  408.     MOVE.L    #$00000000,D0        * MOVE PATCHED DATA
  409.     MOVE.L  #$00000000,D1        * TO REGISTERS
  410.     MOVE.L  #$00000000,D2        
  411.  
  412.     TRAP    #3            * READ CONSOLE CHAR IN
  413.  
  414.     MOVE.L    D0,RESULT        * RETURN FROM TRAP WITH
  415.     RTS                * DATA IN 'RESULT' REGISTER
  416.                                         * D0; SAVE IN MEMORY LOCATION
  417. RESULT: DC.L    $0
  418.  
  419.     END