main.asm



;
;
;       FILE NAME  MAIN.ASM
;
;-------------  MAIN LOOP & INITIALIZATION  ---------------------------------
;
;
;             SynPet Personal Electronic Technologies
;             7225 Franklin Road, Boise, ID  83709
;
;             Created:  8/22/89 - LRE
;             Firmware version 1.00 3/15/90
;             Firmware version 1.01 3/18/90 - Fix commo lockup.
;
;
;
;
;---------------------------------------------------------------------------

 .chip   16003
 .incld  GLOBDEFS

;---------------  MODULE PRIVATE DEFINES ----------------------------------





;----------   END OF MODULE PRIVATE DEFINES -------------------------------


 .sect  DATA,ram8

;---------------- MODULE PRIVATE VARIABLES --------------------------------


;--------------- END OF MODULE PRIVATE VARIABLES --------------------------

;-------------------- EXTERNAL GLOBAL VARIABLES ---------------------------

 .extrn    total_jobs_in_qs
 .extrn    jobs_in_q
 .extrn    a_to_d_tic
 .extrn    chk_rd_intrn_t0_tic
 .extrn    first_msg_received
 .extrn    lights_t0_tic 
 .extrn    last_ir_change_status
 .extrn    ir_change
 .extrn    internal_msg_buffer

;----------------- END OF EXTERNAL GLOBAL VARIABLES -----------------------

 .endsect


;----------------  START OF MODULE CODE -----------------------------------


 .public    REV_NO

 .extrn     PROCESS_COMMO
 .extrn     INIT_TIMERS
 .extrn     INIT_HEAD 
 .extrn     INIT_COMMO
 .extrn     INIT_MICRO_WIRE
 .extrn     INIT_MOVE  
 .extrn     INIT_LIGHTS
 .extrn     INIT_RD_EXTRN
 .extrn     INIT_CONTROL
 .extrn     MOVE_MAIN
 .extrn     TEST_MAIN
 .extrn     LIGHTS_MAIN
 .extrn     CONTROL_MAIN
 .extrn     READ_INTERNAL_MAIN
 .extrn     RDEXTRN_MAIN
 .extrn     HEAD_MAIN
 .extrn     BEACON_MAIN
 .extrn     LIGHTSHOWS_MAIN
 .extrn     A_TO_D_MAIN
 .extrn     LIGHT_SHOW
 .extrn     PROCESS_REMOTE_CONTROL
 .extrn     CHECK_RD_INTRN
 .extrn     PROCESS_LIGHT_T0_TIC
 .extrn     SND_INTERNAL_MSG

;--------------- START OF INITIALIZATION ------ ----------------------------


 .sect   RESET,rom8

MAIN:

 ;  LD     PSW.B,#010H  ; Set addressing and wait states.  64K address,
                       ; 4 waits.  Must be done immediately.
    LD     PSW.B,#014   ; Two waits.
 ;  LD     PSW.B,#018   ; One wait.
    JMP    INITIALIZE   ; Go set up everything else.

.endsect

 .sect     HIMEM,rom8
 ; .sect      LOMEM,rom8
 ; .sect      CODE,rom8


 COPYRIGHT_NOTICE:
 .DB     'COPYRIGHT (C) 1990 - SYNPET PERSONAL ELECTRONIC TECHNOLOGIES' 
 .DB     'NEWTON PESONAL ROBOT HPC FIRMWARE.'
 VERSION:
 .DB     'REV NO. - '
 REV_NO:
 .DB     '01.01'

INITIALIZE:

      ; Clear all RAM.
    LD     B.W,#06000H ; Set up loop.
    LD     K.W,#067FFH ;
 CLR_LOOP:
    CLR    A   ; Put all zeroes into mem.
    XS     A,[B+].B ;
    JMP    CLR_LOOP ;

    JSR    INIT_COMMO ;
    JSR    INIT_TIMERS ;
    JSR    INIT_HEAD ;
 ;  JSR    INIT_MICRO_WIRE ;
    JSR    INIT_MOVE ;
 ;  JSR    INIT_LIGHTS ;
 ;  JSR    INIT_RD_EXTRN ;
    JSR    INIT_CONTROL ;

 DO_INTS:  ; Start timers & let ints in.
    LD     ENIR.B,#0 ;
    SBIT   0,TMMODE.B    ; Only Have a T0 int to begin with on timer ints.
                         ; T0 is already running & don't want the others
                         ; started yet. 
    RBIT   2,TMMODE_HI.B ; Start timer T2 for sonar.
    RBIT   6,TMMODE_HI.B ; Start timer T3 for sonar.
    SBIT   5,ENIR.B ; Enable timer interrupt.
    SBIT   7,ENIR.B ; Enable head opto interrupt.
    SBIT   3,ENIR.B ; Enable right motor opto int.
    SBIT   2,ENIR.B ; Enable left motor opto int.
    SBIT   4,ENIR.B ; Enable remote control int.
   _EN_INTS_   ; & The global enable.
   _EN_NMI_
      ; Send home head command to head routine to startup.
    LD     internal_msg_buffer + 0.B,#3 ;
    LD     internal_msg_buffer + 1.B,#061H ;
    LD     internal_msg_buffer + 2.B,#084H ;
    JSR    SND_INTERNAL_MSG ;
    JMP    MAIN_LOOP ; Go back - done with initialization.

