include incs.inc extrn LocalInit:FAR extrn __acrtused:abs ; pull in windows startup code MAIN_DATA SEGMENT extrn RespPkt:BYTE extrn ToWOW32Pkt:BYTE extrn WAKEUPPkt:BYTE extrn ACKPkt:BYTE extrn NAKPkt:BYTE extrn GetMemPkt:BYTE extrn SetMemPkt:BYTE MAIN_DATA ENDS MAIN_CODE SEGMENT ASSUME CS:MAIN_CODE, DS:MAIN_DATA extrn COMISR:NEAR ;***************************************************************************** ; ; LibEntry, called when DLL is loaded ; ;***************************************************************************** PUBLIC LibEntry LibEntry PROC FAR int 3 jcxz LibEntry_Initialize push ds ; heap segment xor ax, ax ; push ax push cx ; heap size call LocalInit ; initialize heap or ax, ax jz LibEntry_Fail LibEntry_Initialize: call Initialize ; initialize com port and buffers LibEntry_Fail: ret LibEntry ENDP ;***************************************************************************** ; ; Initialize com port and memory ; ;***************************************************************************** PUBLIC Initialize Initialize PROC NEAR call Init_Com ; initialize com port or ax, ax jz Initialize_Fail push ax call Init_Mem ; initialize memory pop ax ret Initialize_Fail: int 3 ret Initialize ENDP ;***************************************************************************** ; ; WEP, called when DLL is unloaded ; ;***************************************************************************** PUBLIC WEP WEP PROC FAR nop ret WEP ENDP ;***************************************************************************** ; ; Initialization of the Port ; ;***************************************************************************** Init_Com PROC NEAR mov dx, SERIALPORT mov dl, LCR mov al, DLAB ; turn on divisor latch out dx, al DELAY mov dl, RxBuf mov ax, BaudRate ; set baud rate out dx, al DELAY inc dx mov al, ah out dx, al DELAY mov dl, LCR ; set LCR mov al, InitLCR out dx, al DELAY mov dl, IER ; turn on interrupts on 8250 mov al, AllInt out dx, al DELAY mov dl, MCR ; set MCR mov al, InitMCR out dx, al Init_ClearRegisters: mov dl, LSR in al, dx mov dl, RxBuf in al, dx mov dl, MSR in al, dx mov dl, IIR in al, dx in al, dx test al, 1 jz Init_ClearRegisters ; ; install interrupt handler ; cli mov al, 0Ch push ds mov dx, SEG MAIN_CODE mov ds, dx mov dx, OFFSET COMISR mov ah, 25h int 21h pop ds in al, PIC_IntEnable and al, 0E7h DELAY out PIC_IntEnable, al sti mov al, EOI out PIC, al mov ax, 1 ; return sucess ! ret Init_Com ENDP ;***************************************************************************** ; ; Initialize memory ie, allocate buffers and packets ; ;***************************************************************************** PUBLIC Init_Mem Init_Mem PROC NEAR mov bx, OFFSET RespPkt mov [bx].Start, SOH ; start of header mov [bx].Command, RESP ; Resp packet mov bx, OFFSET ToWOW32Pkt ; ToWOW32 packet mov [bx].Start, SOH ; start of header mov [bx].Command, ToWOW32 ; ToWOW32 packet mov [bx].Len, 9 ; length of entire packet mov BYTE PTR [bx+8], EOT ; end of transmission mov bx, OFFSET WAKEUPPkt ; WAKEUP packet mov [bx].Start, SOH ; start of header mov [bx].Command, WAKEUP ; WAKEUP packet mov [bx].Len, 9 ; length of entire packet mov BYTE PTR [bx+8], EOT ; end of transmission mov bx, OFFSET ACKPkt ; ACK packet mov [bx].Start, SOH ; start of header mov [bx].Command, ACK ; ACK packet mov [bx].Len, 5 ; length of entire packet mov BYTE PTR [bx+4], EOT ; end of transmission mov bx, OFFSET NAKPkt ; NAK packet mov [bx].Start, SOH ; start of header mov [bx].Command, NAK ; NAK packet mov [bx].Len, 5 ; length of entire packet mov BYTE PTR [bx+4], EOT ; end of transmission mov bx, OFFSET GetMemPkt ; GetMem packet mov [bx].Start, SOH ; start of header mov [bx].Command, GETMEM ; GETMEN packet mov [bx].Len, 11 ; length of entire packet mov BYTE PTR [bx+10], EOT ; end of transmission mov bx, OFFSET SetMemPkt ; SetMem packet mov [bx].Start, SOH ; start of header mov [bx].Command, SETMEM ; SETMEM packet mov [bx].Len, 11 ; length of entire packet mov BYTE PTR [bx+10], EOT ; end of transmission ret Init_Mem ENDP MAIN_CODE ENDS END LibEntry