summaryrefslogtreecommitdiffstats
path: root/private/mvdm/sim16/siminit.asm
diff options
context:
space:
mode:
authorAdam <you@example.com>2020-05-17 05:51:50 +0200
committerAdam <you@example.com>2020-05-17 05:51:50 +0200
commite611b132f9b8abe35b362e5870b74bce94a1e58e (patch)
treea5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/mvdm/sim16/siminit.asm
downloadNT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip
Diffstat (limited to 'private/mvdm/sim16/siminit.asm')
-rw-r--r--private/mvdm/sim16/siminit.asm234
1 files changed, 234 insertions, 0 deletions
diff --git a/private/mvdm/sim16/siminit.asm b/private/mvdm/sim16/siminit.asm
new file mode 100644
index 000000000..ba2e3c45f
--- /dev/null
+++ b/private/mvdm/sim16/siminit.asm
@@ -0,0 +1,234 @@
+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