summaryrefslogtreecommitdiffstats
path: root/private/mvdm/sim16/siminit.asm
blob: ba2e3c45f05dd94fec95636e459c2a308f075031 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
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