-referees
[www.jankratochvil.net.git] / project / SClock / SClock.asm
1 ;DEBUG  equ     1
2
3 TimePort        equ     13              ;Port of the "daytime" service
4
5         include "SSMac.h"
6
7         dbuf    Date,dat_SIZEOF
8         dbuf    DateStr,10
9         dbuf    TimeStr,9
10
11         start
12
13         get.l   Arg_Host,a0
14         call    bsdsocket,GetHostByName
15         moveq   #2,d2
16         tst.l   d0
17         beq     NetErrorVar
18         move.l  d0,a1
19         addq    #8,a1           ;h_(name|aliases)
20         move.l  (a1)+,d0        ;h_addrtype
21         subq.l  #2,d0           ;PF_INET
22         dtl     <Network protocol not supported>,a0
23         bne.s   ErrorSSNE1
24         move.l  (a1)+,d0        ;h_length
25         subq.l  #4,d0
26 ErrorSSNE1      bne     ErrorSS
27         move.l  (a1),a1         ;h_addr_list
28         move.l  (a1),a1
29         move.l  (a1),d3         ;Address
30         moveq   #2,d0   ;AF_INET
31         moveq   #1,d1   ;SOCK_STREAM
32         moveq   #0,d2   ;?Why???
33         call    bsdsocket,Socket
34         move.l  d0,d4
35         bmi.s   NetErrorNE
36         clr.l   -(sp)           ;sin_zero
37         clr.l   -(sp)           ;sin_zero
38         push    d3              ;sin_addr.s_addr
39         move.l  #(4<<24)!(2<<16)!TimePort,-(sp) ;sin_(len|family|port)
40         move.l  sp,a0           ;sockaddr_in
41         moveq   #16,d1          ;sizeof(sockaddr_in)
42         call    Connect
43         tst.l   d0
44 NetErrorNE      bne     NetError
45         lea     -24(sp),sp
46         move.l  sp,a0
47         moveq   #24,d1
48         moveq   #0,d2
49         move.l  d4,d0
50         call    Recv
51         move.l  d0,d2
52         addq.l  #1,d0
53         beq     NetError
54         moveq   #24,d1
55         dtl     <Invalid data received>,a0
56         cmp.l   d1,d0
57         bcs.s   ErrorSSNE1
58         lea     8(sp),a2
59         geta    DateStr,a1
60         put.l   a1,Date+dat_StrDate
61         move.w  (a2),(a1)+
62         move.l  -(a2),d0
63         moveq   #'-',d1
64         move.b  d1,d0
65         ror.l   #8,d0
66         move.l  d0,(a1)+
67         move.b  d1,(a1)+
68         lea     18(a2),a2
69         move.b  (a2)+,(a1)+
70         move.b  (a2),(a1)
71         addq    #2,a1
72         put.l   a1,Date+dat_StrTime
73         lea     11(sp),a2
74         moveq   #7,d0
75 CopyTime        move.b  (a2)+,(a1)+
76         dbra    d0,CopyTime
77         geta    Date,a2
78         move.l  a2,d1
79         call    dos,StrToDate
80         tst.l   d0
81         bne.s   ConvOkay
82         dtl     <StrToDate("%s","%s")>,a0
83         geta    Date+dat_StrDate,a1
84         jump    ss,DosError
85
86 ConvOkay        move.l  (a2)+,d0        ;ds_Days
87         move.l  #1440>>3,d1
88         lsl.l   #3,d1
89         call    utility,UMult32
90         add.l   (a2)+,d0        ;ds_Minute
91         moveq   #60,d1
92         call    UMult32
93         move.l  (a2),d1         ;ds_Tick
94         divu    #50,d1
95         ext.l   d1
96         add.l   d1,d0
97         move.l  d0,d2
98         dtl     <timer.device>,a0
99         move.w  #IOTV_SIZE,a1
100         moveq   #UNIT_VBLANK,d0
101         moveq   #0,d1
102         sub.l   a2,a2
103         call    ss,TrackDevice
104         move.w  #TR_SETSYSTIME,IO_COMMAND(a1)
105         move.l  d2,IOTV_TIME+TV_SECS(a1)
106         move.l  a1,a0
107         move.l  d1,a1
108         call    ChkDoIO
109         tstv.l  Arg_Save
110         beq.s   EXIT
111         dtl     <battclock.resource>,a1
112         push    a1
113         call    exec,OpenResource
114         move.l  sp,a1
115         dtl     <%s not found>,a0
116         tst.l   d0
117         beq.s   ErrorSS
118         move.l  d0,a6
119         move.l  d2,d0
120         call    WriteBattClock
121 EXIT    jump    ss,ExitCleanup
122
123 NetError        moveq   #0,d2
124 NetErrorVar     clr.l   -(sp)
125         call    bsdsocket,Errno
126         push    d0
127         push    #$8000001C
128         add.l   d2,(sp)
129         move.l  sp,a0
130         call    SocketBaseTagList
131         addq    #4,sp
132         pop     a0
133         tst.l   d0
134         beq.s   ErrorSS
135 ErrorUnknown    dtl     <Unknown net subsystem error>,a0
136 ErrorSS jump    ss,ExitError
137
138         tags
139         template <HOST/A,SAVE/S>
140         dv.l    Arg_Host
141         dv.l    Arg_Save
142         library bsdsocket,3
143         finish
144         end