home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / robot / robot.asm next >
Assembly Source File  |  1991-07-09  |  20KB  |  321 lines

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ; ROBOT MOTION PROGRAM 1.00.00                                                ;
  3. ;                                                                             ;
  4. ; REVISION 7-9-90                                                             ;
  5. ;                                                                             ;
  6. ;                                                                             ;
  7. ;                                                                             ;
  8. ;                                                                             ;
  9. ;                                                                             ;
  10. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  11.  
  12.  
  13. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  14. ;                                                                             ;
  15. ;   INITIALIZE MEMORY LOCATIONS                                               ;
  16. ;                                                                             ;
  17. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  18.  
  19. HEAD       .EQU 32H              ;HEAD VALUE OF FORWARD TABLE
  20. TAIL       .EQU 35H              ;TAIL VALUE OF FORWARD TABLE
  21. RIGHTHEAD  .EQU 36H              ;HEAD VALUE OF RIGHT TURN TABLE
  22. RIGHTTAIL  .EQU 39H              ;TAIL VALUE OF RIGHT TURN TABLE
  23. LEFTHEAD   .EQU 3AH              ;HEAD VALUE OF LEFT TURN TABLE
  24. LEFTTAIL   .EQU 3DH              ;TAIL VALUE OF LEFT TURN TABLE
  25. STEPRIGHT  .EQU 3EH              ;RIGHT MOTOR STEP COUNT
  26. STEPLEFT   .EQU 3FH              ;LEFT MOTOR STEP COUNT
  27.  
  28. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  29. ;                                                                             ;
  30. ;   UNIVERSAL CONSTANTS                                                       ;
  31. ;                                                                             ;
  32. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  33.  
  34. SPEEDCOR   .EQU 20H              ;COARSE SPEED ADJUSTMENT
  35. SPEEDFIN   .EQU 0FFH             ;FINE SPEED ADJUSTMENT
  36. REVDIST    .EQU 30H              ;DISTANCE COUNT TO BACKUP
  37. STEPCOUNT  .EQU 18H              ;STEPS BETWEEN SENSOR TOGGLES
  38.  
  39. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  40. ;                                                                             ;
  41. ;   PROGRAM START                                                             ;
  42. ;                                                                             ;
  43. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  44.  
  45.            .ORG 000H
  46.  
  47. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  48. ;                                                                             ;
  49. ;   INITIALIZE PORT 2 FOR INPUT                                               ;
  50. ;                                                                             ;
  51. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  52.  
  53.            MOV  A,#0FFH          ;MAKE PORT 2 AN INPUT PORT
  54.            OUTL P2,A             ;INITIALIZE PORT 2 FOR INPUT
  55.  
  56. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  57. ;                                                                             ;
  58. ;   BUILD THE FORWARD ROTATE TABLE IN MEMORY                                  ;
  59. ;                                                                             ;
  60. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  61.  
  62.            MOV  R0,#HEAD         ;POINT TO HEAD OF ROTATE TABLE
  63.            MOV  A,#01010101B     ;LOAD ACCUMULATOR WITH HEAD ENTRY
  64.            MOV  @R0,A            ;STORE THE HEAD ENTRY
  65.            INC  R0               ;POINT TO HEAD + 1
  66.            MOV  A,#10011001B     ;LOAD ACCUMULATOR WITH HEAD + 1 ENTRY
  67.            MOV  @R0,A            ;STORE THE ENTRY
  68.            INC  R0               ;POINT TO HEAD + 2
  69.            MOV  A,#10101010B     ;LOAD ACC WITH HEAD + 2 ENTRY
  70.            MOV  @R0,A            ;STORE THE ENTRY
  71.            INC  R0               ;POINT TO TAIL
  72.            MOV  A,#01100110B     ;LOAD ACC WITH TAIL ENTRY
  73.            MOV  @R0,A            ;STORE THE ENTRY
  74.  
  75. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  76. ;                                                                             ;
  77. ;   BUILD THE RIGHT TURN ROTATE TABLE IN MEMORY                               ;
  78. ;                                                                             ;
  79. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  80.  
  81.            MOV  R0,#RIGHTHEAD    ;POINT TO HEAD OF RIGHT TURN ROTATE TABLE
  82.            MOV  A,#01010101B     ;LOAD ACCUMULATOR WITH HEAD ENTRY
  83.            MOV  @R0,A            ;STORE THE HEAD ENTRY
  84.            INC  R0               ;POINT TO HEAD + 1
  85.            MOV  A,#01101001B     ;LOAD ACCUMULATOR WITH HEAD + 1 ENTRY
  86.            MOV  @R0,A            ;STORE THE ENTRY
  87.            INC  R0               ;POINT TO HEAD + 2
  88.            MOV  A,#10101010B     ;LOAD ACC WITH HEAD + 2 ENTRY
  89.            MOV  @R0,A            ;STORE THE ENTRY
  90.            INC  R0               ;POINT TO TAIL
  91.            MOV  A,#10010110B     ;LOAD ACC WITH TAIL ENTRY
  92.            MOV  @R0,A            ;STORE THE ENTRY
  93.  
  94. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  95. ;                                                                             ;
  96. ;   BUILD THE LEFT TURN ROTATE TABLE IN MEMORY                                ;
  97. ;                                                                             ;
  98. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  99.  
  100.            MOV  R0,#LEFTHEAD     ;POINT TO HEAD OF LEFT TURN ROTATE TABLE
  101.            MOV  A,#01010101B     ;LOAD ACCUMULATOR WITH HEAD ENTRY
  102.            MOV  @R0,A            ;STORE THE HEAD ENTRY
  103.            INC  R0               ;POINT TO HEAD + 1
  104.            MOV  A,#10010110B     ;LOAD ACCUMULATOR WITH HEAD + 1 ENTRY
  105.            MOV  @R0,A            ;STORE THE ENTRY
  106.            INC  R0               ;POINT TO HEAD + 2
  107.            MOV  A,#10101010B     ;LOAD ACC WITH HEAD + 2 ENTRY
  108.            MOV  @R0,A            ;STORE THE ENTRY
  109.            INC  R0               ;POINT TO TAIL
  110.            MOV  A,#01101001B     ;LOAD ACC WITH TAIL ENTRY
  111.            MOV  @R0,A            ;STORE THE ENTRY
  112.  
  113. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  114. ;                                                                             ;
  115. ;   INITIALIZE FORWARD ROTATE TABLE POINTER                                   ;
  116. ;   INITIALIZE MOTOR STEP COUNTS                                              ;
  117. ;   INITIALIZE LEFT AND RIGHT MOTOR STATUS                                    ;
  118. ;                                                                             ;
  119. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  120.  
  121.            MOV  R0,#HEAD         ;POINT TO HEAD OF ROTATE TABLE
  122.            CALL SETRIGHT         ;INITIALIZE LEFT AND RIGHT MOTOR STEP COUNTS
  123.            CALL SETLEFT          ;
  124.            IN   A,P2             ;GET INITIAL MOTOR STATUS
  125.            MOV  R5,A             ;TEMPORARILY STORE ACC IN R5
  126.            ANL  A,#00000001B     ;MASK FOR RIGHT MOTOR STATUS
  127.            MOV  R4,A             ;LOAD R4 WITH RIGHT INITIAL MOTOR STATUS
  128.            MOV  A,R5             ;RESTORE RIGHT AND LEFT MOTOR STATUS READINGS
  129.            ANL  A,#00000010B     ;MASK FOR LEFT MOTOR STATUS
  130.            MOV  R3,A             ;LOAD R3 WITH LEFT INITIAL MOTOR STATUS
  131.  
  132. SEEK       MOV  A,@R0            ;LOAD ACC WITH HEAD VALUE
  133.            OUTL P1,A             ;LOAD THE TABLE VALUE TO THE MOTOR DRIVER
  134.            CALL STATUS           ;LOAD MOTOR DRIVER WITH HEAD VALUE
  135.            INC  R0               ;POINT THE HEAD + 1 VALUE
  136.            MOV  A,#TAIL+1        ;CHECK R0 FOR END OF TABLE
  137.            XRL  A,R0             ;COMPARE R0 WITH VALUE IN ACC
  138.            JNZ  SEEK             ;NOT BEYOND THE TAIL CONTINUE TO MOVE FORWARD
  139.            MOV  R0,#HEAD         ;RESET R0 TO HEAD VALUE
  140.            JMP  SEEK
  141.  
  142. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  143. ;                                                                             ;
  144. ;   SUBROUTINES                                                               ;
  145. ;                                                                             ;
  146. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  147.  
  148.            .ORG 100H
  149.  
  150. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  151. ;                                                                             ;
  152. ;  MOVE STATUS SUBROUTINE                                                     ;
  153. ;                                                                             ;
  154. ;  CHANGE VALUES FOR R5 AND R7 TO AFFECT SPEED OF STEPPER MOTORS...           ;
  155. ;  R0 = FORWARD TABLE POINTER                                                 ;
  156. ;  R1 = STEP COUNTER POINTER                                                  ;
  157. ;  R2 = REVERSE ROTATION COUNTER                                              ;
  158. ;  R3 = PREVIOUS MOTOR STATUS LEFT MOTOR                                      ;
  159. ;  R4 = PREVIOUS MOTOR STATUS RIGHT MOTOR                                     ;
  160. ;  R5 = SCRATCH REGISTER                                                      ;
  161. ;  R6 = OUTER LOOP COUNT VALUE (COARSE ADJUSTMENT)                            ;
  162. ;  R7 = INNER LOOP COUNT VALUE (FINE ADJUSTMENT)                              ;
  163. ;  P1 = STEPPER MOTOR PORT    BITS 7-4 = LEFT MOTOR  BITS 3-0 = RIGHT MOTOR   ;
  164. ;  P2 = MOTOR STATUS                                                          ;
  165. ;  F0 = RIGHT MOTION FLAG  -  SET WHEN RIGHT WHEEL IS STOPPED                 ;
  166. ;  F1 = LEFT MOTION FLAG   -  SET WHEN LEFT WHEEL IS STOPPED                  ;
  167. ;                                                                             ;
  168. ;  P2 BIT  7      6      5      4      3      2        1           0          ;
  169. ;         N/A    N/A    N/A    N/A    N/A    N/A   LEFT MOTOR  RIGHT MOTOR    ;
  170. ;                                                                             ;
  171. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  172.  
  173. STATUS     IN   A,P2             ;GET CURRENT MOTOR STATUS
  174.  
  175. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  176. ;                                                                             ;
  177. ;   CHECK THE RIGHT WHEEL MOTION                                              ;
  178. ;                                                                             ;
  179. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  180.  
  181. CHECKRIGHT CLR  F0               ;CLEAR THE FLAGS
  182.            CLR  F1               ;
  183.            CPL  F0               ;SET THE FLAGS
  184.            CPL  F1               ;ROUTINE MUST CLEAR FLAGS TO SHOW MOVEMENT
  185.            MOV  R5,A             ;TEMPORARILY STORE CURRENT MOTOR STATUS
  186.            ANL  A,#00000001B     ;MASK OUT LEFT MOTOR STATUS VALUE
  187.            XRL  A,R4             ;COMPARE RIGHT MOTOR STATUS
  188.            JNZ  RESETRIGHT       ;IF NOT SAME AS PREVIOUS THEN RESET STEP COUNT
  189. DECRIGHT   MOV  R1,#STEPRIGHT    ;POINT TO RIGHT MOTOR STEP COUNT
  190.            MOV  A,@R1            ;GET THE STEPRIGHT VALUE FOR DECREMENT
  191.            DEC  A                ;DECREMENT THE STEPLEFT VALUE
  192.            MOV  @R1,A            ;STORE THE NEW RIGHT MOTOR STEP COUNT
  193.            MOV  A,#00H           ;LOAD ACC WITH 0
  194.            XRL  A,@R1            ;CHECK STEPRIGHT VALUE FOR 0
  195.            JZ   REVERSE          ;IF STEP COUNT = 0 THEN BACK UP
  196.            JMP  CHECKLEFT        ;GO CHECK THE LEFT MOTOR STATUS
  197. RESETRIGHT MOV  A,R5             ;RESTORE THE PREVIOUS RIGHT AND LEFT STATUS
  198.            ANL  A,#00000001B     ;MASK OUT LEFT MOTOR STATUS
  199.            MOV  R4,A             ;STORE THE NEW RIGHT MOTOR STATUS
  200.            CALL SETRIGHT         ;GO RESET THE RIGHT MOTOR COUNT
  201.  
  202. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  203. ;                                                                             ;
  204. ;   CHECK THE LEFT WHEEL MOTION                                               ;
  205. ;                                                                             ;
  206. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  207.  
  208. CHECKLEFT  CLR  F0               ;CLEAR FLAG 0 TO SHOW RIGHT WHEEL WAS OK
  209.            MOV  A,R5             ;RESTORE THE CURRENT MOTOR STATUS
  210.            ANL  A,#00000010B     ;MASK OUT RIGHT MOTOR STATUS VALUE
  211.            XRL  A,R3             ;COMPARE LEFT MOTOR STATUS
  212.            JNZ  RESETLEFT        ;IF NOT SAME AS PREVIOUS THEN RESET STEP COUNT
  213. DECLEFT    MOV  R1,#STEPLEFT     ;POINT TO LEFT MOTOR STEP COUNT
  214.            MOV  A,@R1            ;GET THE STEPLEFT VALUE FOR DECREMENT
  215.            DEC  A                ;DECREMENT THE STEPLEFT VALUE
  216.            MOV  @R1,A            ;STORE THE NEW LEFT MOTOR STEP COUNT
  217.            MOV  A,#00H           ;LOAD ACC WITH 0
  218.            XRL  A,@R1            ;CHECK STEPLEFT VALUE FOR 0
  219.            JZ   REVERSE          ;IF STEP COUNT = 0 THEN BACK UP
  220.            JMP  STEPWAIT         ;GO WAIT UNTIL TIME FOR THE NEXT STEP
  221. RESETLEFT  MOV  A,R5             ;RESTORE THE PREVIOUS RIGHT AND LEFT STATUS
  222.            ANL  A,#00000010B     ;MASK OUT RIGHT MOTOR STATUS
  223.            MOV  R3,A             ;STORE THE NEW LEFT MOTOR STATUS
  224.            CALL SETLEFT          ;GO RESET THE LEFT MOTOR COUNT
  225.  
  226. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  227. ;                                                                             ;
  228. ;   DELAY BETWEEN STEPPER MOTOR STEPS                                         ;
  229. ;                                                                             ;
  230. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  231.  
  232. STEPWAIT   CLR  F1               ;CLEAR FLAG TO SHOW LEFT WHEEL WAS MOVING
  233.            MOV  R7,#SPEEDCOR     ;WAIT BETWEEN STEPS (OUTER LOOP COUNTER)
  234. WAITING    MOV  R5,#SPEEDFIN     ;WAIT BETWEEN STEPS (INNER LOOP COUNTER)
  235.            DJNZ R5,$             ;DECREMENT THE INNER LOOP COUNTER
  236.            DJNZ R7,WAITING       ;DECREMENT THE OUTER LOOP COUNTER
  237. MOVEDONE   RET
  238.  
  239. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  240. ;                                                                             ;
  241. ;   REVERSE AND TURN ROUTINES                                                 ;
  242. ;                                                                             ;
  243. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  244.  
  245. REVERSE    CALL BACKITUP         ;A WHEEL HAS STOPPED SO BACK IT UP
  246. ;           JF0  TURNLEFT         ;IF FLAG 0 IS SET, RIGHT WHEEL HAS STOPPED
  247. ;           JF1  TURNRIGHT        ;IF FLAG 1 IS SET, LEFT WHEEL HAS STOPPED
  248.            JF1  TURNLEFT         ;IF FLAG 1 IS SET, LEFT WHEEL HAS STOPPED
  249.            JF0  TURNRIGHT        ;IF FLAG 0 IS SET, RIGHT WHEEL HAS STOPPED
  250. TURNLEFT   MOV  R0,#LEFTHEAD     ;POINT TO BEGINNING OF LEFT TURN ROTATE TABLE
  251.            JMP  TURN
  252. TURNRIGHT  MOV  R0,#RIGHTHEAD    ;POINT TO BEGINNING OF RIGHT TURN ROTATE TABLE
  253. TURN       MOV  R2,#REVDIST      ;LOAD R2 WITH TURN DISTANCE COUNT
  254. BEGINTURN  MOV  A,@R0            ;LOAD ACC WITH HEAD VALUE
  255.            OUTL P1,A             ;LOAD THE TABLE VALUE TO THE MOTOR DRIVER
  256.            MOV  R7,#SPEEDCOR     ;WAIT BETWEEN STEPS (OUTER LOOP COUNTER)
  257. TURNING    MOV  R5,#SPEEDFIN     ;WAIT BETWEEN STEPS (INNER LOOP COUNTER)
  258.            DJNZ R5,$             ;DECREMENT THE INNER LOOP COUNTER
  259.            DJNZ R7,TURNING       ;DECREMENT THE OUTER LOOP COUNTER
  260.            INC  R0               ;POINT THE HEAD + 1 VALUE
  261.            DEC  R2               ;DECREMENT THE TURN DISTANCE COUNT
  262.            MOV  A,R2             ;IS TURN DONE?
  263.            JZ   TURNDONE         ;YES..TURN IS DONE
  264.            JF1  TAILLEFT         ;NO..DETERMINE WHICH TURN TABLE WE ARE IN
  265.            MOV  A,#RIGHTTAIL+1   ;WE ARE IN RIGHT TURN TABLE
  266.            JMP  COMPARE          ;GO FIND OUR LOCATION IN THE TURN TABLE
  267. TAILLEFT   MOV  A,#LEFTTAIL+1    ;WE ARE IN LEFT TURN TABLE
  268. COMPARE    XRL  A,R0             ;DETERMINE POSITION IN OUR TURN TABLE
  269.            JNZ  BEGINTURN        ;NOT BEYOND THE TAIL CONTINUE TO TURN
  270.            JF1  HEADLEFT         ;BEYOND TAIL..DETERMINE WHICH POINTER TO RESET
  271.            MOV  R0,#RIGHTHEAD    ;RESET THE RIGHT TURN TABLE POINTER
  272.            JMP  BEGINTURN        ;CONTINUE TO TURN
  273. HEADLEFT   MOV  R0,#LEFTHEAD     ;RESET THE LEFT TURN TABLE POINTER
  274.            JMP  BEGINTURN        ;CONTINUE TO TURN
  275. TURNDONE   MOV  R0,#HEAD         ;RESET THE POINTER TO FORWARD ROTATE TABLE
  276.            JMP  MOVEDONE         ;GET OUT OF THIS SUBROUTINE
  277.  
  278. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  279. ;                                                                             ;
  280. ;   REVERSE SUBROUTINE                                                        ;
  281. ;                                                                             ;
  282. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  283.  
  284. BACKITUP   CALL SETRIGHT         ;RESET THE MOTOR COUNTERS
  285.            CALL SETLEFT
  286.            MOV  R2,#REVDIST      ;LOAD THE REVERSE DISTANCE VALUE
  287. GOBACK     DEC  R0               ;REVERSE MODE - MOVE BACKWARDS IN ROTATE TABLE
  288.            MOV  A,#HEAD-1        ;CHECK R0 FOR END OF TABLE
  289.            XRL  A,R0             ;COMPARE R0 WITH VALUE IN ACC
  290.            JNZ  BACKUP           ;NOT BEYOND TABLE LIMITS-CONTINUE TO MOVE
  291.            MOV  A,#TAIL          ;RESET R0 TO TAIL VALUE
  292.            MOV  R0,A
  293. BACKUP     MOV  A,@R0            ;LOAD ACC WITH TABLE VALUE
  294.            OUTL P1,A             ;LOAD TABLE VALUE TO STEPPER MOTORS
  295. BACKWAIT   MOV  R7,#SPEEDCOR     ;WAIT BETWEEN STEPS (COARSE VALUE)
  296. WAITBACK   MOV  R5,#SPEEDFIN     ;WAIT BETWEEN STEPS (FINE VALUE)
  297.            DJNZ R5,$             ;DECREMENT THE INNER LOOP COUNTER
  298.            DJNZ R7,WAITBACK      ;DECREMENT THE OUTER LOOP COUNTER
  299.            DEC  R2
  300.            MOV  A,R2
  301.            JZ   BACKUPDONE
  302.            JMP  GOBACK
  303. BACKUPDONE RET
  304.  
  305. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  306. ;                                                                             ;
  307. ;   MOTOR SWITCH TOGGLE RATE INITIALIZATION SUBROUTINE                        ;
  308. ;                                                                             ;
  309. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  310.  
  311. SETRIGHT   MOV  R1,#STEPRIGHT    ;POINT TO RIGHT MOTOR STEP COUNTER
  312.            MOV  A,#STEPCOUNT     ;LOAD A WITH 24 STEPS
  313.            MOV  @R1,A            ;RELOAD RIGHT MOTOR STEP COUNTER TO 24 STEPS
  314.            RET
  315. SETLEFT    MOV  R1,#STEPLEFT     ;POINT TO LEFT MOTOR STEP COUNTER
  316.            MOV  A,#STEPCOUNT     ;LOAD A WITH 24 STEPS
  317.            MOV  @R1,A            ;RELOAD LEFT MOTOR STEP COUNTER TO 24 STEPS
  318.            RET
  319.            .END
  320.  
  321.