From cad3370c4c7b9dc7ae521851f7462802e6d88ba1 Mon Sep 17 00:00:00 2001 From: Christoffer Bubach Date: Tue, 6 Jan 2015 21:57:50 +0100 Subject: [PATCH] initial commit --- boot/BOS_boot.asm | 282 + boot/BOS_boot.bin | Bin 0 -> 512 bytes doc/bochsrc.txt | 26 + doc/design.txt | 226 + install.bat | 16 + install.sh | 75 + kernel/kernel.asm | 120 + kernel/kernel.sys | Bin 0 -> 17869 bytes kernel/krl_incs/bos_init.inc | 128 + kernel/krl_incs/cmos.inc | 96 + kernel/krl_incs/commands.inc | 551 ++ kernel/krl_incs/debug.inc | 385 ++ kernel/krl_incs/dma.inc | 93 + kernel/krl_incs/en_mess.inc | 29 + kernel/krl_incs/fdc.inc | 501 ++ kernel/krl_incs/idt.inc | 147 + kernel/krl_incs/isr.inc | 529 ++ kernel/krl_incs/keyboard.inc | 380 ++ kernel/krl_incs/keymap.inc | 85 + kernel/krl_incs/mario.inc | 119 + kernel/krl_incs/mem.inc | 388 ++ kernel/krl_incs/pc_speaker.inc | 56 + kernel/krl_incs/pic.inc | 135 + kernel/krl_incs/rmode_int.inc | 107 + kernel/krl_incs/shell.inc | 190 + kernel/krl_incs/sys_ints.inc | 112 + kernel/krl_incs/text.inc | 411 ++ kernel/krl_incs/time_date.inc | 129 + kernel/krl_incs/timer.inc | 174 + kernel/krl_incs/vga.inc | 221 + kernel/realmode/a20.inc | 51 + kernel/realmode/do_all_16bit.inc | 38 + kernel/realmode/gdt.inc | 26 + kernel/realmode/idt.inc | 16 + kernel/realmode/mem.inc | 51 + kernel/realmode/variables.inc | 29 + kernel/testkernels etc/font8x16.inc | 264 + kernel/testkernels etc/kernel.asm | 188 + kernel/testkernels etc/text.txt | 8547 +++++++++++++++++++++++++++ kernel/testkernels etc/vga.inc | 482 ++ utils/FASM.EXE | Bin 0 -> 69632 bytes utils/PARTCOPY.EXE | Bin 0 -> 11502 bytes utils/fasm | Bin 0 -> 63017 bytes 43 files changed, 15403 insertions(+) create mode 100755 boot/BOS_boot.asm create mode 100755 boot/BOS_boot.bin create mode 100755 doc/bochsrc.txt create mode 100644 doc/design.txt create mode 100755 install.bat create mode 100755 install.sh create mode 100755 kernel/kernel.asm create mode 100755 kernel/kernel.sys create mode 100755 kernel/krl_incs/bos_init.inc create mode 100755 kernel/krl_incs/cmos.inc create mode 100755 kernel/krl_incs/commands.inc create mode 100755 kernel/krl_incs/debug.inc create mode 100755 kernel/krl_incs/dma.inc create mode 100755 kernel/krl_incs/en_mess.inc create mode 100755 kernel/krl_incs/fdc.inc create mode 100755 kernel/krl_incs/idt.inc create mode 100755 kernel/krl_incs/isr.inc create mode 100755 kernel/krl_incs/keyboard.inc create mode 100755 kernel/krl_incs/keymap.inc create mode 100755 kernel/krl_incs/mario.inc create mode 100755 kernel/krl_incs/mem.inc create mode 100755 kernel/krl_incs/pc_speaker.inc create mode 100755 kernel/krl_incs/pic.inc create mode 100755 kernel/krl_incs/rmode_int.inc create mode 100755 kernel/krl_incs/shell.inc create mode 100755 kernel/krl_incs/sys_ints.inc create mode 100755 kernel/krl_incs/text.inc create mode 100755 kernel/krl_incs/time_date.inc create mode 100755 kernel/krl_incs/timer.inc create mode 100755 kernel/krl_incs/vga.inc create mode 100755 kernel/realmode/a20.inc create mode 100755 kernel/realmode/do_all_16bit.inc create mode 100755 kernel/realmode/gdt.inc create mode 100755 kernel/realmode/idt.inc create mode 100755 kernel/realmode/mem.inc create mode 100755 kernel/realmode/variables.inc create mode 100755 kernel/testkernels etc/font8x16.inc create mode 100755 kernel/testkernels etc/kernel.asm create mode 100755 kernel/testkernels etc/text.txt create mode 100755 kernel/testkernels etc/vga.inc create mode 100755 utils/FASM.EXE create mode 100755 utils/PARTCOPY.EXE create mode 100755 utils/fasm diff --git a/boot/BOS_boot.asm b/boot/BOS_boot.asm new file mode 100755 index 0000000..c77b7e3 --- /dev/null +++ b/boot/BOS_boot.asm @@ -0,0 +1,282 @@ +;------------------------------------------------------------; +; BOS - FAT12 bootsector ; +;------------------------------------------------------------; +; - FAT12 compatible. ; +; - Loads a binary file from the floppy. ; +; ; +;------------------------------------------------------------; + +; TODO: +; as i moved some 16-bit stuff to the kernel, i now got +; space to do proper testing (for data-area etc), +; fix that... +; +; TODO2: +; find out why this crap takes ages to load the kernel.. :S + + +; +; 16-bit mem map (seg:off) +; 0x0000:0x0000 -> 0x0000:0x0500 BIOS stuff +; 0x0000:0x0500 -> 0x0000:0x2100 FAT12 rootdir +; 0x0000:0x2100 -> 0x0000:0x3300 FAT for FAT12 +; 0x0000:0x3300 -> 0x0000:0x6c00 14,25kb free space +; 0x0000:0x6c00 -> 0x0000:0x7400 IDT, 256 descriptors +; 0x0000:0x7400 -> 0x0000:0x7c00 GDT, 256 descriptors +; 0x0000:0x7c00 -> 0x0000:0x7e00 bootsector +; 0x0000:0x7e00 <- 0x0000:0xffff ~32,5kb stack for boot +; 0x1000:0x0000 -> 0x9000:0xffff 576kb kernel/free space +; 0xa000:0x0000 -> ............. VGA mem etc. + +use16 +org 0x7C00 + +boot: jmp near start + nop + +;------------------------------------------; +; Standard BIOS Parameter Block, "BPB". ; +;------------------------------------------; + bpbOEM db 'BOS 0.04' + bpbSectSize dw 512 + bpbClustSize db 1 + bpbReservedSec dw 1 + bpbFats db 2 + bpbRootSize dw 224 + bpbTotalSect dw 2880 + bpbMedia db 240 + bpbFatSize dw 9 + bpbTrackSect dw 18 + bpbHeads dw 2 + bpbHiddenSect dd 0 + bpbLargeSect dd 0 + ;---------------------------------; + ; extended BPB for FAT12/FAT16 ; + ;---------------------------------; + bpbDriveNo db 0 + bpbReserved db 0 + bpbSignature db 41 ; 0 = nothing more. 41 = three more (below).. + bpbID dd 1 + bpbVolumeLabel db 'BOOT FLOPPY' + bpbFileSystem db 'FAT12 ' + + +;----------------------------------------; +; starting point of bootsector code ; +;----------------------------------------; +start: + cli + + xor ax, ax ; initialize all the necessary + mov ds, ax ; registers. + mov es, ax + mov ss, ax + mov sp, 0xFFFF ; Stack.. + + mov [bpbDriveNo], dl + + sti + + +;----------------------------------; +; clear screen and print some ; +;----------------------------------; + mov ax, 3 ; Set mode 0x03 + int 0x10 + + mov bp, loading ; Print loading message. + mov ax, 0x1301 + mov bx, 7 + mov cx, 12 + mov dx, 0x0102 + int 0x10 + + mov bl, 2 ; Set cursor. + mov ah, 2 + mov dx, 0x0201 + int 0x10 + + mov ah, 9 ; Print 14 green dots. + mov al, '.' + mov cx, 14 + int 0x10 + + +;---------------------------; +; load FAT and root ; +;---------------------------; + mov di, 0x0050 ; Load the root to + mov ax, 19 ; 0x0000:0x0500 (0x500/0x10) + mov cx, 14 + call read_sectors + + mov di, 0x0210 ; Load the fat to + mov ax, 1 ; 0x0000:0x2100 + mov cx, 9 + call read_sectors + + + ;------------------------; + ; search for the file ; + ;------------------------; + mov dx, [bpbRootSize] + mov bx, 0x0500 + filesearch: + cld + mov si, filename + mov cx, 11 + mov di, bx + repe cmpsb + je found + add bx, 32 + dec dx + jz error + jmp filesearch + + +;-----------------------------------; +; variables & functions ; +;-----------------------------------; + loading db 'Starting BOS' + filename db 'KERNEL SYS' + failure db 'Read error!' + + + ;-----------------------------------------------; + ; read a number of sectors (one at a time) ; + ;-----------------------------------------------; + ; in: ; + ; di = segment to save at ; + ; ax = sector to read ; + ; cx = number of sectors ; + ; out: ; + ; di = updated (added for next read) ; + ; ax = updated (added for next read) ; + ;-----------------------------------------------; + read_sectors: + pusha + mov bl, byte [bpbTrackSect] ; bl = number of sectors per track + div bl ; al = ax / bl + mov cl, ah ; cl = real sector number + add cl, 1 + + xor ah, ah ; del the rest of the div before + mov bl, byte [bpbHeads] ; bl = number of heads + div bl ; ah = rest of ( ax / bx ), al = ax / bx + mov ch, al ; ch = number of track + mov dh, ah ; dh = the head number + + mov ax, cx ; save cx in ax + mov cx, 6 ; try it 6 times + .next_try: + push es + push cx + mov cx, ax ; restore cx + push cx + + xor ax, ax + mov dl, [bpbDriveNo] ; reset drive + push dx + int 0x13 + jc .failed + + pop dx + pop cx + xor bx, bx + mov es, di + mov ax, 0x0201 ; function 2, 1 sector + int 0x13 + jnc .ok ; if it was ok, check next.. + + .failed: + pop dx + pop ax + + pop cx + pop es + loop .next_try ; else try once again if there is an error + jmp error ; if cx = 0 and the read operation failed, halt + .ok: + pop cx ; from the next_try loop + pop es + popa + add di, 32 ; add 32 (512/16) to segment + inc ax ; add sector counter + loop read_sectors + ret + + + ;----------------------------------------------------; + ; show a message and wait for a key before reboot ; + ;----------------------------------------------------; + error: + mov bp, failure + mov ax, 0x1301 + mov bx, 4 + mov cx, 11 + mov dx, 0x0401 + int 0x10 + + mov ah, 0 + int 0x16 + int 0x19 + + +;-----------------------------------; +; the file is found, load it. ; +;-----------------------------------; +found: + mov bp, [bx+26] ; bp=cluster number from directory entry + mov di, 0x1000 ; 1000 (segment) + + .next_block: + xor cx, cx + mov cl, [bpbClustSize] ; reset sector count to 1 cluster + mov si, bp ; si=next should-be cluster for + ; contiguous reads + .next_contiguous: + mov ax, 3 ; 3 + mul si ; multiply cluster number by 3 + shr ax, 1 ; divide by two + mov bx, ax + mov ax, word [(0x2100+bx)] ; ax=FAT element with junk + jc .odd_cluster ; jump if the value was odd + and ax, 0x0FFF ; leave only lower 12 bits + jmp .got_cluster ; got it + .odd_cluster: + shr ax, 4 ; (leave only bits 4-15) + + .got_cluster: + inc si ; si=current cluster+1 + cmp ax, si ; next cluster=current cluster+1? + jne .force_read ; is it still contiguous? + + add cl, [bpbClustSize] ; increase sector count by 1 cluster + adc ch, 0 ; add cf+0 to ch + jmp .next_contiguous + + .force_read: + xchg bp, ax ; ax=bp (base cluster), bp=new cluster + dec ax ; decrease by 2 to get the actual... + dec ax ; ...cluster number + + movzx dx, byte [bpbClustSize] + mul dx ; multiply by sectors per cluster + add ax, 33 ; add data-area location (33) + call read_sectors + + cmp bp, 0x0FF8 ; is the new cluster EOF (FF8-FFF)? + jb .next_block ; if not, read next block + +;-----------------------; +; the file is loaded ; +;-----------------------; +quit: + jmp 0x1000:0x0000 ; jump to loaded file (64kb in mem) + + +;-------------------------------------; +; set the BOOT-signature at byte 510. ; +;-------------------------------------; + rb boot+512-2-$ + dw 0xAA55 \ No newline at end of file diff --git a/boot/BOS_boot.bin b/boot/BOS_boot.bin new file mode 100755 index 0000000000000000000000000000000000000000..b196cc4773e0d8db1d115c2bde722045644ac8b5 GIT binary patch literal 512 zcmaEDGr`F}SiwNgz=VN`k&%Jv0fPhg2Tled1||js&}0O%o&5bn6x@9L0|Fx5977C^ z6ciMG86N1n(RZNl!k+*CJH%9Ke(zvrI4iJsZOslw;oa;EJ9!v(F)^MM*vzzrX%{2Y zS%EE_8}xSa0hR0zVAvtd0A#-KVc0Lgw1bghCnv)T2ZnAj!J6F+tbg|Htl7!U(0Tv! zGX9ochUUWxUL^&uUj~;X7L{b?r7HlP?Cl!l=jx-N5F8mCl$w~LkXlrfU!<7OB_~ny z?Q_S&hJ%a-PrBr!K%Ao;&pJ=+WMg0p>^vA~c%TdD(4e!zMZ8gwhPV5U?*KYXxR@g< zB9i^l-Pc@^?1|0C6&xOIJ-qh_*c&ViK$q-dWC6OK;jGwM$?klq{R{$zC%gD~YdYTn zJ^cOI#TT82yW1HQi&$0v^S@?3_=3gF@LbQD|8hAHu{qO literal 0 HcmV?d00001 diff --git a/doc/bochsrc.txt b/doc/bochsrc.txt new file mode 100755 index 0000000..982486f --- /dev/null +++ b/doc/bochsrc.txt @@ -0,0 +1,26 @@ +####################################### +# # +# BOCHS config file for BOS # +# # +####################################### + +romimage: file=BIOS-bochs-latest, address=0xf0000 +megs: 32 +vgaromimage: VGABIOS-elpin-2.40 +floppya: 1_44=a:, status=inserted +boot: a +floppy_bootsig_check: disabled=0 +log: bochsout.txt +panic: action=ask +error: action=report +info: action=report +debug: action=ignore +debugger_log: debugger.out +vga_update_interval: 300000 +keyboard_serial_delay: 250 +keyboard_paste_delay: 100000 +floppy_command_delay: 50000 +ips: 1000000 +mouse: enabled=0 +keyboard_mapping: enabled=0, map= +user_shortcut: keys=ctrlaltdel diff --git a/doc/design.txt b/doc/design.txt new file mode 100644 index 0000000..c885068 --- /dev/null +++ b/doc/design.txt @@ -0,0 +1,226 @@ +BOS design +---------- + +The kernel will load internal system modules like STDIO, +VFS and so on, by calling a dd list in "init.inc". +STDIO should be the first to load, as to be able to print +loading status of other parts. + + + +STDIO will use internal buffer/debug console as STDOUT at +first, until textmode, VESA or serial output driver is +activated, at which point the internal buffer/debug console +will be flushed to new STDOUT. + +Module for STDOUT could even include a file handle for +systems with no normal output device, so that debugging +information can be read out from file. All drivers +for STDIO will have to follow a common STDIO interface +and can be dynamically loaded and unloaded at runtime. + +Keyboard/mouse drivers for PS/2 and later USB also needs +to register itself to STDIO as STDIN devices in the system. + + + +Other primary services tightly connected to the BOS kernel +is the VFS for all storage devices and filesystems, the +interrupt and system call interface for adding new calls +and groups of calls within the standard int 0x32 interrupt. + +Groups of calls is for primary system services to be +accessed from within the same interrupt, 0x32. For +example the VFS, could use AL = 0x05 for it's "group-ID" +and AH = 0x?? for a specific function-call. STDIO, could +have AL = 0x01 with AH = 0x?? for the function number. + + + +Another primary systemcall group will be the "loader", +for applications and modules/drivers not present inside +the kernel image file - kernel.sys + +It will initially support 2 types of applications, +normal programs and drivers/modules/TSR. + +Loading will be handled by means of segmentation at first, +as the simpler format with less overhead. Similar to +DOS .COM files. Another format for relocatable programs +is planned but will require modifications to fasm for +native output. This will be similar to .EXE files in +DOS. No limitations will be made to the formats, +except the segmentated one will not have base set to zero +in RAM, and will not have program headers and relocation- +tables as overhead. + +This makes it somewhat trickier to preform certain RAM +operations in higher level languages but also ideal for +space constrained applications, such as scene demos - which +often has very low size limits. + +File format exstensions is not yet decided, but might +differ for the two formats. Maybe .APP for the simpler +segmentated format and .PRG for the relocatable? + + + +The kernel image file will need to include some loadable +drivers at the end for further access to media such as +the floppy disk, and the FAT12 filesystem. With this it's +possible that the file on a fat12 formatted floppy will +be named kernel.img while internally it might be visible +as kernel.sys, floppy.drv, fat12.drv and so on. + +Initially the VFS will have internal drivers for parsing +this image format and deploying it as a RAM-drive with +SBFS - static BOS filesystem. A very simple read-only FS +in linked-list style. As simple as it gets. + +So the VFS needs RAM-drive and SBFS support built-in for +it to be able to load additional drivers for floppy, fat12, +harddrives and other media. System drive will always +be this RAM-drive. Any drivers loaded at a later stage can +be on any other media or drive, such as the floppy. + +There should be commands to load a driver like "LOAD" +for one time use and "LOADPERM" for it to be permanetly +inserted into the kernel image file for loading at boot. +"UNLOAD" and "UNLOADPERM" could be used for unloading +and removing drivers from the kernel image. + + + +Memory managment and allocation in BOS will be another +primary system service with it's own group-ID in AL, +for access with int 0x32. It will provide one allocation +and freeing service for memory above 1mb and another +service for memory below 1mb. + +Memory below 1mb should only be used in applications that +needs to run 16-bit code or allocate DMA buffer space. It +will be possible to demand 64kb align on allocations made +in low memory - to properly support DMA transfers. + +The memory managment service group will also have functions +to get RAM size, and maybe system location/size or others. + + + +Running custom 16-bit code will be possible by allocating +low memory space, relocating any 16-bit code to that area +and then calling a BOS system service to start execution +in realmode at that address. This will allow for greater +flexibility in utilizing BIOS services than a direct +bridge call to for example interrupt 0x10 or 0x13. + +All (segment) registers can be used and BIOS interrupts +demanding buffer space pointers will easily be supported by +pre-allocating the necessary low memory before executing +the real mode code. + +Direct execution of a native 16-bit executable file format +is not planned, but could be supported by a third party +loader written in 32-bit to take 16-bit binary filename as +input, allocate low memory for it, relocate it, execute +and clean up at exit. Such a program could be extended to +contain interrupt 0x21 services for basic DOS compability. + +BOS kernel is loaded at the 64kb mark right now, but should +be moved sufficently below that for internal 16-bit code +to work without address fixes. The ORG offset should be +below 0xFFFF for all internal 16-bit code. Now it starts +at 0x10000, which means this offset has to be substracted +from all 16-bit code that deals with variables. + +For external 16-bit code, relocated and runned by the kernel, +this is no issue. + + + +BOS should include a scripting language, similar to DOS batch +files for scripting and "autoexec" usage. If the extension +is .RUN - the file to autostart drivers and customize the +system at boot could be called "auto.run". + +The scripting language needs some internal commands not tied +to any shell, for program control - and also for the auto.run +file to be able to load the shell at boot, the LOADSH command +is needed. This could be directly tied to the VFS for +selecting which shell to load. The shell needs to set some +system vars like %SHELLNAME% and %SHELLVERSION% for the +scripts to know what other commands are available from it. + +Basic commands, independent of shell could be: +LOADSH = "fd0:/path/shell.app" +GOTO LABEL +:LABEL +REM comment +IF [NOT] %xxx%==something GOTO LABEL +ECHO %1 is first command line parameter +ECHO. +ECHO %SHELLNAME% is env. var for shell used. +SET ENV_VARIBEL=Hi +SETLOCAL LOCAL_VAR=Bye +LOOP %var% +ENDLOOP +CALL filename.run + +Nothing is set in stone, but DOS batch file similarity could +be good for those that know it well. It should be as easy to +parse as possible. + + + +Graphics in BOS will probably be tied to the STDIO services +with many additional function calls for drawing shapes and +outputing sprites. Text output will be possible as in any +textmode, but the cursor will be hidden by default, and if +enabled, simulated with blinking and all - by BOS. + +With text output options even in VESA modes, a system crash +will still be able to print out some facts about it with +the same STDOUT functions as in textmode. Font&size will be +optional, but optimized for best look and usability as default. + +Other graphics function will include anything that helps +and eases the development of games, added as I port and +develops my own game clones. + + + +The sound service group will have a unified function interface +no matter what device is installed, only PC speaker, AC'97, +SoundBlaster/AdLib compatible or Intel HD audio. + +It will be possible for the programs to detect capability of +the installed driver for best utilization. + + + +A driver will be loaded in the exact same way as any other +application but will install itself with the service group +it belongs to, or as a new interrupt itself before quitting +in a TSR way. + +The interrupt handling code will have functionality for drivers +not only to install a completly new interrupt, but also to add +itself as a new service group in the system interrupt 0x32. +It will then be given a free service number (AL=0x??) for calls +made to that group. It could also request to take over an +existing service number. What internal function to be called is +decided with the value in AH and could go to external drivers +that has been loaded and added itself to the service group. + +A driver might use .DRV extension or something to distinguish +itself from a normal executable. It's not decided how to tell +if it's a .APP type segmented driver or .PRG relocatable driver +with just one .DRV extension. Could probe for relocatble format +header for .PRG and assume .APP format if not found. This could +be done for programs as well, if I choose to use one extension +on both executable formats. + + + +The End + - for now. \ No newline at end of file diff --git a/install.bat b/install.bat new file mode 100755 index 0000000..6f44ae5 --- /dev/null +++ b/install.bat @@ -0,0 +1,16 @@ +@echo off +echo Put an empty floppy in drive a: and +pause +echo. +cd kernel +..\utils\fasm kernel.asm kernel.sys +cd ..\boot +..\utils\fasm BOS_boot.asm BOS_boot.bin +cd.. +.\utils\partcopy .\boot\BOS_boot.bin 0 200 -f0 +copy .\kernel\kernel.sys a: +echo. +echo Complete. Thank you for using my crappy +echo installer.. (and for testing BOS 0.04) +echo. +pause \ No newline at end of file diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..9e65ecc --- /dev/null +++ b/install.sh @@ -0,0 +1,75 @@ +#! /bin/sh + +# BOS Linux Installer version 0.2 +# You must be root to run this script because of the floppy/loopback device + +echo +echo -e "\E[33;1mBOS\E[0m - \E[32;1mLinux installer\E[0m" +echo + +if [ `id -u` != "0" ]; then + echo -e "\E[31;1mYou must be root to use this installer!\E[0m" + echo +fi + +if [ -z "$1" ]; then + echo "Usage is:" + echo -e "\E[31m$0 image\E[0m - Creates a floppy image called bos.img" + echo -e "\E[31m$0 floppy\E[0m - Install BOS into a floppy ( must be inserted )" + echo + echo "Note: this installer will create a bootable image/floppy." + echo "Floppy creation is not tested ( I don't have a floppy reader ) and it should be already formatted" + exit +fi + +echo -e "\E[32mCompiling BOS...\E[0m" +./utils/fasm kernel/kernel.asm kernel/kernel.sys +./utils/fasm boot/BOS_boot.asm boot/BOS_boot.bin + +if [ "$1" = "floppy" ]; then + echo -e "\E[32mStarting floppy installation...\E[0m" + + #Install BOS_boot.bin as bootsector into bos.img + dd if=boot/BOS_boot.bin of=/dev/fd0 bs=1 count=512 + mount /mnt/floppy + + #Insert kernel.sys into image + cp kernel/kernel.sys /mnt/floppy + + #Umount & cleanup + umount /mnt/floppy + + echo -e "\E[33mBOS installed.\E[0m" + +else + echo -e "\E[32mStarting image creation...\E[0m" + + #Create empty image + if [ -e bos.img ]; then + rm -f bos.img + fi + dd if=/dev/zero of=bos.img bs=1k count=1440 + + #Format image in MSDOS format and mount it + mkdosfs bos.img + losetup /dev/loop3 bos.img + + #Install BOS_boot.bin as bootsector into bos.img + dd if=boot/BOS_boot.bin of=/dev/loop3 bs=1 count=512 + if [ ! -e tmpmnt ]; then + mkdir tmpmnt + fi + mount -tmsdos /dev/loop3 tmpmnt + + #Insert kernel.sys into image + cp kernel/kernel.sys tmpmnt + + #Umount & cleanup + umount /dev/loop3 + if [ -e tmpmnt ]; then + rm -rf tmpmnt + fi + losetup -d /dev/loop3 + + echo -e "\E[33mBOS image created! ( better do a chown on it now ;) )\E[0m" +fi \ No newline at end of file diff --git a/kernel/kernel.asm b/kernel/kernel.asm new file mode 100755 index 0000000..40c2225 --- /dev/null +++ b/kernel/kernel.asm @@ -0,0 +1,120 @@ +;-------------------------------------------------------; +; BOS kernel ; +;-------------------------------------------------------; +; BOS 32-bit kernel, expects to be loaded at 64kb ; +; in mem. Small amount of 16-bit code included. ; +; ; +; For any comments on this code, mail me. ; +; http://bos.asmhackers.net/ asmhacker@gmail.com ; +; ; +; by: Christoffer Bubach, 2003-2005 ; +;-------------------------------------------------------; +use16 +org 0x10000 + +;---------------------------; +; jump to starting point ; +;---------------------------; + jmp start + +;----------------------------------------; +; 16-bit include files ; +;----------------------------------------; + include 'realmode/a20.inc' ; Function to set the a20-gate. + include 'realmode/gdt.inc' ; Global Description Table. + include 'realmode/idt.inc' ; The Interrupt Description Table. + include 'realmode/mem.inc' ; Get memory size. + include 'realmode/variables.inc' ; For/from realmode. + include 'realmode/do_all_16bit.inc' ; Save "go back to 16-bit"-info. + + + +;--------------------------; +; 16-bit entry point ; +;--------------------------; +start: + cli + mov ax, cs + mov ds, ax + ; fasm is more strict about + xor eax, eax ; "org 0x10000" then nasm, so + mov es, ax ; i have to do -0x10000 from + mov fs, ax ; all variable addresses while + mov gs, ax ; in realmode. + sti + + call enable_a20 + call do_all_16bit ; ... :P + + cli + mov ax, cs ; save cs + mov [realmode_cs - 0x10000], ax ; in variables.inc + + lgdt [gdtr - 0x10000] ; Load the GDT descriptor + lidt [idtr - 0x10000] ; Load the IDT descriptor + + mov eax, cr0 + or al, 1 + mov cr0, eax + + jmp pword 0x08:flush ; dword in nasm + + + +;--------------------------; +; 32-bit entry point ; +;--------------------------; +use32 +flush: + mov ax, 0x10 ; refresh all segment registers + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + mov esp, 0xFFFC + + call bos_init ; fix everything + + mov bx, 0x04B1 ; start the shell + call setcursor + mov esi, bos_shell + mov bl, 0x07 + call print + call init_cmd + jmp shell + + ;int 0x32 + + .hang: + cli + hlt + jmp .hang ; hang, just in case.. + + +;----------------------------------------; +; 32-bit include files ; +;----------------------------------------; + include 'krl_incs/idt.inc' ; The Interrupt Description Table. + include 'krl_incs/text.inc' ; The default textmode functions. + include 'krl_incs/bos_init.inc' ; Function that starts up BOS + include 'krl_incs/en_mess.inc' ; All strings in english (soon). + include 'krl_incs/rmode_int.inc' ; Get back to realmode and do an INT. + include 'krl_incs/pic.inc' ; PIC rutines. + include 'krl_incs/sys_ints.inc' ; System specific interrupts. + include 'krl_incs/keyboard.inc' ; Keyboard ISR. + include 'krl_incs/keymap.inc' ; Keymap(s). + include 'krl_incs/shell.inc' ; File with shell/kernel monitor functions. + include 'krl_incs/commands.inc' ; Command table, for valid shell commands. + include 'krl_incs/isr.inc' ; Interrupt Service Rutines. + include 'krl_incs/debug.inc' ; Print contents of all regs and hang. + include 'krl_incs/cmos.inc' ; To get CMOS data. + include 'krl_incs/time_date.inc' ; Print time and date. + include 'krl_incs/timer.inc' ; Timer IRQ. + include 'krl_incs/vga.inc' ; VGA functions. + ; include 'krl_incs/font8x16.inc' ; Standard font. + include 'krl_incs/dma.inc' ; DMA code. + include 'krl_incs/fdc.inc' ; Floppy code. + include 'krl_incs/mario.inc' ; Mario sprite. + include 'krl_incs/pc_speaker.inc' ; PC speaker. + include 'krl_incs/mem.inc' ; Memory allocation and freeing. \ No newline at end of file diff --git a/kernel/kernel.sys b/kernel/kernel.sys new file mode 100755 index 0000000000000000000000000000000000000000..d553f80a31cce04d9cdae7f45d0cb53b4593eee2 GIT binary patch literal 17869 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 int 0x20-27. + mov ch, 0x28 ; PIC 2, irq8-irq15 -> int 0x28-30. + call remap_pics + call disable_irqs + + mov bx, 0x0233 + call setcursor + mov esi, pic_irq + mov bl, 0x07 + call print + + mov bx, 0x0265 + call setcursor + mov esi, pic_irq_ok + mov bl, 0x02 + call print + + ;--------------; + ; setup IDT ; + ;--------------; + mov edi, u_isr ; isr.inc + call init_idt ; idt.inc + mov esi, idt_list ; idt.inc + call set_idt_list ; idt.inc + + sti ; Interrupts back.. + + mov bx, 0x0283 + call setcursor + mov esi, idt_mess + mov bl, 0x07 + call print + + mov bx, 0x02B5 + call setcursor + mov esi, idt_ok + mov bl, 0x02 + call print + + + ;---------------------------------------------; + ; enable IRQs (one after one as i code it) ; + ;---------------------------------------------; + mov cl, 1 + call enable_irq ; Enable IRQ 1. + + mov bx, 0x02D3 + call setcursor + mov esi, kbd_load + mov bl, 0x07 + call print + + mov bx, 0x0305 + call setcursor + mov esi, kbd_ok + mov bl, 0x02 + call print + + ;------------------------------------; + ; get CMOS data, set PIT to 100Hz ; + ; and start timer. ; + ;------------------------------------; + call get_cmos_data ; cmos.inc + call set_pit_freq ; timer.inc + mov cl, 0 + call enable_irq ; Enable IRQ 0. + + ;-------------------; + ; init simple MM ; + ;-------------------; + mov ebx, 0x100000 ; address of first free + mov ecx, [ram_amount] ; RAM. everything before + call init_mem ; that is reserved. + + ;--------------------; + ; init fdc driver ; + ;--------------------; + call fdc_init ; fdc.inc + + + ;-------------------------; + ; return to kernel.asm ; + ;-------------------------; + ret \ No newline at end of file diff --git a/kernel/krl_incs/cmos.inc b/kernel/krl_incs/cmos.inc new file mode 100755 index 0000000..032a95c --- /dev/null +++ b/kernel/krl_incs/cmos.inc @@ -0,0 +1,96 @@ +;----------------------------------------------------------; +; BOS kernel Christoffer Bubach, 2005. ; +;----------------------------------------------------------; +; ; +; To get stuff ( time & date ) from CMOS memory. ; +; ; +;----------------------------------------------------------; + + +;-----------------------------------; +; variables containing CMOS data ; +;-----------------------------------; + century db 0 ; latest century, + year db 0 ; year, + month db 0 ; month, + day db 0 ; day (1 = sunday), + hour db 0 ; hour, + minute db 0 ; minute and + second db 0 ; second read in from CMOS. + + +;-------------------------; +; save info from CMOS ; +;-------------------------; +get_cmos_data: + push ax + + mov al, 0x00 ; get the "second" byte + out 0x70, al + in al, 0x71 + mov [second], al ; save it. + + mov al, 0x02 ; get the "minute" byte + out 0x70, al + in al, 0x71 + mov [minute], al + + mov al, 0x04 ; get the "hour" byte + out 0x70, al + in al, 0x71 + mov [hour], al + + mov al, 0x07 ; get the "day" byte + out 0x70, al + in al, 0x71 + mov [day], al + + mov al, 0x08 ; get the "month" byte + out 0x70, al + in al, 0x71 + mov [month], al + + mov al, 0x09 ; get the "year" byte + out 0x70, al + in al, 0x71 + mov [year], al + + mov al, 0x32 ; get the "century" byte + out 0x70, al + in al, 0x71 + mov [century], al + + pop ax + ret + +;------------------------------------------------; +; calculate binary from BCD ; +; in: al = BCD ; +; out: al = bin ; +;------------------------------------------------; +BCD2bin: + push ebx + mov bl, al ; bl = al mod 16 + and bl, 0x0F + shr al, 4 ; al = al / 16 + mov bh, 10 + mul bh ; multiply by 10 + add al, bl ; add in low nib + pop ebx + ret + + +;------------------------------------------------; +; calculate ASCII from BCD ; +; in: al = BCD ; +; out: ax = ASCII ; +;------------------------------------------------; +BCD2ascii: + push ecx + mov ah, al + and ax, 0xF00F ; mask bits + shr ah, 4 ; right shift ah to get unpacked BCD + or ax, 0x3030 ; combine with 30 to get ASCII + xchg ah, al ; swap for ASCII storage convention + pop ecx + ret \ No newline at end of file diff --git a/kernel/krl_incs/commands.inc b/kernel/krl_incs/commands.inc new file mode 100755 index 0000000..1c66dc7 --- /dev/null +++ b/kernel/krl_incs/commands.inc @@ -0,0 +1,551 @@ +;----------------------------------------------------------; +; BOS kernel Christoffer Bubach, 2003-2005. ; +;----------------------------------------------------------; +; ; +; Command table and some commands for the shell. ; +; ; +;----------------------------------------------------------; + +; I should really do something about this file, divide it into +; smaller ones or something. I'm just too lazy. Next version.. + + + commands: db 'ver', 0 + db 'help', 0 + db '?', 0 + db 'about', 0 + db 'cls', 0 + db 'clrscr', 0 + db 'reboot', 0 + db 'regdump', 0 + db 'time', 0 + db 'date', 0 + db 'delay', 0 + db 'vgatest', 0 + db 'memtest', 0 + db 'fddtest', 0 + db 0xFF ; end of command table + + + call_table: dd show_ver ; commands.inc + dd show_help ; commands.inc + dd show_help ; commands.inc + dd show_about ; commands.inc + dd clrscr ; commands.inc + dd clrscr ; comamnds.inc + dd reboot ; commands.inc + dd dump_regs ; debug.inc + dd print_time ; time_date.inc + dd print_date ; time_date.inc + dd delay_test ; commands.inc + dd vga_test ; commands.inc + dd mem_test ; commands.inc + dd fdd_test ; commands.inc + + + + ;--------------------------; + ; not a valid command ; + ;--------------------------; + not_a_valid_cmd db 13,10,'No such command or program exists.', 0 + + no_such_cmd: + push esi + push bx + + mov esi, not_a_valid_cmd + mov bl, 0x04 + call print + + pop bx + pop esi + ret + + + ;-------------------; + ; show version ; + ;-------------------; + bos_ver_str db 13,10,'BOS version 0.04 by Christoffer Bubach, 2003-2005.', 0 + show_ver: + push esi + push bx + + mov esi, bos_ver_str + mov bl, 0x07 + call print + + pop bx + pop esi + ret + + + ;--------------------; + ; show BOS help ; + ;--------------------; + bos_help_str db 13,10,13,10,' BOS 0.04 by Christoffer Bubach, 2003-2005.',13,10,\ + '--------------------------------------------',13,10,\ + 'Type a command and press ENTER to execute it.',13,10,13,10,\ + '"help" or "?" - Displays this text.',13,10,\ + '"ver" - Shows version information.',13,10,\ + '"about" - Shows information about the OS.',13,10,\ + '"cls" or "clrscr" - Clears the screen.',13,10,\ + '"memtest" - Shows memory info (and allocates/frees some, to test).',13,10,\ + '"vgatest" - Test some VGA stuff.',13,10,\ + '"fddtest" - Read and print bootsector from A:',13,10,\ + '"delay" - Tests the delay function for 5 s.',13,10,\ + '"time" - Prints current time.',13,10,\ + '"date" - Prints current date.',13,10,\ + '"regdump" - Dump some standard registers.',13,10,\ + '"reboot" - Restarts the computer.',0 + show_help: + push esi + push bx + + mov esi, bos_help_str + mov bl, 0x07 + call print + + pop bx + pop esi + ret + + + ;-----------------; + ; show about ; + ;-----------------; + bos_about_str db 13,10,'About BOS',13,10,\ + 'Hmm.. I started with OS-dev in late 2003.. Anyway..',13,10,13,10,\ + 'Thanks for helping me get this far goes to:',13,10,\ + 'all people at mega-tokyo.com, osdever.net and flatassembler.net',13,10,\ + 'Robert ',153,'stling for Primula, http://ostling.no-ip.com/',13,10,\ + 'J.Thim for EelOS, http://www.ludd.luth.se/~ivileel/',13,10,\ + 'Tomasz Grysztar for fasm and fasmw, http://flatassembler.net/',13,10,\ + 'ASHLEY4, Candy, John S. Fine and Petroff Heroj.',0 + show_about: + push esi + push bx + + mov esi, bos_about_str + mov bl, 0x07 + call print + + pop bx + pop esi + ret + + + ;-----------------------; + ; clear the screen ; + ;-----------------------; + clrscr: + call cls ; text.inc + mov esi, prompt + mov bl, 0x0E + call print + mov edi, cmd_buffer + jmp shell ; no normal return, as it gives an extra line feed + + + + ;-------------; + ; reboot ; + ;-------------; + reboot: + call kbd_wait + mov al, 0xFE + out 0x64, al + jmp $ + ret + + + ;-----------------; + ; delay test ; + ;-----------------; + bos_delay_str db 13,10,'~1 second has passed.', 0 + delay_test: + mov ecx, 5 + .loop: + push ecx + mov ecx, 100 + call delay + pop ecx + mov esi, bos_delay_str + mov bl, 0x07 + call print + loop .loop + ret + + + ;----------------; + ; VGA test ; + ;----------------; + bos_vga_str db 13,10,'It works..! :-D', 0 + vga_test: + + mov ax, 1 ; clear the screen + call set_mode_0x13 ; set mode 0x13 + + mov cx, 256 ; loop out some pixels + .l1: + mov bx, cx ; x value + mov al, cl + push cx + mov cx, 50 ; y value + call put_0x13_pixel + pop cx + loop .l1 + + ; draw mario and some ground + mov esi, mario + mov ax, 260 ; x + mov bx, 168 ; y + mov cx, 20 ; height + mov dx, 18 ; width + call put_0x13_sprite ; in vga.inc + mov esi, grass_l + mov ax, 250 + mov bx, 186 + mov cx, 20 + mov dx, 14 + call put_0x13_sprite + mov esi, grass_f + mov ax, 265 + mov bx, 186 + mov cx, 20 + mov dx, 14 + call put_0x13_sprite + mov esi, grass_ul + mov ax, 280 + mov bx, 186 + mov cx, 20 + mov dx, 14 + call put_0x13_sprite + mov esi, g_lefts + mov ax, 280 + mov bx, 172 + mov cx, 20 + mov dx, 14 + call put_0x13_sprite + mov esi, grass_l + mov ax, 280 + mov bx, 158 + mov cx, 20 + mov dx, 14 + call put_0x13_sprite + mov esi, g_earth + mov ax, 300 + mov bx, 186 + mov cx, 20 + mov dx, 14 + call put_0x13_sprite + mov esi, g_earth + mov ax, 300 + mov bx, 172 + mov cx, 20 + mov dx, 14 + call put_0x13_sprite + mov esi, grass_f + mov ax, 300 + mov bx, 158 + mov cx, 20 + mov dx, 14 + call put_0x13_sprite + + call wait_key + + mov ax, 1 ; clear the screen + call set_mode_0x03 ; set mode 0x03 + + mov esi, bos_vga_str ; print that it worked! + mov bl, 1 + call print + ret + + + + + ;--------------------------; + ; fdd test ; + ;--------------------------; + fdd_test: + mov bl, 13 + mov bh, 7 ; make newline + call print_char + + mov ecx, 512 + mov edi, 0x80000 + .loop511: + mov dword [edi], 'shit' ; set DMA buffer to shit, as a test + add edi, 4 + sub ecx, 4 + cmp ecx, 0 + jne .loop511 + + mov dh, 0x00 ; side + mov dl, 0x00 ; drive + mov ch, 0x00 ; track + mov cl, 0x01 ; sector + mov bl, 0x00 ; 1 = write + call fdd_read_write + jc .error + + mov esi, 0x80000 ; dma buffer + mov ecx, 512 + .print: + lodsb + mov bl, al + mov bh, 7 + call print_char ; print it. is it still + dec ecx ; "shit" ? + cmp ecx, 0 + jne .print + jmp .end + + .error: + mov bl, 13 + call print_char + mov bl, 10 + call print_char + mov bh, 0x40 + mov bl, 'E' ; error sign... :'( + call print_char + + call fdd_reset + call fdd_recalibrate ; do somthing about the error.. :P + + .end: + ret + + + + + + ;------------------------------; + ; memory test ; + ;------------------------------; + + bos_mem_str1 db 13,10,'Performing memory test. (debugging allocs assume 32mb RAM)', 0 + bos_mem_str2 db 13,10,'Total installed memory (in bytes): ',0 + bos_mem_str3 db 13,10,13,10,'Memory chunks:',0 + bos_mem_str4 db 13,10,'Address Size Type Previous Next',0 + bos_mem_str5 db 13,10,'-------------------------------------------------------',0 + bos_mem_str6 db '0x',0 + bos_mem_str7 db 'Free ',0 + bos_mem_str8 db 'Used ',0 + bos_mem_str9 db 'None ',0 + bos_mem_str0 db ' ',0 + bos_mem_crlf db 13,10,0 + current_mem_pos dd 0 + next_free dd 0 + + ;---------DEBUG--------- + test1_or_2 db 1 + test_address dd 0 + test_size dd 0 + test_address2 dd 0 + test_size2 dd 0 + ;---------END DEBUG--------- + + mem_test: + push eax + push ebx + push ecx + push edx + + ;---------DEBUG--------- + cmp [test1_or_2],0 + je .free_the_test_block + + mov ebx, 0x1000000 ;first test + mov [test_size2], ebx + call allocate_mem + mov [test_address2], ebx + + mov ebx, 0xE00000 ; second test + mov ecx, ebx + call allocate_mem + push ebx + push ecx + + mov ebx, 0x10000 ; third test + mov [test_size], ebx + call allocate_mem + mov [test_address], ebx ; test allocation + + pop ecx + pop ebx + call free_mem + + mov [test1_or_2], 0 + jmp .end_test + .free_the_test_block: + mov ebx, [test_address] + mov ecx, [test_size] ; and freeing + call free_mem + mov ebx, [test_address2] + mov ecx, [test_size2] ; and freeing + call free_mem + mov [test1_or_2], 1 + .end_test: + ;---------END DEBUG--------- + + mov esi, bos_mem_str1 + mov bl, 0x07 + call print + mov esi, bos_mem_str2 + mov bl, 0x07 + call print + mov esi, bos_mem_str6 + mov bl, 0x04 + call print + mov ebx, [ram_amount] + mov cl, 0x04 + call print_hex32 + + mov esi, bos_mem_str3 + mov bl, 0x07 + call print + mov esi, bos_mem_str4 + mov bl, 0x07 + call print + mov esi, bos_mem_str5 + mov bl, 0x07 + call print + + mov [current_mem_pos], 0 + mov eax, [first_free] + mov [next_free], eax + + ;-------------------------; + ; this is a used block ; + ;-------------------------; + .used: + mov eax, [current_mem_pos] + mov ebx, [next_free] + cmp eax, [ram_amount] ; .free will always let us + jae .end ; decide if we are to quit or not. + + cmp [next_free], 0 + jne .more_blocks + mov ebx, [ram_amount] ; no next block, use ram size + sub ebx, eax ; get size in ebx + mov edi, 1 + call .print_mem_info + jmp .end + + .more_blocks: + sub ebx, eax + mov edi, 1 + call .print_mem_info + + mov eax, [next_free] + cmp eax, 0 + je .end + mov ebx, [eax+8] + mov [current_mem_pos], eax + mov [next_free], ebx + + ;-------------------------; + ; this is a free block ; + ;-------------------------; + .free: + mov eax, [current_mem_pos] ; current pos. in eax + mov ebx, [eax+4] ; current size in ebx + mov ecx, [eax] ; prev pointer in ecx + mov edx, [eax+8] ; next pointer in edx + xor edi, edi + call .print_mem_info + + add eax, ebx + mov [current_mem_pos], eax + jmp .used + + .end: + pop eax + pop ebx + pop ecx + pop edx + ret + + ;-------------------------; + ; print mem block info ; + ;-------------------------; + .print_mem_info: + push eax ; current pos + push ebx ; current size + push ecx ; prev pointer + push edx ; next pointer + push edi ; 1 = used + + push ebx ; push size + mov esi, bos_mem_crlf + mov bl, 0x07 + call print + mov esi, bos_mem_str6 + mov bl, 0x04 + call print + + push ecx ; push prev + mov ebx, eax + mov cl, 0x04 + call print_hex32 + + mov esi, bos_mem_str0 + mov bl, 0x07 + call print + mov esi, bos_mem_str6 + mov bl, 0x04 + call print + + pop ecx ; pop prev + pop ebx ; pop size + push ecx ; push prev + mov cl, 0x04 + call print_hex32 + mov esi, bos_mem_str0 + mov bl, 0x07 + call print + + cmp edi, 1 + jne .print_free + pop ecx ; pop prev + + mov esi, bos_mem_str8 ; it's used + mov bl, 0x07 + call print + mov esi, bos_mem_str9 + mov bl, 0x07 + call print + mov esi, bos_mem_str9 + mov bl, 0x07 + call print + jmp .print_end + + .print_free: + mov esi, bos_mem_str7 ; it's free + mov bl, 0x07 + call print + mov esi, bos_mem_str6 + mov bl, 0x04 + call print + + pop ebx ; pop the pushed ecx + mov cl, 0x04 ; into ebx instead.. ;) + call print_hex32 + mov esi, bos_mem_str0 + mov bl, 0x07 + call print + mov esi, bos_mem_str6 + mov bl, 0x04 + call print + mov ebx, edx + mov cl, 0x04 + call print_hex32 + + .print_end: + pop edi + pop edx + pop ecx + pop ebx + pop eax + ret \ No newline at end of file diff --git a/kernel/krl_incs/debug.inc b/kernel/krl_incs/debug.inc new file mode 100755 index 0000000..4c1fe19 --- /dev/null +++ b/kernel/krl_incs/debug.inc @@ -0,0 +1,385 @@ +;----------------------------------------------------------; +; BOS kernel Christoffer Bubach, 2004-2005. ; +;----------------------------------------------------------; +; ; +; BOS mighty debugging service, dump some regs.. ; +; ; +;----------------------------------------------------------; + +;----------------; +; variables ; +;----------------; + dbg_head db 'ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»',0 + dbg_head2 db 'º BOS 0.04 - ERROR: ',0 + dbg_head3 db 'º º',0 + dbg_press db 'º Press any key to continue... º',0 + dbg_restart db 'º Press a key to restart the PC... º',0 + dbg_footer db 'ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ',0 + dbg_close_row db ' º',0 + dbg_keypress db 1 ; 0 = restart, 1 = wait for key + dbg_error db ' none. ',0 ; error msg to show, max 14 chars + + ;--------------------------------------; + ; I'll start with the common regs.. ; + ;--------------------------------------; + debug_eax db 'º EAX: 0x', 0 + debug_ebx db ' EBX: 0x', 0 + debug_ecx db 'º ECX: 0x', 0 + debug_edx db ' EDX: 0x', 0 + debug_esp db 'º ESP: 0x', 0 + debug_ebp db ' EBP: 0x', 0 + debug_esi db 'º ESI: 0x', 0 + debug_edi db ' EDI: 0x', 0 + + ;-------------------; + ; state to print ; + ;-------------------; + state_eax dd 0 + state_ebx dd 0 + state_ecx dd 0 + state_edx dd 0 + state_esp dd 0 + state_ebp dd 0 + state_esi dd 0 + state_edi dd 0 + + ;-----------------------------------; + ; "fake stack" to save regs on.. ; + ;-----------------------------------; + stack_eax dd 0 + stack_eax2 dd 0 + stack_ebx dd 0 + stack_edx dd 0 + + ;-------------------------------; + ; original cursor placment.. ; + ;-------------------------------; + state_cursor dw 0 + + ;-------------------------------------------------; + ; mostly in debug purpose, and in lack of MM.. ; + ;-------------------------------------------------; + scr_buffer: times 180 dd 0 ; 720 = box buffer size (char+attrib) + + +;--------------------------------------------; +; dump regs.. does not use the stack. ; +;--------------------------------------------; +dump_regs: + mov [state_eax], eax + mov [state_ebx], ebx + mov [state_ecx], ecx + mov [state_edx], edx + mov [state_esp], esp + mov [state_ebp], ebp + mov [state_esi], esi + mov [state_edi], edi + + call .get_cur + mov [state_cursor], bx + + mov dx, 0 ; row counter + mov esi, (0xB8000+840) + mov edi, scr_buffer + .big_loop: + mov cx, 0 ; col counter + .small_loop: + movsb ; copy creen content + inc cx ; increase counter + cmp cx, 72 ; have we copied 72 bytes? + je .end_small ; if we have, end small loop + jmp .small_loop ; if not continue with next byte + .end_small: + inc dx ; increase row count + cmp dx, 10 ; check if all ten is copied + je .end_big ; if it is, end. + add esi, 88 ; else continue with next row + jmp .big_loop + .end_big: + + mov bx, 420 ; row 5 char 20 + call .set_cur + mov ebp, dbg_head + call .print + mov bx, 500 ; row 6 char 20 + call .set_cur + mov ebp, dbg_head2 + call .print + mov ebp, dbg_error + call .print + mov ebp, dbg_close_row + call .print + mov bx, 580 ; row 7 char 20 + call .set_cur + mov ebp, dbg_head3 + call .print + + + mov bx, 660 ; row 8 char 20 + call .set_cur + mov ebp, debug_eax + call .print + mov eax, [state_eax] ; eax + call .print_hex32 + mov ebp, debug_ebx + call .print + mov eax, [state_ebx] ; ebx + call .print_hex32 + mov ebp, dbg_close_row + call .print + + mov bx, 740 ; row 9 char 20 + call .set_cur + mov ebp, debug_ecx + call .print + mov eax, [state_ecx] ; ecx + call .print_hex32 + mov ebp, debug_edx + call .print + mov eax, [state_edx] ; edx + call .print_hex32 + mov ebp, dbg_close_row + call .print + + mov bx, 820 ; row 10 char 20 + call .set_cur + mov ebp, debug_esp + call .print + mov eax, [state_esp] ; esp + call .print_hex32 + mov ebp, debug_ebp + call .print + mov eax, [state_ebp] ; ebp + call .print_hex32 + mov ebp, dbg_close_row + call .print + + mov bx, 900 ; row 11 char 20 + call .set_cur + mov ebp, debug_esi + call .print + mov eax, [state_esi] ; esi + call .print_hex32 + mov ebp, debug_edi + call .print + mov eax, [state_edi] ; edi + call .print_hex32 + mov ebp, dbg_close_row + call .print + + mov bx, 980 ; row 12 char 20 + call .set_cur + mov ebp, dbg_head3 + call .print + mov bx, 1140 ; row 14 char 20 + call .set_cur + mov ebp, dbg_footer + call .print + mov bx, 1060 ; row 13 char 20 + call .set_cur + + cmp [dbg_keypress], 1 + je .wait_key + + ;----------------------------------; + ; wait for scancode and restart ; + ;----------------------------------; + mov ebp, dbg_restart + call .print + mov bx, 1093 ; row 13 char 46 + call .set_cur + + .no_new1: + mov al, [kbd_head] + mov ah, [kbd_tail] + cmp ah, 63 + jne .check1 + cmp al, 0 + je .no_new1 + mov [kbd_tail], 0 + jmp .done_check1 + .check1: + mov bl, ah + inc bl + cmp bl, al + je .no_new1 + inc [kbd_tail] + .done_check1: + + mov esi, kbd_buffer + movzx eax, [kbd_tail] + add esi, eax + mov ah, byte [esi] ; ah = scancode + cmp ah, 0xFA ; check for some stuff.. + je .no_new1 + cmp ah, 0xE0 + je .no_new1 + cmp ah, 0xE1 + je .no_new1 + test ah, 0x80 + jnz .no_new1 + + call reboot ; in commands.inc + + ;--------------------------; + ; wait for key and quit ; + ;--------------------------; + .wait_key: + mov ebp, dbg_press + call .print + mov bx, 1091 ; row 13 char 51 + call .set_cur + + .no_new2: + mov al, [kbd_head] + mov ah, [kbd_tail] + cmp ah, 63 ; if we are at the buffer end, + jne .check2 ; we must check that head != 0 + cmp al, 0 + je .no_new2 ; we don't have new keys to read + mov [kbd_tail], 0 ; "increase" to 0 (loop buffer) + jmp .done_check2 + .check2: + mov bl, ah + inc bl ; head should be +1 compared to tail + cmp bl, al + je .no_new2 + inc [kbd_tail] ; increase + .done_check2: + mov esi, kbd_buffer + movzx eax, [kbd_tail] + add esi, eax + mov ah, byte [esi] ; ah = scancode + cmp ah, 0xFA ; check for some stuff.. + je .no_new2 + cmp ah, 0xE0 + je .no_new2 + cmp ah, 0xE1 + je .no_new2 + test ah, 0x80 + jnz .no_new2 + + mov dx, 0 ; restore screen as + mov edi, (0xB8000+840) ; it was before. + mov esi, scr_buffer ; same loops as above + .big_loop2: ; but exchanged esi and edi + mov cx, 0 + .small_loop2: + movsb + inc cx + cmp cx, 72 + je .end_small2 + jmp .small_loop2 + .end_small2: + inc dx + cmp dx, 10 + je .end_big2 + add edi, 88 + jmp .big_loop2 + .end_big2: + + mov bx, [state_cursor] + call .set_cur + mov [dbg_keypress], 1 + mov [dbg_error], ' ' ; restore variables. + mov [dbg_error+1], 'n' ; ugly.. + mov [dbg_error+2], 'o' + mov [dbg_error+3], 'n' + mov [dbg_error+4], 'e' + mov [dbg_error+5], '.' + mov [dbg_error+6], ' ' + mov [dbg_error+7], ' ' + mov [dbg_error+8], ' ' + mov [dbg_error+9], ' ' + mov [dbg_error+10], ' ' + mov [dbg_error+11], ' ' + mov [dbg_error+12], ' ' + mov [dbg_error+13], ' ' + mov [dbg_error+14], 0 + ret + + ;-------------------------------; + ; subfunctions to inc cursor ; + ;-------------------------------; + .set_cur: + mov [stack_eax2], eax + mov [stack_edx], edx ; can it get any uglier? + mov al, 0x0E + mov ah, bh + mov dx, 0x3D4 + out dx, ax + inc ax + mov ah, bl + out dx, ax + mov edx, [stack_edx] + mov eax, [stack_eax2] + ret + .get_cur: + mov [stack_eax2], eax + mov [stack_edx], edx + mov dx, 0x3D4 + mov al, 0x0E + out dx, al + inc dx + in al, dx + mov bh, al + mov al, 0x0F + dec dx + out dx, al + inc dx + in al, dx + mov bl, al + mov edx, [stack_edx] + mov eax, [stack_eax2] + ret + ;--------------------------------; + ; subfunction to print a char ; + ; bl = char, bh = attrib ; + ;--------------------------------; + .print_char: + mov [stack_eax], eax + mov [stack_ebx], ebx + call .get_cur + mov eax, ebx + mov ebx, [stack_ebx] + mov [es:(eax*2 + 0xB8000)], bx + mov ebx, eax + inc bx + call .set_cur + mov ebx, [stack_ebx] + mov eax, [stack_eax] + ret + ;------------------------------------------; + ; subfunction to print 32-bit hex value ; + ; IN: eax = value, bh = color. ; + ;------------------------------------------; + .print_hex32: + mov ecx, 8 + .print_it: + rol eax, 4 + movzx edx, al + and edx, 0x0F + or edx, 0x30 + cmp edx, 0x39 + jna .cont + add edx, 7 + .cont: + mov bl, dl + call .print_char + loop .print_it + ret + ;-----------------------------------------; + ; subfunction to display asciiz string ; + ; Input: ebp = string ; + ;-----------------------------------------; + .print: + mov al, byte [ebp] + or al, al + jz .done + mov bl, al + mov bh, 0x40 ; standard color for this... + call .print_char + inc ebp + jmp .print + .done: + ret \ No newline at end of file diff --git a/kernel/krl_incs/dma.inc b/kernel/krl_incs/dma.inc new file mode 100755 index 0000000..39f3a84 --- /dev/null +++ b/kernel/krl_incs/dma.inc @@ -0,0 +1,93 @@ +;----------------------------------------------------------; +; BOS kernel Christoffer Bubach, 2004-2005. ; +;----------------------------------------------------------; +; ; +; DMA transfer code. ; +; ; +;----------------------------------------------------------; + + +;------------------------------------------; +; Lookup table for DMA controller ports ; +;------------------------------------------; + dma_mask_reg dw 0x0A, 0x0A, 0x0A, 0x0A, 0xD4, 0xD4, 0xD4, 0xD4 + dma_mode_reg dw 0x0B, 0x0B, 0x0B, 0x0B, 0xD6, 0xD6, 0xD6, 0xD6 + dma_clear_reg dw 0x0C, 0x0C, 0x0C, 0x0C, 0xD8, 0xD8, 0xD8, 0xD8 + dma_page_port dw 0x87, 0x83, 0x81, 0x82, 0x8F, 0x8B, 0x89, 0x8A + dma_addr_port dw 0x00, 0x02, 0x04, 0x06, 0xC0, 0xC4, 0xC8, 0xCC + dma_count_port dw 0x01, 0x03, 0x05, 0x07, 0xC2, 0xC6, 0xCA, 0xCE + + +;-----------------------------------; +; dma transfer ; +; ; +; in: ecx = page:offset ; +; bl = channel ; +; bh = 1=read, 0=write ; +; esi = count ; +; ; +; out: nothing. ; +;-----------------------------------; +dma_transfer: + push eax + push edx + push esi + cli + or bh, bh + jz .dont_read + + mov bh, bl + add bh, 0x48 + jmp .read + .dont_read: + mov bh, bl + add bh, 0x44 + .read: + dec esi + + movzx eax, bl + mov dx, word [(eax*2)+dma_mask_reg] + mov al, bl + or al, 0x04 + out dx, al ; disable the channel + + movzx eax, bl + mov dx, word [(eax*2)+dma_clear_reg] + mov al, 0 + out dx, al ; initialize flip-flop + + movzx eax, bl + mov dx, word [(eax*2)+dma_mode_reg] + mov al, bh + out dx, al ; set DMA mode + + movzx eax, bl + mov dx, word [(eax*2)+dma_addr_port] + mov al, cl + out dx, al ; write low offset part + mov al, ch + out dx, al ; and high offset part + + movzx eax, bl + mov dx, word [(eax*2)+dma_page_port] + mov eax, ecx + shr eax, 16 + out dx, al ; write page. + + movzx eax, bl + mov dx, word [(eax*2)+dma_count_port] + mov eax, esi + out dx, al ; low count + mov al, ah + out dx, al ; high count + + movzx eax, bl + mov dx, word [(eax*2)+dma_mask_reg] + mov al, bl + out dx, al ; enable channel + + sti + pop esi + pop edx + pop eax + ret \ No newline at end of file diff --git a/kernel/krl_incs/en_mess.inc b/kernel/krl_incs/en_mess.inc new file mode 100755 index 0000000..d088c49 --- /dev/null +++ b/kernel/krl_incs/en_mess.inc @@ -0,0 +1,29 @@ +;----------------------------------------------------------; +; BOS 0.04 Christoffer Bubach, 2004-2005. ; +;----------------------------------------------------------; +; ; +; English strings used in BOS. ; +; I should collect them all here, just too lazy... ; +;----------------------------------------------------------; + + +;---------------; +; strings ; +;---------------; + + pmode_load db 'Setting up protected mode...', 0 + pmode_load_ok db '[ 32-bits OK ]', 0 + + kernel_load db 'Loading kernel...', 0 + kernel_load_ok db '[ OK ]', 0 + + pic_irq db 'Fixing PIC and IRQs...', 0 + pic_irq_ok db '[ Done ]', 0 + + idt_mess db 'Setting up IDT...', 0 + idt_ok db '[ IDT OK ]', 0 + + kbd_load db 'Enables IRQ1...', 0 + kbd_ok db '[ Keyboard OK ]', 0 + + bos_shell db 'BOS shell. Type "help" for more info.', 13, 10, 0 diff --git a/kernel/krl_incs/fdc.inc b/kernel/krl_incs/fdc.inc new file mode 100755 index 0000000..d90218d --- /dev/null +++ b/kernel/krl_incs/fdc.inc @@ -0,0 +1,501 @@ +;----------------------------------------------------------; +; BOS kernel Christoffer Bubach, 2004-2005. ; +;----------------------------------------------------------; +; ; +; floppy disk driver originally by Craig Bamford, Dex4u. ; +; adjustments and for BOS by bubach. ; +; ; +;----------------------------------------------------------; + +; NOTE: I'm almost finished with a much improved version of +; this code, that supports 2 drives of multiple types. +; I'll wait with that until next version, so you won't +; have to see a half finished mess here. + +;---------------------------; +; variables and contants ; +;---------------------------; + fdd_int_done dw 0 ; is the IRQ done? + fdd_motor_on db 0 ; fdd motor on=1, off=0 + fdd_head db 0 + fdd_driveno db 0 + fdd_track db 0 + fdd_sector db 0 + + fdd_errorcode db 0 ; this the error code 00 = no error + fdd_tries db 0 ; no. of times to try, before error. + + ResultST0 db 0 + ResultST1 db 0 ; or pcn + ResultST2 db 0 + ResultST3 db 0 + ResultC db 0 + ResultH db 0 + ResultR db 0 + ResultN db 0 + ResultExtra db 0 + + + +;------------------------------------------------------; +; initializes the floppy disk driver ; +; ; +;------------------------------------------------------; +fdc_init: + push ecx + push edi + + mov cl, 0x26 ; hook interrupt 0x26 (IRQ6) + mov edi, floppy_irq + call set_int + + mov cl, 6 ; enable IRQ6 + call enable_irq + + call fdd_reset ; reset FDC + call fdd_recalibrate + + pop edi + pop ecx + ret + + + +;------------------------------------------------------; +; floppy IRQ ; +; ; +;------------------------------------------------------; +floppy_irq: + pusha + push gs + push fs + push ds + push es + push esi + + or [fdd_int_done], 1 + mov al, 0x20 + out 0x20, al + + pop esi + pop es + pop ds + pop fs + pop gs + popa + iret + + + +;------------------------------------------------------; +; wait for a floppy int ; +; out: cf = 1 if timeout ; +;------------------------------------------------------; +wait_int: + push eax + push ecx + + mov ecx, 150 ; 150 = 1.5 seconds. + call active_delay ; timer.inc + .l1: + cmp dword [ecx], 0 ; timeup? + je .error + mov ax, [fdd_int_done] ; if not we check for int. + or ax, ax + jz .l1 + pop ecx + pop eax + clc + ret + .error: + pop ecx + pop eax + stc + ret + + + +;------------------------------------------------------; +; fdd motor off ; +; out: nothing ; +;------------------------------------------------------; +fdd_off: + push eax + push edx + + mov dx, 0x3F2 + mov al, 0 ; all motors off.. + out dx, al + mov [fdd_motor_on], 0 + + pop edx + pop eax + ret + + + + +;------------------------------------------------------; +; fdd motor on ; +; out: nothing ; +;------------------------------------------------------; +fdd_on: + push eax + push edx + + mov dx, 0x3F2 ; motor 0 on.. + mov al, 0x1C + out dx, al + + mov ecx, 20 ; 1/5 of a sec. to speed up + call delay ; in timer.inc + mov [fdd_motor_on], 1 + + pop edx + pop eax + ret + + + +;------------------------------------------------------; +; send a data byte to the FDC ; +; ; +; in: al = data byte ; +;------------------------------------------------------; +fdc_sendbyte: + push edx + push ecx + push eax + + mov ecx, 150 ; 150 = 1.5 seconds. + call active_delay ; timer.inc + .l1: + cmp dword [ecx], 0 ; timeup? + je .error + mov dx, 0x3f4 ; check status reg + in al, dx + and al, 11000000b + cmp al, 10000000b ; are we ok to write + jnz .l1 + + pop eax + pop ecx + mov dx, 0x3F5 ; send byte + out dx, al + pop edx + clc + ret + .error: + pop eax + pop ecx + pop edx + stc + ret + + +;------------------------------------------------------; +; read a data byte from the FDC ; +; ; +; out: al = data byte ; +;------------------------------------------------------; +fdc_getbyte: + push edx + push ecx + push eax + + mov ecx, 150 ; 150 = 1.5 seconds. + call active_delay ; timer.inc + .l1: + cmp dword [ecx], 0 ; timeup? + je .error + mov dx, 0x3f4 ; check status reg + in al, dx + and al, 11000000b + cmp al, 11000000b ; are we ok to read + jnz .l1 + + pop eax + pop ecx + mov dx, 0x3F5 ; get the byte + in al, dx + pop edx + clc + ret + .error: + pop eax + pop ecx + pop edx + stc + ret + + + + +;------------------------------------------------------; +; reset controller ; +; ; +;------------------------------------------------------; +fdd_reset: + push eax + push ecx + push edx + + mov dx, 0x3F2 + mov al, 00001000b ; no motors enabled, DMA Enabled, held FDC at reset + out dx, al ; drive A selected. + + mov ecx, 5 + call delay ; in timer.inc + + mov dx, 0x3F7 + mov al, 00000000b ; 500Kb/sec mode + out dx, al + + mov dx, 0x3F2 + or al, 00001100b ; FDC completed reset, al =0x0c. + out dx, al + + mov [fdd_int_done], 0 ; we need to wait + call wait_int ; for floppy int. + jc .error ; jump to error exit, if timeout. + + mov cx, 0x04 ; after a reset, the interrupts must be + .status: ; cleared by (four) dummy-reads. + mov al, 0x08 ; sense interrupt status command + call fdc_sendbyte + call fdc_getbyte + call fdc_getbyte + loop .status + + mov al, 0x03 ; specify command (includes next two bytes sent) + call fdc_sendbyte + mov al, 0xDF ; SRT = 3ms, HUT = 240ms + call fdc_sendbyte + mov al, 0x02 ; HLT = 16ms, ND = 0 + call fdc_sendbyte + .ok: + pop edx + pop ecx + pop eax + clc + ret + .error: + pop edx + pop ecx + pop eax + stc + ret + + + + +;------------------------------------------------------; +; fdd seek ; +; ; +;------------------------------------------------------; +fdd_seek: + push eax + + mov al, [ResultC] ; put what track/cylinder we are at in al + cmp [fdd_track], al ; is it the same as we want + je .ok ; yes, then leave. + + mov al, 0x0F ; seek command + call fdc_sendbyte + mov al, [fdd_driveno] ; drive # (00 = A) + call fdc_sendbyte + mov al, [fdd_track] ; cylinder # + call fdc_sendbyte + + mov [fdd_int_done], 0 + call wait_int + jc .error + + mov al, 0x08 ; sense interrupt status command + call fdc_sendbyte + call fdc_getbyte + mov ah, al ; save ST0 in ah + call fdc_getbyte ; should read PCN + + test ah, 00100000b ; test sr0 is 0x20 + jz .error ; if not we have a error :-(. + test ah,10000000b ; test sr0 is 0x80 + jnz .error ; if not we have a error :-(. + .ok: ; succsess.. :-) + pop eax + clc + ret + .error: + pop eax + stc + ret + + +;------------------------------------------------------; +; fdd recalibrate ; +; ; +;------------------------------------------------------; +fdd_recalibrate: + push eax + + test [fdd_motor_on], 1 + jnz .l1 + call fdd_on + .l1: + mov al, 0x07 ; recalibrate command + call fdc_sendbyte + mov al, 0x00 ; selects drive a: + call fdc_sendbyte + + mov [fdd_int_done], 0 + call wait_int + jc .error + + mov al, 0x08 ; sense interrupt status command + call fdc_sendbyte + call fdc_getbyte ; read STO + mov ah, al ; save ST0 in ah + call fdc_getbyte + + test ah, 00100000b ; test sr0 is 0x20 + jz .error + test ah, 00010000b ; test sr0 is 0x80 + jnz .error + .ok: + mov [ResultC], 0 + pop eax + clc + ret + .error: + pop eax + stc + ret + + + +;------------------------------------------------------; +; fdd read/write ; +; input: bl = 0 read, 1 write ; +; ch = track/cylinder ; +; cl = sector ; +; dh = head ; +; dl = drive (only A: drive used, 00 ) ; +; output: ah = status ; +; al = sector number read ; +; cf = 0 if ok, 1 if error ; +;------------------------------------------------------; +fdd_read_write: + pushad + and dh, 00000001b ; is it set to fdd_head 0 or 1? + mov [fdd_head], dh ; store it. + shl dh, 2 ; make the first 2 bits = 00 for A:. + mov [fdd_driveno], dh ; store it. + + mov [fdd_errorcode], 0x04 ; put error code in ah, just incase + cmp ch, 0x51 ; cmp if track number, is above 80 decimal (51 hex)? + jae .error ; if above jump error. + mov [fdd_track], ch ; if not above,store it. + + cmp cl, 0x13 ; cmp if fdd_sector number, is above 18 decimal (12 hex) ?. + jae .error ; if above jump error. + mov [fdd_sector], cl ; if not above,store it. + + test [fdd_motor_on], 1 + jnz .l1 + call fdd_on + .l1: + mov dx, 0x3F7 + mov al, 00000000b ; 500Kb/sec mode + out dx, al + mov [fdd_errorcode], 0x80 ; put basic error code, just in case. + + xor ecx, ecx + mov cx, 3 ; we want to try seek 3 times + .l2: + call fdd_seek ; we need to move to the right track. + jnc .l3 ; we should be on the right track. + loop .l2 + jmp .error ; timeout. + .l3: + mov dx, 0x3f4 ; check status reg (to see if DMA bit set) + in al, dx + test al, 00100000b ; test sr0 is 0x80 + jnz .error + + cmp bl, 0 + je .read_fdd + + .write_fdd: + mov bl, 2 ; channel 2 + mov esi, 512 ; bytes to write + mov ecx, 0x80000 ; page & offset + mov bh, 1 ; write floppy, "read DMA" + call dma_transfer + + mov al, 0xC5 ; write fdd_sector command + call fdc_sendbyte + jmp .cont + + .read_fdd: + mov bl, 2 ; channel 2 + mov esi, 512 ; bytes to read + mov ecx, 0x80000 ; page & offset + mov bh, 0 ; read floppy, "write DMA" + call dma_transfer + + mov al, 0xE6 ; read fdd_sector command + call fdc_sendbyte + + .cont: + mov al, [fdd_driveno] ; fdd_head no. 0, drive A: + call fdc_sendbyte + mov al, [fdd_track] ; cylinder + call fdc_sendbyte + + mov al, [fdd_head] ; head/side 0 or 1 + call fdc_sendbyte + mov al, [fdd_sector] ; sector number,starts at 1 + call fdc_sendbyte + mov al, 0x02 ; sector size - 512 bytes + call fdc_sendbyte + + mov al, 0x12 ; 18 decimal sectors to a track + call fdc_sendbyte + mov al, 0x1B ; 27 should be the gap length for a 3.5" 1.44Mb + call fdc_sendbyte + mov al, 0xFF ; not used data length, because sector size has been filled + call fdc_sendbyte + + mov [fdd_int_done], 0 + call wait_int + jc .error + + call fdc_getbyte + mov [ResultST0], al ; save result of ST0 in var + call fdc_getbyte + mov [ResultST1], al ; save result of ST1 in var + call fdc_getbyte + mov [ResultST2], al ; save result of ST2 in var + call fdc_getbyte + mov [ResultC], al ; save result of cylinder + call fdc_getbyte + mov [ResultH], al ; save result of head + call fdc_getbyte + mov [ResultR], al ; save result of sector number. + call fdc_getbyte + mov [ResultN], al ; save result of sector size + + test [ResultST0], 11000000b ; test sr0 is 0xC0 + jnz .error + mov [fdd_errorcode], 0x00 + .ok: + popad + mov ah, [fdd_errorcode] ; move error status into ah + mov al, [ResultR] + clc + ret + .error: + popad + mov ah, [fdd_errorcode] ; move error status into ah + stc + ret \ No newline at end of file diff --git a/kernel/krl_incs/idt.inc b/kernel/krl_incs/idt.inc new file mode 100755 index 0000000..a899cbc --- /dev/null +++ b/kernel/krl_incs/idt.inc @@ -0,0 +1,147 @@ +;----------------------------------------------------------; +; BOS kernel Christoffer Bubach, 2003-2005. ; +;----------------------------------------------------------; +; ; +; set/modify IDT entries ; +; ; +;----------------------------------------------------------; + + + +;--------------------------------------------------; +; set up IDT ; +; in: edi = pointer to "unhandled int"-function. ; +;--------------------------------------------------; +init_idt: + push eax + push ecx + + mov ecx, 0 + .loop: ; loop + mov eax, edi ; and + mov [(0x6c00+ecx)], ax ; set whole IDT + add ecx, 2 ; to one ISR + + mov dword [(0x6c00+ecx)], 0x8E000008 ; 0x6c00 is where + add ecx, 4 ; we put the IDT + + mov eax, edi + shr eax, 16 + mov [(0x6c00+ecx)], ax + add ecx, 2 + + cmp ecx, 0x800 ; 256 ints + jb .loop ; * 8 bytes each + + pop ecx + pop eax + ret + + + +;--------------------------------------; +; modify IDT, set any int ; +; in: cl = int number ; +; edi = int function pointer ; +;--------------------------------------; +set_int: + push eax + push ecx + + mov al, 8 ; 8 bytes for each int + mul cl ; cl * al = ax + movzx ecx, ax ; ecx = offset in IDT (1/2 for dword list) + mov [(idt_list+ecx/2)], edi ; add new int to idt entry list + + mov eax, edi + mov [(0x6c00+ecx)], ax + add ecx, 2 + + mov dword [(0x6c00+ecx)], 0x8E000008 + add ecx, 4 + + mov eax, edi + shr eax, 16 + mov [(0x6c00+ecx)], ax + + pop ecx + pop eax + ret + + + +;------------------------------------------------; +; get int address ; +; in: cl = int number ; +; out: esi = address or 0 if none present ; +;------------------------------------------------; +get_int: + push eax + + mov eax, 4 ; 4 bytes for each address + mul cl ; cl * al = ax + mov esi, idt_list + add esi, eax + + pop eax + ret + + + + +;----------------------------------------; +; sets ints from list ; +; in: esi = pointer to int list ; +;----------------------------------------; +set_idt_list: + push eax + push edi + + mov ecx, 0 + .loop: + lodsd + or eax, eax + jz .next + mov edi, eax + call set_int + .next: + inc ecx + cmp ecx, 0x100 + jb .loop + + pop edi + pop eax + ret + + + +;------------------------------; +; list of idt entries. ; +; 0 = not handled ; +;------------------------------; +idt_list: dd isr00 + dd isr01 + dd isr02 + dd isr03 + dd isr04 + dd isr05 + dd isr06 + dd isr07 + dd isr08 + dd isr09 + dd isr0A + dd isr0B + dd isr0C + dd isr0D + dd isr0E + dd 0 + dd isr10 + dd isr11 + dd isr12 + dd isr13 + times 12 dd 0 ; 12 unused ints + dd isr20 + dd isr21 + times 16 dd 0 ; 16 unused ints + dd isr32 ; First free and BOS system interrupt. + times 205 dd 0 ; 205 unused ints \ No newline at end of file diff --git a/kernel/krl_incs/isr.inc b/kernel/krl_incs/isr.inc new file mode 100755 index 0000000..f45357d --- /dev/null +++ b/kernel/krl_incs/isr.inc @@ -0,0 +1,529 @@ +;----------------------------------------------------------; +; BOS 0.04 Christoffer Bubach, 2004. ; +;----------------------------------------------------------; +; ; +; ISR (Interrupt Service Rutines). ; +; ; +;----------------------------------------------------------; + + + +;------------------------; +; Unhandled Interrupt ; +;------------------------; +u_isr: + mov [dbg_keypress], 0 ; in debug.inc + mov [dbg_error], 'U' + mov [dbg_error+1], 'n' + mov [dbg_error+2], 'h' + mov [dbg_error+3], 'a' + mov [dbg_error+4], 'n' + mov [dbg_error+5], 'd' + mov [dbg_error+6], 'l' + mov [dbg_error+7], 'e' + mov [dbg_error+8], 'd' + mov [dbg_error+9], ' ' + mov [dbg_error+10], 'I' + mov [dbg_error+11], 'n' + mov [dbg_error+12], 't' + mov [dbg_error+13], ' ' + mov [dbg_error+14], 0 + call dump_regs + + +;-------------------------------; +; Exception Interrupt no. 00 ; +;-------------------------------; +isr00: + mov [dbg_keypress], 0 + mov [dbg_error], 'D' + mov [dbg_error+1], 'i' + mov [dbg_error+2], 'v' + mov [dbg_error+3], 'i' + mov [dbg_error+4], 'd' + mov [dbg_error+5], 'e' + mov [dbg_error+6], ' ' + mov [dbg_error+7], 'e' + mov [dbg_error+8], 'r' + mov [dbg_error+9], 'r' + mov [dbg_error+10], 'o' + mov [dbg_error+11], 'r' + mov [dbg_error+12], ' ' + mov [dbg_error+13], ' ' + mov [dbg_error+14], 0 + call dump_regs + + +;-------------------------------; +; Exception Interrupt no. 01 ; +;-------------------------------; +isr01: + mov [dbg_keypress], 0 + mov [dbg_error], 'D' + mov [dbg_error+1], 'e' + mov [dbg_error+2], 'b' + mov [dbg_error+3], 'u' + mov [dbg_error+4], 'g' + mov [dbg_error+5], ' ' + mov [dbg_error+6], 'f' + mov [dbg_error+7], 'a' + mov [dbg_error+8], 'u' + mov [dbg_error+9], 'l' + mov [dbg_error+10], 't' + mov [dbg_error+11], ' ' + mov [dbg_error+12], ' ' + mov [dbg_error+13], ' ' + mov [dbg_error+14], 0 + call dump_regs + + +;-------------------------------; +; Exception Interrupt no. 02 ; +;-------------------------------; +isr02: + mov [dbg_keypress], 0 + mov [dbg_error], 'N' + mov [dbg_error+1], 'M' + mov [dbg_error+2], 'I' + mov [dbg_error+3], ' ' + mov [dbg_error+4], 'i' + mov [dbg_error+5], 'n' + mov [dbg_error+6], 't' + mov [dbg_error+7], 'e' + mov [dbg_error+8], 'r' + mov [dbg_error+9], 'r' + mov [dbg_error+10], 'u' + mov [dbg_error+11], 'p' + mov [dbg_error+12], 't' + mov [dbg_error+13], ' ' + mov [dbg_error+14], 0 + call dump_regs + + +;-------------------------------; +; Exception Interrupt no. 03 ; +;-------------------------------; +isr03: + mov [dbg_keypress], 0 + mov [dbg_error], 'B' + mov [dbg_error+1], 'r' + mov [dbg_error+2], 'e' + mov [dbg_error+3], 'a' + mov [dbg_error+4], 'k' + mov [dbg_error+5], 'p' + mov [dbg_error+6], 'o' + mov [dbg_error+7], 'i' + mov [dbg_error+8], 'n' + mov [dbg_error+9], 't' + mov [dbg_error+10], ' ' + mov [dbg_error+11], ' ' + mov [dbg_error+12], ' ' + mov [dbg_error+13], ' ' + mov [dbg_error+14], 0 + call dump_regs + + +;-------------------------------; +; Exception Interrupt no. 04 ; +;-------------------------------; +isr04: + mov [dbg_keypress], 0 + mov [dbg_error], 'O' + mov [dbg_error+1], 'v' + mov [dbg_error+2], 'e' + mov [dbg_error+3], 'r' + mov [dbg_error+4], 'f' + mov [dbg_error+5], 'l' + mov [dbg_error+6], 'o' + mov [dbg_error+7], 'w' + mov [dbg_error+8], ' ' + mov [dbg_error+9], 'f' + mov [dbg_error+10], 'a' + mov [dbg_error+11], 'u' + mov [dbg_error+12], 'l' + mov [dbg_error+13], 't' + mov [dbg_error+14], 0 + call dump_regs + + +;-------------------------------; +; Exception Interrupt no. 05 ; +;-------------------------------; +isr05: + mov [dbg_keypress], 0 + mov [dbg_error], 'B' + mov [dbg_error+1], 'o' + mov [dbg_error+2], 'u' + mov [dbg_error+3], 'n' + mov [dbg_error+4], 'd' + mov [dbg_error+5], 's' + mov [dbg_error+6], ' ' + mov [dbg_error+7], 'c' + mov [dbg_error+8], 'h' + mov [dbg_error+9], 'e' + mov [dbg_error+10], 'c' + mov [dbg_error+11], 'k' + mov [dbg_error+12], ' ' + mov [dbg_error+13], ' ' + mov [dbg_error+14], 0 + call dump_regs + + +;-------------------------------; +; Exception Interrupt no. 06 ; +;-------------------------------; +isr06: + mov [dbg_keypress], 0 + mov [dbg_error], 'I' + mov [dbg_error+1], 'n' + mov [dbg_error+2], 'v' + mov [dbg_error+3], 'a' + mov [dbg_error+4], 'l' + mov [dbg_error+5], 'i' + mov [dbg_error+6], 'd' + mov [dbg_error+7], ' ' + mov [dbg_error+8], 'o' + mov [dbg_error+9], 'p' + mov [dbg_error+10], 'c' + mov [dbg_error+11], 'o' + mov [dbg_error+12], 'd' + mov [dbg_error+13], 'e' + mov [dbg_error+14], 0 + call dump_regs + + +;-------------------------------; +; Exception Interrupt no. 07 ; +;-------------------------------; +isr07: + mov [dbg_keypress], 0 + mov [dbg_error], 'N' + mov [dbg_error+1], 'o' + mov [dbg_error+2], ' ' + mov [dbg_error+3], 'c' + mov [dbg_error+4], 'o' + mov [dbg_error+5], 'p' + mov [dbg_error+6], '.' + mov [dbg_error+7], ' ' + mov [dbg_error+8], 'a' + mov [dbg_error+9], 'v' + mov [dbg_error+10], 'a' + mov [dbg_error+11], 'i' + mov [dbg_error+12], 'l' + mov [dbg_error+13], '.' + mov [dbg_error+14], 0 + call dump_regs + + +;-------------------------------; +; Exception Interrupt no. 08 ; +;-------------------------------; +isr08: + mov [dbg_keypress], 0 + mov [dbg_error], 'D' + mov [dbg_error+1], 'o' + mov [dbg_error+2], 'u' + mov [dbg_error+3], 'b' + mov [dbg_error+4], 'l' + mov [dbg_error+5], 'e' + mov [dbg_error+6], ' ' + mov [dbg_error+7], 'f' + mov [dbg_error+8], 'a' + mov [dbg_error+9], 'u' + mov [dbg_error+10], 'l' + mov [dbg_error+11], 't' + mov [dbg_error+12], ' ' + mov [dbg_error+13], ' ' + mov [dbg_error+14], 0 + call dump_regs + + +;-------------------------------; +; Exception Interrupt no. 09 ; +;-------------------------------; +isr09: + mov [dbg_keypress], 0 + mov [dbg_error], 'C' + mov [dbg_error+1], 'o' + mov [dbg_error+2], 'p' + mov [dbg_error+3], 'r' + mov [dbg_error+4], 'o' + mov [dbg_error+5], '.' + mov [dbg_error+6], ' ' + mov [dbg_error+7], 's' + mov [dbg_error+8], 'e' + mov [dbg_error+9], 'g' + mov [dbg_error+10], 'm' + mov [dbg_error+11], 'e' + mov [dbg_error+12], 'n' + mov [dbg_error+13], 't' + mov [dbg_error+14], 0 + call dump_regs + + +;-------------------------------; +; Exception Interrupt no. 10 ; +;-------------------------------; +isr0A: + mov [dbg_keypress], 0 + mov [dbg_error], 'I' + mov [dbg_error+1], 'n' + mov [dbg_error+2], 'v' + mov [dbg_error+3], 'a' + mov [dbg_error+4], 'l' + mov [dbg_error+5], 'i' + mov [dbg_error+6], 'd' + mov [dbg_error+7], ' ' + mov [dbg_error+8], 'T' + mov [dbg_error+9], 'S' + mov [dbg_error+10], 'S' + mov [dbg_error+11], '!' + mov [dbg_error+12], ' ' + mov [dbg_error+13], ' ' + mov [dbg_error+14], 0 + call dump_regs + + +;-------------------------------; +; Exception Interrupt no. 11 ; +;-------------------------------; +isr0B: + mov [dbg_keypress], 0 + mov [dbg_error], 'N' + mov [dbg_error+1], 'o' + mov [dbg_error+2], ' ' + mov [dbg_error+3], 's' + mov [dbg_error+4], 'e' + mov [dbg_error+5], 'g' + mov [dbg_error+6], 'm' + mov [dbg_error+7], 'e' + mov [dbg_error+8], 'n' + mov [dbg_error+9], 't' + mov [dbg_error+10], '!' + mov [dbg_error+11], ' ' + mov [dbg_error+12], ' ' + mov [dbg_error+13], ' ' + mov [dbg_error+14], 0 + call dump_regs + + +;-------------------------------; +; Exception Interrupt no. 12 ; +;-------------------------------; +isr0C: + mov [dbg_keypress], 0 + mov [dbg_error], 'S' + mov [dbg_error+1], 't' + mov [dbg_error+2], 'a' + mov [dbg_error+3], 'c' + mov [dbg_error+4], 'k' + mov [dbg_error+5], ' ' + mov [dbg_error+6], 'f' + mov [dbg_error+7], 'a' + mov [dbg_error+8], 'u' + mov [dbg_error+9], 'l' + mov [dbg_error+10], 't' + mov [dbg_error+11], '!' + mov [dbg_error+12], ' ' + mov [dbg_error+13], ' ' + mov [dbg_error+14], 0 + call dump_regs + + +;-------------------------------; +; Exception Interrupt no. 13 ; +;-------------------------------; +isr0D: + mov [dbg_keypress], 0 + mov [dbg_error], 'T' + mov [dbg_error+1], 'r' + mov [dbg_error+2], 'i' + mov [dbg_error+3], 'p' + mov [dbg_error+4], 'l' + mov [dbg_error+5], 'e' + mov [dbg_error+6], ' ' + mov [dbg_error+7], 'f' + mov [dbg_error+8], 'a' + mov [dbg_error+9], 'u' + mov [dbg_error+10], 'l' + mov [dbg_error+11], 't' + mov [dbg_error+12], '!' + mov [dbg_error+13], ' ' + mov [dbg_error+14], 0 + call dump_regs + + +;-------------------------------; +; Exception Interrupt no. 14 ; +;-------------------------------; +isr0E: + mov [dbg_keypress], 0 + mov [dbg_error], 'P' + mov [dbg_error+1], 'a' + mov [dbg_error+2], 'g' + mov [dbg_error+3], 'e' + mov [dbg_error+4], ' ' + mov [dbg_error+5], 'f' + mov [dbg_error+6], 'a' + mov [dbg_error+7], 'u' + mov [dbg_error+8], 'l' + mov [dbg_error+9], 't' + mov [dbg_error+10], '!' + mov [dbg_error+11], ' ' + mov [dbg_error+12], ' ' + mov [dbg_error+13], ' ' + mov [dbg_error+14], 0 + call dump_regs + + +;-------------------------------; +; Exception Interrupt no. 16 ; +;-------------------------------; +isr10: + mov [dbg_keypress], 0 + mov [dbg_error], 'C' + mov [dbg_error+1], 'o' + mov [dbg_error+2], 'p' + mov [dbg_error+3], 'r' + mov [dbg_error+4], 'o' + mov [dbg_error+5], 'c' + mov [dbg_error+6], 'e' + mov [dbg_error+7], 's' + mov [dbg_error+8], 's' + mov [dbg_error+9], 'o' + mov [dbg_error+10], 'r' + mov [dbg_error+11], '!' + mov [dbg_error+12], ' ' + mov [dbg_error+13], ' ' + mov [dbg_error+14], 0 + call dump_regs + + +;-------------------------------; +; Exception Interrupt no. 17 ; +;-------------------------------; +isr11: + mov [dbg_keypress], 0 + mov [dbg_error], 'A' + mov [dbg_error+1], 'l' + mov [dbg_error+2], 'i' + mov [dbg_error+3], 'g' + mov [dbg_error+4], 'n' + mov [dbg_error+5], 'm' + mov [dbg_error+6], 'e' + mov [dbg_error+7], 'n' + mov [dbg_error+8], 't' + mov [dbg_error+9], ' ' + mov [dbg_error+10], 'c' + mov [dbg_error+11], 'h' + mov [dbg_error+12], 'k' + mov [dbg_error+13], '.' + mov [dbg_error+14], 0 + call dump_regs + + +;-------------------------------; +; Exception Interrupt no. 18 ; +;-------------------------------; +isr12: + mov [dbg_keypress], 0 + mov [dbg_error], 'M' + mov [dbg_error+1], 'a' + mov [dbg_error+2], 'c' + mov [dbg_error+3], 'h' + mov [dbg_error+4], 'i' + mov [dbg_error+5], 'n' + mov [dbg_error+6], 'e' + mov [dbg_error+7], ' ' + mov [dbg_error+8], 'c' + mov [dbg_error+9], 'h' + mov [dbg_error+10], 'e' + mov [dbg_error+11], 'c' + mov [dbg_error+12], 'k' + mov [dbg_error+13], '!' + mov [dbg_error+14], 0 + call dump_regs + + +;-------------------------------; +; Exception Interrupt no. 19 ; +;-------------------------------; +isr13: + mov [dbg_keypress], 0 + mov [dbg_error], 'S' + mov [dbg_error+1], 'I' + mov [dbg_error+2], 'M' + mov [dbg_error+3], 'D' + mov [dbg_error+4], ' ' + mov [dbg_error+5], 'f' + mov [dbg_error+6], 'l' + mov [dbg_error+7], 'o' + mov [dbg_error+8], 'a' + mov [dbg_error+9], 't' + mov [dbg_error+10], '.' + mov [dbg_error+11], '-' + mov [dbg_error+12], 'p' + mov [dbg_error+13], '.' + mov [dbg_error+14], 0 + call dump_regs + + + +;--------------------------; +; ISR 20. The timer. ; +;--------------------------; +isr20: + pusha + push gs + push fs + push ds + push es + + call timer ; in timer.inc + + pop es + pop ds + pop fs + pop gs + popa + iret + + +;--------------------------; +; Keyboard IRQ. ISR 21. ; +;--------------------------; +isr21: + pusha + push gs + push fs + push ds + push es + push esi + + call keyboard_isr ; Located in keyboard.inc + + pop esi + pop es + pop ds + pop fs + pop gs + popa + iret + + +;---------------------; +; Interrupt no. 50 ; +;---------------------; +isr32: + push gs + push fs + push ds + push es + + call interrupt_32 ; Located in sys_ints.inc + + pop es + pop ds + pop fs + pop gs + iret \ No newline at end of file diff --git a/kernel/krl_incs/keyboard.inc b/kernel/krl_incs/keyboard.inc new file mode 100755 index 0000000..282bbe2 --- /dev/null +++ b/kernel/krl_incs/keyboard.inc @@ -0,0 +1,380 @@ +;----------------------------------------------------------; +; BOS 0.04 Christoffer Bubach, 2004-2005. ; +;----------------------------------------------------------; +; ; +; Keyboard functions. IRQ, INT's and more. ; +; ; +;----------------------------------------------------------; + + +;--------------; +; Variabels ; +;--------------; + + ;--------------------------------------------------------------------------------; + ; _______________________ Keyboard buffer system ; + ; | | | | | | | | | | | | ; + ; +---------------------+ ; + ; | +----------> kbd_head, here is where we put new scan-codes. ; + ; +--------------------> kbd_tail, where we last read a key. this means ; + ; that we have 4 new scan-codes to read before we catch up. ; + ;--------------------------------------------------------------------------------; + kbd_buffer db ' A 64-byte ' + db ' keyboard buffer ' + kbd_head db 1 ; head must be +1 from tail + kbd_tail db 0 + + ;-------------------------------------------------------------------------; + ; _________________ Flag byte: ; + ; |1|1|0|0|0|1|1|1| ; + ; +---------------+ 1 = True 0 = False ; + ; | | | | | | | +---> shift key ; + ; | | | | | | +-----> ctrl key ; + ; | | | | | +-------> alt key ; + ; | | | | +---------> reserved bit ; + ; | | | +-----------> reserved bit ; + ; | | +-------------> reserved bit ; + ; | +---------------> ctrl + alt + del ; + ; +-----------------> key released ; + ;-------------------------------------------------------------------------; + kbd_flags db 0 ; flag byte + + ;-------------------------------------------------------------------------; + ; _________________ LED status byte: ; + ; |0|0|0|0|0|1|1|1| ; + ; +---------------+ 1 = True 0 = False ; + ; | | +---> scroll lock ; + ; | +-----> num lock ; + ; +-------> caps lock ; + ;-------------------------------------------------------------------------; + kbd_status db 0 ; LED statusbyte + + +;----------------------; +; Keyboard IRQ ; +;----------------------; +keyboard_isr: + push eax + + ;-------------------------; + ; get the scancode ; + ;-------------------------; + xor eax, eax + in al, 0x60 + + ;------------------------------; + ; check if key was released ; + ;------------------------------; + test al, 0x80 + jz .key_down + and byte [kbd_flags], 01111111b ; key up.. + + cmp al, 42+128 ; left shift up? + je .shift_up + cmp al, 54+128 ; right shift up? + je .shift_up + + cmp al, 29+128 ; ctrl up? + je .ctrl_up + + cmp al, 83+128 ; del up? + je .del_up + + cmp al, 56+128 ; alt up? + je .alt_up + jmp .end + + ;--------------------; + ; it was released ; + ;--------------------; + .shift_up: + and byte [kbd_flags], 11111110b + jmp .end + + .del_up: + jmp .CAD_off + + .ctrl_up: + and byte [kbd_flags], 11111101b ; ctrl off. + jmp .CAD_off + + .alt_up: + and byte [kbd_flags], 11111011b ; alt off. + jmp .CAD_off + + .CAD_off: + test byte [kbd_flags], 01000000b + jz .CAD_is_off + and byte [kbd_flags], 10111111b ; ctrl+alt+del bit off. + .CAD_is_off: + jmp .end + + ;----------------------------------------------; + ; a key was pressed, check for special keys ; + ;----------------------------------------------; + .key_down: + or byte [kbd_flags], 10000000b + + .shift: + cmp al, 42 + jnz .check_rshift + or byte [kbd_flags], 00000001b + jmp .end + + .check_rshift: + cmp al, 54 + jnz .check_ctrl + or byte [kbd_flags], 00000001b + jmp .end + + .check_ctrl: + cmp al, 29 + jnz .check_alt + or byte [kbd_flags], 00000010b + jmp .end + + .check_alt: + cmp al, 56 + jnz .ctrl_alt_del + or byte [kbd_flags], 00000100b + jmp .end + + .ctrl_alt_del: + test byte [kbd_flags], 00000110b ; check for ctrl+alt + jz .check_caps + cmp al, 83 ; check for delete + jne .check_caps + or byte [kbd_flags], 01000000b ; ctrl+alt+del bit on. + + ;-------------------------------------; + ; toggle caps, num and scroll lock ; + ;-------------------------------------; + .check_caps: + cmp al, 58 + jnz .check_num + xor byte [kbd_status], 4 + call update_leds + jmp .end + + .check_num: + cmp al, 69 + jnz .check_scroll + xor byte [kbd_status], 2 + call update_leds + jmp .end + + .check_scroll: + cmp al, 70 + jnz .end + xor byte [kbd_status], 1 + call update_leds + jmp .end + + ;-----------------------------------; + ; put the scancode in the buffer ; + ;-----------------------------------; + .end: + push eax + mov edi, kbd_buffer + xor eax, eax + mov al, [kbd_head] + add edi, eax + pop eax + stosb + cmp [kbd_head], 63 ; if we reach the buffer + jne .cont1 ; end, go back to 0. + cmp [kbd_tail], 0 + je .error + mov [kbd_head], 0 + jmp .quit + .cont1: + mov ah, [kbd_tail] + mov al, [kbd_head] + add al, 1 + cmp ah, al + je .error + inc [kbd_head] + jmp .quit + .error: + call beep ; pc_speaker.inc + mov [kbd_head], 1 ; fix it as good + mov [kbd_tail], 0 ; as possible.. :S + .quit: + mov al, 0x20 + out 0x20, al + pop eax + ret + + + +;------------------------------; +; Update the keyboard LED's ; +;------------------------------; +update_leds: + push ax + + call kbd_wait + mov al, 0xED + out 0x60, al + call kbd_wait + mov al, [kbd_status] + out 0x60, al + call kbd_wait + + pop ax + ret + + + +;------------------; +; keyboard wait ; +;------------------; +kbd_wait: + jmp $+2 + in al, 0x64 + test al, 1 + jz .ok + jmp $+2 + in al, 0x60 + jmp kbd_wait + .ok: + test al, 2 + jnz kbd_wait + ret + + + +;-------------------------------------------------------; +; BOS INT to get a char. ; +; out: ah = scan code, al = ascii ; +; bh = flag-byte, bl = led-byte ; +;-------------------------------------------------------; +getc: + push esi + + .no_new: + mov al, [kbd_head] + mov ah, [kbd_tail] + cmp ah, 63 + jne .check2 + cmp al, 0 + je .no_new + mov [kbd_tail], 0 + jmp .done_check + .check2: + mov bl, ah + inc bl + cmp bl, al + je .no_new + inc [kbd_tail] + .done_check: + + mov esi, kbd_buffer + movzx eax, [kbd_tail] + add esi, eax + mov ah, byte [esi] ; ah = scancode + movzx esi, byte [esi] ; esi = scancode + + ;------------------; + ; some checks.. ; + ;------------------; + cmp ah, 0xFA + je .no_new + cmp ah, 0xE0 + je .no_new + cmp ah, 0xE1 + je .no_new + test ah, 0x80 + jnz .no_new + + ;--------------------------------; + ; check for caps, shift & alt ; + ;--------------------------------; + test [kbd_status], 00000100b + jnz .caps + test [kbd_flags], 00000001b + jnz .shift + + ;------------------; + ; normal keymap ; + ;------------------; + mov al, [esi+keymap] ; scancode + keymap = ascii + jmp .end + + ;--------------------; + ; capslock keymap ; + ;--------------------; + .caps: + test [kbd_flags], 00000001b + jnz .caps_and_shift + + mov al, [esi+keymap_caps] + jmp .end + + ;--------------------------; + ; caps and shift keymap ; + ;--------------------------; + .caps_and_shift: + mov al, [esi+keymap_caps_shift] + jmp .end + + ;-----------------; + ; shift keymap ; + ;-----------------; + .shift: + mov al, [esi+keymap_shift] + jmp .end + + ;---------------------------; + ; set registers and exit ; + ;---------------------------; + .end: + mov bl, [kbd_status] + mov bh, [kbd_flags] + + pop esi + ret + + +;------------------------------; +; "press any key to..." ; +;------------------------------; +wait_key: + push eax + push ebx + push esi + + .no_new: + mov al, [kbd_head] + mov ah, [kbd_tail] + cmp ah, 63 + jne .check2 + cmp al, 0 + je .no_new + mov [kbd_tail], 0 + jmp .done_check + .check2: + mov bl, ah + inc bl + cmp bl, al + je .no_new + inc [kbd_tail] + .done_check: + + mov esi, kbd_buffer + movzx eax, [kbd_tail] + add esi, eax + mov ah, byte [esi] ; ah = scancode + cmp ah, 0xFA ; check for some stuff.. + je .no_new + cmp ah, 0xE0 + je .no_new + cmp ah, 0xE1 + je .no_new + test ah, 0x80 + jnz .no_new + + pop esi + pop ebx + pop eax + ret \ No newline at end of file diff --git a/kernel/krl_incs/keymap.inc b/kernel/krl_incs/keymap.inc new file mode 100755 index 0000000..ccd7b4f --- /dev/null +++ b/kernel/krl_incs/keymap.inc @@ -0,0 +1,85 @@ +;----------------------------------------------------------; +; BOS 0.04 Christoffer Bubach, 2004. ; +;----------------------------------------------------------; +; Keymap. ; +; Only USA-type are supported so far. (poor åäö...) ; +; ; +;----------------------------------------------------------; + +keymap: + db 0 + db '1234567890-=', bspace + db tab,'qwertyuiop[]',enter_key + db ctrl_key,'asdfghjkl;',39,'`',lshift + db '\','zxcvbnm,./',rshift,prnscr,alt_key,' ' + db caps,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,numlock + db scroll,home,arrowup,pgup,num_sub,arrowleft,center5,arrowright + db num_plus,_end,arrowdown,pgdn,_ins,del + +keymap_caps: + db 0 + db '1234567890-=', bspace + db tab,'QWERTYUIOP[]',enter_key + db ctrl_key,'ASDFGHJKL;',39,'`',lshift + db '\','ZXCVBNM,./',rshift,prnscr,alt_key,' ' + db caps,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,numlock + db scroll,home,arrowup,pgup,num_sub,arrowleft,center5,arrowright + db num_plus,_end,arrowdown,pgdn,_ins,del + +keymap_caps_shift: + db 0 + db '!@#$%^&*()_+', bspace + db tab,'qwertyuiop{}',enter_key + db ctrl_key,'asdfghjkl:"~',lshift + db '|zxcvbnm<>?',rshift,prnscr,alt_key,' ' + db caps,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,numlock + db scroll,home,arrowup,pgup,num_sub,arrowleft,center5,arrowright + db num_plus,_end,arrowdown,pgdn,_ins,del + +keymap_shift: + db 0 + db '!@#$%^&*()_+', bspace + db tab,'QWERTYUIOP{}',enter_key + db ctrl_key,'ASDFGHJKL:"~',lshift + db '|ZXCVBNM<>?',rshift,prnscr,alt_key,' ' + db caps,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,numlock + db scroll,home,arrowup,pgup,num_sub,arrowleft,center5,arrowright + db num_plus,_end,arrowdown,pgdn,_ins,del + + +enter_key = 0 +bspace = 0 +tab = 0 +ctrl_key = 0 +lshift = 0 +rshift = 0 +prnscr = 0 +alt_key = 0 +caps = 0 +f1 = 0 +f2 = 0 +f3 = 0 +f4 = 0 +f5 = 0 +f6 = 0 +f7 = 0 +f8 = 0 +f9 = 0 +f10 = 0 +f11 = 0 +f12 = 0 +numlock = 0 +scroll = 0 +home = 0 +arrowup = 0 +pgup = 0 +num_sub = 0 +arrowleft = 0 +center5 = 0 +arrowright = 0 +num_plus = 0 +_end = 0 +arrowdown = 0 +pgdn = 0 +_ins = 0 +del = 0 \ No newline at end of file diff --git a/kernel/krl_incs/mario.inc b/kernel/krl_incs/mario.inc new file mode 100755 index 0000000..e9a48b8 --- /dev/null +++ b/kernel/krl_incs/mario.inc @@ -0,0 +1,119 @@ +mario: db 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x32, 0x05, 0x36, 0x36, 0x05, 0x05, 0x05, 0x10 + db 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x05, 0x36, 0x1F, 0x37 + db 0x36, 0x05, 0x05, 0x05, 0x05, 0x05, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10 + db 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x32, 0x05, 0x05, 0x05, 0x05, 0x05, 0x10, 0x00, 0x00, 0x00 + db 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x32, 0x05, 0x05 + db 0x05, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x10, 0x33, 0x10, 0x33, 0x32, 0x10 + db 0x10, 0x10, 0x10, 0x32, 0x34, 0x05, 0x00, 0x00, 0x00, 0x00, 0x34, 0x34, 0x34, 0x36, 0x10, 0x35 + db 0x10, 0x35, 0x35, 0x34, 0x32, 0x10, 0x32, 0x34, 0x37, 0x34, 0x32, 0x00, 0x00, 0x34, 0x37, 0x37 + db 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x35, 0x32, 0x10, 0x10, 0x34, 0x36, 0x36, 0x34, 0x32, 0x00 + db 0x00, 0x32, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x10, 0x36, 0x36, 0x32, 0x10, 0x36, 0x34 + db 0x34, 0x32, 0x10, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x36 + db 0x36, 0x36, 0x36, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10 + db 0x10, 0x32, 0x34, 0x34, 0x34, 0x34, 0x32, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x6B, 0x8B, 0x8B, 0x8B, 0x8B, 0x6B, 0x32, 0x05, 0x05, 0x32, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x8C, 0x8D, 0x8D, 0x8C, 0x8B, 0x8B, 0x6B, 0x05, 0x05, 0x05 + db 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x8C, 0x8E, 0x8E, 0x8D, 0x8C, 0x8C, 0x8B + db 0x6E, 0x1F, 0x1F, 0x6E, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x8C, 0x8D, 0x8E + db 0x8C, 0x8B, 0x8B, 0x8B, 0x10, 0x6E, 0x1F, 0x6E, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x10, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x10, 0x6D, 0x6E, 0x6D, 0x6B, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x32, 0x4B, 0x4B, 0x32 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x4E, 0x4C, 0x32, 0x4E, 0x4E, 0x4C + db 0x4C, 0x4C, 0x4B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x32, 0x32 + db 0x10, 0x4B, 0x4B, 0x32, 0x32, 0x32, 0x32, 0x10, 0x00, 0x00, 0x00, 0x00 + +grass_l: db 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10 + db 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x29, 0x2C, 0x2B, 0x2C, 0x2C + db 0x2B, 0x2B, 0x2D, 0x2D, 0x2C, 0x2C, 0x2B, 0x2C, 0x2C, 0x2C, 0x00, 0x10, 0x29, 0x2A, 0x2A, 0x2C + db 0x2D, 0x2A, 0x2C, 0x2B, 0x2C, 0x2D, 0x2B, 0x2C, 0x2C, 0x2D, 0x2D, 0x2C, 0x2C, 0x2B, 0x10, 0x29 + db 0x2B, 0x2A, 0x2B, 0x2B, 0x2B, 0x2C, 0x2B, 0x2B, 0x2A, 0x2A, 0x2B, 0x2A, 0x2B, 0x2B, 0x2A, 0x2C + db 0x2B, 0x2A, 0x10, 0x29, 0x2A, 0x2A, 0x2A, 0x2B, 0x2A, 0x2B, 0x2A, 0x2B, 0x2A, 0x2A, 0x2A, 0x2B + db 0x2A, 0x2A, 0x2A, 0x2B, 0x2A, 0x2B, 0x10, 0x28, 0x29, 0x2A, 0x2C, 0x29, 0x2B, 0x2A, 0x29, 0x2A + db 0x2B, 0x2C, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x28, 0x10, 0x29, 0x2A, 0x2A, 0x2D, 0x29 + db 0x2A, 0x29, 0x2A, 0x29, 0x2A, 0x2A, 0x29, 0x2A, 0x2A, 0x2C, 0x2A, 0x28, 0x29, 0x2A, 0x10, 0x28 + db 0x29, 0x2A, 0x2B, 0x2A, 0x2A, 0x28, 0x2A, 0x10, 0x29, 0x2A, 0x2A, 0x29, 0x10, 0x2B, 0x2A, 0x10 + db 0x29, 0x28, 0x10, 0x29, 0x29, 0x2B, 0x2A, 0x29, 0x2B, 0x29, 0x2B, 0x10, 0x28, 0x29, 0x10, 0x2B + db 0x10, 0x29, 0x28, 0x2A, 0x28, 0x2B, 0x00, 0x28, 0x2A, 0x29, 0x10, 0x10, 0x2A, 0x10, 0x10, 0x41 + db 0x10, 0x10, 0x41, 0x10, 0x28, 0x10, 0x29, 0x2B, 0x29, 0x28, 0x00, 0x10, 0x28, 0x10, 0x10, 0x41 + db 0x10, 0x41, 0x50, 0x50, 0x41, 0x50, 0x50, 0x41, 0x10, 0x41, 0x10, 0x29, 0x28, 0x41, 0x00, 0x00 + db 0x10, 0x10, 0x41, 0x10, 0x50, 0x50, 0x51, 0x51, 0x51, 0x52, 0x50, 0x50, 0x51, 0x51, 0x41, 0x41 + db 0x10, 0x50, 0x00, 0x00, 0x10, 0x41, 0x50, 0x41, 0x51, 0x52, 0x52, 0x52, 0x52, 0x53, 0x53, 0x53 + db 0x54, 0x53, 0x52, 0x50, 0x50, 0x51, 0x00, 0x00, 0x10, 0x41, 0x41, 0x51, 0x52, 0x53, 0x54, 0x53 + db 0x53, 0x54, 0x55, 0x55, 0x55, 0x54, 0x54, 0x52, 0x52, 0x54 + +grass_f: db 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10 + db 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x2C, 0x2B, 0x2C, 0x2C, 0x2D, 0x2D, 0x2D, 0x2C, 0x2D, 0x2B + db 0x2B, 0x2C, 0x2D, 0x2C, 0x2D, 0x2B, 0x2C, 0x2B, 0x2C, 0x2D, 0x2B, 0x2D, 0x2C, 0x2C, 0x2B, 0x2A + db 0x2C, 0x2A, 0x2C, 0x2D, 0x2C, 0x2C, 0x2B, 0x2C, 0x2A, 0x2C, 0x2D, 0x2D, 0x2B, 0x2B, 0x2A, 0x2B + db 0x2C, 0x2B, 0x2A, 0x2C, 0x2A, 0x2B, 0x2B, 0x2B, 0x2A, 0x2A, 0x2B, 0x2A, 0x2B, 0x2B, 0x2A, 0x2C + db 0x2B, 0x2A, 0x2A, 0x2A, 0x2A, 0x2B, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2B, 0x2A, 0x2A, 0x2A, 0x2B + db 0x2A, 0x2A, 0x2A, 0x2B, 0x2A, 0x2B, 0x2A, 0x2B, 0x2A, 0x2A, 0x2A, 0x29, 0x2B, 0x2A, 0x29, 0x2A + db 0x2A, 0x2B, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x28, 0x2A, 0x29, 0x28, 0x29, 0x2A, 0x29 + db 0x2A, 0x29, 0x2A, 0x29, 0x2A, 0x2A, 0x29, 0x2A, 0x2A, 0x2B, 0x2A, 0x28, 0x29, 0x2A, 0x29, 0x29 + db 0x28, 0x2A, 0x29, 0x29, 0x2A, 0x28, 0x2A, 0x10, 0x29, 0x2A, 0x2A, 0x29, 0x10, 0x2B, 0x2A, 0x10 + db 0x29, 0x28, 0x2A, 0x28, 0x2A, 0x2B, 0x10, 0x29, 0x2B, 0x29, 0x2B, 0x10, 0x28, 0x29, 0x10, 0x2B + db 0x10, 0x29, 0x28, 0x2A, 0x28, 0x2B, 0x28, 0x29, 0x2A, 0x2B, 0x10, 0x10, 0x2A, 0x10, 0x10, 0x41 + db 0x10, 0x10, 0x41, 0x10, 0x28, 0x10, 0x29, 0x2B, 0x29, 0x28, 0x41, 0x10, 0x28, 0x10, 0x10, 0x41 + db 0x10, 0x41, 0x50, 0x50, 0x41, 0x50, 0x50, 0x41, 0x10, 0x41, 0x10, 0x29, 0x28, 0x41, 0x50, 0x41 + db 0x10, 0x41, 0x41, 0x50, 0x51, 0x50, 0x51, 0x51, 0x51, 0x52, 0x50, 0x50, 0x51, 0x51, 0x41, 0x41 + db 0x10, 0x50, 0x51, 0x51, 0x50, 0x50, 0x51, 0x51, 0x52, 0x51, 0x52, 0x52, 0x52, 0x53, 0x53, 0x53 + db 0x54, 0x53, 0x52, 0x50, 0x50, 0x51, 0x53, 0x52, 0x51, 0x51, 0x53, 0x53, 0x52, 0x53, 0x54, 0x53 + db 0x53, 0x54, 0x55, 0x55, 0x55, 0x54, 0x54, 0x52, 0x52, 0x54 + +grass_ul: db 0x10, 0x10, 0x10, 0x31, 0x51, 0x51, 0x52, 0x52, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54 + db 0x55, 0x55, 0x54, 0x54, 0x54, 0x54, 0x2C, 0x2C, 0x29, 0x2A, 0x31, 0x10, 0x51, 0x52, 0x52, 0x55 + db 0x53, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x2B, 0x2D, 0x2D, 0x29, 0x2B, 0x2A + db 0x31, 0x28, 0x53, 0x52, 0x52, 0x54, 0x54, 0x54, 0x55, 0x54, 0x54, 0x54, 0x54, 0x54, 0x2A, 0x2B + db 0x2B, 0x2A, 0x2D, 0x2C, 0x2B, 0x2A, 0x42, 0x52, 0x54, 0x55, 0x54, 0x54, 0x54, 0x54, 0x55, 0x54 + db 0x54, 0x54, 0x2A, 0x2B, 0x2C, 0x2B, 0x2B, 0x2B, 0x2A, 0x2B, 0x28, 0x28, 0x52, 0x52, 0x54, 0x54 + db 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x2A, 0x2A, 0x2B, 0x2B, 0x2A, 0x2D, 0x2B, 0x2A, 0x2B, 0x28 + db 0x28, 0x53, 0x53, 0x54, 0x54, 0x54, 0x54, 0x55, 0x55, 0x54, 0x2B, 0x2A, 0x2B, 0x2A, 0x2A, 0x2B + db 0x2A, 0x28, 0x29, 0x2A, 0x10, 0x41, 0x53, 0x53, 0x54, 0x54, 0x55, 0x55, 0x55, 0x55, 0x2C, 0x28 + db 0x29, 0x2A, 0x2A, 0x2A, 0x2B, 0x29, 0x28, 0x10, 0x42, 0x53, 0x53, 0x54, 0x55, 0x54, 0x55, 0x55 + db 0x55, 0x55, 0x28, 0x29, 0x28, 0x28, 0x10, 0x28, 0x2A, 0x28, 0x51, 0x42, 0x53, 0x52, 0x54, 0x54 + db 0x54, 0x54, 0x54, 0x55, 0x54, 0x54, 0x28, 0x29, 0x41, 0x41, 0x51, 0x10, 0x28, 0x41, 0x42, 0x52 + db 0x51, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x41, 0x10, 0x41, 0x51, 0x41, 0x51 + db 0x42, 0x53, 0x53, 0x54, 0x53, 0x55, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x54, 0x54, 0x51, 0x41 + db 0x53, 0x41, 0x52, 0x52, 0x53, 0x54, 0x53, 0x53, 0x54, 0x54, 0x54, 0x54, 0x55, 0x55, 0x54, 0x54 + db 0x54, 0x54, 0x52, 0x52, 0x52, 0x53, 0x55, 0x53, 0x53, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55 + db 0x55, 0x55, 0x55, 0x54, 0x54, 0x54, 0x54, 0x53, 0x55, 0x54, 0x53, 0x53, 0x54, 0x54, 0x55, 0x54 + db 0x54, 0x54, 0x54, 0x55, 0x55, 0x55, 0x55, 0x54, 0x54, 0x55 + +g_lefts: db 0x00, 0x00, 0x10, 0x41, 0x51, 0x52, 0x52, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54 + db 0x55, 0x55, 0x54, 0x54, 0x54, 0x54, 0x00, 0x00, 0x10, 0x50, 0x51, 0x53, 0x54, 0x55, 0x54, 0x53 + db 0x54, 0x55, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x00, 0x00, 0x10, 0x50, 0x41, 0x52 + db 0x54, 0x54, 0x55, 0x54, 0x53, 0x54, 0x55, 0x54, 0x55, 0x54, 0x54, 0x54, 0x54, 0x54, 0x00, 0x00 + db 0x10, 0x41, 0x52, 0x52, 0x54, 0x53, 0x54, 0x54, 0x54, 0x54, 0x55, 0x54, 0x54, 0x54, 0x55, 0x54 + db 0x54, 0x54, 0x00, 0x00, 0x10, 0x50, 0x51, 0x52, 0x52, 0x54, 0x53, 0x53, 0x54, 0x54, 0x54, 0x54 + db 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x00, 0x00, 0x10, 0x41, 0x51, 0x41, 0x54, 0x53, 0x54, 0x54 + db 0x54, 0x55, 0x54, 0x54, 0x54, 0x54, 0x55, 0x55, 0x54, 0x54, 0x00, 0x00, 0x10, 0x41, 0x51, 0x52 + db 0x52, 0x53, 0x54, 0x55, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x55, 0x55, 0x55, 0x54, 0x00, 0x00 + db 0x10, 0x41, 0x50, 0x51, 0x53, 0x54, 0x54, 0x55, 0x55, 0x54, 0x55, 0x54, 0x54, 0x55, 0x55, 0x55 + db 0x55, 0x54, 0x00, 0x00, 0x10, 0x41, 0x50, 0x51, 0x53, 0x54, 0x54, 0x54, 0x55, 0x54, 0x54, 0x54 + db 0x54, 0x54, 0x55, 0x55, 0x54, 0x54, 0x00, 0x00, 0x10, 0x41, 0x50, 0x52, 0x52, 0x53, 0x54, 0x55 + db 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x00, 0x00, 0x10, 0x50, 0x51, 0x52 + db 0x50, 0x52, 0x53, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x54, 0x54, 0x00, 0x00 + db 0x10, 0x41, 0x52, 0x52, 0x52, 0x55, 0x55, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x55, 0x54, 0x54 + db 0x54, 0x54, 0x00, 0x00, 0x10, 0x41, 0x50, 0x52, 0x52, 0x53, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55 + db 0x55, 0x55, 0x55, 0x54, 0x54, 0x54, 0x00, 0x00, 0x10, 0x50, 0x52, 0x52, 0x54, 0x53, 0x54, 0x54 + db 0x55, 0x54, 0x54, 0x55, 0x55, 0x55, 0x55, 0x54, 0x54, 0x55 + +g_earth: db 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54 + db 0x55, 0x55, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x55, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55 + db 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x54, 0x55, 0x55, 0x55, 0x55, 0x54 + db 0x55, 0x54, 0x54, 0x54, 0x55, 0x55, 0x54, 0x54, 0x55, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55 + db 0x55, 0x55, 0x55, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x55, 0x54, 0x54, 0x54, 0x54, 0x55, 0x54 + db 0x54, 0x54, 0x54, 0x54, 0x55, 0x55, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54 + db 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55 + db 0x54, 0x54, 0x54, 0x55, 0x54, 0x54, 0x55, 0x55, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54 + db 0x55, 0x55, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x55, 0x55, 0x55, 0x54, 0x54, 0x54 + db 0x54, 0x54, 0x54, 0x55, 0x55, 0x55, 0x55, 0x54, 0x55, 0x54, 0x54, 0x54, 0x54, 0x55, 0x55, 0x55 + db 0x55, 0x54, 0x54, 0x54, 0x55, 0x54, 0x54, 0x55, 0x55, 0x55, 0x55, 0x54, 0x54, 0x54, 0x54, 0x54 + db 0x54, 0x54, 0x55, 0x55, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x55, 0x54, 0x54 + db 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x54, 0x54, 0x54, 0x54 + db 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x54, 0x54, 0x54, 0x55 + db 0x55, 0x54, 0x54, 0x54, 0x55, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x55, 0x54, 0x54 + db 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55 + db 0x55, 0x55, 0x55, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x54 + db 0x54, 0x54, 0x54, 0x55, 0x55, 0x55, 0x55, 0x54, 0x54, 0x55 \ No newline at end of file diff --git a/kernel/krl_incs/mem.inc b/kernel/krl_incs/mem.inc new file mode 100755 index 0000000..534387c --- /dev/null +++ b/kernel/krl_incs/mem.inc @@ -0,0 +1,388 @@ +;----------------------------------------------------------; +; BOS kernel Christoffer Bubach, 2003-2005. ; +;----------------------------------------------------------; +; ; +; functions to allocate/free mem. ; +; ; +;----------------------------------------------------------; + +;----------------; +; variables ; +;----------------; + first_free dd 0 + prev_pointer dd 0 + size dd 0 + next_pointer dd 0 + + +;------------------------------------------------------; +; init mem ; +; in: ebx = first free memory ; +; ecx = total memory size ; +;------------------------------------------------------; +init_mem: + push ecx + + mov [first_free], ebx + sub ecx, ebx + mov [size], ecx + mov [prev_pointer], 0 + mov [next_pointer], 0 + mov ecx, [prev_pointer] + mov [ebx], ecx + mov ecx, [size] + mov [ebx+4], ecx + mov ecx, [next_pointer] + mov [ebx+8], ecx + + pop ecx + ret + + + +;------------------------------------------------------; +; allocate memory ; +; in: ebx = wanted size in bytes ; +; out: eax = 0 if failed ; +; ebx = pointer to memory ; +;------------------------------------------------------; +allocate_mem: + push ecx + push edx + + mov eax, [first_free] + + .loop: + mov ecx, [eax] + mov [prev_pointer], ecx + + mov ecx, [eax+4] + mov [size], ecx + + mov ecx, [eax+8] + mov [next_pointer], ecx + + cmp [size], ebx + jae .found + cmp [next_pointer], 0 + je .error + mov eax, [next_pointer] + jmp .loop + + .error: + xor eax, eax + jmp .end + + .found: + mov ecx, [size] + sub ecx, ebx + jz .equal + + cmp [next_pointer], 0 + jne .next_exists + cmp [prev_pointer], 0 + jne .prev_but_no_next + + + ;----------------------------------------------; + ; no other block exists; add new free block ; + ; with the reminding space as free, and move ; + ; "first free" to that block.. ; + ;----------------------------------------------; + mov ecx, eax ; move address to ecx and + add ecx, ebx ; add size. ecx=end requested + mov dword [ecx], 0 ; set new header's prev to 0 + mov edx, [size] + sub edx, ebx ; remaining space in edx + mov [ecx+4], edx ; save it to new header + mov dword [ecx+8], 0 ; no next pointer.. + + mov [first_free], ecx + mov ebx, eax ; eax is unchanged from loop + jmp .end + + ;----------------------------------------------; + ; no next block exists, make a new header at ; + ; the end of the requested size with the ; + ; reminder of the free space, and update the ; + ; prev header's next pointer.. ; + ;----------------------------------------------; + .prev_but_no_next: + mov ecx, eax ; move address to ecx and + add ecx, ebx ; add size. ecx=end requested + mov edx, [prev_pointer] ; set prev for new header + mov [ecx], edx ; set new header's prev to 0 + mov edx, [size] + sub edx, ebx ; remaining space in edx + mov [ecx+4], edx ; save it to new header + mov dword [ecx+8], 0 ; no next pointer.. + + mov [prev_pointer+8], ecx + mov ebx, eax ; eax is unchanged from loop + jmp .end + + + ;----------------------------------------------; + ; both next and previous blocks exists, make a ; + ; new header at the end of the requested size ; + ; with the reminder of the free space, move ; + ; data from next block to the new one but add ; + ; size so it gets right, then update all prev/ ; + ; next pointers for total 3 blocks.. puh.. ; + ;----------------------------------------------; + .next_exists: + cmp [prev_pointer], 0 + je .next_but_no_prev + + mov ecx, eax ; move address to ecx and + add ecx, ebx ; add size. ecx=end requested + mov edx, [prev_pointer] ; set prev for new header + mov [ecx], edx ; set new header's prev + mov edx, [size] + sub edx, ebx + mov ebx, [next_pointer+4] + add edx, ebx ; remaining space in edx + mov [ecx+4], edx ; save it to new header + mov edx, [next_pointer] ; address to next block + cmp dword [edx], 0 + je .no_next_next + mov dword [edx], ecx ; update next-next's prev.. + mov dword [ecx+8], edx ; address to next pointer. + + mov [prev_pointer+8], ecx + mov ebx, eax ; eax is unchanged from loop + jmp .end + .no_next_next: + mov dword [edx], 0 + mov dword [ecx+8], 0 + mov [prev_pointer+8], ecx + mov ebx, eax ; eax is unchanged from loop + jmp .end + + + ;----------------------------------------------; + ; we allocated the first free block, do the ; + ; same as above, except ignore the prev block ; + ; part, and move the "first free". ; + ;----------------------------------------------; + .next_but_no_prev: + mov ecx, eax ; move address to ecx and + add ecx, ebx ; add size. ecx=end requested + mov dword [ecx], 0 ; set new header's prev to 0 + mov edx, [size] + sub edx, ebx + mov ebx, [next_pointer+4] + add edx, ebx ; remaining space in edx + mov [ecx+4], edx ; save it to new header + mov edx, [next_pointer] ; address to next block + cmp dword [edx], 0 + je .no_next_next2 + mov dword [edx], ecx ; update next-next's prev.. + mov dword [ecx+8], edx ; address to next pointer. + + mov [first_free], ecx ; zero and update first free. + mov ebx, eax ; eax is unchanged from loop + jmp .end + .no_next_next2: + mov dword [edx], 0 + mov ecx, [ecx+8] + mov dword [ecx], 0 + mov [prev_pointer+8], ecx + mov ebx, eax ; eax is unchanged from loop + jmp .end + + + ;-----------------------------------------; + ; requested == size ; + ; I prefered coding this one.. ;) ; + ;-----------------------------------------; + .equal: + cmp [next_pointer], 0 + jne .next_exists2 + cmp [prev_pointer], 0 + jne .prev_but_no_next2 + mov [first_free], 0 + mov ebx, eax ; eax is unchanged from loop + jmp .end + + .prev_but_no_next2: + mov dword [prev_pointer+8], 0 + mov ebx, eax ; eax is unchanged from loop + jmp .end + + .next_exists2: + cmp [prev_pointer], 0 + je .next_but_no_prev2 + mov ecx, [prev_pointer] ; update prev and next's + mov edx, [next_pointer] ; headers to bypass this + mov [ecx+8], edx ; chunk. + mov [edx], ecx + mov ebx, eax ; eax is unchanged from loop + jmp .end + + .next_but_no_prev2: + mov ecx, [eax+8] ; get address of next header + mov dword [ecx], 0 ; set prev in next header to + mov [first_free], ecx ; zero and update first free. + mov ebx, eax ; eax is unchanged from loop + + .end: + pop edx + pop ecx + ret + + + + +;------------------------------------------------------; +; free memory ; +; in: ebx = pointer to mem ; +; ecx = size in bytes ; +;------------------------------------------------------; +free_mem: + push eax + push ebx + push ecx + push edx + + cmp ebx, [first_free] + jb .new_first_free + cmp [first_free], 0 + je .new_first_free + + ;-----------------------------------------------------------; + ; the block we want to free is somewhere in between ; + ; two other free blocks or after the last free block. ; + ; search for the "ebx"-address, so we know where the new ; + ; prev/next pointers are, and then can check if we should ; + ; merge blocks.. ; + ;-----------------------------------------------------------; + mov eax, [first_free] ; "current" free block + mov edx, [eax+8] ; next free block + + .find_pos_loop: + cmp edx, 0 ; check if the "next" + je .found_end_of_ram ; free exists.. + + cmp ebx, edx ; is ebx "below" edx? + jb .found_between ; found ebx in between + + mov eax, edx ; update pointers for + mov edx, [eax+8] ; another loop. + jmp .find_pos_loop + + ;------------------------------------------; + ; the block is between two other blocks ; + ;------------------------------------------; + .found_between: + mov [ebx], eax ; create header + mov [ebx+4], ecx + mov [ebx+8], edx + + mov [eax+8], ebx ; update prev header + mov [edx], ebx ; update next header + + ; now check if we can merge blocks.... + add ecx, ebx + cmp edx, ecx + jne .merge_only_first + push eax + add eax, [eax+4] + cmp ebx, eax + pop eax + jne .merge_only_last + + ; we can merge with both prev & next + mov ecx, [ebx+4] ; get size from "current" + add [eax+4], ecx ; and add it to "prev". + mov ecx, [edx+4] ; get size from "next" + add [eax+4], ecx ; and add it to "prev". + mov ecx, [edx+8] ; get the new next + mov [eax+8], ecx ; pointer, and store it. + cmp ecx, 0 + je .end + mov [ecx], eax + jmp .end + + .merge_only_first: + cmp ebx, eax + jne .end + mov ecx, [ebx+4] ; get size from "current" + add [eax+4], ecx ; and add it to "prev". + mov [edx], eax ; update prev and next + mov [eax+8], edx ; pointers for the two.. + jmp .end + + .merge_only_last: + cmp edx, ecx + jne .end + mov ecx, [edx+4] + add [ebx+4], ecx + mov ecx, [edx+8] + mov [ebx+8], ecx + cmp ecx, 0 + je .end + mov [ecx], ebx + jmp .end + + ;----------------------------------------------; + ; the block is after all existing free ones ; + ;----------------------------------------------; + .found_end_of_ram: + mov [ebx], eax ; create header + mov [ebx+4], ecx + mov [ebx+8], edx + + mov [eax+8], ebx ; update prev header + + ; now check if we can merge the blocks.... + mov ecx, eax + add ecx, [eax+4] + cmp ebx, ecx + jne .end + mov ecx, [ebx+4] + add [eax+4], ecx + mov ecx, [ebx+8] + mov [eax+8], ecx + jmp .end + + ;--------------------------------------------; + ; the block is before any other free ones ; + ;--------------------------------------------; + .new_first_free: + mov dword [ebx], 0 + mov [ebx+4], ecx ; create the + mov edx, [first_free] ; new header + mov [ebx+8], edx + + mov edx, ebx ; check if the + add edx, [ebx+4] ; first_free matches + cmp edx, [first_free] ; current pos + size? + je .merge_first_free ; if so, merge the two + + cmp [first_free], 0 ; else check if + je .cont1 ; first_free exists + mov edx, [ebx+8] ; if it does, update + mov [edx], ebx ; it's prev pointer. + .cont1: + mov [first_free], ebx ; else/and set new + jmp .end ; first free and quit + + .merge_first_free: ; merge the two first + mov edx, [ebx+8] ; add the size of the + mov ecx, [edx+4] ; second block to the + add [ebx+4], ecx ; new one. + mov ecx, [edx+8] ; get the next pointer + mov [ebx+8], ecx ; from the old block, + cmp ecx, 0 + je .cont2 + mov [ecx], ebx ; update this + next.. + .cont2: + mov [first_free], ebx ; update first_free + + .end: + pop edx + pop ecx + pop ebx + pop eax + ret \ No newline at end of file diff --git a/kernel/krl_incs/pc_speaker.inc b/kernel/krl_incs/pc_speaker.inc new file mode 100755 index 0000000..667f3ee --- /dev/null +++ b/kernel/krl_incs/pc_speaker.inc @@ -0,0 +1,56 @@ +;----------------------------------------------------------; +; BOS kernel Christoffer Bubach, 2004-2005. ; +;----------------------------------------------------------; +; ; +; Internal speaker functions... ; +; ; +;----------------------------------------------------------; + +;-----------------------; +; turn on PC speaker ; +; bx = frequency ; +;-----------------------; +speaker_on: + mov dx, 0x12 + mov ax, 0x34DC + div bx + mov bl, al + mov al, 0xB6 + out 0x43, al + mov al, bl + out 0x42, al + mov al, ah + out 0x42, al + in al, 0x61 + or al, 3 + out 0x61, al + ret + + +;----------------------; +; turn speaker off ; +;----------------------; +speaker_off: + push ax + in al, 0x61 + and al, 0xFC ; some do 0xFD, some 0xFC... :/ + out 0x61, al + pop ax + ret + + +;----------------------------------; +; PC-speaker; beep ; +;----------------------------------; +beep: + push eax + push ecx + in al, 0x61 ; turn the speaker on. + or al, 3 + out 0x61, al + mov ecx, 50 + call delay ; timer.inc + call speaker_off + pop ecx + pop eax + ret \ No newline at end of file diff --git a/kernel/krl_incs/pic.inc b/kernel/krl_incs/pic.inc new file mode 100755 index 0000000..6076213 --- /dev/null +++ b/kernel/krl_incs/pic.inc @@ -0,0 +1,135 @@ +;----------------------------------------------------------; +; BOS 0.04 Christoffer Bubach, 2004. ; +;----------------------------------------------------------; +; ; +; PIC/IRQ handling. ; +; ; +;----------------------------------------------------------; + + +;-------------------------------------------; +; remap PICs to: cl = pic1 ch = pic2 ; +;-------------------------------------------; +remap_pics: + push ax + push dx + + mov al, 0x11 ; IWC1 + out 0x20, al + out 0xA0, al + + mov al, cl ; IWC2 + out 0x21, al + mov al, ch + out 0xA1, al + + mov al, 0x04 ; IWC3 + out 0x21, al + mov al, 0x02 + out 0xA1, al + + mov al, 0x01 ; IWC4 + out 0x21, al + out 0xA1, al + + pop dx + pop ax + ret + + +;----------------------; +; disable all IRQs. ; +;----------------------; +disable_irqs: + push ax + + mov al, 0xFF + out 0x21, al + out 0xA1, al + + pop ax + ret + + +;---------------------; +; enable all IRQs. ; +;---------------------; +enable_irqs: + push ax + + mov al, 0x00 + out 0x21, al + out 0xA1, al + + pop ax + ret + + +;-----------------------------; +; enable an IRQ. cl = irq ; +;-----------------------------; +enable_irq: + push ax + push cx + + cmp cl, 8 + jb .master + + sub cl, 8 + mov ah, 1 + shl ah, cl + xor ah, 0xFF + + in al, 0xA1 + and al, ah + out 0xA1, al + + pop cx + pop ax + ret + .master: + mov ah, 1 + shl ah, cl + xor ah, 0xFF + + in al, 0x21 + and al, ah + out 0x21, al + + pop cx + pop ax + ret + + +;------------------------------; +; disable an IRQ. cl = irq ; +;------------------------------; +disable_irq: + push ax + push cx + + cmp cl, 8 + jb .master + + sub cl, 8 + mov ah, 1 + shl ah, cl + + in al, 0xA1 + or al, ah + out 0xA1, al + + pop cx + pop ax + ret + .master: + mov ah, 1 + shl ah, cl + + in al, 0x21 + or al, ah + out 0x21, al + + pop cx + pop ax + ret \ No newline at end of file diff --git a/kernel/krl_incs/rmode_int.inc b/kernel/krl_incs/rmode_int.inc new file mode 100755 index 0000000..bd2dbe2 --- /dev/null +++ b/kernel/krl_incs/rmode_int.inc @@ -0,0 +1,107 @@ +;----------------------------------------------------------; +; BOS kernel Christoffer Bubach, 2003-2005. ; +;----------------------------------------------------------; +; ; +; Goes back to realmode to do an INT. ; +; ; +;----------------------------------------------------------; + + +rmode_int: + pushad + push eax + shr eax, 16 ; move high bits to ax + mov word [realmode_ax], ax ; save new ax value + pop eax ; restore + + push ebx + shr ebx, 16 ; move high bits to bx + mov byte [int_number], bl ; save int number to call + pop ebx + + mov byte [realmode_error], 0 ; all variables is in the + mov word [realmode_bx], bx ; realmode/variables.inc file + mov word [realmode_cx], cx + mov word [realmode_dx], dx + call disable_irqs + jmp pword 0x18:do_16pmode-0x10000 ; must substract 0x10000 from + ; data addresses becasue of + ; fasm strict "org" behavior +use16 +do_16pmode: + mov ax, 0x20 + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + + cli + mov eax, cr0 + and al, 0xFE + mov cr0, eax + + jmp 0x1000:(do_realm-0x10000) + +do_realm: + mov ax, cs + mov ds, ax + + xor ax, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + + lidt [ridtr - 0x10000] ; realmode/variables.inc + sti + + mov ax, word [realmode_ax - 0x10000] + mov bx, word [realmode_bx - 0x10000] + mov cx, word [realmode_cx - 0x10000] + mov dx, word [realmode_dx - 0x10000] + + push ax ; this is some cool shit.. ;) + mov al, [int_number - 0x10000] ; interrupt to preform + mov [$+5 - 0x10000], al ; move it to right pos. + pop ax + db 0xCD ; opcode for int. + db 0x00 ; move int_number here + + jnc .no_error + mov byte [realmode_error - 0x10000], 1 + + .no_error: + mov word [realmode_ax - 0x10000], ax + mov word [realmode_bx - 0x10000], bx + mov word [realmode_cx - 0x10000], cx + mov word [realmode_dx - 0x10000], dx + + cli + + lgdt [gdtr - 0x10000] + lidt [idtr - 0x10000] + mov eax, cr0 + or al, 1 + mov cr0, eax + + jmp pword 0x08:gobackto_pm + + +use32 +gobackto_pm: + mov ax, 0x10 ; refresh all segment registers + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + call enable_irqs + sti + popad + clc ; clear carry. + cmp [realmode_error], 1 ; if error, then + jne .end + stc ; set carry. + .end: + ret \ No newline at end of file diff --git a/kernel/krl_incs/shell.inc b/kernel/krl_incs/shell.inc new file mode 100755 index 0000000..25e7686 --- /dev/null +++ b/kernel/krl_incs/shell.inc @@ -0,0 +1,190 @@ +;----------------------------------------------------------; +; BOS 0.04 Christoffer Bubach, 2004-2005. ; +;----------------------------------------------------------; +; ; +; Basic shell. ; +; ; +;----------------------------------------------------------; + + +;--------------; +; Variabels ; +;--------------; + +prompt db 'BOS kernel>', 0 +cmd_buffer: times 255 db 0 ; 255 char command buffer + + + +;----------------------------------------------; +; print the prompt for the first time.. :-) ; +;----------------------------------------------; +init_cmd: + mov byte [kbd_status], 0 ; reset LEDs to 0.. + call update_leds + + mov esi, prompt + mov bl, 0x0E + call print + + mov edi, cmd_buffer + + ret + + + +;-------------------------------; +; Main shell function & loop ; +;-------------------------------; +shell: + mov cx, 0 ; max 254 chars in command + .loop: ; no. 255 is always a 0 + + push cx ; better be sure it´s safe.. + push edi + + call getc ; keyboard.inc + + pop edi + pop cx + + cmp ah, 28 ; enter + je .enter + + cmp ah, 14 ; backspace + je .backspace + + cmp al, 0 ; no normal key + je .loop ; exceptions above.. + + cmp cx, 254 + jae .loop + + stosb ; store char in buffer + inc cx + + mov bl, al ; print it.. + mov bh, 0x07 + call print_char + + jmp .loop + + .enter: + mov al, 0 ; the command buffer is + stosb ; in ASCIIZ format.. + jmp chk_cmd + + .backspace: + cmp cx, 0 ; can´t delete the prompt.. ;-) + je .loop + dec edi ; "remove" one char from buffer + call backspace ; do backspace on screen + dec cx ; decrease buffer counter + jmp .loop + jmp $ + ret + + + +;---------------------------------; +; check for valid cmd ; +;---------------------------------; +chk_cmd: + + mov esi, commands + mov edi, cmd_buffer + mov ebp, 0 ; command-table counter + + ;------------------------------------------; + ; big loop, for each command in table ; + ;------------------------------------------; + .l1: + mov ecx, 0 ; char counter + + cmp byte [esi], 0xFF + je .no_valid_cmd + + ;------------------------------------------; + ; smaller loop for each char in command ; + ;------------------------------------------; + .l2: + cmp byte [edi], ' ' ; space or zero + je .l_chk ; both indicate + cmp byte [edi], 0 ; "end of command" + je .l_chk + jmp .l_cont + + .l_chk: + cmp byte [esi], 0 ; commands are equal, but + jne .new_cmd ; do not match in size.. + jmp .done + + .l_cont: + cmp byte [esi], 0 ; commands are equal, but + je .new_cmd ; do not match in size.. + + mov al, [esi] + cmp al, [edi] + jne .new_cmd + + inc esi + inc edi + inc ecx ; inc char counter + jmp .l2 + ;----------------------; + ; end of small loop ; + ;----------------------; + + .new_cmd: + inc ebp ; inc command counter + mov edi, cmd_buffer ; remember to point to the right place.. ;-) + .l3: + inc esi + cmp byte [esi], 0 ; loop until end of command + jne .l3 + + inc esi + jmp .l1 + ;----------------------; + ; end of big loop ; + ;----------------------; + + + + ;--------------------------; + ; done. command found ; + ;--------------------------; + .done: + cmp ecx, 0 ; make sure it´s more + je .d_quit ; then 0 chars.. + + shl ebp, 2 + call dword [ebp+call_table] + + .d_quit: + jmp .cont ; then go back to the shell + + + ;--------------------------; + ; command not found ; + ;--------------------------; + .no_valid_cmd: + + ; call search_current_directory_for_file.... :-) + + call no_such_cmd ; print error.. + jmp .cont ; then go back to the shell + + ;---------------------------------; + ; make the prompt appear again ; + ;---------------------------------; + .cont: + call new_line + call new_line + mov esi, prompt + mov bl, 0x0E + call print + mov edi, cmd_buffer + jmp shell + + ret diff --git a/kernel/krl_incs/sys_ints.inc b/kernel/krl_incs/sys_ints.inc new file mode 100755 index 0000000..3f57ddd --- /dev/null +++ b/kernel/krl_incs/sys_ints.inc @@ -0,0 +1,112 @@ +;----------------------------------------------------------; +; BOS 0.04 Christoffer Bubach, 2004-2005. ; +;----------------------------------------------------------; +; ; +; System interrupts.. ; +; ; +;----------------------------------------------------------; + + ;----------------------------------------------------; + ; TODO: A lot, when user programs can be runned.. ; + ;----------------------------------------------------; + +;--------------------------; +; System interrupt 0x32 ; +;--------------------------; + + isr32_str_1 db "ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»", 0 + isr32_str_2 db "º  INT 32 CALLED!! º", 0 + isr32_str_3 db "º   º", 0 + isr32_str_4 db "ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ", 0 + + isr32_str_5 db "CTRL+ALT+DEL was pressed!", 0 + +interrupt_32: + + ;-----------------; + ; get char ; + ;-----------------; + cmp ax, 0x0001 ; get character int.. + jne .cade + + call getc + + jmp .end + + ;-----------------------------; + ; ctrl+alt+delete function ; + ;-----------------------------; + .cade: + cmp ax, 0xCADE ; CTRL+ALT+DEL was pressed + jne .ordinary + + push bx + push cx + push dx + + call getcursor + mov cx, bx + + mov dl, 0x0C + mov dh, 0x1B + call setcursorxy + + mov esi, isr32_str_5 + mov al, 0x40 + call print + + mov bx, cx + call setcursor + + pop dx + pop cx + pop bx + + jmp .end + + ;-----------------------------; + ; no selected function.. ; + ;-----------------------------; + .ordinary: ; print that int 0x32 was called... + push bx + push cx + push dx + + mov dl, 0x0B + mov dh, 0x1A + call setcursorxy + + mov esi, isr32_str_1 + mov bl, 0x40 + call print + + mov dl, 0x0C + mov dh, 0x1A + call setcursorxy + + mov esi, isr32_str_2 + mov bl, 0x40 + call print + + mov dl, 0x0D + mov dh, 0x1A + call setcursorxy + + mov esi, isr32_str_3 + mov bl, 0x40 + call print + + mov dl, 0x0E + mov dh, 0x1A + call setcursorxy + + mov esi, isr32_str_4 + mov bl, 0x40 + call print + + pop dx + pop cx + pop bx + + .end: + ret diff --git a/kernel/krl_incs/text.inc b/kernel/krl_incs/text.inc new file mode 100755 index 0000000..847acfc --- /dev/null +++ b/kernel/krl_incs/text.inc @@ -0,0 +1,411 @@ +;----------------------------------------------------------; +; BOS kernel Christoffer Bubach, 2003-2005. ; +;----------------------------------------------------------; +; ; +; Textmode screen functions. ; +; ; +;----------------------------------------------------------; + +;-----------------; +; variables ; +;-----------------; + screen_rows db 25 ; all comments assume + screen_cols db 80 ; that this is 25 & 80 + cursor_pos dw 0 + + +;--------------------------------------; +; change cursor attribs ; +; in: bx = cursor attribs ; +;--------------------------------------; +changecursor: + push ax + push dx + + mov dx, 0x3D4 + mov al, 0x0A + mov ah, bh + out dx, ax + inc ax + mov ah, bl + out dx, ax + + pop dx + pop ax + ret + + +;----------------------; +; clear the screen ; +;----------------------; +cls: + push bx + push cx + + movzx cx, [screen_rows] + .loop: + call _scroll_up + loop .loop + + mov bx, 0 + call setcursor + + pop cx + pop bx + ret + + +;-----------------------------------; +; get the cursor pos ; +; out: bh = x bl = y ; +;-----------------------------------; +getcursorxy: + push ax + + call getcursor + mov ax, bx + mov bl, [screen_cols] + div bl + mov bl, al + mov bh, ah + + pop ax + ret + + +;-------------------------------; +; get the cursor pos ; +; out: bx = offset ; +;-------------------------------; +getcursor: + push ax + push dx + + mov dx, 0x3D4 + mov al, 0x0E + out dx, al + inc dx + in al, dx + mov bh, al + mov al, 0x0F + dec dx + out dx, al + inc dx + in al, dx + mov bl, al + + pop dx + pop ax + ret + + +;------------------------------; +; set the cursor to: ; +; bh = x bl = y ; +;------------------------------; +setcursorxy: + push ax + push bx + + xor ax, ax + mov al, [screen_cols] + mul bl ; bl * al = ax + movzx bx, bh + add bx, ax + call setcursor + + pop bx + pop ax + ret + + +;--------------------------; +; set the cursor to: ; +; bx = offset ; +;--------------------------; +setcursor: + push ax + push bx + push dx + + mov al, 0x0E + mov ah, bh + mov dx, 0x3D4 + out dx, ax + inc ax + mov ah, bl + out dx, ax + + pop dx + pop bx + pop ax + ret + + +;-----------------------; +; cursor position +1 ; +;-----------------------; +inccursor: + push ax + push bx + + mov al, [screen_cols] + mov bl, [screen_rows] + mul bl + dec ax + + call getcursor + cmp bx, ax ; 0x7CF = (80*25)-1 + jne .cont + call scroll_up + jmp .end + + .cont: + inc bx + call setcursor + + .end: + pop bx + pop ax + ret + + +;-----------------------; +; cursor position -1 ; +;-----------------------; +deccursor: + push bx + + call getcursor + cmp bx, 0 + je .end + + dec bx + call setcursor + + .end: + pop bx + ret + + + +;---------------------------------------; +; backspace - delete last typed char ; +;---------------------------------------; +backspace: + push bx + + call getcursor + cmp bx, 0 + je .end + + call deccursor + + mov bh, 0x07 + mov bl, 0 + call print_char + + call deccursor + + .end: + pop bx + ret + + + +;-----------------------------------------; +; print char ; +; in: bl = char, bh = attrib ; +;-----------------------------------------; +print_char: + push eax + push bx + + cmp bl, 13 + jne .cont + call new_line + jmp .done + + .cont: + cmp bl, 10 ; ignore + je .done + + push bx + call getcursor + movzx eax, bx + pop bx + + mov [es:(eax*2 + 0xB8000)], bx + + call inccursor + .done: + pop bx + pop eax + ret + + + +;------------------------------------------; +; print 32-bit hex value ; +; in: ebx = value, cl = color ; +;------------------------------------------; +print_hex32: + push eax + push ebx + push ecx + push edx + + mov eax, ebx ; quick & dirty fix so + mov bh, cl ; input reg != eax + mov ecx, 8 + + .print_it: + rol eax, 4 + movzx edx, al + and edx, 0x0F + or edx, 0x30 + cmp edx, 0x39 + jna .cont + add edx, 7 + .cont: + mov bl, dl + call print_char + loop .print_it + + pop edx + pop ecx + pop ebx + pop eax + ret + + + +;-------------------------------------------------; +; display a asciiz message on the screen ; +; in: esi = message, bl = color ; +;-------------------------------------------------; +print: + push eax + push bx + + mov ah, bl + call getcursor + mov [cursor_pos], bx + + .displaychar: + lodsb + or al, al + jz .done + + cmp al, 13 + jne .cont + mov bx, [cursor_pos] + call setcursor + call new_line + call getcursor + mov [cursor_pos], bx + jmp .displaychar + + .cont: + cmp al, 10 ; ignore + je .displaychar + movzx ebx, [cursor_pos] + mov [es:(ebx*2 + 0xB8000)], ax + inc [cursor_pos] + jmp .displaychar + + .done: + mov bx, [cursor_pos] + call setcursor ; update cursor on screen + + pop bx + pop eax + ret + + + +;-----------------------------; +; make a new line (CR, LF) ; +;-----------------------------; +new_line: + push bx + + call getcursorxy + mov bh, [screen_rows] + dec bh + cmp bl, bh ; 24 + jb .newline + + call scroll_up + jmp .done + + .newline: + call getcursorxy + mov bh, 0 + inc bl + call setcursorxy + + .done: + pop bx + ret + + + +;----------------; +; scrolling.. ; +;----------------; +scroll_up: + call _scroll_up + + .mv_curs: + push ax + push bx + + xor ax, ax + mov al, [screen_rows] ; mov bx, 80*24 + mov bl, [screen_cols] + dec al + mul bl + mov bx, ax + call setcursor + + pop bx + pop ax + ret + + _scroll_up: + push eax + push ecx + push edi + push esi + + mov edi, 0xB8000 + movzx esi, [screen_cols] + shl esi, 1 ; 80*2 = 160 + mov cl, [screen_rows] + dec cl + mov eax, esi + mul cl + shr ax, 2 ; ax = (160*24)/4 + movzx ecx, ax ; ecx = - || - + add esi, 0xB8000 ; esi = 0xB8000+160 + + rep movsd + + mov cl, [screen_cols] + shl cl, 1 ; 80*2 = 160 + mov al, [screen_rows] + dec al ; al = 24 + mul cl + movzx edi, ax + add edi, 0xB8000 ; edi = 0xB8000+160*24 + movzx ecx, [screen_cols] + shr ecx, 1 ; 80/2 + mov eax, 0x07000700 ; fill with zeros + rep stosd + + pop esi + pop edi + pop ecx + pop eax + ret \ No newline at end of file diff --git a/kernel/krl_incs/time_date.inc b/kernel/krl_incs/time_date.inc new file mode 100755 index 0000000..ba211ac --- /dev/null +++ b/kernel/krl_incs/time_date.inc @@ -0,0 +1,129 @@ +;----------------------------------------------------------; +; BOS kernel Christoffer Bubach, 2005. ; +;----------------------------------------------------------; +; ; +; functions to print date and time. ; +; ; +;----------------------------------------------------------; + +;------------------; +; variables ; +;------------------; + msg_time db 13,10,' Time: ',0 + msg_date db 13,10,' Date: ',0 + + +;------------------------------------------------------; +; date, prints current date and goes back to the ; +; prompt. swedish i.e. normal :) format ; +;------------------------------------------------------; +print_date: + push eax + push ebx + push esi + + mov esi, msg_date + mov bl, 0x07 + call print ; text.inc + call get_cmos_data ; cmos.inc + + mov al, [century] ; cmos.inc + call BCD2ascii + push eax + mov bh, 0x07 + mov bl, al + call print_char + pop eax + mov bl, ah + call print_char + + mov al, [year] + call BCD2ascii + push eax + mov bl, al + call print_char + pop eax + mov bl, ah + call print_char + + mov bl, ':' + call print_char + + mov al, [month] + call BCD2ascii + push eax + mov bl, al + call print_char + pop eax + mov bl, ah + call print_char + + mov bl, ':' + call print_char + + mov al, [day] + call BCD2ascii + push eax + mov bl, al + call print_char + pop eax + mov bl, ah + call print_char + + pop esi + pop ebx + pop eax + ret + + +;------------------------------------------------------; +; time, prints current time and goes back to the ; +; prompt. ; +;------------------------------------------------------; +print_time: + push eax + push ebx + push esi + + mov esi, msg_time + mov bl, 0x07 + call print ; text.inc + call get_cmos_data ; cmos.inc + mov al, [hour] ; cmos.inc + call BCD2ascii + push eax + mov bh, 0x07 + mov bl, al + call print_char + pop eax + mov bl, ah + call print_char + + mov bl, ':' + call print_char + + mov al, [minute] + call BCD2ascii + push eax + mov bl, al + call print_char + pop eax + mov bl, ah + call print_char + + mov bl, ':' + call print_char + + mov al, [second] + call BCD2ascii + push eax + mov bl, al + call print_char + pop eax + mov bl, ah + call print_char + + pop esi + pop ebx + pop eax + ret \ No newline at end of file diff --git a/kernel/krl_incs/timer.inc b/kernel/krl_incs/timer.inc new file mode 100755 index 0000000..29088eb --- /dev/null +++ b/kernel/krl_incs/timer.inc @@ -0,0 +1,174 @@ +;----------------------------------------------------------; +; BOS kernel Christoffer Bubach, 2005. ; +;----------------------------------------------------------; +; ; +; Function to set up the timer IRQ. ; +; ; +;----------------------------------------------------------; + +;-----------------; +; variables ; +;-----------------; + timer_wait dd 0 ; time to wait + timer_counter dd 0, 0 ; time since BOS started + call_list dd 0, 0, 0, 0, 0 ; functions to call + + +;---------------------------; +; Timer IRQ(0) ; +;---------------------------; +timer: + add dword [timer_counter], 1 ; it's just a 64-bit + adc dword [timer_counter+4], 0 ; counter since boot. + + cmp [timer_wait], 0 ; "delay" countdown. + je .test1 + dec [timer_wait] + + .test1: ; checks for calls to + cmp [call_list], dword 0 ; do before we quit. + je .test2 + call dword [call_list] + .test2: + cmp [call_list+4], dword 0 + je .test3 + call dword [call_list+4] + .test3: + cmp [call_list+8], dword 0 + je .test4 + call dword [call_list+8] + .test4: + cmp [call_list+12], dword 0 + je .test5 + call dword [call_list+12] + .test5: + cmp [call_list+16], dword 0 + je .end + call dword [call_list+16] + + .end: + mov al, 0x20 + out 0x20, al + ret + + + +;------------------------------------------------; +; add function for the timer to call ; +; in: ebx = function address ; +; out: eax = 0 if OK ; +;------------------------------------------------; +add_timercall: + cmp [call_list], 0 + jne .test2 + mov [call_list], ebx + jmp .end + .error: + mov eax, 1 + ret + .test2: + cmp [call_list+4], 0 ; since i am so lazy + jne .test3 ; and a loop can be + mov [call_list+4], ebx ; rather complicated + jmp .end ; for this stuff, i + .test3: ; check for each one.. + cmp [call_list+8], 0 ; after all, it's only 5. + jne .test4 + mov [call_list+8], ebx + jmp .end + .test4: + cmp [call_list+12], 0 + jne .test5 + mov [call_list+12], ebx + jmp .end + .test5: + cmp [call_list+16], 0 + jne .error + mov [call_list+16], ebx + .end: + xor eax, eax + ret + + + +;-------------------------------------------------; +; remove function from the call list ; +; in: ebx = function address ; +; out: eax = 0 if OK ; +;-------------------------------------------------; +remove_timercall: + cmp [call_list], ebx + jne .test2 + mov [call_list], dword 0 + jmp .end + .error: + mov eax, 1 + ret + .test2: + cmp [call_list+4], ebx + jne .test3 + mov [call_list+4], dword 0 + jmp .end + .test3: + cmp [call_list+8], ebx + jne .test4 + mov [call_list+8], dword 0 + jmp .end + .test4: + cmp [call_list+12], ebx + jne .test5 + mov [call_list+12], dword 0 + jmp .end + .test5: + cmp [call_list+16], ebx + jne .error + mov [call_list+16], dword 0 + .end: + xor eax, eax + ret + + + +;--------------------------------------------; +; delay function ; +; in: ecx = 100/second to wait ; +; out: nothing ; +;--------------------------------------------; +delay: + mov [timer_wait], ecx ; mov value to "timer" + .loop: + cmp [timer_wait], 0 + jne .loop + ret + + + +;--------------------------------------------; +; "active" delay ; +; ; +; gives the caller a pointer to the counter ; +; so that it can check for timeouts etc, ; +; itself. ; +; in: ecx = 100/second to wait ; +; out: ecx = pointer to counter ; +;--------------------------------------------; +active_delay: + mov [timer_wait], ecx ; mov value to "timer" + mov ecx, timer_wait ; let caller check value + ret + + + +;------------------------------; +; set PIT to 100Hz ; +;------------------------------; +set_pit_freq: + push eax + mov al, 0x34 ; set to 100Hz, 0x34 = 00110100b + out 0x43, al + mov al, 0x9B ; lsb 1193180 / 1193 + out 0x40, al + mov al, 0x2E ; msb + out 0x40, al + pop eax + ret \ No newline at end of file diff --git a/kernel/krl_incs/vga.inc b/kernel/krl_incs/vga.inc new file mode 100755 index 0000000..c27c62a --- /dev/null +++ b/kernel/krl_incs/vga.inc @@ -0,0 +1,221 @@ +;----------------------------------------------------------; +; BOS 0.04 Christoffer Bubach, 2004-2005. ; +;----------------------------------------------------------; +; ; +; VGA functions. Change video mode etc. ; +; ; +;----------------------------------------------------------; + + + ;-------------------; + ; VGA palettes ; + ;-------------------; + + palette256 db 00, 00, 00, 00, 10, 41, 12, 28, 18, 02, 43, 22, 35 + db 19, 09, 58, 00, 00, 57, 35, 12, 43, 43, 47, 24, 24 + db 28, 20, 24, 60, 10, 60, 15, 31, 47, 63, 62, 56, 20 + db 60, 56, 22, 63, 61, 36, 63, 63, 63, 00, 00, 00, 05 + db 05, 05, 08, 08, 08, 11, 11, 11, 14, 14, 14, 17, 17 + db 17, 20, 20, 20, 24, 24, 24, 28, 28, 28, 32, 32, 32 + db 36, 36, 36, 40, 40, 40, 45, 45, 45, 50, 50, 50, 56 + db 56, 56, 63, 63, 63, 13, 12, 15, 15, 16, 22, 17, 20 + db 29, 19, 24, 36, 21, 28, 43, 23, 31, 50, 25, 34, 57 + db 26, 42, 63, 00, 15, 02, 01, 22, 04, 02, 29, 06, 03 + db 36, 08, 04, 43, 10, 05, 50, 12, 06, 57, 14, 20, 63 + db 40, 18, 06, 07, 25, 12, 11, 33, 17, 14, 40, 23, 18 + db 48, 28, 21, 55, 34, 25, 62, 39, 27, 63, 48, 36, 15 + db 03, 02, 22, 06, 04, 29, 09, 06, 36, 12, 08, 43, 15 + db 10, 50, 18, 12, 57, 21, 14, 63, 28, 20, 15, 00, 00 + db 22, 07, 00, 29, 15, 00, 36, 23, 00, 43, 31, 00, 50 + db 39, 00, 57, 47, 00, 63, 55, 00, 15, 05, 03, 22, 11 + db 07, 29, 17, 11, 36, 23, 15, 43, 29, 19, 50, 35, 23 + db 57, 41, 27, 63, 53, 34, 28, 14, 12, 33, 20, 14, 38 + db 26, 16, 43, 32, 18, 48, 38, 20, 53, 44, 22, 58, 50 + db 24, 63, 56, 30, 05, 05, 06, 10, 10, 13, 15, 15, 20 + db 20, 20, 27, 25, 25, 34, 30, 30, 41, 35, 35, 48, 44 + db 44, 63, 03, 06, 05, 05, 11, 09, 07, 16, 13, 09, 21 + db 17, 11, 26, 21, 13, 31, 25, 15, 36, 29, 20, 48, 38 + db 06, 06, 07, 13, 13, 15, 20, 20, 23, 27, 27, 31, 34 + db 34, 39, 41, 41, 47, 48, 48, 55, 57, 57, 63, 06, 15 + db 04, 12, 22, 08, 18, 29, 12, 24, 36, 16, 30, 43, 20 + db 36, 50, 24, 42, 57, 28, 54, 63, 35, 15, 10, 10, 22 + db 16, 16, 29, 21, 21, 36, 27, 27, 43, 32, 32, 50, 38 + db 38, 57, 43, 43, 63, 54, 54, 15, 15, 06, 22, 22, 12 + db 29, 29, 18, 36, 36, 24, 43, 43, 30, 50, 50, 36, 57 + db 57, 42, 63, 63, 54, 02, 04, 14, 06, 12, 21, 10, 20 + db 28, 14, 28, 35, 18, 36, 42, 22, 44, 49, 26, 52, 56 + db 36, 63, 63, 18, 04, 14, 24, 08, 21, 31, 12, 28, 37 + db 16, 35, 44, 20, 42, 50, 24, 49, 57, 28, 56, 63, 38 + db 63, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 53, 44, 22, 09 + db 08, 12, 16, 14, 16, 22, 21, 20, 29, 27, 24, 35, 34 + db 28, 42, 40, 32, 48, 47, 36, 57, 56, 43, 08, 12, 16 + db 14, 16, 22, 21, 20, 29, 27, 24, 35, 34, 28, 42, 40 + db 32, 48, 47, 36, 57, 56, 43, 63, 13, 09, 11, 21, 16 + db 15, 27, 22, 18, 36, 29, 22, 42, 35, 25, 51, 42, 29 + db 57, 48, 32, 63, 56, 39, 06, 14, 09, 12, 21, 14, 18 + db 27, 22, 24, 33, 28, 30, 39, 36, 36, 46, 42, 42, 52 + db 47, 50, 59, 53, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00 + + +;---------------------------------; +; sets the screen to mode 0x03 ; +;---------------------------------; +set_mode_0x03: + push eax + + ;mov ax, 0x0003 ; "realmode ax", move to + ;shl eax, 16 ; the high part of eax + ;mov ax, 0x77 ; os function number for ints + ;int 0x32 + + ;mov eax, 0x00030077 ; or it could look like this. + + mov eax, 0x00030000 + mov ebx, 0x00100000 ; int no. in high part and + call rmode_int ; realmode bx in low part + + pop eax + ret + + +;---------------------------------; +; sets the screen to mode 0x13 ; +;---------------------------------; +set_mode_0x13: + push eax + push ebx + + mov eax, 0x00130000 ; realmode ax in high part + mov ebx, 0x00100000 ; int no. in high part and + call rmode_int ; realmode bx in low part + + mov esi, palette256 + call set_palette256 + + pop ebx + pop eax + ret + + +;------------------------------------; +; put a pixel at x, y with color ; +; used only in mode 0x13 ; +; ; +; input: bx = x ; +; cx = y ; +; al = color ; +; ; +; output: none. ; +;------------------------------------; +put_0x13_pixel: + push ax + push bx + push cx + push edi + + mov edi, 0xa0000 ; directly to mem + add di, bx + mov bx, cx + shl cx, 8 + shl bx, 6 + add cx, bx + add di, cx + stosb + + pop edi + pop cx + pop bx + pop ax + ret + + +;-----------------------------------------------------; +; put a sprite at x, y. only for mode 0x13 ; +; ; +; input: ax = x, bx = y, cx = width, dx = height ; +; esi = pointer to sprite ; +; ; +; output: none. ; +;-----------------------------------------------------; +put_0x13_sprite: + pushad ; this was a + .row_loop: ; nightmare to write. + dec dx ; guess how many times + push cx ; i got lost in the push + push ax ; and pops here.. ;) + .col_loop: ; not to mention what + dec cx ; time it was when i wrote + push ax ; it.. :P + push bx + push cx + mov cx, bx + mov bx, ax + lodsb + call put_0x13_pixel + pop cx + pop bx + pop ax + inc ax + cmp cx, 0 + jne .col_loop + pop ax + pop cx + inc bx + cmp dx, 0 + jne .row_loop + popad + ret + + +;---------------------------------------------; +; sets the palette (256 colors) ; +; ; +; input: esi = palette. ; +; output: none. ; +;---------------------------------------------; +set_palette256: + push ax + push cx + push dx + + xor cx, cx + .l1: + mov dx, 0x03C8 + mov al, cl ; color no. = loop no. + out dx, al + inc dx ; port 0x3C9 + mov al, byte [esi] ; red + out dx, al + inc esi + mov al, byte [esi] ; green + out dx, al + inc esi + mov al, byte [esi] ; blue + out dx, al + inc esi + + inc cx + cmp cx, 256 + jl .l1 + + pop dx + pop cx + pop ax + ret + diff --git a/kernel/realmode/a20.inc b/kernel/realmode/a20.inc new file mode 100755 index 0000000..f0ab1c8 --- /dev/null +++ b/kernel/realmode/a20.inc @@ -0,0 +1,51 @@ +;----------------------------------------------------------; +; BOS 0.04 Christoffer Bubach, 2005. ; +;----------------------------------------------------------; +; ; +; Realmode functions to set a20-gate. ; +; ; +;----------------------------------------------------------; + +;----------------------; +; enable a20 gate ; +;----------------------; +enable_a20: + in al, 0x64 ; first try.. + test al, 2 + jnz enable_a20 + mov al, 0xD1 + out 0x64, al + .d6: + in al, 0x64 + and ax, 2 + jnz .d6 + mov al, 0xDF + out 0x60, al + + call a20_test + jz .ok + + in al, 0x92 ; try again, diffrent method. + or al, 0x02 + out 0x92, al + + call a20_test + jz .ok + + ; ERROR! + ; a20-gate not set! Do something about it here... ;) + + .ok: + ret + +;------------------------; +; test if A20 is set ; +;------------------------; +a20_test: + mov al, byte [fs:0] + mov ah, al + not al + xchg al, byte [gs:0x10] + cmp ah, byte [fs:0] + mov [gs:0x10], al + ret \ No newline at end of file diff --git a/kernel/realmode/do_all_16bit.inc b/kernel/realmode/do_all_16bit.inc new file mode 100755 index 0000000..f0fb4c3 --- /dev/null +++ b/kernel/realmode/do_all_16bit.inc @@ -0,0 +1,38 @@ +;----------------------------------------------------------; +; BOS kernel Christoffer Bubach, 2005. ; +;----------------------------------------------------------; +; ; +; Do everything related to 16-bit here... :) ; +; ; +;----------------------------------------------------------; + +;---------------------; +; save info ; +;---------------------; +do_all_16bit: + call getmem ; realmode/mem.inc + mov [ram_amount - 0x10000], eax + + xor eax, eax ; clear mem for IDT and GDT + mov edi, 0x6c00 ; IDT address + mov ecx, (0x800 + 0x800)/4 + rep stosd + + mov eax, cs + shl eax, 4 + mov [gdt.BOS_16code - 0x10000 + 2], ax ; Prepare GDT by + mov [gdt.BOS_16data - 0x10000 + 2], ax ; setting 16-bit base. + shr eax, 16 + mov [gdt.BOS_16code - 0x10000 + 4], al + mov [gdt.BOS_16data - 0x10000 + 4], al + mov [gdt.BOS_16code - 0x10000 + 7], ah + mov [gdt.BOS_16data - 0x10000 + 7], ah + + lea esi, [gdt - 0x10000] + mov edi, 0x7400 ; GDT address + mov ecx, (gdt_end - gdt)/4 + rep movsd ; Move it to final pos. + + push dword 0 ; clear NT bit + popfd + ret \ No newline at end of file diff --git a/kernel/realmode/gdt.inc b/kernel/realmode/gdt.inc new file mode 100755 index 0000000..43b144f --- /dev/null +++ b/kernel/realmode/gdt.inc @@ -0,0 +1,26 @@ +;----------------------------------------------------------; +; BOS kernel Christoffer Bubach, 2004-2005. ; +;----------------------------------------------------------; +; ; +; Global Descriptor Table (GDT). ; +; ; +;----------------------------------------------------------; + +;-------------------; +; pointer to GDT ; +;-------------------; +gdtr: + .size dw gdt_end - gdt - 1 + .address dd 0x7400 ; this is where we move + ; the gdt +;-----------------------------------; +; Global Descriptor Table (GDT). ; +;-----------------------------------; +gdt: + .null dw 0x0000,0x0000,0x0000,0x0000 ; null desc. + .BOS_code: dw 0xFFFF,0x0000,0x9A00,0x00CF ; 0x08 , was 9800 before. + .BOS_data: dw 0xFFFF,0x0000,0x9200,0x00CF ; 0x10 + .BOS_16code: dw 0xFFFF,0x0000,0x9A00,0x0000 ; 0x18 + .BOS_16data: dw 0xFFFF,0x0000,0x9200,0x0000 ; 0x20 + +gdt_end: \ No newline at end of file diff --git a/kernel/realmode/idt.inc b/kernel/realmode/idt.inc new file mode 100755 index 0000000..6335776 --- /dev/null +++ b/kernel/realmode/idt.inc @@ -0,0 +1,16 @@ +;----------------------------------------------------------; +; BOS kernel Christoffer Bubach, 2003-2005. ; +;----------------------------------------------------------; +; ; +; pointer to IDT (Interrupt Description Table) ; +; ; +;----------------------------------------------------------; + + + +;-----------------; +; IDT pointer ; +;-----------------; +idtr: + .size dw 0x800 + .address dd 0x6C00 diff --git a/kernel/realmode/mem.inc b/kernel/realmode/mem.inc new file mode 100755 index 0000000..0446e02 --- /dev/null +++ b/kernel/realmode/mem.inc @@ -0,0 +1,51 @@ +;----------------------------------------------------------; +; BOS kernel Christoffer Bubach, 2003-2005. ; +;----------------------------------------------------------; +; ; +; Get memory size, only using E801 right now. ; +; ; +;----------------------------------------------------------; + +;-----------------------------------------; +; get mem ; +; in: nothing ; +; out: eax = mem in bytes, 0 = error ; +;-----------------------------------------; +getmem: + push dx + push cx + push ebx + + xor eax, eax + xor ebx, ebx + mov ax, 0xE801 + xor dx, dx + xor cx, cx + int 0x15 + jnc .cont1 + xor eax, eax + jmp .end ; failed! :'( + + .cont1: + mov si, ax + or si, bx + jne .cont + mov ax, cx + mov bx, dx + + .cont: + cmp ax, 0x3C00 + jb .below_16 + movzx eax, bx + add eax, 0x100 + shl eax, 16 ; eax = eax * 65536 + jmp .end + + .below_16: + shl eax, 10 ; eax = eax * 1024 + + .end: + pop ebx + pop cx + pop dx + ret \ No newline at end of file diff --git a/kernel/realmode/variables.inc b/kernel/realmode/variables.inc new file mode 100755 index 0000000..2ab6707 --- /dev/null +++ b/kernel/realmode/variables.inc @@ -0,0 +1,29 @@ +;----------------------------------------------------------; +; BOS kernel Christoffer Bubach, 2005. ; +;----------------------------------------------------------; +; ; +; Variabels for/from realmode. ; +; ; +;----------------------------------------------------------; + +;---------------------------------------; +; needed to get back to 16-bit mode ; +;---------------------------------------; + realmode_cs dw 0 + ridtr: dw 0x3FF + dd 0 + +;----------------; +; other stuff ; +;----------------; + int_number db 0 + realmode_error db 0 + realmode_ax dw 0 + realmode_bx dw 0 + realmode_cx dw 0 + realmode_dx dw 0 + +;-------------------; +; saved info ; +;-------------------; + ram_amount dd 0 \ No newline at end of file diff --git a/kernel/testkernels etc/font8x16.inc b/kernel/testkernels etc/font8x16.inc new file mode 100755 index 0000000..b26f778 --- /dev/null +++ b/kernel/testkernels etc/font8x16.inc @@ -0,0 +1,264 @@ +;----------------------------------------------------------; +; BOS 0.04 Christoffer Bubach, 2004-2005. ; +;----------------------------------------------------------; +; ; +; System 8x16 font.. ; +; ; +;----------------------------------------------------------; + font_8x16: + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81, 0x81, 0xA5, 0x99, 0x81, 0x81, 0x7E, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x7E, 0xFF, 0xDB, 0xFF, 0xFF, 0xDB, 0xE7, 0xFF, 0xFF, 0x7E, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0xE7, 0xE7, 0xE7, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x7E, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF + db 0x00, 0x00, 0x1E, 0x06, 0x0E, 0x1A, 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x3F, 0x33, 0x3F, 0x30, 0x30, 0x30, 0x30, 0x70, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x7F, 0x63, 0x7F, 0x63, 0x63, 0x63, 0x63, 0x67, 0xE7, 0xE6, 0xC0, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x18, 0x18, 0xDB, 0x3C, 0xE7, 0x3C, 0xDB, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFE, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x02, 0x06, 0x0E, 0x1E, 0x3E, 0xFE, 0x3E, 0x1E, 0x0E, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x7C, 0xC6, 0x60, 0x38, 0x6C, 0xC6, 0xC6, 0x6C, 0x38, 0x0C, 0xC6, 0x7C, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xFE, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6C, 0xFE, 0x6C, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7C, 0x7C, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C, 0x7C, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00 + db 0x18, 0x18, 0x7C, 0xC6, 0xC2, 0xC0, 0x7C, 0x06, 0x06, 0x86, 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0xC2, 0xC6, 0x0C, 0x18, 0x30, 0x60, 0xC6, 0x86, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xD6, 0xD6, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x3C, 0x06, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x0C, 0x0C, 0x1E, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0, 0xFC, 0x06, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x38, 0x60, 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x06, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x06, 0x0C, 0x78, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xDE, 0xDE, 0xDE, 0xDC, 0xC0, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0, 0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xDE, 0xC6, 0xC6, 0x66, 0x3A, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xE6, 0x66, 0x66, 0x6C, 0x78, 0x78, 0x6C, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xC6, 0xE6, 0xF6, 0xFE, 0xDE, 0xCE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xDE, 0x7C, 0x0C, 0x0E, 0x00, 0x00 + db 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x60, 0x38, 0x0C, 0x06, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x7E, 0x7E, 0x5A, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6, 0xFE, 0xEE, 0x6C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xC6, 0xC6, 0x6C, 0x7C, 0x38, 0x38, 0x7C, 0x6C, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xFE, 0xC6, 0x86, 0x0C, 0x18, 0x30, 0x60, 0xC2, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, 0x00, 0x00, 0x00, 0x00 + db 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00 + db 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xE0, 0x60, 0x60, 0x78, 0x6C, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x3C, 0x6C, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x38, 0x6C, 0x64, 0x60, 0xF0, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xCC, 0x78, 0x00 + db 0x00, 0x00, 0xE0, 0x60, 0x60, 0x6C, 0x76, 0x66, 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x06, 0x06, 0x00, 0x0E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3C, 0x00 + db 0x00, 0x00, 0xE0, 0x60, 0x60, 0x66, 0x6C, 0x78, 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xFE, 0xD6, 0xD6, 0xD6, 0xD6, 0xC6, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, 0x1E, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x76, 0x66, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x60, 0x38, 0x0C, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x10, 0x30, 0x30, 0xFC, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6, 0xFE, 0x6C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x38, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x0C, 0xF8, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xCC, 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x0E, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0E, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0, 0xC2, 0x66, 0x3C, 0x0C, 0x06, 0x7C, 0x00, 0x00 + db 0x00, 0x00, 0xCC, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x10, 0x38, 0x6C, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xCC, 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x38, 0x6C, 0x38, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66, 0x60, 0x60, 0x66, 0x3C, 0x0C, 0x06, 0x3C, 0x00, 0x00, 0x00 + db 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xC6, 0x00, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x60, 0x30, 0x18, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x18, 0x3C, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0xC6, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00 + db 0x38, 0x6C, 0x38, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00 + db 0x18, 0x30, 0x60, 0x00, 0xFE, 0x66, 0x60, 0x7C, 0x60, 0x60, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x76, 0x36, 0x7E, 0xD8, 0xD8, 0x6E, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x3E, 0x6C, 0xCC, 0xCC, 0xFE, 0xCC, 0xCC, 0xCC, 0xCC, 0xCE, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xC6, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x60, 0x30, 0x18, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x30, 0x78, 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x60, 0x30, 0x18, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xC6, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x0C, 0x78, 0x00 + db 0x00, 0xC6, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0xC6, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x18, 0x18, 0x3C, 0x66, 0x60, 0x60, 0x60, 0x66, 0x3C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x38, 0x6C, 0x64, 0x60, 0xF0, 0x60, 0x60, 0x60, 0x60, 0xE6, 0xFC, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18, 0x7E, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0xF8, 0xCC, 0xCC, 0xF8, 0xC4, 0xCC, 0xDE, 0xCC, 0xCC, 0xCC, 0xC6, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x0E, 0x1B, 0x18, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0xD8, 0x70, 0x00, 0x00 + db 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x0C, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x18, 0x30, 0x60, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x18, 0x30, 0x60, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x76, 0xDC, 0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00 + db 0x76, 0xDC, 0x00, 0xC6, 0xE6, 0xF6, 0xFE, 0xDE, 0xCE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x3C, 0x6C, 0x6C, 0x3E, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xC0, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0xC0, 0xC0, 0xC2, 0xC6, 0xCC, 0x18, 0x30, 0x60, 0xDC, 0x86, 0x0C, 0x18, 0x3E, 0x00, 0x00 + db 0x00, 0xC0, 0xC0, 0xC2, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xCE, 0x9E, 0x3E, 0x06, 0x06, 0x00, 0x00 + db 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6C, 0xD8, 0x6C, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x6C, 0x36, 0x6C, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44 + db 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA + db 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77 + db 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 + db 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 + db 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 + db 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 + db 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 + db 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06, 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 + db 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 + db 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 + db 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 + db 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 + db 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 + db 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 + db 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 + db 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 + db 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 + db 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 + db 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 + db 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 + db 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 + db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF + db 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0 + db 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F + db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0xD8, 0xD8, 0xD8, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0xD8, 0xCC, 0xC6, 0xC6, 0xC6, 0xCC, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0xFE, 0xC6, 0xC6, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0xFE, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xC0, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x7E, 0x18, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0x6C, 0x6C, 0x6C, 0x6C, 0xEE, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x1E, 0x30, 0x18, 0x0C, 0x3E, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xDB, 0xDB, 0xDB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x03, 0x06, 0x7E, 0xDB, 0xDB, 0xF3, 0x7E, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x1C, 0x30, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x60, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0C, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x0E, 0x1B, 0x1B, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 + db 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xD8, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7E, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x0F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xEC, 0x6C, 0x6C, 0x3C, 0x1C, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0xD8, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x70, 0xD8, 0x30, 0x60, 0xC8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 \ No newline at end of file diff --git a/kernel/testkernels etc/kernel.asm b/kernel/testkernels etc/kernel.asm new file mode 100755 index 0000000..4f1dcbb --- /dev/null +++ b/kernel/testkernels etc/kernel.asm @@ -0,0 +1,188 @@ +;------------------------------------------------------------; +; BOS - test kernel ; +;------------------------------------------------------------; +; ; +; by: Christoffer Bubach, 2003-2005 ; +; http://bos.asmhackers.net/ asmhacker@gmail.com ; +; ; +;------------------------------------------------------------; + +; 16-bit mem map (seg:off) +; 0x0000:0x0000 -> 0x0000:0x0500 BIOS stuff +; 0x0000:0x0500 -> 0x0000:0x2100 root +; 0x0000:0x2100 -> 0x0000:0x3300 fat +; 0x0000:0x3300 -> 0x0000:0x6c00 14,25kb free space +; 0x0000:0x6c00 -> 0x0000:0x7c00 IDT and GDT (256 desc. eatch) +; 0x0000:0x7c00 -> 0x0000:0x7e00 bootsector +; 0x0000:0x7e00 <- 0x0000:0xffff ~32,5kb stack for boot +; 0x1000:0x0000 -> 0x9000:0xffff 576kb free space +; 0xa000:0x0000 -> ............. VGA mem etc. + +use16 +org 0x0000 + jmp start + + include 'realmode/a20.inc' + include 'realmode/variables.inc' + ;----------------------------------------------------; + ; show a message and wait for a key before reboot ; + ;----------------------------------------------------; + first: + mov bp, first16 + mov ax, 0x1301 + mov bx, 4 + mov cx, 19 + mov dx, 0x0401 + int 0x10 + + mov ah, 0 + int 0x16 + ;int 0x19 + ret + + first16 db 'Now in 16 bit mode.' + + +;------------------------------------------; +; starting point of second stage code ; +;------------------------------------------; +start: + cli + mov ax, 0x1000 + mov ds, ax ; registers. + mov es, ax + mov ss, ax + mov sp, 0xFFFF ; Stack.. + sti + + +;----------------------; +; enable a20 gate ; +;----------------------; +a20: ; Enable A20 + in al, 0x64 + test al, 2 + jnz a20 + mov al, 0xD1 + out 0x64, al + .d6: + in al, 0x64 + and ax, 2 + jnz .d6 + mov al, 0xDF + out 0x60, al + + +;-----------------; +; display message ; +;-----------------; + call first + + +;------------------------; +; enter 32-bit mode ; +;------------------------; +pmode: + ; xor ebx, ebx + ; mov bx, ds + ; shl ebx, 4 + ; mov [BaseAddOn], ebx + ; mov eax, ebx + + ; mov [gdt.BOS_code + 2], ax + ; mov [gdt.BOS_data + 2], ax + ; mov [gdt.BOS_16code + 2], ax + ; mov [gdt.BOS_16data + 2], ax + + ; shr eax, 16 + + ; mov [gdt.BOS_code + 4], al + ; mov [gdt.BOS_data + 4], al + ; mov [gdt.BOS_16code + 4], al + ; mov [gdt.BOS_16data + 4], al + + ; mov [gdt.BOS_code + 7], ah + ; mov [gdt.BOS_data + 7], ah + ; mov [gdt.BOS_16code + 7], ah + ; mov [gdt.BOS_16data + 7], ah + + ; add ebx, gdt + + ; mov [gdtr + 2], ebx + ; add ebx, idt_start - gdt + ; mov [idtr + 2], ebx + + xor ebx,ebx + mov bx,ds ; BX=segment + shl ebx,4 ; BX="linear" address of segment base + mov eax,ebx + mov [sys_code_1 + 2],ax ; set base address of 32-bit segments + mov [sys_data_1 + 2],ax + mov [Real_code_1 + 2],ax ; set base address of 16-bit segments + mov [Real_data_1 + 2],ax + shr eax,16 + mov [sys_code_1 + 4],al + mov [sys_data_1 + 4],al + mov [Real_code_1 + 4],al + mov [Real_data_1 + 4],al + + mov [sys_code_1 + 7],ah + mov [sys_data_1 + 7],ah + mov [Real_code_1 + 7],ah + mov [Real_data_1 + 7],ah + + add ebx,gdt ; EBX=linear address of gdt + mov [gdtr + 2],ebx + + cli ; Disable interrupts, + mov ax,cs + mov [RealModeCS],ax + lgdt [gdtr] ; Load the GDT descriptor + + mov eax, cr0 ; Copy the contents of CR0 into EAX + or eax, 1 ; Set bit 0 + mov cr0, eax ; Copy the contents of EAX into CR0 + + ;jmp 10h:clear_pipe ; Jump to code segment, offset clear_pipe + + ; cli ; set protected mode (32-bit) + ; lgdt [gdtr] + ; mov eax, cr0 + ; or eax, 1 + ; mov cr0, eax + + jmp 0x08:flush + +;----------------------------------------; +; start of 32-bit area. ; +; flush segments and jump to kernel ; +;----------------------------------------; +use32 +flush: + mov eax, 0x10 ; refresh all segment registers + mov ds, eax + mov es, eax + mov fs, eax + mov gs, eax + mov ss, eax + mov esp, 0xfffc + + mov byte [ds:0B8502h], 'P' + mov byte [ds:0B8503h], 0x07 ; Assign a color code + + jmp $ ;hang + + + +;--------------------------------; +; global descriptor table (gdt) ; +;--------------------------------; +gdt: + .null: dw 0x0000, 0x0000, 0x0000, 0x0000 + .codesel: dw 0xFFFF, 0x0000, 0x9800, 0x00CF + .datasel: dw 0xFFFF, 0x0000, 0x9200, 0x00CF +gdt_end: + +gdtr: + .size: dw gdt_end - gdt - 1 + .address dd gdt ;+ 0x10000 ; 0x10000 is where we are in mem \ No newline at end of file diff --git a/kernel/testkernels etc/text.txt b/kernel/testkernels etc/text.txt new file mode 100755 index 0000000..35efa82 --- /dev/null +++ b/kernel/testkernels etc/text.txt @@ -0,0 +1,8547 @@ +00000000 E91E01 jmp 0x121 +00000003 E464 in al,0x64 +00000005 A802 test al,0x2 +00000007 75FA jnz 0x3 +00000009 B0D1 mov al,0xd1 +0000000B E664 out 0x64,al +0000000D E464 in al,0x64 +0000000F 83E002 and ax,byte +0x2 +00000012 75F9 jnz 0xd +00000014 B0DF mov al,0xdf +00000016 E660 out 0x60,al +00000018 E80E00 call 0x29 +0000001B 740B jz 0x28 +0000001D E492 in al,0x92 +0000001F 0C02 or al,0x2 +00000021 E692 out 0x92,al +00000023 E80300 call 0x29 +00000026 7400 jz 0x28 +00000028 C3 ret +00000029 64A00000 mov al,[fs:0x0] +0000002D 88C4 mov ah,al +0000002F F6D0 not al +00000031 6586061000 xchg al,[gs:0x10] +00000036 643A260000 cmp ah,[fs:0x0] +0000003B 65A21000 mov [gs:0x10],al +0000003F C3 ret +00000040 27 daa +00000041 0000 add [bx+si],al +00000043 7400 jz 0x45 +00000045 0000 add [bx+si],al +00000047 0000 add [bx+si],al +00000049 0000 add [bx+si],al +0000004B 0000 add [bx+si],al +0000004D 00FF add bh,bh +0000004F FF00 inc word [bx+si] +00000051 0000 add [bx+si],al +00000053 9ACF00FFFF call 0xffff:0xcf +00000058 0000 add [bx+si],al +0000005A 0092CF00 add [bp+si+0xcf],dl +0000005E FF db 0xFF +0000005F FF00 inc word [bx+si] +00000061 0000 add [bx+si],al +00000063 9A0000FFFF call 0xffff:0x0 +00000068 0000 add [bx+si],al +0000006A 00920000 add [bp+si+0x0],dl +0000006E 0008 add [bx+si],cl +00000070 006C00 add [si+0x0],ch +00000073 005251 add [bp+si+0x51],dl +00000076 6653 push ebx +00000078 6631C0 xor eax,eax +0000007B 6631DB xor ebx,ebx +0000007E B801E8 mov ax,0xe801 +00000081 31D2 xor dx,dx +00000083 31C9 xor cx,cx +00000085 CD15 int 0x15 +00000087 7305 jnc 0x8e +00000089 6631C0 xor eax,eax +0000008C EB23 jmp short 0xb1 +0000008E 89C6 mov si,ax +00000090 09DE or si,bx +00000092 7504 jnz 0x98 +00000094 89C8 mov ax,cx +00000096 89D3 mov bx,dx +00000098 3D003C cmp ax,0x3c00 +0000009B 7210 jc 0xad +0000009D 660FB7C3 movzx eax,bx +000000A1 660500010000 add eax,0x100 +000000A7 66C1E010 shl eax,0x10 +000000AB EB04 jmp short 0xb1 +000000AD 66C1E00A shl eax,0xa +000000B1 665B pop ebx +000000B3 59 pop cx +000000B4 5A pop dx +000000B5 C3 ret +000000B6 0000 add [bx+si],al +000000B8 FF03 inc word [bp+di] +000000BA 0000 add [bx+si],al +000000BC 0000 add [bx+si],al +000000BE 0000 add [bx+si],al +000000C0 0000 add [bx+si],al +000000C2 0000 add [bx+si],al +000000C4 0000 add [bx+si],al +000000C6 0000 add [bx+si],al +000000C8 0000 add [bx+si],al +000000CA 0000 add [bx+si],al +000000CC E8A5FF call 0x74 +000000CF 66A3C800 mov [0xc8],eax +000000D3 6631C0 xor eax,eax +000000D6 66BF006C0000 mov edi,0x6c00 +000000DC 66B900040000 mov ecx,0x400 +000000E2 F366AB rep stosd +000000E5 668CC8 mov eax,cs +000000E8 66C1E004 shl eax,0x4 +000000EC A36000 mov [0x60],ax +000000EF A36800 mov [0x68],ax +000000F2 66C1E810 shr eax,0x10 +000000F6 A26200 mov [0x62],al +000000F9 A26A00 mov [0x6a],al +000000FC 88266500 mov [0x65],ah +00000100 88266D00 mov [0x6d],ah +00000104 668D364600 lea esi,[0x46] +00000109 66BF00740000 mov edi,0x7400 +0000010F 66B90A000000 mov ecx,0xa +00000115 F366A5 rep movsd +00000118 666800000000 push dword 0x0 +0000011E 669D popfd +00000120 C3 ret +00000121 FA cli +00000122 8CC8 mov ax,cs +00000124 8ED8 mov ds,ax +00000126 6631C0 xor eax,eax +00000129 8EC0 mov es,ax +0000012B 8EE0 mov fs,ax +0000012D 8EE8 mov gs,ax +0000012F FB sti +00000130 E8D0FE call 0x3 +00000133 E896FF call 0xcc +00000136 FA cli +00000137 8CC8 mov ax,cs +00000139 A3B600 mov [0xb6],ax +0000013C 0F01164000 lgdt [0x40] +00000141 0F011E6E00 lidt [0x6e] +00000146 0F20C0 mov eax,cr0 +00000149 0C01 or al,0x1 +0000014B 0F22C0 mov cr0,eax +0000014E 66EA560101000800 jmp dword 0x8:0x10156 +00000156 66B810008ED8 mov eax,0xd88e0010 +0000015C 8EC0 mov es,ax +0000015E 8EE0 mov fs,ax +00000160 8EE8 mov gs,ax +00000162 8ED0 mov ss,ax +00000164 BCFCFF mov sp,0xfffc +00000167 0000 add [bx+si],al +00000169 E85607 call 0x8c2 +0000016C 0000 add [bx+si],al +0000016E 66BBB104E850 mov ebx,0x50e804b1 +00000174 050000 add ax,0x0 +00000177 BEA40A mov si,0xaa4 +0000017A 0100 add [bx+si],ax +0000017C B307 mov bl,0x7 +0000017E E82C06 call 0x7ad +00000181 0000 add [bx+si],al +00000183 E8F210 call 0x1278 +00000186 0000 add [bx+si],al +00000188 E90B11 jmp 0x1296 +0000018B 0000 add [bx+si],al +0000018D FA cli +0000018E F4 hlt +0000018F EBFC jmp short 0x18d +00000191 50 push ax +00000192 51 push cx +00000193 B90000 mov cx,0x0 +00000196 0000 add [bx+si],al +00000198 89F8 mov ax,di +0000019A 668981006C mov [bx+di+0x6c00],eax +0000019F 0000 add [bx+si],al +000001A1 83C102 add cx,byte +0x2 +000001A4 C781006C0000 mov word [bx+di+0x6c00],0x0 +000001AA 0800 or [bx+si],al +000001AC 008E83C1 add [bp+0xc183],cl +000001B0 0489 add al,0x89 +000001B2 F8 clc +000001B3 C1E810 shr ax,0x10 +000001B6 668981006C mov [bx+di+0x6c00],eax +000001BB 0000 add [bx+si],al +000001BD 83C102 add cx,byte +0x2 +000001C0 81F90008 cmp cx,0x800 +000001C4 0000 add [bx+si],al +000001C6 72D0 jc 0x198 +000001C8 59 pop cx +000001C9 58 pop ax +000001CA C3 ret +000001CB 50 push ax +000001CC 51 push cx +000001CD B008 mov al,0x8 +000001CF F6E1 mul cl +000001D1 0F db 0x0F +000001D2 B7C8 mov bh,0xc8 +000001D4 89B83202 mov [bx+si+0x232],di +000001D8 0100 add [bx+si],ax +000001DA 89F8 mov ax,di +000001DC 668981006C mov [bx+di+0x6c00],eax +000001E1 0000 add [bx+si],al +000001E3 83C102 add cx,byte +0x2 +000001E6 C781006C0000 mov word [bx+di+0x6c00],0x0 +000001EC 0800 or [bx+si],al +000001EE 008E83C1 add [bp+0xc183],cl +000001F2 0489 add al,0x89 +000001F4 F8 clc +000001F5 C1E810 shr ax,0x10 +000001F8 668981006C mov [bx+di+0x6c00],eax +000001FD 0000 add [bx+si],al +000001FF 59 pop cx +00000200 58 pop ax +00000201 C3 ret +00000202 50 push ax +00000203 B80400 mov ax,0x4 +00000206 0000 add [bx+si],al +00000208 F6E1 mul cl +0000020A BE3202 mov si,0x232 +0000020D 0100 add [bx+si],ax +0000020F 01C6 add si,ax +00000211 58 pop ax +00000212 C3 ret +00000213 50 push ax +00000214 57 push di +00000215 B90000 mov cx,0x0 +00000218 0000 add [bx+si],al +0000021A AD lodsw +0000021B 09C0 or ax,ax +0000021D 7407 jz 0x226 +0000021F 89C7 mov di,ax +00000221 E8A5FF call 0x1c9 +00000224 FF db 0xFF +00000225 FF4181 inc word [bx+di-0x7f] +00000228 F9 stc +00000229 0001 add [bx+di],al +0000022B 0000 add [bx+si],al +0000022D 72EB jc 0x21a +0000022F 5F pop di +00000230 58 pop ax +00000231 C3 ret +00000232 631E0100 arpl [0x1],bx +00000236 D81E0100 fcomp dword [0x1] +0000023A 4D dec bp +0000023B 1F pop ds +0000023C 0100 add [bx+si],ax +0000023E C21F01 ret 0x11f +00000241 0037 add [bx],dh +00000243 2001 and [bx+di],al +00000245 00AC2001 add [si+0x120],ch +00000249 0021 add [bx+di],ah +0000024B 2101 and [bx+di],ax +0000024D 00962101 add [bp+0x121],dl +00000251 000B add [bp+di],cl +00000253 2201 and al,[bx+di] +00000255 00802201 add [bx+si+0x122],al +00000259 00F5 add ch,dh +0000025B 2201 and al,[bx+di] +0000025D 006A23 add [bp+si+0x23],ch +00000260 0100 add [bx+si],ax +00000262 DF23 fbld tword [bp+di] +00000264 0100 add [bx+si],ax +00000266 54 push sp +00000267 2401 and al,0x1 +00000269 00C9 add cl,cl +0000026B 2401 and al,0x1 +0000026D 0000 add [bx+si],al +0000026F 0000 add [bx+si],al +00000271 003E2501 add [0x125],bh +00000275 00B32501 add [bp+di+0x125],dh +00000279 0028 add [bx+si],ch +0000027B 260100 add [es:bx+si],ax +0000027E 9D popf +0000027F 260100 add [es:bx+si],ax +00000282 0000 add [bx+si],al +00000284 0000 add [bx+si],al +00000286 0000 add [bx+si],al +00000288 0000 add [bx+si],al +0000028A 0000 add [bx+si],al +0000028C 0000 add [bx+si],al +0000028E 0000 add [bx+si],al +00000290 0000 add [bx+si],al +00000292 0000 add [bx+si],al +00000294 0000 add [bx+si],al +00000296 0000 add [bx+si],al +00000298 0000 add [bx+si],al +0000029A 0000 add [bx+si],al +0000029C 0000 add [bx+si],al +0000029E 0000 add [bx+si],al +000002A0 0000 add [bx+si],al +000002A2 0000 add [bx+si],al +000002A4 0000 add [bx+si],al +000002A6 0000 add [bx+si],al +000002A8 0000 add [bx+si],al +000002AA 0000 add [bx+si],al +000002AC 0000 add [bx+si],al +000002AE 0000 add [bx+si],al +000002B0 0000 add [bx+si],al +000002B2 1227 adc ah,[bx] +000002B4 0100 add [bx+si],ax +000002B6 2627 es daa +000002B8 0100 add [bx+si],ax +000002BA 0000 add [bx+si],al +000002BC 0000 add [bx+si],al +000002BE 0000 add [bx+si],al +000002C0 0000 add [bx+si],al +000002C2 0000 add [bx+si],al +000002C4 0000 add [bx+si],al +000002C6 0000 add [bx+si],al +000002C8 0000 add [bx+si],al +000002CA 0000 add [bx+si],al +000002CC 0000 add [bx+si],al +000002CE 0000 add [bx+si],al +000002D0 0000 add [bx+si],al +000002D2 0000 add [bx+si],al +000002D4 0000 add [bx+si],al +000002D6 0000 add [bx+si],al +000002D8 0000 add [bx+si],al +000002DA 0000 add [bx+si],al +000002DC 0000 add [bx+si],al +000002DE 0000 add [bx+si],al +000002E0 0000 add [bx+si],al +000002E2 0000 add [bx+si],al +000002E4 0000 add [bx+si],al +000002E6 0000 add [bx+si],al +000002E8 0000 add [bx+si],al +000002EA 0000 add [bx+si],al +000002EC 0000 add [bx+si],al +000002EE 0000 add [bx+si],al +000002F0 0000 add [bx+si],al +000002F2 0000 add [bx+si],al +000002F4 0000 add [bx+si],al +000002F6 0000 add [bx+si],al +000002F8 0000 add [bx+si],al +000002FA 3C27 cmp al,0x27 +000002FC 0100 add [bx+si],ax +000002FE 0000 add [bx+si],al +00000300 0000 add [bx+si],al +00000302 0000 add [bx+si],al +00000304 0000 add [bx+si],al +00000306 0000 add [bx+si],al +00000308 0000 add [bx+si],al +0000030A 0000 add [bx+si],al +0000030C 0000 add [bx+si],al +0000030E 0000 add [bx+si],al +00000310 0000 add [bx+si],al +00000312 0000 add [bx+si],al +00000314 0000 add [bx+si],al +00000316 0000 add [bx+si],al +00000318 0000 add [bx+si],al +0000031A 0000 add [bx+si],al +0000031C 0000 add [bx+si],al +0000031E 0000 add [bx+si],al +00000320 0000 add [bx+si],al +00000322 0000 add [bx+si],al +00000324 0000 add [bx+si],al +00000326 0000 add [bx+si],al +00000328 0000 add [bx+si],al +0000032A 0000 add [bx+si],al +0000032C 0000 add [bx+si],al +0000032E 0000 add [bx+si],al +00000330 0000 add [bx+si],al +00000332 0000 add [bx+si],al +00000334 0000 add [bx+si],al +00000336 0000 add [bx+si],al +00000338 0000 add [bx+si],al +0000033A 0000 add [bx+si],al +0000033C 0000 add [bx+si],al +0000033E 0000 add [bx+si],al +00000340 0000 add [bx+si],al +00000342 0000 add [bx+si],al +00000344 0000 add [bx+si],al +00000346 0000 add [bx+si],al +00000348 0000 add [bx+si],al +0000034A 0000 add [bx+si],al +0000034C 0000 add [bx+si],al +0000034E 0000 add [bx+si],al +00000350 0000 add [bx+si],al +00000352 0000 add [bx+si],al +00000354 0000 add [bx+si],al +00000356 0000 add [bx+si],al +00000358 0000 add [bx+si],al +0000035A 0000 add [bx+si],al +0000035C 0000 add [bx+si],al +0000035E 0000 add [bx+si],al +00000360 0000 add [bx+si],al +00000362 0000 add [bx+si],al +00000364 0000 add [bx+si],al +00000366 0000 add [bx+si],al +00000368 0000 add [bx+si],al +0000036A 0000 add [bx+si],al +0000036C 0000 add [bx+si],al +0000036E 0000 add [bx+si],al +00000370 0000 add [bx+si],al +00000372 0000 add [bx+si],al +00000374 0000 add [bx+si],al +00000376 0000 add [bx+si],al +00000378 0000 add [bx+si],al +0000037A 0000 add [bx+si],al +0000037C 0000 add [bx+si],al +0000037E 0000 add [bx+si],al +00000380 0000 add [bx+si],al +00000382 0000 add [bx+si],al +00000384 0000 add [bx+si],al +00000386 0000 add [bx+si],al +00000388 0000 add [bx+si],al +0000038A 0000 add [bx+si],al +0000038C 0000 add [bx+si],al +0000038E 0000 add [bx+si],al +00000390 0000 add [bx+si],al +00000392 0000 add [bx+si],al +00000394 0000 add [bx+si],al +00000396 0000 add [bx+si],al +00000398 0000 add [bx+si],al +0000039A 0000 add [bx+si],al +0000039C 0000 add [bx+si],al +0000039E 0000 add [bx+si],al +000003A0 0000 add [bx+si],al +000003A2 0000 add [bx+si],al +000003A4 0000 add [bx+si],al +000003A6 0000 add [bx+si],al +000003A8 0000 add [bx+si],al +000003AA 0000 add [bx+si],al +000003AC 0000 add [bx+si],al +000003AE 0000 add [bx+si],al +000003B0 0000 add [bx+si],al +000003B2 0000 add [bx+si],al +000003B4 0000 add [bx+si],al +000003B6 0000 add [bx+si],al +000003B8 0000 add [bx+si],al +000003BA 0000 add [bx+si],al +000003BC 0000 add [bx+si],al +000003BE 0000 add [bx+si],al +000003C0 0000 add [bx+si],al +000003C2 0000 add [bx+si],al +000003C4 0000 add [bx+si],al +000003C6 0000 add [bx+si],al +000003C8 0000 add [bx+si],al +000003CA 0000 add [bx+si],al +000003CC 0000 add [bx+si],al +000003CE 0000 add [bx+si],al +000003D0 0000 add [bx+si],al +000003D2 0000 add [bx+si],al +000003D4 0000 add [bx+si],al +000003D6 0000 add [bx+si],al +000003D8 0000 add [bx+si],al +000003DA 0000 add [bx+si],al +000003DC 0000 add [bx+si],al +000003DE 0000 add [bx+si],al +000003E0 0000 add [bx+si],al +000003E2 0000 add [bx+si],al +000003E4 0000 add [bx+si],al +000003E6 0000 add [bx+si],al +000003E8 0000 add [bx+si],al +000003EA 0000 add [bx+si],al +000003EC 0000 add [bx+si],al +000003EE 0000 add [bx+si],al +000003F0 0000 add [bx+si],al +000003F2 0000 add [bx+si],al +000003F4 0000 add [bx+si],al +000003F6 0000 add [bx+si],al +000003F8 0000 add [bx+si],al +000003FA 0000 add [bx+si],al +000003FC 0000 add [bx+si],al +000003FE 0000 add [bx+si],al +00000400 0000 add [bx+si],al +00000402 0000 add [bx+si],al +00000404 0000 add [bx+si],al +00000406 0000 add [bx+si],al +00000408 0000 add [bx+si],al +0000040A 0000 add [bx+si],al +0000040C 0000 add [bx+si],al +0000040E 0000 add [bx+si],al +00000410 0000 add [bx+si],al +00000412 0000 add [bx+si],al +00000414 0000 add [bx+si],al +00000416 0000 add [bx+si],al +00000418 0000 add [bx+si],al +0000041A 0000 add [bx+si],al +0000041C 0000 add [bx+si],al +0000041E 0000 add [bx+si],al +00000420 0000 add [bx+si],al +00000422 0000 add [bx+si],al +00000424 0000 add [bx+si],al +00000426 0000 add [bx+si],al +00000428 0000 add [bx+si],al +0000042A 0000 add [bx+si],al +0000042C 0000 add [bx+si],al +0000042E 0000 add [bx+si],al +00000430 0000 add [bx+si],al +00000432 0000 add [bx+si],al +00000434 0000 add [bx+si],al +00000436 0000 add [bx+si],al +00000438 0000 add [bx+si],al +0000043A 0000 add [bx+si],al +0000043C 0000 add [bx+si],al +0000043E 0000 add [bx+si],al +00000440 0000 add [bx+si],al +00000442 0000 add [bx+si],al +00000444 0000 add [bx+si],al +00000446 0000 add [bx+si],al +00000448 0000 add [bx+si],al +0000044A 0000 add [bx+si],al +0000044C 0000 add [bx+si],al +0000044E 0000 add [bx+si],al +00000450 0000 add [bx+si],al +00000452 0000 add [bx+si],al +00000454 0000 add [bx+si],al +00000456 0000 add [bx+si],al +00000458 0000 add [bx+si],al +0000045A 0000 add [bx+si],al +0000045C 0000 add [bx+si],al +0000045E 0000 add [bx+si],al +00000460 0000 add [bx+si],al +00000462 0000 add [bx+si],al +00000464 0000 add [bx+si],al +00000466 0000 add [bx+si],al +00000468 0000 add [bx+si],al +0000046A 0000 add [bx+si],al +0000046C 0000 add [bx+si],al +0000046E 0000 add [bx+si],al +00000470 0000 add [bx+si],al +00000472 0000 add [bx+si],al +00000474 0000 add [bx+si],al +00000476 0000 add [bx+si],al +00000478 0000 add [bx+si],al +0000047A 0000 add [bx+si],al +0000047C 0000 add [bx+si],al +0000047E 0000 add [bx+si],al +00000480 0000 add [bx+si],al +00000482 0000 add [bx+si],al +00000484 0000 add [bx+si],al +00000486 0000 add [bx+si],al +00000488 0000 add [bx+si],al +0000048A 0000 add [bx+si],al +0000048C 0000 add [bx+si],al +0000048E 0000 add [bx+si],al +00000490 0000 add [bx+si],al +00000492 0000 add [bx+si],al +00000494 0000 add [bx+si],al +00000496 0000 add [bx+si],al +00000498 0000 add [bx+si],al +0000049A 0000 add [bx+si],al +0000049C 0000 add [bx+si],al +0000049E 0000 add [bx+si],al +000004A0 0000 add [bx+si],al +000004A2 0000 add [bx+si],al +000004A4 0000 add [bx+si],al +000004A6 0000 add [bx+si],al +000004A8 0000 add [bx+si],al +000004AA 0000 add [bx+si],al +000004AC 0000 add [bx+si],al +000004AE 0000 add [bx+si],al +000004B0 0000 add [bx+si],al +000004B2 0000 add [bx+si],al +000004B4 0000 add [bx+si],al +000004B6 0000 add [bx+si],al +000004B8 0000 add [bx+si],al +000004BA 0000 add [bx+si],al +000004BC 0000 add [bx+si],al +000004BE 0000 add [bx+si],al +000004C0 0000 add [bx+si],al +000004C2 0000 add [bx+si],al +000004C4 0000 add [bx+si],al +000004C6 0000 add [bx+si],al +000004C8 0000 add [bx+si],al +000004CA 0000 add [bx+si],al +000004CC 0000 add [bx+si],al +000004CE 0000 add [bx+si],al +000004D0 0000 add [bx+si],al +000004D2 0000 add [bx+si],al +000004D4 0000 add [bx+si],al +000004D6 0000 add [bx+si],al +000004D8 0000 add [bx+si],al +000004DA 0000 add [bx+si],al +000004DC 0000 add [bx+si],al +000004DE 0000 add [bx+si],al +000004E0 0000 add [bx+si],al +000004E2 0000 add [bx+si],al +000004E4 0000 add [bx+si],al +000004E6 0000 add [bx+si],al +000004E8 0000 add [bx+si],al +000004EA 0000 add [bx+si],al +000004EC 0000 add [bx+si],al +000004EE 0000 add [bx+si],al +000004F0 0000 add [bx+si],al +000004F2 0000 add [bx+si],al +000004F4 0000 add [bx+si],al +000004F6 0000 add [bx+si],al +000004F8 0000 add [bx+si],al +000004FA 0000 add [bx+si],al +000004FC 0000 add [bx+si],al +000004FE 0000 add [bx+si],al +00000500 0000 add [bx+si],al +00000502 0000 add [bx+si],al +00000504 0000 add [bx+si],al +00000506 0000 add [bx+si],al +00000508 0000 add [bx+si],al +0000050A 0000 add [bx+si],al +0000050C 0000 add [bx+si],al +0000050E 0000 add [bx+si],al +00000510 0000 add [bx+si],al +00000512 0000 add [bx+si],al +00000514 0000 add [bx+si],al +00000516 0000 add [bx+si],al +00000518 0000 add [bx+si],al +0000051A 0000 add [bx+si],al +0000051C 0000 add [bx+si],al +0000051E 0000 add [bx+si],al +00000520 0000 add [bx+si],al +00000522 0000 add [bx+si],al +00000524 0000 add [bx+si],al +00000526 0000 add [bx+si],al +00000528 0000 add [bx+si],al +0000052A 0000 add [bx+si],al +0000052C 0000 add [bx+si],al +0000052E 0000 add [bx+si],al +00000530 0000 add [bx+si],al +00000532 0000 add [bx+si],al +00000534 0000 add [bx+si],al +00000536 0000 add [bx+si],al +00000538 0000 add [bx+si],al +0000053A 0000 add [bx+si],al +0000053C 0000 add [bx+si],al +0000053E 0000 add [bx+si],al +00000540 0000 add [bx+si],al +00000542 0000 add [bx+si],al +00000544 0000 add [bx+si],al +00000546 0000 add [bx+si],al +00000548 0000 add [bx+si],al +0000054A 0000 add [bx+si],al +0000054C 0000 add [bx+si],al +0000054E 0000 add [bx+si],al +00000550 0000 add [bx+si],al +00000552 0000 add [bx+si],al +00000554 0000 add [bx+si],al +00000556 0000 add [bx+si],al +00000558 0000 add [bx+si],al +0000055A 0000 add [bx+si],al +0000055C 0000 add [bx+si],al +0000055E 0000 add [bx+si],al +00000560 0000 add [bx+si],al +00000562 0000 add [bx+si],al +00000564 0000 add [bx+si],al +00000566 0000 add [bx+si],al +00000568 0000 add [bx+si],al +0000056A 0000 add [bx+si],al +0000056C 0000 add [bx+si],al +0000056E 0000 add [bx+si],al +00000570 0000 add [bx+si],al +00000572 0000 add [bx+si],al +00000574 0000 add [bx+si],al +00000576 0000 add [bx+si],al +00000578 0000 add [bx+si],al +0000057A 0000 add [bx+si],al +0000057C 0000 add [bx+si],al +0000057E 0000 add [bx+si],al +00000580 0000 add [bx+si],al +00000582 0000 add [bx+si],al +00000584 0000 add [bx+si],al +00000586 0000 add [bx+si],al +00000588 0000 add [bx+si],al +0000058A 0000 add [bx+si],al +0000058C 0000 add [bx+si],al +0000058E 0000 add [bx+si],al +00000590 0000 add [bx+si],al +00000592 0000 add [bx+si],al +00000594 0000 add [bx+si],al +00000596 0000 add [bx+si],al +00000598 0000 add [bx+si],al +0000059A 0000 add [bx+si],al +0000059C 0000 add [bx+si],al +0000059E 0000 add [bx+si],al +000005A0 0000 add [bx+si],al +000005A2 0000 add [bx+si],al +000005A4 0000 add [bx+si],al +000005A6 0000 add [bx+si],al +000005A8 0000 add [bx+si],al +000005AA 0000 add [bx+si],al +000005AC 0000 add [bx+si],al +000005AE 0000 add [bx+si],al +000005B0 0000 add [bx+si],al +000005B2 0000 add [bx+si],al +000005B4 0000 add [bx+si],al +000005B6 0000 add [bx+si],al +000005B8 0000 add [bx+si],al +000005BA 0000 add [bx+si],al +000005BC 0000 add [bx+si],al +000005BE 0000 add [bx+si],al +000005C0 0000 add [bx+si],al +000005C2 0000 add [bx+si],al +000005C4 0000 add [bx+si],al +000005C6 0000 add [bx+si],al +000005C8 0000 add [bx+si],al +000005CA 0000 add [bx+si],al +000005CC 0000 add [bx+si],al +000005CE 0000 add [bx+si],al +000005D0 0000 add [bx+si],al +000005D2 0000 add [bx+si],al +000005D4 0000 add [bx+si],al +000005D6 0000 add [bx+si],al +000005D8 0000 add [bx+si],al +000005DA 0000 add [bx+si],al +000005DC 0000 add [bx+si],al +000005DE 0000 add [bx+si],al +000005E0 0000 add [bx+si],al +000005E2 0000 add [bx+si],al +000005E4 0000 add [bx+si],al +000005E6 0000 add [bx+si],al +000005E8 0000 add [bx+si],al +000005EA 0000 add [bx+si],al +000005EC 0000 add [bx+si],al +000005EE 0000 add [bx+si],al +000005F0 0000 add [bx+si],al +000005F2 0000 add [bx+si],al +000005F4 0000 add [bx+si],al +000005F6 0000 add [bx+si],al +000005F8 0000 add [bx+si],al +000005FA 0000 add [bx+si],al +000005FC 0000 add [bx+si],al +000005FE 0000 add [bx+si],al +00000600 0000 add [bx+si],al +00000602 0000 add [bx+si],al +00000604 0000 add [bx+si],al +00000606 0000 add [bx+si],al +00000608 0000 add [bx+si],al +0000060A 0000 add [bx+si],al +0000060C 0000 add [bx+si],al +0000060E 0000 add [bx+si],al +00000610 0000 add [bx+si],al +00000612 0000 add [bx+si],al +00000614 0000 add [bx+si],al +00000616 0000 add [bx+si],al +00000618 0000 add [bx+si],al +0000061A 0000 add [bx+si],al +0000061C 0000 add [bx+si],al +0000061E 0000 add [bx+si],al +00000620 0000 add [bx+si],al +00000622 0000 add [bx+si],al +00000624 0000 add [bx+si],al +00000626 0000 add [bx+si],al +00000628 0000 add [bx+si],al +0000062A 0000 add [bx+si],al +0000062C 0000 add [bx+si],al +0000062E 0000 add [bx+si],al +00000630 0000 add [bx+si],al +00000632 195000 sbb [bx+si+0x0],dx +00000635 006650 add [bp+0x50],ah +00000638 6652 push edx +0000063A 66BAD403B00A mov edx,0xab003d4 +00000640 88FC mov ah,bh +00000642 66EF out dx,eax +00000644 6640 inc eax +00000646 88DC mov ah,bl +00000648 66EF out dx,eax +0000064A 665A pop edx +0000064C 6658 pop eax +0000064E C3 ret +0000064F 6653 push ebx +00000651 6651 push ecx +00000653 660FB60D movzx ecx,byte [di] +00000657 32060100 xor al,[0x1] +0000065B E80802 call 0x866 +0000065E 0000 add [bx+si],al +00000660 E2F9 loop 0x65b +00000662 66BB0000E85C mov ebx,0x5ce80000 +00000668 0000 add [bx+si],al +0000066A 006659 add [bp+0x59],ah +0000066D 665B pop ebx +0000066F C3 ret +00000670 6650 push eax +00000672 E81200 call 0x687 +00000675 0000 add [bx+si],al +00000677 6689D8 mov eax,ebx +0000067A 8A1D mov bl,[di] +0000067C 33060100 xor ax,[0x1] +00000680 F6F3 div bl +00000682 88C3 mov bl,al +00000684 88E7 mov bh,ah +00000686 6658 pop eax +00000688 C3 ret +00000689 6650 push eax +0000068B 6652 push edx +0000068D 66BAD403B00E mov edx,0xeb003d4 +00000693 EE out dx,al +00000694 6642 inc edx +00000696 EC in al,dx +00000697 88C7 mov bh,al +00000699 B00F mov al,0xf +0000069B 664A dec edx +0000069D EE out dx,al +0000069E 6642 inc edx +000006A0 EC in al,dx +000006A1 88C3 mov bl,al +000006A3 665A pop edx +000006A5 6658 pop eax +000006A7 C3 ret +000006A8 6650 push eax +000006AA 6653 push ebx +000006AC 6631C0 xor eax,eax +000006AF A03306 mov al,[0x633] +000006B2 0100 add [bx+si],ax +000006B4 F6E3 mul bl +000006B6 660FB6DF movzx ebx,bh +000006BA 6601C3 add ebx,eax +000006BD E80500 call 0x6c5 +000006C0 0000 add [bx+si],al +000006C2 665B pop ebx +000006C4 6658 pop eax +000006C6 C3 ret +000006C7 6650 push eax +000006C9 6653 push ebx +000006CB 6652 push edx +000006CD B00E mov al,0xe +000006CF 88FC mov ah,bh +000006D1 66BAD40366EF mov edx,0xef6603d4 +000006D7 6640 inc eax +000006D9 88DC mov ah,bl +000006DB 66EF out dx,eax +000006DD 665A pop edx +000006DF 665B pop ebx +000006E1 6658 pop eax +000006E3 C3 ret +000006E4 6650 push eax +000006E6 6653 push ebx +000006E8 A03306 mov al,[0x633] +000006EB 0100 add [bx+si],ax +000006ED 8A1D mov bl,[di] +000006EF 32060100 xor al,[0x1] +000006F3 F6E3 mul bl +000006F5 6648 dec eax +000006F7 E88DFF call 0x687 +000006FA FF db 0xFF +000006FB FF6639 jmp near [bp+0x39] +000006FE C3 ret +000006FF 7507 jnz 0x708 +00000701 E83A01 call 0x83e +00000704 0000 add [bx+si],al +00000706 EB07 jmp short 0x70f +00000708 6643 inc ebx +0000070A E8B8FF call 0x6c5 +0000070D FF db 0xFF +0000070E FF665B jmp near [bp+0x5b] +00000711 6658 pop eax +00000713 C3 ret +00000714 6653 push ebx +00000716 E86EFF call 0x687 +00000719 FF db 0xFF +0000071A FF6683 jmp near [bp-0x7d] +0000071D FB sti +0000071E 007407 add [si+0x7],dh +00000721 664B dec ebx +00000723 E89FFF call 0x6c5 +00000726 FF db 0xFF +00000727 FF665B jmp near [bp+0x5b] +0000072A C3 ret +0000072B 6653 push ebx +0000072D E857FF call 0x687 +00000730 FF db 0xFF +00000731 FF6683 jmp near [bp-0x7d] +00000734 FB sti +00000735 007413 add [si+0x13],dh +00000738 E8D7FF call 0x712 +0000073B FF db 0xFF +0000073C FFB707B3 push word [bx+0xb307] +00000740 00E8 add al,ch +00000742 0800 or [bx+si],al +00000744 0000 add [bx+si],al +00000746 E8C9FF call 0x712 +00000749 FF db 0xFF +0000074A FF665B jmp near [bp+0x5b] +0000074D C3 ret +0000074E 50 push ax +0000074F 6653 push ebx +00000751 80FB0D cmp bl,0xd +00000754 7507 jnz 0x75d +00000756 E8BA00 call 0x813 +00000759 0000 add [bx+si],al +0000075B EB1F jmp short 0x77c +0000075D 80FB0A cmp bl,0xa +00000760 741A jz 0x77c +00000762 6653 push ebx +00000764 E820FF call 0x687 +00000767 FF db 0xFF +00000768 FF0F dec word [bx] +0000076A B7C3 mov bh,0xc3 +0000076C 665B pop ebx +0000076E 2666899C0000 mov [es:si+0x0],ebx +00000774 800B00 or byte [bp+di],0x0 +00000777 E868FF call 0x6e2 +0000077A FF db 0xFF +0000077B FF665B jmp near [bp+0x5b] +0000077E 58 pop ax +0000077F C3 ret +00000780 50 push ax +00000781 53 push bx +00000782 51 push cx +00000783 52 push dx +00000784 89D8 mov ax,bx +00000786 88CF mov bh,cl +00000788 B90800 mov cx,0x8 +0000078B 0000 add [bx+si],al +0000078D C1C004 rol ax,0x4 +00000790 0FB6D0 movzx dx,al +00000793 83E20F and dx,byte +0xf +00000796 83CA30 or dx,byte +0x30 +00000799 83FA39 cmp dx,byte +0x39 +0000079C 7603 jna 0x7a1 +0000079E 83C207 add dx,byte +0x7 +000007A1 88D3 mov bl,dl +000007A3 E8A6FF call 0x74c +000007A6 FF db 0xFF +000007A7 FFE2 jmp dx +000007A9 E35A jcxz 0x805 +000007AB 59 pop cx +000007AC 5B pop bx +000007AD 58 pop ax +000007AE C3 ret +000007AF 50 push ax +000007B0 6653 push ebx +000007B2 88DC mov ah,bl +000007B4 E8D0FE call 0x687 +000007B7 FF db 0xFF +000007B8 FF6689 jmp near [bp-0x77] +000007BB 1D3406 sbb ax,0x634 +000007BE 0100 add [bx+si],ax +000007C0 AC lodsb +000007C1 08C0 or al,al +000007C3 7440 jz 0x805 +000007C5 3C0D cmp al,0xd +000007C7 751F jnz 0x7e8 +000007C9 668B1D mov ebx,[di] +000007CC 3406 xor al,0x6 +000007CE 0100 add [bx+si],ax +000007D0 E8F2FE call 0x6c5 +000007D3 FF db 0xFF +000007D4 FF db 0xFF +000007D5 E83B00 call 0x813 +000007D8 0000 add [bx+si],al +000007DA E8AAFE call 0x687 +000007DD FF db 0xFF +000007DE FF6689 jmp near [bp-0x77] +000007E1 1D3406 sbb ax,0x634 +000007E4 0100 add [bx+si],ax +000007E6 EBD8 jmp short 0x7c0 +000007E8 3C0A cmp al,0xa +000007EA 74D4 jz 0x7c0 +000007EC 0F db 0x0F +000007ED B71D mov bh,0x1d +000007EF 3406 xor al,0x6 +000007F1 0100 add [bx+si],ax +000007F3 266689841B00 mov [es:si+0x1b],eax +000007F9 800B00 or byte [bp+di],0x0 +000007FC 66FF05 inc dword [di] +000007FF 3406 xor al,0x6 +00000801 0100 add [bx+si],ax +00000803 EBBB jmp short 0x7c0 +00000805 668B1D mov ebx,[di] +00000808 3406 xor al,0x6 +0000080A 0100 add [bx+si],ax +0000080C E8B6FE call 0x6c5 +0000080F FF db 0xFF +00000810 FF665B jmp near [bp+0x5b] +00000813 58 pop ax +00000814 C3 ret +00000815 6653 push ebx +00000817 E854FE call 0x66e +0000081A FF db 0xFF +0000081B FF8A3D32 dec word [bp+si+0x323d] +0000081F 06 push es +00000820 0100 add [bx+si],ax +00000822 FECF dec bh +00000824 38FB cmp bl,bh +00000826 7207 jc 0x82f +00000828 E81300 call 0x83e +0000082B 0000 add [bx+si],al +0000082D EB0E jmp short 0x83d +0000082F E83CFE call 0x66e +00000832 FF db 0xFF +00000833 FFB700FE push word [bx+0xfe00] +00000837 C3 ret +00000838 E86BFE call 0x6a6 +0000083B FF db 0xFF +0000083C FF665B jmp near [bp+0x5b] +0000083F C3 ret +00000840 E82300 call 0x866 +00000843 0000 add [bx+si],al +00000845 6650 push eax +00000847 6653 push ebx +00000849 6631C0 xor eax,eax +0000084C A03206 mov al,[0x632] +0000084F 0100 add [bx+si],ax +00000851 8A1D mov bl,[di] +00000853 33060100 xor ax,[0x1] +00000857 FEC8 dec al +00000859 F6E3 mul bl +0000085B 6689C3 mov ebx,eax +0000085E E864FE call 0x6c5 +00000861 FF db 0xFF +00000862 FF665B jmp near [bp+0x5b] +00000865 6658 pop eax +00000867 C3 ret +00000868 50 push ax +00000869 51 push cx +0000086A 57 push di +0000086B 56 push si +0000086C BF0080 mov di,0x8000 +0000086F 0B00 or ax,[bx+si] +00000871 0FB635 movzx si,[di] +00000874 33060100 xor ax,[0x1] +00000878 D1E6 shl si,1 +0000087A 8A0D mov cl,[di] +0000087C 32060100 xor al,[0x1] +00000880 FEC9 dec cl +00000882 89F0 mov ax,si +00000884 F6E1 mul cl +00000886 66C1E802 shr eax,0x2 +0000088A 0F db 0x0F +0000088B B7C8 mov bh,0xc8 +0000088D 81C60080 add si,0x8000 +00000891 0B00 or ax,[bx+si] +00000893 F3A5 rep movsw +00000895 8A0D mov cl,[di] +00000897 33060100 xor ax,[0x1] +0000089B D0E1 shl cl,1 +0000089D A03206 mov al,[0x632] +000008A0 0100 add [bx+si],ax +000008A2 FEC8 dec al +000008A4 F6E1 mul cl +000008A6 0F db 0x0F +000008A7 B7F8 mov bh,0xf8 +000008A9 81C70080 add di,0x8000 +000008AD 0B00 or ax,[bx+si] +000008AF 0FB60D movzx cx,[di] +000008B2 33060100 xor ax,[0x1] +000008B6 D1E9 shr cx,1 +000008B8 B80007 mov ax,0x700 +000008BB 0007 add [bx],al +000008BD F3AB rep stosw +000008BF 5E pop si +000008C0 5F pop di +000008C1 59 pop cx +000008C2 58 pop ax +000008C3 C3 ret +000008C4 66BB9301E8FA mov ebx,0xfae80193 +000008CA FD std +000008CB FF db 0xFF +000008CC FF db 0xFF +000008CD BEE709 mov si,0x9e7 +000008D0 0100 add [bx+si],ax +000008D2 B307 mov bl,0x7 +000008D4 E8D6FE call 0x7ad +000008D7 FF db 0xFF +000008D8 FF66BB jmp near [bp-0x45] +000008DB C501 lds ax,[bx+di] +000008DD E8E5FD call 0x6c5 +000008E0 FF db 0xFF +000008E1 FF db 0xFF +000008E2 BE040A mov si,0xa04 +000008E5 0100 add [bx+si],ax +000008E7 B302 mov bl,0x2 +000008E9 E8C1FE call 0x7ad +000008EC FF db 0xFF +000008ED FF66BB jmp near [bp-0x45] +000008F0 E301 jcxz 0x8f3 +000008F2 E8D0FD call 0x6c5 +000008F5 FF db 0xFF +000008F6 FF db 0xFF +000008F7 BE150A mov si,0xa15 +000008FA 0100 add [bx+si],ax +000008FC B307 mov bl,0x7 +000008FE E8ACFE call 0x7ad +00000901 FF db 0xFF +00000902 FF66BB jmp near [bp-0x45] +00000905 1502E8 adc ax,0xe802 +00000908 BBFDFF mov bx,0xfffd +0000090B FF db 0xFF +0000090C BE270A mov si,0xa27 +0000090F 0100 add [bx+si],ax +00000911 B302 mov bl,0x2 +00000913 E897FE call 0x7ad +00000916 FF db 0xFF +00000917 FFB120B5 push word [bx+di+0xb520] +0000091B 28E8 sub al,ch +0000091D 8402 test [bp+si],al +0000091F 0000 add [bx+si],al +00000921 E8A402 call 0xbc8 +00000924 0000 add [bx+si],al +00000926 66BB3302E898 mov ebx,0x98e80233 +0000092C FD std +0000092D FF db 0xFF +0000092E FF db 0xFF +0000092F BE380A mov si,0xa38 +00000932 0100 add [bx+si],ax +00000934 B307 mov bl,0x7 +00000936 E874FE call 0x7ad +00000939 FF db 0xFF +0000093A FF66BB jmp near [bp-0x45] +0000093D 6502E8 gs add ch,al +00000940 83FDFF cmp bp,byte -0x1 +00000943 FF db 0xFF +00000944 BE4F0A mov si,0xa4f +00000947 0100 add [bx+si],ax +00000949 B302 mov bl,0x2 +0000094B E85FFE call 0x7ad +0000094E FF db 0xFF +0000094F FF db 0xFF +00000950 BFEE1D mov di,0x1dee +00000953 0100 add [bx+si],ax +00000955 E837F8 call 0x18f +00000958 FF db 0xFF +00000959 FF db 0xFF +0000095A BE3202 mov si,0x232 +0000095D 0100 add [bx+si],ax +0000095F E8AFF8 call 0x211 +00000962 FF db 0xFF +00000963 FF db 0xFF +00000964 FB sti +00000965 66BB8302E859 mov ebx,0x59e80283 +0000096B FD std +0000096C FF db 0xFF +0000096D FF db 0xFF +0000096E BE600A mov si,0xa60 +00000971 0100 add [bx+si],ax +00000973 B307 mov bl,0x7 +00000975 E835FE call 0x7ad +00000978 FF db 0xFF +00000979 FF66BB jmp near [bp-0x45] +0000097C B502 mov ch,0x2 +0000097E E844FD call 0x6c5 +00000981 FF db 0xFF +00000982 FF db 0xFF +00000983 BE720A mov si,0xa72 +00000986 0100 add [bx+si],ax +00000988 B302 mov bl,0x2 +0000098A E820FE call 0x7ad +0000098D FF db 0xFF +0000098E FFB101E8 push word [bx+di+0xe801] +00000992 4A dec dx +00000993 0200 add al,[bx+si] +00000995 0066BB add [bp-0x45],ah +00000998 D302 rol word [bp+si],cl +0000099A E828FD call 0x6c5 +0000099D FF db 0xFF +0000099E FF db 0xFF +0000099F BE830A mov si,0xa83 +000009A2 0100 add [bx+si],ax +000009A4 B307 mov bl,0x7 +000009A6 E804FE call 0x7ad +000009A9 FF db 0xFF +000009AA FF66BB jmp near [bp-0x45] +000009AD 0503E8 add ax,0xe803 +000009B0 13FD adc di,bp +000009B2 FF db 0xFF +000009B3 FF db 0xFF +000009B4 BE930A mov si,0xa93 +000009B7 0100 add [bx+si],ax +000009B9 B302 mov bl,0x2 +000009BB E8EFFD call 0x7ad +000009BE FF db 0xFF +000009BF FF db 0xFF +000009C0 E8CA25 call 0x2f8d +000009C3 0000 add [bx+si],al +000009C5 E8D728 call 0x329f +000009C8 0000 add [bx+si],al +000009CA B100 mov cl,0x0 +000009CC E80F02 call 0xbde +000009CF 0000 add [bx+si],al +000009D1 BB0000 mov bx,0x0 +000009D4 1000 adc [bx+si],al +000009D6 8B0D mov cx,[di] +000009D8 C8000100 enter 0x100,0x0 +000009DC E85939 call 0x4338 +000009DF 0000 add [bx+si],al +000009E1 E8152E call 0x37f9 +000009E4 0000 add [bx+si],al +000009E6 C3 ret +000009E7 53 push bx +000009E8 657474 gs jz 0xa5f +000009EB 696E672075 imul bp,[bp+0x67],word 0x7520 +000009F0 7020 jo 0xa12 +000009F2 7072 jo 0xa66 +000009F4 6F outsw +000009F5 7465 jz 0xa5c +000009F7 637465 arpl [si+0x65],si +000009FA 64206D6F and [fs:di+0x6f],ch +000009FE 64652E2E2E005B20 add [cs:bp+di+0x20],bl +00000A06 3332 xor si,[bp+si] +00000A08 2D6269 sub ax,0x6962 +00000A0B 7473 jz 0xa80 +00000A0D 204F4B and [bx+0x4b],cl +00000A10 2020 and [bx+si],ah +00000A12 205D00 and [di+0x0],bl +00000A15 4C dec sp +00000A16 6F outsw +00000A17 61 popa +00000A18 64696E67206B imul bp,[fs:bp+0x67],word 0x6b20 +00000A1E 65726E gs jc 0xa8f +00000A21 656C gs insb +00000A23 2E2E2E005B20 add [cs:bp+di+0x20],bl +00000A29 4F dec di +00000A2A 4B dec bx +00000A2B 2020 and [bx+si],ah +00000A2D 2020 and [bx+si],ah +00000A2F 2020 and [bx+si],ah +00000A31 2020 and [bx+si],ah +00000A33 2020 and [bx+si],ah +00000A35 205D00 and [di+0x0],bl +00000A38 46 inc si +00000A39 6978696E67 imul di,[bx+si+0x69],word 0x676e +00000A3E 205049 and [bx+si+0x49],dl +00000A41 43 inc bx +00000A42 20616E and [bx+di+0x6e],ah +00000A45 64204952 and [fs:bx+di+0x52],cl +00000A49 51 push cx +00000A4A 732E jnc 0xa7a +00000A4C 2E2E005B20 add [cs:bp+di+0x20],bl +00000A51 44 inc sp +00000A52 6F outsw +00000A53 6E outsb +00000A54 652020 and [gs:bx+si],ah +00000A57 2020 and [bx+si],ah +00000A59 2020 and [bx+si],ah +00000A5B 2020 and [bx+si],ah +00000A5D 205D00 and [di+0x0],bl +00000A60 53 push bx +00000A61 657474 gs jz 0xad8 +00000A64 696E672075 imul bp,[bp+0x67],word 0x7520 +00000A69 7020 jo 0xa8b +00000A6B 49 dec cx +00000A6C 44 inc sp +00000A6D 54 push sp +00000A6E 2E2E2E005B20 add [cs:bp+di+0x20],bl +00000A74 49 dec cx +00000A75 44 inc sp +00000A76 54 push sp +00000A77 204F4B and [bx+0x4b],cl +00000A7A 2020 and [bx+si],ah +00000A7C 2020 and [bx+si],ah +00000A7E 2020 and [bx+si],ah +00000A80 205D00 and [di+0x0],bl +00000A83 45 inc bp +00000A84 6E outsb +00000A85 61 popa +00000A86 626C65 bound bp,[si+0x65] +00000A89 7320 jnc 0xaab +00000A8B 49 dec cx +00000A8C 52 push dx +00000A8D 51 push cx +00000A8E 312E2E2E xor [0x2e2e],bp +00000A92 005B20 add [bp+di+0x20],bl +00000A95 4B dec bx +00000A96 657962 gs jns 0xafb +00000A99 6F outsw +00000A9A 61 popa +00000A9B 7264 jc 0xb01 +00000A9D 204F4B and [bx+0x4b],cl +00000AA0 2020 and [bx+si],ah +00000AA2 5D pop bp +00000AA3 00424F add [bp+si+0x4f],al +00000AA6 53 push bx +00000AA7 207368 and [bp+di+0x68],dh +00000AAA 656C gs insb +00000AAC 6C insb +00000AAD 2E205479 and [cs:si+0x79],dl +00000AB1 7065 jo 0xb18 +00000AB3 2022 and [bp+si],ah +00000AB5 68656C push word 0x6c65 +00000AB8 7022 jo 0xadc +00000ABA 20666F and [bp+0x6f],ah +00000ABD 7220 jc 0xadf +00000ABF 6D insw +00000AC0 6F outsw +00000AC1 7265 jc 0xb28 +00000AC3 20696E and [bx+di+0x6e],ch +00000AC6 666F outsd +00000AC8 2E0D0A00 cs or ax,0xa +00000ACC 60 pusha +00000ACD 50 push ax +00000ACE C1E810 shr ax,0x10 +00000AD1 66A3C000 mov [0xc0],eax +00000AD5 0100 add [bx+si],ax +00000AD7 58 pop ax +00000AD8 53 push bx +00000AD9 C1EB10 shr bx,0x10 +00000ADC 881D mov [di],bl +00000ADE BE0001 mov si,0x100 +00000AE1 005BC6 add [bp+di-0x3a],bl +00000AE4 05BF00 add ax,0xbf +00000AE7 0100 add [bx+si],ax +00000AE9 006689 add [bp-0x77],ah +00000AEC 1DC200 sbb ax,0xc2 +00000AEF 0100 add [bx+si],ax +00000AF1 66890D mov [di],ecx +00000AF4 C400 les ax,[bx+si] +00000AF6 0100 add [bx+si],ax +00000AF8 668915 mov [di],edx +00000AFB C60001 mov byte [bx+si],0x1 +00000AFE 00E8 add al,ch +00000B00 C60000 mov byte [bx+si],0x0 +00000B03 00EA add dl,ch +00000B05 0B0B or cx,[bp+di] +00000B07 0000 add [bx+si],al +00000B09 1800 sbb [bx+si],al +00000B0B B82000 mov ax,0x20 +00000B0E 8ED8 mov ds,ax +00000B10 8EC0 mov es,ax +00000B12 8EE0 mov fs,ax +00000B14 8EE8 mov gs,ax +00000B16 8ED0 mov ss,ax +00000B18 FA cli +00000B19 0F20C0 mov eax,cr0 +00000B1C 24FE and al,0xfe +00000B1E 0F22C0 mov cr0,eax +00000B21 EA260B0010 jmp 0x1000:0xb26 +00000B26 8CC8 mov ax,cs +00000B28 8ED8 mov ds,ax +00000B2A 31C0 xor ax,ax +00000B2C 8EC0 mov es,ax +00000B2E 8EE0 mov fs,ax +00000B30 8EE8 mov gs,ax +00000B32 8ED0 mov ss,ax +00000B34 0F011EB800 lidt [0xb8] +00000B39 FB sti +00000B3A A1C000 mov ax,[0xc0] +00000B3D 8B1EC200 mov bx,[0xc2] +00000B41 8B0EC400 mov cx,[0xc4] +00000B45 8B16C600 mov dx,[0xc6] +00000B49 50 push ax +00000B4A A0BE00 mov al,[0xbe] +00000B4D A2520B mov [0xb52],al +00000B50 58 pop ax +00000B51 CD00 int 0x0 +00000B53 7305 jnc 0xb5a +00000B55 C606BF0001 mov byte [0xbf],0x1 +00000B5A A3C000 mov [0xc0],ax +00000B5D 891EC200 mov [0xc2],bx +00000B61 890EC400 mov [0xc4],cx +00000B65 8916C600 mov [0xc6],dx +00000B69 FA cli +00000B6A 0F01164000 lgdt [0x40] +00000B6F 0F011E6E00 lidt [0x6e] +00000B74 0F20C0 mov eax,cr0 +00000B77 0C01 or al,0x1 +00000B79 0F22C0 mov cr0,eax +00000B7C 66EA840B01000800 jmp dword 0x8:0x10b84 +00000B84 66B810008ED8 mov eax,0xd88e0010 +00000B8A 8EC0 mov es,ax +00000B8C 8EE0 mov fs,ax +00000B8E 8EE8 mov gs,ax +00000B90 8ED0 mov ss,ax +00000B92 E83E00 call 0xbd3 +00000B95 0000 add [bx+si],al +00000B97 FB sti +00000B98 61 popa +00000B99 F8 clc +00000B9A 803DBF cmp byte [di],0xbf +00000B9D 0001 add [bx+di],al +00000B9F 0001 add [bx+di],al +00000BA1 7501 jnz 0xba4 +00000BA3 F9 stc +00000BA4 C3 ret +00000BA5 6650 push eax +00000BA7 6652 push edx +00000BA9 B011 mov al,0x11 +00000BAB E620 out 0x20,al +00000BAD E6A0 out 0xa0,al +00000BAF 88C8 mov al,cl +00000BB1 E621 out 0x21,al +00000BB3 88E8 mov al,ch +00000BB5 E6A1 out 0xa1,al +00000BB7 B004 mov al,0x4 +00000BB9 E621 out 0x21,al +00000BBB B002 mov al,0x2 +00000BBD E6A1 out 0xa1,al +00000BBF B001 mov al,0x1 +00000BC1 E621 out 0x21,al +00000BC3 E6A1 out 0xa1,al +00000BC5 665A pop edx +00000BC7 6658 pop eax +00000BC9 C3 ret +00000BCA 6650 push eax +00000BCC B0FF mov al,0xff +00000BCE E621 out 0x21,al +00000BD0 E6A1 out 0xa1,al +00000BD2 6658 pop eax +00000BD4 C3 ret +00000BD5 6650 push eax +00000BD7 B000 mov al,0x0 +00000BD9 E621 out 0x21,al +00000BDB E6A1 out 0xa1,al +00000BDD 6658 pop eax +00000BDF C3 ret +00000BE0 6650 push eax +00000BE2 6651 push ecx +00000BE4 80F908 cmp cl,0x8 +00000BE7 7215 jc 0xbfe +00000BE9 80E908 sub cl,0x8 +00000BEC B401 mov ah,0x1 +00000BEE D2E4 shl ah,cl +00000BF0 80F4FF xor ah,0xff +00000BF3 E4A1 in al,0xa1 +00000BF5 20E0 and al,ah +00000BF7 E6A1 out 0xa1,al +00000BF9 6659 pop ecx +00000BFB 6658 pop eax +00000BFD C3 ret +00000BFE B401 mov ah,0x1 +00000C00 D2E4 shl ah,cl +00000C02 80F4FF xor ah,0xff +00000C05 E421 in al,0x21 +00000C07 20E0 and al,ah +00000C09 E621 out 0x21,al +00000C0B 6659 pop ecx +00000C0D 6658 pop eax +00000C0F C3 ret +00000C10 6650 push eax +00000C12 6651 push ecx +00000C14 80F908 cmp cl,0x8 +00000C17 7212 jc 0xc2b +00000C19 80E908 sub cl,0x8 +00000C1C B401 mov ah,0x1 +00000C1E D2E4 shl ah,cl +00000C20 E4A1 in al,0xa1 +00000C22 08E0 or al,ah +00000C24 E6A1 out 0xa1,al +00000C26 6659 pop ecx +00000C28 6658 pop eax +00000C2A C3 ret +00000C2B B401 mov ah,0x1 +00000C2D D2E4 shl ah,cl +00000C2F E421 in al,0x21 +00000C31 08E0 or al,ah +00000C33 E621 out 0x21,al +00000C35 6659 pop ecx +00000C37 6658 pop eax +00000C39 C3 ret +00000C3A C9 leave +00000C3B CDCD int 0xcd +00000C3D CDCD int 0xcd +00000C3F CDCD int 0xcd +00000C41 CDCD int 0xcd +00000C43 CDCD int 0xcd +00000C45 CDCD int 0xcd +00000C47 CDCD int 0xcd +00000C49 CDCD int 0xcd +00000C4B CDCD int 0xcd +00000C4D CDCD int 0xcd +00000C4F CDCD int 0xcd +00000C51 CDCD int 0xcd +00000C53 CDBB int 0xbb +00000C55 00BA2020 add [bp+si+0x2020],bh +00000C59 2020 and [bx+si],ah +00000C5B 1020 adc [bx+si],ah +00000C5D 49 dec cx +00000C5E 4E dec si +00000C5F 54 push sp +00000C60 2033 and [bp+di],dh +00000C62 3220 xor ah,[bx+si] +00000C64 43 inc bx +00000C65 41 inc cx +00000C66 4C dec sp +00000C67 4C dec sp +00000C68 45 inc bp +00000C69 44 inc sp +00000C6A 2121 and [bx+di],sp +00000C6C 2020 and [bx+si],ah +00000C6E 2020 and [bx+si],ah +00000C70 BA00BA mov dx,0xba00 +00000C73 2020 and [bx+si],ah +00000C75 2020 and [bx+si],ah +00000C77 2020 and [bx+si],ah +00000C79 2020 and [bx+si],ah +00000C7B 2020 and [bx+si],ah +00000C7D 0220 add ah,[bx+si] +00000C7F 0120 add [bx+si],sp +00000C81 2020 and [bx+si],ah +00000C83 2020 and [bx+si],ah +00000C85 2020 and [bx+si],ah +00000C87 2020 and [bx+si],ah +00000C89 2020 and [bx+si],ah +00000C8B 20BA00C8 and [bp+si+0xc800],bh +00000C8F CDCD int 0xcd +00000C91 CDCD int 0xcd +00000C93 CDCD int 0xcd +00000C95 CDCD int 0xcd +00000C97 CDCD int 0xcd +00000C99 CDCD int 0xcd +00000C9B CDCD int 0xcd +00000C9D CDCD int 0xcd +00000C9F CDCD int 0xcd +00000CA1 CDCD int 0xcd +00000CA3 CDCD int 0xcd +00000CA5 CDCD int 0xcd +00000CA7 CDBC int 0xbc +00000CA9 004354 add [bp+di+0x54],al +00000CAC 52 push dx +00000CAD 4C dec sp +00000CAE 2B414C sub ax,[bx+di+0x4c] +00000CB1 54 push sp +00000CB2 2B4445 sub ax,[si+0x45] +00000CB5 4C dec sp +00000CB6 207761 and [bx+0x61],dh +00000CB9 7320 jnc 0xcdb +00000CBB 7072 jo 0xd2f +00000CBD 657373 gs jnc 0xd33 +00000CC0 65642100 and [fs:bx+si],ax +00000CC4 6683F801 cmp eax,byte +0x1 +00000CC8 750A jnz 0xcd4 +00000CCA E85602 call 0xf23 +00000CCD 0000 add [bx+si],al +00000CCF E99900 jmp 0xd6b +00000CD2 0000 add [bx+si],al +00000CD4 663DDECA7533 cmp eax,0x3375cade +00000CDA 6653 push ebx +00000CDC 6651 push ecx +00000CDE 6652 push edx +00000CE0 E8A4F9 call 0x687 +00000CE3 FF db 0xFF +00000CE4 FF6689 jmp near [bp-0x77] +00000CE7 D9B20CB6 fnstenv [bp+si+0xb60c] +00000CEB 1BE8 sbb bp,ax +00000CED B7F9 mov bh,0xf9 +00000CEF FF db 0xFF +00000CF0 FF db 0xFF +00000CF1 BEAA0C mov si,0xcaa +00000CF4 0100 add [bx+si],ax +00000CF6 B040 mov al,0x40 +00000CF8 E8B2FA call 0x7ad +00000CFB FF db 0xFF +00000CFC FF6689 jmp near [bp-0x77] +00000CFF CB retf +00000D00 E8C2F9 call 0x6c5 +00000D03 FF db 0xFF +00000D04 FF665A jmp near [bp+0x5a] +00000D07 6659 pop ecx +00000D09 665B pop ebx +00000D0B EB60 jmp short 0xd6d +00000D0D 6653 push ebx +00000D0F 6651 push ecx +00000D11 6652 push edx +00000D13 B20B mov dl,0xb +00000D15 B61A mov dh,0x1a +00000D17 E88CF9 call 0x6a6 +00000D1A FF db 0xFF +00000D1B FF db 0xFF +00000D1C BE3A0C mov si,0xc3a +00000D1F 0100 add [bx+si],ax +00000D21 B340 mov bl,0x40 +00000D23 E887FA call 0x7ad +00000D26 FF db 0xFF +00000D27 FFB20CB6 push word [bp+si+0xb60c] +00000D2B 1AE8 sbb ch,al +00000D2D 77F9 ja 0xd28 +00000D2F FF db 0xFF +00000D30 FF db 0xFF +00000D31 BE560C mov si,0xc56 +00000D34 0100 add [bx+si],ax +00000D36 B340 mov bl,0x40 +00000D38 E872FA call 0x7ad +00000D3B FF db 0xFF +00000D3C FFB20DB6 push word [bp+si+0xb60d] +00000D40 1AE8 sbb ch,al +00000D42 62 db 0x62 +00000D43 F9 stc +00000D44 FF db 0xFF +00000D45 FF db 0xFF +00000D46 BE720C mov si,0xc72 +00000D49 0100 add [bx+si],ax +00000D4B B340 mov bl,0x40 +00000D4D E85DFA call 0x7ad +00000D50 FF db 0xFF +00000D51 FFB20EB6 push word [bp+si+0xb60e] +00000D55 1AE8 sbb ch,al +00000D57 4D dec bp +00000D58 F9 stc +00000D59 FF db 0xFF +00000D5A FF db 0xFF +00000D5B BE8E0C mov si,0xc8e +00000D5E 0100 add [bx+si],ax +00000D60 B340 mov bl,0x40 +00000D62 E848FA call 0x7ad +00000D65 FF db 0xFF +00000D66 FF665A jmp near [bp+0x5a] +00000D69 6659 pop ecx +00000D6B 665B pop ebx +00000D6D C3 ret +00000D6E 2020 and [bx+si],ah +00000D70 2020 and [bx+si],ah +00000D72 2020 and [bx+si],ah +00000D74 2020 and [bx+si],ah +00000D76 2020 and [bx+si],ah +00000D78 204120 and [bx+di+0x20],al +00000D7B 36342D ss xor al,0x2d +00000D7E 627974 bound di,[bx+di+0x74] +00000D81 652020 and [gs:bx+si],ah +00000D84 2020 and [bx+si],ah +00000D86 2020 and [bx+si],ah +00000D88 2020 and [bx+si],ah +00000D8A 2020 and [bx+si],ah +00000D8C 2020 and [bx+si],ah +00000D8E 2020 and [bx+si],ah +00000D90 2020 and [bx+si],ah +00000D92 2020 and [bx+si],ah +00000D94 2020 and [bx+si],ah +00000D96 6B657962 imul sp,[di+0x79],byte +0x62 +00000D9A 6F outsw +00000D9B 61 popa +00000D9C 7264 jc 0xe02 +00000D9E 206275 and [bp+si+0x75],ah +00000DA1 6666657220 gs o32 jc 0xdc6 +00000DA6 2020 and [bx+si],ah +00000DA8 2020 and [bx+si],ah +00000DAA 2020 and [bx+si],ah +00000DAC 2020 and [bx+si],ah +00000DAE 0100 add [bx+si],ax +00000DB0 0000 add [bx+si],al +00000DB2 50 push ax +00000DB3 31C0 xor ax,ax +00000DB5 E460 in al,0x60 +00000DB7 A880 test al,0x80 +00000DB9 7455 jz 0xe10 +00000DBB 8025B0 and byte [di],0xb0 +00000DBE 0D0100 or ax,0x1 +00000DC1 7F3C jg 0xdff +00000DC3 AA stosb +00000DC4 7415 jz 0xddb +00000DC6 3CB6 cmp al,0xb6 +00000DC8 7411 jz 0xddb +00000DCA 3C9D cmp al,0x9d +00000DCC 741B jz 0xde9 +00000DCE 3CD3 cmp al,0xd3 +00000DD0 7415 jz 0xde7 +00000DD2 3CB8 cmp al,0xb8 +00000DD4 741C jz 0xdf2 +00000DD6 E9BA00 jmp 0xe93 +00000DD9 0000 add [bx+si],al +00000DDB 8025B0 and byte [di],0xb0 +00000DDE 0D0100 or ax,0x1 +00000DE1 FE db 0xFE +00000DE2 E9AE00 jmp 0xe93 +00000DE5 0000 add [bx+si],al +00000DE7 EB12 jmp short 0xdfb +00000DE9 8025B0 and byte [di],0xb0 +00000DEC 0D0100 or ax,0x1 +00000DEF FD std +00000DF0 EB09 jmp short 0xdfb +00000DF2 8025B0 and byte [di],0xb0 +00000DF5 0D0100 or ax,0x1 +00000DF8 FB sti +00000DF9 EB00 jmp short 0xdfb +00000DFB F605B0 test byte [di],0xb0 +00000DFE 0D0100 or ax,0x1 +00000E01 40 inc ax +00000E02 7407 jz 0xe0b +00000E04 8025B0 and byte [di],0xb0 +00000E07 0D0100 or ax,0x1 +00000E0A BFE985 mov di,0x85e9 +00000E0D 0000 add [bx+si],al +00000E0F 00800DB0 add [bx+si+0xb00d],al +00000E13 0D0100 or ax,0x1 +00000E16 803C2A cmp byte [si],0x2a +00000E19 7509 jnz 0xe24 +00000E1B 800DB0 or byte [di],0xb0 +00000E1E 0D0100 or ax,0x1 +00000E21 01EB add bx,bp +00000E23 713C jno 0xe61 +00000E25 367509 ss jnz 0xe31 +00000E28 800DB0 or byte [di],0xb0 +00000E2B 0D0100 or ax,0x1 +00000E2E 01EB add bx,bp +00000E30 643C1D fs cmp al,0x1d +00000E33 7509 jnz 0xe3e +00000E35 800DB0 or byte [di],0xb0 +00000E38 0D0100 or ax,0x1 +00000E3B 02EB add ch,bl +00000E3D 57 push di +00000E3E 3C38 cmp al,0x38 +00000E40 7509 jnz 0xe4b +00000E42 800DB0 or byte [di],0xb0 +00000E45 0D0100 or ax,0x1 +00000E48 04EB add al,0xeb +00000E4A 4A dec dx +00000E4B F605B0 test byte [di],0xb0 +00000E4E 0D0100 or ax,0x1 +00000E51 06 push es +00000E52 740B jz 0xe5f +00000E54 3C53 cmp al,0x53 +00000E56 7507 jnz 0xe5f +00000E58 800DB0 or byte [di],0xb0 +00000E5B 0D0100 or ax,0x1 +00000E5E 40 inc ax +00000E5F 3C3A cmp al,0x3a +00000E61 750E jnz 0xe71 +00000E63 8035B1 xor byte [di],0xb1 +00000E66 0D0100 or ax,0x1 +00000E69 04E8 add al,0xe8 +00000E6B 8400 test [bx+si],al +00000E6D 0000 add [bx+si],al +00000E6F EB24 jmp short 0xe95 +00000E71 3C45 cmp al,0x45 +00000E73 750E jnz 0xe83 +00000E75 8035B1 xor byte [di],0xb1 +00000E78 0D0100 or ax,0x1 +00000E7B 02E8 add ch,al +00000E7D 7200 jc 0xe7f +00000E7F 0000 add [bx+si],al +00000E81 EB12 jmp short 0xe95 +00000E83 3C46 cmp al,0x46 +00000E85 750E jnz 0xe95 +00000E87 8035B1 xor byte [di],0xb1 +00000E8A 0D0100 or ax,0x1 +00000E8D 01E8 add ax,bp +00000E8F 60 pusha +00000E90 0000 add [bx+si],al +00000E92 00EB add bl,ch +00000E94 0050BF add [bx+si-0x41],dl +00000E97 6E outsb +00000E98 0D0100 or ax,0x1 +00000E9B 31C0 xor ax,ax +00000E9D A0AE0D mov al,[0xdae] +00000EA0 0100 add [bx+si],ax +00000EA2 01C7 add di,ax +00000EA4 58 pop ax +00000EA5 AA stosb +00000EA6 803DAE cmp byte [di],0xae +00000EA9 0D0100 or ax,0x1 +00000EAC 3F aas +00000EAD 7512 jnz 0xec1 +00000EAF 803DAF cmp byte [di],0xaf +00000EB2 0D0100 or ax,0x1 +00000EB5 007422 add [si+0x22],dh +00000EB8 C605AE mov byte [di],0xae +00000EBB 0D0100 or ax,0x1 +00000EBE 00EB add bl,ch +00000EC0 2C8A sub al,0x8a +00000EC2 25AF0D and ax,0xdaf +00000EC5 0100 add [bx+si],ax +00000EC7 A0AE0D mov al,[0xdae] +00000ECA 0100 add [bx+si],ax +00000ECC 0401 add al,0x1 +00000ECE 38C4 cmp ah,al +00000ED0 7408 jz 0xeda +00000ED2 FE05 inc byte [di] +00000ED4 AE scasb +00000ED5 0D0100 or ax,0x1 +00000ED8 EB13 jmp short 0xeed +00000EDA E83134 call 0x430e +00000EDD 0000 add [bx+si],al +00000EDF C605AE mov byte [di],0xae +00000EE2 0D0100 or ax,0x1 +00000EE5 01C6 add si,ax +00000EE7 05AF0D add ax,0xdaf +00000EEA 0100 add [bx+si],ax +00000EEC 00B020E6 add [bx+si+0xe620],dh +00000EF0 2058C3 and [bx+si-0x3d],bl +00000EF3 6650 push eax +00000EF5 E81800 call 0xf10 +00000EF8 0000 add [bx+si],al +00000EFA B0ED mov al,0xed +00000EFC E660 out 0x60,al +00000EFE E80F00 call 0xf10 +00000F01 0000 add [bx+si],al +00000F03 A0B10D mov al,[0xdb1] +00000F06 0100 add [bx+si],ax +00000F08 E660 out 0x60,al +00000F0A E80300 call 0xf10 +00000F0D 0000 add [bx+si],al +00000F0F 6658 pop eax +00000F11 C3 ret +00000F12 EB00 jmp short 0xf14 +00000F14 E464 in al,0x64 +00000F16 A801 test al,0x1 +00000F18 7406 jz 0xf20 +00000F1A EB00 jmp short 0xf1c +00000F1C E460 in al,0x60 +00000F1E EBF2 jmp short 0xf12 +00000F20 A802 test al,0x2 +00000F22 75EE jnz 0xf12 +00000F24 C3 ret +00000F25 56 push si +00000F26 A0AE0D mov al,[0xdae] +00000F29 0100 add [bx+si],ax +00000F2B 8A25 mov ah,[di] +00000F2D AF scasw +00000F2E 0D0100 or ax,0x1 +00000F31 80FC3F cmp ah,0x3f +00000F34 750D jnz 0xf43 +00000F36 3C00 cmp al,0x0 +00000F38 74EC jz 0xf26 +00000F3A C605AF mov byte [di],0xaf +00000F3D 0D0100 or ax,0x1 +00000F40 00EB add bl,ch +00000F42 0E push cs +00000F43 88E3 mov bl,ah +00000F45 FEC3 inc bl +00000F47 38C3 cmp bl,al +00000F49 74DB jz 0xf26 +00000F4B FE05 inc byte [di] +00000F4D AF scasw +00000F4E 0D0100 or ax,0x1 +00000F51 BE6E0D mov si,0xd6e +00000F54 0100 add [bx+si],ax +00000F56 0FB605 movzx ax,[di] +00000F59 AF scasw +00000F5A 0D0100 or ax,0x1 +00000F5D 01C6 add si,ax +00000F5F 8A260FB6 mov ah,[0xb60f] +00000F63 3680FCFA ss cmp ah,0xfa +00000F67 74BD jz 0xf26 +00000F69 80FCE0 cmp ah,0xe0 +00000F6C 74B8 jz 0xf26 +00000F6E 80FCE1 cmp ah,0xe1 +00000F71 74B3 jz 0xf26 +00000F73 F6C480 test ah,0x80 +00000F76 75AE jnz 0xf26 +00000F78 F605B1 test byte [di],0xb1 +00000F7B 0D0100 or ax,0x1 +00000F7E 0475 add al,0x75 +00000F80 11F6 adc si,si +00000F82 05B00D add ax,0xdb0 +00000F85 0100 add [bx+si],ax +00000F87 017521 add [di+0x21],si +00000F8A 8A861710 mov al,[bp+0x1017] +00000F8E 0100 add [bx+si],ax +00000F90 EB21 jmp short 0xfb3 +00000F92 F605B0 test byte [di],0xb0 +00000F95 0D0100 or ax,0x1 +00000F98 017508 add [di+0x8],si +00000F9B 8A866D10 mov al,[bp+0x106d] +00000F9F 0100 add [bx+si],ax +00000FA1 EB10 jmp short 0xfb3 +00000FA3 8A86C310 mov al,[bp+0x10c3] +00000FA7 0100 add [bx+si],ax +00000FA9 EB08 jmp short 0xfb3 +00000FAB 8A861911 mov al,[bp+0x1119] +00000FAF 0100 add [bx+si],ax +00000FB1 EB00 jmp short 0xfb3 +00000FB3 8A1D mov bl,[di] +00000FB5 B10D mov cl,0xd +00000FB7 0100 add [bx+si],ax +00000FB9 8A3D mov bh,[di] +00000FBB B00D mov al,0xd +00000FBD 0100 add [bx+si],ax +00000FBF 5E pop si +00000FC0 C3 ret +00000FC1 50 push ax +00000FC2 53 push bx +00000FC3 56 push si +00000FC4 A0AE0D mov al,[0xdae] +00000FC7 0100 add [bx+si],ax +00000FC9 8A25 mov ah,[di] +00000FCB AF scasw +00000FCC 0D0100 or ax,0x1 +00000FCF 80FC3F cmp ah,0x3f +00000FD2 750D jnz 0xfe1 +00000FD4 3C00 cmp al,0x0 +00000FD6 74EC jz 0xfc4 +00000FD8 C605AF mov byte [di],0xaf +00000FDB 0D0100 or ax,0x1 +00000FDE 00EB add bl,ch +00000FE0 0E push cs +00000FE1 88E3 mov bl,ah +00000FE3 FEC3 inc bl +00000FE5 38C3 cmp bl,al +00000FE7 74DB jz 0xfc4 +00000FE9 FE05 inc byte [di] +00000FEB AF scasw +00000FEC 0D0100 or ax,0x1 +00000FEF BE6E0D mov si,0xd6e +00000FF2 0100 add [bx+si],ax +00000FF4 0FB605 movzx ax,[di] +00000FF7 AF scasw +00000FF8 0D0100 or ax,0x1 +00000FFB 01C6 add si,ax +00000FFD 8A2680FC mov ah,[0xfc80] +00001001 FA cli +00001002 74C0 jz 0xfc4 +00001004 80FCE0 cmp ah,0xe0 +00001007 74BB jz 0xfc4 +00001009 80FCE1 cmp ah,0xe1 +0000100C 74B6 jz 0xfc4 +0000100E F6C480 test ah,0x80 +00001011 75B1 jnz 0xfc4 +00001013 5E pop si +00001014 5B pop bx +00001015 58 pop ax +00001016 C3 ret +00001017 0001 add [bx+di],al +00001019 3132 xor [bp+si],si +0000101B 3334 xor si,[si] +0000101D 353637 xor ax,0x3736 +00001020 3839 cmp [bx+di],bh +00001022 302D xor [di],ch +00001024 3D0000 cmp ax,0x0 +00001027 7177 jno 0x10a0 +00001029 657274 gs jc 0x10a0 +0000102C 7975 jns 0x10a3 +0000102E 696F705B5D imul bp,[bx+0x70],word 0x5d5b +00001033 0000 add [bx+si],al +00001035 61 popa +00001036 7364 jnc 0x109c +00001038 6667686A6B6C3B a32 push dword 0x3b6c6b6a +0000103F 27 daa +00001040 60 pusha +00001041 005C7A add [si+0x7a],bl +00001044 7863 js 0x10a9 +00001046 7662 jna 0x10aa +00001048 6E outsb +00001049 6D insw +0000104A 2C2E sub al,0x2e +0000104C 2F das +0000104D 0000 add [bx+si],al +0000104F 0020 add [bx+si],ah +00001051 0000 add [bx+si],al +00001053 0000 add [bx+si],al +00001055 0000 add [bx+si],al +00001057 0000 add [bx+si],al +00001059 0000 add [bx+si],al +0000105B 0000 add [bx+si],al +0000105D 0000 add [bx+si],al +0000105F 0000 add [bx+si],al +00001061 0000 add [bx+si],al +00001063 0000 add [bx+si],al +00001065 0000 add [bx+si],al +00001067 0000 add [bx+si],al +00001069 0000 add [bx+si],al +0000106B 0000 add [bx+si],al +0000106D 0001 add [bx+di],al +0000106F 3132 xor [bp+si],si +00001071 3334 xor si,[si] +00001073 353637 xor ax,0x3736 +00001076 3839 cmp [bx+di],bh +00001078 302D xor [di],ch +0000107A 3D0000 cmp ax,0x0 +0000107D 51 push cx +0000107E 57 push di +0000107F 45 inc bp +00001080 52 push dx +00001081 54 push sp +00001082 59 pop cx +00001083 55 push bp +00001084 49 dec cx +00001085 4F dec di +00001086 50 push ax +00001087 5B pop bx +00001088 5D pop bp +00001089 0000 add [bx+si],al +0000108B 41 inc cx +0000108C 53 push bx +0000108D 44 inc sp +0000108E 46 inc si +0000108F 47 inc di +00001090 48 dec ax +00001091 4A dec dx +00001092 4B dec bx +00001093 4C dec sp +00001094 3B27 cmp sp,[bx] +00001096 60 pusha +00001097 005C5A add [si+0x5a],bl +0000109A 58 pop ax +0000109B 43 inc bx +0000109C 56 push si +0000109D 42 inc dx +0000109E 4E dec si +0000109F 4D dec bp +000010A0 2C2E sub al,0x2e +000010A2 2F das +000010A3 0000 add [bx+si],al +000010A5 0020 add [bx+si],ah +000010A7 0000 add [bx+si],al +000010A9 0000 add [bx+si],al +000010AB 0000 add [bx+si],al +000010AD 0000 add [bx+si],al +000010AF 0000 add [bx+si],al +000010B1 0000 add [bx+si],al +000010B3 0000 add [bx+si],al +000010B5 0000 add [bx+si],al +000010B7 0000 add [bx+si],al +000010B9 0000 add [bx+si],al +000010BB 0000 add [bx+si],al +000010BD 0000 add [bx+si],al +000010BF 0000 add [bx+si],al +000010C1 0000 add [bx+si],al +000010C3 0001 add [bx+di],al +000010C5 214023 and [bx+si+0x23],ax +000010C8 2425 and al,0x25 +000010CA 5E pop si +000010CB 262A28 sub ch,[es:bx+si] +000010CE 295F2B sub [bx+0x2b],bx +000010D1 0000 add [bx+si],al +000010D3 7177 jno 0x114c +000010D5 657274 gs jc 0x114c +000010D8 7975 jns 0x114f +000010DA 696F707B7D imul bp,[bx+0x70],word 0x7d7b +000010DF 0000 add [bx+si],al +000010E1 61 popa +000010E2 7364 jnc 0x1148 +000010E4 6667686A6B6C3A a32 push dword 0x3a6c6b6a +000010EB 227E00 and bh,[bp+0x0] +000010EE 7C7A jl 0x116a +000010F0 7863 js 0x1155 +000010F2 7662 jna 0x1156 +000010F4 6E outsb +000010F5 6D insw +000010F6 3C3E cmp al,0x3e +000010F8 3F aas +000010F9 0000 add [bx+si],al +000010FB 0020 add [bx+si],ah +000010FD 0000 add [bx+si],al +000010FF 0000 add [bx+si],al +00001101 0000 add [bx+si],al +00001103 0000 add [bx+si],al +00001105 0000 add [bx+si],al +00001107 0000 add [bx+si],al +00001109 0000 add [bx+si],al +0000110B 0000 add [bx+si],al +0000110D 0000 add [bx+si],al +0000110F 0000 add [bx+si],al +00001111 0000 add [bx+si],al +00001113 0000 add [bx+si],al +00001115 0000 add [bx+si],al +00001117 0000 add [bx+si],al +00001119 0001 add [bx+di],al +0000111B 214023 and [bx+si+0x23],ax +0000111E 2425 and al,0x25 +00001120 5E pop si +00001121 262A28 sub ch,[es:bx+si] +00001124 295F2B sub [bx+0x2b],bx +00001127 0000 add [bx+si],al +00001129 51 push cx +0000112A 57 push di +0000112B 45 inc bp +0000112C 52 push dx +0000112D 54 push sp +0000112E 59 pop cx +0000112F 55 push bp +00001130 49 dec cx +00001131 4F dec di +00001132 50 push ax +00001133 7B7D jpo 0x11b2 +00001135 0000 add [bx+si],al +00001137 41 inc cx +00001138 53 push bx +00001139 44 inc sp +0000113A 46 inc si +0000113B 47 inc di +0000113C 48 dec ax +0000113D 4A dec dx +0000113E 4B dec bx +0000113F 4C dec sp +00001140 3A22 cmp ah,[bp+si] +00001142 7E00 jng 0x1144 +00001144 7C5A jl 0x11a0 +00001146 58 pop ax +00001147 43 inc bx +00001148 56 push si +00001149 42 inc dx +0000114A 4E dec si +0000114B 4D dec bp +0000114C 3C3E cmp al,0x3e +0000114E 3F aas +0000114F 0000 add [bx+si],al +00001151 0020 add [bx+si],ah +00001153 0000 add [bx+si],al +00001155 0000 add [bx+si],al +00001157 0000 add [bx+si],al +00001159 0000 add [bx+si],al +0000115B 0000 add [bx+si],al +0000115D 0000 add [bx+si],al +0000115F 0000 add [bx+si],al +00001161 0000 add [bx+si],al +00001163 0000 add [bx+si],al +00001165 0000 add [bx+si],al +00001167 0000 add [bx+si],al +00001169 0000 add [bx+si],al +0000116B 0000 add [bx+si],al +0000116D 0000 add [bx+si],al +0000116F 42 inc dx +00001170 4F dec di +00001171 53 push bx +00001172 206B65 and [bp+di+0x65],ch +00001175 726E jc 0x11e5 +00001177 656C gs insb +00001179 3E0000 add [ds:bx+si],al +0000117C 0000 add [bx+si],al +0000117E 0000 add [bx+si],al +00001180 0000 add [bx+si],al +00001182 0000 add [bx+si],al +00001184 0000 add [bx+si],al +00001186 0000 add [bx+si],al +00001188 0000 add [bx+si],al +0000118A 0000 add [bx+si],al +0000118C 0000 add [bx+si],al +0000118E 0000 add [bx+si],al +00001190 0000 add [bx+si],al +00001192 0000 add [bx+si],al +00001194 0000 add [bx+si],al +00001196 0000 add [bx+si],al +00001198 0000 add [bx+si],al +0000119A 0000 add [bx+si],al +0000119C 0000 add [bx+si],al +0000119E 0000 add [bx+si],al +000011A0 0000 add [bx+si],al +000011A2 0000 add [bx+si],al +000011A4 0000 add [bx+si],al +000011A6 0000 add [bx+si],al +000011A8 0000 add [bx+si],al +000011AA 0000 add [bx+si],al +000011AC 0000 add [bx+si],al +000011AE 0000 add [bx+si],al +000011B0 0000 add [bx+si],al +000011B2 0000 add [bx+si],al +000011B4 0000 add [bx+si],al +000011B6 0000 add [bx+si],al +000011B8 0000 add [bx+si],al +000011BA 0000 add [bx+si],al +000011BC 0000 add [bx+si],al +000011BE 0000 add [bx+si],al +000011C0 0000 add [bx+si],al +000011C2 0000 add [bx+si],al +000011C4 0000 add [bx+si],al +000011C6 0000 add [bx+si],al +000011C8 0000 add [bx+si],al +000011CA 0000 add [bx+si],al +000011CC 0000 add [bx+si],al +000011CE 0000 add [bx+si],al +000011D0 0000 add [bx+si],al +000011D2 0000 add [bx+si],al +000011D4 0000 add [bx+si],al +000011D6 0000 add [bx+si],al +000011D8 0000 add [bx+si],al +000011DA 0000 add [bx+si],al +000011DC 0000 add [bx+si],al +000011DE 0000 add [bx+si],al +000011E0 0000 add [bx+si],al +000011E2 0000 add [bx+si],al +000011E4 0000 add [bx+si],al +000011E6 0000 add [bx+si],al +000011E8 0000 add [bx+si],al +000011EA 0000 add [bx+si],al +000011EC 0000 add [bx+si],al +000011EE 0000 add [bx+si],al +000011F0 0000 add [bx+si],al +000011F2 0000 add [bx+si],al +000011F4 0000 add [bx+si],al +000011F6 0000 add [bx+si],al +000011F8 0000 add [bx+si],al +000011FA 0000 add [bx+si],al +000011FC 0000 add [bx+si],al +000011FE 0000 add [bx+si],al +00001200 0000 add [bx+si],al +00001202 0000 add [bx+si],al +00001204 0000 add [bx+si],al +00001206 0000 add [bx+si],al +00001208 0000 add [bx+si],al +0000120A 0000 add [bx+si],al +0000120C 0000 add [bx+si],al +0000120E 0000 add [bx+si],al +00001210 0000 add [bx+si],al +00001212 0000 add [bx+si],al +00001214 0000 add [bx+si],al +00001216 0000 add [bx+si],al +00001218 0000 add [bx+si],al +0000121A 0000 add [bx+si],al +0000121C 0000 add [bx+si],al +0000121E 0000 add [bx+si],al +00001220 0000 add [bx+si],al +00001222 0000 add [bx+si],al +00001224 0000 add [bx+si],al +00001226 0000 add [bx+si],al +00001228 0000 add [bx+si],al +0000122A 0000 add [bx+si],al +0000122C 0000 add [bx+si],al +0000122E 0000 add [bx+si],al +00001230 0000 add [bx+si],al +00001232 0000 add [bx+si],al +00001234 0000 add [bx+si],al +00001236 0000 add [bx+si],al +00001238 0000 add [bx+si],al +0000123A 0000 add [bx+si],al +0000123C 0000 add [bx+si],al +0000123E 0000 add [bx+si],al +00001240 0000 add [bx+si],al +00001242 0000 add [bx+si],al +00001244 0000 add [bx+si],al +00001246 0000 add [bx+si],al +00001248 0000 add [bx+si],al +0000124A 0000 add [bx+si],al +0000124C 0000 add [bx+si],al +0000124E 0000 add [bx+si],al +00001250 0000 add [bx+si],al +00001252 0000 add [bx+si],al +00001254 0000 add [bx+si],al +00001256 0000 add [bx+si],al +00001258 0000 add [bx+si],al +0000125A 0000 add [bx+si],al +0000125C 0000 add [bx+si],al +0000125E 0000 add [bx+si],al +00001260 0000 add [bx+si],al +00001262 0000 add [bx+si],al +00001264 0000 add [bx+si],al +00001266 0000 add [bx+si],al +00001268 0000 add [bx+si],al +0000126A 0000 add [bx+si],al +0000126C 0000 add [bx+si],al +0000126E 0000 add [bx+si],al +00001270 0000 add [bx+si],al +00001272 0000 add [bx+si],al +00001274 0000 add [bx+si],al +00001276 0000 add [bx+si],al +00001278 0000 add [bx+si],al +0000127A C605B1 mov byte [di],0xb1 +0000127D 0D0100 or ax,0x1 +00001280 00E8 add al,ch +00001282 6D insw +00001283 FC cld +00001284 FF db 0xFF +00001285 FF db 0xFF +00001286 BE6F11 mov si,0x116f +00001289 0100 add [bx+si],ax +0000128B B30E mov bl,0xe +0000128D E81DF5 call 0x7ad +00001290 FF db 0xFF +00001291 FF db 0xFF +00001292 BF7B11 mov di,0x117b +00001295 0100 add [bx+si],ax +00001297 C3 ret +00001298 66B900006651 mov ecx,0x51660000 +0000129E 57 push di +0000129F E881FC call 0xf23 +000012A2 FF db 0xFF +000012A3 FF5F66 call far [bx+0x66] +000012A6 59 pop cx +000012A7 80FC1C cmp ah,0x1c +000012AA 741E jz 0x12ca +000012AC 80FC0E cmp ah,0xe +000012AF 741E jz 0x12cf +000012B1 3C00 cmp al,0x0 +000012B3 74E7 jz 0x129c +000012B5 6681F9FE0073E0 cmp ecx,0xe07300fe +000012BC AA stosb +000012BD 6641 inc ecx +000012BF 88C3 mov bl,al +000012C1 B707 mov bh,0x7 +000012C3 E886F4 call 0x74c +000012C6 FF db 0xFF +000012C7 FF db 0xFF +000012C8 EBD2 jmp short 0x129c +000012CA B000 mov al,0x0 +000012CC AA stosb +000012CD EB13 jmp short 0x12e2 +000012CF 6683F900 cmp ecx,byte +0x0 +000012D3 74C7 jz 0x129c +000012D5 4F dec di +000012D6 E850F4 call 0x729 +000012D9 FF db 0xFF +000012DA FF6649 jmp near [bp+0x49] +000012DD EBBD jmp short 0x129c +000012DF EBFE jmp short 0x12df +000012E1 C3 ret +000012E2 BE6513 mov si,0x1365 +000012E5 0100 add [bx+si],ax +000012E7 BF7B11 mov di,0x117b +000012EA 0100 add [bx+si],ax +000012EC BD0000 mov bp,0x0 +000012EF 0000 add [bx+si],al +000012F1 B90000 mov cx,0x0 +000012F4 0000 add [bx+si],al +000012F6 803EFF7442 cmp byte [0x74ff],0x42 +000012FB 803F20 cmp byte [bx],0x20 +000012FE 7407 jz 0x1307 +00001300 803F00 cmp byte [bx],0x0 +00001303 7402 jz 0x1307 +00001305 EB07 jmp short 0x130e +00001307 803E007512 cmp byte [0x7500],0x12 +0000130C EB1F jmp short 0x132d +0000130E 803E00740B cmp byte [0x7400],0xb +00001313 8A063A07 mov al,[0x73a] +00001317 7505 jnz 0x131e +00001319 46 inc si +0000131A 47 inc di +0000131B 41 inc cx +0000131C EBDD jmp short 0x12fb +0000131E 45 inc bp +0000131F BF7B11 mov di,0x117b +00001322 0100 add [bx+si],ax +00001324 46 inc si +00001325 803E0075FA cmp byte [0x7500],0xfa +0000132A 46 inc si +0000132B EBC4 jmp short 0x12f1 +0000132D 83F900 cmp cx,byte +0x0 +00001330 7409 jz 0x133b +00001332 C1E502 shl bp,0x2 +00001335 FF95C613 call near [di+0x13c6] +00001339 0100 add [bx+si],ax +0000133B EB07 jmp short 0x1344 +0000133D E8E900 call 0x1429 +00001340 0000 add [bx+si],al +00001342 EB00 jmp short 0x1344 +00001344 E8CCF4 call 0x813 +00001347 FF db 0xFF +00001348 FF db 0xFF +00001349 E8C7F4 call 0x813 +0000134C FF db 0xFF +0000134D FF db 0xFF +0000134E BE6F11 mov si,0x116f +00001351 0100 add [bx+si],ax +00001353 B30E mov bl,0xe +00001355 E855F4 call 0x7ad +00001358 FF db 0xFF +00001359 FF db 0xFF +0000135A BF7B11 mov di,0x117b +0000135D 0100 add [bx+si],ax +0000135F E934FF jmp 0x1296 +00001362 FF db 0xFF +00001363 FFC3 inc bx +00001365 7665 jna 0x13cc +00001367 7200 jc 0x1369 +00001369 68656C push word 0x6c65 +0000136C 7000 jo 0x136e +0000136E 3F aas +0000136F 006162 add [bx+di+0x62],ah +00001372 6F outsw +00001373 7574 jnz 0x13e9 +00001375 00636C add [bp+di+0x6c],ah +00001378 7300 jnc 0x137a +0000137A 636C72 arpl [si+0x72],bp +0000137D 7363 jnc 0x13e2 +0000137F 7200 jc 0x1381 +00001381 6C insb +00001382 6963656E63 imul sp,[bp+di+0x65],word 0x636e +00001387 65007265 add [gs:bp+si+0x65],dh +0000138B 626F6F bound bp,[bx+0x6f] +0000138E 7400 jz 0x1390 +00001390 6D insw +00001391 656E gs outsb +00001393 7500 jnz 0x1395 +00001395 7265 jc 0x13fc +00001397 6764756D fs a32 jnz 0x1408 +0000139B 7000 jo 0x139d +0000139D 7469 jz 0x1408 +0000139F 6D insw +000013A0 65006461 add [gs:si+0x61],ah +000013A4 7465 jz 0x140b +000013A6 006465 add [si+0x65],ah +000013A9 6C insb +000013AA 61 popa +000013AB 7900 jns 0x13ad +000013AD 7667 jna 0x1416 +000013AF 61 popa +000013B0 7465 jz 0x1417 +000013B2 7374 jnc 0x1428 +000013B4 006D65 add [di+0x65],ch +000013B7 6D insw +000013B8 7465 jz 0x141f +000013BA 7374 jnc 0x1430 +000013BC 006664 add [bp+0x64],ah +000013BF 647465 fs jz 0x1427 +000013C2 7374 jnc 0x1438 +000013C4 00FF add bh,bh +000013C6 7314 jnc 0x13dc +000013C8 0100 add [bx+si],ax +000013CA D516 aad 0x16 +000013CC 0100 add [bx+si],ax +000013CE D516 aad 0x16 +000013D0 0100 add [bx+si],ax +000013D2 7518 jnz 0x13ec +000013D4 0100 add [bx+si],ax +000013D6 8818 mov [bx+si],bl +000013D8 0100 add [bx+si],ax +000013DA 8818 mov [bx+si],bl +000013DC 0100 add [bx+si],ax +000013DE A31801 mov [0x118],ax +000013E1 00A41801 add [si+0x118],ah +000013E5 00EC add ah,ch +000013E7 1D0100 sbb ax,0x1 +000013EA 812B0100 sub word [bp+di],0x1 +000013EE AC lodsb +000013EF 3001 xor [bx+di],al +000013F1 001C add [si],bl +000013F3 3001 xor [bx+di],al +000013F5 00C8 add al,cl +000013F7 1801 sbb [bx+di],al +000013F9 00FA add dl,bh +000013FB 1801 sbb [bx+di],al +000013FD 00C4 add ah,al +000013FF 1B01 sbb ax,[bx+di] +00001401 0020 add [bx+si],ah +00001403 1A01 sbb al,[bx+di] +00001405 000D add [di],cl +00001407 0A4E6F or cl,[bp+0x6f] +0000140A 207375 and [bp+di+0x75],dh +0000140D 636820 arpl [bx+si+0x20],bp +00001410 636F6D arpl [bx+0x6d],bp +00001413 6D insw +00001414 61 popa +00001415 6E outsb +00001416 64206F72 and [fs:bx+0x72],ch +0000141A 207072 and [bx+si+0x72],dh +0000141D 6F outsw +0000141E 677261 a32 jc 0x1482 +00001421 6D insw +00001422 206578 and [di+0x78],ah +00001425 697374732E imul si,[bp+di+0x74],word 0x2e73 +0000142A 005666 add [bp+0x66],dl +0000142D 53 push bx +0000142E BE0614 mov si,0x1406 +00001431 0100 add [bx+si],ax +00001433 B304 mov bl,0x4 +00001435 E875F3 call 0x7ad +00001438 FF db 0xFF +00001439 FF665B jmp near [bp+0x5b] +0000143C 5E pop si +0000143D C3 ret +0000143E 0D0A42 or ax,0x420a +00001441 4F dec di +00001442 53 push bx +00001443 207665 and [bp+0x65],dh +00001446 7273 jc 0x14bb +00001448 696F6E2030 imul bp,[bx+0x6e],word 0x3020 +0000144D 2E3034 xor [cs:si],dh +00001450 206279 and [bp+si+0x79],ah +00001453 204368 and [bp+di+0x68],al +00001456 7269 jc 0x14c1 +00001458 7374 jnc 0x14ce +0000145A 6F outsw +0000145B 6666657220 gs o32 jc 0x1480 +00001460 42 inc dx +00001461 7562 jnz 0x14c5 +00001463 61 popa +00001464 63682C arpl [bx+si+0x2c],bp +00001467 2032 and [bp+si],dh +00001469 3030 xor [bx+si],dh +0000146B 332D xor bp,[di] +0000146D 3230 xor dh,[bx+si] +0000146F 3035 xor [di],dh +00001471 2E005666 add [cs:bp+0x66],dl +00001475 53 push bx +00001476 BE3E14 mov si,0x143e +00001479 0100 add [bx+si],ax +0000147B B307 mov bl,0x7 +0000147D E82DF3 call 0x7ad +00001480 FF db 0xFF +00001481 FF665B jmp near [bp+0x5b] +00001484 5E pop si +00001485 C3 ret +00001486 0D0A0D or ax,0xd0a +00001489 0A20 or ah,[bx+si] +0000148B 42 inc dx +0000148C 4F dec di +0000148D 53 push bx +0000148E 2030 and [bx+si],dh +00001490 2E3034 xor [cs:si],dh +00001493 206279 and [bp+si+0x79],ah +00001496 204368 and [bp+di+0x68],al +00001499 7269 jc 0x1504 +0000149B 7374 jnc 0x1511 +0000149D 6F outsw +0000149E 6666657220 gs o32 jc 0x14c3 +000014A3 42 inc dx +000014A4 7562 jnz 0x1508 +000014A6 61 popa +000014A7 63682C arpl [bx+si+0x2c],bp +000014AA 2032 and [bp+si],dh +000014AC 3030 xor [bx+si],dh +000014AE 332D xor bp,[di] +000014B0 3230 xor dh,[bx+si] +000014B2 3035 xor [di],dh +000014B4 2E0D0A2D cs or ax,0x2d0a +000014B8 2D2D2D sub ax,0x2d2d +000014BB 2D2D2D sub ax,0x2d2d +000014BE 2D2D2D sub ax,0x2d2d +000014C1 2D2D2D sub ax,0x2d2d +000014C4 2D2D2D sub ax,0x2d2d +000014C7 2D2D2D sub ax,0x2d2d +000014CA 2D2D2D sub ax,0x2d2d +000014CD 2D2D2D sub ax,0x2d2d +000014D0 2D2D2D sub ax,0x2d2d +000014D3 2D2D2D sub ax,0x2d2d +000014D6 2D2D2D sub ax,0x2d2d +000014D9 2D2D2D sub ax,0x2d2d +000014DC 2D2D2D sub ax,0x2d2d +000014DF 2D2D2D sub ax,0x2d2d +000014E2 2D0D0A sub ax,0xa0d +000014E5 54 push sp +000014E6 7970 jns 0x1558 +000014E8 65206120 and [gs:bx+di+0x20],ah +000014EC 636F6D arpl [bx+0x6d],bp +000014EF 6D insw +000014F0 61 popa +000014F1 6E outsb +000014F2 6420616E and [fs:bx+di+0x6e],ah +000014F6 64207072 and [fs:bx+si+0x72],dh +000014FA 657373 gs jnc 0x1570 +000014FD 20454E and [di+0x4e],al +00001500 54 push sp +00001501 45 inc bp +00001502 52 push dx +00001503 20746F and [si+0x6f],dh +00001506 206578 and [di+0x78],ah +00001509 65637574 arpl [gs:di+0x74],si +0000150D 65206974 and [gs:bx+di+0x74],ch +00001511 2E0D0A56 cs or ax,0x560a +00001515 61 popa +00001516 6C insb +00001517 696420636F imul sp,[si+0x20],word 0x6f63 +0000151C 6D insw +0000151D 6D insw +0000151E 61 popa +0000151F 6E outsb +00001520 647320 fs jnc 0x1543 +00001523 61 popa +00001524 7265 jc 0x158b +00001526 3A0D cmp cl,[di] +00001528 0A0D or cl,[di] +0000152A 0A22 or ah,[bp+si] +0000152C 68656C push word 0x6c65 +0000152F 7022 jo 0x1553 +00001531 206F72 and [bx+0x72],ch +00001534 2022 and [bp+si],ah +00001536 3F aas +00001537 2220 and ah,[bx+si] +00001539 2020 and [bx+si],ah +0000153B 2020 and [bx+si],ah +0000153D 2020 and [bx+si],ah +0000153F 2D2044 sub ax,0x4420 +00001542 6973706C61 imul si,[bp+di+0x70],word 0x616c +00001547 7973 jns 0x15bc +00001549 207468 and [si+0x68],dh +0000154C 6973207465 imul si,[bp+di+0x20],word 0x6574 +00001551 7874 js 0x15c7 +00001553 2E0D0A22 cs or ax,0x220a +00001557 7665 jna 0x15be +00001559 7222 jc 0x157d +0000155B 2020 and [bx+si],ah +0000155D 2020 and [bx+si],ah +0000155F 2020 and [bx+si],ah +00001561 2020 and [bx+si],ah +00001563 2020 and [bx+si],ah +00001565 2020 and [bx+si],ah +00001567 2020 and [bx+si],ah +00001569 202D and [di],ch +0000156B 205368 and [bp+di+0x68],dl +0000156E 6F outsw +0000156F 7773 ja 0x15e4 +00001571 207665 and [bp+0x65],dh +00001574 7273 jc 0x15e9 +00001576 696F6E2069 imul bp,[bx+0x6e],word 0x6920 +0000157B 6E outsb +0000157C 666F outsd +0000157E 726D jc 0x15ed +00001580 61 popa +00001581 7469 jz 0x15ec +00001583 6F outsw +00001584 6E outsb +00001585 2E0D0A22 cs or ax,0x220a +00001589 61 popa +0000158A 626F75 bound bp,[bx+0x75] +0000158D 7422 jz 0x15b1 +0000158F 2020 and [bx+si],ah +00001591 2020 and [bx+si],ah +00001593 2020 and [bx+si],ah +00001595 2020 and [bx+si],ah +00001597 2020 and [bx+si],ah +00001599 2020 and [bx+si],ah +0000159B 202D and [di],ch +0000159D 205368 and [bp+di+0x68],dl +000015A0 6F outsw +000015A1 7773 ja 0x1616 +000015A3 20696E and [bx+di+0x6e],ch +000015A6 666F outsd +000015A8 726D jc 0x1617 +000015AA 61 popa +000015AB 7469 jz 0x1616 +000015AD 6F outsw +000015AE 6E outsb +000015AF 206162 and [bx+di+0x62],ah +000015B2 6F outsw +000015B3 7574 jnz 0x1629 +000015B5 207468 and [si+0x68],dh +000015B8 65204F53 and [gs:bx+0x53],cl +000015BC 2E0D0A22 cs or ax,0x220a +000015C0 636C73 arpl [si+0x73],bp +000015C3 2220 and ah,[bx+si] +000015C5 6F outsw +000015C6 7220 jc 0x15e8 +000015C8 22636C and ah,[bp+di+0x6c] +000015CB 7273 jc 0x1640 +000015CD 637222 arpl [bp+si+0x22],si +000015D0 2020 and [bx+si],ah +000015D2 202D and [di],ch +000015D4 20436C and [bp+di+0x6c],al +000015D7 6561 gs popa +000015D9 7273 jc 0x164e +000015DB 207468 and [si+0x68],dh +000015DE 65207363 and [gs:bp+di+0x63],dh +000015E2 7265 jc 0x1649 +000015E4 656E gs outsb +000015E6 2E0D0A2A cs or ax,0x2a0a +000015EA 2022 and [bp+si],ah +000015EC 6C insb +000015ED 6963656E63 imul sp,[bp+di+0x65],word 0x636e +000015F2 652220 and ah,[gs:bx+si] +000015F5 2020 and [bx+si],ah +000015F7 2020 and [bx+si],ah +000015F9 2020 and [bx+si],ah +000015FB 2020 and [bx+si],ah +000015FD 2D2053 sub ax,0x5320 +00001600 686F77 push word 0x776f +00001603 7320 jnc 0x1625 +00001605 42 inc dx +00001606 4F dec di +00001607 53 push bx +00001608 206C69 and [si+0x69],ch +0000160B 63656E arpl [di+0x6e],sp +0000160E 63652E arpl [di+0x2e],sp +00001611 0D0A2A or ax,0x2a0a +00001614 2022 and [bp+si],ah +00001616 6D insw +00001617 656E gs outsb +00001619 7522 jnz 0x163d +0000161B 2020 and [bx+si],ah +0000161D 2020 and [bx+si],ah +0000161F 2020 and [bx+si],ah +00001621 2020 and [bx+si],ah +00001623 2020 and [bx+si],ah +00001625 2020 and [bx+si],ah +00001627 2D2042 sub ax,0x4220 +0000162A 4F dec di +0000162B 53 push bx +0000162C 207379 and [bp+di+0x79],dh +0000162F 7374 jnc 0x16a5 +00001631 656D gs insw +00001633 206D65 and [di+0x65],ch +00001636 6E outsb +00001637 752E jnz 0x1667 +00001639 0D0A22 or ax,0x220a +0000163C 7265 jc 0x16a3 +0000163E 6764756D fs a32 jnz 0x16af +00001642 7022 jo 0x1666 +00001644 2020 and [bx+si],ah +00001646 2020 and [bx+si],ah +00001648 2020 and [bx+si],ah +0000164A 2020 and [bx+si],ah +0000164C 2020 and [bx+si],ah +0000164E 202D and [di],ch +00001650 204475 and [si+0x75],al +00001653 6D insw +00001654 7020 jo 0x1676 +00001656 736F jnc 0x16c7 +00001658 6D insw +00001659 65207374 and [gs:bp+di+0x74],dh +0000165D 61 popa +0000165E 6E outsb +0000165F 6461 fs popa +00001661 7264 jc 0x16c7 +00001663 207265 and [bp+si+0x65],dh +00001666 676973746572 imul si,[ebx+0x74],word 0x7265 +0000166C 732E jnc 0x169c +0000166E 0D0A22 or ax,0x220a +00001671 7265 jc 0x16d8 +00001673 626F6F bound bp,[bx+0x6f] +00001676 7422 jz 0x169a +00001678 2020 and [bx+si],ah +0000167A 2020 and [bx+si],ah +0000167C 2020 and [bx+si],ah +0000167E 2020 and [bx+si],ah +00001680 2020 and [bx+si],ah +00001682 2020 and [bx+si],ah +00001684 2D2052 sub ax,0x5220 +00001687 657374 gs jnc 0x16fe +0000168A 61 popa +0000168B 7274 jc 0x1701 +0000168D 7320 jnc 0x16af +0000168F 7468 jz 0x16f9 +00001691 6520636F and [gs:bp+di+0x6f],ah +00001695 6D insw +00001696 7075 jo 0x170d +00001698 7465 jz 0x16ff +0000169A 722E jc 0x16ca +0000169C 0D0A0D or ax,0xd0a +0000169F 0A416C or al,[bx+di+0x6c] +000016A2 6C insb +000016A3 20636F and [bp+di+0x6f],ah +000016A6 6D insw +000016A7 6D insw +000016A8 61 popa +000016A9 6E outsb +000016AA 647320 fs jnc 0x16cd +000016AD 7769 ja 0x1718 +000016AF 7468 jz 0x1719 +000016B1 206120 and [bx+di+0x20],ah +000016B4 2A20 sub ah,[bx+si] +000016B6 696E206672 imul bp,[bp+0x20],word 0x7266 +000016BB 6F outsw +000016BC 6E outsb +000016BD 7420 jz 0x16df +000016BF 6973206E6F imul si,[bp+di+0x20],word 0x6f6e +000016C4 7420 jz 0x16e6 +000016C6 636F6D arpl [bx+0x6d],bp +000016C9 706C jo 0x1737 +000016CB 657465 gs jz 0x1733 +000016CE 64207965 and [fs:bx+di+0x65],bh +000016D2 742E jz 0x1702 +000016D4 005666 add [bp+0x66],dl +000016D7 53 push bx +000016D8 BE8614 mov si,0x1486 +000016DB 0100 add [bx+si],ax +000016DD B307 mov bl,0x7 +000016DF E8CBF0 call 0x7ad +000016E2 FF db 0xFF +000016E3 FF665B jmp near [bp+0x5b] +000016E6 5E pop si +000016E7 C3 ret +000016E8 0D0A41 or ax,0x410a +000016EB 626F75 bound bp,[bx+0x75] +000016EE 7420 jz 0x1710 +000016F0 42 inc dx +000016F1 4F dec di +000016F2 53 push bx +000016F3 0D0A48 or ax,0x480a +000016F6 6D insw +000016F7 6D insw +000016F8 2E2E204920 and [cs:bx+di+0x20],cl +000016FD 7374 jnc 0x1773 +000016FF 61 popa +00001700 7274 jc 0x1776 +00001702 6564207769 and [fs:bx+0x69],dh +00001707 7468 jz 0x1771 +00001709 204F53 and [bx+0x53],cl +0000170C 2D6465 sub ax,0x6564 +0000170F 7620 jna 0x1731 +00001711 696E206C61 imul bp,[bp+0x20],word 0x616c +00001716 7465 jz 0x177d +00001718 2032 and [bp+si],dh +0000171A 3030 xor [bx+si],dh +0000171C 332E2E20 xor bp,[0x202e] +00001720 41 inc cx +00001721 6E outsb +00001722 7977 jns 0x179b +00001724 61 popa +00001725 792E jns 0x1755 +00001727 2E0D0A0D cs or ax,0xd0a +0000172B 0A5468 or dl,[si+0x68] +0000172E 61 popa +0000172F 6E outsb +00001730 6B732066 imul si,[bp+di+0x20],byte +0x66 +00001734 6F outsw +00001735 7220 jc 0x1757 +00001737 68656C push word 0x6c65 +0000173A 7069 jo 0x17a5 +0000173C 6E outsb +0000173D 67206D65 and [ebp+0x65],ch +00001741 206765 and [bx+0x65],ah +00001744 7420 jz 0x1766 +00001746 7468 jz 0x17b0 +00001748 6973206661 imul si,[bp+di+0x20],word 0x6166 +0000174D 7220 jc 0x176f +0000174F 676F a32 outsw +00001751 657320 gs jnc 0x1774 +00001754 746F jz 0x17c5 +00001756 3A0D cmp cl,[di] +00001758 0A616C or ah,[bx+di+0x6c] +0000175B 6C insb +0000175C 207065 and [bx+si+0x65],dh +0000175F 6F outsw +00001760 706C jo 0x17ce +00001762 65206174 and [gs:bx+di+0x74],ah +00001766 206D65 and [di+0x65],ch +00001769 6761 a32 popa +0000176B 2D746F sub ax,0x6f74 +0000176E 6B796F2E imul di,[bx+di+0x6f],byte +0x2e +00001772 636F6D arpl [bx+0x6d],bp +00001775 2C20 sub al,0x20 +00001777 6F outsw +00001778 7364 jnc 0x17de +0000177A 657665 gs jna 0x17e2 +0000177D 722E jc 0x17ad +0000177F 6E outsb +00001780 657420 gs jz 0x17a3 +00001783 61 popa +00001784 6E outsb +00001785 6420666C and [fs:bp+0x6c],ah +00001789 61 popa +0000178A 7461 jz 0x17ed +0000178C 7373 jnc 0x1801 +0000178E 656D gs insw +00001790 626C65 bound bp,[si+0x65] +00001793 722E jc 0x17c3 +00001795 6E outsb +00001796 65740D gs jz 0x17a6 +00001799 0A526F or dl,[bp+si+0x6f] +0000179C 626572 bound sp,[di+0x72] +0000179F 7420 jz 0x17c1 +000017A1 99 cwd +000017A2 7374 jnc 0x1818 +000017A4 6C insb +000017A5 696E672066 imul bp,[bp+0x67],word 0x6620 +000017AA 6F outsw +000017AB 7220 jc 0x17cd +000017AD 50 push ax +000017AE 7269 jc 0x1819 +000017B0 6D insw +000017B1 756C jnz 0x181f +000017B3 61 popa +000017B4 2C20 sub al,0x20 +000017B6 687474 push word 0x7474 +000017B9 703A jo 0x17f5 +000017BB 2F das +000017BC 2F das +000017BD 6F outsw +000017BE 7374 jnc 0x1834 +000017C0 6C insb +000017C1 696E672E6E imul bp,[bp+0x67],word 0x6e2e +000017C6 6F outsw +000017C7 2D6970 sub ax,0x7069 +000017CA 2E636F6D arpl [cs:bx+0x6d],bp +000017CE 2F das +000017CF 0D0A4A or ax,0x4a0a +000017D2 2E54 cs push sp +000017D4 68696D push word 0x6d69 +000017D7 20666F and [bp+0x6f],ah +000017DA 7220 jc 0x17fc +000017DC 45 inc bp +000017DD 656C gs insb +000017DF 4F dec di +000017E0 53 push bx +000017E1 2C20 sub al,0x20 +000017E3 687474 push word 0x7474 +000017E6 703A jo 0x1822 +000017E8 2F das +000017E9 2F das +000017EA 7777 ja 0x1863 +000017EC 772E ja 0x181c +000017EE 6C insb +000017EF 7564 jnz 0x1855 +000017F1 642E6C cs insb +000017F4 7574 jnz 0x186a +000017F6 682E73 push word 0x732e +000017F9 652F gs das +000017FB 7E69 jng 0x1866 +000017FD 7669 jna 0x1868 +000017FF 6C insb +00001800 65656C gs insb +00001803 2F das +00001804 0D0A54 or ax,0x540a +00001807 6F outsw +00001808 6D insw +00001809 61 popa +0000180A 737A jnc 0x1886 +0000180C 204772 and [bx+0x72],al +0000180F 7973 jns 0x1884 +00001811 7A74 jpe 0x1887 +00001813 61 popa +00001814 7220 jc 0x1836 +00001816 666F outsd +00001818 7220 jc 0x183a +0000181A 6661 popad +0000181C 736D jnc 0x188b +0000181E 20616E and [bx+di+0x6e],ah +00001821 64206661 and [fs:bp+0x61],ah +00001825 736D jnc 0x1894 +00001827 772C ja 0x1855 +00001829 206874 and [bx+si+0x74],ch +0000182C 7470 jz 0x189e +0000182E 3A2F cmp ch,[bx] +00001830 2F das +00001831 666C o32 insb +00001833 61 popa +00001834 7461 jz 0x1897 +00001836 7373 jnc 0x18ab +00001838 656D gs insw +0000183A 626C65 bound bp,[si+0x65] +0000183D 722E jc 0x186d +0000183F 6E outsb +00001840 65742F gs jz 0x1872 +00001843 0D0A41 or ax,0x410a +00001846 53 push bx +00001847 48 dec ax +00001848 4C dec sp +00001849 45 inc bp +0000184A 59 pop cx +0000184B 342C xor al,0x2c +0000184D 204361 and [bp+di+0x61],al +00001850 6E outsb +00001851 64792C fs jns 0x1880 +00001854 204A6F and [bp+si+0x6f],cl +00001857 686E20 push word 0x206e +0000185A 53 push bx +0000185B 2E204669 and [cs:bp+0x69],al +0000185F 6E outsb +00001860 6520616E and [gs:bx+di+0x6e],ah +00001864 64205065 and [fs:bx+si+0x65],dl +00001868 7472 jz 0x18dc +0000186A 6F outsw +0000186B 6666204865 o32 and [bx+si+0x65],cl +00001870 726F jc 0x18e1 +00001872 6A2E push byte +0x2e +00001874 005666 add [bp+0x66],dl +00001877 53 push bx +00001878 BEE816 mov si,0x16e8 +0000187B 0100 add [bx+si],ax +0000187D B307 mov bl,0x7 +0000187F E82BEF call 0x7ad +00001882 FF db 0xFF +00001883 FF665B jmp near [bp+0x5b] +00001886 5E pop si +00001887 C3 ret +00001888 E8C2ED call 0x64d +0000188B FF db 0xFF +0000188C FF db 0xFF +0000188D BE6F11 mov si,0x116f +00001890 0100 add [bx+si],ax +00001892 B30E mov bl,0xe +00001894 E816EF call 0x7ad +00001897 FF db 0xFF +00001898 FF db 0xFF +00001899 BF7B11 mov di,0x117b +0000189C 0100 add [bx+si],ax +0000189E E9F5F9 jmp 0x1296 +000018A1 FF db 0xFF +000018A2 FFC3 inc bx +000018A4 E869F6 call 0xf10 +000018A7 FF db 0xFF +000018A8 FFB0FEE6 push word [bx+si+0xe6fe] +000018AC 64EBFE fs jmp short 0x18ad +000018AF C3 ret +000018B0 0D0A7E or ax,0x7e0a +000018B3 3120 xor [bx+si],sp +000018B5 7365 jnc 0x191c +000018B7 636F6E arpl [bx+0x6e],bp +000018BA 64206861 and [fs:bx+si+0x61],ch +000018BE 7320 jnc 0x18e0 +000018C0 7061 jo 0x1923 +000018C2 7373 jnc 0x1937 +000018C4 65642E00B90500 add [cs:bx+di+0x5],bh +000018CB 0000 add [bx+si],al +000018CD 51 push cx +000018CE B96400 mov cx,0x64 +000018D1 0000 add [bx+si],al +000018D3 E8AD19 call 0x3283 +000018D6 0000 add [bx+si],al +000018D8 59 pop cx +000018D9 BEB018 mov si,0x18b0 +000018DC 0100 add [bx+si],ax +000018DE B307 mov bl,0x7 +000018E0 E8CAEE call 0x7ad +000018E3 FF db 0xFF +000018E4 FFE2 jmp dx +000018E6 E6C3 out 0xc3,al +000018E8 0D0A49 or ax,0x490a +000018EB 7420 jz 0x190d +000018ED 776F ja 0x195e +000018EF 726B jc 0x195c +000018F1 732E jnc 0x1921 +000018F3 2E2120 and [cs:bx+si],sp +000018F6 3A2D cmp ch,[di] +000018F8 44 inc sp +000018F9 0066B8 add [bp-0x48],ah +000018FC 0100 add [bx+si],ax +000018FE E8BF1C call 0x35c0 +00001901 0000 add [bx+si],al +00001903 66B900016689 mov ecx,0x89660100 +00001909 CB retf +0000190A 88C8 mov al,cl +0000190C 6651 push ecx +0000190E 66B93200E8C9 mov ecx,0xc9e80032 +00001914 1C00 sbb al,0x0 +00001916 006659 add [bp+0x59],ah +00001919 E2EC loop 0x1907 +0000191B BEF13B mov si,0x3bf1 +0000191E 0100 add [bx+si],ax +00001920 66B8040166BB mov eax,0xbb660104 +00001926 A800 test al,0x0 +00001928 66B9140066BA mov ecx,0xba660014 +0000192E 1200 adc al,[bx+si] +00001930 E8D41C call 0x3607 +00001933 0000 add [bx+si],al +00001935 BE6D3D mov si,0x3d6d +00001938 0100 add [bx+si],ax +0000193A 66B8FA0066BB mov eax,0xbb6600fa +00001940 BA0066 mov dx,0x6600 +00001943 B91400 mov cx,0x14 +00001946 66BA0E00E8BA mov edx,0xbae8000e +0000194C 1C00 sbb al,0x0 +0000194E 00BE853E add [bp+0x3e85],bh +00001952 0100 add [bx+si],ax +00001954 66B8090166BB mov eax,0xbb660109 +0000195A BA0066 mov dx,0x6600 +0000195D B91400 mov cx,0x14 +00001960 66BA0E00E8A0 mov edx,0xa0e8000e +00001966 1C00 sbb al,0x0 +00001968 00BE9D3F add [bp+0x3f9d],bh +0000196C 0100 add [bx+si],ax +0000196E 66B8180166BB mov eax,0xbb660118 +00001974 BA0066 mov dx,0x6600 +00001977 B91400 mov cx,0x14 +0000197A 66BA0E00E886 mov edx,0x86e8000e +00001980 1C00 sbb al,0x0 +00001982 00BEB540 add [bp+0x40b5],bh +00001986 0100 add [bx+si],ax +00001988 66B8180166BB mov eax,0xbb660118 +0000198E AC lodsb +0000198F 0066B9 add [bp-0x47],ah +00001992 1400 adc al,0x0 +00001994 66BA0E00E86C mov edx,0x6ce8000e +0000199A 1C00 sbb al,0x0 +0000199C 00BE6D3D add [bp+0x3d6d],bh +000019A0 0100 add [bx+si],ax +000019A2 66B8180166BB mov eax,0xbb660118 +000019A8 9E sahf +000019A9 0066B9 add [bp-0x47],ah +000019AC 1400 adc al,0x0 +000019AE 66BA0E00E852 mov edx,0x52e8000e +000019B4 1C00 sbb al,0x0 +000019B6 00BECD41 add [bp+0x41cd],bh +000019BA 0100 add [bx+si],ax +000019BC 66B82C0166BB mov eax,0xbb66012c +000019C2 BA0066 mov dx,0x6600 +000019C5 B91400 mov cx,0x14 +000019C8 66BA0E00E838 mov edx,0x38e8000e +000019CE 1C00 sbb al,0x0 +000019D0 00BECD41 add [bp+0x41cd],bh +000019D4 0100 add [bx+si],ax +000019D6 66B82C0166BB mov eax,0xbb66012c +000019DC AC lodsb +000019DD 0066B9 add [bp-0x47],ah +000019E0 1400 adc al,0x0 +000019E2 66BA0E00E81E mov edx,0x1ee8000e +000019E8 1C00 sbb al,0x0 +000019EA 00BE853E add [bp+0x3e85],bh +000019EE 0100 add [bx+si],ax +000019F0 66B82C0166BB mov eax,0xbb66012c +000019F6 9E sahf +000019F7 0066B9 add [bp-0x47],ah +000019FA 1400 adc al,0x0 +000019FC 66BA0E00E804 mov edx,0x4e8000e +00001A02 1C00 sbb al,0x0 +00001A04 00E8 add al,ch +00001A06 B7F5 mov bh,0xf5 +00001A08 FF db 0xFF +00001A09 FF66B8 jmp near [bp-0x48] +00001A0C 0100 add [bx+si],ax +00001A0E E89D1B call 0x35ae +00001A11 0000 add [bx+si],al +00001A13 BEE818 mov si,0x18e8 +00001A16 0100 add [bx+si],ax +00001A18 B301 mov bl,0x1 +00001A1A E890ED call 0x7ad +00001A1D FF db 0xFF +00001A1E FFC3 inc bx +00001A20 B30D mov bl,0xd +00001A22 B707 mov bh,0x7 +00001A24 E825ED call 0x74c +00001A27 FF db 0xFF +00001A28 FF db 0xFF +00001A29 B90002 mov cx,0x200 +00001A2C 0000 add [bx+si],al +00001A2E BF0000 mov di,0x0 +00001A31 0800 or [bx+si],al +00001A33 C7077765 mov word [bx],0x6577 +00001A37 61 popa +00001A38 6883C7 push word 0xc783 +00001A3B 0483 add al,0x83 +00001A3D E90483 jmp 0x9d44 +00001A40 F9 stc +00001A41 0075EF add [di-0x11],dh +00001A44 B600 mov dh,0x0 +00001A46 B200 mov dl,0x0 +00001A48 B500 mov ch,0x0 +00001A4A B103 mov cl,0x3 +00001A4C B301 mov bl,0x1 +00001A4E E82D20 call 0x3a7e +00001A51 0000 add [bx+si],al +00001A53 7248 jc 0x1a9d +00001A55 B90002 mov cx,0x200 +00001A58 0000 add [bx+si],al +00001A5A BF0000 mov di,0x0 +00001A5D 0800 or [bx+si],al +00001A5F C7077368 mov word [bx],0x6873 +00001A63 697483C704 imul si,[si-0x7d],word 0x4c7 +00001A68 83E904 sub cx,byte +0x4 +00001A6B 83F900 cmp cx,byte +0x0 +00001A6E 75EF jnz 0x1a5f +00001A70 B600 mov dh,0x0 +00001A72 B200 mov dl,0x0 +00001A74 B500 mov ch,0x0 +00001A76 B103 mov cl,0x3 +00001A78 B300 mov bl,0x0 +00001A7A E80120 call 0x3a7e +00001A7D 0000 add [bx+si],al +00001A7F 721C jc 0x1a9d +00001A81 BE0000 mov si,0x0 +00001A84 0800 or [bx+si],al +00001A86 B90002 mov cx,0x200 +00001A89 0000 add [bx+si],al +00001A8B AC lodsb +00001A8C 88C3 mov bl,al +00001A8E B707 mov bh,0x7 +00001A90 E8B9EC call 0x74c +00001A93 FF db 0xFF +00001A94 FF4983 dec word [bx+di-0x7d] +00001A97 F9 stc +00001A98 0075F0 add [di-0x10],dh +00001A9B EB21 jmp short 0x1abe +00001A9D B30D mov bl,0xd +00001A9F E8AAEC call 0x74c +00001AA2 FF db 0xFF +00001AA3 FFB30AE8 push word [bp+di+0xe80a] +00001AA7 A3ECFF mov [0xffec],ax +00001AAA FFB740B3 push word [bx+0xb340] +00001AAE 45 inc bp +00001AAF E89AEC call 0x74c +00001AB2 FF db 0xFF +00001AB3 FF db 0xFF +00001AB4 E8AC1E call 0x3963 +00001AB7 0000 add [bx+si],al +00001AB9 E8621F call 0x3a1e +00001ABC 0000 add [bx+si],al +00001ABE C3 ret +00001ABF 0D0A50 or ax,0x500a +00001AC2 657266 gs jc 0x1b2b +00001AC5 6F outsw +00001AC6 726D jc 0x1b35 +00001AC8 696E67206D imul bp,[bp+0x67],word 0x6d20 +00001ACD 656D gs insw +00001ACF 6F outsw +00001AD0 7279 jc 0x1b4b +00001AD2 207465 and [si+0x65],dh +00001AD5 7374 jnc 0x1b4b +00001AD7 2E000D add [cs:di],cl +00001ADA 0A546F or dl,[si+0x6f] +00001ADD 7461 jz 0x1b40 +00001ADF 6C insb +00001AE0 20696E and [bx+di+0x6e],ch +00001AE3 7374 jnc 0x1b59 +00001AE5 61 popa +00001AE6 6C insb +00001AE7 6C insb +00001AE8 6564206D65 and [fs:di+0x65],ch +00001AED 6D insw +00001AEE 6F outsw +00001AEF 7279 jc 0x1b6a +00001AF1 2028 and [bx+si],ch +00001AF3 696E206279 imul bp,[bp+0x20],word 0x7962 +00001AF8 7465 jz 0x1b5f +00001AFA 7329 jnc 0x1b25 +00001AFC 3A20 cmp ah,[bx+si] +00001AFE 000D add [di],cl +00001B00 0A0D or cl,[di] +00001B02 0A4D65 or cl,[di+0x65] +00001B05 6D insw +00001B06 6F outsw +00001B07 7279 jc 0x1b82 +00001B09 206368 and [bp+di+0x68],ah +00001B0C 756E jnz 0x1b7c +00001B0E 6B733A00 imul si,[bp+di+0x3a],byte +0x0 +00001B12 0D0A41 or ax,0x410a +00001B15 64647265 fs jc 0x1b7e +00001B19 7373 jnc 0x1b8e +00001B1B 2020 and [bx+si],ah +00001B1D 2020 and [bx+si],ah +00001B1F 53 push bx +00001B20 697A652020 imul di,[bp+si+0x65],word 0x2020 +00001B25 2020 and [bx+si],ah +00001B27 2020 and [bx+si],ah +00001B29 205479 and [si+0x79],dl +00001B2C 7065 jo 0x1b93 +00001B2E 2020 and [bx+si],ah +00001B30 2020 and [bx+si],ah +00001B32 2020 and [bx+si],ah +00001B34 205072 and [bx+si+0x72],dl +00001B37 657669 gs jna 0x1ba3 +00001B3A 6F outsw +00001B3B 7573 jnz 0x1bb0 +00001B3D 2020 and [bx+si],ah +00001B3F 204E65 and [bp+0x65],cl +00001B42 7874 js 0x1bb8 +00001B44 000D add [di],cl +00001B46 0A2D or ch,[di] +00001B48 2D2D2D sub ax,0x2d2d +00001B4B 2D2D2D sub ax,0x2d2d +00001B4E 2D2D2D sub ax,0x2d2d +00001B51 2D2D2D sub ax,0x2d2d +00001B54 2D2D2D sub ax,0x2d2d +00001B57 2D2D2D sub ax,0x2d2d +00001B5A 2D2D2D sub ax,0x2d2d +00001B5D 2D2D2D sub ax,0x2d2d +00001B60 2D2D2D sub ax,0x2d2d +00001B63 2D2D2D sub ax,0x2d2d +00001B66 2D2D2D sub ax,0x2d2d +00001B69 2D2D2D sub ax,0x2d2d +00001B6C 2D2D2D sub ax,0x2d2d +00001B6F 2D2D2D sub ax,0x2d2d +00001B72 2D2D2D sub ax,0x2d2d +00001B75 2D2D2D sub ax,0x2d2d +00001B78 2D2D2D sub ax,0x2d2d +00001B7B 2D2D2D sub ax,0x2d2d +00001B7E 0030 add [bx+si],dh +00001B80 7800 js 0x1b82 +00001B82 46 inc si +00001B83 7265 jc 0x1bea +00001B85 652020 and [gs:bx+si],ah +00001B88 2020 and [bx+si],ah +00001B8A 2020 and [bx+si],ah +00001B8C 2000 and [bx+si],al +00001B8E 55 push bp +00001B8F 7365 jnc 0x1bf6 +00001B91 642020 and [fs:bx+si],ah +00001B94 2020 and [bx+si],ah +00001B96 2020 and [bx+si],ah +00001B98 2000 and [bx+si],al +00001B9A 4E dec si +00001B9B 6F outsw +00001B9C 6E outsb +00001B9D 652020 and [gs:bx+si],ah +00001BA0 2020 and [bx+si],ah +00001BA2 2020 and [bx+si],ah +00001BA4 2000 and [bx+si],al +00001BA6 2000 and [bx+si],al +00001BA8 0D0A00 or ax,0xa +00001BAB 0000 add [bx+si],al +00001BAD 0000 add [bx+si],al +00001BAF 0000 add [bx+si],al +00001BB1 0000 add [bx+si],al +00001BB3 0100 add [bx+si],ax +00001BB5 0000 add [bx+si],al +00001BB7 0000 add [bx+si],al +00001BB9 0000 add [bx+si],al +00001BBB 0000 add [bx+si],al +00001BBD 0000 add [bx+si],al +00001BBF 0000 add [bx+si],al +00001BC1 0000 add [bx+si],al +00001BC3 005053 add [bx+si+0x53],dl +00001BC6 51 push cx +00001BC7 52 push dx +00001BC8 803DB3 cmp byte [di],0xb3 +00001BCB 1B01 sbb ax,[bx+di] +00001BCD 0000 add [bx+si],al +00001BCF 744A jz 0x1c1b +00001BD1 BB0000 mov bx,0x0 +00001BD4 0001 add [bx+di],al +00001BD6 891D mov [di],bx +00001BD8 C01B01 rcr byte [bp+di],0x1 +00001BDB 00E8 add al,ch +00001BDD 98 cbw +00001BDE 27 daa +00001BDF 0000 add [bx+si],al +00001BE1 891D mov [di],bx +00001BE3 BC1B01 mov sp,0x11b +00001BE6 00BB0000 add [bp+di+0x0],bh +00001BEA E000 loopne 0x1bec +00001BEC 89D9 mov cx,bx +00001BEE E88627 call 0x4377 +00001BF1 0000 add [bx+si],al +00001BF3 53 push bx +00001BF4 51 push cx +00001BF5 BB0000 mov bx,0x0 +00001BF8 0100 add [bx+si],ax +00001BFA 891D mov [di],bx +00001BFC B81B01 mov ax,0x11b +00001BFF 00E8 add al,ch +00001C01 7427 jz 0x1c2a +00001C03 0000 add [bx+si],al +00001C05 891D mov [di],bx +00001C07 B41B mov ah,0x1b +00001C09 0100 add [bx+si],ax +00001C0B 59 pop cx +00001C0C 5B pop bx +00001C0D E82A29 call 0x453a +00001C10 0000 add [bx+si],al +00001C12 C605B3 mov byte [di],0xb3 +00001C15 1B01 sbb ax,[bx+di] +00001C17 0000 add [bx+si],al +00001C19 EB29 jmp short 0x1c44 +00001C1B 8B1D mov bx,[di] +00001C1D B41B mov ah,0x1b +00001C1F 0100 add [bx+si],ax +00001C21 8B0D mov cx,[di] +00001C23 B81B01 mov ax,0x11b +00001C26 00E8 add al,ch +00001C28 1029 adc [bx+di],ch +00001C2A 0000 add [bx+si],al +00001C2C 8B1D mov bx,[di] +00001C2E BC1B01 mov sp,0x11b +00001C31 008B0DC0 add [bp+di+0xc00d],cl +00001C35 1B01 sbb ax,[bx+di] +00001C37 00E8 add al,ch +00001C39 FF28 jmp far [bx+si] +00001C3B 0000 add [bx+si],al +00001C3D C605B3 mov byte [di],0xb3 +00001C40 1B01 sbb ax,[bx+di] +00001C42 0001 add [bx+di],al +00001C44 BEBF1A mov si,0x1abf +00001C47 0100 add [bx+si],ax +00001C49 B307 mov bl,0x7 +00001C4B E85FEB call 0x7ad +00001C4E FF db 0xFF +00001C4F FF db 0xFF +00001C50 BED91A mov si,0x1ad9 +00001C53 0100 add [bx+si],ax +00001C55 B307 mov bl,0x7 +00001C57 E853EB call 0x7ad +00001C5A FF db 0xFF +00001C5B FF db 0xFF +00001C5C BE7F1B mov si,0x1b7f +00001C5F 0100 add [bx+si],ax +00001C61 B304 mov bl,0x4 +00001C63 E847EB call 0x7ad +00001C66 FF db 0xFF +00001C67 FF8B1DC8 dec word [bp+di+0xc81d] +00001C6B 0001 add [bx+di],al +00001C6D 00B104E8 add [bx+di+0xe804],dh +00001C71 0BEB or bp,bx +00001C73 FF db 0xFF +00001C74 FF db 0xFF +00001C75 BEFF1A mov si,0x1aff +00001C78 0100 add [bx+si],ax +00001C7A B307 mov bl,0x7 +00001C7C E82EEB call 0x7ad +00001C7F FF db 0xFF +00001C80 FF db 0xFF +00001C81 BE121B mov si,0x1b12 +00001C84 0100 add [bx+si],ax +00001C86 B307 mov bl,0x7 +00001C88 E822EB call 0x7ad +00001C8B FF db 0xFF +00001C8C FF db 0xFF +00001C8D BE451B mov si,0x1b45 +00001C90 0100 add [bx+si],ax +00001C92 B307 mov bl,0x7 +00001C94 E816EB call 0x7ad +00001C97 FF db 0xFF +00001C98 FFC7 inc di +00001C9A 05AB1B add ax,0x1bab +00001C9D 0100 add [bx+si],ax +00001C9F 0000 add [bx+si],al +00001CA1 0000 add [bx+si],al +00001CA3 A12A43 mov ax,[0x432a] +00001CA6 0100 add [bx+si],ax +00001CA8 A3AF1B mov [0x1baf],ax +00001CAB 0100 add [bx+si],ax +00001CAD A1AB1B mov ax,[0x1bab] +00001CB0 0100 add [bx+si],ax +00001CB2 8B1D mov bx,[di] +00001CB4 AF scasw +00001CB5 1B01 sbb ax,[bx+di] +00001CB7 003B add [bp+di],bh +00001CB9 05C800 add ax,0xc8 +00001CBC 0100 add [bx+si],ax +00001CBE 735E jnc 0x1d1e +00001CC0 833DAF cmp word [di],byte -0x51 +00001CC3 1B01 sbb ax,[bx+di] +00001CC5 0000 add [bx+si],al +00001CC7 7514 jnz 0x1cdd +00001CC9 8B1D mov bx,[di] +00001CCB C8000100 enter 0x100,0x0 +00001CCF 29C3 sub bx,ax +00001CD1 BF0100 mov di,0x1 +00001CD4 0000 add [bx+si],al +00001CD6 E84800 call 0x1d21 +00001CD9 0000 add [bx+si],al +00001CDB EB41 jmp short 0x1d1e +00001CDD 29C3 sub bx,ax +00001CDF BF0100 mov di,0x1 +00001CE2 0000 add [bx+si],al +00001CE4 E83A00 call 0x1d21 +00001CE7 0000 add [bx+si],al +00001CE9 A1AF1B mov ax,[0x1baf] +00001CEC 0100 add [bx+si],ax +00001CEE 83F800 cmp ax,byte +0x0 +00001CF1 742B jz 0x1d1e +00001CF3 8B5808 mov bx,[bx+si+0x8] +00001CF6 A3AB1B mov [0x1bab],ax +00001CF9 0100 add [bx+si],ax +00001CFB 891D mov [di],bx +00001CFD AF scasw +00001CFE 1B01 sbb ax,[bx+di] +00001D00 00A1AB1B add [bx+di+0x1bab],ah +00001D04 0100 add [bx+si],ax +00001D06 8B5804 mov bx,[bx+si+0x4] +00001D09 8B08 mov cx,[bx+si] +00001D0B 8B5008 mov dx,[bx+si+0x8] +00001D0E 31FF xor di,di +00001D10 E80E00 call 0x1d21 +00001D13 0000 add [bx+si],al +00001D15 01D8 add ax,bx +00001D17 A3AB1B mov [0x1bab],ax +00001D1A 0100 add [bx+si],ax +00001D1C EB8F jmp short 0x1cad +00001D1E 58 pop ax +00001D1F 5B pop bx +00001D20 59 pop cx +00001D21 5A pop dx +00001D22 C3 ret +00001D23 50 push ax +00001D24 53 push bx +00001D25 51 push cx +00001D26 52 push dx +00001D27 57 push di +00001D28 53 push bx +00001D29 BEA81B mov si,0x1ba8 +00001D2C 0100 add [bx+si],ax +00001D2E B307 mov bl,0x7 +00001D30 E87AEA call 0x7ad +00001D33 FF db 0xFF +00001D34 FF db 0xFF +00001D35 BE7F1B mov si,0x1b7f +00001D38 0100 add [bx+si],ax +00001D3A B304 mov bl,0x4 +00001D3C E86EEA call 0x7ad +00001D3F FF db 0xFF +00001D40 FF5189 call near [bx+di-0x77] +00001D43 C3 ret +00001D44 B104 mov cl,0x4 +00001D46 E835EA call 0x77e +00001D49 FF db 0xFF +00001D4A FF db 0xFF +00001D4B BEA61B mov si,0x1ba6 +00001D4E 0100 add [bx+si],ax +00001D50 B307 mov bl,0x7 +00001D52 E858EA call 0x7ad +00001D55 FF db 0xFF +00001D56 FF db 0xFF +00001D57 BE7F1B mov si,0x1b7f +00001D5A 0100 add [bx+si],ax +00001D5C B304 mov bl,0x4 +00001D5E E84CEA call 0x7ad +00001D61 FF db 0xFF +00001D62 FF595B call far [bx+di+0x5b] +00001D65 51 push cx +00001D66 B104 mov cl,0x4 +00001D68 E813EA call 0x77e +00001D6B FF db 0xFF +00001D6C FF db 0xFF +00001D6D BEA61B mov si,0x1ba6 +00001D70 0100 add [bx+si],ax +00001D72 B307 mov bl,0x7 +00001D74 E836EA call 0x7ad +00001D77 FF db 0xFF +00001D78 FF83FF01 inc word [bp+di+0x1ff] +00001D7C 7527 jnz 0x1da5 +00001D7E 59 pop cx +00001D7F BE8E1B mov si,0x1b8e +00001D82 0100 add [bx+si],ax +00001D84 B307 mov bl,0x7 +00001D86 E824EA call 0x7ad +00001D89 FF db 0xFF +00001D8A FF db 0xFF +00001D8B BE9A1B mov si,0x1b9a +00001D8E 0100 add [bx+si],ax +00001D90 B307 mov bl,0x7 +00001D92 E818EA call 0x7ad +00001D95 FF db 0xFF +00001D96 FF db 0xFF +00001D97 BE9A1B mov si,0x1b9a +00001D9A 0100 add [bx+si],ax +00001D9C B307 mov bl,0x7 +00001D9E E80CEA call 0x7ad +00001DA1 FF db 0xFF +00001DA2 FF db 0xFF +00001DA3 EB41 jmp short 0x1de6 +00001DA5 BE821B mov si,0x1b82 +00001DA8 0100 add [bx+si],ax +00001DAA B307 mov bl,0x7 +00001DAC E8FEE9 call 0x7ad +00001DAF FF db 0xFF +00001DB0 FF db 0xFF +00001DB1 BE7F1B mov si,0x1b7f +00001DB4 0100 add [bx+si],ax +00001DB6 B304 mov bl,0x4 +00001DB8 E8F2E9 call 0x7ad +00001DBB FF db 0xFF +00001DBC FF5BB1 call far [bp+di-0x4f] +00001DBF 04E8 add al,0xe8 +00001DC1 BBE9FF mov bx,0xffe9 +00001DC4 FF db 0xFF +00001DC5 BEA61B mov si,0x1ba6 +00001DC8 0100 add [bx+si],ax +00001DCA B307 mov bl,0x7 +00001DCC E8DEE9 call 0x7ad +00001DCF FF db 0xFF +00001DD0 FF db 0xFF +00001DD1 BE7F1B mov si,0x1b7f +00001DD4 0100 add [bx+si],ax +00001DD6 B304 mov bl,0x4 +00001DD8 E8D2E9 call 0x7ad +00001DDB FF db 0xFF +00001DDC FF89D3B1 dec word [bx+di+0xb1d3] +00001DE0 04E8 add al,0xe8 +00001DE2 9AE9FFFF5F call 0x5fff:0xffe9 +00001DE7 5A pop dx +00001DE8 59 pop cx +00001DE9 5B pop bx +00001DEA 58 pop ax +00001DEB C3 ret +00001DEC C3 ret +00001DED C3 ret +00001DEE C6051F mov byte [di],0x1f +00001DF1 2801 sub [bx+di],al +00001DF3 0000 add [bx+si],al +00001DF5 C60520 mov byte [di],0x20 +00001DF8 2801 sub [bx+di],al +00001DFA 0055C6 add [di-0x3a],dl +00001DFD 052128 add ax,0x2821 +00001E00 0100 add [bx+si],ax +00001E02 6E outsb +00001E03 C60522 mov byte [di],0x22 +00001E06 2801 sub [bx+di],al +00001E08 0068C6 add [bx+si-0x3a],ch +00001E0B 052328 add ax,0x2823 +00001E0E 0100 add [bx+si],ax +00001E10 61 popa +00001E11 C60524 mov byte [di],0x24 +00001E14 2801 sub [bx+di],al +00001E16 006EC6 add [bp-0x3a],ch +00001E19 052528 add ax,0x2825 +00001E1C 0100 add [bx+si],ax +00001E1E 64C60526 mov byte [fs:di],0x26 +00001E22 2801 sub [bx+di],al +00001E24 006CC6 add [si-0x3a],ch +00001E27 052728 add ax,0x2827 +00001E2A 0100 add [bx+si],ax +00001E2C 65C60528 mov byte [gs:di],0x28 +00001E30 2801 sub [bx+di],al +00001E32 0064C6 add [si-0x3a],ah +00001E35 052928 add ax,0x2829 +00001E38 0100 add [bx+si],ax +00001E3A 20C6 and dh,al +00001E3C 052A28 add ax,0x282a +00001E3F 0100 add [bx+si],ax +00001E41 49 dec cx +00001E42 C6052B mov byte [di],0x2b +00001E45 2801 sub [bx+di],al +00001E47 006EC6 add [bp-0x3a],ch +00001E4A 052C28 add ax,0x282c +00001E4D 0100 add [bx+si],ax +00001E4F 74C6 jz 0x1e17 +00001E51 052D28 add ax,0x282d +00001E54 0100 add [bx+si],ax +00001E56 20C6 and dh,al +00001E58 052E28 add ax,0x282e +00001E5B 0100 add [bx+si],ax +00001E5D 00E8 add al,ch +00001E5F 1E push ds +00001E60 0D0000 or ax,0x0 +00001E63 C6051F mov byte [di],0x1f +00001E66 2801 sub [bx+di],al +00001E68 0000 add [bx+si],al +00001E6A C60520 mov byte [di],0x20 +00001E6D 2801 sub [bx+di],al +00001E6F 0044C6 add [si-0x3a],al +00001E72 052128 add ax,0x2821 +00001E75 0100 add [bx+si],ax +00001E77 69C60522 imul ax,si,word 0x2205 +00001E7B 2801 sub [bx+di],al +00001E7D 0076C6 add [bp-0x3a],dh +00001E80 052328 add ax,0x2823 +00001E83 0100 add [bx+si],ax +00001E85 69C60524 imul ax,si,word 0x2405 +00001E89 2801 sub [bx+di],al +00001E8B 0064C6 add [si-0x3a],ah +00001E8E 052528 add ax,0x2825 +00001E91 0100 add [bx+si],ax +00001E93 65C60526 mov byte [gs:di],0x26 +00001E97 2801 sub [bx+di],al +00001E99 0020 add [bx+si],ah +00001E9B C60527 mov byte [di],0x27 +00001E9E 2801 sub [bx+di],al +00001EA0 0065C6 add [di-0x3a],ah +00001EA3 052828 add ax,0x2828 +00001EA6 0100 add [bx+si],ax +00001EA8 72C6 jc 0x1e70 +00001EAA 052928 add ax,0x2829 +00001EAD 0100 add [bx+si],ax +00001EAF 72C6 jc 0x1e77 +00001EB1 052A28 add ax,0x282a +00001EB4 0100 add [bx+si],ax +00001EB6 6F outsw +00001EB7 C6052B mov byte [di],0x2b +00001EBA 2801 sub [bx+di],al +00001EBC 0072C6 add [bp+si-0x3a],dh +00001EBF 052C28 add ax,0x282c +00001EC2 0100 add [bx+si],ax +00001EC4 20C6 and dh,al +00001EC6 052D28 add ax,0x282d +00001EC9 0100 add [bx+si],ax +00001ECB 20C6 and dh,al +00001ECD 052E28 add ax,0x282e +00001ED0 0100 add [bx+si],ax +00001ED2 00E8 add al,ch +00001ED4 A90C00 test ax,0xc +00001ED7 00C6 add dh,al +00001ED9 051F28 add ax,0x281f +00001EDC 0100 add [bx+si],ax +00001EDE 00C6 add dh,al +00001EE0 052028 add ax,0x2820 +00001EE3 0100 add [bx+si],ax +00001EE5 44 inc sp +00001EE6 C60521 mov byte [di],0x21 +00001EE9 2801 sub [bx+di],al +00001EEB 0065C6 add [di-0x3a],ah +00001EEE 052228 add ax,0x2822 +00001EF1 0100 add [bx+si],ax +00001EF3 62 db 0x62 +00001EF4 C60523 mov byte [di],0x23 +00001EF7 2801 sub [bx+di],al +00001EF9 0075C6 add [di-0x3a],dh +00001EFC 052428 add ax,0x2824 +00001EFF 0100 add [bx+si],ax +00001F01 67C6052528010020 mov byte [dword 0x12825],0x20 +00001F09 C60526 mov byte [di],0x26 +00001F0C 2801 sub [bx+di],al +00001F0E 0066C6 add [bp-0x3a],ah +00001F11 052728 add ax,0x2827 +00001F14 0100 add [bx+si],ax +00001F16 61 popa +00001F17 C60528 mov byte [di],0x28 +00001F1A 2801 sub [bx+di],al +00001F1C 0075C6 add [di-0x3a],dh +00001F1F 052928 add ax,0x2829 +00001F22 0100 add [bx+si],ax +00001F24 6C insb +00001F25 C6052A mov byte [di],0x2a +00001F28 2801 sub [bx+di],al +00001F2A 0074C6 add [si-0x3a],dh +00001F2D 052B28 add ax,0x282b +00001F30 0100 add [bx+si],ax +00001F32 20C6 and dh,al +00001F34 052C28 add ax,0x282c +00001F37 0100 add [bx+si],ax +00001F39 20C6 and dh,al +00001F3B 052D28 add ax,0x282d +00001F3E 0100 add [bx+si],ax +00001F40 20C6 and dh,al +00001F42 052E28 add ax,0x282e +00001F45 0100 add [bx+si],ax +00001F47 00E8 add al,ch +00001F49 340C xor al,0xc +00001F4B 0000 add [bx+si],al +00001F4D C6051F mov byte [di],0x1f +00001F50 2801 sub [bx+di],al +00001F52 0000 add [bx+si],al +00001F54 C60520 mov byte [di],0x20 +00001F57 2801 sub [bx+di],al +00001F59 004EC6 add [bp-0x3a],cl +00001F5C 052128 add ax,0x2821 +00001F5F 0100 add [bx+si],ax +00001F61 4D dec bp +00001F62 C60522 mov byte [di],0x22 +00001F65 2801 sub [bx+di],al +00001F67 0049C6 add [bx+di-0x3a],cl +00001F6A 052328 add ax,0x2823 +00001F6D 0100 add [bx+si],ax +00001F6F 20C6 and dh,al +00001F71 052428 add ax,0x2824 +00001F74 0100 add [bx+si],ax +00001F76 69C60525 imul ax,si,word 0x2505 +00001F7A 2801 sub [bx+di],al +00001F7C 006EC6 add [bp-0x3a],ch +00001F7F 052628 add ax,0x2826 +00001F82 0100 add [bx+si],ax +00001F84 74C6 jz 0x1f4c +00001F86 052728 add ax,0x2827 +00001F89 0100 add [bx+si],ax +00001F8B 65C60528 mov byte [gs:di],0x28 +00001F8F 2801 sub [bx+di],al +00001F91 0072C6 add [bp+si-0x3a],dh +00001F94 052928 add ax,0x2829 +00001F97 0100 add [bx+si],ax +00001F99 72C6 jc 0x1f61 +00001F9B 052A28 add ax,0x282a +00001F9E 0100 add [bx+si],ax +00001FA0 75C6 jnz 0x1f68 +00001FA2 052B28 add ax,0x282b +00001FA5 0100 add [bx+si],ax +00001FA7 70C6 jo 0x1f6f +00001FA9 052C28 add ax,0x282c +00001FAC 0100 add [bx+si],ax +00001FAE 74C6 jz 0x1f76 +00001FB0 052D28 add ax,0x282d +00001FB3 0100 add [bx+si],ax +00001FB5 20C6 and dh,al +00001FB7 052E28 add ax,0x282e +00001FBA 0100 add [bx+si],ax +00001FBC 00E8 add al,ch +00001FBE BF0B00 mov di,0xb +00001FC1 00C6 add dh,al +00001FC3 051F28 add ax,0x281f +00001FC6 0100 add [bx+si],ax +00001FC8 00C6 add dh,al +00001FCA 052028 add ax,0x2820 +00001FCD 0100 add [bx+si],ax +00001FCF 42 inc dx +00001FD0 C60521 mov byte [di],0x21 +00001FD3 2801 sub [bx+di],al +00001FD5 0072C6 add [bp+si-0x3a],dh +00001FD8 052228 add ax,0x2822 +00001FDB 0100 add [bx+si],ax +00001FDD 65C60523 mov byte [gs:di],0x23 +00001FE1 2801 sub [bx+di],al +00001FE3 0061C6 add [bx+di-0x3a],ah +00001FE6 052428 add ax,0x2824 +00001FE9 0100 add [bx+si],ax +00001FEB 6BC605 imul ax,si,byte +0x5 +00001FEE 252801 and ax,0x128 +00001FF1 0070C6 add [bx+si-0x3a],dh +00001FF4 052628 add ax,0x2826 +00001FF7 0100 add [bx+si],ax +00001FF9 6F outsw +00001FFA C60527 mov byte [di],0x27 +00001FFD 2801 sub [bx+di],al +00001FFF 0069C6 add [bx+di-0x3a],ch +00002002 052828 add ax,0x2828 +00002005 0100 add [bx+si],ax +00002007 6E outsb +00002008 C60529 mov byte [di],0x29 +0000200B 2801 sub [bx+di],al +0000200D 0074C6 add [si-0x3a],dh +00002010 052A28 add ax,0x282a +00002013 0100 add [bx+si],ax +00002015 20C6 and dh,al +00002017 052B28 add ax,0x282b +0000201A 0100 add [bx+si],ax +0000201C 20C6 and dh,al +0000201E 052C28 add ax,0x282c +00002021 0100 add [bx+si],ax +00002023 20C6 and dh,al +00002025 052D28 add ax,0x282d +00002028 0100 add [bx+si],ax +0000202A 20C6 and dh,al +0000202C 052E28 add ax,0x282e +0000202F 0100 add [bx+si],ax +00002031 00E8 add al,ch +00002033 4A dec dx +00002034 0B00 or ax,[bx+si] +00002036 00C6 add dh,al +00002038 051F28 add ax,0x281f +0000203B 0100 add [bx+si],ax +0000203D 00C6 add dh,al +0000203F 052028 add ax,0x2820 +00002042 0100 add [bx+si],ax +00002044 4F dec di +00002045 C60521 mov byte [di],0x21 +00002048 2801 sub [bx+di],al +0000204A 0076C6 add [bp-0x3a],dh +0000204D 052228 add ax,0x2822 +00002050 0100 add [bx+si],ax +00002052 65C60523 mov byte [gs:di],0x23 +00002056 2801 sub [bx+di],al +00002058 0072C6 add [bp+si-0x3a],dh +0000205B 052428 add ax,0x2824 +0000205E 0100 add [bx+si],ax +00002060 66C60525 o32 mov byte [di],0x25 +00002064 2801 sub [bx+di],al +00002066 006CC6 add [si-0x3a],ch +00002069 052628 add ax,0x2826 +0000206C 0100 add [bx+si],ax +0000206E 6F outsw +0000206F C60527 mov byte [di],0x27 +00002072 2801 sub [bx+di],al +00002074 0077C6 add [bx-0x3a],dh +00002077 052828 add ax,0x2828 +0000207A 0100 add [bx+si],ax +0000207C 20C6 and dh,al +0000207E 052928 add ax,0x2829 +00002081 0100 add [bx+si],ax +00002083 66C6052A o32 mov byte [di],0x2a +00002087 2801 sub [bx+di],al +00002089 0061C6 add [bx+di-0x3a],ah +0000208C 052B28 add ax,0x282b +0000208F 0100 add [bx+si],ax +00002091 75C6 jnz 0x2059 +00002093 052C28 add ax,0x282c +00002096 0100 add [bx+si],ax +00002098 6C insb +00002099 C6052D mov byte [di],0x2d +0000209C 2801 sub [bx+di],al +0000209E 0074C6 add [si-0x3a],dh +000020A1 052E28 add ax,0x282e +000020A4 0100 add [bx+si],ax +000020A6 00E8 add al,ch +000020A8 D50A aad +000020AA 0000 add [bx+si],al +000020AC C6051F mov byte [di],0x1f +000020AF 2801 sub [bx+di],al +000020B1 0000 add [bx+si],al +000020B3 C60520 mov byte [di],0x20 +000020B6 2801 sub [bx+di],al +000020B8 0042C6 add [bp+si-0x3a],al +000020BB 052128 add ax,0x2821 +000020BE 0100 add [bx+si],ax +000020C0 6F outsw +000020C1 C60522 mov byte [di],0x22 +000020C4 2801 sub [bx+di],al +000020C6 0075C6 add [di-0x3a],dh +000020C9 052328 add ax,0x2823 +000020CC 0100 add [bx+si],ax +000020CE 6E outsb +000020CF C60524 mov byte [di],0x24 +000020D2 2801 sub [bx+di],al +000020D4 0064C6 add [si-0x3a],ah +000020D7 052528 add ax,0x2825 +000020DA 0100 add [bx+si],ax +000020DC 73C6 jnc 0x20a4 +000020DE 052628 add ax,0x2826 +000020E1 0100 add [bx+si],ax +000020E3 20C6 and dh,al +000020E5 052728 add ax,0x2827 +000020E8 0100 add [bx+si],ax +000020EA 63C6 arpl si,ax +000020EC 052828 add ax,0x2828 +000020EF 0100 add [bx+si],ax +000020F1 68C605 push word 0x5c6 +000020F4 2928 sub [bx+si],bp +000020F6 0100 add [bx+si],ax +000020F8 65C6052A mov byte [gs:di],0x2a +000020FC 2801 sub [bx+di],al +000020FE 0063C6 add [bp+di-0x3a],ah +00002101 052B28 add ax,0x282b +00002104 0100 add [bx+si],ax +00002106 6BC605 imul ax,si,byte +0x5 +00002109 2C28 sub al,0x28 +0000210B 0100 add [bx+si],ax +0000210D 20C6 and dh,al +0000210F 052D28 add ax,0x282d +00002112 0100 add [bx+si],ax +00002114 20C6 and dh,al +00002116 052E28 add ax,0x282e +00002119 0100 add [bx+si],ax +0000211B 00E8 add al,ch +0000211D 60 pusha +0000211E 0A00 or al,[bx+si] +00002120 00C6 add dh,al +00002122 051F28 add ax,0x281f +00002125 0100 add [bx+si],ax +00002127 00C6 add dh,al +00002129 052028 add ax,0x2820 +0000212C 0100 add [bx+si],ax +0000212E 49 dec cx +0000212F C60521 mov byte [di],0x21 +00002132 2801 sub [bx+di],al +00002134 006EC6 add [bp-0x3a],ch +00002137 052228 add ax,0x2822 +0000213A 0100 add [bx+si],ax +0000213C 76C6 jna 0x2104 +0000213E 052328 add ax,0x2823 +00002141 0100 add [bx+si],ax +00002143 61 popa +00002144 C60524 mov byte [di],0x24 +00002147 2801 sub [bx+di],al +00002149 006CC6 add [si-0x3a],ch +0000214C 052528 add ax,0x2825 +0000214F 0100 add [bx+si],ax +00002151 69C60526 imul ax,si,word 0x2605 +00002155 2801 sub [bx+di],al +00002157 0064C6 add [si-0x3a],ah +0000215A 052728 add ax,0x2827 +0000215D 0100 add [bx+si],ax +0000215F 20C6 and dh,al +00002161 052828 add ax,0x2828 +00002164 0100 add [bx+si],ax +00002166 6F outsw +00002167 C60529 mov byte [di],0x29 +0000216A 2801 sub [bx+di],al +0000216C 0070C6 add [bx+si-0x3a],dh +0000216F 052A28 add ax,0x282a +00002172 0100 add [bx+si],ax +00002174 63C6 arpl si,ax +00002176 052B28 add ax,0x282b +00002179 0100 add [bx+si],ax +0000217B 6F outsw +0000217C C6052C mov byte [di],0x2c +0000217F 2801 sub [bx+di],al +00002181 0064C6 add [si-0x3a],ah +00002184 052D28 add ax,0x282d +00002187 0100 add [bx+si],ax +00002189 65C6052E mov byte [gs:di],0x2e +0000218D 2801 sub [bx+di],al +0000218F 0000 add [bx+si],al +00002191 E8EB09 call 0x2b7f +00002194 0000 add [bx+si],al +00002196 C6051F mov byte [di],0x1f +00002199 2801 sub [bx+di],al +0000219B 0000 add [bx+si],al +0000219D C60520 mov byte [di],0x20 +000021A0 2801 sub [bx+di],al +000021A2 004EC6 add [bp-0x3a],cl +000021A5 052128 add ax,0x2821 +000021A8 0100 add [bx+si],ax +000021AA 6F outsw +000021AB C60522 mov byte [di],0x22 +000021AE 2801 sub [bx+di],al +000021B0 0020 add [bx+si],ah +000021B2 C60523 mov byte [di],0x23 +000021B5 2801 sub [bx+di],al +000021B7 0063C6 add [bp+di-0x3a],ah +000021BA 052428 add ax,0x2824 +000021BD 0100 add [bx+si],ax +000021BF 6F outsw +000021C0 C60525 mov byte [di],0x25 +000021C3 2801 sub [bx+di],al +000021C5 0070C6 add [bx+si-0x3a],dh +000021C8 052628 add ax,0x2826 +000021CB 0100 add [bx+si],ax +000021CD 2EC60527 mov byte [cs:di],0x27 +000021D1 2801 sub [bx+di],al +000021D3 0020 add [bx+si],ah +000021D5 C60528 mov byte [di],0x28 +000021D8 2801 sub [bx+di],al +000021DA 0061C6 add [bx+di-0x3a],ah +000021DD 052928 add ax,0x2829 +000021E0 0100 add [bx+si],ax +000021E2 76C6 jna 0x21aa +000021E4 052A28 add ax,0x282a +000021E7 0100 add [bx+si],ax +000021E9 61 popa +000021EA C6052B mov byte [di],0x2b +000021ED 2801 sub [bx+di],al +000021EF 0069C6 add [bx+di-0x3a],ch +000021F2 052C28 add ax,0x282c +000021F5 0100 add [bx+si],ax +000021F7 6C insb +000021F8 C6052D mov byte [di],0x2d +000021FB 2801 sub [bx+di],al +000021FD 002EC605 add [0x5c6],ch +00002201 2E2801 sub [cs:bx+di],al +00002204 0000 add [bx+si],al +00002206 E87609 call 0x2b7f +00002209 0000 add [bx+si],al +0000220B C6051F mov byte [di],0x1f +0000220E 2801 sub [bx+di],al +00002210 0000 add [bx+si],al +00002212 C60520 mov byte [di],0x20 +00002215 2801 sub [bx+di],al +00002217 0044C6 add [si-0x3a],al +0000221A 052128 add ax,0x2821 +0000221D 0100 add [bx+si],ax +0000221F 6F outsw +00002220 C60522 mov byte [di],0x22 +00002223 2801 sub [bx+di],al +00002225 0075C6 add [di-0x3a],dh +00002228 052328 add ax,0x2823 +0000222B 0100 add [bx+si],ax +0000222D 62 db 0x62 +0000222E C60524 mov byte [di],0x24 +00002231 2801 sub [bx+di],al +00002233 006CC6 add [si-0x3a],ch +00002236 052528 add ax,0x2825 +00002239 0100 add [bx+si],ax +0000223B 65C60526 mov byte [gs:di],0x26 +0000223F 2801 sub [bx+di],al +00002241 0020 add [bx+si],ah +00002243 C60527 mov byte [di],0x27 +00002246 2801 sub [bx+di],al +00002248 0066C6 add [bp-0x3a],ah +0000224B 052828 add ax,0x2828 +0000224E 0100 add [bx+si],ax +00002250 61 popa +00002251 C60529 mov byte [di],0x29 +00002254 2801 sub [bx+di],al +00002256 0075C6 add [di-0x3a],dh +00002259 052A28 add ax,0x282a +0000225C 0100 add [bx+si],ax +0000225E 6C insb +0000225F C6052B mov byte [di],0x2b +00002262 2801 sub [bx+di],al +00002264 0074C6 add [si-0x3a],dh +00002267 052C28 add ax,0x282c +0000226A 0100 add [bx+si],ax +0000226C 20C6 and dh,al +0000226E 052D28 add ax,0x282d +00002271 0100 add [bx+si],ax +00002273 20C6 and dh,al +00002275 052E28 add ax,0x282e +00002278 0100 add [bx+si],ax +0000227A 00E8 add al,ch +0000227C 0109 add [bx+di],cx +0000227E 0000 add [bx+si],al +00002280 C6051F mov byte [di],0x1f +00002283 2801 sub [bx+di],al +00002285 0000 add [bx+si],al +00002287 C60520 mov byte [di],0x20 +0000228A 2801 sub [bx+di],al +0000228C 0043C6 add [bp+di-0x3a],al +0000228F 052128 add ax,0x2821 +00002292 0100 add [bx+si],ax +00002294 6F outsw +00002295 C60522 mov byte [di],0x22 +00002298 2801 sub [bx+di],al +0000229A 0070C6 add [bx+si-0x3a],dh +0000229D 052328 add ax,0x2823 +000022A0 0100 add [bx+si],ax +000022A2 72C6 jc 0x226a +000022A4 052428 add ax,0x2824 +000022A7 0100 add [bx+si],ax +000022A9 6F outsw +000022AA C60525 mov byte [di],0x25 +000022AD 2801 sub [bx+di],al +000022AF 002EC605 add [0x5c6],ch +000022B3 262801 sub [es:bx+di],al +000022B6 0020 add [bx+si],ah +000022B8 C60527 mov byte [di],0x27 +000022BB 2801 sub [bx+di],al +000022BD 0073C6 add [bp+di-0x3a],dh +000022C0 052828 add ax,0x2828 +000022C3 0100 add [bx+si],ax +000022C5 65C60529 mov byte [gs:di],0x29 +000022C9 2801 sub [bx+di],al +000022CB 0067C6 add [bx-0x3a],ah +000022CE 052A28 add ax,0x282a +000022D1 0100 add [bx+si],ax +000022D3 6D insw +000022D4 C6052B mov byte [di],0x2b +000022D7 2801 sub [bx+di],al +000022D9 0065C6 add [di-0x3a],ah +000022DC 052C28 add ax,0x282c +000022DF 0100 add [bx+si],ax +000022E1 6E outsb +000022E2 C6052D mov byte [di],0x2d +000022E5 2801 sub [bx+di],al +000022E7 0074C6 add [si-0x3a],dh +000022EA 052E28 add ax,0x282e +000022ED 0100 add [bx+si],ax +000022EF 00E8 add al,ch +000022F1 8C08 mov [bx+si],cs +000022F3 0000 add [bx+si],al +000022F5 C6051F mov byte [di],0x1f +000022F8 2801 sub [bx+di],al +000022FA 0000 add [bx+si],al +000022FC C60520 mov byte [di],0x20 +000022FF 2801 sub [bx+di],al +00002301 0049C6 add [bx+di-0x3a],cl +00002304 052128 add ax,0x2821 +00002307 0100 add [bx+si],ax +00002309 6E outsb +0000230A C60522 mov byte [di],0x22 +0000230D 2801 sub [bx+di],al +0000230F 0076C6 add [bp-0x3a],dh +00002312 052328 add ax,0x2823 +00002315 0100 add [bx+si],ax +00002317 61 popa +00002318 C60524 mov byte [di],0x24 +0000231B 2801 sub [bx+di],al +0000231D 006CC6 add [si-0x3a],ch +00002320 052528 add ax,0x2825 +00002323 0100 add [bx+si],ax +00002325 69C60526 imul ax,si,word 0x2605 +00002329 2801 sub [bx+di],al +0000232B 0064C6 add [si-0x3a],ah +0000232E 052728 add ax,0x2827 +00002331 0100 add [bx+si],ax +00002333 20C6 and dh,al +00002335 052828 add ax,0x2828 +00002338 0100 add [bx+si],ax +0000233A 54 push sp +0000233B C60529 mov byte [di],0x29 +0000233E 2801 sub [bx+di],al +00002340 0053C6 add [bp+di-0x3a],dl +00002343 052A28 add ax,0x282a +00002346 0100 add [bx+si],ax +00002348 53 push bx +00002349 C6052B mov byte [di],0x2b +0000234C 2801 sub [bx+di],al +0000234E 0021 add [bx+di],ah +00002350 C6052C mov byte [di],0x2c +00002353 2801 sub [bx+di],al +00002355 0020 add [bx+si],ah +00002357 C6052D mov byte [di],0x2d +0000235A 2801 sub [bx+di],al +0000235C 0020 add [bx+si],ah +0000235E C6052E mov byte [di],0x2e +00002361 2801 sub [bx+di],al +00002363 0000 add [bx+si],al +00002365 E81708 call 0x2b7f +00002368 0000 add [bx+si],al +0000236A C6051F mov byte [di],0x1f +0000236D 2801 sub [bx+di],al +0000236F 0000 add [bx+si],al +00002371 C60520 mov byte [di],0x20 +00002374 2801 sub [bx+di],al +00002376 004EC6 add [bp-0x3a],cl +00002379 052128 add ax,0x2821 +0000237C 0100 add [bx+si],ax +0000237E 6F outsw +0000237F C60522 mov byte [di],0x22 +00002382 2801 sub [bx+di],al +00002384 0020 add [bx+si],ah +00002386 C60523 mov byte [di],0x23 +00002389 2801 sub [bx+di],al +0000238B 0073C6 add [bp+di-0x3a],dh +0000238E 052428 add ax,0x2824 +00002391 0100 add [bx+si],ax +00002393 65C60525 mov byte [gs:di],0x25 +00002397 2801 sub [bx+di],al +00002399 0067C6 add [bx-0x3a],ah +0000239C 052628 add ax,0x2826 +0000239F 0100 add [bx+si],ax +000023A1 6D insw +000023A2 C60527 mov byte [di],0x27 +000023A5 2801 sub [bx+di],al +000023A7 0065C6 add [di-0x3a],ah +000023AA 052828 add ax,0x2828 +000023AD 0100 add [bx+si],ax +000023AF 6E outsb +000023B0 C60529 mov byte [di],0x29 +000023B3 2801 sub [bx+di],al +000023B5 0074C6 add [si-0x3a],dh +000023B8 052A28 add ax,0x282a +000023BB 0100 add [bx+si],ax +000023BD 21C6 and si,ax +000023BF 052B28 add ax,0x282b +000023C2 0100 add [bx+si],ax +000023C4 20C6 and dh,al +000023C6 052C28 add ax,0x282c +000023C9 0100 add [bx+si],ax +000023CB 20C6 and dh,al +000023CD 052D28 add ax,0x282d +000023D0 0100 add [bx+si],ax +000023D2 20C6 and dh,al +000023D4 052E28 add ax,0x282e +000023D7 0100 add [bx+si],ax +000023D9 00E8 add al,ch +000023DB A20700 mov [0x7],al +000023DE 00C6 add dh,al +000023E0 051F28 add ax,0x281f +000023E3 0100 add [bx+si],ax +000023E5 00C6 add dh,al +000023E7 052028 add ax,0x2820 +000023EA 0100 add [bx+si],ax +000023EC 53 push bx +000023ED C60521 mov byte [di],0x21 +000023F0 2801 sub [bx+di],al +000023F2 0074C6 add [si-0x3a],dh +000023F5 052228 add ax,0x2822 +000023F8 0100 add [bx+si],ax +000023FA 61 popa +000023FB C60523 mov byte [di],0x23 +000023FE 2801 sub [bx+di],al +00002400 0063C6 add [bp+di-0x3a],ah +00002403 052428 add ax,0x2824 +00002406 0100 add [bx+si],ax +00002408 6BC605 imul ax,si,byte +0x5 +0000240B 252801 and ax,0x128 +0000240E 0020 add [bx+si],ah +00002410 C60526 mov byte [di],0x26 +00002413 2801 sub [bx+di],al +00002415 0066C6 add [bp-0x3a],ah +00002418 052728 add ax,0x2827 +0000241B 0100 add [bx+si],ax +0000241D 61 popa +0000241E C60528 mov byte [di],0x28 +00002421 2801 sub [bx+di],al +00002423 0075C6 add [di-0x3a],dh +00002426 052928 add ax,0x2829 +00002429 0100 add [bx+si],ax +0000242B 6C insb +0000242C C6052A mov byte [di],0x2a +0000242F 2801 sub [bx+di],al +00002431 0074C6 add [si-0x3a],dh +00002434 052B28 add ax,0x282b +00002437 0100 add [bx+si],ax +00002439 21C6 and si,ax +0000243B 052C28 add ax,0x282c +0000243E 0100 add [bx+si],ax +00002440 20C6 and dh,al +00002442 052D28 add ax,0x282d +00002445 0100 add [bx+si],ax +00002447 20C6 and dh,al +00002449 052E28 add ax,0x282e +0000244C 0100 add [bx+si],ax +0000244E 00E8 add al,ch +00002450 2D0700 sub ax,0x7 +00002453 00C6 add dh,al +00002455 051F28 add ax,0x281f +00002458 0100 add [bx+si],ax +0000245A 00C6 add dh,al +0000245C 052028 add ax,0x2820 +0000245F 0100 add [bx+si],ax +00002461 54 push sp +00002462 C60521 mov byte [di],0x21 +00002465 2801 sub [bx+di],al +00002467 0072C6 add [bp+si-0x3a],dh +0000246A 052228 add ax,0x2822 +0000246D 0100 add [bx+si],ax +0000246F 69C60523 imul ax,si,word 0x2305 +00002473 2801 sub [bx+di],al +00002475 0070C6 add [bx+si-0x3a],dh +00002478 052428 add ax,0x2824 +0000247B 0100 add [bx+si],ax +0000247D 6C insb +0000247E C60525 mov byte [di],0x25 +00002481 2801 sub [bx+di],al +00002483 0065C6 add [di-0x3a],ah +00002486 052628 add ax,0x2826 +00002489 0100 add [bx+si],ax +0000248B 20C6 and dh,al +0000248D 052728 add ax,0x2827 +00002490 0100 add [bx+si],ax +00002492 66C60528 o32 mov byte [di],0x28 +00002496 2801 sub [bx+di],al +00002498 0061C6 add [bx+di-0x3a],ah +0000249B 052928 add ax,0x2829 +0000249E 0100 add [bx+si],ax +000024A0 75C6 jnz 0x2468 +000024A2 052A28 add ax,0x282a +000024A5 0100 add [bx+si],ax +000024A7 6C insb +000024A8 C6052B mov byte [di],0x2b +000024AB 2801 sub [bx+di],al +000024AD 0074C6 add [si-0x3a],dh +000024B0 052C28 add ax,0x282c +000024B3 0100 add [bx+si],ax +000024B5 21C6 and si,ax +000024B7 052D28 add ax,0x282d +000024BA 0100 add [bx+si],ax +000024BC 20C6 and dh,al +000024BE 052E28 add ax,0x282e +000024C1 0100 add [bx+si],ax +000024C3 00E8 add al,ch +000024C5 B80600 mov ax,0x6 +000024C8 00C6 add dh,al +000024CA 051F28 add ax,0x281f +000024CD 0100 add [bx+si],ax +000024CF 00C6 add dh,al +000024D1 052028 add ax,0x2820 +000024D4 0100 add [bx+si],ax +000024D6 50 push ax +000024D7 C60521 mov byte [di],0x21 +000024DA 2801 sub [bx+di],al +000024DC 0061C6 add [bx+di-0x3a],ah +000024DF 052228 add ax,0x2822 +000024E2 0100 add [bx+si],ax +000024E4 67C6052328010065 mov byte [dword 0x12823],0x65 +000024EC C60524 mov byte [di],0x24 +000024EF 2801 sub [bx+di],al +000024F1 0020 add [bx+si],ah +000024F3 C60525 mov byte [di],0x25 +000024F6 2801 sub [bx+di],al +000024F8 0066C6 add [bp-0x3a],ah +000024FB 052628 add ax,0x2826 +000024FE 0100 add [bx+si],ax +00002500 61 popa +00002501 C60527 mov byte [di],0x27 +00002504 2801 sub [bx+di],al +00002506 0075C6 add [di-0x3a],dh +00002509 052828 add ax,0x2828 +0000250C 0100 add [bx+si],ax +0000250E 6C insb +0000250F C60529 mov byte [di],0x29 +00002512 2801 sub [bx+di],al +00002514 0074C6 add [si-0x3a],dh +00002517 052A28 add ax,0x282a +0000251A 0100 add [bx+si],ax +0000251C 21C6 and si,ax +0000251E 052B28 add ax,0x282b +00002521 0100 add [bx+si],ax +00002523 20C6 and dh,al +00002525 052C28 add ax,0x282c +00002528 0100 add [bx+si],ax +0000252A 20C6 and dh,al +0000252C 052D28 add ax,0x282d +0000252F 0100 add [bx+si],ax +00002531 20C6 and dh,al +00002533 052E28 add ax,0x282e +00002536 0100 add [bx+si],ax +00002538 00E8 add al,ch +0000253A 43 inc bx +0000253B 06 push es +0000253C 0000 add [bx+si],al +0000253E C6051F mov byte [di],0x1f +00002541 2801 sub [bx+di],al +00002543 0000 add [bx+si],al +00002545 C60520 mov byte [di],0x20 +00002548 2801 sub [bx+di],al +0000254A 0043C6 add [bp+di-0x3a],al +0000254D 052128 add ax,0x2821 +00002550 0100 add [bx+si],ax +00002552 6F outsw +00002553 C60522 mov byte [di],0x22 +00002556 2801 sub [bx+di],al +00002558 0070C6 add [bx+si-0x3a],dh +0000255B 052328 add ax,0x2823 +0000255E 0100 add [bx+si],ax +00002560 72C6 jc 0x2528 +00002562 052428 add ax,0x2824 +00002565 0100 add [bx+si],ax +00002567 6F outsw +00002568 C60525 mov byte [di],0x25 +0000256B 2801 sub [bx+di],al +0000256D 0063C6 add [bp+di-0x3a],ah +00002570 052628 add ax,0x2826 +00002573 0100 add [bx+si],ax +00002575 65C60527 mov byte [gs:di],0x27 +00002579 2801 sub [bx+di],al +0000257B 0073C6 add [bp+di-0x3a],dh +0000257E 052828 add ax,0x2828 +00002581 0100 add [bx+si],ax +00002583 73C6 jnc 0x254b +00002585 052928 add ax,0x2829 +00002588 0100 add [bx+si],ax +0000258A 6F outsw +0000258B C6052A mov byte [di],0x2a +0000258E 2801 sub [bx+di],al +00002590 0072C6 add [bp+si-0x3a],dh +00002593 052B28 add ax,0x282b +00002596 0100 add [bx+si],ax +00002598 21C6 and si,ax +0000259A 052C28 add ax,0x282c +0000259D 0100 add [bx+si],ax +0000259F 20C6 and dh,al +000025A1 052D28 add ax,0x282d +000025A4 0100 add [bx+si],ax +000025A6 20C6 and dh,al +000025A8 052E28 add ax,0x282e +000025AB 0100 add [bx+si],ax +000025AD 00E8 add al,ch +000025AF CE into +000025B0 050000 add ax,0x0 +000025B3 C6051F mov byte [di],0x1f +000025B6 2801 sub [bx+di],al +000025B8 0000 add [bx+si],al +000025BA C60520 mov byte [di],0x20 +000025BD 2801 sub [bx+di],al +000025BF 0041C6 add [bx+di-0x3a],al +000025C2 052128 add ax,0x2821 +000025C5 0100 add [bx+si],ax +000025C7 6C insb +000025C8 C60522 mov byte [di],0x22 +000025CB 2801 sub [bx+di],al +000025CD 0069C6 add [bx+di-0x3a],ch +000025D0 052328 add ax,0x2823 +000025D3 0100 add [bx+si],ax +000025D5 67C605242801006E mov byte [dword 0x12824],0x6e +000025DD C60525 mov byte [di],0x25 +000025E0 2801 sub [bx+di],al +000025E2 006DC6 add [di-0x3a],ch +000025E5 052628 add ax,0x2826 +000025E8 0100 add [bx+si],ax +000025EA 65C60527 mov byte [gs:di],0x27 +000025EE 2801 sub [bx+di],al +000025F0 006EC6 add [bp-0x3a],ch +000025F3 052828 add ax,0x2828 +000025F6 0100 add [bx+si],ax +000025F8 74C6 jz 0x25c0 +000025FA 052928 add ax,0x2829 +000025FD 0100 add [bx+si],ax +000025FF 20C6 and dh,al +00002601 052A28 add ax,0x282a +00002604 0100 add [bx+si],ax +00002606 63C6 arpl si,ax +00002608 052B28 add ax,0x282b +0000260B 0100 add [bx+si],ax +0000260D 68C605 push word 0x5c6 +00002610 2C28 sub al,0x28 +00002612 0100 add [bx+si],ax +00002614 6BC605 imul ax,si,byte +0x5 +00002617 2D2801 sub ax,0x128 +0000261A 002EC605 add [0x5c6],ch +0000261E 2E2801 sub [cs:bx+di],al +00002621 0000 add [bx+si],al +00002623 E85905 call 0x2b7f +00002626 0000 add [bx+si],al +00002628 C6051F mov byte [di],0x1f +0000262B 2801 sub [bx+di],al +0000262D 0000 add [bx+si],al +0000262F C60520 mov byte [di],0x20 +00002632 2801 sub [bx+di],al +00002634 004DC6 add [di-0x3a],cl +00002637 052128 add ax,0x2821 +0000263A 0100 add [bx+si],ax +0000263C 61 popa +0000263D C60522 mov byte [di],0x22 +00002640 2801 sub [bx+di],al +00002642 0063C6 add [bp+di-0x3a],ah +00002645 052328 add ax,0x2823 +00002648 0100 add [bx+si],ax +0000264A 68C605 push word 0x5c6 +0000264D 2428 and al,0x28 +0000264F 0100 add [bx+si],ax +00002651 69C60525 imul ax,si,word 0x2505 +00002655 2801 sub [bx+di],al +00002657 006EC6 add [bp-0x3a],ch +0000265A 052628 add ax,0x2826 +0000265D 0100 add [bx+si],ax +0000265F 65C60527 mov byte [gs:di],0x27 +00002663 2801 sub [bx+di],al +00002665 0020 add [bx+si],ah +00002667 C60528 mov byte [di],0x28 +0000266A 2801 sub [bx+di],al +0000266C 0063C6 add [bp+di-0x3a],ah +0000266F 052928 add ax,0x2829 +00002672 0100 add [bx+si],ax +00002674 68C605 push word 0x5c6 +00002677 2A28 sub ch,[bx+si] +00002679 0100 add [bx+si],ax +0000267B 65C6052B mov byte [gs:di],0x2b +0000267F 2801 sub [bx+di],al +00002681 0063C6 add [bp+di-0x3a],ah +00002684 052C28 add ax,0x282c +00002687 0100 add [bx+si],ax +00002689 6BC605 imul ax,si,byte +0x5 +0000268C 2D2801 sub ax,0x128 +0000268F 0021 add [bx+di],ah +00002691 C6052E mov byte [di],0x2e +00002694 2801 sub [bx+di],al +00002696 0000 add [bx+si],al +00002698 E8E404 call 0x2b7f +0000269B 0000 add [bx+si],al +0000269D C6051F mov byte [di],0x1f +000026A0 2801 sub [bx+di],al +000026A2 0000 add [bx+si],al +000026A4 C60520 mov byte [di],0x20 +000026A7 2801 sub [bx+di],al +000026A9 0053C6 add [bp+di-0x3a],dl +000026AC 052128 add ax,0x2821 +000026AF 0100 add [bx+si],ax +000026B1 49 dec cx +000026B2 C60522 mov byte [di],0x22 +000026B5 2801 sub [bx+di],al +000026B7 004DC6 add [di-0x3a],cl +000026BA 052328 add ax,0x2823 +000026BD 0100 add [bx+si],ax +000026BF 44 inc sp +000026C0 C60524 mov byte [di],0x24 +000026C3 2801 sub [bx+di],al +000026C5 0020 add [bx+si],ah +000026C7 C60525 mov byte [di],0x25 +000026CA 2801 sub [bx+di],al +000026CC 0066C6 add [bp-0x3a],ah +000026CF 052628 add ax,0x2826 +000026D2 0100 add [bx+si],ax +000026D4 6C insb +000026D5 C60527 mov byte [di],0x27 +000026D8 2801 sub [bx+di],al +000026DA 006FC6 add [bx-0x3a],ch +000026DD 052828 add ax,0x2828 +000026E0 0100 add [bx+si],ax +000026E2 61 popa +000026E3 C60529 mov byte [di],0x29 +000026E6 2801 sub [bx+di],al +000026E8 0074C6 add [si-0x3a],dh +000026EB 052A28 add ax,0x282a +000026EE 0100 add [bx+si],ax +000026F0 2EC6052B mov byte [cs:di],0x2b +000026F4 2801 sub [bx+di],al +000026F6 002D add [di],ch +000026F8 C6052C mov byte [di],0x2c +000026FB 2801 sub [bx+di],al +000026FD 0070C6 add [bx+si-0x3a],dh +00002700 052D28 add ax,0x282d +00002703 0100 add [bx+si],ax +00002705 2EC6052E mov byte [cs:di],0x2e +00002709 2801 sub [bx+di],al +0000270B 0000 add [bx+si],al +0000270D E86F04 call 0x2b7f +00002710 0000 add [bx+si],al +00002712 60 pusha +00002713 0FA8 push gs +00002715 0FA0 push fs +00002717 1E push ds +00002718 06 push es +00002719 E8240A call 0x3140 +0000271C 0000 add [bx+si],al +0000271E 07 pop es +0000271F 1F pop ds +00002720 0FA1 pop fs +00002722 0FA9 pop gs +00002724 61 popa +00002725 CF iret +00002726 60 pusha +00002727 0FA8 push gs +00002729 0FA0 push fs +0000272B 1E push ds +0000272C 06 push es +0000272D 56 push si +0000272E E87FE6 call 0xdb0 +00002731 FF db 0xFF +00002732 FF5E07 call far [bp+0x7] +00002735 1F pop ds +00002736 0FA1 pop fs +00002738 0FA9 pop gs +0000273A 61 popa +0000273B CF iret +0000273C 0FA8 push gs +0000273E 0FA0 push fs +00002740 1E push ds +00002741 06 push es +00002742 E87DE5 call 0xcc2 +00002745 FF db 0xFF +00002746 FF07 inc word [bx] +00002748 1F pop ds +00002749 0FA1 pop fs +0000274B 0FA9 pop gs +0000274D CF iret +0000274E C9 leave +0000274F CDCD int 0xcd +00002751 CDCD int 0xcd +00002753 CDCD int 0xcd +00002755 CDCD int 0xcd +00002757 CDCD int 0xcd +00002759 CDCD int 0xcd +0000275B CDCD int 0xcd +0000275D CDCD int 0xcd +0000275F CDCD int 0xcd +00002761 CDCD int 0xcd +00002763 CDCD int 0xcd +00002765 CDCD int 0xcd +00002767 CDCD int 0xcd +00002769 CDCD int 0xcd +0000276B CDCD int 0xcd +0000276D CDCD int 0xcd +0000276F CDCD int 0xcd +00002771 BB00BA mov bx,0xba00 +00002774 20424F and [bp+si+0x4f],al +00002777 53 push bx +00002778 2030 and [bx+si],dh +0000277A 2E3034 xor [cs:si],dh +0000277D 202D and [di],ch +0000277F 204552 and [di+0x52],al +00002782 52 push dx +00002783 4F dec di +00002784 52 push dx +00002785 3A20 cmp ah,[bx+si] +00002787 00BA2020 add [bp+si+0x2020],bh +0000278B 2020 and [bx+si],ah +0000278D 2020 and [bx+si],ah +0000278F 2020 and [bx+si],ah +00002791 2020 and [bx+si],ah +00002793 2020 and [bx+si],ah +00002795 2020 and [bx+si],ah +00002797 2020 and [bx+si],ah +00002799 2020 and [bx+si],ah +0000279B 2020 and [bx+si],ah +0000279D 2020 and [bx+si],ah +0000279F 2020 and [bx+si],ah +000027A1 2020 and [bx+si],ah +000027A3 2020 and [bx+si],ah +000027A5 2020 and [bx+si],ah +000027A7 2020 and [bx+si],ah +000027A9 2020 and [bx+si],ah +000027AB BA00BA mov dx,0xba00 +000027AE 2020 and [bx+si],ah +000027B0 50 push ax +000027B1 7265 jc 0x2818 +000027B3 7373 jnc 0x2828 +000027B5 20616E and [bx+di+0x6e],ah +000027B8 7920 jns 0x27da +000027BA 6B657920 imul sp,[di+0x79],byte +0x20 +000027BE 746F jz 0x282f +000027C0 20636F and [bp+di+0x6f],ah +000027C3 6E outsb +000027C4 7469 jz 0x282f +000027C6 6E outsb +000027C7 7565 jnz 0x282e +000027C9 2E2E2E2020 and [cs:bx+si],ah +000027CE 2020 and [bx+si],ah +000027D0 BA00BA mov dx,0xba00 +000027D3 205072 and [bx+si+0x72],dl +000027D6 657373 gs jnc 0x284c +000027D9 206120 and [bx+di+0x20],ah +000027DC 6B657920 imul sp,[di+0x79],byte +0x20 +000027E0 746F jz 0x2851 +000027E2 207265 and [bp+si+0x65],dh +000027E5 7374 jnc 0x285b +000027E7 61 popa +000027E8 7274 jc 0x285e +000027EA 207468 and [si+0x68],dh +000027ED 65205043 and [gs:bx+si+0x43],dl +000027F1 2E2E2E20BA00C8 and [cs:bp+si+0xc800],bh +000027F8 CDCD int 0xcd +000027FA CDCD int 0xcd +000027FC CDCD int 0xcd +000027FE CDCD int 0xcd +00002800 CDCD int 0xcd +00002802 CDCD int 0xcd +00002804 CDCD int 0xcd +00002806 CDCD int 0xcd +00002808 CDCD int 0xcd +0000280A CDCD int 0xcd +0000280C CDCD int 0xcd +0000280E CDCD int 0xcd +00002810 CDCD int 0xcd +00002812 CDCD int 0xcd +00002814 CDCD int 0xcd +00002816 CDCD int 0xcd +00002818 CDCD int 0xcd +0000281A BC0020 mov sp,0x2000 +0000281D BA0001 mov dx,0x100 +00002820 206E6F and [bp+0x6f],ch +00002823 6E outsb +00002824 652E2020 and [cs:bx+si],ah +00002828 2020 and [bx+si],ah +0000282A 2020 and [bx+si],ah +0000282C 2020 and [bx+si],ah +0000282E 00BA2045 add [bp+si+0x4520],bh +00002832 41 inc cx +00002833 58 pop ax +00002834 3A20 cmp ah,[bx+si] +00002836 307800 xor [bx+si+0x0],bh +00002839 2020 and [bx+si],ah +0000283B 45 inc bp +0000283C 42 inc dx +0000283D 58 pop ax +0000283E 3A20 cmp ah,[bx+si] +00002840 307800 xor [bx+si+0x0],bh +00002843 BA2045 mov dx,0x4520 +00002846 43 inc bx +00002847 58 pop ax +00002848 3A20 cmp ah,[bx+si] +0000284A 307800 xor [bx+si+0x0],bh +0000284D 2020 and [bx+si],ah +0000284F 45 inc bp +00002850 44 inc sp +00002851 58 pop ax +00002852 3A20 cmp ah,[bx+si] +00002854 307800 xor [bx+si+0x0],bh +00002857 BA2045 mov dx,0x4520 +0000285A 53 push bx +0000285B 50 push ax +0000285C 3A20 cmp ah,[bx+si] +0000285E 307800 xor [bx+si+0x0],bh +00002861 2020 and [bx+si],ah +00002863 45 inc bp +00002864 42 inc dx +00002865 50 push ax +00002866 3A20 cmp ah,[bx+si] +00002868 307800 xor [bx+si+0x0],bh +0000286B BA2045 mov dx,0x4520 +0000286E 53 push bx +0000286F 49 dec cx +00002870 3A20 cmp ah,[bx+si] +00002872 307800 xor [bx+si+0x0],bh +00002875 2020 and [bx+si],ah +00002877 45 inc bp +00002878 44 inc sp +00002879 49 dec cx +0000287A 3A20 cmp ah,[bx+si] +0000287C 307800 xor [bx+si+0x0],bh +0000287F 0000 add [bx+si],al +00002881 0000 add [bx+si],al +00002883 0000 add [bx+si],al +00002885 0000 add [bx+si],al +00002887 0000 add [bx+si],al +00002889 0000 add [bx+si],al +0000288B 0000 add [bx+si],al +0000288D 0000 add [bx+si],al +0000288F 0000 add [bx+si],al +00002891 0000 add [bx+si],al +00002893 0000 add [bx+si],al +00002895 0000 add [bx+si],al +00002897 0000 add [bx+si],al +00002899 0000 add [bx+si],al +0000289B 0000 add [bx+si],al +0000289D 0000 add [bx+si],al +0000289F 0000 add [bx+si],al +000028A1 0000 add [bx+si],al +000028A3 0000 add [bx+si],al +000028A5 0000 add [bx+si],al +000028A7 0000 add [bx+si],al +000028A9 0000 add [bx+si],al +000028AB 0000 add [bx+si],al +000028AD 0000 add [bx+si],al +000028AF 0000 add [bx+si],al +000028B1 0000 add [bx+si],al +000028B3 0000 add [bx+si],al +000028B5 0000 add [bx+si],al +000028B7 0000 add [bx+si],al +000028B9 0000 add [bx+si],al +000028BB 0000 add [bx+si],al +000028BD 0000 add [bx+si],al +000028BF 0000 add [bx+si],al +000028C1 0000 add [bx+si],al +000028C3 0000 add [bx+si],al +000028C5 0000 add [bx+si],al +000028C7 0000 add [bx+si],al +000028C9 0000 add [bx+si],al +000028CB 0000 add [bx+si],al +000028CD 0000 add [bx+si],al +000028CF 0000 add [bx+si],al +000028D1 0000 add [bx+si],al +000028D3 0000 add [bx+si],al +000028D5 0000 add [bx+si],al +000028D7 0000 add [bx+si],al +000028D9 0000 add [bx+si],al +000028DB 0000 add [bx+si],al +000028DD 0000 add [bx+si],al +000028DF 0000 add [bx+si],al +000028E1 0000 add [bx+si],al +000028E3 0000 add [bx+si],al +000028E5 0000 add [bx+si],al +000028E7 0000 add [bx+si],al +000028E9 0000 add [bx+si],al +000028EB 0000 add [bx+si],al +000028ED 0000 add [bx+si],al +000028EF 0000 add [bx+si],al +000028F1 0000 add [bx+si],al +000028F3 0000 add [bx+si],al +000028F5 0000 add [bx+si],al +000028F7 0000 add [bx+si],al +000028F9 0000 add [bx+si],al +000028FB 0000 add [bx+si],al +000028FD 0000 add [bx+si],al +000028FF 0000 add [bx+si],al +00002901 0000 add [bx+si],al +00002903 0000 add [bx+si],al +00002905 0000 add [bx+si],al +00002907 0000 add [bx+si],al +00002909 0000 add [bx+si],al +0000290B 0000 add [bx+si],al +0000290D 0000 add [bx+si],al +0000290F 0000 add [bx+si],al +00002911 0000 add [bx+si],al +00002913 0000 add [bx+si],al +00002915 0000 add [bx+si],al +00002917 0000 add [bx+si],al +00002919 0000 add [bx+si],al +0000291B 0000 add [bx+si],al +0000291D 0000 add [bx+si],al +0000291F 0000 add [bx+si],al +00002921 0000 add [bx+si],al +00002923 0000 add [bx+si],al +00002925 0000 add [bx+si],al +00002927 0000 add [bx+si],al +00002929 0000 add [bx+si],al +0000292B 0000 add [bx+si],al +0000292D 0000 add [bx+si],al +0000292F 0000 add [bx+si],al +00002931 0000 add [bx+si],al +00002933 0000 add [bx+si],al +00002935 0000 add [bx+si],al +00002937 0000 add [bx+si],al +00002939 0000 add [bx+si],al +0000293B 0000 add [bx+si],al +0000293D 0000 add [bx+si],al +0000293F 0000 add [bx+si],al +00002941 0000 add [bx+si],al +00002943 0000 add [bx+si],al +00002945 0000 add [bx+si],al +00002947 0000 add [bx+si],al +00002949 0000 add [bx+si],al +0000294B 0000 add [bx+si],al +0000294D 0000 add [bx+si],al +0000294F 0000 add [bx+si],al +00002951 0000 add [bx+si],al +00002953 0000 add [bx+si],al +00002955 0000 add [bx+si],al +00002957 0000 add [bx+si],al +00002959 0000 add [bx+si],al +0000295B 0000 add [bx+si],al +0000295D 0000 add [bx+si],al +0000295F 0000 add [bx+si],al +00002961 0000 add [bx+si],al +00002963 0000 add [bx+si],al +00002965 0000 add [bx+si],al +00002967 0000 add [bx+si],al +00002969 0000 add [bx+si],al +0000296B 0000 add [bx+si],al +0000296D 0000 add [bx+si],al +0000296F 0000 add [bx+si],al +00002971 0000 add [bx+si],al +00002973 0000 add [bx+si],al +00002975 0000 add [bx+si],al +00002977 0000 add [bx+si],al +00002979 0000 add [bx+si],al +0000297B 0000 add [bx+si],al +0000297D 0000 add [bx+si],al +0000297F 0000 add [bx+si],al +00002981 0000 add [bx+si],al +00002983 0000 add [bx+si],al +00002985 0000 add [bx+si],al +00002987 0000 add [bx+si],al +00002989 0000 add [bx+si],al +0000298B 0000 add [bx+si],al +0000298D 0000 add [bx+si],al +0000298F 0000 add [bx+si],al +00002991 0000 add [bx+si],al +00002993 0000 add [bx+si],al +00002995 0000 add [bx+si],al +00002997 0000 add [bx+si],al +00002999 0000 add [bx+si],al +0000299B 0000 add [bx+si],al +0000299D 0000 add [bx+si],al +0000299F 0000 add [bx+si],al +000029A1 0000 add [bx+si],al +000029A3 0000 add [bx+si],al +000029A5 0000 add [bx+si],al +000029A7 0000 add [bx+si],al +000029A9 0000 add [bx+si],al +000029AB 0000 add [bx+si],al +000029AD 0000 add [bx+si],al +000029AF 0000 add [bx+si],al +000029B1 0000 add [bx+si],al +000029B3 0000 add [bx+si],al +000029B5 0000 add [bx+si],al +000029B7 0000 add [bx+si],al +000029B9 0000 add [bx+si],al +000029BB 0000 add [bx+si],al +000029BD 0000 add [bx+si],al +000029BF 0000 add [bx+si],al +000029C1 0000 add [bx+si],al +000029C3 0000 add [bx+si],al +000029C5 0000 add [bx+si],al +000029C7 0000 add [bx+si],al +000029C9 0000 add [bx+si],al +000029CB 0000 add [bx+si],al +000029CD 0000 add [bx+si],al +000029CF 0000 add [bx+si],al +000029D1 0000 add [bx+si],al +000029D3 0000 add [bx+si],al +000029D5 0000 add [bx+si],al +000029D7 0000 add [bx+si],al +000029D9 0000 add [bx+si],al +000029DB 0000 add [bx+si],al +000029DD 0000 add [bx+si],al +000029DF 0000 add [bx+si],al +000029E1 0000 add [bx+si],al +000029E3 0000 add [bx+si],al +000029E5 0000 add [bx+si],al +000029E7 0000 add [bx+si],al +000029E9 0000 add [bx+si],al +000029EB 0000 add [bx+si],al +000029ED 0000 add [bx+si],al +000029EF 0000 add [bx+si],al +000029F1 0000 add [bx+si],al +000029F3 0000 add [bx+si],al +000029F5 0000 add [bx+si],al +000029F7 0000 add [bx+si],al +000029F9 0000 add [bx+si],al +000029FB 0000 add [bx+si],al +000029FD 0000 add [bx+si],al +000029FF 0000 add [bx+si],al +00002A01 0000 add [bx+si],al +00002A03 0000 add [bx+si],al +00002A05 0000 add [bx+si],al +00002A07 0000 add [bx+si],al +00002A09 0000 add [bx+si],al +00002A0B 0000 add [bx+si],al +00002A0D 0000 add [bx+si],al +00002A0F 0000 add [bx+si],al +00002A11 0000 add [bx+si],al +00002A13 0000 add [bx+si],al +00002A15 0000 add [bx+si],al +00002A17 0000 add [bx+si],al +00002A19 0000 add [bx+si],al +00002A1B 0000 add [bx+si],al +00002A1D 0000 add [bx+si],al +00002A1F 0000 add [bx+si],al +00002A21 0000 add [bx+si],al +00002A23 0000 add [bx+si],al +00002A25 0000 add [bx+si],al +00002A27 0000 add [bx+si],al +00002A29 0000 add [bx+si],al +00002A2B 0000 add [bx+si],al +00002A2D 0000 add [bx+si],al +00002A2F 0000 add [bx+si],al +00002A31 0000 add [bx+si],al +00002A33 0000 add [bx+si],al +00002A35 0000 add [bx+si],al +00002A37 0000 add [bx+si],al +00002A39 0000 add [bx+si],al +00002A3B 0000 add [bx+si],al +00002A3D 0000 add [bx+si],al +00002A3F 0000 add [bx+si],al +00002A41 0000 add [bx+si],al +00002A43 0000 add [bx+si],al +00002A45 0000 add [bx+si],al +00002A47 0000 add [bx+si],al +00002A49 0000 add [bx+si],al +00002A4B 0000 add [bx+si],al +00002A4D 0000 add [bx+si],al +00002A4F 0000 add [bx+si],al +00002A51 0000 add [bx+si],al +00002A53 0000 add [bx+si],al +00002A55 0000 add [bx+si],al +00002A57 0000 add [bx+si],al +00002A59 0000 add [bx+si],al +00002A5B 0000 add [bx+si],al +00002A5D 0000 add [bx+si],al +00002A5F 0000 add [bx+si],al +00002A61 0000 add [bx+si],al +00002A63 0000 add [bx+si],al +00002A65 0000 add [bx+si],al +00002A67 0000 add [bx+si],al +00002A69 0000 add [bx+si],al +00002A6B 0000 add [bx+si],al +00002A6D 0000 add [bx+si],al +00002A6F 0000 add [bx+si],al +00002A71 0000 add [bx+si],al +00002A73 0000 add [bx+si],al +00002A75 0000 add [bx+si],al +00002A77 0000 add [bx+si],al +00002A79 0000 add [bx+si],al +00002A7B 0000 add [bx+si],al +00002A7D 0000 add [bx+si],al +00002A7F 0000 add [bx+si],al +00002A81 0000 add [bx+si],al +00002A83 0000 add [bx+si],al +00002A85 0000 add [bx+si],al +00002A87 0000 add [bx+si],al +00002A89 0000 add [bx+si],al +00002A8B 0000 add [bx+si],al +00002A8D 0000 add [bx+si],al +00002A8F 0000 add [bx+si],al +00002A91 0000 add [bx+si],al +00002A93 0000 add [bx+si],al +00002A95 0000 add [bx+si],al +00002A97 0000 add [bx+si],al +00002A99 0000 add [bx+si],al +00002A9B 0000 add [bx+si],al +00002A9D 0000 add [bx+si],al +00002A9F 0000 add [bx+si],al +00002AA1 0000 add [bx+si],al +00002AA3 0000 add [bx+si],al +00002AA5 0000 add [bx+si],al +00002AA7 0000 add [bx+si],al +00002AA9 0000 add [bx+si],al +00002AAB 0000 add [bx+si],al +00002AAD 0000 add [bx+si],al +00002AAF 0000 add [bx+si],al +00002AB1 0000 add [bx+si],al +00002AB3 0000 add [bx+si],al +00002AB5 0000 add [bx+si],al +00002AB7 0000 add [bx+si],al +00002AB9 0000 add [bx+si],al +00002ABB 0000 add [bx+si],al +00002ABD 0000 add [bx+si],al +00002ABF 0000 add [bx+si],al +00002AC1 0000 add [bx+si],al +00002AC3 0000 add [bx+si],al +00002AC5 0000 add [bx+si],al +00002AC7 0000 add [bx+si],al +00002AC9 0000 add [bx+si],al +00002ACB 0000 add [bx+si],al +00002ACD 0000 add [bx+si],al +00002ACF 0000 add [bx+si],al +00002AD1 0000 add [bx+si],al +00002AD3 0000 add [bx+si],al +00002AD5 0000 add [bx+si],al +00002AD7 0000 add [bx+si],al +00002AD9 0000 add [bx+si],al +00002ADB 0000 add [bx+si],al +00002ADD 0000 add [bx+si],al +00002ADF 0000 add [bx+si],al +00002AE1 0000 add [bx+si],al +00002AE3 0000 add [bx+si],al +00002AE5 0000 add [bx+si],al +00002AE7 0000 add [bx+si],al +00002AE9 0000 add [bx+si],al +00002AEB 0000 add [bx+si],al +00002AED 0000 add [bx+si],al +00002AEF 0000 add [bx+si],al +00002AF1 0000 add [bx+si],al +00002AF3 0000 add [bx+si],al +00002AF5 0000 add [bx+si],al +00002AF7 0000 add [bx+si],al +00002AF9 0000 add [bx+si],al +00002AFB 0000 add [bx+si],al +00002AFD 0000 add [bx+si],al +00002AFF 0000 add [bx+si],al +00002B01 0000 add [bx+si],al +00002B03 0000 add [bx+si],al +00002B05 0000 add [bx+si],al +00002B07 0000 add [bx+si],al +00002B09 0000 add [bx+si],al +00002B0B 0000 add [bx+si],al +00002B0D 0000 add [bx+si],al +00002B0F 0000 add [bx+si],al +00002B11 0000 add [bx+si],al +00002B13 0000 add [bx+si],al +00002B15 0000 add [bx+si],al +00002B17 0000 add [bx+si],al +00002B19 0000 add [bx+si],al +00002B1B 0000 add [bx+si],al +00002B1D 0000 add [bx+si],al +00002B1F 0000 add [bx+si],al +00002B21 0000 add [bx+si],al +00002B23 0000 add [bx+si],al +00002B25 0000 add [bx+si],al +00002B27 0000 add [bx+si],al +00002B29 0000 add [bx+si],al +00002B2B 0000 add [bx+si],al +00002B2D 0000 add [bx+si],al +00002B2F 0000 add [bx+si],al +00002B31 0000 add [bx+si],al +00002B33 0000 add [bx+si],al +00002B35 0000 add [bx+si],al +00002B37 0000 add [bx+si],al +00002B39 0000 add [bx+si],al +00002B3B 0000 add [bx+si],al +00002B3D 0000 add [bx+si],al +00002B3F 0000 add [bx+si],al +00002B41 0000 add [bx+si],al +00002B43 0000 add [bx+si],al +00002B45 0000 add [bx+si],al +00002B47 0000 add [bx+si],al +00002B49 0000 add [bx+si],al +00002B4B 0000 add [bx+si],al +00002B4D 0000 add [bx+si],al +00002B4F 0000 add [bx+si],al +00002B51 0000 add [bx+si],al +00002B53 0000 add [bx+si],al +00002B55 0000 add [bx+si],al +00002B57 0000 add [bx+si],al +00002B59 0000 add [bx+si],al +00002B5B 0000 add [bx+si],al +00002B5D 0000 add [bx+si],al +00002B5F 0000 add [bx+si],al +00002B61 0000 add [bx+si],al +00002B63 0000 add [bx+si],al +00002B65 0000 add [bx+si],al +00002B67 0000 add [bx+si],al +00002B69 0000 add [bx+si],al +00002B6B 0000 add [bx+si],al +00002B6D 0000 add [bx+si],al +00002B6F 0000 add [bx+si],al +00002B71 0000 add [bx+si],al +00002B73 0000 add [bx+si],al +00002B75 0000 add [bx+si],al +00002B77 0000 add [bx+si],al +00002B79 0000 add [bx+si],al +00002B7B 0000 add [bx+si],al +00002B7D 0000 add [bx+si],al +00002B7F 0000 add [bx+si],al +00002B81 A37F28 mov [0x287f],ax +00002B84 0100 add [bx+si],ax +00002B86 891D mov [di],bx +00002B88 832801 sub word [bx+si],byte +0x1 +00002B8B 00890D87 add [bx+di+0x870d],cl +00002B8F 2801 sub [bx+di],al +00002B91 0089158B add [bx+di+0x8b15],cl +00002B95 2801 sub [bx+di],al +00002B97 0089258F add [bx+di+0x8f25],cl +00002B9B 2801 sub [bx+di],al +00002B9D 00892D93 add [bx+di+0x932d],cl +00002BA1 2801 sub [bx+di],al +00002BA3 00893597 add [bx+di+0x9735],cl +00002BA7 2801 sub [bx+di],al +00002BA9 00893D9B add [bx+di+0x9b3d],cl +00002BAD 2801 sub [bx+di],al +00002BAF 00E8 add al,ch +00002BB1 3903 cmp [bp+di],ax +00002BB3 0000 add [bx+si],al +00002BB5 66891D mov [di],ebx +00002BB8 AF scasw +00002BB9 2801 sub [bx+di],al +00002BBB 0066BA add [bp-0x46],ah +00002BBE 0000 add [bx+si],al +00002BC0 BE4883 mov si,0x8348 +00002BC3 0B00 or ax,[bx+si] +00002BC5 BFB128 mov di,0x28b1 +00002BC8 0100 add [bx+si],ax +00002BCA 66B90000A466 mov ecx,0x66a40000 +00002BD0 41 inc cx +00002BD1 6683F948 cmp ecx,byte +0x48 +00002BD5 7402 jz 0x2bd9 +00002BD7 EBF5 jmp short 0x2bce +00002BD9 6642 inc edx +00002BDB 6683FA0A cmp edx,byte +0xa +00002BDF 7405 jz 0x2be6 +00002BE1 83C658 add si,byte +0x58 +00002BE4 EBE4 jmp short 0x2bca +00002BE6 66BBA401E8D8 mov ebx,0xd8e801a4 +00002BEC 0200 add al,[bx+si] +00002BEE 00BD4E27 add [di+0x274e],bh +00002BF2 0100 add [bx+si],ax +00002BF4 E87B03 call 0x2f72 +00002BF7 0000 add [bx+si],al +00002BF9 66BBF401E8C5 mov ebx,0xc5e801f4 +00002BFF 0200 add al,[bx+si] +00002C01 00BD7327 add [di+0x2773],bh +00002C05 0100 add [bx+si],ax +00002C07 E86803 call 0x2f72 +00002C0A 0000 add [bx+si],al +00002C0C BD2028 mov bp,0x2820 +00002C0F 0100 add [bx+si],ax +00002C11 E85E03 call 0x2f72 +00002C14 0000 add [bx+si],al +00002C16 BD1C28 mov bp,0x281c +00002C19 0100 add [bx+si],ax +00002C1B E85403 call 0x2f72 +00002C1E 0000 add [bx+si],al +00002C20 66BB4402E89E mov ebx,0x9ee80244 +00002C26 0200 add al,[bx+si] +00002C28 00BD8827 add [di+0x2788],bh +00002C2C 0100 add [bx+si],ax +00002C2E E84103 call 0x2f72 +00002C31 0000 add [bx+si],al +00002C33 66BB9402E88B mov ebx,0x8be80294 +00002C39 0200 add al,[bx+si] +00002C3B 00BD2F28 add [di+0x282f],bh +00002C3F 0100 add [bx+si],ax +00002C41 E82E03 call 0x2f72 +00002C44 0000 add [bx+si],al +00002C46 A17F28 mov ax,[0x287f] +00002C49 0100 add [bx+si],ax +00002C4B E80103 call 0x2f4f +00002C4E 0000 add [bx+si],al +00002C50 BD3928 mov bp,0x2839 +00002C53 0100 add [bx+si],ax +00002C55 E81A03 call 0x2f72 +00002C58 0000 add [bx+si],al +00002C5A A18328 mov ax,[0x2883] +00002C5D 0100 add [bx+si],ax +00002C5F E8ED02 call 0x2f4f +00002C62 0000 add [bx+si],al +00002C64 BD1C28 mov bp,0x281c +00002C67 0100 add [bx+si],ax +00002C69 E80603 call 0x2f72 +00002C6C 0000 add [bx+si],al +00002C6E 66BBE402E850 mov ebx,0x50e802e4 +00002C74 0200 add al,[bx+si] +00002C76 00BD4328 add [di+0x2843],bh +00002C7A 0100 add [bx+si],ax +00002C7C E8F302 call 0x2f72 +00002C7F 0000 add [bx+si],al +00002C81 A18728 mov ax,[0x2887] +00002C84 0100 add [bx+si],ax +00002C86 E8C602 call 0x2f4f +00002C89 0000 add [bx+si],al +00002C8B BD4D28 mov bp,0x284d +00002C8E 0100 add [bx+si],ax +00002C90 E8DF02 call 0x2f72 +00002C93 0000 add [bx+si],al +00002C95 A18B28 mov ax,[0x288b] +00002C98 0100 add [bx+si],ax +00002C9A E8B202 call 0x2f4f +00002C9D 0000 add [bx+si],al +00002C9F BD1C28 mov bp,0x281c +00002CA2 0100 add [bx+si],ax +00002CA4 E8CB02 call 0x2f72 +00002CA7 0000 add [bx+si],al +00002CA9 66BB3403E815 mov ebx,0x15e80334 +00002CAF 0200 add al,[bx+si] +00002CB1 00BD5728 add [di+0x2857],bh +00002CB5 0100 add [bx+si],ax +00002CB7 E8B802 call 0x2f72 +00002CBA 0000 add [bx+si],al +00002CBC A18F28 mov ax,[0x288f] +00002CBF 0100 add [bx+si],ax +00002CC1 E88B02 call 0x2f4f +00002CC4 0000 add [bx+si],al +00002CC6 BD6128 mov bp,0x2861 +00002CC9 0100 add [bx+si],ax +00002CCB E8A402 call 0x2f72 +00002CCE 0000 add [bx+si],al +00002CD0 A19328 mov ax,[0x2893] +00002CD3 0100 add [bx+si],ax +00002CD5 E87702 call 0x2f4f +00002CD8 0000 add [bx+si],al +00002CDA BD1C28 mov bp,0x281c +00002CDD 0100 add [bx+si],ax +00002CDF E89002 call 0x2f72 +00002CE2 0000 add [bx+si],al +00002CE4 66BB8403E8DA mov ebx,0xdae80384 +00002CEA 0100 add [bx+si],ax +00002CEC 00BD6B28 add [di+0x286b],bh +00002CF0 0100 add [bx+si],ax +00002CF2 E87D02 call 0x2f72 +00002CF5 0000 add [bx+si],al +00002CF7 A19728 mov ax,[0x2897] +00002CFA 0100 add [bx+si],ax +00002CFC E85002 call 0x2f4f +00002CFF 0000 add [bx+si],al +00002D01 BD7528 mov bp,0x2875 +00002D04 0100 add [bx+si],ax +00002D06 E86902 call 0x2f72 +00002D09 0000 add [bx+si],al +00002D0B A19B28 mov ax,[0x289b] +00002D0E 0100 add [bx+si],ax +00002D10 E83C02 call 0x2f4f +00002D13 0000 add [bx+si],al +00002D15 BD1C28 mov bp,0x281c +00002D18 0100 add [bx+si],ax +00002D1A E85502 call 0x2f72 +00002D1D 0000 add [bx+si],al +00002D1F 66BBD403E89F mov ebx,0x9fe803d4 +00002D25 0100 add [bx+si],ax +00002D27 00BD8827 add [di+0x2788],bh +00002D2B 0100 add [bx+si],ax +00002D2D E84202 call 0x2f72 +00002D30 0000 add [bx+si],al +00002D32 66BB7404E88C mov ebx,0x8ce80474 +00002D38 0100 add [bx+si],ax +00002D3A 00BDF727 add [di+0x27f7],bh +00002D3E 0100 add [bx+si],ax +00002D40 E82F02 call 0x2f72 +00002D43 0000 add [bx+si],al +00002D45 66BB2404E879 mov ebx,0x79e80424 +00002D4B 0100 add [bx+si],ax +00002D4D 00803D1F add [bx+si+0x1f3d],al +00002D51 2801 sub [bx+di],al +00002D53 0001 add [bx+di],al +00002D55 7467 jz 0x2dbe +00002D57 BDD227 mov bp,0x27d2 +00002D5A 0100 add [bx+si],ax +00002D5C E81302 call 0x2f72 +00002D5F 0000 add [bx+si],al +00002D61 66BB4504E85D mov ebx,0x5de80445 +00002D67 0100 add [bx+si],ax +00002D69 00A0AE0D add [bx+si+0xdae],ah +00002D6D 0100 add [bx+si],ax +00002D6F 8A25 mov ah,[di] +00002D71 AF scasw +00002D72 0D0100 or ax,0x1 +00002D75 80FC3F cmp ah,0x3f +00002D78 750D jnz 0x2d87 +00002D7A 3C00 cmp al,0x0 +00002D7C 74EC jz 0x2d6a +00002D7E C605AF mov byte [di],0xaf +00002D81 0D0100 or ax,0x1 +00002D84 00EB add bl,ch +00002D86 0E push cs +00002D87 88E3 mov bl,ah +00002D89 FEC3 inc bl +00002D8B 38C3 cmp bl,al +00002D8D 74DB jz 0x2d6a +00002D8F FE05 inc byte [di] +00002D91 AF scasw +00002D92 0D0100 or ax,0x1 +00002D95 BE6E0D mov si,0xd6e +00002D98 0100 add [bx+si],ax +00002D9A 0FB605 movzx ax,[di] +00002D9D AF scasw +00002D9E 0D0100 or ax,0x1 +00002DA1 01C6 add si,ax +00002DA3 8A2680FC mov ah,[0xfc80] +00002DA7 FA cli +00002DA8 74C0 jz 0x2d6a +00002DAA 80FCE0 cmp ah,0xe0 +00002DAD 74BB jz 0x2d6a +00002DAF 80FCE1 cmp ah,0xe1 +00002DB2 74B6 jz 0x2d6a +00002DB4 F6C480 test ah,0x80 +00002DB7 75B1 jnz 0x2d6a +00002DB9 E8E6EA call 0x18a2 +00002DBC FF db 0xFF +00002DBD FF db 0xFF +00002DBE BDAD27 mov bp,0x27ad +00002DC1 0100 add [bx+si],ax +00002DC3 E8AC01 call 0x2f72 +00002DC6 0000 add [bx+si],al +00002DC8 66BB4304E8F6 mov ebx,0xf6e80443 +00002DCE 0000 add [bx+si],al +00002DD0 00A0AE0D add [bx+si+0xdae],ah +00002DD4 0100 add [bx+si],ax +00002DD6 8A25 mov ah,[di] +00002DD8 AF scasw +00002DD9 0D0100 or ax,0x1 +00002DDC 80FC3F cmp ah,0x3f +00002DDF 750D jnz 0x2dee +00002DE1 3C00 cmp al,0x0 +00002DE3 74EC jz 0x2dd1 +00002DE5 C605AF mov byte [di],0xaf +00002DE8 0D0100 or ax,0x1 +00002DEB 00EB add bl,ch +00002DED 0E push cs +00002DEE 88E3 mov bl,ah +00002DF0 FEC3 inc bl +00002DF2 38C3 cmp bl,al +00002DF4 74DB jz 0x2dd1 +00002DF6 FE05 inc byte [di] +00002DF8 AF scasw +00002DF9 0D0100 or ax,0x1 +00002DFC BE6E0D mov si,0xd6e +00002DFF 0100 add [bx+si],ax +00002E01 0FB605 movzx ax,[di] +00002E04 AF scasw +00002E05 0D0100 or ax,0x1 +00002E08 01C6 add si,ax +00002E0A 8A2680FC mov ah,[0xfc80] +00002E0E FA cli +00002E0F 74C0 jz 0x2dd1 +00002E11 80FCE0 cmp ah,0xe0 +00002E14 74BB jz 0x2dd1 +00002E16 80FCE1 cmp ah,0xe1 +00002E19 74B6 jz 0x2dd1 +00002E1B F6C480 test ah,0x80 +00002E1E 75B1 jnz 0x2dd1 +00002E20 66BA0000BF48 mov edx,0x48bf0000 +00002E26 830B00 or word [bp+di],byte +0x0 +00002E29 BEB128 mov si,0x28b1 +00002E2C 0100 add [bx+si],ax +00002E2E 66B90000A466 mov ecx,0x66a40000 +00002E34 41 inc cx +00002E35 6683F948 cmp ecx,byte +0x48 +00002E39 7402 jz 0x2e3d +00002E3B EBF5 jmp short 0x2e32 +00002E3D 6642 inc edx +00002E3F 6683FA0A cmp edx,byte +0xa +00002E43 7405 jz 0x2e4a +00002E45 83C758 add di,byte +0x58 +00002E48 EBE4 jmp short 0x2e2e +00002E4A 668B1D mov ebx,[di] +00002E4D AF scasw +00002E4E 2801 sub [bx+di],al +00002E50 00E8 add al,ch +00002E52 7100 jno 0x2e54 +00002E54 0000 add [bx+si],al +00002E56 C6051F mov byte [di],0x1f +00002E59 2801 sub [bx+di],al +00002E5B 0001 add [bx+di],al +00002E5D C60520 mov byte [di],0x20 +00002E60 2801 sub [bx+di],al +00002E62 0020 add [bx+si],ah +00002E64 C60521 mov byte [di],0x21 +00002E67 2801 sub [bx+di],al +00002E69 006EC6 add [bp-0x3a],ch +00002E6C 052228 add ax,0x2822 +00002E6F 0100 add [bx+si],ax +00002E71 6F outsw +00002E72 C60523 mov byte [di],0x23 +00002E75 2801 sub [bx+di],al +00002E77 006EC6 add [bp-0x3a],ch +00002E7A 052428 add ax,0x2824 +00002E7D 0100 add [bx+si],ax +00002E7F 65C60525 mov byte [gs:di],0x25 +00002E83 2801 sub [bx+di],al +00002E85 002EC605 add [0x5c6],ch +00002E89 262801 sub [es:bx+di],al +00002E8C 0020 add [bx+si],ah +00002E8E C60527 mov byte [di],0x27 +00002E91 2801 sub [bx+di],al +00002E93 0020 add [bx+si],ah +00002E95 C60528 mov byte [di],0x28 +00002E98 2801 sub [bx+di],al +00002E9A 0020 add [bx+si],ah +00002E9C C60529 mov byte [di],0x29 +00002E9F 2801 sub [bx+di],al +00002EA1 0020 add [bx+si],ah +00002EA3 C6052A mov byte [di],0x2a +00002EA6 2801 sub [bx+di],al +00002EA8 0020 add [bx+si],ah +00002EAA C6052B mov byte [di],0x2b +00002EAD 2801 sub [bx+di],al +00002EAF 0020 add [bx+si],ah +00002EB1 C6052C mov byte [di],0x2c +00002EB4 2801 sub [bx+di],al +00002EB6 0020 add [bx+si],ah +00002EB8 C6052D mov byte [di],0x2d +00002EBB 2801 sub [bx+di],al +00002EBD 0020 add [bx+si],ah +00002EBF C6052E mov byte [di],0x2e +00002EC2 2801 sub [bx+di],al +00002EC4 0000 add [bx+si],al +00002EC6 C3 ret +00002EC7 A3A328 mov [0x28a3],ax +00002ECA 0100 add [bx+si],ax +00002ECC 8915 mov [di],dx +00002ECE AB stosw +00002ECF 2801 sub [bx+di],al +00002ED1 00B00E88 add [bx+si+0x880e],dh +00002ED5 FC cld +00002ED6 66BAD40366EF mov edx,0xef6603d4 +00002EDC 6640 inc eax +00002EDE 88DC mov ah,bl +00002EE0 66EF out dx,eax +00002EE2 8B15 mov dx,[di] +00002EE4 AB stosw +00002EE5 2801 sub [bx+di],al +00002EE7 00A1A328 add [bx+di+0x28a3],ah +00002EEB 0100 add [bx+si],ax +00002EED C3 ret +00002EEE A3A328 mov [0x28a3],ax +00002EF1 0100 add [bx+si],ax +00002EF3 8915 mov [di],dx +00002EF5 AB stosw +00002EF6 2801 sub [bx+di],al +00002EF8 0066BA add [bp-0x46],ah +00002EFB D403 aam 0x3 +00002EFD B00E mov al,0xe +00002EFF EE out dx,al +00002F00 6642 inc edx +00002F02 EC in al,dx +00002F03 88C7 mov bh,al +00002F05 B00F mov al,0xf +00002F07 664A dec edx +00002F09 EE out dx,al +00002F0A 6642 inc edx +00002F0C EC in al,dx +00002F0D 88C3 mov bl,al +00002F0F 8B15 mov dx,[di] +00002F11 AB stosw +00002F12 2801 sub [bx+di],al +00002F14 00A1A328 add [bx+di+0x28a3],ah +00002F18 0100 add [bx+si],ax +00002F1A C3 ret +00002F1B A39F28 mov [0x289f],ax +00002F1E 0100 add [bx+si],ax +00002F20 891D mov [di],bx +00002F22 A7 cmpsw +00002F23 2801 sub [bx+di],al +00002F25 00E8 add al,ch +00002F27 C3 ret +00002F28 FF db 0xFF +00002F29 FF db 0xFF +00002F2A FF89D88B dec word [bx+di+0x8bd8] +00002F2E 1DA728 sbb ax,0x28a7 +00002F31 0100 add [bx+si],ax +00002F33 2666899C0000 mov [es:si+0x0],ebx +00002F39 800B00 or byte [bp+di],0x0 +00002F3C 89C3 mov bx,ax +00002F3E 6643 inc ebx +00002F40 E882FF call 0x2ec5 +00002F43 FF db 0xFF +00002F44 FF8B1DA7 dec word [bp+di+0xa71d] +00002F48 2801 sub [bx+di],al +00002F4A 00A19F28 add [bx+di+0x289f],ah +00002F4E 0100 add [bx+si],ax +00002F50 C3 ret +00002F51 B90800 mov cx,0x8 +00002F54 0000 add [bx+si],al +00002F56 C1C004 rol ax,0x4 +00002F59 0FB6D0 movzx dx,al +00002F5C 83E20F and dx,byte +0xf +00002F5F 83CA30 or dx,byte +0x30 +00002F62 83FA39 cmp dx,byte +0x39 +00002F65 7603 jna 0x2f6a +00002F67 83C207 add dx,byte +0x7 +00002F6A 88D3 mov bl,dl +00002F6C E8AAFF call 0x2f19 +00002F6F FF db 0xFF +00002F70 FFE2 jmp dx +00002F72 E3C3 jcxz 0x2f37 +00002F74 8A4500 mov al,[di+0x0] +00002F77 08C0 or al,al +00002F79 740C jz 0x2f87 +00002F7B 88C3 mov bl,al +00002F7D B740 mov bh,0x40 +00002F7F E897FF call 0x2f19 +00002F82 FF db 0xFF +00002F83 FF45EB inc word [di-0x15] +00002F86 ED in ax,dx +00002F87 C3 ret +00002F88 0000 add [bx+si],al +00002F8A 0000 add [bx+si],al +00002F8C 0000 add [bx+si],al +00002F8E 006650 add [bp+0x50],ah +00002F91 B000 mov al,0x0 +00002F93 E670 out 0x70,al +00002F95 E471 in al,0x71 +00002F97 A28E2F mov [0x2f8e],al +00002F9A 0100 add [bx+si],ax +00002F9C B002 mov al,0x2 +00002F9E E670 out 0x70,al +00002FA0 E471 in al,0x71 +00002FA2 A28D2F mov [0x2f8d],al +00002FA5 0100 add [bx+si],ax +00002FA7 B004 mov al,0x4 +00002FA9 E670 out 0x70,al +00002FAB E471 in al,0x71 +00002FAD A28C2F mov [0x2f8c],al +00002FB0 0100 add [bx+si],ax +00002FB2 B007 mov al,0x7 +00002FB4 E670 out 0x70,al +00002FB6 E471 in al,0x71 +00002FB8 A28B2F mov [0x2f8b],al +00002FBB 0100 add [bx+si],ax +00002FBD B008 mov al,0x8 +00002FBF E670 out 0x70,al +00002FC1 E471 in al,0x71 +00002FC3 A28A2F mov [0x2f8a],al +00002FC6 0100 add [bx+si],ax +00002FC8 B009 mov al,0x9 +00002FCA E670 out 0x70,al +00002FCC E471 in al,0x71 +00002FCE A2892F mov [0x2f89],al +00002FD1 0100 add [bx+si],ax +00002FD3 B032 mov al,0x32 +00002FD5 E670 out 0x70,al +00002FD7 E471 in al,0x71 +00002FD9 A2882F mov [0x2f88],al +00002FDC 0100 add [bx+si],ax +00002FDE 6658 pop eax +00002FE0 C3 ret +00002FE1 53 push bx +00002FE2 88C3 mov bl,al +00002FE4 80E30F and bl,0xf +00002FE7 C0E804 shr al,0x4 +00002FEA B70A mov bh,0xa +00002FEC F6E7 mul bh +00002FEE 00D8 add al,bl +00002FF0 5B pop bx +00002FF1 C3 ret +00002FF2 51 push cx +00002FF3 88C4 mov ah,al +00002FF5 66250FF0C0EC and eax,0xecc0f00f +00002FFB 0466 add al,0x66 +00002FFD 0D3030 or ax,0x3030 +00003000 86E0 xchg ah,al +00003002 59 pop cx +00003003 C3 ret +00003004 0D0A20 or ax,0x200a +00003007 2020 and [bx+si],ah +00003009 54 push sp +0000300A 696D653A20 imul bp,[di+0x65],word 0x203a +0000300F 000D add [di],cl +00003011 0A20 or ah,[bx+si] +00003013 2020 and [bx+si],ah +00003015 44 inc sp +00003016 61 popa +00003017 7465 jz 0x307e +00003019 3A20 cmp ah,[bx+si] +0000301B 005053 add [bx+si+0x53],dl +0000301E 56 push si +0000301F BE1030 mov si,0x3010 +00003022 0100 add [bx+si],ax +00003024 B307 mov bl,0x7 +00003026 E884D7 call 0x7ad +00003029 FF db 0xFF +0000302A FF db 0xFF +0000302B E85FFF call 0x2f8d +0000302E FF db 0xFF +0000302F FFA0882F jmp near [bx+si+0x2f88] +00003033 0100 add [bx+si],ax +00003035 E8B8FF call 0x2ff0 +00003038 FF db 0xFF +00003039 FF50B7 call near [bx+si-0x49] +0000303C 07 pop es +0000303D 88C3 mov bl,al +0000303F E80AD7 call 0x74c +00003042 FF db 0xFF +00003043 FF5888 call far [bx+si-0x78] +00003046 E3E8 jcxz 0x3030 +00003048 02D7 add dl,bh +0000304A FF db 0xFF +0000304B FFA0892F jmp near [bx+si+0x2f89] +0000304F 0100 add [bx+si],ax +00003051 E89CFF call 0x2ff0 +00003054 FF db 0xFF +00003055 FF5088 call near [bx+si-0x78] +00003058 C3 ret +00003059 E8F0D6 call 0x74c +0000305C FF db 0xFF +0000305D FF5888 call far [bx+si-0x78] +00003060 E3E8 jcxz 0x304a +00003062 E8D6FF call 0x303b +00003065 FFB33AE8 push word [bp+di+0xe83a] +00003069 E1D6 loope 0x3041 +0000306B FF db 0xFF +0000306C FFA08A2F jmp near [bx+si+0x2f8a] +00003070 0100 add [bx+si],ax +00003072 E87BFF call 0x2ff0 +00003075 FF db 0xFF +00003076 FF5088 call near [bx+si-0x78] +00003079 C3 ret +0000307A E8CFD6 call 0x74c +0000307D FF db 0xFF +0000307E FF5888 call far [bx+si-0x78] +00003081 E3E8 jcxz 0x306b +00003083 C7 db 0xC7 +00003084 D6 salc +00003085 FF db 0xFF +00003086 FFB33AE8 push word [bp+di+0xe83a] +0000308A C0D6FF rcl dh,0xff +0000308D FFA08B2F jmp near [bx+si+0x2f8b] +00003091 0100 add [bx+si],ax +00003093 E85AFF call 0x2ff0 +00003096 FF db 0xFF +00003097 FF5088 call near [bx+si-0x78] +0000309A C3 ret +0000309B E8AED6 call 0x74c +0000309E FF db 0xFF +0000309F FF5888 call far [bx+si-0x78] +000030A2 E3E8 jcxz 0x308c +000030A4 A6 cmpsb +000030A5 D6 salc +000030A6 FF db 0xFF +000030A7 FF5E5B call far [bp+0x5b] +000030AA 58 pop ax +000030AB C3 ret +000030AC 50 push ax +000030AD 53 push bx +000030AE 56 push si +000030AF BE0430 mov si,0x3004 +000030B2 0100 add [bx+si],ax +000030B4 B307 mov bl,0x7 +000030B6 E8F4D6 call 0x7ad +000030B9 FF db 0xFF +000030BA FF db 0xFF +000030BB E8CFFE call 0x2f8d +000030BE FF db 0xFF +000030BF FFA08C2F jmp near [bx+si+0x2f8c] +000030C3 0100 add [bx+si],ax +000030C5 E828FF call 0x2ff0 +000030C8 FF db 0xFF +000030C9 FF50B7 call near [bx+si-0x49] +000030CC 07 pop es +000030CD 88C3 mov bl,al +000030CF E87AD6 call 0x74c +000030D2 FF db 0xFF +000030D3 FF5888 call far [bx+si-0x78] +000030D6 E3E8 jcxz 0x30c0 +000030D8 72D6 jc 0x30b0 +000030DA FF db 0xFF +000030DB FFB33AE8 push word [bp+di+0xe83a] +000030DF 6BD6FF imul dx,si,byte -0x1 +000030E2 FFA08D2F jmp near [bx+si+0x2f8d] +000030E6 0100 add [bx+si],ax +000030E8 E805FF call 0x2ff0 +000030EB FF db 0xFF +000030EC FF5088 call near [bx+si-0x78] +000030EF C3 ret +000030F0 E859D6 call 0x74c +000030F3 FF db 0xFF +000030F4 FF5888 call far [bx+si-0x78] +000030F7 E3E8 jcxz 0x30e1 +000030F9 51 push cx +000030FA D6 salc +000030FB FF db 0xFF +000030FC FFB33AE8 push word [bp+di+0xe83a] +00003100 4A dec dx +00003101 D6 salc +00003102 FF db 0xFF +00003103 FFA08E2F jmp near [bx+si+0x2f8e] +00003107 0100 add [bx+si],ax +00003109 E8E4FE call 0x2ff0 +0000310C FF db 0xFF +0000310D FF5088 call near [bx+si-0x78] +00003110 C3 ret +00003111 E838D6 call 0x74c +00003114 FF db 0xFF +00003115 FF5888 call far [bx+si-0x78] +00003118 E3E8 jcxz 0x3102 +0000311A 30D6 xor dh,dl +0000311C FF db 0xFF +0000311D FF5E5B call far [bp+0x5b] +00003120 58 pop ax +00003121 C3 ret +00003122 0000 add [bx+si],al +00003124 0000 add [bx+si],al +00003126 0000 add [bx+si],al +00003128 0000 add [bx+si],al +0000312A 0000 add [bx+si],al +0000312C 0000 add [bx+si],al +0000312E 0000 add [bx+si],al +00003130 0000 add [bx+si],al +00003132 0000 add [bx+si],al +00003134 0000 add [bx+si],al +00003136 0000 add [bx+si],al +00003138 0000 add [bx+si],al +0000313A 0000 add [bx+si],al +0000313C 0000 add [bx+si],al +0000313E 0000 add [bx+si],al +00003140 0000 add [bx+si],al +00003142 830526 add word [di],byte +0x26 +00003145 3101 xor [bx+di],ax +00003147 0001 add [bx+di],al +00003149 83152A adc word [di],byte +0x2a +0000314C 3101 xor [bx+di],ax +0000314E 0000 add [bx+si],al +00003150 833D22 cmp word [di],byte +0x22 +00003153 3101 xor [bx+di],ax +00003155 0000 add [bx+si],al +00003157 7406 jz 0x315f +00003159 FF0D dec word [di] +0000315B 2231 and dh,[bx+di] +0000315D 0100 add [bx+si],ax +0000315F 813D2E31 cmp word [di],0x312e +00003163 0100 add [bx+si],ax +00003165 0000 add [bx+si],al +00003167 0000 add [bx+si],al +00003169 7406 jz 0x3171 +0000316B FF15 call near [di] +0000316D 2E3101 xor [cs:bx+di],ax +00003170 00813D32 add [bx+di+0x323d],al +00003174 3101 xor [bx+di],ax +00003176 0000 add [bx+si],al +00003178 0000 add [bx+si],al +0000317A 007406 add [si+0x6],dh +0000317D FF15 call near [di] +0000317F 3231 xor dh,[bx+di] +00003181 0100 add [bx+si],ax +00003183 813D3631 cmp word [di],0x3136 +00003187 0100 add [bx+si],ax +00003189 0000 add [bx+si],al +0000318B 0000 add [bx+si],al +0000318D 7406 jz 0x3195 +0000318F FF15 call near [di] +00003191 363101 xor [ss:bx+di],ax +00003194 00813D3A add [bx+di+0x3a3d],al +00003198 3101 xor [bx+di],ax +0000319A 0000 add [bx+si],al +0000319C 0000 add [bx+si],al +0000319E 007406 add [si+0x6],dh +000031A1 FF15 call near [di] +000031A3 3A31 cmp dh,[bx+di] +000031A5 0100 add [bx+si],ax +000031A7 813D3E31 cmp word [di],0x313e +000031AB 0100 add [bx+si],ax +000031AD 0000 add [bx+si],al +000031AF 0000 add [bx+si],al +000031B1 7406 jz 0x31b9 +000031B3 FF15 call near [di] +000031B5 3E3101 xor [ds:bx+di],ax +000031B8 00B020E6 add [bx+si+0xe620],dh +000031BC 20C3 and bl,al +000031BE 833D2E cmp word [di],byte +0x2e +000031C1 3101 xor [bx+di],ax +000031C3 0000 add [bx+si],al +000031C5 750E jnz 0x31d5 +000031C7 891D mov [di],bx +000031C9 2E3101 xor [cs:bx+di],ax +000031CC 00EB add bl,ch +000031CE 48 dec ax +000031CF B80100 mov ax,0x1 +000031D2 0000 add [bx+si],al +000031D4 C3 ret +000031D5 833D32 cmp word [di],byte +0x32 +000031D8 3101 xor [bx+di],ax +000031DA 0000 add [bx+si],al +000031DC 7508 jnz 0x31e6 +000031DE 891D mov [di],bx +000031E0 3231 xor dh,[bx+di] +000031E2 0100 add [bx+si],ax +000031E4 EB31 jmp short 0x3217 +000031E6 833D36 cmp word [di],byte +0x36 +000031E9 3101 xor [bx+di],ax +000031EB 0000 add [bx+si],al +000031ED 7508 jnz 0x31f7 +000031EF 891D mov [di],bx +000031F1 363101 xor [ss:bx+di],ax +000031F4 00EB add bl,ch +000031F6 20833D3A and [bp+di+0x3a3d],al +000031FA 3101 xor [bx+di],ax +000031FC 0000 add [bx+si],al +000031FE 7508 jnz 0x3208 +00003200 891D mov [di],bx +00003202 3A31 cmp dh,[bx+di] +00003204 0100 add [bx+si],ax +00003206 EB0F jmp short 0x3217 +00003208 833D3E cmp word [di],byte +0x3e +0000320B 3101 xor [bx+di],ax +0000320D 0000 add [bx+si],al +0000320F 75BE jnz 0x31cf +00003211 891D mov [di],bx +00003213 3E3101 xor [ds:bx+di],ax +00003216 0031 add [bx+di],dh +00003218 C0C339 rol bl,0x39 +0000321B 1D2E31 sbb ax,0x312e +0000321E 0100 add [bx+si],ax +00003220 7512 jnz 0x3234 +00003222 C7052E31 mov word [di],0x312e +00003226 0100 add [bx+si],ax +00003228 0000 add [bx+si],al +0000322A 0000 add [bx+si],al +0000322C EB54 jmp short 0x3282 +0000322E B80100 mov ax,0x1 +00003231 0000 add [bx+si],al +00003233 C3 ret +00003234 391D cmp [di],bx +00003236 3231 xor dh,[bx+di] +00003238 0100 add [bx+si],ax +0000323A 750C jnz 0x3248 +0000323C C7053231 mov word [di],0x3132 +00003240 0100 add [bx+si],ax +00003242 0000 add [bx+si],al +00003244 0000 add [bx+si],al +00003246 EB3A jmp short 0x3282 +00003248 391D cmp [di],bx +0000324A 363101 xor [ss:bx+di],ax +0000324D 00750C add [di+0xc],dh +00003250 C7053631 mov word [di],0x3136 +00003254 0100 add [bx+si],ax +00003256 0000 add [bx+si],al +00003258 0000 add [bx+si],al +0000325A EB26 jmp short 0x3282 +0000325C 391D cmp [di],bx +0000325E 3A31 cmp dh,[bx+di] +00003260 0100 add [bx+si],ax +00003262 750C jnz 0x3270 +00003264 C7053A31 mov word [di],0x313a +00003268 0100 add [bx+si],ax +0000326A 0000 add [bx+si],al +0000326C 0000 add [bx+si],al +0000326E EB12 jmp short 0x3282 +00003270 391D cmp [di],bx +00003272 3E3101 xor [ds:bx+di],ax +00003275 0075B6 add [di-0x4a],dh +00003278 C7053E31 mov word [di],0x313e +0000327C 0100 add [bx+si],ax +0000327E 0000 add [bx+si],al +00003280 0000 add [bx+si],al +00003282 31C0 xor ax,ax +00003284 C3 ret +00003285 890D mov [di],cx +00003287 2231 and dh,[bx+di] +00003289 0100 add [bx+si],ax +0000328B 833D22 cmp word [di],byte +0x22 +0000328E 3101 xor [bx+di],ax +00003290 0000 add [bx+si],al +00003292 75F7 jnz 0x328b +00003294 C3 ret +00003295 890D mov [di],cx +00003297 2231 and dh,[bx+di] +00003299 0100 add [bx+si],ax +0000329B B92231 mov cx,0x3122 +0000329E 0100 add [bx+si],ax +000032A0 C3 ret +000032A1 50 push ax +000032A2 B034 mov al,0x34 +000032A4 E643 out 0x43,al +000032A6 B09B mov al,0x9b +000032A8 E640 out 0x40,al +000032AA B02E mov al,0x2e +000032AC E640 out 0x40,al +000032AE 58 pop ax +000032AF C3 ret +000032B0 0000 add [bx+si],al +000032B2 0000 add [bx+si],al +000032B4 0A29 or ch,[bx+di] +000032B6 0C1C or al,0x1c +000032B8 1202 adc al,[bp+si] +000032BA 2B162313 sub dx,[0x1323] +000032BE 093A or [bp+si],di +000032C0 0000 add [bx+si],al +000032C2 3923 cmp [bp+di],sp +000032C4 0C2B or al,0x2b +000032C6 2B2F sub bp,[bx] +000032C8 1818 sbb [bx+si],bl +000032CA 1C14 sbb al,0x14 +000032CC 183C sbb [si],bh +000032CE 0A3C or bh,[si] +000032D0 0F db 0x0F +000032D1 1F pop ds +000032D2 2F das +000032D3 3F aas +000032D4 3E3814 cmp [ds:si],dl +000032D7 3C38 cmp al,0x38 +000032D9 16 push ss +000032DA 3F aas +000032DB 3D243F cmp ax,0x3f24 +000032DE 3F aas +000032DF 3F aas +000032E0 0000 add [bx+si],al +000032E2 0005 add [di],al +000032E4 050508 add ax,0x805 +000032E7 0808 or [bx+si],cl +000032E9 0B0B or cx,[bp+di] +000032EB 0B0E0E0E or cx,[0xe0e] +000032EF 1111 adc [bx+di],dx +000032F1 1114 adc [si],dx +000032F3 1414 adc al,0x14 +000032F5 1818 sbb [bx+si],bl +000032F7 181C sbb [si],bl +000032F9 1C1C sbb al,0x1c +000032FB 2020 and [bx+si],ah +000032FD 2024 and [si],ah +000032FF 2424 and al,0x24 +00003301 2828 sub [bx+si],ch +00003303 282D sub [di],ch +00003305 2D2D32 sub ax,0x322d +00003308 3232 xor dh,[bp+si] +0000330A 3838 cmp [bx+si],bh +0000330C 383F cmp [bx],bh +0000330E 3F aas +0000330F 3F aas +00003310 0D0C0F or ax,0xf0c +00003313 0F10161114 umov [0x1411],dl +00003318 1D1318 sbb ax,0x1813 +0000331B 2415 and al,0x15 +0000331D 1C2B sbb al,0x2b +0000331F 17 pop ss +00003320 1F pop ds +00003321 3219 xor bl,[bx+di] +00003323 2239 and bh,[bx+di] +00003325 1A2A sbb ch,[bp+si] +00003327 3F aas +00003328 000F add [bx],cl +0000332A 0201 add al,[bx+di] +0000332C 16 push ss +0000332D 0402 add al,0x2 +0000332F 1D0603 sbb ax,0x306 +00003332 2408 and al,0x8 +00003334 042B add al,0x2b +00003336 0A05 or al,[di] +00003338 320C xor cl,[si] +0000333A 06 push es +0000333B 390E143F cmp [0x3f14],cx +0000333F 2812 sub [bp+si],dl +00003341 06 push es +00003342 07 pop es +00003343 190C sbb [si],cx +00003345 0B21 or sp,[bx+di] +00003347 110E2817 adc [0x1728],cx +0000334B 1230 adc dh,[bx+si] +0000334D 1C15 sbb al,0x15 +0000334F 37 aaa +00003350 2219 and bl,[bx+di] +00003352 3E27 ds daa +00003354 1B3F sbb di,[bx] +00003356 3024 xor [si],ah +00003358 0F0302 lsl ax,[bp+si] +0000335B 16 push ss +0000335C 06 push es +0000335D 041D add al,0x1d +0000335F 0906240C or [0xc24],ax +00003363 082B or [bp+di],ch +00003365 0F db 0x0F +00003366 0A32 or dh,[bp+si] +00003368 120C adc cl,[si] +0000336A 3915 cmp [di],dx +0000336C 0E push cs +0000336D 3F aas +0000336E 1C14 sbb al,0x14 +00003370 0F0000 sldt [bx+si] +00003373 16 push ss +00003374 07 pop es +00003375 001D add [di],bl +00003377 0F0024 verr [si] +0000337A 17 pop ss +0000337B 002B add [bp+di],ch +0000337D 1F pop ds +0000337E 0032 add [bp+si],dh +00003380 27 daa +00003381 0039 add [bx+di],bh +00003383 2F das +00003384 003F add [bx],bh +00003386 37 aaa +00003387 000F add [bx],cl +00003389 050316 add ax,0x1603 +0000338C 0B07 or ax,[bx] +0000338E 1D110B sbb ax,0xb11 +00003391 2417 and al,0x17 +00003393 0F2B1D movntps [di],xmm3 +00003396 1332 adc si,[bp+si] +00003398 2317 and dx,[bx] +0000339A 3929 cmp [bx+di],bp +0000339C 1B3F sbb di,[bx] +0000339E 35221C xor ax,0x1c22 +000033A1 0E push cs +000033A2 0C21 or al,0x21 +000033A4 140E adc al,0xe +000033A6 261A10 sbb dl,[es:bx+si] +000033A9 2B20 sub sp,[bx+si] +000033AB 1230 adc dh,[bx+si] +000033AD 261435 es adc al,0x35 +000033B0 2C16 sub al,0x16 +000033B2 3A32 cmp dh,[bp+si] +000033B4 183F sbb [bx],bh +000033B6 381E0505 cmp [0x505],bl +000033BA 06 push es +000033BB 0A0A or cl,[bp+si] +000033BD 0D0F0F or ax,0xf0f +000033C0 1414 adc al,0x14 +000033C2 141B adc al,0x1b +000033C4 1919 sbb [bx+di],bx +000033C6 221E1E29 and bl,[0x291e] +000033CA 2323 and sp,[bp+di] +000033CC 302C xor [si],ch +000033CE 2C3F sub al,0x3f +000033D0 03060505 add ax,[0x505] +000033D4 0B09 or cx,[bx+di] +000033D6 07 pop es +000033D7 100D adc [di],cl +000033D9 0915 or [di],dx +000033DB 110B adc [bp+di],cx +000033DD 1A15 sbb dl,[di] +000033DF 0D1F19 or ax,0x191f +000033E2 0F db 0x0F +000033E3 241D and al,0x1d +000033E5 1430 adc al,0x30 +000033E7 2606 es push es +000033E9 06 push es +000033EA 07 pop es +000033EB 0D0D0F or ax,0xf0d +000033EE 1414 adc al,0x14 +000033F0 17 pop ss +000033F1 1B1B sbb bx,[bp+di] +000033F3 1F pop ds +000033F4 2222 and ah,[bp+si] +000033F6 27 daa +000033F7 2929 sub [bx+di],bp +000033F9 2F das +000033FA 3030 xor [bx+si],dh +000033FC 37 aaa +000033FD 3939 cmp [bx+di],di +000033FF 3F aas +00003400 06 push es +00003401 0F db 0x0F +00003402 040C add al,0xc +00003404 16 push ss +00003405 0812 or [bp+si],dl +00003407 1D0C18 sbb ax,0x180c +0000340A 2410 and al,0x10 +0000340C 1E push ds +0000340D 2B14 sub dx,[si] +0000340F 2432 and al,0x32 +00003411 182A sbb [bp+si],ch +00003413 391C cmp [si],bx +00003415 363F ss aas +00003417 230F and cx,[bx] +00003419 0A0A or cl,[bp+si] +0000341B 16 push ss +0000341C 1010 adc [bx+si],dl +0000341E 1D1515 sbb ax,0x1515 +00003421 241B and al,0x1b +00003423 1B2B sbb bp,[bp+di] +00003425 2020 and [bx+si],ah +00003427 32262639 xor ah,[0x3926] +0000342B 2B2B sub bp,[bp+di] +0000342D 3F aas +0000342E 36360F0F0616160C pi2fw mm0,[ss:0x1616] +00003436 1D1D12 sbb ax,0x121d +00003439 2424 and al,0x24 +0000343B 182B sbb [bp+di],ch +0000343D 2B1E3232 sub bx,[0x3232] +00003441 2439 and al,0x39 +00003443 392A cmp [bp+si],bp +00003445 3F aas +00003446 3F aas +00003447 360204 add al,[ss:si] +0000344A 0E push cs +0000344B 06 push es +0000344C 0C15 or al,0x15 +0000344E 0A14 or dl,[si] +00003450 1C0E sbb al,0xe +00003452 1C23 sbb al,0x23 +00003454 1224 adc ah,[si] +00003456 2A162C31 sub dl,[0x312c] +0000345A 1A34 sbb dh,[si] +0000345C 3824 cmp [si],ah +0000345E 3F aas +0000345F 3F aas +00003460 1204 adc al,[si] +00003462 0E push cs +00003463 1808 sbb [bx+si],cl +00003465 151F0C adc ax,0xc1f +00003468 1C25 sbb al,0x25 +0000346A 1023 adc [bp+di],ah +0000346C 2C14 sub al,0x14 +0000346E 2A32 sub dh,[bp+si] +00003470 1831 sbb [bx+di],dh +00003472 391C cmp [si],bx +00003474 383F cmp [bx],bh +00003476 263F es aas +00003478 0000 add [bx+si],al +0000347A 0000 add [bx+si],al +0000347C 0000 add [bx+si],al +0000347E 0000 add [bx+si],al +00003480 0000 add [bx+si],al +00003482 0000 add [bx+si],al +00003484 0000 add [bx+si],al +00003486 0000 add [bx+si],al +00003488 0000 add [bx+si],al +0000348A 0000 add [bx+si],al +0000348C 0035 add [di],dh +0000348E 2C16 sub al,0x16 +00003490 0908 or [bx+si],cx +00003492 0C10 or al,0x10 +00003494 0E push cs +00003495 10161514 adc [0x1415],dl +00003499 1D1B18 sbb ax,0x181b +0000349C 2322 and sp,[bp+si] +0000349E 1C2A sbb al,0x2a +000034A0 2820 sub [bx+si],ah +000034A2 302F xor [bx],ch +000034A4 2439 and al,0x39 +000034A6 382B cmp [bp+di],ch +000034A8 080C or [si],cl +000034AA 100E1016 adc [0x1610],cl +000034AE 15141D adc ax,0x1d14 +000034B1 1B18 sbb bx,[bx+si] +000034B3 2322 and sp,[bp+si] +000034B5 1C2A sbb al,0x2a +000034B7 2820 sub [bx+si],ah +000034B9 302F xor [bx],ch +000034BB 2439 and al,0x39 +000034BD 382B cmp [bp+di],ch +000034BF 3F aas +000034C0 0D090B or ax,0xb09 +000034C3 15100F adc ax,0xf10 +000034C6 1B161224 sbb dx,[0x2412] +000034CA 1D162A sbb ax,0x2a16 +000034CD 2319 and bx,[bx+di] +000034CF 332A xor bp,[bp+si] +000034D1 1D3930 sbb ax,0x3039 +000034D4 203F and [bx],bh +000034D6 3827 cmp [bx],ah +000034D8 06 push es +000034D9 0E push cs +000034DA 090C or [si],cx +000034DC 150E12 adc ax,0x120e +000034DF 1B161821 sbb dx,[0x2118] +000034E3 1C1E sbb al,0x1e +000034E5 27 daa +000034E6 2424 and al,0x24 +000034E8 2E2A2A sub ch,[cs:bp+si] +000034EB 342F xor al,0x2f +000034ED 323B xor bh,[bp+di] +000034EF 350000 xor ax,0x0 +000034F2 0000 add [bx+si],al +000034F4 0000 add [bx+si],al +000034F6 0000 add [bx+si],al +000034F8 0000 add [bx+si],al +000034FA 0000 add [bx+si],al +000034FC 0000 add [bx+si],al +000034FE 0000 add [bx+si],al +00003500 0000 add [bx+si],al +00003502 0000 add [bx+si],al +00003504 0000 add [bx+si],al +00003506 0000 add [bx+si],al +00003508 0000 add [bx+si],al +0000350A 0000 add [bx+si],al +0000350C 0000 add [bx+si],al +0000350E 0000 add [bx+si],al +00003510 0000 add [bx+si],al +00003512 0000 add [bx+si],al +00003514 0000 add [bx+si],al +00003516 0000 add [bx+si],al +00003518 0000 add [bx+si],al +0000351A 0000 add [bx+si],al +0000351C 0000 add [bx+si],al +0000351E 0000 add [bx+si],al +00003520 0000 add [bx+si],al +00003522 0000 add [bx+si],al +00003524 0000 add [bx+si],al +00003526 0000 add [bx+si],al +00003528 0000 add [bx+si],al +0000352A 0000 add [bx+si],al +0000352C 0000 add [bx+si],al +0000352E 0000 add [bx+si],al +00003530 0000 add [bx+si],al +00003532 0000 add [bx+si],al +00003534 0000 add [bx+si],al +00003536 0000 add [bx+si],al +00003538 0000 add [bx+si],al +0000353A 0000 add [bx+si],al +0000353C 0000 add [bx+si],al +0000353E 0000 add [bx+si],al +00003540 0000 add [bx+si],al +00003542 0000 add [bx+si],al +00003544 0000 add [bx+si],al +00003546 0000 add [bx+si],al +00003548 0000 add [bx+si],al +0000354A 0000 add [bx+si],al +0000354C 0000 add [bx+si],al +0000354E 0000 add [bx+si],al +00003550 0000 add [bx+si],al +00003552 0000 add [bx+si],al +00003554 0000 add [bx+si],al +00003556 0000 add [bx+si],al +00003558 0000 add [bx+si],al +0000355A 0000 add [bx+si],al +0000355C 0000 add [bx+si],al +0000355E 0000 add [bx+si],al +00003560 0000 add [bx+si],al +00003562 0000 add [bx+si],al +00003564 0000 add [bx+si],al +00003566 0000 add [bx+si],al +00003568 0000 add [bx+si],al +0000356A 0000 add [bx+si],al +0000356C 0000 add [bx+si],al +0000356E 0000 add [bx+si],al +00003570 0000 add [bx+si],al +00003572 0000 add [bx+si],al +00003574 0000 add [bx+si],al +00003576 0000 add [bx+si],al +00003578 0000 add [bx+si],al +0000357A 0000 add [bx+si],al +0000357C 0000 add [bx+si],al +0000357E 0000 add [bx+si],al +00003580 0000 add [bx+si],al +00003582 0000 add [bx+si],al +00003584 0000 add [bx+si],al +00003586 0000 add [bx+si],al +00003588 0000 add [bx+si],al +0000358A 0000 add [bx+si],al +0000358C 0000 add [bx+si],al +0000358E 0000 add [bx+si],al +00003590 0000 add [bx+si],al +00003592 0000 add [bx+si],al +00003594 0000 add [bx+si],al +00003596 0000 add [bx+si],al +00003598 0000 add [bx+si],al +0000359A 0000 add [bx+si],al +0000359C 0000 add [bx+si],al +0000359E 0000 add [bx+si],al +000035A0 0000 add [bx+si],al +000035A2 0000 add [bx+si],al +000035A4 0000 add [bx+si],al +000035A6 0000 add [bx+si],al +000035A8 0000 add [bx+si],al +000035AA 0000 add [bx+si],al +000035AC 0000 add [bx+si],al +000035AE 0000 add [bx+si],al +000035B0 50 push ax +000035B1 B80000 mov ax,0x0 +000035B4 0300 add ax,[bx+si] +000035B6 BB0000 mov bx,0x0 +000035B9 1000 adc [bx+si],al +000035BB E80CD5 call 0xaca +000035BE FF db 0xFF +000035BF FF58C3 call far [bx+si-0x3d] +000035C2 50 push ax +000035C3 53 push bx +000035C4 B80000 mov ax,0x0 +000035C7 1300 adc ax,[bx+si] +000035C9 BB0000 mov bx,0x0 +000035CC 1000 adc [bx+si],al +000035CE E8F9D4 call 0xaca +000035D1 FF db 0xFF +000035D2 FF db 0xFF +000035D3 BEB032 mov si,0x32b0 +000035D6 0100 add [bx+si],ax +000035D8 E86300 call 0x363e +000035DB 0000 add [bx+si],al +000035DD 5B pop bx +000035DE 58 pop ax +000035DF C3 ret +000035E0 6650 push eax +000035E2 6653 push ebx +000035E4 6651 push ecx +000035E6 57 push di +000035E7 BF0000 mov di,0x0 +000035EA 0A00 or al,[bx+si] +000035EC 6601DF add edi,ebx +000035EF 6689CB mov ebx,ecx +000035F2 66C1E108 shl ecx,0x8 +000035F6 66C1E306 shl ebx,0x6 +000035FA 6601D9 add ecx,ebx +000035FD 6601CF add edi,ecx +00003600 AA stosb +00003601 5F pop di +00003602 6659 pop ecx +00003604 665B pop ebx +00003606 6658 pop eax +00003608 C3 ret +00003609 60 pusha +0000360A 664A dec edx +0000360C 6651 push ecx +0000360E 6650 push eax +00003610 6649 dec ecx +00003612 6650 push eax +00003614 6653 push ebx +00003616 6651 push ecx +00003618 6689D9 mov ecx,ebx +0000361B 6689C3 mov ebx,eax +0000361E AC lodsb +0000361F E8BCFF call 0x35de +00003622 FF db 0xFF +00003623 FF6659 jmp near [bp+0x59] +00003626 665B pop ebx +00003628 6658 pop eax +0000362A 6640 inc eax +0000362C 6683F900 cmp ecx,byte +0x0 +00003630 75DE jnz 0x3610 +00003632 6658 pop eax +00003634 6659 pop ecx +00003636 6643 inc ebx +00003638 6683FA00 cmp edx,byte +0x0 +0000363C 75CC jnz 0x360a +0000363E 61 popa +0000363F C3 ret +00003640 6650 push eax +00003642 6651 push ecx +00003644 6652 push edx +00003646 6631C9 xor ecx,ecx +00003649 66BAC80388C8 mov edx,0xc88803c8 +0000364F EE out dx,al +00003650 6642 inc edx +00003652 8A06EE46 mov al,[0x46ee] +00003656 8A06EE46 mov al,[0x46ee] +0000365A 8A06EE46 mov al,[0x46ee] +0000365E 6641 inc ecx +00003660 6681F900017CE2 cmp ecx,0xe27c0100 +00003667 665A pop edx +00003669 6659 pop ecx +0000366B 6658 pop eax +0000366D C3 ret +0000366E 0A00 or al,[bx+si] +00003670 0A00 or al,[bx+si] +00003672 0A00 or al,[bx+si] +00003674 0A00 or al,[bx+si] +00003676 D400 aam 0x0 +00003678 D400 aam 0x0 +0000367A D400 aam 0x0 +0000367C D400 aam 0x0 +0000367E 0B00 or ax,[bx+si] +00003680 0B00 or ax,[bx+si] +00003682 0B00 or ax,[bx+si] +00003684 0B00 or ax,[bx+si] +00003686 D6 salc +00003687 00D6 add dh,dl +00003689 00D6 add dh,dl +0000368B 00D6 add dh,dl +0000368D 000C add [si],cl +0000368F 000C add [si],cl +00003691 000C add [si],cl +00003693 000C add [si],cl +00003695 00D8 add al,bl +00003697 00D8 add al,bl +00003699 00D8 add al,bl +0000369B 00D8 add al,bl +0000369D 00870083 add [bx+0x8300],al +000036A1 00810082 add [bx+di+0x8200],al +000036A5 008F008B add [bx+0x8b00],cl +000036A9 0089008A add [bx+di+0x8a00],cl +000036AD 0000 add [bx+si],al +000036AF 0002 add [bp+si],al +000036B1 0004 add [si],al +000036B3 000600C0 add [0xc000],al +000036B7 00C4 add ah,al +000036B9 00C8 add al,cl +000036BB 00CC add ah,cl +000036BD 0001 add [bx+di],al +000036BF 0003 add [bp+di],al +000036C1 0005 add [di],al +000036C3 0007 add [bx],al +000036C5 00C2 add dl,al +000036C7 00C6 add dh,al +000036C9 00CA add dl,cl +000036CB 00CE add dh,cl +000036CD 005052 add [bx+si+0x52],dl +000036D0 56 push si +000036D1 FA cli +000036D2 08FF or bh,bh +000036D4 7407 jz 0x36dd +000036D6 88DF mov bh,bl +000036D8 80C748 add bh,0x48 +000036DB EB05 jmp short 0x36e2 +000036DD 88DF mov bh,bl +000036DF 80C744 add bh,0x44 +000036E2 4E dec si +000036E3 0FB6C3 movzx ax,bl +000036E6 668B94006E mov edx,[si+0x6e00] +000036EB 360100 add [ss:bx+si],ax +000036EE 88D8 mov al,bl +000036F0 0C04 or al,0x4 +000036F2 EE out dx,al +000036F3 0FB6C3 movzx ax,bl +000036F6 668B94008E mov edx,[si+0x8e00] +000036FB 360100 add [ss:bx+si],ax +000036FE B000 mov al,0x0 +00003700 EE out dx,al +00003701 0FB6C3 movzx ax,bl +00003704 668B94007E mov edx,[si+0x7e00] +00003709 360100 add [ss:bx+si],ax +0000370C 88F8 mov al,bh +0000370E EE out dx,al +0000370F 0FB6C3 movzx ax,bl +00003712 668B9400AE mov edx,[si+0xae00] +00003717 360100 add [ss:bx+si],ax +0000371A 88C8 mov al,cl +0000371C EE out dx,al +0000371D 88E8 mov al,ch +0000371F EE out dx,al +00003720 0FB6C3 movzx ax,bl +00003723 668B94009E mov edx,[si+0x9e00] +00003728 360100 add [ss:bx+si],ax +0000372B 89C8 mov ax,cx +0000372D C1E810 shr ax,0x10 +00003730 EE out dx,al +00003731 0FB6C3 movzx ax,bl +00003734 668B9400BE mov edx,[si+0xbe00] +00003739 360100 add [ss:bx+si],ax +0000373C 89F0 mov ax,si +0000373E EE out dx,al +0000373F 88E0 mov al,ah +00003741 EE out dx,al +00003742 0FB6C3 movzx ax,bl +00003745 668B94006E mov edx,[si+0x6e00] +0000374A 360100 add [ss:bx+si],ax +0000374D 88D8 mov al,bl +0000374F EE out dx,al +00003750 FB sti +00003751 5E pop si +00003752 5A pop dx +00003753 58 pop ax +00003754 C3 ret +00003755 0000 add [bx+si],al +00003757 0000 add [bx+si],al +00003759 0000 add [bx+si],al +0000375B 0000 add [bx+si],al +0000375D 0000 add [bx+si],al +0000375F 0000 add [bx+si],al +00003761 0000 add [bx+si],al +00003763 0000 add [bx+si],al +00003765 0000 add [bx+si],al +00003767 4E dec si +00003768 6F outsw +00003769 7420 jz 0x378b +0000376B 696E737461 imul bp,[bp+0x73],word 0x6174 +00003770 6C insb +00003771 6C insb +00003772 65642020 and [fs:bx+si],ah +00003776 0033 add [bp+di],dh +00003778 363020 xor [ss:bx+si],ah +0000377B 6B622C20 imul sp,[bp+si+0x2c],byte +0x20 +0000377F 352E32 xor ax,0x322e +00003782 352220 xor ax,0x2022 +00003785 2000 and [bx+si],al +00003787 312E3220 xor [0x2032],bp +0000378B 6D insw +0000378C 622C bound bp,[si] +0000378E 2035 and [di],dh +00003790 2E3235 xor dh,[cs:di] +00003793 2220 and ah,[bx+si] +00003795 2000 and [bx+si],al +00003797 37 aaa +00003798 3230 xor dh,[bx+si] +0000379A 206B62 and [bp+di+0x62],ch +0000379D 2C20 sub al,0x20 +0000379F 332E3522 xor bp,[0x2235] +000037A3 2020 and [bx+si],ah +000037A5 2000 and [bx+si],al +000037A7 312E3434 xor [0x3434],bp +000037AB 206D62 and [di+0x62],ch +000037AE 2C20 sub al,0x20 +000037B0 332E3522 xor bp,[0x2235] +000037B4 2020 and [bx+si],ah +000037B6 0032 add [bp+si],dh +000037B8 2E3838 cmp [cs:bx+si],bh +000037BB 206D62 and [di+0x62],ch +000037BE 2C20 sub al,0x20 +000037C0 332E3522 xor bp,[0x2235] +000037C4 2020 and [bx+si],ah +000037C6 000D add [di],cl +000037C8 0A20 or ah,[bx+si] +000037CA 2020 and [bx+si],ah +000037CC 6664303A o32 xor [fs:bp+si],bh +000037D0 2020 and [bx+si],ah +000037D2 2000 and [bx+si],al +000037D4 0000 add [bx+si],al +000037D6 0000 add [bx+si],al +000037D8 0000 add [bx+si],al +000037DA 0D0A20 or ax,0x200a +000037DD 2020 and [bx+si],ah +000037DF 6664313A xor [fs:bp+si],edi +000037E3 2020 and [bx+si],ah +000037E5 2000 and [bx+si],al +000037E7 0000 add [bx+si],al +000037E9 0000 add [bx+si],al +000037EB 0000 add [bx+si],al +000037ED C3 ret +000037EE C3 ret +000037EF C3 ret +000037F0 C3 ret +000037F1 C3 ret +000037F2 C3 ret +000037F3 C3 ret +000037F4 C3 ret +000037F5 C3 ret +000037F6 C3 ret +000037F7 C3 ret +000037F8 C3 ret +000037F9 C3 ret +000037FA C3 ret +000037FB 50 push ax +000037FC 51 push cx +000037FD 57 push di +000037FE B010 mov al,0x10 +00003800 E670 out 0x70,al +00003802 E471 in al,0x71 +00003804 50 push ax +00003805 C0E804 shr al,0x4 +00003808 A2D437 mov [0x37d4],al +0000380B 0100 add [bx+si],ax +0000380D 58 pop ax +0000380E 240F and al,0xf +00003810 A2E737 mov [0x37e7],al +00003813 0100 add [bx+si],ax +00003815 BEC737 mov si,0x37c7 +00003818 0100 add [bx+si],ax +0000381A B307 mov bl,0x7 +0000381C E88ECF call 0x7ad +0000381F FF db 0xFF +00003820 FF0F dec word [bx] +00003822 B635 mov dh,0x35 +00003824 D437 aam 0x37 +00003826 0100 add [bx+si],ax +00003828 C1E604 shl si,0x4 +0000382B 81C66737 add si,0x3767 +0000382F 0100 add [bx+si],ax +00003831 B307 mov bl,0x7 +00003833 E877CF call 0x7ad +00003836 FF db 0xFF +00003837 FF db 0xFF +00003838 BEDA37 mov si,0x37da +0000383B 0100 add [bx+si],ax +0000383D B307 mov bl,0x7 +0000383F E86BCF call 0x7ad +00003842 FF db 0xFF +00003843 FF0F dec word [bx] +00003845 B635 mov dh,0x35 +00003847 E737 out 0x37,ax +00003849 0100 add [bx+si],ax +0000384B C1E604 shl si,0x4 +0000384E 81C66737 add si,0x3767 +00003852 0100 add [bx+si],ax +00003854 B307 mov bl,0x7 +00003856 E854CF call 0x7ad +00003859 FF db 0xFF +0000385A FF db 0xFF +0000385B BECAEF mov si,0xefca +0000385E 0F db 0x0F +0000385F 00BFD537 add [bx+0x37d5],bh +00003863 0100 add [bx+si],ax +00003865 B90500 mov cx,0x5 +00003868 0000 add [bx+si],al +0000386A F3A4 rep movsb +0000386C 83C605 add si,byte +0x5 +0000386F BFE837 mov di,0x37e8 +00003872 0100 add [bx+si],ax +00003874 B90600 mov cx,0x6 +00003877 0000 add [bx+si],al +00003879 F3A4 rep movsb +0000387B B126 mov cl,0x26 +0000387D BF9C38 mov di,0x389c +00003880 0100 add [bx+si],ax +00003882 E844C9 call 0x1c9 +00003885 FF db 0xFF +00003886 FFB106E8 push word [bx+di+0xe806] +0000388A 52 push dx +0000388B D3FF sar di,cl +0000388D FF db 0xFF +0000388E E8D200 call 0x3963 +00003891 0000 add [bx+si],al +00003893 E88801 call 0x3a1e +00003896 0000 add [bx+si],al +00003898 5F pop di +00003899 59 pop cx +0000389A 58 pop ax +0000389B C3 ret +0000389C 60 pusha +0000389D 0FA8 push gs +0000389F 0FA0 push fs +000038A1 1E push ds +000038A2 06 push es +000038A3 56 push si +000038A4 66830D55 or dword [di],byte +0x55 +000038A8 37 aaa +000038A9 0100 add [bx+si],ax +000038AB 01B020E6 add [bx+si+0xe620],si +000038AF 205E07 and [bp+0x7],bl +000038B2 1F pop ds +000038B3 0FA1 pop fs +000038B5 0FA9 pop gs +000038B7 61 popa +000038B8 CF iret +000038B9 50 push ax +000038BA 51 push cx +000038BB B99600 mov cx,0x96 +000038BE 0000 add [bx+si],al +000038C0 E8D0F9 call 0x3293 +000038C3 FF db 0xFF +000038C4 FF833900 inc word [bp+di+0x39] +000038C8 740F jz 0x38d9 +000038CA 66A15537 mov eax,[0x3755] +000038CE 0100 add [bx+si],ax +000038D0 6609C0 or eax,eax +000038D3 74F0 jz 0x38c5 +000038D5 59 pop cx +000038D6 58 pop ax +000038D7 F8 clc +000038D8 C3 ret +000038D9 59 pop cx +000038DA 58 pop ax +000038DB F9 stc +000038DC C3 ret +000038DD 50 push ax +000038DE 52 push dx +000038DF 66BAF203B000 mov edx,0xb003f2 +000038E5 EE out dx,al +000038E6 C60557 mov byte [di],0x57 +000038E9 37 aaa +000038EA 0100 add [bx+si],ax +000038EC 005A58 add [bp+si+0x58],bl +000038EF C3 ret +000038F0 50 push ax +000038F1 52 push dx +000038F2 66BAF203B01C mov edx,0x1cb003f2 +000038F8 EE out dx,al +000038F9 B91400 mov cx,0x14 +000038FC 0000 add [bx+si],al +000038FE E882F9 call 0x3283 +00003901 FF db 0xFF +00003902 FFC6 inc si +00003904 055737 add ax,0x3757 +00003907 0100 add [bx+si],ax +00003909 015A58 add [bp+si+0x58],bx +0000390C C3 ret +0000390D 52 push dx +0000390E 51 push cx +0000390F 50 push ax +00003910 B99600 mov cx,0x96 +00003913 0000 add [bx+si],al +00003915 E87BF9 call 0x3293 +00003918 FF db 0xFF +00003919 FF833900 inc word [bp+di+0x39] +0000391D 7415 jz 0x3934 +0000391F 66BAF403EC24 mov edx,0x24ec03f4 +00003925 C03C80 sar byte [si],0x80 +00003928 75F0 jnz 0x391a +0000392A 58 pop ax +0000392B 59 pop cx +0000392C 66BAF503EE5A mov edx,0x5aee03f5 +00003932 F8 clc +00003933 C3 ret +00003934 58 pop ax +00003935 59 pop cx +00003936 5A pop dx +00003937 F9 stc +00003938 C3 ret +00003939 52 push dx +0000393A 51 push cx +0000393B 50 push ax +0000393C B99600 mov cx,0x96 +0000393F 0000 add [bx+si],al +00003941 E84FF9 call 0x3293 +00003944 FF db 0xFF +00003945 FF833900 inc word [bp+di+0x39] +00003949 7415 jz 0x3960 +0000394B 66BAF403EC24 mov edx,0x24ec03f4 +00003951 C03CC0 sar byte [si],0xc0 +00003954 75F0 jnz 0x3946 +00003956 58 pop ax +00003957 59 pop cx +00003958 66BAF503EC5A mov edx,0x5aec03f5 +0000395E F8 clc +0000395F C3 ret +00003960 58 pop ax +00003961 59 pop cx +00003962 5A pop dx +00003963 F9 stc +00003964 C3 ret +00003965 66BAF203B008 mov edx,0x8b003f2 +0000396B EE out dx,al +0000396C B90500 mov cx,0x5 +0000396F 0000 add [bx+si],al +00003971 E80FF9 call 0x3283 +00003974 FF db 0xFF +00003975 FF66BA jmp near [bp-0x46] +00003978 F703B000 test word [bp+di],0xb0 +0000397C EE out dx,al +0000397D 66BAF2030C0C mov edx,0xc0c03f2 +00003983 EE out dx,al +00003984 66C70555370100 mov dword [di],0x13755 +0000398B 0000 add [bx+si],al +0000398D E827FF call 0x38b7 +00003990 FF db 0xFF +00003991 FF722E push word [bp+si+0x2e] +00003994 66B90400B008 mov ecx,0x8b00004 +0000399A E86EFF call 0x390b +0000399D FF db 0xFF +0000399E FF db 0xFF +0000399F E895FF call 0x3937 +000039A2 FF db 0xFF +000039A3 FF db 0xFF +000039A4 E890FF call 0x3937 +000039A7 FF db 0xFF +000039A8 FFE2 jmp dx +000039AA ED in ax,dx +000039AB B003 mov al,0x3 +000039AD E85BFF call 0x390b +000039B0 FF db 0xFF +000039B1 FFB0DFE8 push word [bx+si+0xe8df] +000039B5 54 push sp +000039B6 FF db 0xFF +000039B7 FF db 0xFF +000039B8 FFB002E8 push word [bx+si+0xe802] +000039BC 4D dec bp +000039BD FF db 0xFF +000039BE FF db 0xFF +000039BF FF db 0xFF +000039C0 F8 clc +000039C1 C3 ret +000039C2 F9 stc +000039C3 C3 ret +000039C4 60 pusha +000039C5 A06237 mov al,[0x3762] +000039C8 0100 add [bx+si],ax +000039CA 3805 cmp [di],al +000039CC 5A pop dx +000039CD 37 aaa +000039CE 0100 add [bx+si],ax +000039D0 7448 jz 0x3a1a +000039D2 B00F mov al,0xf +000039D4 E834FF call 0x390b +000039D7 FF db 0xFF +000039D8 FFA05937 jmp near [bx+si+0x3759] +000039DC 0100 add [bx+si],ax +000039DE E82AFF call 0x390b +000039E1 FF db 0xFF +000039E2 FFA05A37 jmp near [bx+si+0x375a] +000039E6 0100 add [bx+si],ax +000039E8 E820FF call 0x390b +000039EB FF db 0xFF +000039EC FF66C7 jmp near [bp-0x39] +000039EF 055537 add ax,0x3755 +000039F2 0100 add [bx+si],ax +000039F4 0000 add [bx+si],al +000039F6 E8BEFE call 0x38b7 +000039F9 FF db 0xFF +000039FA FF7220 push word [bp+si+0x20] +000039FD B008 mov al,0x8 +000039FF E809FF call 0x390b +00003A02 FF db 0xFF +00003A03 FF db 0xFF +00003A04 E830FF call 0x3937 +00003A07 FF db 0xFF +00003A08 FF88C4E8 dec word [bx+si+0xe8c4] +00003A0C 29FF sub di,di +00003A0E FF db 0xFF +00003A0F FFF6 push si +00003A11 C420 les sp,[bx+si] +00003A13 7408 jz 0x3a1d +00003A15 F6C480 test ah,0x80 +00003A18 7503 jnz 0x3a1d +00003A1A 61 popa +00003A1B F8 clc +00003A1C C3 ret +00003A1D 61 popa +00003A1E F9 stc +00003A1F C3 ret +00003A20 F60557 test byte [di],0x57 +00003A23 37 aaa +00003A24 0100 add [bx+si],ax +00003A26 017505 add [di+0x5],si +00003A29 E8C2FE call 0x38ee +00003A2C FF db 0xFF +00003A2D FFB007E8 push word [bx+si+0xe807] +00003A31 D8FE fdivr st6 +00003A33 FF db 0xFF +00003A34 FFB000E8 push word [bx+si+0xe800] +00003A38 D1FE sar si,1 +00003A3A FF db 0xFF +00003A3B FF66C7 jmp near [bp-0x39] +00003A3E 055537 add ax,0x3755 +00003A41 0100 add [bx+si],ax +00003A43 0000 add [bx+si],al +00003A45 E86FFE call 0x38b7 +00003A48 FF db 0xFF +00003A49 FF7226 push word [bp+si+0x26] +00003A4C B008 mov al,0x8 +00003A4E E8BAFE call 0x390b +00003A51 FF db 0xFF +00003A52 FF db 0xFF +00003A53 E8E1FE call 0x3937 +00003A56 FF db 0xFF +00003A57 FF88C4E8 dec word [bx+si+0xe8c4] +00003A5B DA db 0xDA +00003A5C FE db 0xFE +00003A5D FF db 0xFF +00003A5E FFF6 push si +00003A60 C420 les sp,[bx+si] +00003A62 740E jz 0x3a72 +00003A64 F6C410 test ah,0x10 +00003A67 7509 jnz 0x3a72 +00003A69 C60562 mov byte [di],0x62 +00003A6C 37 aaa +00003A6D 0100 add [bx+si],ax +00003A6F 00F8 add al,bh +00003A71 C3 ret +00003A72 F9 stc +00003A73 C3 ret +00003A74 E80700 call 0x3a7e +00003A77 0000 add [bx+si],al +00003A79 C3 ret +00003A7A E80100 call 0x3a7e +00003A7D 0000 add [bx+si],al +00003A7F C3 ret +00003A80 60 pusha +00003A81 80E601 and dh,0x1 +00003A84 8835 mov [di],dh +00003A86 58 pop ax +00003A87 37 aaa +00003A88 0100 add [bx+si],ax +00003A8A C0E602 shl dh,0x2 +00003A8D 8835 mov [di],dh +00003A8F 59 pop cx +00003A90 37 aaa +00003A91 0100 add [bx+si],ax +00003A93 C6055C mov byte [di],0x5c +00003A96 37 aaa +00003A97 0100 add [bx+si],ax +00003A99 0480 add al,0x80 +00003A9B FD std +00003A9C 51 push cx +00003A9D 0F834501 jnc near 0x3be6 +00003AA1 0000 add [bx+si],al +00003AA3 882D mov [di],ch +00003AA5 5A pop dx +00003AA6 37 aaa +00003AA7 0100 add [bx+si],ax +00003AA9 80F913 cmp cl,0x13 +00003AAC 0F833601 jnc near 0x3be6 +00003AB0 0000 add [bx+si],al +00003AB2 880D mov [di],cl +00003AB4 5B pop bx +00003AB5 37 aaa +00003AB6 0100 add [bx+si],ax +00003AB8 F60557 test byte [di],0x57 +00003ABB 37 aaa +00003ABC 0100 add [bx+si],ax +00003ABE 017505 add [di+0x5],si +00003AC1 E82AFE call 0x38ee +00003AC4 FF db 0xFF +00003AC5 FF66BA jmp near [bp-0x46] +00003AC8 F703B000 test word [bp+di],0xb0 +00003ACC EE out dx,al +00003ACD C6055C mov byte [di],0x5c +00003AD0 37 aaa +00003AD1 0100 add [bx+si],ax +00003AD3 8031C9 xor byte [bx+di],0xc9 +00003AD6 66B90300E8E5 mov ecx,0xe5e80003 +00003ADC FE db 0xFE +00003ADD FF db 0xFF +00003ADE FF7307 push word [bp+di+0x7] +00003AE1 E2F7 loop 0x3ada +00003AE3 E90001 jmp 0x3be6 +00003AE6 0000 add [bx+si],al +00003AE8 66BAF403ECA8 mov edx,0xa8ec03f4 +00003AEE 200F and [bx],cl +00003AF0 85F3 test bx,si +00003AF2 0000 add [bx+si],al +00003AF4 0080FB00 add [bx+si+0xfb],al +00003AF8 741C jz 0x3b16 +00003AFA B302 mov bl,0x2 +00003AFC BE0002 mov si,0x200 +00003AFF 0000 add [bx+si],al +00003B01 B90000 mov cx,0x0 +00003B04 0800 or [bx+si],al +00003B06 B701 mov bh,0x1 +00003B08 E8C1FB call 0x36cc +00003B0B FF db 0xFF +00003B0C FFB0C5E8 push word [bx+si+0xe8c5] +00003B10 F9 stc +00003B11 FD std +00003B12 FF db 0xFF +00003B13 FF db 0xFF +00003B14 EB1A jmp short 0x3b30 +00003B16 B302 mov bl,0x2 +00003B18 BE0002 mov si,0x200 +00003B1B 0000 add [bx+si],al +00003B1D B90000 mov cx,0x0 +00003B20 0800 or [bx+si],al +00003B22 B700 mov bh,0x0 +00003B24 E8A5FB call 0x36cc +00003B27 FF db 0xFF +00003B28 FFB0E6E8 push word [bx+si+0xe8e6] +00003B2C DD db 0xDD +00003B2D FD std +00003B2E FF db 0xFF +00003B2F FFA05937 jmp near [bx+si+0x3759] +00003B33 0100 add [bx+si],ax +00003B35 E8D3FD call 0x390b +00003B38 FF db 0xFF +00003B39 FFA05A37 jmp near [bx+si+0x375a] +00003B3D 0100 add [bx+si],ax +00003B3F E8C9FD call 0x390b +00003B42 FF db 0xFF +00003B43 FFA05837 jmp near [bx+si+0x3758] +00003B47 0100 add [bx+si],ax +00003B49 E8BFFD call 0x390b +00003B4C FF db 0xFF +00003B4D FFA05B37 jmp near [bx+si+0x375b] +00003B51 0100 add [bx+si],ax +00003B53 E8B5FD call 0x390b +00003B56 FF db 0xFF +00003B57 FFB002E8 push word [bx+si+0xe802] +00003B5B AE scasb +00003B5C FD std +00003B5D FF db 0xFF +00003B5E FFB012E8 push word [bx+si+0xe812] +00003B62 A7 cmpsw +00003B63 FD std +00003B64 FF db 0xFF +00003B65 FFB01BE8 push word [bx+si+0xe81b] +00003B69 A0FDFF mov al,[0xfffd] +00003B6C FFB0FFE8 push word [bx+si+0xe8ff] +00003B70 99 cwd +00003B71 FD std +00003B72 FF db 0xFF +00003B73 FF66C7 jmp near [bp-0x39] +00003B76 055537 add ax,0x3755 +00003B79 0100 add [bx+si],ax +00003B7B 0000 add [bx+si],al +00003B7D E837FD call 0x38b7 +00003B80 FF db 0xFF +00003B81 FF7264 push word [bp+si+0x64] +00003B84 E8B0FD call 0x3937 +00003B87 FF db 0xFF +00003B88 FFA25E37 jmp near [bp+si+0x375e] +00003B8C 0100 add [bx+si],ax +00003B8E E8A6FD call 0x3937 +00003B91 FF db 0xFF +00003B92 FFA25F37 jmp near [bp+si+0x375f] +00003B96 0100 add [bx+si],ax +00003B98 E89CFD call 0x3937 +00003B9B FF db 0xFF +00003B9C FFA26037 jmp near [bp+si+0x3760] +00003BA0 0100 add [bx+si],ax +00003BA2 E892FD call 0x3937 +00003BA5 FF db 0xFF +00003BA6 FFA26237 jmp near [bp+si+0x3762] +00003BAA 0100 add [bx+si],ax +00003BAC E888FD call 0x3937 +00003BAF FF db 0xFF +00003BB0 FFA26337 jmp near [bp+si+0x3763] +00003BB4 0100 add [bx+si],ax +00003BB6 E87EFD call 0x3937 +00003BB9 FF db 0xFF +00003BBA FFA26437 jmp near [bp+si+0x3764] +00003BBE 0100 add [bx+si],ax +00003BC0 E874FD call 0x3937 +00003BC3 FF db 0xFF +00003BC4 FFA26537 jmp near [bp+si+0x3765] +00003BC8 0100 add [bx+si],ax +00003BCA F6055E test byte [di],0x5e +00003BCD 37 aaa +00003BCE 0100 add [bx+si],ax +00003BD0 C0 db 0xC0 +00003BD1 7515 jnz 0x3be8 +00003BD3 C6055C mov byte [di],0x5c +00003BD6 37 aaa +00003BD7 0100 add [bx+si],ax +00003BD9 00618A add [bx+di-0x76],ah +00003BDC 255C37 and ax,0x375c +00003BDF 0100 add [bx+si],ax +00003BE1 A06437 mov al,[0x3764] +00003BE4 0100 add [bx+si],ax +00003BE6 F8 clc +00003BE7 C3 ret +00003BE8 61 popa +00003BE9 8A25 mov ah,[di] +00003BEB 5C pop sp +00003BEC 37 aaa +00003BED 0100 add [bx+si],ax +00003BEF F9 stc +00003BF0 C3 ret +00003BF1 0000 add [bx+si],al +00003BF3 0000 add [bx+si],al +00003BF5 1010 adc [bx+si],dl +00003BF7 1010 adc [bx+si],dl +00003BF9 1010 adc [bx+si],dl +00003BFB 1000 adc [bx+si],al +00003BFD 0000 add [bx+si],al +00003BFF 0000 add [bx+si],al +00003C01 0000 add [bx+si],al +00003C03 0000 add [bx+si],al +00003C05 0000 add [bx+si],al +00003C07 0010 add [bx+si],dl +00003C09 3205 xor al,[di] +00003C0B 3636050505 ss add ax,0x505 +00003C10 1010 adc [bx+si],dl +00003C12 1000 adc [bx+si],al +00003C14 0000 add [bx+si],al +00003C16 0000 add [bx+si],al +00003C18 0000 add [bx+si],al +00003C1A 0000 add [bx+si],al +00003C1C 3205 xor al,[di] +00003C1E 361F ss pop ds +00003C20 37 aaa +00003C21 36050505 ss add ax,0x505 +00003C25 050510 add ax,0x1005 +00003C28 1000 adc [bx+si],al +00003C2A 0000 add [bx+si],al +00003C2C 0000 add [bx+si],al +00003C2E 1010 adc [bx+si],dl +00003C30 1010 adc [bx+si],dl +00003C32 1010 adc [bx+si],dl +00003C34 1010 adc [bx+si],dl +00003C36 1032 adc [bp+si],dh +00003C38 050505 add ax,0x505 +00003C3B 050510 add ax,0x1005 +00003C3E 0000 add [bx+si],al +00003C40 0010 add [bx+si],dl +00003C42 1010 adc [bx+si],dl +00003C44 1010 adc [bx+si],dl +00003C46 1010 adc [bx+si],dl +00003C48 1010 adc [bx+si],dl +00003C4A 1010 adc [bx+si],dl +00003C4C 1010 adc [bx+si],dl +00003C4E 3205 xor al,[di] +00003C50 050510 add ax,0x1005 +00003C53 0000 add [bx+si],al +00003C55 0000 add [bx+si],al +00003C57 0000 add [bx+si],al +00003C59 0034 add [si],dh +00003C5B 1033 adc [bp+di],dh +00003C5D 1033 adc [bp+di],dh +00003C5F 3210 xor dl,[bx+si] +00003C61 1010 adc [bx+si],dl +00003C63 1032 adc [bp+si],dh +00003C65 3405 xor al,0x5 +00003C67 0000 add [bx+si],al +00003C69 0000 add [bx+si],al +00003C6B 3434 xor al,0x34 +00003C6D 3436 xor al,0x36 +00003C6F 1035 adc [di],dh +00003C71 1035 adc [di],dh +00003C73 353432 xor ax,0x3234 +00003C76 1032 adc [bp+si],dh +00003C78 3437 xor al,0x37 +00003C7A 3432 xor al,0x32 +00003C7C 0000 add [bx+si],al +00003C7E 3437 xor al,0x37 +00003C80 37 aaa +00003C81 37 aaa +00003C82 37 aaa +00003C83 37 aaa +00003C84 363636353210 ss xor ax,0x1032 +00003C8A 1034 adc [si],dh +00003C8C 36363432 ss xor al,0x32 +00003C90 0000 add [bx+si],al +00003C92 3234 xor dh,[si] +00003C94 3434 xor al,0x34 +00003C96 3434 xor al,0x34 +00003C98 3434 xor al,0x34 +00003C9A 10363632 adc [0x3236],dh +00003C9E 10363434 adc [0x3434],dh +00003CA2 3210 xor dl,[bx+si] +00003CA4 0000 add [bx+si],al +00003CA6 0010 add [bx+si],dl +00003CA8 1010 adc [bx+si],dl +00003CAA 1010 adc [bx+si],dl +00003CAC 1010 adc [bx+si],dl +00003CAE 1010 adc [bx+si],dl +00003CB0 363636361010 adc [ss:bx+si],dl +00003CB6 1000 adc [bx+si],al +00003CB8 0000 add [bx+si],al +00003CBA 0000 add [bx+si],al +00003CBC 0010 add [bx+si],dl +00003CBE 1010 adc [bx+si],dl +00003CC0 1010 adc [bx+si],dl +00003CC2 3234 xor dh,[si] +00003CC4 3434 xor al,0x34 +00003CC6 3432 xor al,0x32 +00003CC8 1010 adc [bx+si],dl +00003CCA 0000 add [bx+si],al +00003CCC 0000 add [bx+si],al +00003CCE 0000 add [bx+si],al +00003CD0 0000 add [bx+si],al +00003CD2 006B8B add [bp+di-0x75],ch +00003CD5 8B8B8B6B mov cx,[bp+di+0x6b8b] +00003CD9 3205 xor al,[di] +00003CDB 053200 add ax,0x32 +00003CDE 0000 add [bx+si],al +00003CE0 0000 add [bx+si],al +00003CE2 0000 add [bx+si],al +00003CE4 0000 add [bx+si],al +00003CE6 6A8C push byte -0x74 +00003CE8 8D8D8C8B lea cx,[di+0x8b8c] +00003CEC 8B6B05 mov bp,[bp+di+0x5] +00003CEF 050532 add ax,0x3205 +00003CF2 0000 add [bx+si],al +00003CF4 0000 add [bx+si],al +00003CF6 0000 add [bx+si],al +00003CF8 0010 add [bx+si],dl +00003CFA 8C8E8E8D mov [bp+0x8d8e],cs +00003CFE 8C8C8B6E mov [si+0x6e8b],cs +00003D02 1F pop ds +00003D03 1F pop ds +00003D04 6E outsb +00003D05 6B0000 imul ax,[bx+si],byte +0x0 +00003D08 0000 add [bx+si],al +00003D0A 0000 add [bx+si],al +00003D0C 0010 add [bx+si],dl +00003D0E 8C8D8E8C mov [di+0x8c8e],cs +00003D12 8B8B8B10 mov cx,[bp+di+0x108b] +00003D16 6E outsb +00003D17 1F pop ds +00003D18 6E outsb +00003D19 6B0000 imul ax,[bx+si],byte +0x0 +00003D1C 0000 add [bx+si],al +00003D1E 0000 add [bx+si],al +00003D20 0000 add [bx+si],al +00003D22 108B8B8B adc [bp+di+0x8b8b],cl +00003D26 8B8B8B10 mov cx,[bp+di+0x108b] +00003D2A 6D insw +00003D2B 6E outsb +00003D2C 6D insw +00003D2D 6B0000 imul ax,[bx+si],byte +0x0 +00003D30 0000 add [bx+si],al +00003D32 0000 add [bx+si],al +00003D34 0000 add [bx+si],al +00003D36 0010 add [bx+si],dl +00003D38 1010 adc [bx+si],dl +00003D3A 1010 adc [bx+si],dl +00003D3C 1032 adc [bp+si],dh +00003D3E 4B dec bx +00003D3F 4B dec bx +00003D40 3200 xor al,[bx+si] +00003D42 0000 add [bx+si],al +00003D44 0000 add [bx+si],al +00003D46 0000 add [bx+si],al +00003D48 0000 add [bx+si],al +00003D4A 104E4C adc [bp+0x4c],cl +00003D4D 324E4E xor cl,[bp+0x4e] +00003D50 4C dec sp +00003D51 4C dec sp +00003D52 4C dec sp +00003D53 4B dec bx +00003D54 1000 adc [bx+si],al +00003D56 0000 add [bx+si],al +00003D58 0000 add [bx+si],al +00003D5A 0000 add [bx+si],al +00003D5C 0000 add [bx+si],al +00003D5E 1032 adc [bp+si],dh +00003D60 3210 xor dl,[bx+si] +00003D62 4B dec bx +00003D63 4B dec bx +00003D64 3232 xor dh,[bp+si] +00003D66 3232 xor dh,[bp+si] +00003D68 1000 adc [bx+si],al +00003D6A 0000 add [bx+si],al +00003D6C 0000 add [bx+si],al +00003D6E 0000 add [bx+si],al +00003D70 0000 add [bx+si],al +00003D72 1010 adc [bx+si],dl +00003D74 1010 adc [bx+si],dl +00003D76 1010 adc [bx+si],dl +00003D78 1010 adc [bx+si],dl +00003D7A 1010 adc [bx+si],dl +00003D7C 1010 adc [bx+si],dl +00003D7E 1010 adc [bx+si],dl +00003D80 1000 adc [bx+si],al +00003D82 0010 add [bx+si],dl +00003D84 1010 adc [bx+si],dl +00003D86 292C sub [si],bp +00003D88 2B2C sub bp,[si] +00003D8A 2C2B sub al,0x2b +00003D8C 2B2D sub bp,[di] +00003D8E 2D2C2C sub ax,0x2c2c +00003D91 2B2C sub bp,[si] +00003D93 2C2C sub al,0x2c +00003D95 0010 add [bx+si],dl +00003D97 292A sub [bp+si],bp +00003D99 2A2C sub ch,[si] +00003D9B 2D2A2C sub ax,0x2c2a +00003D9E 2B2C sub bp,[si] +00003DA0 2D2B2C sub ax,0x2c2b +00003DA3 2C2D sub al,0x2d +00003DA5 2D2C2C sub ax,0x2c2c +00003DA8 2B10 sub dx,[bx+si] +00003DAA 292B sub [bp+di],bp +00003DAC 2A2B sub ch,[bp+di] +00003DAE 2B2B sub bp,[bp+di] +00003DB0 2C2B sub al,0x2b +00003DB2 2B2A sub bp,[bp+si] +00003DB4 2A2B sub ch,[bp+di] +00003DB6 2A2B sub ch,[bp+di] +00003DB8 2B2A sub bp,[bp+si] +00003DBA 2C2B sub al,0x2b +00003DBC 2A10 sub dl,[bx+si] +00003DBE 292A sub [bp+si],bp +00003DC0 2A2A sub ch,[bp+si] +00003DC2 2B2A sub bp,[bp+si] +00003DC4 2B2A sub bp,[bp+si] +00003DC6 2B2A sub bp,[bp+si] +00003DC8 2A2A sub ch,[bp+si] +00003DCA 2B2A sub bp,[bp+si] +00003DCC 2A2A sub ch,[bp+si] +00003DCE 2B2A sub bp,[bp+si] +00003DD0 2B10 sub dx,[bx+si] +00003DD2 2829 sub [bx+di],ch +00003DD4 2A2C sub ch,[si] +00003DD6 292B sub [bp+di],bp +00003DD8 2A29 sub ch,[bx+di] +00003DDA 2A2B sub ch,[bp+di] +00003DDC 2C2A sub al,0x2a +00003DDE 2A2A sub ch,[bp+si] +00003DE0 2A2A sub ch,[bp+si] +00003DE2 2A2A sub ch,[bp+si] +00003DE4 2810 sub [bx+si],dl +00003DE6 292A sub [bp+si],bp +00003DE8 2A2D sub ch,[di] +00003DEA 292A sub [bp+si],bp +00003DEC 292A sub [bp+si],bp +00003DEE 292A sub [bp+si],bp +00003DF0 2A29 sub ch,[bx+di] +00003DF2 2A2A sub ch,[bp+si] +00003DF4 2C2A sub al,0x2a +00003DF6 2829 sub [bx+di],ch +00003DF8 2A10 sub dl,[bx+si] +00003DFA 2829 sub [bx+di],ch +00003DFC 2A2B sub ch,[bp+di] +00003DFE 2A2A sub ch,[bp+si] +00003E00 282A sub [bp+si],ch +00003E02 1029 adc [bx+di],ch +00003E04 2A2A sub ch,[bp+si] +00003E06 2910 sub [bx+si],dx +00003E08 2B2A sub bp,[bp+si] +00003E0A 1029 adc [bx+di],ch +00003E0C 2810 sub [bx+si],dl +00003E0E 2929 sub [bx+di],bp +00003E10 2B2A sub bp,[bp+si] +00003E12 292B sub [bp+di],bp +00003E14 292B sub [bp+di],bp +00003E16 1028 adc [bx+si],ch +00003E18 2910 sub [bx+si],dx +00003E1A 2B10 sub dx,[bx+si] +00003E1C 2928 sub [bx+si],bp +00003E1E 2A28 sub ch,[bx+si] +00003E20 2B00 sub ax,[bx+si] +00003E22 282A sub [bp+si],ch +00003E24 2910 sub [bx+si],dx +00003E26 102A adc [bp+si],ch +00003E28 1010 adc [bx+si],dl +00003E2A 41 inc cx +00003E2B 1010 adc [bx+si],dl +00003E2D 41 inc cx +00003E2E 1028 adc [bx+si],ch +00003E30 1029 adc [bx+di],ch +00003E32 2B29 sub bp,[bx+di] +00003E34 2800 sub [bx+si],al +00003E36 1028 adc [bx+si],ch +00003E38 1010 adc [bx+si],dl +00003E3A 41 inc cx +00003E3B 104150 adc [bx+di+0x50],al +00003E3E 50 push ax +00003E3F 41 inc cx +00003E40 50 push ax +00003E41 50 push ax +00003E42 41 inc cx +00003E43 104110 adc [bx+di+0x10],al +00003E46 2928 sub [bx+si],bp +00003E48 41 inc cx +00003E49 0000 add [bx+si],al +00003E4B 1010 adc [bx+si],dl +00003E4D 41 inc cx +00003E4E 105050 adc [bx+si+0x50],dl +00003E51 51 push cx +00003E52 51 push cx +00003E53 51 push cx +00003E54 52 push dx +00003E55 50 push ax +00003E56 50 push ax +00003E57 51 push cx +00003E58 51 push cx +00003E59 41 inc cx +00003E5A 41 inc cx +00003E5B 105000 adc [bx+si+0x0],dl +00003E5E 0010 add [bx+si],dl +00003E60 41 inc cx +00003E61 50 push ax +00003E62 41 inc cx +00003E63 51 push cx +00003E64 52 push dx +00003E65 52 push dx +00003E66 52 push dx +00003E67 52 push dx +00003E68 53 push bx +00003E69 53 push bx +00003E6A 53 push bx +00003E6B 54 push sp +00003E6C 53 push bx +00003E6D 52 push dx +00003E6E 50 push ax +00003E6F 50 push ax +00003E70 51 push cx +00003E71 0000 add [bx+si],al +00003E73 104141 adc [bx+di+0x41],al +00003E76 51 push cx +00003E77 52 push dx +00003E78 53 push bx +00003E79 54 push sp +00003E7A 53 push bx +00003E7B 53 push bx +00003E7C 54 push sp +00003E7D 55 push bp +00003E7E 55 push bp +00003E7F 55 push bp +00003E80 54 push sp +00003E81 54 push sp +00003E82 52 push dx +00003E83 52 push dx +00003E84 54 push sp +00003E85 1010 adc [bx+si],dl +00003E87 1010 adc [bx+si],dl +00003E89 1010 adc [bx+si],dl +00003E8B 1010 adc [bx+si],dl +00003E8D 1010 adc [bx+si],dl +00003E8F 1010 adc [bx+si],dl +00003E91 1010 adc [bx+si],dl +00003E93 1010 adc [bx+si],dl +00003E95 1010 adc [bx+si],dl +00003E97 1010 adc [bx+si],dl +00003E99 2C2B sub al,0x2b +00003E9B 2C2C sub al,0x2c +00003E9D 2D2D2D sub ax,0x2d2d +00003EA0 2C2D sub al,0x2d +00003EA2 2B2B sub bp,[bp+di] +00003EA4 2C2D sub al,0x2d +00003EA6 2C2D sub al,0x2d +00003EA8 2B2C sub bp,[si] +00003EAA 2B2C sub bp,[si] +00003EAC 2D2B2D sub ax,0x2d2b +00003EAF 2C2C sub al,0x2c +00003EB1 2B2A sub bp,[bp+si] +00003EB3 2C2A sub al,0x2a +00003EB5 2C2D sub al,0x2d +00003EB7 2C2C sub al,0x2c +00003EB9 2B2C sub bp,[si] +00003EBB 2A2C sub ch,[si] +00003EBD 2D2D2B sub ax,0x2b2d +00003EC0 2B2A sub bp,[bp+si] +00003EC2 2B2C sub bp,[si] +00003EC4 2B2A sub bp,[bp+si] +00003EC6 2C2A sub al,0x2a +00003EC8 2B2B sub bp,[bp+di] +00003ECA 2B2A sub bp,[bp+si] +00003ECC 2A2B sub ch,[bp+di] +00003ECE 2A2B sub ch,[bp+di] +00003ED0 2B2A sub bp,[bp+si] +00003ED2 2C2B sub al,0x2b +00003ED4 2A2A sub ch,[bp+si] +00003ED6 2A2A sub ch,[bp+si] +00003ED8 2B2A sub bp,[bp+si] +00003EDA 2A2A sub ch,[bp+si] +00003EDC 2A2A sub ch,[bp+si] +00003EDE 2B2A sub bp,[bp+si] +00003EE0 2A2A sub ch,[bp+si] +00003EE2 2B2A sub bp,[bp+si] +00003EE4 2A2A sub ch,[bp+si] +00003EE6 2B2A sub bp,[bp+si] +00003EE8 2B2A sub bp,[bp+si] +00003EEA 2B2A sub bp,[bp+si] +00003EEC 2A2A sub ch,[bp+si] +00003EEE 292B sub [bp+di],bp +00003EF0 2A29 sub ch,[bx+di] +00003EF2 2A2A sub ch,[bp+si] +00003EF4 2B2A sub bp,[bp+si] +00003EF6 2A2A sub ch,[bp+si] +00003EF8 2A2A sub ch,[bp+si] +00003EFA 2A2A sub ch,[bp+si] +00003EFC 282A sub [bp+si],ch +00003EFE 2928 sub [bx+si],bp +00003F00 292A sub [bp+si],bp +00003F02 292A sub [bp+si],bp +00003F04 292A sub [bp+si],bp +00003F06 292A sub [bp+si],bp +00003F08 2A29 sub ch,[bx+di] +00003F0A 2A2A sub ch,[bp+si] +00003F0C 2B2A sub bp,[bp+si] +00003F0E 2829 sub [bx+di],ch +00003F10 2A29 sub ch,[bx+di] +00003F12 2928 sub [bx+si],bp +00003F14 2A29 sub ch,[bx+di] +00003F16 292A sub [bp+si],bp +00003F18 282A sub [bp+si],ch +00003F1A 1029 adc [bx+di],ch +00003F1C 2A2A sub ch,[bp+si] +00003F1E 2910 sub [bx+si],dx +00003F20 2B2A sub bp,[bp+si] +00003F22 1029 adc [bx+di],ch +00003F24 282A sub [bp+si],ch +00003F26 282A sub [bp+si],ch +00003F28 2B10 sub dx,[bx+si] +00003F2A 292B sub [bp+di],bp +00003F2C 292B sub [bp+di],bp +00003F2E 1028 adc [bx+si],ch +00003F30 2910 sub [bx+si],dx +00003F32 2B10 sub dx,[bx+si] +00003F34 2928 sub [bx+si],bp +00003F36 2A28 sub ch,[bx+si] +00003F38 2B28 sub bp,[bx+si] +00003F3A 292A sub [bp+si],bp +00003F3C 2B10 sub dx,[bx+si] +00003F3E 102A adc [bp+si],ch +00003F40 1010 adc [bx+si],dl +00003F42 41 inc cx +00003F43 1010 adc [bx+si],dl +00003F45 41 inc cx +00003F46 1028 adc [bx+si],ch +00003F48 1029 adc [bx+di],ch +00003F4A 2B29 sub bp,[bx+di] +00003F4C 284110 sub [bx+di+0x10],al +00003F4F 2810 sub [bx+si],dl +00003F51 104110 adc [bx+di+0x10],al +00003F54 41 inc cx +00003F55 50 push ax +00003F56 50 push ax +00003F57 41 inc cx +00003F58 50 push ax +00003F59 50 push ax +00003F5A 41 inc cx +00003F5B 104110 adc [bx+di+0x10],al +00003F5E 2928 sub [bx+si],bp +00003F60 41 inc cx +00003F61 50 push ax +00003F62 41 inc cx +00003F63 104141 adc [bx+di+0x41],al +00003F66 50 push ax +00003F67 51 push cx +00003F68 50 push ax +00003F69 51 push cx +00003F6A 51 push cx +00003F6B 51 push cx +00003F6C 52 push dx +00003F6D 50 push ax +00003F6E 50 push ax +00003F6F 51 push cx +00003F70 51 push cx +00003F71 41 inc cx +00003F72 41 inc cx +00003F73 105051 adc [bx+si+0x51],dl +00003F76 51 push cx +00003F77 50 push ax +00003F78 50 push ax +00003F79 51 push cx +00003F7A 51 push cx +00003F7B 52 push dx +00003F7C 51 push cx +00003F7D 52 push dx +00003F7E 52 push dx +00003F7F 52 push dx +00003F80 53 push bx +00003F81 53 push bx +00003F82 53 push bx +00003F83 54 push sp +00003F84 53 push bx +00003F85 52 push dx +00003F86 50 push ax +00003F87 50 push ax +00003F88 51 push cx +00003F89 53 push bx +00003F8A 52 push dx +00003F8B 51 push cx +00003F8C 51 push cx +00003F8D 53 push bx +00003F8E 53 push bx +00003F8F 52 push dx +00003F90 53 push bx +00003F91 54 push sp +00003F92 53 push bx +00003F93 53 push bx +00003F94 54 push sp +00003F95 55 push bp +00003F96 55 push bp +00003F97 55 push bp +00003F98 54 push sp +00003F99 54 push sp +00003F9A 52 push dx +00003F9B 52 push dx +00003F9C 54 push sp +00003F9D 1010 adc [bx+si],dl +00003F9F 1031 adc [bx+di],dh +00003FA1 51 push cx +00003FA2 51 push cx +00003FA3 52 push dx +00003FA4 52 push dx +00003FA5 54 push sp +00003FA6 54 push sp +00003FA7 54 push sp +00003FA8 54 push sp +00003FA9 54 push sp +00003FAA 54 push sp +00003FAB 55 push bp +00003FAC 55 push bp +00003FAD 54 push sp +00003FAE 54 push sp +00003FAF 54 push sp +00003FB0 54 push sp +00003FB1 2C2C sub al,0x2c +00003FB3 292A sub [bp+si],bp +00003FB5 3110 xor [bx+si],dx +00003FB7 51 push cx +00003FB8 52 push dx +00003FB9 52 push dx +00003FBA 55 push bp +00003FBB 53 push bx +00003FBC 54 push sp +00003FBD 54 push sp +00003FBE 54 push sp +00003FBF 54 push sp +00003FC0 54 push sp +00003FC1 54 push sp +00003FC2 54 push sp +00003FC3 54 push sp +00003FC4 55 push bp +00003FC5 2B2D sub bp,[di] +00003FC7 2D292B sub ax,0x2b29 +00003FCA 2A31 sub dh,[bx+di] +00003FCC 285352 sub [bp+di+0x52],dl +00003FCF 52 push dx +00003FD0 54 push sp +00003FD1 54 push sp +00003FD2 54 push sp +00003FD3 55 push bp +00003FD4 54 push sp +00003FD5 54 push sp +00003FD6 54 push sp +00003FD7 54 push sp +00003FD8 54 push sp +00003FD9 2A2B sub ch,[bp+di] +00003FDB 2B2A sub bp,[bp+si] +00003FDD 2D2C2B sub ax,0x2b2c +00003FE0 2A4252 sub al,[bp+si+0x52] +00003FE3 54 push sp +00003FE4 55 push bp +00003FE5 54 push sp +00003FE6 54 push sp +00003FE7 54 push sp +00003FE8 54 push sp +00003FE9 55 push bp +00003FEA 54 push sp +00003FEB 54 push sp +00003FEC 54 push sp +00003FED 2A2B sub ch,[bp+di] +00003FEF 2C2B sub al,0x2b +00003FF1 2B2B sub bp,[bp+di] +00003FF3 2A2B sub ch,[bp+di] +00003FF5 2828 sub [bx+si],ch +00003FF7 52 push dx +00003FF8 52 push dx +00003FF9 54 push sp +00003FFA 54 push sp +00003FFB 54 push sp +00003FFC 54 push sp +00003FFD 54 push sp +00003FFE 54 push sp +00003FFF 54 push sp +00004000 54 push sp +00004001 2A2A sub ch,[bp+si] +00004003 2B2B sub bp,[bp+di] +00004005 2A2D sub ch,[di] +00004007 2B2A sub bp,[bp+si] +00004009 2B28 sub bp,[bx+si] +0000400B 285353 sub [bp+di+0x53],dl +0000400E 54 push sp +0000400F 54 push sp +00004010 54 push sp +00004011 54 push sp +00004012 55 push bp +00004013 55 push bp +00004014 54 push sp +00004015 2B2A sub bp,[bp+si] +00004017 2B2A sub bp,[bp+si] +00004019 2A2B sub ch,[bp+di] +0000401B 2A28 sub ch,[bx+si] +0000401D 292A sub [bp+si],bp +0000401F 104153 adc [bx+di+0x53],al +00004022 53 push bx +00004023 54 push sp +00004024 54 push sp +00004025 55 push bp +00004026 55 push bp +00004027 55 push bp +00004028 55 push bp +00004029 2C28 sub al,0x28 +0000402B 292A sub [bp+si],bp +0000402D 2A2A sub ch,[bp+si] +0000402F 2B29 sub bp,[bx+di] +00004031 2810 sub [bx+si],dl +00004033 42 inc dx +00004034 53 push bx +00004035 53 push bx +00004036 54 push sp +00004037 55 push bp +00004038 54 push sp +00004039 55 push bp +0000403A 55 push bp +0000403B 55 push bp +0000403C 55 push bp +0000403D 2829 sub [bx+di],ch +0000403F 2828 sub [bx+si],ch +00004041 1028 adc [bx+si],ch +00004043 2A28 sub ch,[bx+si] +00004045 51 push cx +00004046 42 inc dx +00004047 53 push bx +00004048 52 push dx +00004049 54 push sp +0000404A 54 push sp +0000404B 54 push sp +0000404C 54 push sp +0000404D 54 push sp +0000404E 55 push bp +0000404F 54 push sp +00004050 54 push sp +00004051 2829 sub [bx+di],ch +00004053 41 inc cx +00004054 41 inc cx +00004055 51 push cx +00004056 1028 adc [bx+si],ch +00004058 41 inc cx +00004059 42 inc dx +0000405A 52 push dx +0000405B 51 push cx +0000405C 54 push sp +0000405D 54 push sp +0000405E 54 push sp +0000405F 54 push sp +00004060 54 push sp +00004061 54 push sp +00004062 54 push sp +00004063 54 push sp +00004064 54 push sp +00004065 41 inc cx +00004066 104151 adc [bx+di+0x51],al +00004069 41 inc cx +0000406A 51 push cx +0000406B 42 inc dx +0000406C 53 push bx +0000406D 53 push bx +0000406E 54 push sp +0000406F 53 push bx +00004070 55 push bp +00004071 54 push sp +00004072 54 push sp +00004073 54 push sp +00004074 54 push sp +00004075 54 push sp +00004076 55 push bp +00004077 54 push sp +00004078 54 push sp +00004079 51 push cx +0000407A 41 inc cx +0000407B 53 push bx +0000407C 41 inc cx +0000407D 52 push dx +0000407E 52 push dx +0000407F 53 push bx +00004080 54 push sp +00004081 53 push bx +00004082 53 push bx +00004083 54 push sp +00004084 54 push sp +00004085 54 push sp +00004086 54 push sp +00004087 55 push bp +00004088 55 push bp +00004089 54 push sp +0000408A 54 push sp +0000408B 54 push sp +0000408C 54 push sp +0000408D 52 push dx +0000408E 52 push dx +0000408F 52 push dx +00004090 53 push bx +00004091 55 push bp +00004092 53 push bx +00004093 53 push bx +00004094 54 push sp +00004095 54 push sp +00004096 54 push sp +00004097 54 push sp +00004098 54 push sp +00004099 54 push sp +0000409A 55 push bp +0000409B 55 push bp +0000409C 55 push bp +0000409D 55 push bp +0000409E 54 push sp +0000409F 54 push sp +000040A0 54 push sp +000040A1 54 push sp +000040A2 53 push bx +000040A3 55 push bp +000040A4 54 push sp +000040A5 53 push bx +000040A6 53 push bx +000040A7 54 push sp +000040A8 54 push sp +000040A9 55 push bp +000040AA 54 push sp +000040AB 54 push sp +000040AC 54 push sp +000040AD 54 push sp +000040AE 55 push bp +000040AF 55 push bp +000040B0 55 push bp +000040B1 55 push bp +000040B2 54 push sp +000040B3 54 push sp +000040B4 55 push bp +000040B5 0000 add [bx+si],al +000040B7 104151 adc [bx+di+0x51],al +000040BA 52 push dx +000040BB 52 push dx +000040BC 54 push sp +000040BD 54 push sp +000040BE 54 push sp +000040BF 54 push sp +000040C0 54 push sp +000040C1 54 push sp +000040C2 54 push sp +000040C3 55 push bp +000040C4 55 push bp +000040C5 54 push sp +000040C6 54 push sp +000040C7 54 push sp +000040C8 54 push sp +000040C9 0000 add [bx+si],al +000040CB 105051 adc [bx+si+0x51],dl +000040CE 53 push bx +000040CF 54 push sp +000040D0 55 push bp +000040D1 54 push sp +000040D2 53 push bx +000040D3 54 push sp +000040D4 55 push bp +000040D5 54 push sp +000040D6 54 push sp +000040D7 54 push sp +000040D8 54 push sp +000040D9 54 push sp +000040DA 54 push sp +000040DB 54 push sp +000040DC 55 push bp +000040DD 0000 add [bx+si],al +000040DF 105041 adc [bx+si+0x41],dl +000040E2 52 push dx +000040E3 54 push sp +000040E4 54 push sp +000040E5 55 push bp +000040E6 54 push sp +000040E7 53 push bx +000040E8 54 push sp +000040E9 55 push bp +000040EA 54 push sp +000040EB 55 push bp +000040EC 54 push sp +000040ED 54 push sp +000040EE 54 push sp +000040EF 54 push sp +000040F0 54 push sp +000040F1 0000 add [bx+si],al +000040F3 104152 adc [bx+di+0x52],al +000040F6 52 push dx +000040F7 54 push sp +000040F8 53 push bx +000040F9 54 push sp +000040FA 54 push sp +000040FB 54 push sp +000040FC 54 push sp +000040FD 55 push bp +000040FE 54 push sp +000040FF 54 push sp +00004100 54 push sp +00004101 55 push bp +00004102 54 push sp +00004103 54 push sp +00004104 54 push sp +00004105 0000 add [bx+si],al +00004107 105051 adc [bx+si+0x51],dl +0000410A 52 push dx +0000410B 52 push dx +0000410C 54 push sp +0000410D 53 push bx +0000410E 53 push bx +0000410F 54 push sp +00004110 54 push sp +00004111 54 push sp +00004112 54 push sp +00004113 54 push sp +00004114 54 push sp +00004115 54 push sp +00004116 54 push sp +00004117 54 push sp +00004118 54 push sp +00004119 0000 add [bx+si],al +0000411B 104151 adc [bx+di+0x51],al +0000411E 41 inc cx +0000411F 54 push sp +00004120 53 push bx +00004121 54 push sp +00004122 54 push sp +00004123 54 push sp +00004124 55 push bp +00004125 54 push sp +00004126 54 push sp +00004127 54 push sp +00004128 54 push sp +00004129 55 push bp +0000412A 55 push bp +0000412B 54 push sp +0000412C 54 push sp +0000412D 0000 add [bx+si],al +0000412F 104151 adc [bx+di+0x51],al +00004132 52 push dx +00004133 52 push dx +00004134 53 push bx +00004135 54 push sp +00004136 55 push bp +00004137 54 push sp +00004138 54 push sp +00004139 54 push sp +0000413A 54 push sp +0000413B 54 push sp +0000413C 55 push bp +0000413D 55 push bp +0000413E 55 push bp +0000413F 55 push bp +00004140 54 push sp +00004141 0000 add [bx+si],al +00004143 104150 adc [bx+di+0x50],al +00004146 51 push cx +00004147 53 push bx +00004148 54 push sp +00004149 54 push sp +0000414A 55 push bp +0000414B 55 push bp +0000414C 54 push sp +0000414D 55 push bp +0000414E 54 push sp +0000414F 54 push sp +00004150 55 push bp +00004151 55 push bp +00004152 55 push bp +00004153 55 push bp +00004154 54 push sp +00004155 0000 add [bx+si],al +00004157 104150 adc [bx+di+0x50],al +0000415A 51 push cx +0000415B 53 push bx +0000415C 54 push sp +0000415D 54 push sp +0000415E 54 push sp +0000415F 55 push bp +00004160 54 push sp +00004161 54 push sp +00004162 54 push sp +00004163 54 push sp +00004164 54 push sp +00004165 55 push bp +00004166 55 push bp +00004167 54 push sp +00004168 54 push sp +00004169 0000 add [bx+si],al +0000416B 104150 adc [bx+di+0x50],al +0000416E 52 push dx +0000416F 52 push dx +00004170 53 push bx +00004171 54 push sp +00004172 55 push bp +00004173 54 push sp +00004174 54 push sp +00004175 54 push sp +00004176 54 push sp +00004177 54 push sp +00004178 54 push sp +00004179 54 push sp +0000417A 54 push sp +0000417B 54 push sp +0000417C 54 push sp +0000417D 0000 add [bx+si],al +0000417F 105051 adc [bx+si+0x51],dl +00004182 52 push dx +00004183 50 push ax +00004184 52 push dx +00004185 53 push bx +00004186 54 push sp +00004187 54 push sp +00004188 54 push sp +00004189 54 push sp +0000418A 54 push sp +0000418B 54 push sp +0000418C 54 push sp +0000418D 54 push sp +0000418E 55 push bp +0000418F 54 push sp +00004190 54 push sp +00004191 0000 add [bx+si],al +00004193 104152 adc [bx+di+0x52],al +00004196 52 push dx +00004197 52 push dx +00004198 55 push bp +00004199 55 push bp +0000419A 54 push sp +0000419B 54 push sp +0000419C 54 push sp +0000419D 54 push sp +0000419E 54 push sp +0000419F 55 push bp +000041A0 55 push bp +000041A1 54 push sp +000041A2 54 push sp +000041A3 54 push sp +000041A4 54 push sp +000041A5 0000 add [bx+si],al +000041A7 104150 adc [bx+di+0x50],al +000041AA 52 push dx +000041AB 52 push dx +000041AC 53 push bx +000041AD 54 push sp +000041AE 54 push sp +000041AF 54 push sp +000041B0 54 push sp +000041B1 54 push sp +000041B2 55 push bp +000041B3 55 push bp +000041B4 55 push bp +000041B5 55 push bp +000041B6 54 push sp +000041B7 54 push sp +000041B8 54 push sp +000041B9 0000 add [bx+si],al +000041BB 105052 adc [bx+si+0x52],dl +000041BE 52 push dx +000041BF 54 push sp +000041C0 53 push bx +000041C1 54 push sp +000041C2 54 push sp +000041C3 55 push bp +000041C4 54 push sp +000041C5 54 push sp +000041C6 55 push bp +000041C7 55 push bp +000041C8 55 push bp +000041C9 55 push bp +000041CA 54 push sp +000041CB 54 push sp +000041CC 55 push bp +000041CD 54 push sp +000041CE 54 push sp +000041CF 54 push sp +000041D0 54 push sp +000041D1 54 push sp +000041D2 54 push sp +000041D3 54 push sp +000041D4 54 push sp +000041D5 54 push sp +000041D6 54 push sp +000041D7 54 push sp +000041D8 54 push sp +000041D9 54 push sp +000041DA 54 push sp +000041DB 55 push bp +000041DC 55 push bp +000041DD 54 push sp +000041DE 54 push sp +000041DF 54 push sp +000041E0 54 push sp +000041E1 54 push sp +000041E2 54 push sp +000041E3 55 push bp +000041E4 55 push bp +000041E5 54 push sp +000041E6 54 push sp +000041E7 54 push sp +000041E8 54 push sp +000041E9 54 push sp +000041EA 55 push bp +000041EB 54 push sp +000041EC 54 push sp +000041ED 54 push sp +000041EE 54 push sp +000041EF 54 push sp +000041F0 54 push sp +000041F1 54 push sp +000041F2 54 push sp +000041F3 54 push sp +000041F4 55 push bp +000041F5 54 push sp +000041F6 55 push bp +000041F7 55 push bp +000041F8 55 push bp +000041F9 55 push bp +000041FA 54 push sp +000041FB 55 push bp +000041FC 54 push sp +000041FD 54 push sp +000041FE 54 push sp +000041FF 55 push bp +00004200 55 push bp +00004201 54 push sp +00004202 54 push sp +00004203 55 push bp +00004204 54 push sp +00004205 54 push sp +00004206 54 push sp +00004207 54 push sp +00004208 54 push sp +00004209 54 push sp +0000420A 55 push bp +0000420B 55 push bp +0000420C 55 push bp +0000420D 55 push bp +0000420E 54 push sp +0000420F 54 push sp +00004210 54 push sp +00004211 54 push sp +00004212 54 push sp +00004213 55 push bp +00004214 55 push bp +00004215 54 push sp +00004216 54 push sp +00004217 54 push sp +00004218 54 push sp +00004219 55 push bp +0000421A 54 push sp +0000421B 54 push sp +0000421C 54 push sp +0000421D 54 push sp +0000421E 54 push sp +0000421F 55 push bp +00004220 55 push bp +00004221 54 push sp +00004222 54 push sp +00004223 54 push sp +00004224 54 push sp +00004225 54 push sp +00004226 54 push sp +00004227 54 push sp +00004228 54 push sp +00004229 54 push sp +0000422A 54 push sp +0000422B 54 push sp +0000422C 54 push sp +0000422D 54 push sp +0000422E 54 push sp +0000422F 54 push sp +00004230 54 push sp +00004231 54 push sp +00004232 54 push sp +00004233 54 push sp +00004234 54 push sp +00004235 54 push sp +00004236 54 push sp +00004237 54 push sp +00004238 54 push sp +00004239 54 push sp +0000423A 55 push bp +0000423B 54 push sp +0000423C 54 push sp +0000423D 54 push sp +0000423E 55 push bp +0000423F 54 push sp +00004240 54 push sp +00004241 55 push bp +00004242 55 push bp +00004243 54 push sp +00004244 54 push sp +00004245 54 push sp +00004246 54 push sp +00004247 54 push sp +00004248 54 push sp +00004249 54 push sp +0000424A 54 push sp +0000424B 55 push bp +0000424C 55 push bp +0000424D 54 push sp +0000424E 54 push sp +0000424F 54 push sp +00004250 54 push sp +00004251 54 push sp +00004252 54 push sp +00004253 54 push sp +00004254 55 push bp +00004255 55 push bp +00004256 55 push bp +00004257 55 push bp +00004258 54 push sp +00004259 54 push sp +0000425A 54 push sp +0000425B 54 push sp +0000425C 54 push sp +0000425D 54 push sp +0000425E 55 push bp +0000425F 55 push bp +00004260 55 push bp +00004261 55 push bp +00004262 54 push sp +00004263 55 push bp +00004264 54 push sp +00004265 54 push sp +00004266 54 push sp +00004267 54 push sp +00004268 55 push bp +00004269 55 push bp +0000426A 55 push bp +0000426B 55 push bp +0000426C 54 push sp +0000426D 54 push sp +0000426E 54 push sp +0000426F 55 push bp +00004270 54 push sp +00004271 54 push sp +00004272 55 push bp +00004273 55 push bp +00004274 55 push bp +00004275 55 push bp +00004276 54 push sp +00004277 54 push sp +00004278 54 push sp +00004279 54 push sp +0000427A 54 push sp +0000427B 54 push sp +0000427C 54 push sp +0000427D 55 push bp +0000427E 55 push bp +0000427F 54 push sp +00004280 54 push sp +00004281 54 push sp +00004282 54 push sp +00004283 54 push sp +00004284 54 push sp +00004285 54 push sp +00004286 54 push sp +00004287 55 push bp +00004288 55 push bp +00004289 54 push sp +0000428A 54 push sp +0000428B 54 push sp +0000428C 54 push sp +0000428D 54 push sp +0000428E 54 push sp +0000428F 54 push sp +00004290 54 push sp +00004291 54 push sp +00004292 54 push sp +00004293 54 push sp +00004294 54 push sp +00004295 54 push sp +00004296 55 push bp +00004297 54 push sp +00004298 54 push sp +00004299 54 push sp +0000429A 54 push sp +0000429B 54 push sp +0000429C 54 push sp +0000429D 54 push sp +0000429E 54 push sp +0000429F 54 push sp +000042A0 55 push bp +000042A1 54 push sp +000042A2 54 push sp +000042A3 54 push sp +000042A4 54 push sp +000042A5 54 push sp +000042A6 55 push bp +000042A7 54 push sp +000042A8 54 push sp +000042A9 54 push sp +000042AA 55 push bp +000042AB 55 push bp +000042AC 54 push sp +000042AD 54 push sp +000042AE 54 push sp +000042AF 55 push bp +000042B0 54 push sp +000042B1 54 push sp +000042B2 54 push sp +000042B3 54 push sp +000042B4 54 push sp +000042B5 54 push sp +000042B6 54 push sp +000042B7 55 push bp +000042B8 55 push bp +000042B9 54 push sp +000042BA 54 push sp +000042BB 54 push sp +000042BC 54 push sp +000042BD 54 push sp +000042BE 54 push sp +000042BF 54 push sp +000042C0 54 push sp +000042C1 55 push bp +000042C2 54 push sp +000042C3 54 push sp +000042C4 54 push sp +000042C5 54 push sp +000042C6 54 push sp +000042C7 54 push sp +000042C8 54 push sp +000042C9 54 push sp +000042CA 55 push bp +000042CB 55 push bp +000042CC 55 push bp +000042CD 55 push bp +000042CE 54 push sp +000042CF 54 push sp +000042D0 54 push sp +000042D1 54 push sp +000042D2 54 push sp +000042D3 55 push bp +000042D4 54 push sp +000042D5 54 push sp +000042D6 54 push sp +000042D7 54 push sp +000042D8 54 push sp +000042D9 55 push bp +000042DA 54 push sp +000042DB 54 push sp +000042DC 54 push sp +000042DD 54 push sp +000042DE 55 push bp +000042DF 55 push bp +000042E0 55 push bp +000042E1 55 push bp +000042E2 54 push sp +000042E3 54 push sp +000042E4 55 push bp +000042E5 66BA120066B8 mov edx,0xb8660012 +000042EB DC34 fdiv qword [si] +000042ED 66F7F3 div ebx +000042F0 88C3 mov bl,al +000042F2 B0B6 mov al,0xb6 +000042F4 E643 out 0x43,al +000042F6 88D8 mov al,bl +000042F8 E642 out 0x42,al +000042FA 88E0 mov al,ah +000042FC E642 out 0x42,al +000042FE E461 in al,0x61 +00004300 0C03 or al,0x3 +00004302 E661 out 0x61,al +00004304 C3 ret +00004305 6650 push eax +00004307 E461 in al,0x61 +00004309 24FC and al,0xfc +0000430B E661 out 0x61,al +0000430D 6658 pop eax +0000430F C3 ret +00004310 50 push ax +00004311 51 push cx +00004312 E461 in al,0x61 +00004314 0C03 or al,0x3 +00004316 E661 out 0x61,al +00004318 B93200 mov cx,0x32 +0000431B 0000 add [bx+si],al +0000431D E863EF call 0x3283 +00004320 FF db 0xFF +00004321 FF db 0xFF +00004322 E8DEFF call 0x4303 +00004325 FF db 0xFF +00004326 FF5958 call far [bx+di+0x58] +00004329 C3 ret +0000432A 0000 add [bx+si],al +0000432C 0000 add [bx+si],al +0000432E 0000 add [bx+si],al +00004330 0000 add [bx+si],al +00004332 0000 add [bx+si],al +00004334 0000 add [bx+si],al +00004336 0000 add [bx+si],al +00004338 0000 add [bx+si],al +0000433A 51 push cx +0000433B 891D mov [di],bx +0000433D 2A4301 sub al,[bp+di+0x1] +00004340 0029 add [bx+di],ch +00004342 D9 db 0xD9 +00004343 890D mov [di],cx +00004345 324301 xor al,[bp+di+0x1] +00004348 00C7 add bh,al +0000434A 052E43 add ax,0x432e +0000434D 0100 add [bx+si],ax +0000434F 0000 add [bx+si],al +00004351 0000 add [bx+si],al +00004353 C7053643 mov word [di],0x4336 +00004357 0100 add [bx+si],ax +00004359 0000 add [bx+si],al +0000435B 0000 add [bx+si],al +0000435D 8B0D mov cx,[di] +0000435F 2E43 cs inc bx +00004361 0100 add [bx+si],ax +00004363 890B mov [bp+di],cx +00004365 8B0D mov cx,[di] +00004367 324301 xor al,[bp+di+0x1] +0000436A 00894B04 add [bx+di+0x44b],cl +0000436E 8B0D mov cx,[di] +00004370 3643 ss inc bx +00004372 0100 add [bx+si],ax +00004374 894B08 mov [bp+di+0x8],cx +00004377 59 pop cx +00004378 C3 ret +00004379 51 push cx +0000437A 52 push dx +0000437B A12A43 mov ax,[0x432a] +0000437E 0100 add [bx+si],ax +00004380 8B08 mov cx,[bx+si] +00004382 890D mov [di],cx +00004384 2E43 cs inc bx +00004386 0100 add [bx+si],ax +00004388 8B4804 mov cx,[bx+si+0x4] +0000438B 890D mov [di],cx +0000438D 324301 xor al,[bp+di+0x1] +00004390 008B4808 add [bp+di+0x848],cl +00004394 890D mov [di],cx +00004396 3643 ss inc bx +00004398 0100 add [bx+si],ax +0000439A 391D cmp [di],bx +0000439C 324301 xor al,[bp+di+0x1] +0000439F 007317 add [bp+di+0x17],dh +000043A2 833D36 cmp word [di],byte +0x36 +000043A5 43 inc bx +000043A6 0100 add [bx+si],ax +000043A8 007407 add [si+0x7],dh +000043AB A13643 mov ax,[0x4336] +000043AE 0100 add [bx+si],ax +000043B0 EBCE jmp short 0x4380 +000043B2 31C0 xor ax,ax +000043B4 E98001 jmp 0x4537 +000043B7 0000 add [bx+si],al +000043B9 8B0D mov cx,[di] +000043BB 324301 xor al,[bp+di+0x1] +000043BE 0029 add [bx+di],ch +000043C0 D9 db 0xD9 +000043C1 0F841501 jz near 0x44da +000043C5 0000 add [bx+si],al +000043C7 833D36 cmp word [di],byte +0x36 +000043CA 43 inc bx +000043CB 0100 add [bx+si],ax +000043CD 00755D add [di+0x5d],dh +000043D0 833D2E cmp word [di],byte +0x2e +000043D3 43 inc bx +000043D4 0100 add [bx+si],ax +000043D6 007529 add [di+0x29],dh +000043D9 89C1 mov cx,ax +000043DB 01D9 add cx,bx +000043DD C7010000 mov word [bx+di],0x0 +000043E1 0000 add [bx+si],al +000043E3 8B15 mov dx,[di] +000043E5 324301 xor al,[bp+di+0x1] +000043E8 0029 add [bx+di],ch +000043EA DA895104 fimul dword [bx+di+0x451] +000043EE C741080000 mov word [bx+di+0x8],0x0 +000043F3 0000 add [bx+si],al +000043F5 890D mov [di],cx +000043F7 2A4301 sub al,[bp+di+0x1] +000043FA 0089C3E9 add [bx+di+0xe9c3],cl +000043FE 37 aaa +000043FF 0100 add [bx+si],ax +00004401 0089C101 add [bx+di+0x1c1],cl +00004405 D9 db 0xD9 +00004406 8B15 mov dx,[di] +00004408 2E43 cs inc bx +0000440A 0100 add [bx+si],ax +0000440C 8911 mov [bx+di],dx +0000440E 8B15 mov dx,[di] +00004410 324301 xor al,[bp+di+0x1] +00004413 0029 add [bx+di],ch +00004415 DA895104 fimul dword [bx+di+0x451] +00004419 C741080000 mov word [bx+di+0x8],0x0 +0000441E 0000 add [bx+si],al +00004420 890D mov [di],cx +00004422 3643 ss inc bx +00004424 0100 add [bx+si],ax +00004426 89C3 mov bx,ax +00004428 E90C01 jmp 0x4537 +0000442B 0000 add [bx+si],al +0000442D 833D2E cmp word [di],byte +0x2e +00004430 43 inc bx +00004431 0100 add [bx+si],ax +00004433 007456 add [si+0x56],dh +00004436 89C1 mov cx,ax +00004438 01D9 add cx,bx +0000443A 8B15 mov dx,[di] +0000443C 2E43 cs inc bx +0000443E 0100 add [bx+si],ax +00004440 8911 mov [bx+di],dx +00004442 8B15 mov dx,[di] +00004444 324301 xor al,[bp+di+0x1] +00004447 0029 add [bx+di],ch +00004449 DA8B1D3A fimul dword [bp+di+0x3a1d] +0000444D 43 inc bx +0000444E 0100 add [bx+si],ax +00004450 01DA add dx,bx +00004452 895104 mov [bx+di+0x4],dx +00004455 8B15 mov dx,[di] +00004457 3643 ss inc bx +00004459 0100 add [bx+si],ax +0000445B 833A00 cmp word [bp+si],byte +0x0 +0000445E 7412 jz 0x4472 +00004460 890A mov [bp+si],cx +00004462 895108 mov [bx+di+0x8],dx +00004465 890D mov [di],cx +00004467 3643 ss inc bx +00004469 0100 add [bx+si],ax +0000446B 89C3 mov bx,ax +0000446D E9C700 jmp 0x4537 +00004470 0000 add [bx+si],al +00004472 C7020000 mov word [bp+si],0x0 +00004476 0000 add [bx+si],al +00004478 C741080000 mov word [bx+di+0x8],0x0 +0000447D 0000 add [bx+si],al +0000447F 890D mov [di],cx +00004481 3643 ss inc bx +00004483 0100 add [bx+si],ax +00004485 89C3 mov bx,ax +00004487 E9AD00 jmp 0x4537 +0000448A 0000 add [bx+si],al +0000448C 89C1 mov cx,ax +0000448E 01D9 add cx,bx +00004490 C7010000 mov word [bx+di],0x0 +00004494 0000 add [bx+si],al +00004496 8B15 mov dx,[di] +00004498 324301 xor al,[bp+di+0x1] +0000449B 0029 add [bx+di],ch +0000449D DA8B1D3A fimul dword [bp+di+0x3a1d] +000044A1 43 inc bx +000044A2 0100 add [bx+si],ax +000044A4 01DA add dx,bx +000044A6 895104 mov [bx+di+0x4],dx +000044A9 8B15 mov dx,[di] +000044AB 3643 ss inc bx +000044AD 0100 add [bx+si],ax +000044AF 833A00 cmp word [bp+si],byte +0x0 +000044B2 740F jz 0x44c3 +000044B4 890A mov [bp+si],cx +000044B6 895108 mov [bx+di+0x8],dx +000044B9 890D mov [di],cx +000044BB 2A4301 sub al,[bp+di+0x1] +000044BE 0089C3EB add [bx+di+0xebc3],cl +000044C2 76C7 jna 0x448b +000044C4 0200 add al,[bx+si] +000044C6 0000 add [bx+si],al +000044C8 008B4908 add [bp+di+0x849],cl +000044CC C7010000 mov word [bx+di],0x0 +000044D0 0000 add [bx+si],al +000044D2 890D mov [di],cx +000044D4 3643 ss inc bx +000044D6 0100 add [bx+si],ax +000044D8 89C3 mov bx,ax +000044DA EB5D jmp short 0x4539 +000044DC 833D36 cmp word [di],byte +0x36 +000044DF 43 inc bx +000044E0 0100 add [bx+si],ax +000044E2 007525 add [di+0x25],dh +000044E5 833D2E cmp word [di],byte +0x2e +000044E8 43 inc bx +000044E9 0100 add [bx+si],ax +000044EB 00750E add [di+0xe],dh +000044EE C7052A43 mov word [di],0x432a +000044F2 0100 add [bx+si],ax +000044F4 0000 add [bx+si],al +000044F6 0000 add [bx+si],al +000044F8 89C3 mov bx,ax +000044FA EB3D jmp short 0x4539 +000044FC C7053643 mov word [di],0x4336 +00004500 0100 add [bx+si],ax +00004502 0000 add [bx+si],al +00004504 0000 add [bx+si],al +00004506 89C3 mov bx,ax +00004508 EB2F jmp short 0x4539 +0000450A 833D2E cmp word [di],byte +0x2e +0000450D 43 inc bx +0000450E 0100 add [bx+si],ax +00004510 007415 add [si+0x15],dh +00004513 8B0D mov cx,[di] +00004515 2E43 cs inc bx +00004517 0100 add [bx+si],ax +00004519 8B15 mov dx,[di] +0000451B 3643 ss inc bx +0000451D 0100 add [bx+si],ax +0000451F 895108 mov [bx+di+0x8],dx +00004522 890A mov [bp+si],cx +00004524 89C3 mov bx,ax +00004526 EB11 jmp short 0x4539 +00004528 8B4808 mov cx,[bx+si+0x8] +0000452B C7010000 mov word [bx+di],0x0 +0000452F 0000 add [bx+si],al +00004531 890D mov [di],cx +00004533 2A4301 sub al,[bp+di+0x1] +00004536 0089C35A add [bx+di+0x5ac3],cl +0000453A 59 pop cx +0000453B C3 ret +0000453C 50 push ax +0000453D 53 push bx +0000453E 51 push cx +0000453F 52 push dx +00004540 3B1D cmp bx,[di] +00004542 2A4301 sub al,[bp+di+0x1] +00004545 000F add [bx],cl +00004547 82 db 0x82 +00004548 BA0000 mov dx,0x0 +0000454B 00833D2A add [bp+di+0x2a3d],al +0000454F 43 inc bx +00004550 0100 add [bx+si],ax +00004552 000F add [bx],cl +00004554 84AD0000 test [di+0x0],ch +00004558 00A12A43 add [bx+di+0x432a],ah +0000455C 0100 add [bx+si],ax +0000455E 8B5008 mov dx,[bx+si+0x8] +00004561 83FA00 cmp dx,byte +0x0 +00004564 747E jz 0x45e4 +00004566 39D3 cmp bx,dx +00004568 7207 jc 0x4571 +0000456A 89D0 mov ax,dx +0000456C 8B5008 mov dx,[bx+si+0x8] +0000456F EBF0 jmp short 0x4561 +00004571 8903 mov [bp+di],ax +00004573 894B04 mov [bp+di+0x4],cx +00004576 895308 mov [bp+di+0x8],dx +00004579 895808 mov [bx+si+0x8],bx +0000457C 891A mov [bp+si],bx +0000457E 01D9 add cx,bx +00004580 39CA cmp dx,cx +00004582 752B jnz 0x45af +00004584 50 push ax +00004585 034004 add ax,[bx+si+0x4] +00004588 39C3 cmp bx,ax +0000458A 58 pop ax +0000458B 753A jnz 0x45c7 +0000458D 8B4B04 mov cx,[bp+di+0x4] +00004590 014804 add [bx+si+0x4],cx +00004593 8B4A04 mov cx,[bp+si+0x4] +00004596 014804 add [bx+si+0x4],cx +00004599 8B4A08 mov cx,[bp+si+0x8] +0000459C 894808 mov [bx+si+0x8],cx +0000459F 83F900 cmp cx,byte +0x0 +000045A2 0F84AF00 jz near 0x4655 +000045A6 0000 add [bx+si],al +000045A8 8901 mov [bx+di],ax +000045AA E9A800 jmp 0x4655 +000045AD 0000 add [bx+si],al +000045AF 39C3 cmp bx,ax +000045B1 0F85A000 jnz near 0x4655 +000045B5 0000 add [bx+si],al +000045B7 8B4B04 mov cx,[bp+di+0x4] +000045BA 014804 add [bx+si+0x4],cx +000045BD 8902 mov [bp+si],ax +000045BF 895008 mov [bx+si+0x8],dx +000045C2 E99000 jmp 0x4655 +000045C5 0000 add [bx+si],al +000045C7 39CA cmp dx,cx +000045C9 0F858800 jnz near 0x4655 +000045CD 0000 add [bx+si],al +000045CF 8B4A04 mov cx,[bp+si+0x4] +000045D2 014B04 add [bp+di+0x4],cx +000045D5 8B4A08 mov cx,[bp+si+0x8] +000045D8 894B08 mov [bp+di+0x8],cx +000045DB 83F900 cmp cx,byte +0x0 +000045DE 7477 jz 0x4657 +000045E0 8919 mov [bx+di],bx +000045E2 EB73 jmp short 0x4657 +000045E4 8903 mov [bp+di],ax +000045E6 894B04 mov [bp+di+0x4],cx +000045E9 895308 mov [bp+di+0x8],dx +000045EC 895808 mov [bx+si+0x8],bx +000045EF 89C1 mov cx,ax +000045F1 034804 add cx,[bx+si+0x4] +000045F4 39CB cmp bx,cx +000045F6 755F jnz 0x4657 +000045F8 8B4B04 mov cx,[bp+di+0x4] +000045FB 014804 add [bx+si+0x4],cx +000045FE 8B4B08 mov cx,[bp+di+0x8] +00004601 894808 mov [bx+si+0x8],cx +00004604 EB51 jmp short 0x4657 +00004606 C7030000 mov word [bp+di],0x0 +0000460A 0000 add [bx+si],al +0000460C 894B04 mov [bp+di+0x4],cx +0000460F 8B15 mov dx,[di] +00004611 2A4301 sub al,[bp+di+0x1] +00004614 00895308 add [bx+di+0x853],cl +00004618 89DA mov dx,bx +0000461A 035304 add dx,[bp+di+0x4] +0000461D 3B15 cmp dx,[di] +0000461F 2A4301 sub al,[bp+di+0x1] +00004622 007416 add [si+0x16],dh +00004625 833D2A cmp word [di],byte +0x2a +00004628 43 inc bx +00004629 0100 add [bx+si],ax +0000462B 007405 add [si+0x5],dh +0000462E 8B5308 mov dx,[bp+di+0x8] +00004631 891A mov [bp+si],bx +00004633 891D mov [di],bx +00004635 2A4301 sub al,[bp+di+0x1] +00004638 00EB add bl,ch +0000463A 1C8B sbb al,0x8b +0000463C 53 push bx +0000463D 088B4A04 or [bp+di+0x44a],cl +00004641 014B04 add [bp+di+0x4],cx +00004644 8B4A08 mov cx,[bp+si+0x8] +00004647 894B08 mov [bp+di+0x8],cx +0000464A 83F900 cmp cx,byte +0x0 +0000464D 7402 jz 0x4651 +0000464F 8919 mov [bx+di],bx +00004651 891D mov [di],bx +00004653 2A4301 sub al,[bp+di+0x1] +00004656 005A59 add [bp+si+0x59],bl +00004659 5B pop bx +0000465A 58 pop ax +0000465B C3 ret diff --git a/kernel/testkernels etc/vga.inc b/kernel/testkernels etc/vga.inc new file mode 100755 index 0000000..427463e --- /dev/null +++ b/kernel/testkernels etc/vga.inc @@ -0,0 +1,482 @@ +;----------------------------------------------------------; +; BOS 0.04 Christoffer Bubach, 2004-2005. ; +;----------------------------------------------------------; +; ; +; VGA functions. Change video mode etc. ; +; ; +;----------------------------------------------------------; + + + ;-------------------; + ; VGA palettes ; + ;-------------------; + + palette256 db 00, 00, 00, 00, 10, 41, 12, 28, 18, 02, 43, 22, 35 + db 19, 09, 58, 00, 00, 57, 35, 12, 43, 43, 47, 24, 24 + db 28, 20, 24, 60, 10, 60, 15, 31, 47, 63, 62, 56, 20 + db 60, 56, 22, 63, 61, 36, 63, 63, 63, 00, 00, 00, 05 + db 05, 05, 08, 08, 08, 11, 11, 11, 14, 14, 14, 17, 17 + db 17, 20, 20, 20, 24, 24, 24, 28, 28, 28, 32, 32, 32 + db 36, 36, 36, 40, 40, 40, 45, 45, 45, 50, 50, 50, 56 + db 56, 56, 63, 63, 63, 13, 12, 15, 15, 16, 22, 17, 20 + db 29, 19, 24, 36, 21, 28, 43, 23, 31, 50, 25, 34, 57 + db 26, 42, 63, 00, 15, 02, 01, 22, 04, 02, 29, 06, 03 + db 36, 08, 04, 43, 10, 05, 50, 12, 06, 57, 14, 20, 63 + db 40, 18, 06, 07, 25, 12, 11, 33, 17, 14, 40, 23, 18 + db 48, 28, 21, 55, 34, 25, 62, 39, 27, 63, 48, 36, 15 + db 03, 02, 22, 06, 04, 29, 09, 06, 36, 12, 08, 43, 15 + db 10, 50, 18, 12, 57, 21, 14, 63, 28, 20, 15, 00, 00 + db 22, 07, 00, 29, 15, 00, 36, 23, 00, 43, 31, 00, 50 + db 39, 00, 57, 47, 00, 63, 55, 00, 15, 05, 03, 22, 11 + db 07, 29, 17, 11, 36, 23, 15, 43, 29, 19, 50, 35, 23 + db 57, 41, 27, 63, 53, 34, 28, 14, 12, 33, 20, 14, 38 + db 26, 16, 43, 32, 18, 48, 38, 20, 53, 44, 22, 58, 50 + db 24, 63, 56, 30, 05, 05, 06, 10, 10, 13, 15, 15, 20 + db 20, 20, 27, 25, 25, 34, 30, 30, 41, 35, 35, 48, 44 + db 44, 63, 03, 06, 05, 05, 11, 09, 07, 16, 13, 09, 21 + db 17, 11, 26, 21, 13, 31, 25, 15, 36, 29, 20, 48, 38 + db 06, 06, 07, 13, 13, 15, 20, 20, 23, 27, 27, 31, 34 + db 34, 39, 41, 41, 47, 48, 48, 55, 57, 57, 63, 06, 15 + db 04, 12, 22, 08, 18, 29, 12, 24, 36, 16, 30, 43, 20 + db 36, 50, 24, 42, 57, 28, 54, 63, 35, 15, 10, 10, 22 + db 16, 16, 29, 21, 21, 36, 27, 27, 43, 32, 32, 50, 38 + db 38, 57, 43, 43, 63, 54, 54, 15, 15, 06, 22, 22, 12 + db 29, 29, 18, 36, 36, 24, 43, 43, 30, 50, 50, 36, 57 + db 57, 42, 63, 63, 54, 02, 04, 14, 06, 12, 21, 10, 20 + db 28, 14, 28, 35, 18, 36, 42, 22, 44, 49, 26, 52, 56 + db 36, 63, 63, 18, 04, 14, 24, 08, 21, 31, 12, 28, 37 + db 16, 35, 44, 20, 42, 50, 24, 49, 57, 28, 56, 63, 38 + db 63, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 53, 44, 22, 09 + db 08, 12, 16, 14, 16, 22, 21, 20, 29, 27, 24, 35, 34 + db 28, 42, 40, 32, 48, 47, 36, 57, 56, 43, 08, 12, 16 + db 14, 16, 22, 21, 20, 29, 27, 24, 35, 34, 28, 42, 40 + db 32, 48, 47, 36, 57, 56, 43, 63, 13, 09, 11, 21, 16 + db 15, 27, 22, 18, 36, 29, 22, 42, 35, 25, 51, 42, 29 + db 57, 48, 32, 63, 56, 39, 06, 14, 09, 12, 21, 14, 18 + db 27, 22, 24, 33, 28, 30, 39, 36, 36, 46, 42, 42, 52 + db 47, 50, 59, 53, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 + db 00 + + palette16 db 00, 00, 00, 00, 00, 42, 00, 42, 00, 00, 42, 42, 42 + db 00, 00, 42, 00, 42, 42, 21, 00, 42, 42, 42, 21, 21 + db 21, 21, 21, 63, 21, 63, 21, 21, 63, 63, 63, 21, 21 + db 63, 21, 63, 63, 63, 21, 63, 63, 63 + + ;---------------------; + ; VGA mode values. ; + ;---------------------; + mode0x03 db 0x67, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x5F, 0x4F + db 0x50, 0x82, 0x55, 0x81, 0xBF, 0x1F, 0x00, 0x4F, 0x0E + db 0x0F, 0x00, 0x00, 0x00, 0x00, 0x9C, 0x0E, 0x8F, 0x28 + db 0x01, 0x96, 0xB9, 0xA3, 0xFF, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x10, 0x0E, 0x00, 0xFF, 0x00, 0x01, 0x02, 0x03 + db 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B, 0x3C + db 0x3D, 0x3E, 0x3F, 0x0C, 0x00, 0x0F, 0x08, 0x00 + + mode0x13 db 0x63, 0x00, 0x03, 0x01, 0x0F, 0x00, 0x0E, 0x5F, 0x4F + db 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0x41, 0x00 + db 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0x0E, 0x8F, 0x28 + db 0x40, 0x96, 0xB9, 0xA3, 0xFF, 0x00, 0x00, 0x00, 0x00 + db 0x00, 0x40, 0x05, 0x0F, 0xFF, 0x00, 0x01, 0x02, 0x03 + db 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C + db 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00 + + + vga_buff dd 0 + +;---------------------------------; +; sets the screen to mode 0x03 ; +;---------------------------------; +set_mode_0x03: + pushad + push ax + + mov esi, mode0x03 + call set_regs + + call load_font ; IT WORKS!! FINALLY! + + mov esi, palette16 + call set_palette16 + + pop ax + cmp ax, 1 + jne .cont + call cls ; in text.inc + .cont: + + popad + ret + + + +;---------------------------------; +; sets the screen to mode 0x13 ; +;---------------------------------; +set_mode_0x13: + pushad + push ax + + mov esi, mode0x13 + call set_regs + + mov esi, palette256 + call set_palette256 + + pop ax + cmp ax, 1 + jne .cont + mov edi, 0xa0000 ; write directly to mem + mov ax, 0x0000 ; clear all 256kb with color 0 + mov ecx, 0x20000 ; 256kb, 0x20000 = (256*1024)/2 + rep stosw ; by wordwrites + .cont: + + popad + ret + + + +;----------------------------; +; loads the standard font ; +;----------------------------; +load_font: + cld + mov edi, vga_buff + + mov dx, 0x03ce ; graphics + mov al, 5 ; write mode reg + out dx, al + inc dx + in al, dx + stosb + and al, 0xfc + xchg al, ah + mov al, 5 + dec dx + out dx, ax + + mov al, 6 ; misc reg + out dx, al + inc dx + in al, dx + stosb + and al, 0xf1 + or al, 4 + xchg al, ah + mov al, 6 + dec dx + out dx, ax + + mov dx, 0x03c4 ; sequencer port + mov al, 2 ; map mask reg + out dx, al + inc dx + in al, dx + stosb + + dec dx + mov ax, 0x0402 + out dx, ax + + mov al, 4 ; memory selector reg + out dx, al + inc dx + in al, dx + stosb + or al, 4 + xchg al, ah + mov al, 4 + dec dx + out dx, ax + + mov esi, font_8x16 ; font pointer + mov edi, 0xa0000 + + xor ecx, ecx + mov ebx, ecx + + .l1: + mov cl, 16 ; font bytes (16 is standard) + rep movsb + + mov cl, 32 + sub cl, 16 ; font bytes + xor eax, eax + rep stosb + + dec bl ; 256 chars + jnz .l1 + + mov esi, vga_buff + + mov dx, 0x03ce + lodsb + xchg al, ah + mov al, 5 + out dx, ax + + lodsb + xchg al, ah + mov al, 6 + out dx, ax + + mov dx, 0x03c4 + lodsb + xchg al, ah + mov al, 2 + out dx, ax + + lodsb + xchg al, ah + mov al, 4 + out dx, ax + + ret + + + +;------------------------------------; +; put a pixel at x, y with color ; +; used only in mode 0x13 ; +; ; +; input: bx = x ; +; cx = y ; +; al = color ; +; ; +; output: none. ; +;------------------------------------; +put_0x13_pixel: + push ax + push bx + push cx + push edi + + mov edi, 0xa0000 ; directly to mem + add di, bx + mov bx, cx + shl cx, 8 + shl bx, 6 + add cx, bx + add di, cx + stosb + + pop edi + pop cx + pop bx + pop ax + ret + + +;-----------------------------------------------------; +; put a sprite at x, y. only for mode 0x13 ; +; ; +; input: ax = x, bx = y, cx = width, dx = height ; +; esi = pointer to sprite ; +; ; +; output: none. ; +;-----------------------------------------------------; +put_0x13_sprite: + pushad ; this was a + .row_loop: ; nightmare to write. + dec dx ; guess how many times + push cx ; i got lost in the push + push ax ; and pops here.. ;) + .col_loop: ; not to mention what + dec cx ; time it was when i wrote + push ax ; it.. :P + push bx + push cx + mov cx, bx + mov bx, ax + lodsb + call put_0x13_pixel + pop cx + pop bx + pop ax + inc ax + cmp cx, 0 + jne .col_loop + pop ax + pop cx + inc bx + cmp dx, 0 + jne .row_loop + popad + ret + + +;---------------------------------------------; +; sets the palette (256 colors) ; +; ; +; input: esi = palette. ; +; output: none. ; +;---------------------------------------------; +set_palette256: + push ax + push cx + push dx + + xor cx, cx + .l1: + mov dx, 0x03C8 + mov al, cl ; color no. = loop no. + out dx, al + inc dx ; port 0x3C9 + mov al, byte [esi] ; red + out dx, al + inc esi + mov al, byte [esi] ; green + out dx, al + inc esi + mov al, byte [esi] ; blue + out dx, al + inc esi + + inc cx + cmp cx, 256 + jl .l1 + + pop dx + pop cx + pop ax + ret + + +;---------------------------------------------; +; sets the palette (16 colors) ; +; ; +; input: esi = pointer to palette. ; +; output: none. ; +;---------------------------------------------; +set_palette16: + push ax + push cx + push dx + + xor cx, cx + .l1: + mov dx, 0x3DA + in al, dx + mov al, cl ; color no. + mov dx, 0x3C0 + out dx, al + inc dx ; port 0x3C1 + in al, dx + mov dx, 0x3C8 + out dx, al + + inc dx ; port 0x3C9 + mov al, byte [esi] ; red + out dx, al + inc esi + mov al, byte [esi] ; green + out dx, al + inc esi + mov al, byte [esi] ; blue + out dx, al + inc esi + + inc cx + cmp cx, 16 + jl .l1 + + mov dx, 0x3DA + in al, dx + mov al, 0x20 + mov dx, 0x3C0 + out dx, al + + pop dx + pop cx + pop ax + ret + + + +;---------------------------------; +; Set VGA regs to choosen mode ; +; internal use. ; +;---------------------------------; +set_regs: + cli + mov dx, 0x3C2 + lodsb + out dx, al + + mov dx, 0x3DA + lodsb + out dx, al + + xor ecx, ecx + mov dx, 0x3C4 + .l1: + lodsb + xchg al, ah + mov al, cl + out dx, ax + inc ecx + cmp cl, 4 + jbe .l1 + + mov dx, 0x3D4 + mov ax, 0x0E11 + out dx, ax + + xor ecx, ecx + mov dx, 0x3D4 + .l2: + lodsb + xchg al, ah + mov al, cl + out dx, ax + inc ecx + cmp cl, 0x18 + jbe .l2 + + xor ecx, ecx + mov dx, 0x3CE + .l3: + lodsb + xchg al, ah + mov al, cl + out dx, ax + inc ecx + cmp cl, 8 + jbe .l3 + + mov dx, 0x3DA + in al, dx + + xor ecx, ecx + mov dx, 0x3C0 + .l4: + in ax, dx + mov al, cl + out dx, al + lodsb + out dx, al + inc ecx + cmp cl, 0x14 + jbe .l4 + + mov al, 0x20 + out dx, al + + sti + ret \ No newline at end of file diff --git a/utils/FASM.EXE b/utils/FASM.EXE new file mode 100755 index 0000000000000000000000000000000000000000..6db9d5f654bd67d7fd9cea1fd506ca613323baa8 GIT binary patch literal 69632 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 literal 0 HcmV?d00001 diff --git a/utils/fasm b/utils/fasm new file mode 100755 index 0000000000000000000000000000000000000000..76e55a6c3b8f41308021b92ff0fa85bad42184b8 GIT binary patch literal 63017 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

8_J%U~%7y>p-$ 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