program delta ; (*** VGA 80*25 mode assumed ***) procedure CharGenModeOn ; begin asm cli mov dx,03C4h mov ax,0100h out dx,ax mov ax,0402h out dx,ax mov ax,0704h out dx,ax mov ax,0300h out dx,ax sti mov dl,0CEh mov ax,0204h out dx,ax mov ax,0005h out dx,ax mov ax,0006h out dx,ax end ; end ; procedure CharGenModeOff ; begin asm cli mov dx,03C4h mov ax,0100h out dx,ax mov ax,0302h out dx,ax mov ax,0304h out dx,ax mov ax,0300h out dx,ax sti mov dl,0CEh mov ax,0004h out dx,ax mov ax,1005h out dx,ax mov ax,0E06h out dx,ax mov ah,0Fh int 10h cmp al,7 jne @skip mov ax,0806h out dx,ax @skip: end ; end ; var J : integer ; const CS : array [0..15] of char = #$00#$00#$18#$18#$18#$2C#$2C#$2C#$46#$46#$46#$FF#$00#$00#$00#$00 ; BEGIN ; Writeln('www.merlyn.demon.co.uk') ; CharGenModeOn { Get access to character map } ; { Characters are stored in a 8x32 pixel matrix, allowing for characters that are 32 scan lines high. Each byte in the buffer represents one scan line of a single character. In the 80x25 character mode only the first 16 scan lines are displayed, so we need to be a little careful about what bytes are changed. } for J := 0 to 15 do { Top 16 scan lines OF  } Mem[SegA000:32*Ord('')+J] := byte(CS[J]) ; CharGenModeOff { Restore normal video operations } ; END.