1 ; virtual processor, emulator for FIFTH
\r
5 ; edi - data stack pointer
\r
6 ; esi - instruction pointer
\r
8 ; cs - emulator program code segment
\r
14 call system_init ; init system, allocate XMS
\r
15 call KB_init ; init keyoard
\r
17 push 0 ; initialize segments
\r
21 sub ebx, ebx ; initialize pointers
\r
26 mov edi, ebx ; data stack
\r
28 mov [resp], ebx ; return stack
\r
29 mov esi, [xms_addr] ; instruction pointer
\r
31 mov ah, 3dh ; open diskfile
\r
35 mov word [fileh], ax
\r
37 mov ax, 4F02h ; set VESA 640*480 8 bit
\r
41 mov ecx, 0 ; load boot block (first 1024 bytes)
\r
46 xmemtot dw 0 ; amount of accessible XMS
\r
48 infile db 'disk.raw', 0 ; virtual disk file name
\r
49 fileh dw 0 ; it's handle
\r
51 coresiz dw 4096 ; core size
\r
52 gran dw 0 ; VESA granule size
\r
54 quit: mov ax, 3 ; restore text mode
\r
57 mov ah, 3eh ; close diskfile
\r
58 mov bx, word [fileh]
\r
62 jmp system_exit ; terminate program
\r
64 resp dd 0 ; return stack pointer
\r
66 emu: ; pick instruction
\r
67 movzx bx, byte [es:esi]
\r
122 xkbd@: call KB_read
\r
126 mov ah, 0bh ; check for key in keyboard buffer
\r
130 mov ah, 0 ; read key
\r
134 xnum: mov edx, dword [es:esi]
\r
140 xjmp: mov esi, dword [es:esi]
\r
141 add esi, [xms_addr]
\r
144 xcall: mov edx, dword [es:esi]
\r
149 sub ebx, [xms_addr]
\r
153 add esi, [xms_addr]
\r
156 xinc: inc dword [es:edi]
\r
159 xdec: dec dword [es:edi]
\r
162 xdup: mov eax, [es:edi]
\r
170 xif: mov eax, [es:edi]
\r
175 add esi, [xms_addr]
\r
181 xret: mov eax, [resp]
\r
183 add esi, [xms_addr]
\r
188 xc@: mov eax, [es:edi]
\r
189 add eax, [xms_addr]
\r
195 xc!: ;( n addr -- )
\r
200 add ebx, [xms_addr]
\r
204 xpush: mov ebx, [es:edi]
\r
212 xpop: mov eax, [resp]
\r
220 xrot: mov ebx, [es:edi]
\r
221 mov ecx, [es:edi+4]
\r
222 mov edx, [es:edi+8]
\r
223 mov [es:edi+8], ecx
\r
224 mov [es:edi+4], ebx
\r
228 xdisk@: mov ebx, [es:edi]
\r
229 add ebx, [xms_addr]
\r
230 mov ecx, [es:edi+4]
\r
232 call diskload ; ecx-fromdisk ebx-tomem
\r
235 xdisk!: mov ecx, [es:edi]
\r
238 mov ebx, [es:edi+4]
\r
240 add ebx, [xms_addr]
\r
245 call memmove ; ebx - from, edx - to, ecx - amount
\r
253 x@: mov eax, [es:edi]
\r
254 add eax, [xms_addr]
\r
261 add eax, [xms_addr]
\r
262 mov ecx, [es:edi+4]
\r
267 xover: mov ebx, [es:edi+4]
\r
272 xswap: mov ebx, [es:edi]
\r
273 xchg ebx, [es:edi+4]
\r
277 xplus: mov ebx, [es:edi]
\r
282 xminus: mov ebx, [es:edi]
\r
287 xmul: mov eax, [es:edi]
\r
290 imul dword [es:edi]
\r
297 idiv dword [es:edi-4]
\r
301 xgreat: mov eax, [es:edi]
\r
307 l3: mov [es:edi], edx
\r
310 xless: mov eax, [es:edi]
\r
316 l4: mov [es:edi], edx
\r
319 file_seek: ; ( ecx - pointer to seek )
\r
331 xnot: not dword [es:edi]
\r
334 xi: mov ebx, [resp]
\r
340 xcprt@: mov dx, [es:edi]
\r
347 xcprt!: mov dx, [es:edi]
\r
353 xi2: mov ebx, [resp]
\r
354 mov eax, [es:ebx+4]
\r
359 xi3: mov ebx, [resp]
\r
360 mov eax, [es:ebx+8]
\r
365 xshl: mov cl, [es:edi]
\r
367 shl dword [es:edi], cl
\r
370 xshr: mov cl, [es:edi]
\r
372 shr dword [es:edi], cl
\r
375 lor: mov eax, [es:edi]
\r
380 lxor: mov eax, [es:edi]
\r
387 add edx, [xms_addr]
\r
393 mov word [ds:gra], 0
\r
397 mapl1: mov dx, [cs:gra]
\r
404 mapl2: mov eax, [ds:esi]
\r
409 ; cmp word [cs:gra], 5
\r
410 cmp word [cs:gra], 19
\r
423 mov ax, 0bh ; read motion counter
\r
431 mov [es:edi-4], edx
\r
436 mov [es:edi-8], edx
\r
437 mov ax, 3 ; read buttons
\r
445 memmove: ; ebx - from, edx - to, ecx - amount
\r
456 memmove2: ; ebx - from, edx - to, ecx - amount
\r
469 xcmove: mov ecx, [es:edi]
\r
471 mov edx, [es:edi-8]
\r
472 add edx, [xms_addr]
\r
473 mov ebx, [es:edi-4]
\r
474 add ebx, [xms_addr]
\r
484 xcfill: mov ecx, [es:edi]
\r
485 mov edx, [es:edi+4]
\r
486 add edx, [xms_addr]
\r
487 mov eax, [es:edi+8]
\r
496 diskload: ; ecx-fromdisk ebx-tomem
\r
505 sub ebx, ebx ; move it to XMS
\r
511 call memmove ; ebx - from, edx - to, ecx - amount
\r
525 include 'vidput.inc'
\r
526 include 'tvidput.inc'
\r
527 include 'charput.inc'
\r
528 include 'system.inc'
\r
529 include 'kbdrive.inc'
\r
531 buf: ; pointer to end of the code
\r