SCANLINES equ 16 SHIFT equ 2 .model small .code org 100h main proc mov ax,1130h ; read char vector mov bh,06 ; 8*16 vga/mcga int 10h mov ah,0 ; read char int 16h cbw push ax mov cl,4 ; map of offending char shl ax,cl add bp,ax add bp,SHIFT mov cx,SCANLINES-SHIFT ; save char bitmap push ds push es pop ds pop es mov si,bp ; ds:si->original map lea di,charmap ; es:di->our buf cld rep movsb mov ax,1100h ; set char mov cx,1 pop dx mov bh,10h ; 8*16 vga/mcga lea bp,charmap int 10h mov ax,4c00h int 21h main endp charmap db SCANLINES dup(0) ; init to 0 as last lines must be blank end main
Monday, January 24, 2005
When I was a kid, I wrote this assembly program that would play with the VGA fonts (I wrote a whole bunch of programs that messed with the VGA fonts) One particular program that comes to mind is one that shifts the lines on the VGA font one scan line upward, making it look like it was typed on a typewriter with an errant key.
A common trick in the old days was to execute an application from within another. Here is some code example of how that was normally done:
.model tiny .code ExecBlk Struc Psp dw ? Cmdline dw ? CmdSeg dw ? FCB1 dw ? FCB1seg dw ? FCB2 dw ? FCB2seg dw ? ExecBlk ends org 100h main proc lea bx,pspblk mov sp,bx call resize mov execb.psp,0 ; copy our environment mov execb.cmdline,80h ; pass command line as is mov execb.FCB1,5ch mov execb.FCB2,6ch mov execb.cmdseg,cs mov execb.FCB1seg,cs mov execb.FCB2seg,cs lea dx,execf push ds pop es lea bx,execb mov ax,4b00h int 21h merr: mov ax,4c00h int 21h main endp resize proc add bx,15 mov cl,4 shr bx,cl mov ax,cs add bx,ax mov ah,4ah int 21h jc merr ret resize endp execf db "PAT.COM",0 ; ASCIIZ pathname of file to be execd execb ExecBlk <> _stack dw 1000h dup(?) pspblk label byte end main