366: Systems Level Programming¶
Low-level programming targeting DOS and x86 hardware, including device drivers and real-mode assembly.
Topics¶
x86 real-mode assembly (NASM/MASM)
DOS interrupt services (INT 21h, INT 10h)
Device driver architecture (block and character drivers)
Video memory-mapped I/O
Keyboard and timer interrupt handling
Projects¶
Missile Command Game (366/src/rocks.asm)¶
A “Missile Command”-style arcade game written entirely in x86 assembly. Uses INT 10h for video mode switching and direct VGA frame-buffer writes to animate missiles and explosions in real time.
MAX_ROCKS equ 5 ; maximum rocks on screen at a time
NEW_ROCK_CHANCE equ 10
TAU equ 8 ; controls fall speed (4=fast, 12=slow)
ROCK_MAX_Y equ 20
TIMER_INT equ 1ch
TIMER_INT_LOCATION equ 4*TIMER_INT
; A rock record (struct): x, y, active flag, momentum
upper_left_x equ 0 ; byte
upper_left_y equ 1 ; byte
active equ 2 ; byte
momentum equ 3 ; byte
ROCK_SIZE equ 4
; Hook the timer interrupt to drive game animation
mov ax, 3500h + TIMER_INT ; DOS get interrupt vector
int 21h
mov [old_timer_seg], es
mov [old_timer_off], bx
DOS Block Device Driver (366/src/blkdrv.asm)¶
A dummy block device driver implemented as a DOS .SYS file. Demonstrates the DOS
device driver header structure, strategy/interrupt routines, and the request packet protocol
used by the DOS kernel to communicate with drivers.
; DOS device driver header
code segment
assume cs:code
dw -1 ; link to next driver (-1 = end of chain)
dw -1
dw 2000h ; attribute word (block device)
dw offset str ; strategy routine offset
dw offset int ; interrupt routine offset
db 3 ; number of units (block devices)
db 7 dup (?) ; reserved for DOS
int:
cmp byte ptr es:[bx+2], 0 ; only Init command supported
je init
mov word ptr es:[bx+3], 8102h ; return "device not ready"
jmp exit