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