;----------------- END OF INITIALIZATION -----------------------------------


;-------------------- START OF MAIN ----------------------------------------
;
; THIS ROUTINE STARTS THINGS UP & THEN GOES INTO PRIMARY ENDLESS LOOP.

 MAIN_LOOP:
    JSR    PROCESS_COMMO ; Go check communications.

           ; Chk to see if any jobs running or pending & go process if
           ; there are.
    IFEQ   total_jobs_in_qs.B,#0 ; Anything going on?
    JMP    CHK_A2D   ; No - don't process.
        ; Else fall thru to go do jobs. 
    LD     B,#0  ; For index thru jobs.
  CHK_NEXT_JOB:
    LD     A,jobs_in_q[B].B ;
    IFEQ   A,#0        ; Anything this job?
    JMP    SETUP_FOR_NEXT_JOB_CHK ; No don't do job.
         ; Else go process job.
    PUSH   B  ; Save for next.
    JSR    DO_JOB  ; Go process.
    POP    B  ; Get index back .
  SETUP_FOR_NEXT_JOB_CHK:
    INC    B   ; 
    IFGT   B,#NUMBER_OF_JOBS_ROLLOVER ; Done checking all yet?
    JMP    CHK_A2D ;  Yes - go to next on main loop.
    JMP    CHK_NEXT_JOB ; No - go check for more.

  CHK_A2D:
 ;  IFGT   a_to_d_tic.B,#1  ; Time to go A to D?
 ;  JSR    A_TO_D_MAIN ; Yes - go to it.
  CHK_IR_CHANGE:
    LD     A,DIGITAL_STATUS_PORT.B ;
    AND    A,#04H ;
    LD     B,last_ir_change_status.B ;
    XOR    A,B ;
    IFGT   A,#0 ;
    LD     ir_change.B,#1 ;
  CHK_LIGHTS:
    IFEQ   lights_t0_tic.B,#0 ;
    JMP    DO_REMOTE_CONTROL ;
 ;  JSR    PROCESS_LIGHT_T0_TIC ;
 ;  JSR    LIGHT_SHOW ;
    LD     lights_t0_tic.B,#0 ;
  DO_REMOTE_CONTROL:
    NOP
    NOP
    JSR    PROCESS_REMOTE_CONTROL ;
 ;  IFEQ   first_msg_received.B,#0 ;
    JMP    MAIN_LOOP ;
    IFGT   chk_rd_intrn_t0_tic.B,#15 ;
    JSR    CHECK_RD_INTRN ;

    JMP   MAIN_LOOP ; This is the main endless loop.  Only exit on reset.


;-------------------- END OF MAIN ----------------------------------------

;-------------------- DO JOB ---------------------------------------------

DO_JOB:
    LD     A,B ; Job number into A for lookup;
    JID     ; Vector to right job.
    .PT    DO_MOVE,DO_TST,DO_LIGHTS,DO_CONTROL,DO_READ_INTERNAL
    .PT    DO_READ_EXTERNAL,DO_HEAD,DO_BEACON,DO_LIGHTSHOWS

  DO_MOVE:
    JMP    MOVE_MAIN  ;
  DO_TST:
    RET     ;
  ; JMP    TEST_MAIN ;
  DO_LIGHTS:
    RET     ;
  ; JMP    LIGHTS_MAIN ;
  DO_CONTROL:
  ; RET     ;
    JMP    CONTROL_MAIN
  DO_READ_INTERNAL:
    RET     ;
  ; JMP    READ_INTERNAL_MAIN
  DO_READ_EXTERNAL:
    RET     ;
  ; JMP    RDEXTRN_MAIN
  DO_HEAD:
  ; RET     ;
    JMP    HEAD_MAIN
  DO_BEACON:
    RET     ;
  ; JMP    BEACON_MAIN
  DO_LIGHTSHOWS:
    RET     ;
  ; JMP    LIGHTSHOWS_MAIN

;---------------------- END OF DO JOB ------------------------------------

 .endsect
 .end MAIN