Category : Files from Magazines
Archive   : VOL8N1.ZIP
Filename : IMPORT.ASM
Output of file : IMPORT.ASM contained in archive : VOL8N1.ZIP
; Typical usage: IMPORT NETNAME >FILENAME
;
; Receives file from network using NETBIOS name IMPORT_NETNAME<10>
; and writes it to standard output
; Network traffic is overlapped with Disk I/O to demonstrate the
; use of the No-Wait function of NETBIOS without needing an interrupt
; handler (POST=0). This program takes best advantage of
; intelligent adapters with network coprocessors.
;
; Author: Jack Schoof, President, ARTISOFT, Inc.
;----------------------------------------------------------------------
; NCB DEFINITION
NCBDEF STRUC ;PRE FILLED WITH ALL ZEROES
NCB_COMMAND DB 0
NCB_RETCODE DB 0
NCB_LSN DB 0
NCB_NUM DB 0
NCB_BUFFER DD 0 ;POINTER TO MESSAGE BUFFER
NCB_LENGTH DW 0 ;NUMBER OF BYTES IN BUFFER
NCB_CALLNAME DB 16 DUP (0)
NCB_NAME DB 16 DUP (0)
NCB_RTO DB 0
NCB_STO DB 0
NCB_POST DD 0 ;POINTER TO POST ADDRESS
NCB_LANA_NUM DB 0
NCB_CMD_CPLT DB 0
NCB_RESERVED DB 14 DUP (0) ;RESERVED
NCBDEF ENDS
; NCB COMMANDS
NO_WAIT EQU 80H
NCB_ADD_NAME EQU 30H
NW_DELETE_NAME EQU 31H+NO_WAIT
NW_LISTEN EQU 11H+NO_WAIT
NW_HANG_UP EQU 12H+NO_WAIT
NW_RECEIVE EQU 15H+NO_WAIT
;----------------------------------------------------------------------
MAIN_DATA SEGMENT PUBLIC 'DATA'
LNCB NCBDEF <> ;DEFINE NCB
ORG LNCB.NCB_NAME
DB 'IMPORT_' ;PREFIX TO NAME TYPED BY USER
ORG LNCB.NCB_NAME+15
DB 10 ;SUFFIX ON NAME TO NOT COLLIDE WITH
ORG LNCB.NCB_CALLNAME ;IBM PC LAN, LANTASTIC NOS AND OTHERS
DB '*' ;* IN CALLNAME TO LISTEN FOR ANYONE
ORG LNCB+SIZE NCBDEF
BUFFER_ONE DB 4000H DUP (?) ;uses two buffers
BUFFER_TWO DB 4000H DUP (?) ;of 16K each
ERROR_MESSAGE DB ' NETBIOS ERROR: ERROR '
ERROR_SWITCH DB 1 DUP(0)
ERROR_BUFFER DB 1 DUP(0)
MAIN_DATA ENDS
;----------------------------------------------------------------------
MAIN_CODE SEGMENT PUBLIC 'CODE'
ASSUME CS:MAIN_CODE, DS:MAIN_DATA
NOTICE DB '(C) 1988 ARTISOFT, INC.',0
BEGIN: PUSH ES
POP DS ;PUT ADDRESS OF PSP IN DS
MOV AX,SEG MAIN_DATA
MOV ES,AX ;ES IS OUR DATA SEGMENT
MOV SI,5DH ;GET THE FCB1 POINTER IN PSP
MOV DI,OFFSET LNCB.NCB_NAME+7 ;POINT TO NCB_NAME IN NCB
MOV CX,8 ;TRANSFER 8 CHARACTERS TO NCB NAME
REP MOVSB ;DONE
MOV DS,AX
MOV WORD PTR LNCB.NCB_BUFFER+2,AX ;SET UP THE BUFFER SEGMENT AS OUR
;DATA SEGMENT
MOV LNCB.NCB_COMMAND,NCB_ADD_NAME
CALL NETBIOS ;HERE WE ADD THE NAME
JNZ BAD_EXIT ;PROBLEM, QUIT
LISTEN: MOV LNCB.NCB_COMMAND,NW_LISTEN ;LISTEN FOR SOMEONE TO CALL US
CALL NETBIOS
JNZ DELETE_NAME ;PROBLEM, SO DELETE THE NAME AND LEAVE
CALL WAIT_MYSELF ;WAIT FOR THE CALL OR ANY CHARACTER
JNZ DELETE_NAME ;TYPED BY THE USER TO QUIT
MOV DX,OFFSET BUFFER_ONE
CALL RECEIVE_BUFFER ;RECEIVE THE FIRST BUFFER
JNZ HANG_UP ;PROBLEMS? THEN HANG UP THE SESSION
;
; HERE IS WHERE WE WILL LOOP FOR THE REST OF THE FILE
;
MAIN_LOOP:
CALL WAIT_MYSELF ;WAIT FOR THE BUFFER TO SHOW UP
JNZ HANG_UP
MOV CX,LNCB.NCB_LENGTH ;DID WE RECEIVE ZERO LENGTH?
JCXZ CLOSE_FILE ;THIS IS A SIGNAL TO CLOSE THE FILE
MOV DX,OFFSET BUFFER_TWO
CALL RECEIVE_BUFFER ;RECEIVE BUFFER_TWO
JNZ HANG_UP ;IMMEDIATE PROBLEMS?
MOV DX,OFFSET BUFFER_ONE ;POINT TO THIS BUFFER FOR DOS
CALL WRITE_BUFFER ;WRITE IT OUT, LENGTH IS STILL IN CX
CALL WAIT_MYSELF ;NOW WAIT FOR THE SECOND BUFFER WHICH
JNZ HANG_UP ;MIGHT HAVE ARRIVED ALREADY
MOV CX,LNCB.NCB_LENGTH ;DOES THIS BUFFER HAVE THE END OF FILE?
JCXZ CLOSE_FILE ;YEP, CLOSE THE FILE AND QUIT
MOV DX,OFFSET BUFFER_ONE
CALL RECEIVE_BUFFER ;RECEIVE BUFFER ONE AGAIN
JNZ HANG_UP
MOV DX,OFFSET BUFFER_TWO ;WHILE WRITING BUFFER TWO TO DISK
CALL WRITE_BUFFER ;LENGTH IS STILL IN CX
JMP MAIN_LOOP ;CONTINUE UNTIL WE ARE DONE
CLOSE_FILE:
MOV AH,3EH
MOV BX,1
INT 21H ;CLOSE THE OUTPUT FILE
HANG_UP:
MOV BX,OFFSET LNCB
MOV LNCB.NCB_COMMAND,NW_HANG_UP
CALL NETBIOS ;HANG UP THE SESSION
JNZ DELETE_NAME
CALL WAIT_MYSELF
JNZ DELETE_NAME
DELETE_NAME:
MOV LNCB.NCB_COMMAND,NW_DELETE_NAME
CALL NETBIOS ;REMOVE THE NAME FROM THE ADAPTER
JNZ BAD_EXIT
CALL WAIT_MYSELF ;WAIT UNTIL IT IS DONE
JNZ BAD_EXIT
MOV AX,4C00H
INT 21H ;BYE FOR NOW
BAD_EXIT:
CALL ERROR_MSG
MOV AX,4C01H
INT 21H ;PUT OUT A BAD RETURN CODE TO
;TEST IN A BATCH FILE
WAIT_MYSELF:
MOV AL,LNCB.NCB_CMD_CPLT ;WAIT FOR THE COMMAND
CMP AL,0FFH ;TO HAVE DONE SOMETHING
JZ TEST_CHAR ;WAIT FOR A CHARACTER
XOR AL,AL
RET ;Z FLAG IS ON
TEST_CHAR:
MOV AH,1
INT 16H ;IS A CHARACTER AVAILABLE?
JZ WAIT_MYSELF
XOR AH,AH
INT 16H
OR AL,0FFH ;NZ FLAG IS ON
RET
WRITE_BUFFER PROC
MOV AH,40H
MOV BX,1 ;OUTPUT HANDLE IS STANDARD OUTPUT
INT 21H ;DO THE DOS DISK WRITE
RET
WRITE_BUFFER ENDP
RECEIVE_BUFFER PROC
MOV WORD PTR LNCB.NCB_BUFFER,DX ;THE LOCATION OF THE BUFFER
MOV LNCB.NCB_COMMAND,NW_RECEIVE ;A NO-WAIT RECEIVE
MOV LNCB.NCB_LENGTH,SIZE BUFFER_ONE ;AND HOW MUCH WE WANT
NETBIOS PROC
MOV BX,OFFSET LNCB ;ES:BX POINTS TO NCB
INT 5CH ;CALL THE NETBIOS
TEST AL,AL ;ANY IMMEDIATE PROBLEMS?
RET ;RETURN WITH FLAGS SET
NETBIOS ENDP
RECEIVE_BUFFER ENDP
ERROR_MSG PROC
MOV ERROR_SWITCH,01 ;SET SWITCH FOR ONLY ONE MESSAGE
MOV CX,22
LEA DX,ERROR_MESSAGE ;PRINT OUT ERROR MESSAGE
MOV BX,2 ;TO STANDARD DEVICE - NO REDIRECTION
MOV AH,40H
INT 21H
MOV BH,LNCB.NCB_RETCODE ;MOVE RETURN CODE TO BH
MOV CL,04
MOV CH,02
AGAIN:
ROL BX,CL ;ROUTINE TO CONVERT BINARY TO
MOV AL,BL ;HEX
AND AL,0FH
ADD AL,30H
CMP AL,39H
JLE PRINT_CHAR
ADD AL,7
PRINT_CHAR:
MOV ERROR_BUFFER,AL
PUSH CX
MOV CX,1
LEA DX,ERROR_BUFFER ;PRINT OUT ERROR MESSAGE
PUSH BX ;TO STANDARD DEVICE - NO REDIRECTION
MOV BX,2
MOV AH,40H
INT 21H
POP BX
POP CX
DEC CH
JNZ AGAIN
RET
ERROR_MSG ENDP
MAIN_CODE ENDS
MAIN_STACK SEGMENT STACK
DW 100H DUP (?) ;AUTOMATIC STACK SETUP BY LINKER
MAIN_STACK ENDS
END BEGIN
Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!
This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.
But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/