* TinyClock v1.1 1989/3/29 by Kai Vorma * Public domain - feel free to spread! * Compiled using Devpac 2.0 * Should compile under Metacomco, too. At least with minor changes. ExecBase EQU $4 _LVOOldOpenLibrary EQU -408 _LVOCloseLibrary EQU -414 _LVOForbid EQU -132 _LVOFindTask EQU -294 _LVOWaitPort EQU -384 _LVOGetMsg EQU -372 _LVOReplyMsg EQU -378 _LVODateStamp EQU -192 _LVODelay EQU -198 _LVOText EQU -60 _LVOMove EQU -240 _LVOOpenWindow EQU -204 _LVOCloseWindow EQU -72 _LVODisplayBeep EQU -96 _LVOWhichLayer EQU -132 _LVOUpfrontLayer EQU -48 CLOSEWINDOW EQU $00000200 INACTIVEWINDOW EQU $00080000 WINDOWDRAG EQU $0002 WINDOWDEPTH EQU $0004 WINDOWCLOSE EQU $0008 RMBTRAP EQU $00010000 NOCAREREFRESH EQU $00020000 WBENCHSCREEN EQU $0001 wd_LeftEdge EQU $0004 wd_TopEdge EQU $0006 wd_WScreen EQU $2E wd_RPort EQU $32 wd_UserPort EQU $56 sc_LayerInfo EQU $E0 rp_Layer EQU $0 im_Class EQU $14 dl_Root EQU $22 rn_Time EQU $8 ds_Minute EQU $4 pr_CLI EQU $AC pr_MsgPort EQU $5C OpenLib MACRO lea \1Name(pc),a1 CallLib OldOpenLibrary move.l d0,\1Base beq.s No\1 ENDM CallLib MACRO IFNC '\2','' IFC '\2','Exec' move.l (ExecBase).w,a6 ENDC IFNC '\2','Exec' move.l \2Base(pc),a6 ENDC ENDC jsr _LVO\1(a6) ENDM CallDos MACRO jsr _LVO\1(a5) ENDM CloseLib MACRO move.l \1Base(pc),a1 CallLib CloseLibrary,\2 ENDM Zero MACRO moveq.l #0,\1 ENDM Zera MACRO sub.l \1,\1 ENDM CODE Startup Zera a1 startup code CallLib FindTask,Exec move.l d0,a2 tst.l pr_CLI(a2) bne.s FromCLI lea pr_MsgPort(a2),a0 CallLib WaitPort lea pr_MsgPort(a2),a0 CallLib GetMsg move.l d0,WBMsg FromCLI moveq.l #20,d7 return code if a library lea DOSName(pc),a1 won't open CallLib OldOpenLibrary tst.l d0 beq.s NoDOS move.l d0,a5 A5 == DOSBase OpenLib GFX OpenLib Intuition OpenLib Layers bsr.s Main CloseLib Layers,Exec NoLayers CloseLib Intuition NoIntuition CloseLib GFX NoGFX move.l a5,a1 CallLib CloseLibrary NoDOS move.l WBMsg(pc),d0 beq.s More move.l d0,a1 CallLib Forbid CallLib ReplyMsg More move.l d7,d0 return code rts to CLI/WB Main lea NewWindow(pc),a0 main program CallLib OpenWindow,Intuition tst.l d0 beq.s Error move.l dl_Root(a5),a2 A2 == RootNode move.l d0,a3 A3 == Window Handle movem.l wd_WScreen(a3),d6/a4 A4 == RastPort add.l #sc_LayerInfo,d6 D6 == LayerInfo move.l (a4),d5 D5 == Layer Zero d4 D4 == LastMin MainLoop bsr.s GetTime take the current time bsr.s Print print it bsr CheckLayer is our window topmost? bra.s GetMessage a message from intuition? ContMain moveq.l #50,d1 go to sleep for a while CallDos Delay bra.s MainLoop GetMessage move.l wd_UserPort(a3),a0 CallLib GetMsg,Exec tst.l d0 beq.s ContMain no message move.l d0,a1 move.l im_Class(a1),d2 CallLib ReplyMsg cmp.l #CLOSEWINDOW,d2 beq.s Close cmp.l #INACTIVEWINDOW,d2 bne.s GetMessage bsr.s AlwaysPrint bra.s GetMessage more messages? Close move.l a3,a0 CallLib CloseWindow,Intuition Zero d7 no return code Error rts GetTime * move.l #Stamp,d1 DateStamp is very slow... * CallDos DateStamp I'll take the time straight move.l rn_Time+ds_Minute(a2),d0 * move.l Minutes(pc),d0 divu #60,d0 Hours = 0..15, mins = 16..31 lea Time(pc),a0 bsr.s ToASC swap d0 addq.l #1,a0 bsr.s ToASC rts ToASC Zero d1 move.w d0,d1 divu #10,d1 add.l #$00300030,d1 to ASCII move.b d1,(a0)+ swap d1 move.b d1,(a0)+ rts Print move.b Time+4(pc),d0 cmp.b d0,d4 minutes changed? beq.s TimeNotChanged move.b d0,d4 AlwaysPrint move.l a4,a1 moveq.l #30,d0 moveq.l #1+6,d1 CallLib Move,GFX move.l a4,a1 lea Time(pc),a0 moveq.l #5,d0 CallLib Text TimeNotChanged rts CheckLayer moveq.l #4,d0 check point (4,9) bsr.s Check moveq.l #36,d0 (36,9) bsr.s Check moveq.l #75,d0 (75,9) bsr.s Check rts Check moveq.l #9,d1 add.w wd_LeftEdge(a3),d0 add.w wd_TopEdge(a3),d1 move.l d6,a0 CallLib WhichLayer,Layers is there some other layer cmp.l d0,d5 topmost? bne.s Front rts Front move.l d5,a1 WindowToFront has a bug. CallLib UpfrontLayer I have to use UpFrontLayer tst.l d0 beq.s LayerError addq.l #4,a7 return address rts LayerError addq.l #8,a7 return address bra Close * DATA NewWindow dc.w 511 dc.w 0 dc.w 76 dc.w 10 dc.b 3 dc.b 0 dc.l CLOSEWINDOW!INACTIVEWINDOW dc.l WINDOWDRAG!WINDOWCLOSE!RMBTRAP!NOCAREREFRESH dc.l 0 dc.l 0 dc.l Time dc.l 0 dc.l 0 dc.w 0 dc.w 0 dc.w 0 dc.w 0 dc.w WBENCHSCREEN *Stamp dc.l 0 You need these if use DateStamp *Minutes dc.l 0 * dc.l 0 WBMsg dc.l 0 GFXBase dc.l 0 IntuitionBase dc.l 0 LayersBase dc.l 0 Time dc.b ' : ',0 Window's name is also current time! GFXName dc.b 'graphics.library',0 DOSName dc.b 'dos.library',0 IntuitionName dc.b 'intuition.library',0 LayersName dc.b 'layers.library',0 END