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