home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
249.lha
/
BrBox_v1.0
/
BrBox.asm
< prev
next >
Wrap
Assembly Source File
|
1989-06-05
|
10KB
|
310 lines
; Breakout Box V1.0
; Displays a little window which shows the status of the serial
; port bits: Clear to Send (CTS), Ready to Send (RTS), Carrier
; Detect (CD), Data Set Ready (DSR), Data Terminal Ready (DTR).
; The program runs constantly, updating the display 5 times per
; second. It also monitors for a Close-gadget message from
; intuition.
;
; To execute: From CLI, BRBOX or RUN BRBOX or RUNBACK BRBOX
; From WorkBench, just double-click the icon
;
; The monitor window has a drag bar hidden under the status
; indicators, which means you can move it around on the WorkBench
; window and get it out of your way.
;
;
****************************************************************************
*
* INCLUDE FILES
*
****************************************************************************
NOLIST ; don't list included files
INCLUDE "exec/types.i" ; for following includes
INCLUDE "exec/alerts.i" ; to access ALERT macro
INCLUDE "exec/ports.i" ; to access message structure
INCLUDE "libraries/dosextens.i" ; to access process structure
INCLUDE "intuition/intuition.i" ; to access intuition structures
****************************************************************************
*
* External References
*
****************************************************************************
XREF _AbsExecBase
XREF _LVOAlert
XREF _LVOCloseLibrary
XREF _LVOCloseWindow
XREF _LVODelay
XREF _LVOFindTask
XREF _LVOForbid
XREF _LVOGetMsg
XREF _LVOOpenLibrary
XREF _LVOOpenWindow
XREF _LVOPrintIText
XREF _LVOReplyMsg
XREF _LVOWaitPort
XREF _LVOWrite
LIST ; turn on program listing
***************************************************************************
*
* Program Startup Code
*
***************************************************************************
Begin:
move.l #0,returnMsg ; zap return message hold
move.l sp,initialSP ; initial task stack pointer
movea.l _AbsExecBase,a6 ; get exec base
move.l a6,ExecBase ; save it off somewhere close
bsr openDOS ; attempt to open DOS library
bsr openINT ; open Intuition library
suba.l a1,a1 ; zero task name pointer
jsr _LVOFindTask(a6) ; get the address of this task
movea.l d0,a4 ; task address in a4
tst.l pr_CLI(a4) ; are we running in WB?
bne DoMain ; no, skip WB-specific stuff
***************************************************************************
*
* Workbench Startup Code
*
***************************************************************************
bsr waitmsg ; wait for start message
move.l d0,returnMsg ; save message for later
***************************************************************************
*
* Main Program
*
***************************************************************************
DoMain:
bsr DrawWind ; draw display window
check:
move.b $BFD000,d3 ; grab CIAB data reg. 1 contents
lea IText1,a1 ; get address of IntuiText 1
chkbit:
move.l a1,d0 ; is the address in a1 0?
beq outofit ; yes, end of loop
moveq #3,d0 ; put a color 3 into d0
moveq #0,d2 ; put a 0 into d2
asl.b #1,d3 ; push top bit into Xtend flag
subx.b d2,d0 ; sub d2(0) and X bit from d2(3)
move.b d0,it_FrontPen(a1) ; make foreground pen 2 or 3
movea.l it_NextText(a1),a1 ; get address of next IntuiText
bra chkbit ; now check again
outofit:
movea.l windptr,a0 ; grab window pointer
movea.l wd_RPort(a0),a0 ; get the RasterPort of window
lea IText1,a1 ; snatch up the IText struct
moveq.l #0,d0 ; set up left offset
moveq.l #0,d1 ; ditto for top offset
movea.l IntBase,a6 ; grab base of intuition lib.
jsr _LVOPrintIText(a6) ; print the texts
movea.l windptr,a0 ; grab window pointer
movea.l wd_UserPort(a0),a0 ; get UserPort from window
movea.l ExecBase,a6 ; get Execbase
jsr _LVOGetMsg(a6) ; grab any messages pending
tst.l d0 ; was there anything?
beq endloop ; no, just do it again
movea.l d0,a1 ; message waiting: set up...
move.l im_Class(a1),d4 ; to reply to it
move.w im_Code(a1),d5 ;
movea.l im_IAddress(a1),a2 ;
jsr _LVOReplyMsg(a6) ; reply to message
cmpi.l #CLOSEWINDOW,d4 ; was the message CLOSEWINDOW?
beq bye ; yep, we gotta go now!
endloop: ; no CLOSEWINDOW message, loop!
movea.l DOSBase,a6 ; DOS pointer
move.l #10,d1 ; 10 20 ms clock ticks delay
jsr _LVODelay(a6) ; delay 1/5 second
bra check ; and check again
;
; termination code
;
bye movea.l IntBase,a6 ; get intuition library base
movea.l windptr,a0 ; set up to close the window
jsr _LVOCloseWindow(a6) ; shut that window!
moveq.l #0,d0 ; sucess return code for CLI
exit
movea.l initialSP,sp ; restore stack pointer
move.l d0,-(sp) ; push return code
movea.l ExecBase,a6 ; use exec library pointer
move.l DOSBase,d0 ; get dos.library pointer
beq.s 1$ ; skip close if DOS.lib not open
movea.l d0,a1 ; move lib base into a1
jsr _LVOCloseLibrary(a6) ; close dos.library
1$
move.l IntBase,d0 ; now grab intuition.library ptr
beq.s 2$ ; zero, so no need to close
movea.l d0,a1 ; put it where we can use it
jsr _LVOCloseLibrary(a6) ; close intuition.library
2$
move.l returnMsg,d0 ; grab returnMsg
beq.s 3$ ; if zero, no need to return msg
jsr _LVOForbid(a6) ; so WB won't UnloadSeg us
movea.l returnMsg,a1 ; startup message
jsr _LVOReplyMsg(a6) ; many happy returns!
3$
move.l (sp)+,d0 ; pop result code from stack
rts ; this oughta take us home
*************************END OF NORMAL PROCESSING***************************
*
* There be subroutines here!
*
****************************************************************************
* This routine gets the message that Workbench will send to us
* - Called with task id in a4
waitmsg
lea pr_MsgPort(a4),a0 ; our process base
jsr _LVOWaitPort(a6) ; wait for a message
lea pr_MsgPort(a4),a0 ; same old process base
jsr _LVOGetMsg(a6) ; get the message
rts
****************************************************************************
* This routine draws the little monitor window.
*
DrawWind
movea.l IntBase,a6 ; get Intuition base
lea NewWind,a0 ; point to NewWindow struct
jsr _LVOOpenWindow(a6) ; open the puppy
move.l d0,windptr ; save the window pointer
rts
****************************************************************************
* This routine opens the dos.library and saves its base pointer
*
openDOS
lea DOS_Lib,a1 ; grab dos.library name
move.l #LIBRARY_VERSION,d0 ; get library version
jsr _LVOOpenLibrary(a6) ; open dos.library
move.l d0,DOSBase ; save dos base
beq noDOS ; no dos.library, ALERT!
rts ; everything's cool.
****************************************************************************
* Open the intuition.library and save its base pointer
*
openINT
lea INT_Lib,a1 ; grab intuition.library name
moveq.l #0,d0 ; version is irrelevant
jsr _LVOOpenLibrary(a6) ; open the library
move.l d0,IntBase ; save the base
rts
****************************************************************************
* noDOS: not no-DOZE, No-DOS!
*
noDOS:
ALERT (AG_OpenLib!AO_DOSLib) ; this wasn't my idea!
move.l #100,d0 ; make like a hockey player &
bra exit ; get the puck out of here
****************************************************************************
*
* Program's DATA area
*
****************************************************************************
CNOP 0,2 ; even-out to word boundary
ExecBase DC.L 0
DOSBase DC.L 0
IntBase DC.L 0
initialSP DC.L 0
returnMsg DC.L 0
windptr DC.L 0
NewWind EQU *
LeftEdge DC.W 0
TopEdge DC.W 0
Width DC.W 276
Height DC.W 10
DetailPen DC.B -1 ; default forground
BlockPen DC.B -1 ; default background
IDCMPFlags DC.L CLOSEWINDOW
Flags DC.L WINDOWCLOSE!SMART_REFRESH!WINDOWDRAG!WINDOWDEPTH
FirstGadget DC.L 0
CheckMark DC.L 0
Title DC.L wtitle
Scren DC.L 0
BitMp DC.L 0
MinWidth DC.W 0
MinHeight DC.W 0
MaxWidth DC.W 0
MaxHeight DC.W 0
Type DC.W WBENCHSCREEN
* end of NewWindow structure
IText1 EQU * ; IntuiText structure
DC.B 3 ; foreground pen
DC.B 1 ; background pen
DC.B RP_JAM2 ; JAM2 drawing mode
DC.W 30 ; left edge offset
DC.W 1 ; top edge offset
DC.L 0 ; font structure pointer (def)
DC.L text1 ; pointer to text
DC.L IText2 ; pointer to next IntuiText
IText2 EQU * ; IntuiText structure
DC.B 2 ; foreground pen
DC.B 1 ; background pen
DC.B RP_JAM2 ; JAM2 drawing mode
DC.W 70 ; left edge offset
DC.W 1 ; top edge offset
DC.L 0 ; font structure pointer (def)
DC.L text2 ; pointer to text
DC.L IText3 ; pointer to next IntuiText
IText3 EQU * ; IntuiText structure
DC.B 2 ; foreground pen
DC.B 1 ; background pen
DC.B RP_JAM2 ; JAM2 drawing mode
DC.W 110 ; left edge offset
DC.W 1 ; top edge offset
DC.L 0 ; font structure pointer (def)
DC.L text3 ; pointer to text
DC.L IText4 ; pointer to next IntuiText
IText4 EQU * ; IntuiText structure
DC.B 2 ; foreground pen
DC.B 1 ; background pen
DC.B RP_JAM2 ; JAM2 drawing mode
DC.W 140 ; left edge offset
DC.W 1 ; top edge offset
DC.L 0 ; font structure pointer (def)
DC.L text4 ; pointer to text
DC.L IText5 ; pointer to next IntuiText
IText5 EQU * ; IntuiText structure
DC.B 2 ; foreground pen
DC.B 1 ; background pen
DC.B RP_JAM2 ; JAM2 drawing mode
DC.W 180 ; left edge offset
DC.W 1 ; top edge offset
DC.L 0 ; font structure pointer (def)
DC.L text5 ; pointer to text
DC.L 0 ; pointer to next IntuiText
wtitle DC.B 'Breakout Box V1.0',0
text1 DC.B ' DTR ',0
text2 DC.B ' RTS ',0
text3 DC.B ' CD ',0
text4 DC.B ' CTS ',0
text5 DC.B ' DSR ',0
INT_Lib DC.B 'intuition.library',0
DOS_Lib DC.B 'dos.library',0
END