Last Updated or created 2023-09-22
(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'