Owen Martin
Jeff Goguen
Spring 2001
In today’s fast paced world, technology has afforded us many luxuries. From email and e-commerce to wireless networking and video, there are many innovative and useful products available. But there is one thing that they cannot provide, which is peace of mind. Our final project for ELE 408 was to develop an application using the Motorola ColdFire that would bring the user some peace of mind, an electronic intruder detection system.
More important than one’s possessions, is perhaps one’s life and family. Our OJ Security system would be able to provide today’s consumer with protection for both there loved ones’ and their belongings. Now that we have all of these new innovative products to make our lives easier, who wants to be worrying about getting them stolen? The OJ Security System will let the consumer be able to sleep at night knowing that the entrances to their home are well protected.
The system is both simple and elegant in its design. The current prototype is able to handle up to four different sensors from different locations. This is sufficient to secure the entrances to a small household. Expandability is also available, future versions will be able to support up to 16 sensor inputs. We chose to use the ColdFire’s parallel port to handle these sensor inputs. The decision was made to use the parallel port over a serial connection for several reasons. We wanted to allow for ease of implementation and cost effectiveness. By choosing the parallel port, we could support a limited number of devices, yet it would be relatively simple to develop.
If we had gone with a serial communication interface, it would make each sensor more complicated and expensive. Each would need to be able to send and receive data over a serial link. A more robust system would include this type of sensor. With serial data, we could support almost an unlimited number of devices and use the homes own internal phone network to connect them. The ColdFire is powerful and versatile enough to handle even more complex tasks. Our original plan was to develop a web server to work in tandem with the OJ Security System. We could use the Ethernet port on the board to connect the system to the Internet. With a working IP address we could make a network interface that could transmit the status of the system over the Internet in response to a request. A simple web server could be employed with a Java applet that would query the device and interpret the response. The user would be able to get the real-time status of the system from any portable device. Given more time, the web interface would be an excellent enhancement.
The design that we chose to go with was much more feasible given the time frame. The sensors we employed are simple low cost switches that when turned off, will generate an interrupt to the system. This will provide a cost effective yet reliable solution. The disadvantage would be that the sensors would each need to be connected to the main system by a single wire. Many people would not want to have to run wires all over their house from each door and window. To alleviate this, a wireless sensor system could be looked into. There are many vendors that support short distance wireless links, a cost factor that could be considered for future versions.
The user interface to the OJ Security System is handled using the evaluation boards DEBUG module. When the system is first started, the user will be asked for a password to gain access to the features. From the main menu, the user will be able to perform several different functions. The available functions are: Arm, Disarm, Update Status and Lock. The interface is versatile enough to give the user accurate, current data about the system. They are constantly informed on the status of the system and have full control over all the functions.
The alarm can be armed from the main menu. When this option is selected, the system will check the status of the input sensors. If all the sensors are secure, we configure it to accept interrupts from IRQ1. The digital hardware is designed such that if any one of the sensors are tripped (toggle switch flipped), the line connected to IRQ1 will go low to trigger the interrupt. Otherwise, the state of this line is always high (see Electrical Hardware Schematic for design implementation specifics). Once IRQ1 has been enabled, the status of the system is displayed to the user and then they return to either the main menu or the password prompt. The determining condition of this is whether or not the user selected the Lock operation prior to the alarm trigger. This feature was imperative to our Security System to ensure that only the owner would have access to disarming. Otherwise, the Security System would be useless if a burglar could disarm it via the easily accessible main menu.
The interrupt handler is the key software component of the OJ Security System. This is what gives our system the real time data acquisition. It is superior over a polling event handler since it will work faster and make more efficient use of the processor resources. Once an interrupt is detected, the CPU will read the Parallel Ports input pins and reports it to the user via the DEBUG module. We then use the timer output to flash the lights of the LED indicators. A polling system would severely limit the expandability of the system. By freeing up the CPU, we would be able to support additional features in the future.
Once the alarm is active, the user must manually disable it. If the system is in the locked state, it will be first necessary to enter the correct password. Once that user has gained access to the main menu, they will then be able to disable the alarm by selecting the proper menu choice. When the alarm is active, you will be able to see exactly which sensor is causing the problem.
When we designed the system, we tried to use a modular approach. We created numerous functions to implement the functionality of the system. Our design is both scalable and easily debugged. Once a function is proved to behave predictably its task can be abstracted. Listed here are some of the functions and a description of the job that they perform.
INITIALIZE – This function needs to be called when the system is first started. All of display messages are stored into memory. The alarm status is set to disarmed and the alarm detection trigger (IRQ1) is disabled.
WELCOME – Here we display a welcome message and prompt for the user’s password. A check is performed on the password and the function will not exit until the password is valid.
MENU – Displays the menu selection and interprets the user’s choice. It will then call the appropriate subroutine to complete the task.
DISPLAY – This is a simple function that takes a pointer to a string of characters and displays it to the screen. The function assumes that the address of the character array is in A6 and that the last character is End of Text (ETX).
GET_PASSWORD – Enables the user to enter a string of characters via the DEBUG module. Stores all characters until Enter is pressed, also appends and ETX to the end of the string. Assumes that A5 contains the address of where the data should be stored.
ARM_SYSTEM – Initializes the interrupt handler and enables interrupts on IRQ1. We use an autovector to point to the exception handler. First the status of the input ports in determined, then this information is relayed to the user. Will also cause the alarm enabled indicator to blink on the proto board.
ALARM_EXCEPTION– When an interrupt is found, this function is called. It first enables the alarm, and then displays a message to the user via DEBUG module. Will also cause the specific triggered alarm sensor indicator(s) to blink on the proto board.
DISARM_SYSTEM – Disables all interrupts using the Interrupt Mask Register. Shuts off the alarm enabled indicator on the proto board, and stops the alarm sensor indicator(s) from blinking.
GET_STATUS – Reports on the status of the system. Determines what state the system is in and also the state of the sensors on the parallel port.
DISABLE_INTERRUPT – Masks IRQ1 in the IMR to prevent the CPU from servicing interrupts.
Our goal in designing the OJ Security System was to develop a low cost yet effective means of protection for the home. It is not only the wealthy an affluent people that need defense from intruders. Our system is both flexible and expandable to be able to meet any budget. Our low-end model that was implemented in the ELE lab could be manufactured for less than $50 per unit. By utilizing a ColdFire core, it allows us to feature powerful and efficient service. There is also the ability to support additional features such as the web interface. We were able to develop a solid and stable real time embedded system that was a good application of the skills acquired in class. We integrated some features that we had learned about and also develop the techniques to utilize some additional functionality.
| Owen Martin Jeff Goguen
| ELE 408 Final Project
|-------------------------------------------------------------------------------
MBAR = 0x10000000
| **** Definitions for Interrupt
(IRQ-1)
VBR = 0x00000000
AVCR = MBAR + 0x4B
IMR = MBAR + 0x44
IPR = MBAR + 0x40
| **** Definitions for PP
PAR = MBAR + 0x004
PADDR = MBAR + 0x244
PADAT = MBAR + 0x248
| **** Definitions for Timer Module
TMR1 = MBAR + 0x140 |Timer Mode Register
TRR1 = MBAR + 0x144 |Timer Reference Register
TCR1 =
MBAR + 0x148 |Timer Capture Register
TCN1 = MBAR + 0x14C |Timer Count Register
TER1 =
MBAR + 0x150 |Timer Event Register
TMR2 = MBAR + 0x180 |Timer Mode Register
TRR2 = MBAR + 0x184 |Timer Reference Register
TCR2 =
MBAR + 0x188 |Timer Capture Register
TCN2 = MBAR + 0x18C |Timer Count Register
TER2 =
MBAR + 0x191 |Timer Event Register
VAR_ROOT = 0x23000 | Defines the mem addr where the
data will be initialized
MAIN_HEADER_MESSAGE= VAR_ROOT + 0x000
GET_PASS_MESSAGE = VAR_ROOT + 0x200
SYSTEM_PASS = VAR_ROOT +
0x400
STATUS_HEADER = VAR_ROOT + 0x600
ACTION_HEADER = VAR_ROOT + 0x700
MENU_MESSAGE = VAR_ROOT + 0x800
SOUNDING_ALARM = VAR_ROOT + 0xA00
SYS_DISARMED = VAR_ROOT + 0xC00
SYS_ARMED = VAR_ROOT +
0xE00
SYS_PENDING = VAR_ROOT +
0xF00
SYS_SECURE = VAR_ROOT +
0x1000
SYS_NOT_SECURE = VAR_ROOT + 0x1200
ERROR_RETURN = VAR_ROOT + 0x1400
WARNING_HEADER = VAR_ROOT + 0x1600
CHAR_BS = VAR_ROOT + 0x1800
CHAR_AS = VAR_ROOT + 0x1A00
CHAR_SP = VAR_ROOT + 0x1C00
USER_DISARMED = VAR_ROOT + 0x1E00
USER_ARMED = VAR_ROOT +
0x2000
USER_NONE = VAR_ROOT + 0x2100
F_DOOR_ERR = VAR_ROOT +
0x2200
B_DOOR_ERR = VAR_ROOT +
0x2400
WIN_ERR = VAR_ROOT + 0x2600
G_DOOR_ERR = VAR_ROOT +
0x2800
CAN_NOT_ARM = VAR_ROOT +
0x2900
INVALID_PASSWORD = VAR_ROOT + 0x3000
USER_PASS = VAR_ROOT +
0x3100
USER_SELECTION = VAR_ROOT + 0x3200
ALARM_LOCK = VAR_ROOT +
0x3300 | 0: User not locked out, 1:
user is locked out (upon ALARM)
ALARM_STATUS = VAR_ROOT + 0x3400 | 2: SYS armed, 1: SYS disarmed 0: Pending
INTR_STATUS = VAR_ROOT +
0x3500 | 0: ALARM NOT SOUNDING, 1:
ALARM IS SOUNDING
SECURE_STATUS = VAR_ROOT + 0x3600 | 0: SYS not secure, 1: SYS secure
INVALID_PASS_STATUS= VAR_ROOT + 0x3700 | 1: Password enrty just made was invlaid 0: not the case
CFI = VAR_ROOT + 0x3800
|-------------------------------------------------------------------------------
|----- MAIN
FUNCTION-------------------------------------------------
|-------------------------------------------------------------------------------
|
**** Initialize Alarm Interrupt (IRQ-1)
move.l
#VBR,%A6 | Initialize the Vector
move.l
%A6,VBR | Base Register
move.l #0x20044,%d0
move.l %d0,VBR+0x64
move.w #0x202,%d0 |
autovector for IRQ1
move.w %d0,AVCR
move.l #0xFFFFFFFE,%d0 | Set Interrupt Mask register to
disable
move.l %d0,IMR | interrupts on IRQ1
bsr INITIALIZE | initialize memory
LOCK_OUT:
bsr WELCOME | authenticate user
CLEAR_ALARM:
| 2) **** Set Calling Function
Indicator CFI = 0x00
move.l #CFI,%a0
move.l #0x00,%a0@
bra GET_STATUS
GET_STATUS_RET0:
bra MENU | Display user menu
MENU_RETURN:
trap #15
|-------------------------------------------------------------------------------
|-------------------------------------------------------------------------------
ALARM_EXCEPTION: | (addr: CHANGES ALL THE TIME IF CODE BEFORE
THIS POINT IS ADDED/REMOVED !!!!
|
1) **** Set INTR_STATUS = 1
move.l #INTR_STATUS,%a1
move.l #0x01,%a1@
nop
nop
nop
nop
nop
move.w IPR,%d0
|
3) **** Drive ALARM INDICATORS via TOUT
move.w #0xB632,%d0
| 0.201 sec / 65535 = 3.07uS per
increment of TMR1
| Set to 0x7F3D to set delay to ~
0.2sec period based on
|
prescalar and CE1-CE0 settings of TMR1
move.w %d0,TRR1
| Initialize Timer
Reference Register to reg. d6
move.w #0x893B,%d0
| Set timer (prescalar
field=0x0A), OM=1, ORI=1, FRR=1,
|
and CLK1-CLK0 = 01 for 0.201 sec. delay until
|
count = 0xFFFF
move.w %d0,TMR1
| Start Timer, toggle TOUT when
count = value in d6
bsr
DISABLE_INTERRUPT
|
4) **** Return to appropriate location per ALARM_LOCK
move.l #ALARM_LOCK,%a0 | get current value of
ALARM_LOCK
move.l
%a0@,%d0
cmp.l #0x00,%d0 | If ALARM_LOCK = 0 then return to Menu
beq CLEAR_ALARM
cmp.l #0x01,%d0 | If ALARM_LOCK = 1 then return to Password
beq LOCK_OUT
move.l #ERROR_RETURN,%a6
bsr DISPLAY
|-------------------------------------------------------------------------------
|-------------------------------------------------------------------------------
DISABLE_INTERRUPT:
move.l #0xFFFFFFFE,%d0 | Set Interrupt Mask register to disable
move.l %d0,IMR | interrupts on IRQ1
rts
|-------------------------------------------------------------------------------
|-------------------------------------------------------------------------------
INITIALIZE: | Initialize will place all the proper ASCII values of the
|
messages into memory sarting at the message's pointer
|
------- DEFINE MAIN_HEADER_MESSAGE --------
move.l
#MAIN_HEADER_MESSAGE,%a0 | pointer to
message
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x4F,%a0@+ | O
move.l
#0x4A,%a0@+ | J
move.l
#0x20,%a0@+ | SPACE
move.l
#0x53,%a0@+ | S
move.l
#0x45,%a0@+ | E
move.l
#0x43,%a0@+ | C
move.l
#0x55,%a0@+ | U
move.l
#0x52,%a0@+ | R
move.l
#0x49,%a0@+ | I
move.l
#0x54,%a0@+ | T
move.l
#0x59,%a0@+ | Y
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x2B,%a0@+ | +
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE GET_PASS_MESSAGE --------
move.l
#GET_PASS_MESSAGE,%a0 | pointer to
message
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0x45,%a0@+ | E
move.l
#0x4E,%a0@+ | N
move.l
#0x54,%a0@+ | T
move.l
#0x45,%a0@+ | E
move.l
#0x52,%a0@+ | R
move.l
#0x20,%a0@+ | SPACE
move.l
#0x41,%a0@+ | A
move.l
#0x43,%a0@+ | C
move.l
#0x43,%a0@+ | C
move.l
#0x45,%a0@+ | E
move.l
#0x53,%a0@+ | S
move.l
#0x53,%a0@+ | S
move.l
#0x20,%a0@+ | SPACE
move.l
#0x50,%a0@+ | P
move.l
#0x41,%a0@+ | A
move.l
#0x53,%a0@+ | S
move.l
#0x53,%a0@+ | S
move.l
#0x57,%a0@+ | W
move.l
#0x4F,%a0@+ | O
move.l
#0x52,%a0@+ | R
move.l
#0x44,%a0@+ | D
move.l
#0x3A,%a0@+ | :
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE SYSTEM_PASS --------
move.l
#SYSTEM_PASS,%a0 | pointer to
message
move.l
#0x31,%a0@+ | 1
move.l
#0x32,%a0@+ | 2
move.l
#0x33,%a0@+ | 3
move.l
#0x34,%a0@+ | 4
move.l
#0x35,%a0@+ | 5
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE STATUS_HEADER --------
move.l
#STATUS_HEADER,%a0 | pointer to message
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0x53,%a0@+ | S
move.l
#0x54,%a0@+ | T
move.l
#0x41,%a0@+ | A
move.l
#0x54,%a0@+ | T
move.l
#0x55,%a0@+ | U
move.l
#0x53,%a0@+ | S
move.l
#0x3A,%a0@+ | :
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE ACTION_HEADER --------
move.l
#ACTION_HEADER,%a0 | pointer to message
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0x55,%a0@+ | U
move.l
#0x53,%a0@+ | S
move.l
#0x45,%a0@+ | E
move.l
#0x52,%a0@+ | R
move.l
#0x20,%a0@+ | SPACE
move.l
#0x41,%a0@+ | A
move.l
#0x43,%a0@+ | C
move.l
#0x54,%a0@+ | T
move.l
#0x49,%a0@+ | I
move.l
#0x4F,%a0@+ | O
move.l
#0x4E,%a0@+ | N
move.l
#0x3A,%a0@+ | :
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE MENU_MESSAGE --------
move.l
#MENU_MESSAGE,%a0 | pointer to message
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0x0A,%a0@+ | NEWLINE
move.l
#0x0D,%a0@+ | CARRIAGE RETURN
move.l
#0x2D,%a0@+ | -
move.l
#0x2D,%a0@+ | -
move.l
#0x2D,%a0@+ | -
move.l
#0x2D,%a0@+ | -
move.l
#0x4F,%a0@+ | O
move.l
#0x50,%a0@+ | P
move.l
#0x54,%a0@+ | T
move.l
#0x49,%a0@+ | I
move.l
#0x4F,%a0@+ | O
move.l
#0x4E,%a0@+ | N
move.l
#0x53,%a0@+ | S
move.l
#0x2D,%a0@+ | -
move.l
#0x2D,%a0@+ | -
move.l
#0x2D,%a0@+ | -
move.l
#0x2D,%a0@+ | -
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0x28,%a0@+ | (
move.l
#0x31,%a0@+ | 1
move.l
#0x29,%a0@+ | )
move.l
#0x20,%a0@+ | SPACE
move.l
#0x2D,%a0@+ | -
move.l
#0x20,%a0@+ | SPACE
move.l
#0x41,%a0@+ | A
move.l
#0x52,%a0@+ | R
move.l
#0x4D,%a0@+ | M
move.l
#0x20,%a0@+ | SPACE
move.l
#0x53,%a0@+ | S
move.l
#0x59,%a0@+ | Y
move.l
#0x53,%a0@+ | S
move.l
#0x54,%a0@+ | T
move.l
#0x45,%a0@+ | E
move.l
#0x4D,%a0@+ | M
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE RETURN
move.l
#0x28,%a0@+ | (
move.l
#0x32,%a0@+ | 2
move.l
#0x29,%a0@+ | )
move.l
#0x20,%a0@+ | SPACE
move.l
#0x2D,%a0@+ | -
move.l
#0x20,%a0@+ | SPACE
move.l
#0x44,%a0@+ | D
move.l
#0x49,%a0@+ | I
move.l
#0x53,%a0@+ | S
move.l
#0x41,%a0@+ | A
move.l
#0x52,%a0@+ | R
move.l
#0x4D,%a0@+ | M
move.l
#0x20,%a0@+ | SPACE
move.l
#0x53,%a0@+ | S
move.l
#0x59,%a0@+ | Y
move.l
#0x53,%a0@+ | S
move.l
#0x54,%a0@+ | T
move.l
#0x45,%a0@+ | E
move.l
#0x4D,%a0@+ | M
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0x28,%a0@+ | (
move.l
#0x33,%a0@+ | 3
move.l
#0x29,%a0@+ | )
move.l
#0x20,%a0@+ | SPACE
move.l
#0x2D,%a0@+ | -
move.l
#0x20,%a0@+ | SPACE
move.l
#0x4C,%a0@+ | L
move.l
#0x4F,%a0@+ | O
move.l
#0x43,%a0@+ | C
move.l
#0x4B,%a0@+ | K
move.l
#0x20,%a0@+ | SPACE
move.l
#0x53,%a0@+ | S
move.l
#0x59,%a0@+ | Y
move.l
#0x53,%a0@+ | S
move.l
#0x54,%a0@+ | T
move.l
#0x45,%a0@+ | E
move.l
#0x4D,%a0@+ | M
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0x28,%a0@+ | (
move.l
#0x34,%a0@+ | 4
move.l
#0x29,%a0@+ | )
move.l
#0x20,%a0@+ | SPACE
move.l
#0x2D,%a0@+ | -
move.l
#0x20,%a0@+ | SPACE
move.l
#0x55,%a0@+ | U
move.l
#0x50,%a0@+ | P
move.l
#0x44,%a0@+ | D
move.l
#0x41,%a0@+ | A
move.l
#0x54,%a0@+ | T
move.l
#0x45,%a0@+ | E
move.l
#0x20,%a0@+ | SPACE
move.l
#0x53,%a0@+ | S
move.l
#0x54,%a0@+ | T
move.l
#0x41,%a0@+ | A
move.l
#0x54,%a0@+ | T
move.l
#0x55,%a0@+ | U
move.l
#0x53,%a0@+ | S
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0x28,%a0@+ | (
move.l
#0x35,%a0@+ | 5
move.l
#0x29,%a0@+ | )
move.l
#0x20,%a0@+ | SPACE
move.l
#0x2D,%a0@+ | -
move.l
#0x20,%a0@+ | SPACE
move.l
#0x51,%a0@+ | Q
move.l
#0x55,%a0@+ | U
move.l
#0x49,%a0@+ | I
move.l
#0x54,%a0@+ | T
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE SOUNDING_ALARM --------
move.l
#SOUNDING_ALARM,%a0 | pointer to message
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l #0xD,%a0@+ | CARRIAGE RETURN
move.l
#0x2A,%a0@+ | *
move.l
#0x2A,%a0@+ | *
move.l
#0x2A,%a0@+ | *
move.l
#0x41,%a0@+ | A
move.l
#0x20,%a0@+ | SPACE
move.l
#0x4C,%a0@+ | L
move.l
#0x20,%a0@+ | SPACE
move.l
#0x41,%a0@+ | A
move.l
#0x20,%a0@+ | SPACE
move.l
#0x52,%a0@+ | R
move.l
#0x20,%a0@+ | SPACE
move.l
#0x4D,%a0@+ | M
move.l
#0x20,%a0@+ | SPACE
move.l
#0x20,%a0@+ | SPACE
move.l
#0x20,%a0@+ | SPACE
move.l
#0x53,%a0@+ | S
move.l
#0x20,%a0@+ | SPACE
move.l
#0x4F,%a0@+ | O
move.l
#0x20,%a0@+ | SPACE
move.l
#0x55,%a0@+ | U
move.l
#0x20,%a0@+ | SPACE
move.l
#0x4E,%a0@+ | N
move.l
#0x20,%a0@+ | SPACE
move.l
#0x44,%a0@+ | D
move.l
#0x20,%a0@+ | SPACE
move.l
#0x49,%a0@+ | I
move.l
#0x20,%a0@+ | SPACE
move.l
#0x4E,%a0@+ | N
move.l
#0x20,%a0@+ | SPACE
move.l
#0x47,%a0@+ | G
move.l
#0x2A,%a0@+ | *
move.l
#0x2A,%a0@+ | *
move.l
#0x2A,%a0@+ | *
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE SYS_DISARMED --------
move.l
#SYS_DISARMED,%a0 | pointer to message
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0x53,%a0@+ | S
move.l
#0x59,%a0@+ | Y
move.l
#0x53,%a0@+ | S
move.l
#0x54,%a0@+ | T
move.l
#0x45,%a0@+ | E
move.l
#0x4D,%a0@+ | M
move.l
#0x20,%a0@+ | SPACE
move.l
#0x49,%a0@+ | I
move.l
#0x53,%a0@+ | S
move.l
#0x20,%a0@+ | SPACE
move.l
#0x44,%a0@+ | D
move.l
#0x49,%a0@+ | I
move.l
#0x53,%a0@+ | S
move.l
#0x41,%a0@+ | A
move.l
#0x52,%a0@+ | R
move.l
#0x4D,%a0@+ | M
move.l
#0x45,%a0@+ | E
move.l
#0x44,%a0@+ | D
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE SYS_ARMED --------
move.l
#SYS_ARMED,%a0 | pointer to
message
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0x53,%a0@+ | S
move.l
#0x59,%a0@+ | Y
move.l
#0x53,%a0@+ | S
move.l
#0x54,%a0@+ | T
move.l
#0x45,%a0@+ | E
move.l
#0x4D,%a0@+ | M
move.l
#0x20,%a0@+ | SPACE
move.l
#0x49,%a0@+ | I
move.l
#0x53,%a0@+ | S
move.l
#0x20,%a0@+ | SPACE
move.l
#0x41,%a0@+ | A
move.l
#0x52,%a0@+ | R
move.l
#0x4D,%a0@+ | M
move.l
#0x45,%a0@+ | E
move.l
#0x44,%a0@+ | D
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE SYS_PENDING --------
move.l
#SYS_PENDING,%a0 | pointer to
message
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0x53,%a0@+ | S
move.l
#0x59,%a0@+ | Y
move.l
#0x53,%a0@+ | S
move.l
#0x54,%a0@+ | T
move.l
#0x45,%a0@+ | E
move.l
#0x4D,%a0@+ | M
move.l
#0x20,%a0@+ | SPACE
move.l
#0x49,%a0@+ | I
move.l
#0x53,%a0@+ | S
move.l
#0x20,%a0@+ | SPACE
move.l
#0x50,%a0@+ | P
move.l
#0x45,%a0@+ | E
move.l
#0x4E,%a0@+ | N
move.l
#0x44,%a0@+ | D
move.l
#0x49,%a0@+ | I
move.l
#0x4E,%a0@+ | N
move.l
#0x47,%a0@+ | G
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE SYS_SECURE --------
move.l
#SYS_SECURE,%a0 | pointer to
message
move.l
#0x2C,%a0@+ | ,
move.l
#0x20,%a0@+ | SPACE
move.l
#0x41,%a0@+ | A
move.l
#0x4E,%a0@+ | N
move.l
#0x44,%a0@+ | D
move.l
#0x20,%a0@+ | SPACE
move.l
#0x53,%a0@+ | S
move.l
#0x45,%a0@+ | E
move.l
#0x43,%a0@+ | C
move.l
#0x55,%a0@+ | U
move.l
#0x52,%a0@+ | R
move.l
#0x45,%a0@+ | E
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE SYS_NOT_SECURE --------
move.l
#SYS_NOT_SECURE,%a0 | pointer to message
move.l
#0x2C,%a0@+ | ,
move.l
#0x20,%a0@+ | SPACE
move.l
#0x41,%a0@+ | A
move.l
#0x4E,%a0@+ | N
move.l
#0x44,%a0@+ | D
move.l
#0x20,%a0@+ | SPACE
move.l
#0x4E,%a0@+ | N
move.l
#0x4F,%a0@+ | O
move.l
#0x54,%a0@+ | T
move.l
#0x20,%a0@+ | SPACE
move.l
#0x53,%a0@+ | S
move.l
#0x45,%a0@+ | E
move.l
#0x43,%a0@+ | C
move.l
#0x55,%a0@+ | U
move.l
#0x52,%a0@+ | R
move.l
#0x45,%a0@+ | E
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE RETURN
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE ERROR_RETURN --------
move.l
#ERROR_RETURN,%a0 | pointer to message
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0x45,%a0@+ | E
move.l
#0x52,%a0@+ | R
move.l
#0x52,%a0@+ | R
move.l
#0x4F,%a0@+ | O
move.l
#0x52,%a0@+ | R
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE WARNING_HEADER --------
move.l
#WARNING_HEADER,%a0 | pointer to message
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0x57,%a0@+ | W
move.l
#0x41,%a0@+ | A
move.l
#0x52,%a0@+ | R
move.l
#0x4E,%a0@+ | N
move.l
#0x49,%a0@+ | I
move.l
#0x4E,%a0@+ | N
move.l
#0x47,%a0@+ | G
move.l
#0x28,%a0@+ | (
move.l
#0x53,%a0@+ | S
move.l
#0x29,%a0@+ | )
move.l
#0x3A,%a0@+ | :
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE CHAR_BS --------
move.l
#CHAR_BS,%a0 | pointer to message
move.l
#0x08,%a0@+ | BS
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE CHAR_AS --------
move.l
#CHAR_AS,%a0 | pointer to message
move.l
#0x2A,%a0@+ | *
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE CHAR_SP --------
move.l
#CHAR_SP,%a0 | pointer to message
move.l
#0x20,%a0@+ | SP
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE USER_ARMED --------
move.l
#USER_ARMED,%a0 | pointer to
message
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0x28,%a0@+ | (
move.l
#0x4D,%a0@+ | M
move.l
#0x41,%a0@+ | A
move.l
#0x53,%a0@+ | S
move.l
#0x54,%a0@+ | T
move.l
#0x45,%a0@+ | E
move.l
#0x52,%a0@+ | R
move.l
#0x20,%a0@+ | SPACE
move.l
#0x41,%a0@+ | A
move.l
#0x54,%a0@+ | T
move.l
#0x54,%a0@+ | T
move.l
#0x45,%a0@+ | E
move.l
#0x4D,%a0@+ | M
move.l
#0x50,%a0@+ | P
move.l
#0x54,%a0@+ | T
move.l
#0x53,%a0@+ | S
move.l
#0x20,%a0@+ | SPACE
move.l
#0x54,%a0@+ | T
move.l
#0x4F,%a0@+ | O
move.l
#0x20,%a0@+ | SPACE
move.l
#0x41,%a0@+ | A
move.l
#0x52,%a0@+ | R
move.l
#0x4D,%a0@+ | M
move.l
#0x20,%a0@+ | SPACE
move.l
#0x53,%a0@+ | S
move.l
#0x59,%a0@+ | Y
move.l
#0x53,%a0@+ | S
move.l
#0x54,%a0@+ | T
move.l
#0x45,%a0@+ | E
move.l
#0x4D,%a0@+ | M
move.l
#0x29,%a0@+ | )
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE USER_DISARMED --------
move.l
#USER_DISARMED,%a0 | pointer to message
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0x28,%a0@+ | (
move.l
#0x4D,%a0@+ | M
move.l
#0x41,%a0@+ | A
move.l
#0x53,%a0@+ | S
move.l
#0x54,%a0@+ | T
move.l
#0x45,%a0@+ | E
move.l
#0x52,%a0@+ | R
move.l
#0x20,%a0@+ | SPACE
move.l
#0x48,%a0@+ | H
move.l
#0x41,%a0@+ | A
move.l
#0x53,%a0@+ | S
move.l
#0x20,%a0@+ | SPACE
move.l
#0x44,%a0@+ | D
move.l
#0x49,%a0@+ | I
move.l
#0x53,%a0@+ | S
move.l
#0x41,%a0@+ | A
move.l
#0x52,%a0@+ | R
move.l
#0x4D,%a0@+ | M
move.l
#0x45,%a0@+ | E
move.l
#0x44,%a0@+ | D
move.l
#0x20,%a0@+ | SPACE
move.l
#0x53,%a0@+ | S
move.l
#0x59,%a0@+ | Y
move.l
#0x53,%a0@+ | S
move.l
#0x54,%a0@+ | T
move.l
#0x45,%a0@+ | E
move.l
#0x4D,%a0@+ | M
move.l
#0x29,%a0@+ | )
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE USER_NONE --------
move.l
#USER_NONE,%a0 | pointer to message
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0x28,%a0@+ | (
move.l
#0x4E,%a0@+ | N
move.l
#0x4F,%a0@+ | O
move.l
#0x4E,%a0@+ | N
move.l
#0x45,%a0@+ | E
move.l
#0x29,%a0@+ | )
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE F_DOOR_ERR --------
move.l
#F_DOOR_ERR,%a0 | pointer to
message
move.l
#0x0A,%a0@+ | NEWLINE
move.l
#0x0D,%a0@+ | CARRIAGE RETURN
move.l
#0x46,%a0@+ | F
move.l
#0x52,%a0@+ | R
move.l
#0x4F,%a0@+ | O
move.l
#0x4E,%a0@+ | N
move.l
#0x54,%a0@+ | T
move.l
#0x20,%a0@+ | SPACE
move.l
#0x44,%a0@+ | D
move.l
#0x4F,%a0@+ | O
move.l
#0x4F,%a0@+ | O
move.l
#0x52,%a0@+ | R
move.l
#0x20,%a0@+ | SPACE
move.l
#0x49,%a0@+ | I
move.l
#0x53,%a0@+ | S
move.l
#0x20,%a0@+ | SPACE
move.l
#0x4F,%a0@+ | O
move.l
#0x50,%a0@+ | P
move.l
#0x45,%a0@+ | E
move.l
#0x4E,%a0@+ | N
move.l
#0x20,%a0@+ | SPACE
move.l
#0x21,%a0@+ | !
move.l
#0x21,%a0@+ | !
move.l
#0x21,%a0@+ | !
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE B_DOOR_ERR --------
move.l
#B_DOOR_ERR,%a0 | pointer to
message
move.l
#0x0A,%a0@+ | NEWLINE
move.l
#0x0D,%a0@+ | CARRIAGE RETURN
move.l
#0x42,%a0@+ | B
move.l
#0x41,%a0@+ | A
move.l
#0x43,%a0@+ | C
move.l
#0x4B,%a0@+ | K
move.l
#0x20,%a0@+ | SPACE
move.l
#0x44,%a0@+ | D
move.l
#0x4F,%a0@+ | O
move.l
#0x4F,%a0@+ | O
move.l
#0x52,%a0@+ | R
move.l
#0x20,%a0@+ | SPACE
move.l
#0x49,%a0@+ | I
move.l
#0x53,%a0@+ | S
move.l
#0x20,%a0@+ | SPACE
move.l
#0x4F,%a0@+ | O
move.l
#0x50,%a0@+ | P
move.l
#0x45,%a0@+ | E
move.l
#0x4E,%a0@+ | N
move.l
#0x20,%a0@+ | SPACE
move.l
#0x21,%a0@+ | !
move.l
#0x21,%a0@+ | !
move.l
#0x21,%a0@+ | !
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE WIN_ERR --------
move.l
#WIN_ERR,%a0 | pointer to message
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE RETURN
move.l
#0x57,%a0@+ | W
move.l
#0x49,%a0@+ | I
move.l
#0x4E,%a0@+ | N
move.l
#0x44,%a0@+ | D
move.l
#0x4F,%a0@+ | O
move.l
#0x57,%a0@+ | W
move.l
#0x20,%a0@+ | SPACE
move.l
#0x49,%a0@+ | I
move.l
#0x53,%a0@+ | S
move.l
#0x20,%a0@+ | SPACE
move.l
#0x4F,%a0@+ | O
move.l
#0x50,%a0@+ | P
move.l
#0x45,%a0@+ | E
move.l
#0x4E,%a0@+ | N
move.l
#0x20,%a0@+ | SPACE
move.l
#0x21,%a0@+ | !
move.l
#0x21,%a0@+ | !
move.l
#0x21,%a0@+ | !
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE G_DOOR_ERR --------
move.l
#G_DOOR_ERR,%a0 | pointer to
message
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE RETURN
move.l
#0x47,%a0@+ | G
move.l
#0x41,%a0@+ | A
move.l
#0x52,%a0@+ | R
move.l
#0x41,%a0@+ | A
move.l
#0x47,%a0@+ | G
move.l
#0x45,%a0@+ | E
move.l
#0x20,%a0@+ | SPACE
move.l
#0x49,%a0@+ | I
move.l
#0x53,%a0@+ | S
move.l
#0x20,%a0@+ | SPACE
move.l
#0x4F,%a0@+ | O
move.l
#0x50,%a0@+ | P
move.l
#0x45,%a0@+ | E
move.l
#0x4E,%a0@+ | N
move.l
#0x20,%a0@+ | SPACE
move.l
#0x21,%a0@+ | !
move.l
#0x21,%a0@+ | !
move.l
#0x21,%a0@+ | !
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE CAN_NOT_ARM --------
move.l
#CAN_NOT_ARM,%a0 | pointer to
message
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0x53,%a0@+ | S
move.l
#0x59,%a0@+ | Y
move.l
#0x53,%a0@+ | S
move.l
#0x54,%a0@+ | T
move.l
#0x45,%a0@+ | E
move.l
#0x4D,%a0@+ | M
move.l
#0x20,%a0@+ | SPACE
move.l
#0x43,%a0@+ | C
move.l
#0x41,%a0@+ | A
move.l
#0x4E,%a0@+ | N
move.l
#0x20,%a0@+ | SPACE
move.l
#0x4E,%a0@+ | N
move.l
#0x4F,%a0@+ | O
move.l
#0x54,%a0@+ | T
move.l
#0x20,%a0@+ | SPACE
move.l
#0x42,%a0@+ | B
move.l
#0x45,%a0@+ | E
move.l
#0x20,%a0@+ | SPACE
move.l
#0x41,%a0@+ | A
move.l
#0x52,%a0@+ | R
move.l
#0x4D,%a0@+ | M
move.l
#0x45,%a0@+ | E
move.l
#0x44,%a0@+ | D
move.l
#0x20,%a0@+ | SPACE
move.l
#0x21,%a0@+ | !
move.l
#0x21,%a0@+ | !
move.l
#0x21,%a0@+ | !
move.l
#0x03,%a0@+ | ETX
|
------- DEFINE INVALID_PASSWORD --------
move.l
#INVALID_PASSWORD,%a0 |
pointer to message
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0xA,%a0@+ | NEWLINE
move.l
#0xD,%a0@+ | CARRIAGE
RETURN
move.l
#0x49,%a0@+ | I
move.l
#0x4E,%a0@+ | N
move.l
#0x56,%a0@+ | V
move.l
#0x41,%a0@+ | A
move.l
#0x4C,%a0@+ | L
move.l
#0x49,%a0@+ | I
move.l
#0x44,%a0@+ | D
move.l
#0x20,%a0@+ | SPACE
move.l
#0x50,%a0@+ | P
move.l
#0x41,%a0@+ | A
move.l
#0x53,%a0@+ | S
move.l
#0x53,%a0@+ | S
move.l
#0x57,%a0@+ | W
move.l
#0x4F,%a0@+ | O
move.l
#0x52,%a0@+ | R
move.l
#0x44,%a0@+ | D
move.l
#0x21,%a0@+ | !
move.l
#0x21,%a0@+ | !
move.l
#0x21,%a0@+ | !
move.l
#0x03,%a0@+ | ETX
|
**** Initialize ALARM Status flag to disabled
move.l
#ALARM_STATUS,%a0 | initialize alarm to
disabled
move.l
#0x01,%a0@
|
**** Initialize ALARM Sounding flag to off
move.l
#INTR_STATUS,%a0 | initialize
alarm sounding to disabled
move.l
#0x00,%a0@
|
**** Invalid password was not just entered (1 time initialization)
move.l
#INVALID_PASS_STATUS,%a0
move.l
#0x00,%a0@
rts
|-------------------------------------------------------------------------------
|-------------------------------------------------------------------------------
WELCOME:
|
**** Set flag to indicate that system is "locked" in the case that
the ALARM is triggered (INT_1)
move.l
#ALARM_LOCK,%A0
move.l
#0x01,%A0@
|
**** Display OJ SECURITY initialization message to DEBUG
move.l #MAIN_HEADER_MESSAGE,%a6 | pointer to message
bsr
DISPLAY | output to DBUG
|
**** Display invalid password message to DEBUG if appropriate
move.l #INVALID_PASS_STATUS,%a0 | pointer to message
move.l %a0@,%d0
cmp.l #0x01,%d0
bne SKIP_INVALID_MESSAGE
move.l #INVALID_PASSWORD,%a6 | pointer to message
bsr
DISPLAY | output to DBUG
move.l #INVALID_PASS_STATUS,%a0 | pointer to message
move.l #0x00,%a0@
SKIP_INVALID_MESSAGE:
|
**** Display ALARM Sounding message to DEBUG if appropriate
move.l #INTR_STATUS,%a0
move.l %a0@,%d0
and.l #0x01,%d0 | (set Z if INTR_STATUS = 0)
beq SKIP_SOUNDING_ALARM1
move.l
#SOUNDING_ALARM,%a6
bsr DISPLAY
SKIP_SOUNDING_ALARM1:
|
**** Display password entry prompt ro DEBUG
move.l #GET_PASS_MESSAGE,%a6 | pointer to message
bsr
DISPLAY | output to DBUG
|
**** Get User's Password
move.l
#USER_PASS,%a5 | pointer to user pword
bsr
GET_PASSWORD | get user input
|
**** Compare User's Password with correct password
move.l #USER_PASS,%a0 |
pointer to user pword
move.l #SYSTEM_PASS,%a1 | pointer to system pword
TEST_PASS:
move.l %a0@+,%d4 |
get letter from user pass
move.l %a1@+,%d5 |
get letter from system pass
cmp.l #0x03,%d5 | check if the sys pword is @ ETX
beq
WELCOME_DONE | if we reach ETX, pword must be good
cmp.l
%d4,%d5 |
compare user pword to sys pword
beq
TEST_PASS | go back and test next char
|
**** Set FLAG to indicate that password entry was incorrect
move.l #INVALID_PASS_STATUS,%a0 | pointer to message
move.l #0x01,%a0@
|
**** Repeat password entry prompt
bra WELCOME | go back and try again
|
**** Entered password was correct
WELCOME_DONE:
rts
|-------------------------------------------------------------------------------
|-------------------------------------------------------------------------------
MENU:
|
1) Set ALARM_LOCK = 0 (allow user access to MENU in case of ALARM trigger)
move.l
#ALARM_LOCK,%A0
move.l
#0x00,%A0@
move.l #MENU_MESSAGE,%a6 | pointer to message
bsr DISPLAY | output to DBUG
move.l #USER_SELECTION,%a5 | pointer to user input
bra GET_SELECTION | get user input
GET_SELECTION_RET:
bra MENU
|-------------------------------------------------------------------------------
|-------------------------------------------------------------------------------
DISPLAY: | This sub routine assumes that A6 contains
|
the address of a string to be displayed
|
the string must be terminated by ASCII #3
|
END OF TEXT
NEXT_CHAR:
move.l
%a6@+,%d1 | load letter from mem
cmp.l
#0x3,%d1 |
loop back until
beq
DISPLAY_DONE| ETX is found
move.l
#0x0013,%d0 | display to user
trap #15 |
using DBUG
bra
NEXT_CHAR
DISPLAY_DONE:
rts
|-------------------------------------------------------------------------------
|-------------------------------------------------------------------------------
GET_PASSWORD: | Gets input from user using debug module
|
until carriage return is pressed.
|
Assumes that A5 contains the addr of where
|
the data is to be stored. It will also
|
append ETX to the end of the string
move.l
#0x00,%d3 | current char
count
GI_TOP:
move.l
#0x0010,%d0 | Wait for input char
trap
#15
move.l
%d1,%d4 | copy input char into
d4
cmp.l
#0x08,%d1 | compare input char
w/ BS
bne GI_SKIP |
if input char was not BS than jmp GI_SKIP1
|
------- FOLLOWING CODE IS EXECUTED IF INPUT CHAR WAS BS ------
cmp.l #0x00,%d3 |
compare char count w/ min char count "1"
beq
GI_TOP | jmp to GI_TOP if no
input chars to delete
move.l
#CHAR_BS,%a6
bsr
DISPLAY
move.l
#CHAR_SP,%a6
bsr
DISPLAY
move.l
#CHAR_BS,%a6
bsr
DISPLAY
sub.l
#0x01,%d3 | decrement char count
sub.l
#0x04,%a5 | decrement mem pointer of
user's entered string
bra
GI_TOP
GI_SKIP:
|
------- FOLLOWING CODE IS EXECUTED IF INPUT CHAR WAS NOT BS ------
cmp.l
#0x08,%d3 | compare char count w/ max
char count "8"
beq
GI_TOP
move.l
%d4,%a5@+ | store input char
into mem
add.l
#0x01,%d3 | increment char
count
cmp.l
#0x0d,%d1 | cmp input char with
CR
beq
DONE_ENTRY | jmp to DONE_ENTRY if CR was entered
move.l
#CHAR_AS,%a6 | display * in place of
entered char
bsr
DISPLAY
bra
GI_TOP
DONE_ENTRY:
move.l
#0x03,%a5@+ | add ETX to end of
string
rts
|-------------------------------------------------------------------------------
|-------------------------------------------------------------------------------
GET_SELECTION:
move.l
#0x0010,%d0 | Wait for input char
trap
#15
cmp.l #0x31,%d1 |
compare input char "1"
beq ARM_SYSTEM
cmp.l #0x32,%d1 |
compare input char "2"
beq DISARM_SYSTEM
cmp.l #0x33,%d1 |
compare input char "3"
beq LOCK_OUT
cmp.l #0x35,%d1 |
compare input char "5"
beq GET_OUT
cmp.l #0x34,%d1 |
compare input char "4"
bne SKIP_UPDATE
move.l #CFI,%a0
move.l
#0x03,%a0@
bra GET_STATUS
GET_OUT:
trap #15
SKIP_UPDATE:
bra GET_SELECTION
|-------------------------------------------------------------------------------
|-------------------------------------------------------------------------------
ARM_SYSTEM:
|
1) **** Set ALARM_STATUS = 0 (Pending)
move.l #ALARM_STATUS,%a0
move.l #0x00,%a0@
|
2) **** Set Calling Function Indicator CFI = 0x01
move.l #CFI,%a0
move.l
#0x01,%a0@
|
4) **** Call GET_STATUS
bra GET_STATUS
GET_STATUS_RET1:
|
1) **** Get INTR_STATUS
move.l #INTR_STATUS,%a0| 0=ALARM ALREADY SOUNDING
move.l
%a0@,%d0
cmp.l #0x01,%d0 | set Z if ALARM IS ALREADY SOUNDING
beq SKIP_ARM_SYSTEM2
|
1) **** Get SECURE_STATUS
move.l #SECURE_STATUS,%a0| 1=secure, 0=not secure
move.l
%a0@,%d0
cmp.l #0x00,%d0 | set Z if SECURE_STATUS = 1 (sys is secure)
beq SKIP_ARM_SYSTEM1
move.w #0xB632,%d0
| 0.201 sec / 65535 = 3.07uS per
increment of TMR1
|
Set to 0x7F3D to set delay to ~ 0.2sec period based on
|
prescalar and CE1-CE0 settings of TMR1
move.w %d0,TRR2
| Initialize Timer
Reference Register to reg. d6
move.w #0x893B,%d0
| Set timer (prescalar
field=0x0A), OM=1, ORI=1, FRR=1,
|
and CLK1-CLK0 = 01 for 0.201 sec. delay until
|
count = 0xFFFF
move.w %d0,TMR2
| Start Timer, toggle TOUT when
count = value in d6
|
3) **** Set ALARM_STATUS = 2 (Alarm Set)
move.l #ALARM_STATUS,%a0
move.l #0x02,%a0@
move.l #0xFFFFFFFC,%d0 |
Set Interrupt Mask register to allow
move.l %d0,IMR |
interupts on IRQ1
bra
ARM_SYS_DONE
SKIP_ARM_SYSTEM1:
move.l
#CAN_NOT_ARM,%a6
bsr
DISPLAY
move.l #ALARM_STATUS,%a0
move.l #0x01,%a0@
bra ARM_SYS_DONE
SKIP_ARM_SYSTEM2:
move.l #ALARM_STATUS,%a0
move.l #0x02,%a0@
ARM_SYS_DONE:
bra GET_SELECTION_RET
|-------------------------------------------------------------------------------
| Alarm excpetion used to be here
|-------------------------------------------------------------------------------
DISARM_SYSTEM:
bsr
DISABLE_INTERRUPT
|
**** Set Flag so that GET_STATUS returns to GET_STATUS_RET2 upon completion
move.l #CFI,%a0
move.l
#0x02,%a0@
|
3) **** Set ALARM_STATUS = 1
move.l #ALARM_STATUS,%a0
move.l #0x01,%a0@
|
4) **** Set INTR_STATUS = 0
move.l #INTR_STATUS,%a1
move.l #0x00,%a1@
|
5) **** Call GET_STATUS
bra
GET_STATUS
GET_STATUS_RET2:
|
6) **** Shut off TOUT0 & TOUT1
move.w
#0x0000,%d6 | CLK1-CLK0 = 00
move.w
%d6,TMR1 |
move.w
#0x0000,%d6 | CLK1-CLK0 = 00
move.w
%d6,TMR2 |
bra GET_SELECTION_RET
|-------------------------------------------------------------------------------
|-------------------------------------------------------------------------------
GET_STATUS:
|
1) **** Display System Main Header to
Debug
move.l #MAIN_HEADER_MESSAGE,%a6
bsr DISPLAY
|
2) **** Display Action Header to Debug
move.l #ACTION_HEADER,%a6
bsr DISPLAY
|
3) **** Get CFI (Display User Armed/Disarmed/no action messages accordingly)
move.l #CFI,%a1
move.l %a1@,%d0
sub.l #0x01,%d0 | (Z is set if CFI = 1 => called from SYS ARMED Function)
bne SKIP_ACTION1
|
**** Message to DEBUG indicating that user has "Armed system"
move.l
#USER_ARMED,%a6
bsr
DISPLAY
bra SKIP_ACTION3
SKIP_ACTION1:
sub.l #0x01,%d0 | (Z is set if CFI = 2 => called from SYS DISARMED Function)
bne SKIP_ACTION2
|
**** Message to DEBUG indicating that user has "Disarmed system"
move.l #USER_DISARMED,%a6
bsr DISPLAY
bra SKIP_ACTION3
SKIP_ACTION2:
|
**** Message to DEBUG indicating that user has made no action
move.l #USER_NONE,%a6
bsr DISPLAY
SKIP_ACTION3:
|
4) Display Sounding Alarm Message to Debug Module if INTR_STATUS = 1
move.l #INTR_STATUS,%a0
move.l %a0@,%d0
and.l #0x01,%d0 | (set Z if INTR_STATUS = 0)
beq SKIP_SOUNDING_ALARM2
move.l
#SOUNDING_ALARM,%a6
bsr DISPLAY
SKIP_SOUNDING_ALARM2:
|
5) **** Display System Status Header to Debug
move.l #STATUS_HEADER,%a6
bsr DISPLAY
|
6) **** Get ALARM_STATUS
move.l #ALARM_STATUS,%a0 | get current
ARMED/DISARMED status
move.l
%a0@,%d1
|
7) **** Display either SYS_DISARMED or SYS_ARMED message to Debug Module
cmp.l #0x02,%d1
bne CHECK_SYS_NOT_ARM
move.l #SYS_ARMED,%a6
bra DONE_DISP_MESSAGE
CHECK_SYS_NOT_ARM:
cmp.l #0x01,%d1
bne DISP_PENDING
move.l #SYS_DISARMED,%a6
bra DONE_DISP_MESSAGE
DISP_PENDING:
move.l #SYS_PENDING,%a6
DONE_DISP_MESSAGE:
bsr DISPLAY
|
8) **** Read Parallel Port (ALARM SENSORS)
move.w #0xFF00,%a1 |
Use PP ports for parallel I/O
move.w %a1,PAR
move.w #0x000F,%a1 |
PP[0:3] output - PP[4:7] input
move.w %a1,PADDR
move.w PADAT,%d0 |
read data in from parallel I/O
lsr.l #0x04,%d0 |
move read data to bits 0-3
and.l #0x0F,%d0 |
mask only desired bits (0-3)
mov.l %d0,%d4
|
10) **** Convert read input from Parallel Port PP[4]-PP[7] to necessary output
for Parallel Port PP[0]-PP[3]
move.w #0xFF00,%a1 |
Use PP ports for parallel I/O
move.w %a1,PAR
move.w #0x000F,%a1 |
PP[0:3]& PP[8]as output - PP[4:7] input
move.w %a1,PADDR
move.l #0x0F,%d5
sub.l %d4,%d5
move.w %d5,PADAT |
enable appropriate alarm indicators
cmp.l #0x0F,%d4
bne NOT_SECURE
| **** STEPS 8 WILL EXECUTE IF SYSTEM IS
SECURE
|
9) **** Set SECURE_STATUS = 1
move.l #SECURE_STATUS,%a0 | get current
ARMED/DISARMED status
move.l
#0x01,%a0@
|
10) Display System Secure Message to Debug Module
move.l
#SYS_SECURE,%a6
bsr DISPLAY
bra FIN_GET_STATUS
NOT_SECURE:
|
9) **** Set SECURE_STATUS = 0
move.l #SECURE_STATUS,%a0 | get current
ARMED/DISARMED status
move.l
#0x00,%a0@
move.l #INTR_STATUS,%a0
move.l %a0@,%d0
|
10) Display System Not Secure Message to Debug Module
move.l
#SYS_NOT_SECURE,%a6
bsr DISPLAY
move.l
#WARNING_HEADER,%a6
bsr DISPLAY
|
11) **** Display Triggered Alarm(s) to Debug Module
move.l #F_DOOR_ERR,%a6
move.l %d4,%d5
and.l #0x01,%d5
bne SKIP_FD
bsr DISPLAY
SKIP_FD:
move.l #WIN_ERR,%a6
move.l %d4,%d5
and.l #0x02,%d5
bne SKIP_WIN
bsr DISPLAY
SKIP_WIN:
move.l #G_DOOR_ERR,%a6
move.l %d4,%d5
and.l #0x04,%d5
bne SKIP_GAR
bsr DISPLAY
SKIP_GAR:
move.l #B_DOOR_ERR,%a6
move.l %d4,%d5
and.l #0x08,%d5
bne SKIP_BD
bsr DISPLAY
SKIP_BD:
FIN_GET_STATUS:
|
**** Return to specified Calling Function per CFI
move.l #CFI,%a0
| get current CFI
move.l
%a0@,%d0
cmp.l #0x00,%d0 |
If CFI = 0 then return to MAIN function
beq
GET_STATUS_RET0
cmp.l #0x01,%d0 |
If CFI = 1 then return to ARM_SYSTEM function
beq
GET_STATUS_RET1
cmp.l #0x02,%d0 |
If CFI = 2 then return to DISARM_SYSTEM function
beq
GET_STATUS_RET2
cmp.l #0x03,%d0 |
If CFI = 3 then return to USER_SELECTION function
beq
GET_SELECTION_RET
move.l #ERROR_RETURN,%a6
bsr DISPLAY
|-------------------------------------------------------------------------------
|
|
|||||||||
|