From 7ac42a5c9da93fdf8d8af47e9bc6f545905ae743 Mon Sep 17 00:00:00 2001 From: mothcompute Date: Wed, 10 Jan 2024 11:13:45 -0800 Subject: [PATCH] initial commit --- .gitignore | 1 + b | 20 + boot/boot.s | 119 ++++ dosbox-x.conf | 1293 +++++++++++++++++++++++++++++++++++++++++++ include/alloc.h | 23 + include/ata-pio.h | 36 ++ include/interrupt.h | 38 ++ include/isr.i | 1280 ++++++++++++++++++++++++++++++++++++++++++ include/keyboard.h | 9 + include/ports.h | 11 + include/stddef.h | 4 + include/stdlib.h | 7 + include/string.h | 9 + include/video.h | 15 + src/alloc.c | 73 +++ src/ata-pio.c | 51 ++ src/entry.s | 7 + src/interrupt.s | 28 + src/interrupts.c | 60 ++ src/kernel.c | 33 ++ src/keyboard.c | 32 ++ src/ports.c | 21 + src/stdlib.c | 14 + src/string.c | 15 + src/video.c | 26 + tool/genisr.c | 13 + 26 files changed, 3238 insertions(+) create mode 100644 .gitignore create mode 100755 b create mode 100644 boot/boot.s create mode 100644 dosbox-x.conf create mode 100644 include/alloc.h create mode 100644 include/ata-pio.h create mode 100644 include/interrupt.h create mode 100644 include/isr.i create mode 100644 include/keyboard.h create mode 100644 include/ports.h create mode 100644 include/stddef.h create mode 100644 include/stdlib.h create mode 100644 include/string.h create mode 100644 include/video.h create mode 100644 src/alloc.c create mode 100644 src/ata-pio.c create mode 100644 src/entry.s create mode 100644 src/interrupt.s create mode 100644 src/interrupts.c create mode 100644 src/kernel.c create mode 100644 src/keyboard.c create mode 100644 src/ports.c create mode 100644 src/stdlib.c create mode 100644 src/string.c create mode 100644 src/video.c create mode 100644 tool/genisr.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..33b8a9e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +test.mp3 diff --git a/b b/b new file mode 100755 index 0000000..0139e04 --- /dev/null +++ b/b @@ -0,0 +1,20 @@ +#!/bin/sh + +# needs to be configured in boot.s as well +LDADDR=0x100000 +BNAME=32.com + +[ "$1" = "init" ] && for i in tool/*.c; do cc $i -O3 -o $(echo "$i" | sed 's/\.c$//') | true; done && + tool/genisr > include/isr.i + +[ "$1" = "clean" ] && rm obj/* $BNAME + +[ "$1" = "prog" ] && for i in src/*.s; do nasm -felf $i; done && + for i in src/*.c; do i386-elf-gcc -c $i -ffreestanding -Iinclude -Os | true; done && + mv *.o src/*.o obj && + i386-elf-ld -o obj/kernel -Ttext $LDADDR obj/entry.o $(ls obj/*.o | grep -v entry.o) --oformat binary && + cat obj/boot obj/kernel > $BNAME + +[ -z "$1" ] && nasm boot/boot.s -o obj/boot | true && $0 prog | true + +[ "$1" = "all" ] && ./b clean | true && ./b | true && dosbox-x $BNAME | true diff --git a/boot/boot.s b/boot/boot.s new file mode 100644 index 0000000..fb39f7e --- /dev/null +++ b/boot/boot.s @@ -0,0 +1,119 @@ +[org 0x100] +[bits 16] + +cli +mov ax, ds +mov [torm+3], ax +mov gs, ax +mov [oldss], ss +mov [oldsp], sp + +in al, 0x92 +or al, 2 +out 0x92, al + +; TODO maybe choose a better entrypoint than the start of hma +cld +mov cx, 65280-bindat +mov si, bindat +mov ax, 0xFFFF +mov es, ax +mov di, 0x10 +rep movsb + +; relocate jump target +xor eax, eax +mov ax, ds +shl eax, 4 + +add [gdt+2], eax +add [gdt_end+2], eax + +mov [gds+2], ax +mov [gds16+2], ax +mov [gcs16+2], ax +shr eax, 16 +mov [gds+4], al +mov [gds16+4], al +mov [gcs16+4], al + +lgdt [gdt] +mov eax, cr0 +or al, 1 +mov cr0, eax +ijmp: jmp dsseg:init + +[bits 32] +init: + ; retain stack pointer + ; esp = ebp = (ss << 4) + sp + xor ebp, ebp + xor ebx, ebx + mov bp, ss + mov bx, sp + shl ebp, 4 + add ebp, ebx + mov esp, ebp + + mov ax, data + mov ds, ax + mov ss, ax + mov es, ax + mov fs, ax + + call code:0x100000 ; start + + cli +jf: jmp cs16:in16 + +[bits 16] +in16: + mov ax, ds16 + mov ds, ax + lidt [idt] + + mov eax, cr0 + and al, 0xFE + mov cr0, eax + +torm: jmp 0:inrm + +inrm: mov ax, gs + mov ds, ax + mov es, ax + mov fs, ax + mov ss, [oldss] + mov sp, [oldsp] + + sti + xor ax, ax + int 21h + ret + +idt: dw 0x3FF + dd 0 + +gdt: dw gdt_end - gdt - 1 + dd gdt + dw 0 +gcode: dd 0x0000ffff +code equ gcode - gdt + db 0, 10011011b, 11001111b, 0 +gdata: dd 0x0000ffff +data equ gdata - gdt + db 0, 10010011b, 11001111b, 0 +gds: dd 0x0000ffff +dsseg equ gds - gdt + db 0, 10011111b, 01001111b, 0 +gds16: dd 0x0000ffff +ds16 equ gds16 - gdt + db 0, 10010111b, 00001111b, 0 +gcs16: dd 0x0000ffff +cs16 equ gcs16 - gdt + db 0, 10011111b, 00001111b, 0 +gdt_end: + +oldss: dw 0 +oldsp: dw 0 + +bindat equ $ diff --git a/dosbox-x.conf b/dosbox-x.conf new file mode 100644 index 0000000..989b996 --- /dev/null +++ b/dosbox-x.conf @@ -0,0 +1,1293 @@ +# This is the configuration file for DOSBox-X 2023.05.01. (Please use the latest version of DOSBox-X) +# Lines starting with a # are comment lines and are ignored by DOSBox-X. +# They are used to (briefly) document the effect of each option. +# To write out ALL options, use command 'config -all' with -wc or -writeconf options. + +[sdl] +# fullscreen: Start DOSBox-X directly in fullscreen. (Press [F11/F12]+F to go back) +# fulldouble: Use double buffering in fullscreen. It can reduce screen flickering, but it can also result in a slow DOSBox-X. +# fullresolution: What resolution to use for fullscreen: original, desktop or a fixed size (e.g. 1024x768). +# Using your monitor's native resolution with aspect=true might give the best results. +# If you end up with small window on a large screen, try an output different from surface. +# windowresolution: Scale the window to this size IF the output device supports hardware scaling. +# (output=surface does not!) +# windowposition: Set the window position at startup in the positionX,positionY format (e.g.: 1300,200). +# The window will be centered with "," (or empty), and will be in the original position with "-". +# display: Specify a screen/display number to use for a multi-screen setup (0 = default). +# output: What video system to use for output (openglnb = OpenGL nearest; openglpp = OpenGL perfect; ttf = TrueType font output). +# Possible values: default, surface, overlay, ttf, opengl, openglnb, openglhq, openglpp, ddraw, direct3d. +# videodriver: Forces a video driver (e.g. windib/windows, directx, x11, fbcon, dummy, etc) for the SDL library to use. +# transparency: Set the transparency of the DOSBox-X screen (both windowed and full-screen modes, on SDL2 and Windows SDL1 builds). +# The valid value is from 0 (no transparency, the default setting) to 90 (high transparency). +# maximize: If set, the DOSBox-X window will be maximized at start (SDL2 and Windows SDL1 builds only; use fullscreen for TTF output). +# autolock: Mouse will automatically lock, if you click on the screen. (Press CTRL-F10 to unlock) +# autolock_feedback: Autolock status feedback type, i.e. visual, auditive, none. +# Possible values: none, beep, flash. +# middle_unlock: Whether you can press the middle mouse button to unlock the mouse when the mouse has been locked. +# If set to "manual", it works only with "autolock=false"; if set to "auto", it works only with "autolock=true". +# Possible values: none, manual, auto, both. +# clip_mouse_button: Select the mouse button or use arrow keys for the shared clipboard copy/paste function. +# The default mouse button is "right", which means using the right mouse button to select text, copy to and paste from the host clipboard. +# Set to "middle" to use the middle mouse button, "arrows" to use arrow keys instead of a mouse button, or "none" to disable this feature. +# For "arrows", press Home key (or Fn+Shift+Left on Mac laptops) to start selection, and End key (or Fn+Shift+Right on Mac laptops) to end selection. +# Possible values: none, middle, right, arrows. +# clip_key_modifier: Change the keyboard modifier for the shared clipboard copy/paste function using a mouse button or arrow keys. +# The default modifier is "shift" (both left and right shift keys). Set to "none" if no modifier is desired. +# Possible values: none, ctrl, lctrl, rctrl, alt, lalt, ralt, shift, lshift, rshift, ctrlalt, ctrlshift, altshift, lctrlalt, lctrlshift, laltshift, rctrlalt, rctrlshift, raltshift. +# clip_paste_bios: Specify whether to use BIOS keyboard functions for the clipboard pasting instead of the keystroke method. +# For pasting clipboard text into Windows 3.x/9x applications (e.g. Notepad), make sure to use the keystroke method. +# Possible values: true, false, 1, 0, default. +# clip_paste_speed: Set keyboard speed for pasting text from the shared clipboard. +# If the default setting of 30 causes lost keystrokes, increase the number. +# Or experiment with decreasing the number for applications that accept keystrokes quickly. +# sensitivity: Mouse sensitivity. The optional second parameter specifies vertical sensitivity (e.g. 100,-50). +# usesystemcursor: Use the mouse cursor of the host system instead of drawing a DOS mouse cursor. Activated when the mouse is not locked. +# mouse_emulation: When is mouse emulated ? +# integration: when not locked +# locked: when locked +# always: every time +# never: at no time +# If disabled, the mouse position in DOSBox-X is exactly where the host OS reports it. +# When using a high DPI mouse, the emulation of mouse movement can noticeably reduce the +# sensitiveness of your device, i.e. the mouse is slower but more precise. +# Possible values: integration, locked, always, never. +# mouse_wheel_key: Convert mouse wheel movements into keyboard presses such as arrow keys. +# 0: disabled; 1: up/down arrows; 2: left/right arrows; 3: PgUp/PgDn keys. +# 4: Ctrl+up/down arrows; 5: Ctrl+left/right arrows; 6: Ctrl+PgUp/PgDn keys. +# 7: Ctrl+W/Z, as supported by text editors like WordStar and MS-DOS EDIT. +# Putting a minus sign in front will disable the conversion for guest systems. +# waitonerror: Wait before closing the console if DOSBox-X has an error. +# priority: Priority levels for DOSBox-X. Second entry behind the comma is for when DOSBox-X is not focused/minimized. +# pause is only valid for the second entry. +# Possible values: lowest, lower, normal, higher, highest, pause. +# mapperfile: File used to load/save the key/event mappings from. Resetmapper only works with the default value. +# usescancodes: Avoid usage of symkeys, in favor of scancodes. Might not work on all operating systems. +# If set to "auto" (default), it is enabled when using non-US keyboards in SDL1 builds. +# Possible values: true, false, 1, 0, auto. +# overscan: Width of the overscan border (0 to 10) for the "surface" output. +# titlebar: Change the string displayed in the DOSBox-X title bar. +# showbasic: If set, DOSBox-X will show basic information including the DOSBox-X version number and current running speed in the title bar. +# showdetails: If set, DOSBox-X will show the cycles count (FPS) and emulation speed relative to realtime in the title bar. +# showmenu: Whether to show the menu bar (if supported). Default true. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> mapperfile_sdl1; mapperfile_sdl2; forcesquarecorner +# +fullscreen = false +fulldouble = false +fullresolution = desktop +windowresolution = original +windowposition = - +display = 0 +output = default +videodriver = +transparency = 0 +maximize = false +autolock = false +autolock_feedback = beep +middle_unlock = manual +clip_mouse_button = right +clip_key_modifier = shift +clip_paste_bios = default +clip_paste_speed = 30 +sensitivity = 100 +usesystemcursor = false +mouse_emulation = locked +mouse_wheel_key = -1 +waitonerror = true +priority = higher,normal +mapperfile = mapper-dosbox-x.map +usescancodes = auto +overscan = 0 +titlebar = +showbasic = true +showdetails = false +showmenu = true + +[log] +# logfile: file where the log messages will be saved to +# debuggerrun: The run mode when the DOSBox-X Debugger starts. +# Possible values: debugger, normal, watch. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> vga; vgagfx; vgamisc; int10; sblaster; dma_control; fpu; cpu; paging; fcb; files; ioctl; exec; dosmisc; pit; keyboard; pic; mouse; bios; gui; misc; io; pci; sst; int21; fileio +# +logfile = +debuggerrun = debugger + +[dosbox] +# language: Select a language file for DOSBox-X to use. Encoded with either UTF-8 or a DOS code page. +# You can set code page either in the language file or with "country" setting in [config] section. +# title: Additional text to place in the title bar of the window. +# fastbioslogo: If set, DOSBox-X will skip the BIOS screen by activating fast BIOS logo mode (without 1-second pause). +# startbanner: If set (default), DOSBox-X will display the welcome banner when it starts. +# bannercolortheme: You can specify a different background color theme for the welcome banner from the default one. +# Possible values: default, black, red, green, yellow, blue, magenta, cyan, white. +# dpi aware: Set this option (auto by default) to indicate to your OS that DOSBox-X is DPI aware. +# If it is not set, Windows Vista/7/8/10 and higher may upscale the DOSBox-X window +# on higher resolution monitors which is probably not what you want. +# Possible values: true, false, 1, 0, auto. +# quit warning: Set this option to indicate whether DOSBox-X should show a warning message when the user tries to close its window. +# If set to auto (default), DOSBox-X will warn if a DOS program, game or a guest system is currently running. +# If set to autofile, DOSBox-X will warn if there are open file handles or a guest system is currently running. +# Possible values: true, false, 1, 0, auto, autofile. +# working directory option: Select an option for DOSBox-X's working directory when it runs. +# autoprompt: DOSBox-X will auto-decide whether to prompt for a working directory. +# config: DOSBox-X will use the primary config file directory as the working directory. +# custom: Specify a working directory via the "working directory default" option. +# default: Similar to autoprompt, but DOSBox-X will ask whether to save the selected folder. +# force: Similar to "custom", while overriding -defaultdir command-line option if used. +# noprompt: DOSBox-X uses the current directory and never prompts for a working directory. +# program: DOSBox-X will use the DOSBox-X program directory as the working directory. +# prompt: DOSBox-X will always ask the user to select a working directory when it runs. +# userconfig: DOSBox-X will use its user configuration directory as the working directory. +# Possible values: autoprompt, config, custom, default, force, noprompt, program, prompt, userconfig. +# working directory default: The default directory to act as DOSBox-X's working directory. See also the setting "working directory option". +# For working directory option=prompt, the specified directory becomes the default directory for the folder selection. +# show advanced options: If set, the Configuration Tool will display all config options (including advanced ones) by default. +# resolve config path: If set to true, DOSBox-X will resolve options containing paths in the config file (except [autoexec] section). +# This includes environment variables (%VAR% [DOS/Windows] or ${VAR} [Linux/macOS] and tilde (~) in Linux/macOS. +# If set to dosvar, DOSBox-X forces to resolve DOS-style environment variables (%VAR%) in all platforms (and tilde). +# If set to tilde, DOSBox-X will only resolve tilde (~) in Linux/macOS but will not resolve environment variables. +# Possible values: true, false, dosvar, tilde, 1, 0. +# hostkey: By default, DOSBox-X uses the mapper-defined host key, which defaults to F11 on Windows and F12 on other platforms. +# You may alternatively specify a host key with this setting and bypass the host key as defined in the mapper. +# This can also be done from the menu ("Main" => "Select host key"). +# Possible values: ctrlalt, ctrlshift, altshift, mapper. +# mapper send key: Select the key the mapper SendKey function will send. +# Possible values: winlogo, winmenu, alttab, ctrlesc, ctrlbreak, ctrlaltdel. +# ime: Enables support for the system input methods (IME) for inputting characters in Windows and Linux builds. +# If set to auto, this feature is only enabled if DOSBox-X starts with a Chinese/Japanese/Korean code page. +# Possible values: true, false, 1, 0, auto. +# synchronize time: If set, DOSBox-X will try to automatically synchronize time with the host, unless you decide to change the date/time manually. +# machine: The type of machine DOSBox-X tries to emulate. +# Possible values: mda, cga, cga_mono, cga_rgb, cga_composite, cga_composite2, hercules, hercules_plus, hercules_incolor, hercules_color, tandy, pcjr, pcjr_composite, pcjr_composite2, amstrad, ega, ega200, jega, mcga, vgaonly, svga_s3, svga_s386c928, svga_s3vision864, svga_s3vision868, svga_s3vision964, svga_s3vision968, svga_s3trio32, svga_s3trio64, svga_s3trio64v+, svga_s3virge, svga_s3virgevx, svga_et3000, svga_et4000, svga_paradise, vesa_nolfb, vesa_oldvbe, vesa_oldvbe10, pc98, pc9801, pc9821, svga_ati_egavgawonder, svga_ati_vgawonder, svga_ati_vgawonderplus, svga_ati_vgawonderxl, svga_ati_vgawonderxl24, svga_ati_mach8, svga_ati_mach32, svga_ati_mach64, fm_towns. +# captures: Directory where things like wave, midi, screenshot get captured. +# autosave: Enable the auto-save state feature. Specify a time interval in seconds, and optionally a save slot or start and end save slots. +# For example, "autosave=10 11-20" will set a 10-second time interval for auto-saving, and the save slots used will be between 11 and 20. +# You can additionally specify up to 9 programs for this feature, e.g. "autosave=10 11-20 EDIT:21-30 EDITOR:35" for "EDIT" and "EDITOR". +# Putting a minus sign (-) before the time interval causes the auto-saving function to not be activated at start. +# saveslot: Select the default save slot (1-100) to save/load states. +# savefile: Select the default save file to save/load states. If specified it will be used instead of the save slot. +# saveremark: If set, the save state feature will ask users to enter remarks when saving a state. +# forceloadstate: If set, DOSBox-X will load a saved state even if it finds there is a mismatch in the DOSBox-X version, machine type, program name and/or the memory size. +# a20: A20 gate emulation mode. +# The on/off/on_fake/off_fake options are intended for testing and debugging DOS development, +# or to emulate obscure hardware, or to work around potential extended memory problems with DOS programs. +# on_fake/off_fake are intended to test whether a program carries out a memory test to ensure the A20 +# gate is set as intended (as HIMEM.SYS does). If it goes by the gate bit alone, it WILL crash. +# This parameter is also changeable from the builtin A20GATE command. +# fast Emulate A20 gating by remapping the first 64KB @ 1MB boundary (fast, mainline DOSBox behavior) +# mask Emulate A20 gating by masking memory I/O address (accurate) +# off Lock A20 gate off (Software/OS cannot enable A20) +# on Lock A20 gate on (Software/OS cannot disable A20) +# off_fake Lock A20 gate off but allow bit to toggle (hope your DOS game tests the HMA!) +# on_fake Lock A20 gate on but allow bit to toggle +# memsize: Amount of memory DOSBox-X has in megabytes. +# This value is best left at its default to avoid problems with some games, +# although other games and applications may require a higher value. +# Programs that use 286 protected mode like Windows 3.0 in Standard Mode may crash with more than 15MB. +# nocachedir: If set, MOUNT commands will mount with -nocachedir (disable directory caching) by default. +# freesizecap: If set to "cap" (="true"), the value of MOUNT -freesize will apply only if the actual free size is greater than the specified value. +# If set to "relative", the value of MOUNT -freesize will change relative to the specified value. +# If set to "fixed" (="false"), the value of MOUNT -freesize will be a fixed one to be reported all the time. +# Possible values: true, false, fixed, relative, cap, 2, 1, 0. +# convertdrivefat: If set, DOSBox-X will auto-convert mounted non-FAT drives (such as local drives) to FAT format for use with guest systems. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> disable graphical splash; allow quit after warning; keyboard hook; weitek; bochs debug port e9; video debug at startup; compresssaveparts; show recorded filename; skip encoding unchanged frames; capture chroma format; capture format; shell environment size; private area size; turn off a20 gate on boot; cbus bus clock; isa bus clock; pci bus clock; call binary on reset; unhandled irq handler; call binary on boot; ibm rom basic; rom bios allocation max; rom bios minimum size; irq delay ns; iodelay; iodelay16; iodelay32; acpi; acpi rsd ptr location; acpi sci irq; acpi iobase; acpi reserved size; memsizekb; dos mem limit; isa memory hole at 512kb; reboot delay; memalias; convert fat free space; convert fat timeout; leading colon write protect image; locking disk image mount; unmask keyboard on int 16 read; int16 keyboard polling undocumented cf behavior; allow port 92 reset; enable port 92; enable 1st dma controller; enable 2nd dma controller; allow dma address decrement; enable 128k capable 16-bit dma; enable dma extra page registers; dma page registers write-only; cascade interrupt never in service; cascade interrupt ignore in service; enable slave pic; enable pc nmi mask; allow more than 640kb base memory; enable pci bus +# +language = +title = +fastbioslogo = false +startbanner = true +bannercolortheme = default +dpi aware = auto +quit warning = auto +working directory option = default +working directory default = +show advanced options = false +resolve config path = true +hostkey = mapper +mapper send key = ctrlaltdel +ime = auto +synchronize time = false +machine = svga_s3 +captures = capture +autosave = +saveslot = 1 +savefile = +saveremark = true +forceloadstate = false +a20 = mask +memsize = 16 +nocachedir = false +freesizecap = cap +convertdrivefat = true + +[render] +# frameskip: How many frames DOSBox-X skips before drawing one. +# aspect: Aspect ratio correction mode. Can be set to the following values: +# 'false' (default): +# 'direct3d'/opengl outputs: image is simply scaled to full window/fullscreen size, possibly resulting in disproportional image +# 'surface' output: it does no aspect ratio correction (default), resulting in disproportional images if VGA mode pixel ratio is not 4:3 +# 'true': +# 'direct3d'/opengl outputs: uses output driver functions to scale / pad image with black bars, correcting output to proportional 4:3 image +# In most cases image degradation should not be noticeable (it all depends on the video adapter and how much the image is upscaled). +# Should have none to negligible impact on performance, mostly being done in hardware +# For the pixel-perfect scaling (output=openglpp), it is recommended to enable this whenever the emulated display has an aspect ratio of 4:3 +# 'surface' output: inherits old DOSBox aspect ratio correction method (adjusting rendered image line count to correct output to 4:3 ratio) +# Due to source image manipulation this mode does not mix well with scalers, i.e. multiline scalers like hq2x/hq3x will work poorly +# Slightly degrades visual image quality. Has a tiny impact on performance +# When using xBRZ scaler with 'surface' output, aspect ratio correction is done by the scaler itself, so none of the above apply +# Possible values: false, true, 0, 1, yes, no, nearest, bilinear. +# aspect_ratio: Set the aspect ratio (e.g. 16:9) in the aspect ratio correction mode. 0:0 means the default ratio of 4:3, and -1:-1 means the original image ratio. +# char9: Allow 9-pixel wide text mode fonts instead of 8-pixel wide fonts. +# euro: Display Euro symbol instead of the specified ASCII character (33-255). +# For example, setting it to 128 allows Euro symbol to be displayed instead of C-cedilla. +# doublescan: If set, doublescanned output emits two scanlines for each source line, in the +# same manner as the actual VGA output (320x200 is rendered as 640x400 for example). +# If clear, doublescanned output is rendered at the native source resolution (320x200 as 320x200). +# This affects the raster PRIOR to the software or hardware scalers. Choose wisely. +# For pixel-perfect scaling (output=openglpp), it is recommended to turn this option off. +# scaler: Scaler used to enlarge/enhance low resolution modes. If 'forced' is appended, +# then the scaler will be used even if the result might not be desired. +# Appending 'prompt' will cause a confirmation message for forcing the scaler. +# To fit a scaler in the resolution used at full screen may require a border or side bars. +# To fill the screen entirely, depending on your hardware, a different scaler/fullresolution might work. +# Scalers should work with most output options, but they are ignored for openglpp and TrueType font outputs. +# Possible values: none, normal2x, normal3x, normal4x, normal5x, advmame2x, advmame3x, advinterp2x, advinterp3x, hq2x, hq3x, 2xsai, super2xsai, supereagle, tv2x, tv3x, rgb2x, rgb3x, scan2x, scan3x, gray, gray2x, hardware_none, hardware2x, hardware3x, hardware4x, hardware5x, xbrz, xbrz_bilinear. +# glshader: Path to GLSL shader source to use with OpenGL output ("none" to disable, or "default" for default shader). +# Can be either an absolute path, a file in the "glshaders" subdirectory of the DOSBox-X configuration directory, +# or one of the built-in shaders (e.g. "sharp" for the pixel-perfect scaling mode): +# advinterp2x, advinterp3x, advmame2x, advmame3x, rgb2x, rgb3x, scan2x, scan3x, tv2x, tv3x, sharp. +# pixelshader: Set Direct3D pixel shader program (effect file must be in Shaders subdirectory). If 'forced' is appended, +# then the pixel shader will be used even if the result might not be desired. +# autofit: Best fits image to window +# - Intended for output=direct3d, fullresolution=original, aspect=true +# monochrome_pal: Specify the color of monochrome display. +# Possible values: green, amber, gray, white +# Append 'bright' for a brighter look. +# Possible values: green, amber, gray, white. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> xbrz slice; xbrz fixed scale factor; xbrz max scale factor +# +frameskip = 0 +aspect = false +aspect_ratio = 0:0 +char9 = true +euro = -1 +doublescan = true +scaler = normal2x +glshader = none +pixelshader = none +autofit = true +monochrome_pal = green + +[pc98] +# pc-98 BIOS copyright string: If set, the PC-98 BIOS copyright string is placed at E800:0000. Enable this for software that detects PC-98 vs Epson. +# pc-98 fm board: In PC-98 mode, selects the FM music board to emulate. +# Possible values: auto, off, false, board14, board26k, board86, board86c. +# pc-98 enable 256-color: Allow 256-color graphics mode if set, disable if not set +# pc-98 enable 16-color: Allow 16-color graphics mode if set, disable if not set +# pc-98 enable grcg: Allow GRCG graphics functions if set, disable if not set +# pc-98 enable egc: Allow EGC graphics functions if set, disable if not set +# pc-98 bus mouse: Enable PC-98 bus mouse emulation. Disabling this option does not disable INT 33h emulation. +# pc-98 force ibm keyboard layout: Force to use a default keyboard layout like IBM US-English for PC-98 emulation. +# Will only work with apps and games using BIOS for keyboard. +# Possible values: true, false, 1, 0, auto. +# pc-98 try font rom: If enabled, DOSBox-X will first try to load FONT.ROM as generated by T98Tools for PC-98 emulation. +# pc-98 anex86 font: Specify an Anex86 compatible font to load as supported by the Anex86 emulator for PC-98 emulation. +# By default DOSBox-X tries to load ANEX86.BMP followed by FREECG98.BMP after trying to load FONT.ROM. +# If you specify a font here then it will be tried first, perhaps before FONT.ROM (see previous option). +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> pc-98 int 1b fdc timer wait; pc-98 pic init to read isr; pc-98 fm board irq; pc-98 fm board io port; pc-98 sound bios; pc-98 load sound bios rom file; pc-98 buffer page flip; pc-98 enable 256-color planar; pc-98 enable 188 user cg; pc-98 start gdc at 5mhz; pc-98 allow scanline effect; pc-98 video mode; pc-98 timer always cycles; pc-98 timer master frequency; pc-98 allow 4 display partition graphics; pc-98 show graphics layer on initialize +# +pc-98 BIOS copyright string = false +pc-98 fm board = auto +pc-98 enable 256-color = true +pc-98 enable 16-color = true +pc-98 enable grcg = true +pc-98 enable egc = true +pc-98 bus mouse = true +pc-98 force ibm keyboard layout = auto +pc-98 try font rom = true +pc-98 anex86 font = + +[dosv] +# dosv: Enable DOS/V emulation and specify which version to emulate. This option is intended for use with games or software +# originating from East Asia (China, Japan, Korea) that use the double byte character set (DBCS) encodings and DOS/V extensions +# to display Japanese (jp), Chinese (chs/cht/cn/tw), or Korean (ko) text. Note that enabling DOS/V replaces 80x25 text mode with +# a EGA/VGA graphics mode that emulates text mode to display the characters and may be incompatible with non-Asian software that +# assumes direct access to the text mode via segment 0xB800. For a general DOS environment with CJK support please disable DOS/V +# emulation and use TrueType font (TTF) output with a CJK code page (932, 936, 949, 950) and TTF font with CJK characters instead. +# Possible values: off, jp, ko, chs, cht, cn, tw. +# getsysfont: If enabled, DOSBox-X will try to get and use the system fonts on Windows and Linux platforms for the DOS/V emulation. +# If this cannot be done, then DOSBox-X will try to use the internal Japanese DOS/V font, or you can specify a different font. +# fontxsbcs: FONTX2 file used to rendering SBCS characters (8x19) in DOS/V or JEGA mode. If not specified, the default one will be used. +# Loading the ASC16 and ASCFONT.15 font files (from the UCDOS and ETen Chinese DOS systems) is also supported for the DOS/V mode. +# fontxsbcs16: FONTX2 file used to rendering SBCS characters (8x16) in DOS/V or JEGA mode. If not specified, the default one will be used. +# Loading the ASC16 and ASCFONT.15 font files (from the UCDOS and ETen Chinese DOS systems) is also supported for the DOS/V mode. +# fontxsbcs24: FONTX2 file used to rendering SBCS characters (12x24) in DOS/V mode (with V-text). If not specified, the default one will be used. +# Loading the ASC24 and ASCFONT.24? font files (the latter from the ETen Chinese DOS system) is also supported for the DOS/V mode. +# fontxdbcs: FONTX2 file used to rendering DBCS characters (16x16) in DOS/V or VGA/JEGA mode. If not specified, the default one will be used. +# Alternatively, you can load a BDF or PCF font file (16x16 or 15x15), such as the free bitmap fonts from WenQuanYi (https://wenq.org/). +# For Simplified Chinese DOS/V, loading the HZK16 font file (https://github.com/aguegu/BitmapFont/tree/master/font) is also supported. +# For Traditional Chinese DOS/V, loading the STDFONT.15 font file from the ETen Chinese DOS system is also supported. +# fontxdbcs14: FONTX2 file used to rendering DBCS characters (14x14) for Configuration Tool or EGA mode. If not specified, the default one will be used. +# Alternatively, you can load a BDF or PCF font file (14x14 or 15x15), such as the free bitmap fonts from WenQuanYi (https://wenq.org/). +# For Simplified Chinese DOS/V, loading the HZK14 font file (https://github.com/aguegu/BitmapFont/tree/master/font) is also supported. +# For Traditional Chinese DOS/V, loading the STDFONT.15 font file from the ETen Chinese DOS system is also supported. +# fontxdbcs24: FONTX2 file used to rendering DBCS characters (24x24) in DOS/V mode (with V-text and 24-pixel fonts enabled). +# For Simplified Chinese DOS/V, loading the HZK24? font file (https://github.com/aguegu/BitmapFont/tree/master/font) is also supported. +# For Traditional Chinese DOS/V, loading the STDFONT.24 font file from the ETen Chinese DOS system is also supported. +# showdbcsnodosv: Enables rendering of Chinese/Japanese/Korean characters for DBCS code pages in standard VGA and EGA machine types in non-DOS/V and non-TTF mode. +# DOS/V fonts will be used in such cases, which can be adjusted by the above config options (such as fontxdbcs, fontxdbcs14, and fontxdbcs24). +# Setting to "auto" enables Chinese/Japanese/Korean character rendering if a language file is loaded (or with "autodbcs" option set) in such cases. +# Possible values: true, false, 1, 0, auto. +# yen: Enables the Japanese yen symbol at 5ch if it is found at 7fh in a custom SBCS font for the Japanese DOS/V or JEGA emulation. +# fepcontrol: FEP control API for the DOS/V emulation. +# Possible values: ias, mskanji, both. +# vtext1: V-text screen mode 1 for the DOS/V emulation. Enter command "VTEXT 1" for this mode. Note that XGA/SXGA mode is only supported by the svga_s3trio and svga_et4000 machine types. +# Possible values: xga, xga24, sxga, sxga24, svga. +# vtext2: V-text screen mode 2 for the DOS/V emulation. Enter command "VTEXT 2" for this mode. Note that XGA/SXGA mode is only supported by the svga_s3trio and svga_et4000 machine types. +# Possible values: xga, xga24, sxga, sxga24, svga. +# use20pixelfont: Enables the 20 pixel font to be used instead of the 24 pixel system font for the Japanese DOS/V emulation (with V-text enabled). +# j3100: With the setting dosv=jp and a non-off value of this option, the Toshiba J-3100 machine will be emulated with DCGA support. +# Setting to "on" or "auto" starts J-3100 automatically, and with the setting "manual" you can enter J-3100 mode with DCGA command. +# Possible values: off, on, auto, manual, 0, 1, 2. +# j3100type: Specifies the Toshiba J-3100 machine type if J-3100 mode is enabled. The color palette will be changed with different machine types. +# Possible values: default, gt, sgt, gx, gl, sl, sgx, ss, gs, sx, sxb, sxw, sxp, ez, zs, zx. +# j3100colorscroll: Specifies that the color display can be used for scrolling, which is currently incompatible with for example the J-3100 version of the SimCity game. +# The VGA version of the Toshiba Windows 3.1 works fine with the "false" value of this setting, whereas its CGA/EGA version requires a "true" value for this. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> del; j3100backcolor; j3100textcolor +# +dosv = off +getsysfont = true +fontxsbcs = +fontxsbcs16 = +fontxsbcs24 = +fontxdbcs = +fontxdbcs14 = +fontxdbcs24 = +showdbcsnodosv = auto +yen = false +fepcontrol = both +vtext1 = svga +vtext2 = xga +use20pixelfont = false +j3100 = off +j3100type = default +j3100colorscroll = false + +[video] +# vmemsize: Amount of video memory in megabytes. +# The maximum resolution and color depth the svga_s3 will be able to display +# is determined by this value. +# -1: auto (vmemsizekb is ignored) +# 0: 512k (800x600 at 256 colors) if vmemsizekb=0 +# 1: 1024x768 at 256 colors or 800x600 at 64k colors +# 2: 1600x1200 at 256 colors or 1024x768 at 64k colors or 640x480 at 16M colors +# 4: 1600x1200 at 64k colors or 1024x768 at 16M colors +# 8: up to 1600x1200 at 16M colors +# For build engine games, use more memory than in the list above so it can +# use triple buffering and thus won't flicker. +# +# vmemsizekb: Amount of video memory in kilobytes, in addition to vmemsize. +# high intensity blinking: Set to false if you want to see high-intensity background colors instead of blinking foreground text. +# This option has no effect in PC-98 and some other video modes. +# memory io optimization 1: Enable one class of EGA/VGA memory I/O optimizations. Default ON (true). +# If graphical artifacts or errors occur, try turning this off first. May provide a performance benefit. +# scanline render on demand: Render video output at vsync or when something is changed mid frame, instead of stopping to render every scanline. +# May provide a performance benefit to most DOS games. However this may also break timing-dependent game or Demoscene effects. +# Default auto, which will turn if off for VGA modes and turn it on for SVGA modes. +# Possible values: true, false, 1, 0, auto. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> vmemdelay; vbe window granularity; vbe window size; enable 8-bit dac; svga lfb base; pci vga; vga attribute controller mapping; vga bios use rom image; vga bios rom image; vga bios size override; video bios dont duplicate cga first half rom font; video bios always offer 14-pixel high rom font; video bios always offer 16-pixel high rom font; video bios enable cga second half rom font; forcerate; sierra ramdac; sierra ramdac lock 565; vga fill active memory; page flip debug line; vertical retrace poll debug line; cgasnow; vga 3da undefined bits; rom bios 8x8 CGA font; rom bios video parameter table; int 10h points at vga bios; unmask timer on int 10 setmode; vesa bank switching window mirroring; vesa bank switching window range check; vesa zero buffer on get information; vesa set display vsync; vesa lfb base scanline adjust; vesa map non-lfb modes to 128kb region; ega per scanline hpel; allow hpel effects; allow hretrace effects; hretrace effect weight; vesa modelist cap; vesa modelist width limit; vesa modelist height limit; vesa vbe put modelist in vesa information; vesa vbe 1.2 modes are 32bpp; allow low resolution vesa modes; allow explicit 24bpp vesa modes; allow high definition vesa modes; allow unusual vesa modes; allow 32bpp vesa modes; allow 24bpp vesa modes; allow 16bpp vesa modes; allow 15bpp vesa modes; allow 8bpp vesa modes; allow 4bpp vesa modes; allow 4bpp packed vesa modes; allow tty vesa modes; double-buffered line compare; ignore vblank wraparound; ignore extended memory bit; enable vga resize delay; resize only on vga active display width increase; vga palette update on full load; ignore odd-even mode in non-cga modes; ignore sequencer blanking +# +vmemsize = -1 +vmemsizekb = 0 +high intensity blinking = true +memory io optimization 1 = true +scanline render on demand = auto + +[vsync] +# vsyncmode: Synchronize vsync timing to the host display. Requires calibration within DOSBox-X. +# Possible values: off, on, force, host. +# vsyncrate: Vsync rate used if vsync is enabled. Ignored if vsyncmode is set to host (win32). +# Possible values:. +vsyncmode = off +vsyncrate = 75 + +[cpu] +# core: CPU Core used in emulation. auto will switch to dynamic if available and appropriate. +# For the dynamic core, both dynamic_x86 and dynamic_rec are supported (dynamic_x86 is preferred). +# Windows 95 or other preemptive multitasking OSes will not work with the dynamic_rec core. +# Possible values: auto, dynamic, dynamic_x86, dynamic_nodhfpu, dynamic, dynamic_rec, normal, full, simple. +# fpu: Enable FPU emulation +# Possible values: true, false, 1, 0, auto, 8087, 287, 387. +# rdtsc rate: If nonzero, the Pentium RDTSC counter will tick at this rate per millisecond instead of by the cycle count +# segment limits: Enforce checks for segment limits on 80286 and higher CPU types. +# cputype: CPU Type used in emulation. "auto" emulates a 486 which tolerates Pentium instructions. +# "experimental" enables newer instructions not normally found in the CPU types emulated by DOSBox-X, such as FISTTP. +# Possible values: auto, 8086, 8086_prefetch, 80186, 80186_prefetch, 286, 286_prefetch, 386, 386_prefetch, 486old, 486old_prefetch, 486, 486_prefetch, pentium, pentium_mmx, ppro_slow, pentium_ii, pentium_iii, experimental. +# cycles: Number of instructions DOSBox-X tries to emulate each millisecond. +# Setting this value too high results in sound dropouts and lags. +# Cycles can be set in 3 ways: +# 'auto' tries to guess what a game needs. +# It usually works, but can fail for certain games. +# 'fixed #number' will set a fixed number of cycles. This is what you usually +# need if 'auto' fails (Example: fixed 4000). +# 'max' will allocate as much cycles as your computer is able to +# handle. Recommended if better performance is desired. +# Possible values: auto, fixed, max. +# cycleup: Amount of cycles to decrease/increase with the mapped keyboard shortcut. +# cycledown: Setting it lower than 100 will be a percentage. +# turbo: Enables Turbo (Fast Forward) mode to speed up operations. +# apmbios: Emulate Advanced Power Management (APM) BIOS calls. +# integration device: Enable DOSBox-X's integration I/O device, a way for additional software to talk to DOSBox-X. It is currently experimental. +# This can for example be used to return DOSBox-X's current status and by the guest OS to match the mouse pointer position. +# isapnpbios: Emulate ISA Plug & Play BIOS. Enable if using DOSBox-X to run a PnP aware DOS program or if booting Windows 9x. +# Do not disable if Windows 9x is configured around PnP devices, you will likely confuse it. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> cpuid string; processor serial number; double fault; clear trap flag on unhandled int 1; reset on triple fault; always report double fault; always report triple fault; mask stack pointer for enter leave instructions; allow lmsw to exit protected mode; report fdiv bug; enable msr; enable cmpxchg8b; enable syscall; ignore undefined msr; interruptible rep string op; dynamic core cache block size; cycle emulation percentage adjust; stop turbo on key; stop turbo after second; use dynamic core with paging on; ignore opcode 63; apmbios pnp; apm power button event; apmbios version; apmbios allow realmode; apmbios allow 16-bit protected mode; apmbios allow 32-bit protected mode; integration device pnp; isapnpport; realbig16 +# +core = full +fpu = true +rdtsc rate = 0 +segment limits = true +cputype = auto +cycles = auto +cycleup = 10 +cycledown = 20 +turbo = false +apmbios = true +integration device = false +isapnpbios = true + +[keyboard] +# aux: Enable emulation of the 8042 auxiliary port. PS/2 mouse emulation requires this to be enabled. +# You should enable this if you will be running Windows ME or any other OS that does not use the BIOS to receive mouse events. +# allow output port reset: If set (default), allow the application to reset the CPU through the keyboard controller. +# This option is required to allow Windows ME to reboot properly, whereas Windows 9x and earlier +# will reboot without this option using INT 19h +# controllertype: Type of keyboard controller (and keyboard) attached. +# auto Automatically pick according to machine type +# at AT (PS/2) type keyboard +# xt IBM PC/XT type keyboard +# pcjr IBM PCjr type keyboard (only if machine=pcjr) +# pc98 PC-98 keyboard emulation (only if machine=pc98) +# Possible values: auto, at, xt, pcjr, pc98. +# auxdevice: Type of PS/2 mouse attached to the AUX port +# Possible values: none, 2button, 3button, intellimouse, intellimouse45. +aux = true +allow output port reset = true +controllertype = auto +auxdevice = intellimouse + +[ttf] +# font: Specifies a TrueType font to use for the TTF output. If not specified, the built-in TrueType font will be used. +# Either a font name or full font path can be specified. If file ends with the .TTF extension then the extension can be omitted. +# For a font name or relative path, directories such as the working directory and default system font directory will be searched. +# For example, setting it to "consola" or "consola.ttf" will use Consola font (included in Windows); similar for other TTF fonts. +# Additionally, OTF fonts (e.g. OratorStd.otf), .FON fonts (e.g. vgasys.fon), and .TTC fonts (e.g. msgothic.ttc) are also supported. +# To display Chinese/Japanese/Korean text in these code pages, a font with CJK characters is needed (e.g. GNU Unifont or Sarasa Gothic). +# fontbold: You can optionally specify a bold TrueType font for use with the TTF output that will render the bold text style. +# It requires a word processor be set with the wp option, and this actual bold font will be used for the bold style. +# For example, setting it to "consolab" or "consolab.ttf" will use the Consolab font; similar for other TTF fonts. +# fontital: You can optionally specify an italic TrueType font for use with the TTF output that will render the italic text style. +# It requires a word processor be set with the wp option, and this actual italic font will be used for the italic style. +# For example, setting it to "consolai" or "consolai.ttf" will use the Consolai font; similar for other TTF fonts. +# fontboit: You can optionally specify a bold italic TrueType font for use with the TTF output that will render the bold italic text style. +# It requires a word processor be set with the wp option, and this actual bold-italic font will be used for the bold-italic style. +# For example, setting it to "consolaz" or "consolaz.ttf" will use the Consolaz font; similar for other TTF fonts. +# colors: Specifies a color scheme to use for the TTF output by supply all 16 color values in RGB: (r,g,b) or hexadecimal as in HTML: #RRGGBB +# The original DOS colors (0-15): #000000 #0000aa #00aa00 #00aaaa #aa0000 #aa00aa #aa5500 #aaaaaa #555555 #5555ff #55ff55 #55ffff #ff5555 #ff55ff #ffff55 #ffffff +# gray scaled color scheme: (0,0,0) #0e0e0e (75,75,75) (89,89,89) (38,38,38) (52,52,52) #717171 #c0c0c0 #808080 (28,28,28) (150,150,150) (178,178,178) (76,76,76) (104,104,104) (226,226,226) (255,255,255) +# An optional leading "+" sign allows the preset color scheme to be used when switching from another output. +# outputswitch: Specifies the output that DOSBox-X should switch to from the TTF output when a graphical mode is requested, or auto for automatic selection. +# Possible values: auto, surface, opengl, openglnb, openglhq, openglpp, direct3d. +# winperc: Specifies the window percentage for the TTF output (100 = full screen). Ignored if the ptsize setting is specified. +# ptsize: Specifies the font point size for the TTF output. If specified (minimum: 9), it will override the winperc setting. +# lins: Specifies the number of rows on the screen for the TTF output (0 = default). +# cols: Specifies the number of columns on the screen for the TTF output (0 = default). +# righttoleft: If set, DOSBox-X will display text from right to left instead of left to right on the screen for the TTF output. +# This is especially useful for languages which use right-to-left scripts (such as Arabic and Hebrew). +# wp: You can specify a word processor for the TTF output and optionally also a version number for the word processor. +# Supported word processors are WP=WordPerfect, WS=WordStar, XY=XyWrite, FE=FastEdit, and an optional version number. +# For example, WP6 will set the word processor as WordPerfect 6, and XY4 will set the word processor as XyWrite 4. +# Word processor-specific features like on-screen text styles and 512-character font will be enabled based on this. +# bold: If set, DOSBox-X will display bold text in visually (requires a word processor be set) for the TTF output. +# This is done either with the actual bold font specified by the fontbold option, or by making it bold automatically. +# italic: If set, DOSBox-X will display italicized text visually (requires a word processor be set) for the TTF output. +# This is done either with the actual italic font specified by the fontital option, or by slanting the characters automatically. +# underline: If set, DOSBox-X will display underlined text visually (requires a word processor be set) for the TTF output. +# strikeout: If set, DOSBox-X will display strikeout text visually (requires a word processor be set) for the TTF output. +# printfont: If set, DOSBox-X will force to use the current TrueType font (set via font option) for printing in addition to displaying. +# autodbcs: If set, DOSBox-X enables Chinese/Japanese/Korean DBCS (double-byte) characters when these code pages are active by default. +# Only applicable when using a DBCS code page (932: Japanese, 936: Simplified Chinese; 949: Korean; 950: Traditional Chinese) +# This applies to both the display and printing of these characters (see the [printer] section for details of the latter). +# blinkc: If set to true, the cursor blinks for the TTF output; setting it to false will turn the blinking off. +# You can also change the blinking rate by setting an integer between 1 (fastest) and 7 (slowest), or 0 for no cursor. +# gbk: Enables the GBK extension (in addition to the standard GB2312 charset) for the Simplified Chinese TTF output or DOS/V emulation. +# chinasea: Enables the ChinaSea and Big5-2003 extension (in addition to the standard Big5-1984 charset) for the Traditional Chinese TTF output. +# A TTF/OTF font containing such characters (such as the included SarasaGothicFixed TTF font) is needed to correctly render ChinaSea characters. +# dosvfunc: If set, enables FEP control to function for Japanese DOS/V applications, and changes the blinking of character attributes to high brightness. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> wpbg; wpfg; char512; autoboxdraw; halfwidthkana; uao +# +font = +fontbold = +fontital = +fontboit = +colors = +outputswitch = auto +winperc = 60 +ptsize = 0 +lins = 0 +cols = 0 +righttoleft = false +wp = +bold = true +italic = true +underline = true +strikeout = false +printfont = true +autodbcs = true +blinkc = true +gbk = false +chinasea = false +dosvfunc = false + +[voodoo] +# voodoo_card: Enable support for the 3dfx Voodoo card. +# Possible values: false, software, opengl, auto. +# voodoo_maxmem: Specify whether to enable maximum memory size for the Voodoo card. +# If set (on by default), the memory size will be 12MB (4MB front buffer + 2x4MB texture units) +# Otherwise, the memory size will be the standard 4MB (2MB front buffer + 1x2MB texture unit) +# glide: Enable Glide emulation (Glide API passthrough to the host). +# Requires a Glide wrapper - glide2x.dll (Windows), libglide2x.so (Linux), or libglide2x.dylib (macOS). +# lfb: Enable LFB access for Glide. OpenGlide does not support locking aux buffer, please use _noaux modes. +# Possible values: full, full_noaux, read, read_noaux, write, write_noaux, none. +# splash: Show 3dfx splash screen for Glide emulation (Windows; requires 3dfxSpl2.dll). +voodoo_card = auto +voodoo_maxmem = true +glide = false +lfb = full_noaux +splash = true + +[mixer] +# nosound: Enable silent mode, sound is still emulated though. +# sample accurate: Enable sample accurate mixing, at the expense of some emulation performance. Enable this option for DOS games and demos +# that require such accuracy for correct Tandy/OPL output including digitized speech. This option can also help eliminate +# minor errors in Gravis Ultrasound emulation that result in random echo/attenuation effects. +# swapstereo: Swaps the left and right stereo channels. +# rate: Mixer sample rate, setting any device's rate higher than this will probably lower their sound quality. +# blocksize: Mixer block size, larger blocks might help sound stuttering but sound will also be more lagged. +# Possible values: 1024, 2048, 4096, 8192, 512, 256. +# prebuffer: How many milliseconds of data to keep on top of the blocksize. +nosound = false +sample accurate = false +swapstereo = false +rate = 48000 +blocksize = 1024 +prebuffer = 25 + +[midi] +# mpu401: Type of MPU-401 to emulate. +# Possible values: intelligent, uart, none. +# mpubase: The IO address of the MPU-401. +# Set to 0 to use a default I/O address. +# 300h to 330h are for use with IBM PC mode. +# C0D0h to F8D0h (in steps of 800h) are for use with NEC PC-98 mode (MPU98). +# 80D2h through 80DEh are for use with NEC PC-98 Sound Blaster 16 MPU-401 emulation. +# If not assigned (0), 330h is the default for IBM PC and E0D0h is the default for PC-98. +# Possible values: 0, 300, 310, 320, 330, 332, 334, 336, 340, 360, c0d0, c8d0, d0d0, d8d0, e0d0, e8d0, f0d0, f8d0, 80d2, 80d4, 80d6, 80d8, 80da, 80dc, 80de. +# mididevice: Device that will receive the MIDI data from MPU-401. +# Possible values: default, win32, alsa, oss, coreaudio, coremidi, mt32, synth, fluidsynth, timidity, none. +# midiconfig: Special configuration options for the device driver. This is usually the id or part of the name of the device you want to use +# (find the id/name with mixer/listmidi). +# Or in the case of coreaudio or synth, you can specify a soundfont here. +# When using a Roland MT-32 rev. 0 as midi output device, some games may require a delay in order to prevent 'buffer overflow' issues. +# In that case, add 'delaysysex', for example: midiconfig=2 delaysysex +# See the README/Manual for more details. +# samplerate: Sample rate for MIDI synthesizer, if applicable. +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# mpuirq: MPU-401 IRQ. -1 to automatically choose. +# mt32.romdir: Name of the directory where MT-32 Control and PCM ROM files can be found. Emulation requires these files to work. +# Accepted file names are as follows: +# MT32_CONTROL.ROM or CM32L_CONTROL.ROM - control ROM file. +# MT32_PCM.ROM or CM32L_PCM.ROM - PCM ROM file. +# mt32.model: Model of the MT-32 synthesizer to use. +# Possible values: cm32l, mt32, auto. +# fluid.driver: Driver to use with Fluidsynth, not needed under Windows. Available drivers depend on what Fluidsynth was compiled with. +# Possible values: pulseaudio, alsa, oss, coreaudio, dsound, portaudio, sndman, jack, file, default. +# fluid.soundfont: Soundfont (.SF2 or .SF3) to use with Fluidsynth. One must be specified (e.g. GeneralUser_GS.sf2). +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> mt32.reverse.stereo; mt32.verbose; mt32.thread; mt32.chunk; mt32.prebuffer; mt32.partials; mt32.dac; mt32.analog; mt32.output.gain; mt32.reverb.mode; mt32.reverb.output.gain; mt32.reverb.time; mt32.reverb.level; mt32.rate; mt32.src.quality; mt32.niceampramp; mt32.engage.channel1; fluid.samplerate; fluid.gain; fluid.polyphony; fluid.cores; fluid.periods; fluid.periodsize; fluid.reverb; fluid.chorus; fluid.reverb.roomsize; fluid.reverb.damping; fluid.reverb.width; fluid.reverb.level; fluid.chorus.number; fluid.chorus.level; fluid.chorus.speed; fluid.chorus.depth; fluid.chorus.type +# +mpu401 = intelligent +mpubase = 0 +mididevice = default +midiconfig = +samplerate = 44100 +mpuirq = -1 +mt32.romdir = +mt32.model = auto +fluid.driver = default +fluid.soundfont = + +[sblaster] +# sbtype: Type of Sound Blaster to emulate. 'gb' is Game Blaster. +# Possible values: sb1, sb2, sbpro1, sbpro2, sb16, sb16vibra, gb, ess688, reveal_sc400, none. +# sbbase: The IO address of the Sound Blaster. +# 220h to 2E0h are for use with IBM PC Sound Blaster emulation. +# D2h to DEh are for use with NEC PC-98 Sound Blaster 16 emulation. +# Possible values: 220, 240, 260, 280, 2a0, 2c0, 2e0, d2, d4, d6, d8, da, dc, de. +# irq: The IRQ number of the Sound Blaster (usually 5 or 7, depending on the sound card type and the game). +# Set to 0 for the default setting of the sound card, or set to -1 to start DOSBox-X with the IRQ unassigned. +# Possible values: 7, 5, 3, 9, 10, 11, 12, 0, -1. +# listen to recording source: When the guest records audio from the Sound Blaster card, send the input source to the speakers as well so it can be heard. +# recording source: Audio source to use when guest is recording audio. At this time only generated audio sources are available. +# Possible values: silence, hiss, 1khz tone. +# dma: The DMA number of the Sound Blaster. Set to -1 to start DOSBox-X with the DMA unassigned. +# Possible values: 1, 5, 0, 3, 6, 7, -1. +# hdma: The High DMA number of the Sound Blaster. Set to -1 to start DOSBox-X with the High DMA unassigned. +# Possible values: 1, 5, 0, 3, 6, 7, -1. +# enable speaker: Start the DOS virtual machine with the Sound Blaster speaker enabled. +# Sound Blaster Pro and older cards have a speaker disable/enable command. +# Normally the card boots up with the speaker disabled. If a DOS game or demo +# attempts to play without enabling the speaker, set this option to true to +# compensate. This setting has no meaning if emulating a Sound Blaster 16 card. +# sbmixer: Allow the Sound Blaster mixer to modify the DOSBox-X mixer. +# oplmode: Type of OPL emulation. On 'auto' the mode is determined by the 'sbtype' setting. +# All OPL modes are AdLib-compatible, except for 'cms' (set 'sbtype=none' with 'cms' for a Game Blaster). +# Possible values: auto, cms, opl2, dualopl2, opl3, opl3gold, none, hardware, hardwaregb. +# oplemu: Provider for the OPL emulation. 'compat' might provide better quality. +# 'nuked' is the most accurate (but the most CPU-intensive). See oplrate as well. +# Possible values: default, compat, fast, nuked, mame, opl2board, opl3duoboard, retrowave_opl3. +# oplrate: Sample rate of OPL music emulation. Use 49716 for highest quality (set the mixer rate accordingly). +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# oplport: Serial port of the OPL2 Audio Board when oplemu=opl2board, opl2mode will become 'opl2' automatically. +# retrowave_bus: Bus of the Retrowave series board (serial/spi). SPI is only supported on Linux. +# retrowave_port: Serial port of the Retrowave series board. +# hardwarebase: base address of the real hardware Sound Blaster: +# 210,220,230,240,250,260,280 +# goldplay: Enable goldplay emulation. +# blaster environment variable: Whether or not to set the BLASTER environment variable automatically at startup +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> mindma; irq hack; dsp command aliases; pic unmask irq; enable asp; disable filtering; dsp write buffer status must return 0x7f or 0xff; pre-set sbpro stereo; adlib force timer overflow on detect; retrowave_spi_cs; force dsp auto-init; force goldplay; goldplay stereo; dsp require interrupt acknowledge; dsp write busy delay; sample rate limits; instant direct dac; stereo control with sbpro only; dsp busy cycle rate; dsp busy cycle always; dsp busy cycle duty; io port aliasing +# +sbtype = sb16 +sbbase = 220 +irq = 7 +listen to recording source = false +recording source = silence +dma = 1 +hdma = 5 +enable speaker = false +sbmixer = true +oplmode = auto +oplemu = default +oplrate = 44100 +oplport = +retrowave_bus = serial +retrowave_port = +hardwarebase = 220 +goldplay = true +blaster environment variable = true + +[gus] +# gus: Enable the Gravis Ultrasound emulation. +# gusrate: Sample rate of Ultrasound emulation. +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# gusmemsize: Amount of RAM on the Gravis Ultrasound in KB. Set to -1 for default. +# gus master volume: Master Gravis Ultrasound GF1 volume, in decibels. Reducing the master volume can help with games or demoscene productions where the music is too loud and clipping. +# gusbase: The IO base address of the Gravis Ultrasound. +# Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300, 210, 230, 250. +# gusirq: The IRQ number of the Gravis Ultrasound. +# Possible values: 5, 3, 7, 9, 10, 11, 12. +# gusdma: The DMA channel of the Gravis Ultrasound. +# Possible values: 3, 0, 1, 5, 6, 7. +# gustype: Type of Gravis Ultrasound to emulate. +# classic Original Gravis Ultrasound chipset +# classic37 Original Gravis Ultrasound with ICS Mixer (rev 3.7) +# max Gravis Ultrasound MAX emulation (with CS4231 codec) +# interwave Gravis Ultrasound Plug & Play (interwave) +# Possible values: classic, classic37, max, interwave. +# ultradir: Path to Ultrasound directory. In this directory +# there should be a MIDI directory that contains +# the patch files for GUS playback. Patch sets used +# with Timidity should work fine. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> autoamp; unmask dma; ignore channel count while active; pic unmask irq; startup initialized; dma enable on dma control polling; clear dma tc irq if excess polling; force master irq enable; gus panning table; gus fixed render rate; irq hack +# +gus = false +gusrate = 44100 +gusmemsize = -1 +gus master volume = 0.00 +gusbase = 240 +gusirq = 5 +gusdma = 3 +gustype = classic +ultradir = C:\ULTRASND + +[innova] +# innova: Enable the Innovation SSI-2001 emulation. +# samplerate: Sample rate of Innovation SSI-2001 emulation +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# sidbase: SID base port (typically 280h). +# Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300. +# quality: Set SID emulation quality level (0 to 3). +# Possible values: 0, 1, 2, 3. +innova = false +samplerate = 22050 +sidbase = 280 +quality = 0 + +[speaker] +# pcspeaker: Enable PC-Speaker emulation. +# pcrate: Sample rate of the PC-Speaker sound generation. +# Possible values: 65536, 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# tandy: Enable Tandy Sound System emulation. For 'auto', emulation is present only if machine is set to 'tandy'. +# Possible values: auto, on, off. +# tandyrate: Sample rate of the Tandy 3-Voice generation. +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# disney: Enable Disney Sound Source emulation. (Covox Voice Master and Speech Thing compatible). +# ps1audio: Enable PS1 audio emulation. +# Possible values: on, off. +# ps1audiorate: Sample rate of the PS1 audio emulation. +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> pcspeaker clock gate enable at startup; initial frequency +# +pcspeaker = true +pcrate = 65536 +tandy = auto +tandyrate = 44100 +disney = false +ps1audio = off +ps1audiorate = 22050 + +[joystick] +# joysticktype: Type of joystick to emulate: auto (default), +# none (disables joystick emulation), +# 2axis (supports two joysticks), +# 4axis (supports one joystick, first joystick used), +# 4axis_2 (supports one joystick, second joystick used), +# fcs (Thrustmaster), ch (CH Flightstick). +# auto chooses emulation depending on real joystick(s). +# (Remember to reset DOSBox-X's mapperfile if you saved it earlier) +# Possible values: auto, 2axis, 4axis, 4axis_2, fcs, ch, none. +# timed: enable timed intervals for axis. Experiment with this option, if your joystick drifts (away). +# autofire: continuously fires as long as you keep the button pressed. +# swap34: swap the 3rd and the 4th axis. can be useful for certain joysticks. +# buttonwrap: enable button wrapping at the number of emulated buttons. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> joy1deadzone1; joy1deadzone2; joy2deadzone1; joy1response1; joy1response2; joy2response1; joy1axis0; joy1axis1; joy1axis2; joy1axis3; joy1axis4; joy1axis5; joy1axis6; joy1axis7; joy2axis0; joy2axis1; joy2axis2; joy2axis3; joy2axis4; joy2axis5; joy2axis6; joy2axis7 +# +joysticktype = auto +timed = true +autofire = false +swap34 = false +buttonwrap = false + +[mapper] +# joy1deadzone0-: deadzone for joystick 1 axis 0- +# joy1deadzone0+: deadzone for joystick 1 axis 0+ +# joy1deadzone1-: deadzone for joystick 1 axis 1- +# joy1deadzone1+: deadzone for joystick 1 axis 1+ +# joy1deadzone2-: deadzone for joystick 1 axis 2- +# joy1deadzone2+: deadzone for joystick 1 axis 2+ +# joy1deadzone3-: deadzone for joystick 1 axis 3- +# joy1deadzone3+: deadzone for joystick 1 axis 3+ +# joy1deadzone4-: deadzone for joystick 1 axis 4- +# joy1deadzone4+: deadzone for joystick 1 axis 4+ +# joy1deadzone5-: deadzone for joystick 1 axis 5- +# joy1deadzone5+: deadzone for joystick 1 axis 5+ +# joy1deadzone6-: deadzone for joystick 1 axis 6- +# joy1deadzone6+: deadzone for joystick 1 axis 6+ +# joy1deadzone7-: deadzone for joystick 1 axis 7- +# joy1deadzone7+: deadzone for joystick 1 axis 7+ +# joy2deadzone0-: deadzone for joystick 2 axis 0- +# joy2deadzone0+: deadzone for joystick 2 axis 0+ +# joy2deadzone1-: deadzone for joystick 2 axis 1- +# joy2deadzone1+: deadzone for joystick 2 axis 1+ +# joy2deadzone2-: deadzone for joystick 2 axis 2- +# joy2deadzone2+: deadzone for joystick 2 axis 2+ +# joy2deadzone3-: deadzone for joystick 2 axis 3- +# joy2deadzone3+: deadzone for joystick 2 axis 3+ +# joy2deadzone4-: deadzone for joystick 2 axis 4- +# joy2deadzone4+: deadzone for joystick 2 axis 4+ +# joy2deadzone5-: deadzone for joystick 2 axis 5- +# joy2deadzone5+: deadzone for joystick 2 axis 5+ +# joy2deadzone6-: deadzone for joystick 2 axis 6- +# joy2deadzone6+: deadzone for joystick 2 axis 6+ +# joy2deadzone7-: deadzone for joystick 2 axis 7- +# joy2deadzone7+: deadzone for joystick 2 axis 7+ +joy1deadzone0- = 0.60 +joy1deadzone0+ = 0.60 +joy1deadzone1- = 0.60 +joy1deadzone1+ = 0.60 +joy1deadzone2- = 0.60 +joy1deadzone2+ = 0.60 +joy1deadzone3- = 0.60 +joy1deadzone3+ = 0.60 +joy1deadzone4- = 0.60 +joy1deadzone4+ = 0.60 +joy1deadzone5- = 0.60 +joy1deadzone5+ = 0.60 +joy1deadzone6- = 0.60 +joy1deadzone6+ = 0.60 +joy1deadzone7- = 0.60 +joy1deadzone7+ = 0.60 +joy2deadzone0- = 0.60 +joy2deadzone0+ = 0.60 +joy2deadzone1- = 0.60 +joy2deadzone1+ = 0.60 +joy2deadzone2- = 0.60 +joy2deadzone2+ = 0.60 +joy2deadzone3- = 0.60 +joy2deadzone3+ = 0.60 +joy2deadzone4- = 0.60 +joy2deadzone4+ = 0.60 +joy2deadzone5- = 0.60 +joy2deadzone5+ = 0.60 +joy2deadzone6- = 0.60 +joy2deadzone6+ = 0.60 +joy2deadzone7- = 0.60 +joy2deadzone7+ = 0.60 + +[serial] +# serial1: serial1-9 -- set type of device connected to the serial (COM) port. +# Can be disabled, dummy, file, modem, nullmodem, directserial. +# Additional parameters must be in the same line in the form of +# parameter:value. Parameter for all types is irq (optional). +# for file: specify an output file +# Additional parameters: +# timeout: = how long to wait before closing the file on inactivity (default:0), +# squote to use single quotes instead of double quotes for quoted program commands. +# shellhide to hide the command window when opening programs on the Windows platform. +# openwith:: start a program to open the output file. +# openerror:: start a program to open the output file if an error had occurred. +# multiplier:: Actual baud rate is the programmed rate times X to allow rates higher than 115200. +# Example: serial1=file file:output1.txt timeout:1000 openwith:notepad +# for directserial: realport (required), rxdelay (optional). +# (realport:COM1 realport:ttyS0). +# for modem: listenport (optional). +# for nullmodem: server, rxdelay, txdelay, telnet, usedtr, +# transparent, port, inhsocket, sock, nonlocal (all optional). +# connections are limited to localhost unless you specify nonlocal:1 +# "sock" parameter specifies the protocol to be used by both sides +# of the connection. 0 for TCP and 1 for ENet reliable UDP. +# Example: serial1=modem listenport:5000 sock:1 +# Note: COM1-4 are standard COM ports in DOS, whereas COM5-9 are extended COM ports. +# You can optionally specify base addresses and IRQs for them with base: and irq: options. +# Serial port settings can also be changed via the built-in SERIAL command. +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial2: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial3: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial4: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial5: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial6: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial7: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial8: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial9: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# phonebookfile: File used to map fake phone numbers to addresses. +serial1 = dummy +serial2 = dummy +serial3 = disabled +serial4 = disabled +serial5 = disabled +serial6 = disabled +serial7 = disabled +serial8 = disabled +serial9 = disabled +phonebookfile = phonebook-dosbox-x.txt + +[parallel] +# parallel1: parallel1-9 -- set type of device connected to the parallel (LPT) port. +# Can be: +# reallpt (direct parallel port passthrough), +# file (records data to a file or passes it to a device), +# printer (virtual dot-matrix printer, see [printer] section) +# disney (attach Disney Sound Source emulation to this port) +# Additional parameters must be in the same line in the form of +# parameter:value. +# for reallpt: +# Windows and DOS: +# realbase (the base address of your real parallel port). +# Default: 378 +# ecpbase (address of the ECP Extended Control register, optional). +# BSD: same as Windows (requires root access / setuid root). +# Linux: same as Windows (requires root access / setuid root) or: +# realport (the parallel port device e.g. /dev/parport0). +# for file: +# dev: (i.e. dev:lpt1) to forward data to a device, +# or append: appends data to the specified file. +# Without the above parameters data is written to files in the capture dir. +# Additional parameters: +# timeout: = how long to wait before closing the file on inactivity (default:0 or 500), +# squote to use single quotes instead of double quotes for quoted program commands. +# shellhide to hide the command window when opening programs on the Windows platform. +# addFF to add a formfeed when closing, addLF to add a linefeed if the app doesn't. +# cp: to perform codepage translation, i.e. cp:437 +# openps:: start a program to open the file if the print output is detected to be PostScript. +# openpcl:: start a program to open the file if the print output is detected to be PCL. +# openwith:: start a program to open the file in all other conditions. +# openerror:: start a program to open the file if an error had occurred. +# Example: parallel1=file file:output1.prn timeout:1000 openpcl:pcl6 openps:gswin32c openwith:notepad +# for printer: +# printer still has its own configuration section above. +# Note: LPT1-3 are standard LPT ports in DOS, whereas LPT4-9 are extended LPT ports. +# You can optionally specify base addresses and IRQs for them with base: and irq: options. +# Parallel port settings can also be changed via the built-in PARALLEL command. +# parallel2: see parallel1 +# parallel3: see parallel1 +# parallel4: see parallel1 +# parallel5: see parallel1 +# parallel6: see parallel1 +# parallel7: see parallel1 +# parallel8: see parallel1 +# parallel9: see parallel1 +# dongle: Enable dongle +parallel1 = printer +parallel2 = disabled +parallel3 = disabled +parallel4 = disabled +parallel5 = disabled +parallel6 = disabled +parallel7 = disabled +parallel8 = disabled +parallel9 = disabled +dongle = false + +[printer] +# printer: Enable printer emulation. +# dpi: Resolution of printer (default 360). +# width: Width of paper in 1/10 inch (default 85 = 8.5''). +# height: Height of paper in 1/10 inch (default 110 = 11.0''). +# printoutput: Output method for finished pages: +# png : Creates PNG images (default) +# ps : Creates PostScript +# bmp : Creates BMP images (very huge files, not recommended) +# printer : Send to an actual printer in Windows (specify a printer, or Print dialog will appear) +# multipage: Adds all pages to one PostScript file or printer job until CTRL-F2 is pressed. +# device: Specify the Windows printer device to use. You can see the list of devices from the Help +# menu ('List printer devices') or the Status Window. Then make your choice and put either +# the printer device number (e.g. 2) or your printer name (e.g. Microsoft Print to PDF). +# Leaving it empty will show the Windows Print dialog (or '-' for showing once). +# docpath: The path (directory) where the output files are stored. +# fontpath: The path (directory) where the printer fonts (courier.ttf, ocra.ttf, roman.ttf, sansserif.ttf, script.ttf) are located. +# openwith: Start the specified program to open the output file. +# openerror: Start the specified program to open the output file if an error had occurred. +# printdbcs: Allows DOSBox-X to print Chinese/Japanese/Korean DBCS (double-byte) characters when these code pages are active. +# If set to auto (default), this is enabled only for the TrueType font (TTF) output with the DBCS support enabled. +# Only applicable when using a DBCS code page (932: Japanese, 936: Simplified Chinese; 949: Korean; 950: Traditional Chinese) +# Possible values: true, false, 1, 0, auto. +# shellhide: If set, the command window will be hidden for openwith/openerror options on the Windows platform. +# timeout: (in milliseconds) if nonzero: the time the page will be ejected automatically after when no more data arrives at the printer. +printer = true +dpi = 360 +width = 85 +height = 110 +printoutput = png +multipage = false +device = - +docpath = . +fontpath = FONTS +openwith = +openerror = +printdbcs = auto +shellhide = false +timeout = 0 + +[dos] +# xms: Enable XMS support. +# xms handles: Number of XMS handles available for the DOS environment, or 0 to use a reasonable default +# shell configuration as commands: Allow entering dosbox-x.conf configuration parameters as shell commands to get and set settings. +# This is disabled by default to avoid conflicts between commands and executables. +# It is recommended to get and set dosbox-x.conf settings using the CONFIG command instead. +# Compatibility with DOSBox SVN can be improved by enabling this option. +# hma: Report through XMS that HMA exists (not necessarily available) +# hard drive data rate limit: Slow down (limit) hard disk throughput. This setting controls the limit in bytes/second. +# Set to 0 to disable the limit, or -1 (default) to use a reasonable limit. +# The disk I/O performance as in DOSBox SVN can be achieved by setting this to 0. +# floppy drive data rate limit: Slow down (limit) floppy disk throughput. This setting controls the limit in bytes/second. +# Set to 0 to disable the limit, or -1 (default) to use a reasonable limit. +# The disk I/O performance as in DOSBox SVN can be achieved by setting this to 0. +# ansi.sys: If set (by default), ANSI.SYS emulation is on. If clear, ANSI.SYS is not emulated and will not appear to be installed. +# NOTE: This option has no effect in PC-98 mode where MS-DOS systems integrate ANSI.SYS into the DOS kernel. +# log console: If set, log DOS CON output to the log file. Setting to "quiet" will log DOS CON output only (no debugging output). +# Possible values: true, false, 1, 0, quiet. +# share: Reports SHARE.EXE as resident and provides functions such as file-locking and record-locking, although not all SHARE functions are emulated. +# file access tries: If a positive integer is set, DOSBox-X will try to read/write/lock files directly on mounted local drives for the specified number of times without caching before failing on Windows systems. +# For networked database applications (e.g. dBase, FoxPro, etc), it is strongly recommended to set this to e.g. 3 for correct operations. +# network redirector: Report DOS network redirector as resident. This will allow the host name to be returned unless the secure mode is enabled. +# You can also directly access UNC network paths in the form \\MACHINE\SHARE even if they are not mounted as drives on Windows systems. +# Set either "ipx=true" in [ipx] section or "ne2000=true" in [ne2000] section for a full network redirector environment. +# minimum mcb free: Minimum free segment value to leave free. At startup, the DOS kernel will allocate memory +# up to this point. This can be used to deal with EXEPACK issues or DOS programs that cannot +# be loaded too low in memory. If you want more free conventional memory to be reported, +# you can for example set its value to 1. +# ems: Enable EMS support. The default (=true) provides the best +# compatibility but certain applications may run better with +# other choices, or require EMS support to be disabled (=false) +# to work at all. +# Possible values: true, emsboard, emm386, false, 1, 0. +# umb: Enable UMB support. +# quick reboot: If set, the DOS restart call will reboot the emulated DOS (integrated DOS or guest DOS) instead of the virtual machine. +# +# ver: Set DOS version. Specify as major.minor format. A single number is treated as the major version (compatible with LFN support). Common settings are: +# auto (or unset) Pick DOS kernel version 5.0 (DOSBox default) +# 3.3 MS-DOS 3.3 emulation (not tested!) +# 5.0 MS-DOS 5.0 emulation (recommended for DOS gaming) +# 6.22 MS-DOS 6.22 emulation +# 7.0 MS-DOS 7.0 (or Windows 95 pure DOS mode) emulation +# 7.1 MS-DOS 7.1 (or Windows 98 pure DOS mode) emulation +# Long filename (LFN) support will be enabled with a reported DOS version of 7.0 or higher with "lfn=auto" (default). +# Similarly, FAT32 disk images will be supported with a reported DOS version of 7.1 or higher. +# +# lfn: Enable long filename support. If set to auto (default), LFN support is enabled if the reported DOS version is at least 7.0. +# If set to autostart, the built-in VER command won't activate/deactivate LFN support according to the reported DOS version. +# Possible values: true, false, 1, 0, auto, autostart. +# fat32setversion: Whether DOSBox-X should automatically set the reported DOS version to 7.0/7.10 when it is less than 7.0/7.10 and mounting LBA/FAT32 disk images is requested. +# If set to "ask", a popup message will show up to ask whether DOSBox-X should automatically change the reported DOS version in order to mount the disk image. +# Possible values: ask, auto, manual. +# shellhigh: Load the DOSBox-X command shell into the upper memory when the UMB is available. +# If set to auto (default), it is enabled if the reported DOS version is at least 7.0. +# Possible values: true, false, 1, 0, auto. +# automount: Enable automatic drive mounting in Windows. +# automountall: Automatically mount all available Windows drives at start. +# Possible values: true, false, 1, 0, quiet. +# mountwarning: If set, a warning message will be displayed while trying to auto-mount your Windows host drives. +# autofixwarning: If set to true or both, DOSBox-X shows messages while trying to automatically fix the "Packed file is corrupt" error. +# If set to false or none, DOSBox-X will not show such messages on the screen when the error occurred. +# If set to "a20fix" or "loadfix", DOSBox-X will show the message for the a20fix or the loadfix only. +# Possible values: true, false, 1, 0, both, a20fix, loadfix, none. +# startcmd: Enable START command to start programs to run on the host system. On Windows host programs or commands may also be launched directly. +# starttranspath: Specify whether DOSBox-X should automatically translate all paths in the command-line to host system paths when starting programs to run on the host system. +# startwait: Specify whether DOSBox-X should wait for the host system applications after they are started. +# startquiet: If set, before launching host system applications to run on the host DOSBox-X will not show messages like "Now run it as a Windows application". +# vmware: Enable VMware interface emulation including guest mouse integration (when used along with e.g. VMware mouse driver for Windows 3.x). +# int33: Enable INT 33H for mouse support. +# mouse report rate: Mouse reporting rate, or 0 for auto. This affects how often mouse events are reported to the guest through the mouse interrupt. +# Some games including CyClone need a lower reporting rate to function correctly. Auto mode allows the guest to change the report rate through the PS/2 mouse emulation. +# This option does not affect any DOS game that uses polling through INT 33h to detect mouse movement. +# keyboardlayout: Language code of the keyboard layout (or none). +# customcodepage: Set a custom code page for CHCP command and specify a SBCS code page file, following the standard SBCS code page format. +# Examples of SBCS code pages are available from the Unicode Consortium website: https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/ +# dbcs: Enable DBCS table and Chinese, Japanese, Korean support for the TrueType font (TTF) output. +# CAUTION: Some software will crash without the DBCS table, including the Open Watcom installer. +# dos clipboard device enable: If enabled, a DOS device will be added for bidirectional communications with the shared clipboard. +# Setting to "read" will only allow read access, and setting to "write" will only allow write access. +# Setting to "full" or "true" enables both; setting to "false" or "disabled" disables the access or device. +# The default device name is CLIP$, but can be changed with the "dos clipboard device name" setting below. +# dos clipboard device name: Set DOS device name (up to 8 characters) for bidirectional communications with the shared clipboard. +# If unset or invalid, the default name CLIP$ will be used (e.g. "TYPE CLIP$" shows the clipboard contents). +# It has no effect if "dos clipboard device enable" is disabled, and it is deactivated if the secure mode is enabled. +# dos clipboard api: If set, DOS APIs for communications with the Windows clipboard will be enabled for shared clipboard communications. +# dos idle api: If set, DOSBox-X can lower the host system's CPU load when a supported guest program is idle. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> badcommandhandler; mscdex device name; hma allow reservation; command shell flush keyboard buffer; special operation file prefix; drive z is remote; drive z convert fat; drive z expand path; drive z hide files; hidenonrepresentable; hma minimum allocation; dos sda size; hma free space; cpm compatibility mode; minimum dos initial private segment; minimum mcb segment; enable dummy device mcb; maximum environment block size on exec; additional environment block size on exec; enable a20 on windows init; zero memory on xms memory allocation; vcpi; unmask timer on disk io; zero int 67h if no ems; zero unused int 68h; emm386 startup active; zero memory on ems memory allocation; ems system handle memory size; ems system handle on even megabyte; umb start; umb end; kernel allocation in umb; keep umb on boot; keep private area on boot; private area in umb; autoa20fix; autoloadfix; startincon; int33 hide host cursor if interrupt subroutine; int33 hide host cursor when polling; int33 disable cell granularity; int 13 disk change detect; int 13 extensions; biosps2; int15 wait force unmask irq; int15 mouse callback does not preserve registers; filenamechar; collating and uppercase; con device use int 16h to detect keyboard input; zero memory on int 21h memory allocation; pipe temporary device +# +xms = false +xms handles = 0 +shell configuration as commands = false +hma = false +hard drive data rate limit = -1 +floppy drive data rate limit = -1 +ansi.sys = true +log console = false +share = true +file access tries = 0 +network redirector = true +minimum mcb free = 0 +ems = true +umb = true +quick reboot = false +ver = +lfn = auto +fat32setversion = ask +shellhigh = auto +automount = true +automountall = false +mountwarning = true +autofixwarning = false +startcmd = false +starttranspath = true +startwait = true +startquiet = false +vmware = true +int33 = true +mouse report rate = 0 +keyboardlayout = auto +customcodepage = +dbcs = true +dos clipboard device enable = false +dos clipboard device name = CLIP$ +dos clipboard api = true +dos idle api = true + +[ipx] +# ipx: Enable ipx over UDP/IP emulation. +ipx = false + +[ne2000] +# ne2000: Enable NE2000 Ethernet emulation. Either pcap or slirp backend can be used, switchable via "backend" option. +# Settings for the pcap and slirp backends can be found in the [ethernet, pcap] and [ethernet, slirp] sections. +# Once properly set, load the NE2000 packet driver inside DOSBox-X with base address and interrupt specified below. +# nicbase: The base address of the NE2000 board. +# nicirq: The interrupt it uses. Note serial2 uses IRQ3 as default. +# macaddr: The MAC address the emulator will use for its network adapter. +# If you have multiple DOSBox-Xes running on the same network, +# this has to be changed for each. AC:DE:48 is an address range reserved for +# private use, so modify the last three number blocks, e.g. AC:DE:48:88:99:AB. +# backend: The backend (either pcap or slirp is supported) used for the NE2000 Ethernet emulation. +# If set to "auto", then "slirp" is selected when available, otherwise "pcap" is selected when available. +# NE2000 Ethernet emulation will be disabled if no backend is available (or the specified backend if unavailable). +# Possible values: pcap, slirp, auto, none. +ne2000 = false +nicbase = 300 +nicirq = 3 +macaddr = AC:DE:48:88:99:AA +backend = auto + +[ethernet, pcap] +# realnic: Specifies which of your host network interfaces is used for pcap. +# Write 'list' here to see the list of devices from the Help +# menu ('List network interfaces') or from the Status Window. +# Then make your choice and put either the interface number +# (e.g. 2) or a part of your adapters name (e.g. VIA here). +# timeout: Specifies the read timeout for the device in milliseconds for the pcap backend, or the default value will be used. +realnic = list +timeout = default + +[ethernet, slirp] +# ipv4_network: The IPv4 network the guest and host services are on. +# ipv4_netmask: The netmask for the IPv4 network. +# ipv4_host: The address of the guest on the IPv4 network. +# ipv4_nameserver: The address of the nameserver service provided by the host on the IPv4 network. +# ipv4_dhcp_start: The start address used for DHCP by the host services on the IPv4 network. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> restricted; disable_host_loopback; mtu; mru; tcp_port_forwards; udp_port_forwards +# +ipv4_network = 10.0.2.0 +ipv4_netmask = 255.255.255.0 +ipv4_host = 10.0.2.2 +ipv4_nameserver = 10.0.2.3 +ipv4_dhcp_start = 10.0.2.15 + +[ide, primary] +# enable: Enable IDE interface +# pnp: List IDE device in ISA PnP BIOS enumeration +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> irq; io; altio; int13fakeio; int13fakev86io; enable pio32; ignore pio32; cd-rom spinup time; cd-rom spindown timeout; cd-rom insertion delay +# +enable = true +pnp = true + +[ide, secondary] +enable = true +pnp = true + +[ide, tertiary] +enable = false +pnp = true + +[ide, quaternary] +enable = false +pnp = true + +[ide, quinternary] +enable = false +pnp = true + +[ide, sexternary] +enable = false +pnp = true + +[ide, septernary] +enable = false +pnp = true + +[ide, octernary] +enable = false +pnp = true + +[fdc, primary] +# enable: Enable floppy controller interface +# pnp: List floppy controller in ISA PnP BIOS enumeration +# mode: Floppy controller mode. What the controller acts like. +# ps2 PS/2 mode (most common) +# ps2_model30 PS/2 model 30 +# at AT mode +# xt PC/XT mode +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> irq; io; dma; int13fakev86io; instant mode; auto-attach to int 13h; chip +# +enable = false +pnp = true +mode = ps2 + +[4dos] +rem = This section is the 4DOS.INI file, if you use 4DOS as the command shell + +[config] +# rem: Records comments (remarks). +# break: Sets or clears extended CTRL+C checking. +# Possible values: on, off. +# numlock: Sets the initial state of the NumLock key. +# Possible values: on, off. +# shell: Specifies the command shell (COMMAND.COM or 4DOS.COM). +# dos: Reports whether DOS occupies HMA and allocates UMB memory (if available). +# fcbs: Number of FCB handles available to DOS programs (1-255). +# files: Number of file handles available to DOS programs (8-255). +# country: Country code for date/time/decimal formats and optionally code page for TTF output and language files. +# lastdrive: The maximum drive letter (A-Z) that can be accessed by programs. +# Possible values: a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z. +rem = This section is DOS's CONFIG.SYS file, not all CONFIG.SYS options supported +break = off +numlock = +shell = +dos = +fcbs = 100 +files = 200 +country = +lastdrive = a +set path = Z:\;Z:\SYSTEM;Z:\BIN;Z:\DOS;Z:\4DOS;Z:\DEBUG;Z:\TEXTUTIL +set prompt = $P$G +set temp = +install = +installhigh = +device = +devicehigh = + +[autoexec] +# Lines in this section will be run at startup. +# You can put your MOUNT lines here. + diff --git a/include/alloc.h b/include/alloc.h new file mode 100644 index 0000000..cfe74af --- /dev/null +++ b/include/alloc.h @@ -0,0 +1,23 @@ +#ifndef ALLOC +#define ALLOC + +#include +#include + +typedef struct malloc_entry { + void* ptr; + uint32_t size; + #define MALLOC_USED 1 + #define MALLOC_FREE 0 + uint8_t state; +} __attribute__((packed)) malloc_entry; + +void init_hashtable(); +void* malloc(uint32_t size); +void free(void* ptr); +void* realloc(void* ptr, uint32_t size); +/* +extern void* malloc_base_pointer; +extern unsigned int highest_size; +*/ +#endif diff --git a/include/ata-pio.h b/include/ata-pio.h new file mode 100644 index 0000000..78eb14c --- /dev/null +++ b/include/ata-pio.h @@ -0,0 +1,36 @@ +#ifndef ATA_PIO +#define ATA_PIO +#include +#include + +// register stuff +#define ATA_IO_BASE 0x1F0 + +#define ATA_CONTROL_BASE 0x3F0 + +#define ATA_SECONDARY_OFFSET 128 + +#define ATA_DATA_REGISTER 0 +#define ATA_ERROR_REGISTER 1 +#define ATA_FEATURES_REGISTER 1 +#define ATA_SECTOR_COUNT_REGISTER 2 +#define ATA_SECTOR_REGISTER 3 +#define ATA_CYL_LOW_REGISTER 4 +#define ATA_CYL_HIGH_REGISTER 5 +#define ATA_DRIVE_REGISTER 6 +#define ATA_STATUS_REGISTER 7 +#define ATA_COMMAND_REGISTER 7 + +#define ATA_ALTERNATE_STATUS_REGISTER 0 +#define ATA_DEVICE_CONTROL_REGISTER 0 +#define ATA_DRIVE_ADDRESS_REGISTER 1 + +// bitfield stuff + +// declarations +int ata_init(uint8_t bus, uint8_t drive); +int ata_read(uint8_t bus, uint8_t drive, uint16_t* buf, uint16_t sectors, uint16_t lba_high, uint32_t lba_low); +int ata_write(uint8_t bus, uint8_t drive, uint16_t* buf, uint16_t sectors, uint16_t lba_high, uint32_t lba_low); +extern uint16_t ata_identify[256]; + +#endif diff --git a/include/interrupt.h b/include/interrupt.h new file mode 100644 index 0000000..3fa4c39 --- /dev/null +++ b/include/interrupt.h @@ -0,0 +1,38 @@ +#ifndef INTERRUPT +#define INTERRUPT + +extern uint8_t isr_base[]; + +typedef struct { + uint16_t lo; + uint16_t sel; + uint8_t reserved; + uint8_t flags; + uint16_t hi; +} __attribute__((packed)) idt_gate; + +typedef struct { + uint16_t limit; + idt_gate* base; +} __attribute__((packed)) idtrc; + +typedef struct { + uint32_t ds; + uint32_t edi, esi, ebp, uesp, ebx, edx, ecx, eax; + uint32_t ino, err; + uint32_t eip, cs, eflags, esp, ss; +} registers; + +extern idtrc idtr; +extern idt_gate idt[256]; + +typedef void (*isr)(registers*); +void regint(uint8_t ino, isr i); +void set_idt(uint8_t n, uint32_t i); +void lidt(); +void isr_init(); +void isr_handler(registers* r); +void noint(registers* r); + + +#endif diff --git a/include/isr.i b/include/isr.i new file mode 100644 index 0000000..fd2cbf3 --- /dev/null +++ b/include/isr.i @@ -0,0 +1,1280 @@ + +i0: cli +push byte 0 +push dword strict 0 +jmp strict near isr + +i1: cli +push byte 0 +push dword strict 1 +jmp strict near isr + +i2: cli +push byte 0 +push dword strict 2 +jmp strict near isr + +i3: cli +push byte 0 +push dword strict 3 +jmp strict near isr + +i4: cli +push byte 0 +push dword strict 4 +jmp strict near isr + +i5: cli +push byte 0 +push dword strict 5 +jmp strict near isr + +i6: cli +push byte 0 +push dword strict 6 +jmp strict near isr + +i7: cli +push byte 0 +push dword strict 7 +jmp strict near isr + +i8: cli +push dword strict 8 +jmp strict near isr +cs nop + +i9: cli +push byte 0 +push dword strict 9 +jmp strict near isr + +i10: cli +push dword strict 10 +jmp strict near isr +cs nop + +i11: cli +push dword strict 11 +jmp strict near isr +cs nop + +i12: cli +push dword strict 12 +jmp strict near isr +cs nop + +i13: cli +push dword strict 13 +jmp strict near isr +cs nop + +i14: cli +push dword strict 14 +jmp strict near isr +cs nop + +i15: cli +push byte 0 +push dword strict 15 +jmp strict near isr + +i16: cli +push byte 0 +push dword strict 16 +jmp strict near isr + +i17: cli +push dword strict 17 +jmp strict near isr +cs nop + +i18: cli +push byte 0 +push dword strict 18 +jmp strict near isr + +i19: cli +push byte 0 +push dword strict 19 +jmp strict near isr + +i20: cli +push byte 0 +push dword strict 20 +jmp strict near isr + +i21: cli +push dword strict 21 +jmp strict near isr +cs nop + +i22: cli +push byte 0 +push dword strict 22 +jmp strict near isr + +i23: cli +push byte 0 +push dword strict 23 +jmp strict near isr + +i24: cli +push byte 0 +push dword strict 24 +jmp strict near isr + +i25: cli +push byte 0 +push dword strict 25 +jmp strict near isr + +i26: cli +push byte 0 +push dword strict 26 +jmp strict near isr + +i27: cli +push byte 0 +push dword strict 27 +jmp strict near isr + +i28: cli +push byte 0 +push dword strict 28 +jmp strict near isr + +i29: cli +push dword strict 29 +jmp strict near isr +cs nop + +i30: cli +push dword strict 30 +jmp strict near isr +cs nop + +i31: cli +push byte 0 +push dword strict 31 +jmp strict near isr + +i32: cli +push byte 0 +push dword strict 32 +jmp strict near isr + +i33: cli +push byte 0 +push dword strict 33 +jmp strict near isr + +i34: cli +push byte 0 +push dword strict 34 +jmp strict near isr + +i35: cli +push byte 0 +push dword strict 35 +jmp strict near isr + +i36: cli +push byte 0 +push dword strict 36 +jmp strict near isr + +i37: cli +push byte 0 +push dword strict 37 +jmp strict near isr + +i38: cli +push byte 0 +push dword strict 38 +jmp strict near isr + +i39: cli +push byte 0 +push dword strict 39 +jmp strict near isr + +i40: cli +push byte 0 +push dword strict 40 +jmp strict near isr + +i41: cli +push byte 0 +push dword strict 41 +jmp strict near isr + +i42: cli +push byte 0 +push dword strict 42 +jmp strict near isr + +i43: cli +push byte 0 +push dword strict 43 +jmp strict near isr + +i44: cli +push byte 0 +push dword strict 44 +jmp strict near isr + +i45: cli +push byte 0 +push dword strict 45 +jmp strict near isr + +i46: cli +push byte 0 +push dword strict 46 +jmp strict near isr + +i47: cli +push byte 0 +push dword strict 47 +jmp strict near isr + +i48: cli +push byte 0 +push dword strict 48 +jmp strict near isr + +i49: cli +push byte 0 +push dword strict 49 +jmp strict near isr + +i50: cli +push byte 0 +push dword strict 50 +jmp strict near isr + +i51: cli +push byte 0 +push dword strict 51 +jmp strict near isr + +i52: cli +push byte 0 +push dword strict 52 +jmp strict near isr + +i53: cli +push byte 0 +push dword strict 53 +jmp strict near isr + +i54: cli +push byte 0 +push dword strict 54 +jmp strict near isr + +i55: cli +push byte 0 +push dword strict 55 +jmp strict near isr + +i56: cli +push byte 0 +push dword strict 56 +jmp strict near isr + +i57: cli +push byte 0 +push dword strict 57 +jmp strict near isr + +i58: cli +push byte 0 +push dword strict 58 +jmp strict near isr + +i59: cli +push byte 0 +push dword strict 59 +jmp strict near isr + +i60: cli +push byte 0 +push dword strict 60 +jmp strict near isr + +i61: cli +push byte 0 +push dword strict 61 +jmp strict near isr + +i62: cli +push byte 0 +push dword strict 62 +jmp strict near isr + +i63: cli +push byte 0 +push dword strict 63 +jmp strict near isr + +i64: cli +push byte 0 +push dword strict 64 +jmp strict near isr + +i65: cli +push byte 0 +push dword strict 65 +jmp strict near isr + +i66: cli +push byte 0 +push dword strict 66 +jmp strict near isr + +i67: cli +push byte 0 +push dword strict 67 +jmp strict near isr + +i68: cli +push byte 0 +push dword strict 68 +jmp strict near isr + +i69: cli +push byte 0 +push dword strict 69 +jmp strict near isr + +i70: cli +push byte 0 +push dword strict 70 +jmp strict near isr + +i71: cli +push byte 0 +push dword strict 71 +jmp strict near isr + +i72: cli +push byte 0 +push dword strict 72 +jmp strict near isr + +i73: cli +push byte 0 +push dword strict 73 +jmp strict near isr + +i74: cli +push byte 0 +push dword strict 74 +jmp strict near isr + +i75: cli +push byte 0 +push dword strict 75 +jmp strict near isr + +i76: cli +push byte 0 +push dword strict 76 +jmp strict near isr + +i77: cli +push byte 0 +push dword strict 77 +jmp strict near isr + +i78: cli +push byte 0 +push dword strict 78 +jmp strict near isr + +i79: cli +push byte 0 +push dword strict 79 +jmp strict near isr + +i80: cli +push byte 0 +push dword strict 80 +jmp strict near isr + +i81: cli +push byte 0 +push dword strict 81 +jmp strict near isr + +i82: cli +push byte 0 +push dword strict 82 +jmp strict near isr + +i83: cli +push byte 0 +push dword strict 83 +jmp strict near isr + +i84: cli +push byte 0 +push dword strict 84 +jmp strict near isr + +i85: cli +push byte 0 +push dword strict 85 +jmp strict near isr + +i86: cli +push byte 0 +push dword strict 86 +jmp strict near isr + +i87: cli +push byte 0 +push dword strict 87 +jmp strict near isr + +i88: cli +push byte 0 +push dword strict 88 +jmp strict near isr + +i89: cli +push byte 0 +push dword strict 89 +jmp strict near isr + +i90: cli +push byte 0 +push dword strict 90 +jmp strict near isr + +i91: cli +push byte 0 +push dword strict 91 +jmp strict near isr + +i92: cli +push byte 0 +push dword strict 92 +jmp strict near isr + +i93: cli +push byte 0 +push dword strict 93 +jmp strict near isr + +i94: cli +push byte 0 +push dword strict 94 +jmp strict near isr + +i95: cli +push byte 0 +push dword strict 95 +jmp strict near isr + +i96: cli +push byte 0 +push dword strict 96 +jmp strict near isr + +i97: cli +push byte 0 +push dword strict 97 +jmp strict near isr + +i98: cli +push byte 0 +push dword strict 98 +jmp strict near isr + +i99: cli +push byte 0 +push dword strict 99 +jmp strict near isr + +i100: cli +push byte 0 +push dword strict 100 +jmp strict near isr + +i101: cli +push byte 0 +push dword strict 101 +jmp strict near isr + +i102: cli +push byte 0 +push dword strict 102 +jmp strict near isr + +i103: cli +push byte 0 +push dword strict 103 +jmp strict near isr + +i104: cli +push byte 0 +push dword strict 104 +jmp strict near isr + +i105: cli +push byte 0 +push dword strict 105 +jmp strict near isr + +i106: cli +push byte 0 +push dword strict 106 +jmp strict near isr + +i107: cli +push byte 0 +push dword strict 107 +jmp strict near isr + +i108: cli +push byte 0 +push dword strict 108 +jmp strict near isr + +i109: cli +push byte 0 +push dword strict 109 +jmp strict near isr + +i110: cli +push byte 0 +push dword strict 110 +jmp strict near isr + +i111: cli +push byte 0 +push dword strict 111 +jmp strict near isr + +i112: cli +push byte 0 +push dword strict 112 +jmp strict near isr + +i113: cli +push byte 0 +push dword strict 113 +jmp strict near isr + +i114: cli +push byte 0 +push dword strict 114 +jmp strict near isr + +i115: cli +push byte 0 +push dword strict 115 +jmp strict near isr + +i116: cli +push byte 0 +push dword strict 116 +jmp strict near isr + +i117: cli +push byte 0 +push dword strict 117 +jmp strict near isr + +i118: cli +push byte 0 +push dword strict 118 +jmp strict near isr + +i119: cli +push byte 0 +push dword strict 119 +jmp strict near isr + +i120: cli +push byte 0 +push dword strict 120 +jmp strict near isr + +i121: cli +push byte 0 +push dword strict 121 +jmp strict near isr + +i122: cli +push byte 0 +push dword strict 122 +jmp strict near isr + +i123: cli +push byte 0 +push dword strict 123 +jmp strict near isr + +i124: cli +push byte 0 +push dword strict 124 +jmp strict near isr + +i125: cli +push byte 0 +push dword strict 125 +jmp strict near isr + +i126: cli +push byte 0 +push dword strict 126 +jmp strict near isr + +i127: cli +push byte 0 +push dword strict 127 +jmp strict near isr + +i128: cli +push byte 0 +push dword strict 128 +jmp strict near isr + +i129: cli +push byte 0 +push dword strict 129 +jmp strict near isr + +i130: cli +push byte 0 +push dword strict 130 +jmp strict near isr + +i131: cli +push byte 0 +push dword strict 131 +jmp strict near isr + +i132: cli +push byte 0 +push dword strict 132 +jmp strict near isr + +i133: cli +push byte 0 +push dword strict 133 +jmp strict near isr + +i134: cli +push byte 0 +push dword strict 134 +jmp strict near isr + +i135: cli +push byte 0 +push dword strict 135 +jmp strict near isr + +i136: cli +push byte 0 +push dword strict 136 +jmp strict near isr + +i137: cli +push byte 0 +push dword strict 137 +jmp strict near isr + +i138: cli +push byte 0 +push dword strict 138 +jmp strict near isr + +i139: cli +push byte 0 +push dword strict 139 +jmp strict near isr + +i140: cli +push byte 0 +push dword strict 140 +jmp strict near isr + +i141: cli +push byte 0 +push dword strict 141 +jmp strict near isr + +i142: cli +push byte 0 +push dword strict 142 +jmp strict near isr + +i143: cli +push byte 0 +push dword strict 143 +jmp strict near isr + +i144: cli +push byte 0 +push dword strict 144 +jmp strict near isr + +i145: cli +push byte 0 +push dword strict 145 +jmp strict near isr + +i146: cli +push byte 0 +push dword strict 146 +jmp strict near isr + +i147: cli +push byte 0 +push dword strict 147 +jmp strict near isr + +i148: cli +push byte 0 +push dword strict 148 +jmp strict near isr + +i149: cli +push byte 0 +push dword strict 149 +jmp strict near isr + +i150: cli +push byte 0 +push dword strict 150 +jmp strict near isr + +i151: cli +push byte 0 +push dword strict 151 +jmp strict near isr + +i152: cli +push byte 0 +push dword strict 152 +jmp strict near isr + +i153: cli +push byte 0 +push dword strict 153 +jmp strict near isr + +i154: cli +push byte 0 +push dword strict 154 +jmp strict near isr + +i155: cli +push byte 0 +push dword strict 155 +jmp strict near isr + +i156: cli +push byte 0 +push dword strict 156 +jmp strict near isr + +i157: cli +push byte 0 +push dword strict 157 +jmp strict near isr + +i158: cli +push byte 0 +push dword strict 158 +jmp strict near isr + +i159: cli +push byte 0 +push dword strict 159 +jmp strict near isr + +i160: cli +push byte 0 +push dword strict 160 +jmp strict near isr + +i161: cli +push byte 0 +push dword strict 161 +jmp strict near isr + +i162: cli +push byte 0 +push dword strict 162 +jmp strict near isr + +i163: cli +push byte 0 +push dword strict 163 +jmp strict near isr + +i164: cli +push byte 0 +push dword strict 164 +jmp strict near isr + +i165: cli +push byte 0 +push dword strict 165 +jmp strict near isr + +i166: cli +push byte 0 +push dword strict 166 +jmp strict near isr + +i167: cli +push byte 0 +push dword strict 167 +jmp strict near isr + +i168: cli +push byte 0 +push dword strict 168 +jmp strict near isr + +i169: cli +push byte 0 +push dword strict 169 +jmp strict near isr + +i170: cli +push byte 0 +push dword strict 170 +jmp strict near isr + +i171: cli +push byte 0 +push dword strict 171 +jmp strict near isr + +i172: cli +push byte 0 +push dword strict 172 +jmp strict near isr + +i173: cli +push byte 0 +push dword strict 173 +jmp strict near isr + +i174: cli +push byte 0 +push dword strict 174 +jmp strict near isr + +i175: cli +push byte 0 +push dword strict 175 +jmp strict near isr + +i176: cli +push byte 0 +push dword strict 176 +jmp strict near isr + +i177: cli +push byte 0 +push dword strict 177 +jmp strict near isr + +i178: cli +push byte 0 +push dword strict 178 +jmp strict near isr + +i179: cli +push byte 0 +push dword strict 179 +jmp strict near isr + +i180: cli +push byte 0 +push dword strict 180 +jmp strict near isr + +i181: cli +push byte 0 +push dword strict 181 +jmp strict near isr + +i182: cli +push byte 0 +push dword strict 182 +jmp strict near isr + +i183: cli +push byte 0 +push dword strict 183 +jmp strict near isr + +i184: cli +push byte 0 +push dword strict 184 +jmp strict near isr + +i185: cli +push byte 0 +push dword strict 185 +jmp strict near isr + +i186: cli +push byte 0 +push dword strict 186 +jmp strict near isr + +i187: cli +push byte 0 +push dword strict 187 +jmp strict near isr + +i188: cli +push byte 0 +push dword strict 188 +jmp strict near isr + +i189: cli +push byte 0 +push dword strict 189 +jmp strict near isr + +i190: cli +push byte 0 +push dword strict 190 +jmp strict near isr + +i191: cli +push byte 0 +push dword strict 191 +jmp strict near isr + +i192: cli +push byte 0 +push dword strict 192 +jmp strict near isr + +i193: cli +push byte 0 +push dword strict 193 +jmp strict near isr + +i194: cli +push byte 0 +push dword strict 194 +jmp strict near isr + +i195: cli +push byte 0 +push dword strict 195 +jmp strict near isr + +i196: cli +push byte 0 +push dword strict 196 +jmp strict near isr + +i197: cli +push byte 0 +push dword strict 197 +jmp strict near isr + +i198: cli +push byte 0 +push dword strict 198 +jmp strict near isr + +i199: cli +push byte 0 +push dword strict 199 +jmp strict near isr + +i200: cli +push byte 0 +push dword strict 200 +jmp strict near isr + +i201: cli +push byte 0 +push dword strict 201 +jmp strict near isr + +i202: cli +push byte 0 +push dword strict 202 +jmp strict near isr + +i203: cli +push byte 0 +push dword strict 203 +jmp strict near isr + +i204: cli +push byte 0 +push dword strict 204 +jmp strict near isr + +i205: cli +push byte 0 +push dword strict 205 +jmp strict near isr + +i206: cli +push byte 0 +push dword strict 206 +jmp strict near isr + +i207: cli +push byte 0 +push dword strict 207 +jmp strict near isr + +i208: cli +push byte 0 +push dword strict 208 +jmp strict near isr + +i209: cli +push byte 0 +push dword strict 209 +jmp strict near isr + +i210: cli +push byte 0 +push dword strict 210 +jmp strict near isr + +i211: cli +push byte 0 +push dword strict 211 +jmp strict near isr + +i212: cli +push byte 0 +push dword strict 212 +jmp strict near isr + +i213: cli +push byte 0 +push dword strict 213 +jmp strict near isr + +i214: cli +push byte 0 +push dword strict 214 +jmp strict near isr + +i215: cli +push byte 0 +push dword strict 215 +jmp strict near isr + +i216: cli +push byte 0 +push dword strict 216 +jmp strict near isr + +i217: cli +push byte 0 +push dword strict 217 +jmp strict near isr + +i218: cli +push byte 0 +push dword strict 218 +jmp strict near isr + +i219: cli +push byte 0 +push dword strict 219 +jmp strict near isr + +i220: cli +push byte 0 +push dword strict 220 +jmp strict near isr + +i221: cli +push byte 0 +push dword strict 221 +jmp strict near isr + +i222: cli +push byte 0 +push dword strict 222 +jmp strict near isr + +i223: cli +push byte 0 +push dword strict 223 +jmp strict near isr + +i224: cli +push byte 0 +push dword strict 224 +jmp strict near isr + +i225: cli +push byte 0 +push dword strict 225 +jmp strict near isr + +i226: cli +push byte 0 +push dword strict 226 +jmp strict near isr + +i227: cli +push byte 0 +push dword strict 227 +jmp strict near isr + +i228: cli +push byte 0 +push dword strict 228 +jmp strict near isr + +i229: cli +push byte 0 +push dword strict 229 +jmp strict near isr + +i230: cli +push byte 0 +push dword strict 230 +jmp strict near isr + +i231: cli +push byte 0 +push dword strict 231 +jmp strict near isr + +i232: cli +push byte 0 +push dword strict 232 +jmp strict near isr + +i233: cli +push byte 0 +push dword strict 233 +jmp strict near isr + +i234: cli +push byte 0 +push dword strict 234 +jmp strict near isr + +i235: cli +push byte 0 +push dword strict 235 +jmp strict near isr + +i236: cli +push byte 0 +push dword strict 236 +jmp strict near isr + +i237: cli +push byte 0 +push dword strict 237 +jmp strict near isr + +i238: cli +push byte 0 +push dword strict 238 +jmp strict near isr + +i239: cli +push byte 0 +push dword strict 239 +jmp strict near isr + +i240: cli +push byte 0 +push dword strict 240 +jmp strict near isr + +i241: cli +push byte 0 +push dword strict 241 +jmp strict near isr + +i242: cli +push byte 0 +push dword strict 242 +jmp strict near isr + +i243: cli +push byte 0 +push dword strict 243 +jmp strict near isr + +i244: cli +push byte 0 +push dword strict 244 +jmp strict near isr + +i245: cli +push byte 0 +push dword strict 245 +jmp strict near isr + +i246: cli +push byte 0 +push dword strict 246 +jmp strict near isr + +i247: cli +push byte 0 +push dword strict 247 +jmp strict near isr + +i248: cli +push byte 0 +push dword strict 248 +jmp strict near isr + +i249: cli +push byte 0 +push dword strict 249 +jmp strict near isr + +i250: cli +push byte 0 +push dword strict 250 +jmp strict near isr + +i251: cli +push byte 0 +push dword strict 251 +jmp strict near isr + +i252: cli +push byte 0 +push dword strict 252 +jmp strict near isr + +i253: cli +push byte 0 +push dword strict 253 +jmp strict near isr + +i254: cli +push byte 0 +push dword strict 254 +jmp strict near isr + +i255: cli +push byte 0 +push dword strict 255 +jmp strict near isr diff --git a/include/keyboard.h b/include/keyboard.h new file mode 100644 index 0000000..7bf5ac0 --- /dev/null +++ b/include/keyboard.h @@ -0,0 +1,9 @@ +#ifndef KEYBOARD +#define KEYBOARD +#include + +extern uint8_t keys[256]; + +void kbmode(uint8_t mode); + +#endif diff --git a/include/ports.h b/include/ports.h new file mode 100644 index 0000000..d1308d0 --- /dev/null +++ b/include/ports.h @@ -0,0 +1,11 @@ +#ifndef PORTS +#define PORTS +#include + +uint8_t inb(uint16_t port); +uint16_t inw(uint16_t port); + +void outb(uint16_t port, uint8_t data); +void outw(uint16_t port, uint16_t data); + +#endif diff --git a/include/stddef.h b/include/stddef.h new file mode 100644 index 0000000..27c9aa0 --- /dev/null +++ b/include/stddef.h @@ -0,0 +1,4 @@ +#ifndef STDDEF +#define STDDEF +#define NULL (void*)0 +#endif diff --git a/include/stdlib.h b/include/stdlib.h new file mode 100644 index 0000000..b5d1992 --- /dev/null +++ b/include/stdlib.h @@ -0,0 +1,7 @@ +#ifndef STDLIB +#define STDLIB +#include + +int abs(int i); +char* itox(uint32_t x); +#endif diff --git a/include/string.h b/include/string.h new file mode 100644 index 0000000..89dc053 --- /dev/null +++ b/include/string.h @@ -0,0 +1,9 @@ +#ifndef STRING +#define STRING +#include + +uint32_t strlen(char* str); +void memcpy(uint8_t* dest, uint8_t* src, uint32_t len); +void memset(uint8_t* dest, uint8_t set, uint32_t len); + +#endif diff --git a/include/video.h b/include/video.h new file mode 100644 index 0000000..62a6e10 --- /dev/null +++ b/include/video.h @@ -0,0 +1,15 @@ +#ifndef VIDEO +#define VIDEO + +extern char* vga; + +#define VGA_CCTRL 0x3d4 +#define VGA_CDATA 0x3d5 +#define ROWS 25 +#define COLS 80 + +void cls(); +void setcursor(unsigned int); +int getcursor(); + +#endif diff --git a/src/alloc.c b/src/alloc.c new file mode 100644 index 0000000..c11a890 --- /dev/null +++ b/src/alloc.c @@ -0,0 +1,73 @@ +#include +#include + +#define POINTER uint32_t +#define BUCKET_NUM 256 +#define BUCKET_SIZE 6371 + +unsigned int highest_size = 0; +// TODO determine this +void* malloc_base_pointer = (void*) 0x01000000; +#define table(BUCKET, SLOT) hashtable[(BUCKET*BUCKET_NUM)+SLOT] + +malloc_entry* hashtable = (void*) 0x100000; + +void init_hashtable() { + memset((uint8_t*)hashtable, 0, 0xE00000); +} + +void* malloc(uint32_t size) { + if(size == 0) return NULL; + // TODO not hardcode this + if(highest_size > 1073742000) return NULL; + malloc_entry candidate_entry = (malloc_entry) {NULL, 0xFFFFFFFF, 0}; + int candidate_slot = 0xFFFFFF, foundpage = 0; + if(size > highest_size) goto nocandidate; + // TODO search more efficiently? maybe hashtable[0x10000][0x100]? + // TODO combining nearby blocks + // TODO if block is at highest pointer update hash table instead of reallocating + for(int bi = 0; bi < 256; bi++) { + for(int si = 0; si < BUCKET_SIZE; si++) { + if( + table(bi,si).state == MALLOC_FREE && + table(bi,si).size < candidate_entry.size && + table(bi,si).size >= size + ) { + candidate_entry = table(bi,si); + candidate_entry.size = size; + // candidate_bucket = bi; + candidate_slot = si; + } + } + } + if(candidate_slot == 0xFFFFFF) { + nocandidate: + candidate_entry = (malloc_entry) {malloc_base_pointer + highest_size + 1, size, MALLOC_USED}; + highest_size += size; + for(candidate_slot = 0; candidate_slot < BUCKET_SIZE; candidate_slot++) if( + table((POINTER) candidate_entry.ptr & 0xFF,candidate_slot).ptr == NULL && + table((POINTER) candidate_entry.ptr & 0xFF,candidate_slot).state == 0 + ) {foundpage = 1; break;} + if(!foundpage) return NULL; + } else candidate_entry.state = MALLOC_USED; + table((POINTER) candidate_entry.ptr & 0xFF,candidate_slot) = candidate_entry; + if(size > highest_size) highest_size = size; + return candidate_entry.ptr; +} + +void free(void* ptr) { + if(ptr != NULL) for(int i = 0; i < BUCKET_SIZE; i++) if(table((POINTER) ptr & 0xFF,i).ptr == ptr) { + table((POINTER) ptr & 0xFF,i).state = MALLOC_FREE; + } +} + +void* realloc(void* ptr, uint32_t size) { + if(ptr != NULL) for(int i = 0; i < BUCKET_SIZE; i++) if(table((POINTER) ptr & 0xFF,i).ptr == ptr) { + if(size <= table((POINTER) ptr & 0xFF,i).size) return ptr; + free(ptr); + void* newptr = malloc(size); + memcpy(newptr, ptr, table((POINTER) ptr & 0xFF,i).size); + return newptr; + } + return NULL; +} diff --git a/src/ata-pio.c b/src/ata-pio.c new file mode 100644 index 0000000..1681330 --- /dev/null +++ b/src/ata-pio.c @@ -0,0 +1,51 @@ +#include +#include + +uint16_t ata_identify[256]; +// 0: disk is initialized +// 1: no disks +// 2: no disk on requested interface +// 3: ATAPI +int ata_init(uint8_t bus, uint8_t drive) { + uint16_t io_base = ATA_IO_BASE - (bus ? ATA_SECONDARY_OFFSET : 0); + if(inb(io_base + ATA_STATUS_REGISTER) == 0xFF) return 1; + outb(io_base + ATA_DRIVE_REGISTER, drive ? 0xB0 : 0xA0); + for(int i = 2; i < 6; i++) outb(io_base + i, 0); + outb(io_base + ATA_STATUS_REGISTER, 0xEC); + uint8_t status; + do { + status = inb(io_base + ATA_STATUS_REGISTER); + if(!status) return 2; + } while((status & 0x80)); + if(inb(io_base + 4) || inb(io_base + 5)) return 3; + do { + status = inb(io_base + ATA_STATUS_REGISTER); + if(status & 1) return inb(io_base + ATA_ERROR_REGISTER); + } while(!(status & 8)); + uint16_t err = inb(io_base + ATA_ERROR_REGISTER); + if(err) return err; + for(int i = 0; i < 256; i++) ata_identify[i] = inw(io_base); + return 0; +} + +uint16_t ata_setuprw(uint8_t bus, uint8_t drive, uint16_t sectors, uint16_t lba_high, uint32_t lba_low) { + uint16_t io_base = ATA_IO_BASE - (bus ? ATA_SECONDARY_OFFSET : 0); + outb(io_base + ATA_DRIVE_REGISTER, 0x40 | ((!!drive) << 4)); + uint8_t mports[4] = {2, 3, 4, 5}; + uint8_t dat[8] = {sectors >> 8, lba_low >> 24, lba_high >> 8, lba_high, sectors, lba_low, lba_low >> 8, lba_low >> 16}; + for(int i = 0; i < 8; i++) outb(io_base + mports[i % 4], dat[i]); + return io_base; +} + +int ata_read(uint8_t bus, uint8_t drive, uint16_t* buf, uint16_t sectors, uint16_t lba_high, uint32_t lba_low) { + uint16_t io_base = ata_setuprw(bus, drive, sectors, lba_high, lba_low); + outb(io_base + ATA_COMMAND_REGISTER, 0x24); + for(int i = 0; i < sectors * 256; i++) buf[i] = inw(io_base); +} + +int ata_write(uint8_t bus, uint8_t drive, uint16_t* buf, uint16_t sectors, uint16_t lba_high, uint32_t lba_low) { + uint16_t io_base = ata_setuprw(bus, drive, sectors, lba_high, lba_low); + outb(io_base + ATA_COMMAND_REGISTER, 0x34); + for(int i = 0; i < sectors * 256; i++) outw(io_base, buf[i]); + outb(io_base + ATA_COMMAND_REGISTER, 0xE7); +} diff --git a/src/entry.s b/src/entry.s new file mode 100644 index 0000000..0b3d7b6 --- /dev/null +++ b/src/entry.s @@ -0,0 +1,7 @@ +[bits 32] +[extern entry] + +global _start +_start: + call entry + retf diff --git a/src/interrupt.s b/src/interrupt.s new file mode 100644 index 0000000..5833506 --- /dev/null +++ b/src/interrupt.s @@ -0,0 +1,28 @@ +[extern isr_handler] + +global isr_base + +isr: pusha + mov ax, ds + push eax + mov ax, 0x10 + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + push esp + cld + call isr_handler + pop eax + pop eax + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + popa + add esp, 8 + sti + iret + +isr_base: +%include "include/isr.i" diff --git a/src/interrupts.c b/src/interrupts.c new file mode 100644 index 0000000..622b43f --- /dev/null +++ b/src/interrupts.c @@ -0,0 +1,60 @@ +#include +#include +#include +#include + +idt_gate idt[256]; +idtrc idtr = {2047, idt}; // 256*8-1 +isr isrs[256]; + +void noint(registers* r) { + *((uint16_t*)0xB8000) = 0x0F00 | r->ino; +} + +void set_idt(uint8_t n, uint32_t i) { + idt[n].hi = (i >> 16) & 0xFFFF; + idt[n].lo = i & 0xFFFF; + idt[n].sel = 0x8; // TODO macro + idt[n].flags = 0x8E; + idt[n].reserved = 0; +} + +void lidt() { + asm volatile("lidtl (%0)" : : "r" (&idtr)); +} + +void isr_init() { + + uint8_t portouts[20] = { + 0x20, 0x11, + 0xA0, 0x11, + 0x21, 0x20, + 0xA1, 0x28, + 0x21, 0x04, + 0xA1, 0x02, + 0x21, 0x01, + 0xA1, 0x01, + 0x21, 0x0, + 0xA1, 0x0 + }; + + for(int i = 0; i < 20; i+=2) outb(portouts[i], portouts[i+1]); // remap pic TODO undo function + + for(int i = 0; i < 256; i++) { // TODO this can be done at compile time (even with relocation?) + set_idt(i, ((uint32_t)isr_base) + (13*i)); + isrs[i] = noint; + } + + lidt(); + asm volatile("sti"); +} + +void regint(uint8_t ino, isr i) {isrs[ino] = i;} + +void isr_handler(registers* t){ + if(t->ino >= 32 && t->ino <= 47) { // from the pic + if(t->ino >= 40) outb(0xA0, 0x20); + outb(0x20, 0x20); + } + isrs[(uint8_t)t->ino](t); +} diff --git a/src/kernel.c b/src/kernel.c new file mode 100644 index 0000000..b120586 --- /dev/null +++ b/src/kernel.c @@ -0,0 +1,33 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +uint32_t tick = 0; + +void clock_update(registers* r) { + tick++; + for(int i = 0; i < 80 * 25; i++) {((uint16_t*)0xB8000)[i] = 0xF000 | (tick & 0xFF);} +} + +void setclock(uint32_t f) { + uint32_t divisor = 1193182 / f; + outb(0x43, 0x36); + outb(0x40, divisor & 0xFF); + outb(0x40, (divisor >> 8) & 0xFF); +} + +void entry() { + isr_init(); + regint(32, clock_update); + kbmode(1); + setclock(8); + + while(1) for(int i = 0; i < 80 * 25; i++) { + ((uint16_t*)0xB8000)[i] = 0xF000 | (tick & 0xFF); + } +} diff --git a/src/keyboard.c b/src/keyboard.c new file mode 100644 index 0000000..5bca269 --- /dev/null +++ b/src/keyboard.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include + +uint8_t keys[256]; + +void array_keyboard(registers* r) { + // TODO ????? + uint8_t scancode = inb(0x60); + if(scancode > 0x39) keys[scancode-0x80] = 0; + else keys[scancode] = 1; + vga[44] = scancode; +} + +void no_keyboard(registers* r) { + inb(0x60); +} + +void kbmode(uint8_t mode) { + switch(mode) { + case 0: + // ignore keyboard + regint(33, no_keyboard); + break; + case 1: + // nonblocking, array based keyboard + regint(33, array_keyboard); + break; + // TODO getc-like mode + } +} diff --git a/src/ports.c b/src/ports.c new file mode 100644 index 0000000..403d5c2 --- /dev/null +++ b/src/ports.c @@ -0,0 +1,21 @@ +#include + +uint8_t inb(uint16_t port) { + unsigned char result; + asm("in %%dx, %%al" : "=a" (result) : "d" (port)); + return result; +} + +void outb(uint16_t port, uint8_t data) { + asm("out %%al, %%dx" : : "a" (data), "d" (port)); +} + +uint16_t inw(uint16_t port){ + uint16_t ret; + asm volatile ("inw %1, %0" : "=a" (ret) : "dN" (port)); + return ret; +} + +void outw(uint16_t port, uint16_t data){ + asm volatile ("outw %1, %0" : : "dN" (port), "a" (data)); +} diff --git a/src/stdlib.c b/src/stdlib.c new file mode 100644 index 0000000..ae88795 --- /dev/null +++ b/src/stdlib.c @@ -0,0 +1,14 @@ +#include + +int abs(int i) { + return (i < 0) ? -i : i; +} + +char itoxret[8]; +char* itox(uint32_t x) { + for(int i = 0; i < 8; i++) { + itoxret[7-i] = (x >> (i*4)) & 0xF; + itoxret[7-i] += (itoxret[7-i] > 9) ? ('A' - 10) : '0'; + } + return itoxret; +} diff --git a/src/string.c b/src/string.c new file mode 100644 index 0000000..262ada5 --- /dev/null +++ b/src/string.c @@ -0,0 +1,15 @@ +#include + +uint32_t strlen(char* str) { + uint32_t n = 0; + while(*str++ != 0) n++; + return n; +} + +void memcpy(uint8_t* dest, uint8_t* src, uint32_t len) { + while(len-- > 0) *dest++ = *src++; +} + +void memset(uint8_t* dest, uint8_t set, uint32_t len) { + while(len-- > 0) *dest++ = set; +} diff --git a/src/video.c b/src/video.c new file mode 100644 index 0000000..0d43362 --- /dev/null +++ b/src/video.c @@ -0,0 +1,26 @@ +#include +#include +#include + +// start in 80x25 mode +char* vga = (char*)0xB8000; + +void cls() { + for(int i; i < 2000; i++) vga[i*2] = ' '; + setcursor(0); +} + +void setcursor(unsigned int i) { + outb(VGA_CCTRL, 14); + outb(VGA_CDATA, i >> 8); + outb(VGA_CCTRL, 15); + outb(VGA_CDATA, i & 0xff); +} + +int getcursor() { + outb(VGA_CCTRL, 14); + uint8_t ofs = inb(VGA_CDATA) << 8; + outb(VGA_CCTRL, 15); + ofs += inb(VGA_CDATA); + return ofs; +} diff --git a/tool/genisr.c b/tool/genisr.c new file mode 100644 index 0000000..ff6d4f1 --- /dev/null +++ b/tool/genisr.c @@ -0,0 +1,13 @@ +#include + +// these exceptions have error codes +const char ex[10] = {8, 10, 11, 12, 13, 14, 17, 21, 29, 30}; + +int main() { + for(int i = 0; i < 256; i++) { + int s = 0; + for(int e = 0; e < 10; e++) if(i == ex[e]) {s = 1; break;} + + printf("\ni%i: cli\n%spush dword strict %i\njmp strict near isr\n%s", i, s ? "" : "push byte 0\n", i, s ? "cs nop\n" : ""); + } +}