(NOTE, Dosbox can’t cope with the register speed, use real HW or PCem)
Generating a RAW image and Palette, a in a new way
This bash script to convert BMP to Raw and a compiled colorpalette.
(Note: this converts to 8 bit depth, the assembly code in the final assemby program converts to 6 for VGA mode 13h
So this time, i wonΒ΄t have to use the standard VGA palette as mentioned in previous posts.
(Gimp colors > indexed (255 colors) ; save as BMP, exclude colorspace information)
I’m using identify to extract the colorpalette, which i’m converting to DB entries for the fasm compiler
#!/bin/bash
if [ $# -lt 1 ] ; then
echo "$0 filename"
exit 0
fi
size=$(stat $1 | grep Size | awk '{ print $2 }')
skipsize=$(( $size - 64000))
dd if=$1 of=$1.raw skip=$skipsize bs=1
identify -verbose $1 | awk '/Colormap:/,/Rendering/' | grep -v Colormap | grep -v Rendering | awk '{ print $2 } ' | tr -d '()' | while read ; do echo "db $REPLY" ;done > data.asm
fasm data.asm
Code
use16
org 0x100
; variables
CRTC_INDEX = 0x03D4
CRTC_DATA = 0x03D5
INPUT_STATUS = 0x03DA
HRETRACE = 0x01
VRETRACE = 0x03 ; bit 3 =8 ?
MAXIMUM_SCAN_LINE = 0x09
LINE_OFFSET = 0x13
; bar
upperbar = 1
lowerbar = 399
jmp start
; memory locations for data
updown dw 1
direction DB 0
filename DB "firework.raw",0
oldline db 0
start:
; set mode 320x200 256 colors palette
mov ah,0x0
mov al,13h
int 10h
; clear screen routine, not really needed
clearscreen:
push ax
mov ax, 0a000h
mov es, ax
pop ax
xor di, di
inc ax
mov cx, 64000 ; 320x200
rep stosb
; set colors
; call file loader
call Loadfile
call setpalette
; Move loaded file to Screen memory
mov ax,0a000h
mov es,ax
mov ax,6000h
mov ds,ax
mov si,0
mov di,0
mov cx,320*200/2
rep movsw
push cs
pop ds
; store org effect2 values
mov dx, CRTC_INDEX
mov al,LINE_OFFSET
out dx,al
mov dx, CRTC_DATA
in al,dx
mov [oldline],al
; after displaying the image or displaying an error, wait for keypress to exit
waitforkeyloop:
call effect ; Calling the effect
MOV AH,1
INT 16h
JZ waitforkeyloop
XOR AH,AH
INT 16h
Exit:
MOV AX,3 ; default text mode 3
INT 10h
MOV AX,4C00h ; exit to dos (terminate process)
INT 21h
; loop ends here
; Loads raw 64000 bytes image to screen memory
Loadfile:
push ds
MOV DX,filename
MOV AX,3D00h ; open filehandle
INT 21h
JC Err1
MOV BX,AX ; filehandle
MOV CX,64000
mov dx,06000h ; destination 0000:a000h - Screen memory
mov ds,dx
MOV DX,0
MOV AH,3Fh ; read from file
INT 21h
JC Err1
MOV AH,3Eh ; close filehandle
INT 21h
pop ds
RET
; print error
Err1:
push cs ; make ds same as cs
pop ds
MOV AX,3 ; default text mode 3
INT 10h
MOV DX,TxtErr1 ; error
MOV AH,09h
INT 21h
RET
effect:
cli ; stop interrupts
call waitvretrace ; wait for vertical retrace
; gets start scanline and direction
mov ax,[updown]
mov cl,[direction]
cmp cl,0 ; 0 move down
jz addcounter
dec ax
dec ax
cmp ax,upperbar ; reached upper bar ?
jnz gohere ; jnz
mov cl,0
mov [direction],cl
jmp gohere
addcounter:
inc ax
inc ax
cmp ax,lowerbar ; reached bottom bar?
jnz gohere ;jnz
mov cl,1 ; change direction
mov [direction],cl
gohere:
mov [updown],ax ; store new location
; al = scanline, call wait for scanline
call longwaithretrace
; other effect
mov dx, CRTC_INDEX
mov al, LINE_OFFSET
out dx,al
mov dx, CRTC_DATA
mov al, 0
out dx,al
; wait scanlines (height of bar)
mov ax,400
mov cx,[updown]
sub ax,cx
call longwaithretrace
; restore effect2
mov dx, CRTC_INDEX
mov al, LINE_OFFSET
out dx, al
mov dx, CRTC_DATA
mov al, [oldline]
out dx,al
sti ; start interrupts again
ret
; routine that fixes 8 to 6 bits and sets palette
setpalette:
; 8 bits to 6
mov si,coltab
mov cx,256*3
rest:
mov al,[si]
shr al,2
mov [si],al
dec cx
inc si
cmp cx,0
jnz rest
; now set colors
mov dx,3c8h
xor al,al
out dx,al
inc dx
mov si,coltab
mov cx,256*3
rep outsb
ret
; this waits for vertical retrace
waitvretrace:
mov dx,INPUT_STATUS
waitv1:
in al,dx
test al,8
jnz waitv1
waitv2:
in al,dx
test al,8
jz waitv2
ret
; routine that waits for horizontal retrace
waithretrace:
mov cl,al
mov dx,INPUT_STATUS
waith1:
in al,dx
test al,1
jnz waith1
waith2:
in al,dx
test al,1
jz waith2
dec cl
cmp cl,0
jnz waith1
ret
longwaithretrace:
mov cx,ax
mov dx,INPUT_STATUS
lwaith1:
in al,dx
test al,1
jnz lwaith1
lwaith2:
in al,dx
test al,1
jz lwaith2
dec cx
cmp cx,0
jnz lwaith1
ret
TxtErr1 DB "firework.raw not found!",7,10,13,"$"
coltab:
include 'data.asm'














