1 /* Loglan82 Compiler&Interpreter
\r
2 Copyright (C) 1993 Institute of Informatics, University of Warsaw
\r
3 Copyright (C) 1993, 1994 LITA, Pau
\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
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
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
19 contacts: Andrzej.Salwicki@univ-pau.fr
\r
22 LITA Departement d'Informatique
\r
24 Avenue de l'Universite
\r
26 tel. ++33 59923154 fax. ++33 59841696
\r
28 =======================================================================
\r
32 PUBLIC _logon, _logoff, _attention, _ignore, _send, _receive
\r
33 EXTRN _endrun:FAR, COPYOK:FAR
\r
37 CINTA_TEXT SEGMENT PUBLIC 'CODE'
\r
40 ; PATCH FOR RECEIVE MESSAGE INTERRUPT HANDLER
\r
49 CALL FAR PTR _ignore ; DISABLE ATTENTION
\r
52 ASSUME CS:DRIVER, DS:DGROUP
\r
54 MOV AX, OFFSET DGROUP:MSGBUF
\r
56 CALL FAR PTR _receive
\r
57 CALL DWORD PTR MSGINT
\r
72 _data SEGMENT WORD PUBLIC 'data'
\r
73 SAVCOD DB SAVLEN DUP(?) ; SPACE FOR SAVING PATCHED CODE
\r
75 MSGBUF DB 80 DUP(' ')
\r
79 ; SEGMENT FOR ADDRESSING DRIVER CODE
\r
81 ORG 102EH ; ***** ONLY FOR D-LINK VERSION 3.21 *****
\r
82 DISPLAY LABEL FAR ; RECEIVE MESSAGE INTERRUPT HANDLER
\r
86 CINTA_TEXT SEGMENT 'CODE'
\r
87 ASSUME CS:CINTA_TEXT
\r
89 NETWORK DB 0 ; NETWORK OPERATION FLAG
\r
91 BREAK PROC FAR ; CONTROL-BREAK INTERRUPT ROUTINE
\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
110 PUSH AX ; PUSH DUMMY PARAMETER FOR COPYOK
\r
112 CALL COPYOK ; CHECK FOR AUTHORIZATION
\r
114 JZ NOTAUT ; UNAUTHORIZED DUPLICATE
\r
115 MOV AX, 2523H ; REPLACE CONTROL-BREAK INTERRUPT
\r
116 MOV DX, OFFSET BREAK
\r
120 MOV AX, 357DH ; GET NIOS VECTOR INTO ES:BX
\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
126 CMP AX, 1503H ; IS VERSION = 3.21
\r
127 JNE NONE ; INCORRECT NIOS VERSION
\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
139 MOV NETWORK, 1 ; FLAG NETWORK INSTALLED
\r
141 MOV SI, OFFSET DISPLAY
\r
142 MOV DI, OFFSET DGROUP:SAVCOD
\r
145 CALL FAR PTR _ignore ; DISABLE ATTENTION FOR A MOMENT
\r
146 PUSH DS ; AND REPLACE WITH OUR
\r
150 ASSUME CS:CINTA_TEXT, DS:CINTA_TEXT, ES:DRIVER
\r
151 MOV SI, OFFSET PATCH
\r
152 MOV DI, OFFSET DISPLAY
\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
161 MOV WORD PTR MSGINT+2, AX
\r
162 MOV AL, DL ; RETURN OUR NODE NUMBER
\r
179 ; RESTORE ORIGINAL INTERRUPT HANDLER
\r
187 ASSUME CS:CINTA_TEXT
\r
189 JZ L2 ; NOTHING IF NO NETWORK
\r
190 CALL FAR PTR _ignore ; DISABLE ATTENTION FOR A MOMENT
\r
194 MOV AX,357DH ; GET DRIVER SEGMENT INTO ES
\r
196 ASSUME CS:CINTA_TEXT, DS:DGROUP, ES:DRIVER
\r
197 MOV SI,OFFSET DGROUP:SAVCOD
\r
198 MOV DI,OFFSET DISPLAY
\r
200 REP MOVSB ; RESTORE PATCHED CODE
\r
201 CALL FAR PTR _attention ; ATTENTION BACK ON
\r
214 _attention PROC FAR
\r
225 ; DISABLE ATTENTION
\r
236 ; int send(node, msg)
\r
240 ; SEND MESSAGE MSG TO NODE
\r
245 MOV AH,0DH ; SEND MESSAGE
\r
246 MOV DL,[BP+6] ; NODE NUMBER
\r
247 LES BX,[BP+8] ; BUFFER ADDRESS
\r
258 ; GET STORED MESSAGE
\r
263 MOV AH,0EH ; GET MESSAGE
\r
264 LES BX,[BP+6] ; BUFFER ADDRESS
\r
272 ; FUNCTION TICKS:INTEGER4;
\r
273 ; RETURN BIOS TIME IN TICKS
\r
277 MOV AX,DX ; LOW WORD
\r
278 MOV DX,CX ; HIGH WORD
\r
282 ; PROCEDURE DTIME(VAR H,M,S:INTEGER);
\r
283 ; RETURN DOS DAY TIME IN HOURS, MINUTES, AND SECONDS
\r
287 MOV AH,2CH ; GET TIME
\r
290 MOV [BX],CH ; HOURS
\r
291 MOV BYTE PTR [BX+1],0
\r
293 MOV [BX],CL ; MINUTES
\r
294 MOV BYTE PTR [BX+1],0
\r
296 MOV [BX],DH ; SECONDS
\r
297 MOV BYTE PTR [BX+1],0
\r
302 ; FUNCTION SHIFT(PATTERN, COUNT:INTEGER):INTEGER;
\r
303 ; SHIFT LEFT LOGICALY PATTERN BY COUNT BITS
\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
319 S1: SHL AX,CL ; SHIFT LEFT
\r