Added upstream from http://ftp.icm.edu.pl/pub/loglan/
[loglan.git] / sources / int / dlink.asm
1 /*     Loglan82 Compiler&Interpreter\r
2      Copyright (C) 1993 Institute of Informatics, University of Warsaw\r
3      Copyright (C)  1993, 1994 LITA, Pau\r
4      \r
5      This program is free software; you can redistribute it and/or modify\r
6      it under the terms of the GNU General Public License as published by\r
7      the Free Software Foundation; either version 2 of the License, or\r
8      (at your option) any later version.\r
9      \r
10      This program is distributed in the hope that it will be useful,\r
11      but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13      GNU General Public License for more details.\r
14      \r
15              You should have received a copy of the GNU General Public License\r
16              along with this program; if not, write to the Free Software\r
17              Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\r
18 \r
19  contacts:  Andrzej.Salwicki@univ-pau.fr\r
20 \r
21 or             Andrzej Salwicki\r
22                 LITA   Departement d'Informatique\r
23                 Universite de Pau\r
24                 Avenue de l'Universite\r
25                 64000 Pau   FRANCE\r
26                  tel.  ++33 59923154    fax. ++33 59841696\r
27 \r
28 =======================================================================\r
29 */\r
30 \r
31         NAME    CINTA\r
32         PUBLIC  _logon, _logoff, _attention, _ignore, _send, _receive\r
33         EXTRN   _endrun:FAR, COPYOK:FAR\r
34 \r
35 DGROUP  GROUP   _data\r
36 \r
37 CINTA_TEXT SEGMENT PUBLIC 'CODE'\r
38         ASSUME  CS:DRIVER\r
39 \r
40 ; PATCH FOR RECEIVE MESSAGE INTERRUPT HANDLER\r
41 PATCH   PROC    FAR\r
42         PUSHF\r
43         PUSH    AX\r
44         PUSH    BX\r
45         PUSH    CX\r
46         PUSH    DX\r
47         PUSH    DS\r
48         PUSH    ES\r
49         CALL    FAR PTR _ignore ; DISABLE ATTENTION\r
50         MOV     AX, DGROUP\r
51         MOV     DS, AX\r
52         ASSUME  CS:DRIVER, DS:DGROUP\r
53         PUSH    AX\r
54         MOV     AX, OFFSET DGROUP:MSGBUF\r
55         PUSH    AX\r
56         CALL    FAR PTR _receive\r
57         CALL    DWORD PTR MSGINT\r
58         ADD     SP, 4\r
59         POP     ES\r
60         POP     DS\r
61         POP     DX\r
62         POP     CX\r
63         POP     BX\r
64         POP     AX\r
65         POPF\r
66         RET\r
67 PATCH   ENDP\r
68 PATLEN  =       $-PATCH\r
69 SAVLEN  =       PATLEN\r
70 CINTA_TEXT ENDS\r
71 \r
72 _data   SEGMENT WORD PUBLIC 'data'\r
73 SAVCOD  DB      SAVLEN DUP(?)   ; SPACE FOR SAVING PATCHED CODE\r
74 USER    DB      8 DUP(?)\r
75 MSGBUF  DB      80 DUP(' ')\r
76 MSGINT  DD      ?\r
77 _data   ENDS\r
78 \r
79 ; SEGMENT FOR ADDRESSING DRIVER CODE\r
80 DRIVER  SEGMENT AT 0\r
81         ORG     102EH           ; ***** ONLY FOR D-LINK VERSION 3.21 *****\r
82 DISPLAY LABEL   FAR             ; RECEIVE MESSAGE INTERRUPT HANDLER\r
83         ORG     $+PATLEN\r
84 DRIVER  ENDS\r
85 \r
86 CINTA_TEXT SEGMENT 'CODE'\r
87         ASSUME  CS:CINTA_TEXT\r
88 \r
89 NETWORK DB      0               ; NETWORK OPERATION FLAG\r
90 \r
91 BREAK   PROC    FAR             ; CONTROL-BREAK INTERRUPT ROUTINE\r
92         MOV     AX, DGROUP\r
93         MOV     DS, AX\r
94         CALL    _endrun\r
95         RET     2\r
96 BREAK   ENDP\r
97 \r
98 ; int logon(msgint)\r
99 ; void (*msgint)();\r
100 ;\r
101 ; CHECK IF DRIVER IS INSTALLED AND CONNECT TO RECEIVE MESSAGE INTERRUPT HANDLER.\r
102 ; RETURN NODE NUMBER (-1 MEANS NODE NOT LOGGED ON)\r
103 \r
104 _logon  PROC    FAR\r
105         PUSH    BP\r
106         MOV     BP,SP\r
107         PUSH    SI\r
108         PUSH    DI\r
109         PUSH    DS\r
110         PUSH    AX              ; PUSH DUMMY PARAMETER FOR COPYOK\r
111         PUSH    AX\r
112         CALL    COPYOK          ; CHECK FOR AUTHORIZATION\r
113         OR      AX, AX\r
114         JZ      NOTAUT          ; UNAUTHORIZED DUPLICATE\r
115         MOV     AX, 2523H       ; REPLACE CONTROL-BREAK INTERRUPT\r
116         MOV     DX, OFFSET BREAK\r
117         PUSH    CS\r
118         POP     DS\r
119         INT     21H\r
120         MOV     AX, 357DH       ; GET NIOS VECTOR INTO ES:BX\r
121         INT     21H\r
122         CMP     WORD PTR ES:[BX-2], 'ns'\r
123         JNE     NONE            ; DRIVER NOT INSTALLED\r
124         MOV     AH, 17H         ; GET NIOS VERSION NUMBER\r
125         INT     7DH\r
126         CMP     AX, 1503H       ; IS VERSION = 3.21\r
127         JNE     NONE            ; INCORRECT NIOS VERSION\r
128         PUSH    ES\r
129         POP     DS\r
130         MOV     AX, DGROUP\r
131         MOV     ES, AX\r
132         ASSUME  CS:CINTA_TEXT, DS:DRIVER, ES:DGROUP\r
133         MOV     BX, OFFSET DGROUP:USER\r
134         MOV     AH, 02H         ; GET USER NAME\r
135         MOV     DL, 0FFH        ; OUR NODE (UNKNOWN YET)\r
136         INT     7DH\r
137         OR      AL, AL\r
138         JNZ     NONE\r
139         MOV     NETWORK, 1      ; FLAG NETWORK INSTALLED\r
140         CLD\r
141         MOV     SI, OFFSET DISPLAY\r
142         MOV     DI, OFFSET DGROUP:SAVCOD\r
143         MOV     CX, SAVLEN\r
144         REP     MOVSB\r
145         CALL    FAR PTR _ignore ; DISABLE ATTENTION FOR A MOMENT\r
146         PUSH    DS              ; AND REPLACE WITH OUR\r
147         POP     ES\r
148         PUSH    CS\r
149         POP     DS\r
150         ASSUME  CS:CINTA_TEXT, DS:CINTA_TEXT, ES:DRIVER\r
151         MOV     SI, OFFSET PATCH\r
152         MOV     DI, OFFSET DISPLAY\r
153         MOV     CX, PATLEN\r
154         REP     MOVSB\r
155         MOV     AX, DGROUP\r
156         MOV     DS, AX\r
157         ASSUME  CS:CINTA_TEXT, DS:DGROUP, ES:DRIVER\r
158         MOV     AX, [BP+6]      ; STORE ADDRESS OF USER INTERRUPT ROUTINE\r
159         MOV     WORD PTR MSGINT, AX\r
160         MOV     AX, [BP+8]\r
161         MOV     WORD PTR MSGINT+2, AX\r
162         MOV     AL, DL          ; RETURN OUR NODE NUMBER\r
163         XOR     AH, AH\r
164         JMP     SHORT L1\r
165 NONE:   MOV     AX, -1\r
166         MOV     NETWORK, 0\r
167         JMP     SHORT L1\r
168 NOTAUT: MOV     AX, -2\r
169 L1:     POP     DS\r
170         POP     DI\r
171         POP     SI\r
172         POP     BP\r
173         RET\r
174 _logon  ENDP\r
175 \r
176 \r
177 ; void logoff()\r
178 ;\r
179 ; RESTORE ORIGINAL INTERRUPT HANDLER\r
180 \r
181 _logoff PROC    FAR\r
182         PUSH    BP\r
183         MOV     BP,SP\r
184         PUSH    SI\r
185         PUSH    DI\r
186         PUSH    DS\r
187         ASSUME  CS:CINTA_TEXT\r
188         CMP     NETWORK, 0\r
189         JZ      L2              ; NOTHING IF NO NETWORK \r
190         CALL    FAR PTR _ignore ; DISABLE ATTENTION FOR A MOMENT\r
191         CLD\r
192         MOV     AX,DGROUP\r
193         MOV     DS,AX\r
194         MOV     AX,357DH        ; GET DRIVER SEGMENT INTO ES\r
195         INT     21H\r
196         ASSUME  CS:CINTA_TEXT, DS:DGROUP, ES:DRIVER\r
197         MOV     SI,OFFSET DGROUP:SAVCOD\r
198         MOV     DI,OFFSET DISPLAY               \r
199         MOV     CX,SAVLEN\r
200         REP     MOVSB           ; RESTORE PATCHED CODE\r
201         CALL    FAR PTR _attention      ; ATTENTION BACK ON\r
202 L2:     POP     DS\r
203         POP     DI\r
204         POP     SI\r
205         POP     BP\r
206         RET\r
207 _logoff ENDP\r
208 \r
209 \r
210 ; void attention()\r
211 ;\r
212 ; ENABLE ATTENTION\r
213 \r
214 _attention      PROC    FAR\r
215         CMP     NETWORK, 0\r
216         JZ      A1\r
217         MOV     AX,1600H\r
218         INT     7DH\r
219 A1:     RET\r
220 _attention      ENDP\r
221 \r
222 \r
223 ; void ignore()\r
224 ;\r
225 ; DISABLE ATTENTION\r
226 \r
227 _ignore PROC    FAR\r
228         CMP     NETWORK, 0\r
229         JZ      I1\r
230         MOV     AX,16FFH\r
231         INT     7DH\r
232 I1:     RET\r
233 _ignore ENDP\r
234 \r
235 \r
236 ; int send(node, msg)\r
237 ; int node;\r
238 ; message *msg;\r
239 ;\r
240 ; SEND MESSAGE MSG TO NODE\r
241 \r
242 _send   PROC    FAR\r
243         PUSH    BP\r
244         MOV     BP,SP\r
245         MOV     AH,0DH          ; SEND MESSAGE\r
246         MOV     DL,[BP+6]       ; NODE NUMBER\r
247         LES     BX,[BP+8]       ; BUFFER ADDRESS\r
248         INT     7DH\r
249         XOR     AH,AH\r
250         POP     BP\r
251         RET\r
252 _send   ENDP\r
253 \r
254 \r
255 ; int receive(msg)\r
256 ; message *msg;\r
257 ;\r
258 ; GET STORED MESSAGE\r
259 \r
260 _receive PROC   FAR\r
261         PUSH    BP\r
262         MOV     BP,SP\r
263         MOV     AH,0EH          ; GET MESSAGE\r
264         LES     BX,[BP+6]       ; BUFFER ADDRESS\r
265         INT     7DH\r
266         XOR     AH,AH\r
267         POP     BP\r
268         RET\r
269 _receive ENDP\r
270 \r
271 \r
272 ; FUNCTION TICKS:INTEGER4;      \r
273 ; RETURN BIOS TIME IN TICKS\r
274 TICKS   PROC    FAR\r
275         MOV     AH,0\r
276         INT     1AH\r
277         MOV     AX,DX           ; LOW WORD\r
278         MOV     DX,CX           ; HIGH WORD\r
279         RET\r
280 TICKS   ENDP\r
281 \r
282 ; PROCEDURE DTIME(VAR H,M,S:INTEGER);\r
283 ; RETURN DOS DAY TIME IN HOURS, MINUTES, AND SECONDS\r
284 DTIME   PROC    FAR\r
285         PUSH    BP\r
286         MOV     BP,SP\r
287         MOV     AH,2CH          ; GET TIME\r
288         INT     21H\r
289         MOV     BX,[BP+10]\r
290         MOV     [BX],CH         ; HOURS\r
291         MOV     BYTE PTR [BX+1],0\r
292         MOV     BX,[BP+8]\r
293         MOV     [BX],CL         ; MINUTES\r
294         MOV     BYTE PTR [BX+1],0\r
295         MOV     BX,[BP+6]\r
296         MOV     [BX],DH         ; SECONDS\r
297         MOV     BYTE PTR [BX+1],0\r
298         POP     BP\r
299         RET     6\r
300 DTIME   ENDP\r
301 \r
302 ; FUNCTION SHIFT(PATTERN, COUNT:INTEGER):INTEGER;\r
303 ; SHIFT LEFT LOGICALY PATTERN BY COUNT BITS\r
304 SHIFT   PROC    FAR\r
305         PUSH    BP\r
306         MOV     BP,SP\r
307         MOV     AX,[BP+8]       ; PATTERN\r
308         MOV     CL,[BP+6]       ; BIT COUNT\r
309         AND     CL,0FH          ; MASK LOW 4 BITS\r
310         TEST    CL,08H          ; TEST THEIR SIGN BIT\r
311         JZ      S0              ; OK IF POSITIVE\r
312         OR      CL,0F0H         ; EXTEND SIGN TO ENTIRE BYTE IF NEGATIVE\r
313 S0:     CMP     CL,0            ; TEST BIT COUNT ONCE AGAIN\r
314         JZ      S2              ; IF = 0 DO NOTHING\r
315         JG      S1              ; IF > 0 SHIFT LEFT\r
316         NEG     CL              ; IF < 0 NEGATE BIT COUNT AND\r
317         SHR     AX,CL           ; SHIFT RIGHT\r
318         JMP     SHORT S2\r
319 S1:     SHL     AX,CL           ; SHIFT LEFT\r
320 S2:     POP     BP\r
321         RET     4\r
322 SHIFT   ENDP\r
323 \r
324 CINTA_TEXT ENDS\r
325         END\r
326 \r
327 \r