.model small
.stack 100h
.data
px1 dw 0
py1 dw 0
palx db 0
paly db 0
px dw 0
py dw 0
pc db 15
paddr dw 0
tmp1 dw 0
tmp2 dw 0
getmaxcolor db 16
getmaxx dw 320
getmaxy dw 200
color db 15
palette dw 16 ; 0-7
maxcolor db 1 ; 1-32
x db ?
y db ?
key db 0
block7 dw 7
block8 dw 8
count dw 0
ten db 10
sec db 0
delaytime dw 1
palcolor db 0
filename db 0,'fruitbucpic',25 dup(?)
filename2 db 0,'fruitbucpic',25 dup(?)
mydata db 128*16 dup (100)
dataaddr dw 0
pages db 0
helpline db 'F2,F3-Color F5-F6-Palette Space-Color ESC-Exit$'
credit db 'MASM2.0, program by [email protected] version 0.48.01.26.$'
nextx db 8
nexty db 8
nextaddr dw 64
.code
call datainit
call fileinit
call vgamode
call graphinit
mov [x],19
mov [y],5
mov [key],0
mov [count],0
mov [delaytime],2
call paletteblock
mov dx,0200h
call setcursor
mov dx,offset helpline
call write
redraw_screen:
call workblock
mov al,[x]
mov ah,[y]
push ax
mov [x],19
mov [y],22
call workpixelblock
pop ax
mov [y],ah
mov [x],al
push dx
mov dx,1800h
call setcursor
pop dx
xor ax,ax
mov al,[x]
call bytetochar
push dx
mov dx,1805h
call setcursor
pop dx
xor ax,ax
mov al,[y]
call bytetochar
push dx
mov dx,180fh
call setcursor
pop dx
xor ax,ax
mov al,[pages]
call bytetochar
push dx
mov dx,180ah
call setcursor
pop dx
xor ax,ax
mov al,[palcolor]
mov [pc],al
call draw_cursor
call bytetochar
wait_for_key:
call delay
mov ah,1 ; not wait for keypress
int 16h
jz wait_for_key
xor ah,ah
int 16h
mov [key],ah
cmp [key],1
jne continue0
jmp exit
continue0:
cmp [key],3Bh ; F1
je func_f1
cmp [key],3Ch ; F2
je func_f2
cmp [key],3Dh ; F3
je func_f3
cmp [key],3Fh ; F5
je func_f5
cmp [key],40h ; F6
je func_f6
cmp ah,39h
je switch_cell
cmp [key],4Bh
je cursor_left
cmp [key],4Dh
jne continued3
jmp cursor_right
continued3:
cmp [key],48h
jne continued1
jmp cursor_up
continued1:
cmp [key],50h
jne continued2
jmp cursor_down
continued2:
jmp wait_for_key
func_f1:
mov [key],0
jmp redraw_screen
func_f2:
cmp [palcolor],0
je notfunc_f2
dec [palcolor]
notfunc_f2:
mov [key],0
jmp redraw_screen
func_f3:
cmp [palcolor],255
je notfunc_f3
inc [palcolor]
notfunc_f3:
mov [key],0
jmp redraw_screen
func_f5:
cmp [pages],0
je notfunc_f5
dec [pages]
notfunc_f5:
mov [key],0
jmp redraw_screen
func_f6:
cmp [pages],28
je notfunc_f6
inc [pages]
notfunc_f6:
mov [key],0
jmp redraw_screen
switch_cell:
call calmem
jmp redraw_screen
cursor_left:
cmp [x],19
ja continue1
jmp wait_for_key
continue1:
call clear_cursor
dec [x]
jmp redraw_screen
cursor_right:
cmp [x],26
jb continue2
jmp wait_for_key
continue2:
call clear_cursor
inc [x]
jmp redraw_screen
cursor_up:
cmp [y],5
ja continue3
jmp wait_for_key
continue3:
call clear_cursor
dec [y]
jmp redraw_screen
cursor_down:
cmp [y],12
jb continue4
jmp wait_for_key
continue4:
call clear_cursor
inc [y]
jmp redraw_screen
exit:
call savefile
call textmode
mov dx,offset credit
call write
mov ah,4ch
int 21h
textmode proc
mov al,03
mov ah,0
int 10h
ret
textmode endp
text40mode proc
mov al,01
mov ah,0
int 10h
ret
text40mode endp
vgamode proc
mov ax,13h
int 10h
ret
vgamode endp
keypress proc
mov ah,8
int 21h
ret
keypress endp
scankey proc
xor ah,ah
int 16h
ret
scankey endp
setcursor proc
push ax
push bx
mov ah,2
mov bh,0
int 10h
pop bx
pop ax
ret
setcursor endp
write proc
mov ah,09
int 21h
ret
write endp
putch proc
mov ah,2
int 21h
ret
putch endp
bytetochar proc
mov cl,100
div cl
mov dx,ax
call tonum
call putch
mov al,dh
mov ah,00
mov cl,10
div cl
mov dx,ax
call tonum
call putch
mov dl,dh
call tonum
call putch
ret
bytetochar endp
wordtochar proc
push cx
mov dx,0
mov cx,10000
div cx
mov bx,dx
mov dx,ax
call tonum
call putch
mov ax,bx
mov dx,0
mov cx,1000
div cx
mov bx,dx
mov dx,ax
call tonum
call putch
mov ax,bx
mov dx,0
mov cx,100
div cx
mov bx,dx
mov dx,ax
call tonum
call putch
mov ax,bx
mov dx,0
mov cx,10
div cx
mov bx,dx
mov dx,ax
call tonum
call putch
mov dx,bx
call tonum
call putch
pop cx
ret
wordtochar endp
tonum proc
cmp dl,0
je num0
cmp dl,1
je num1
cmp dl,2
je num2
cmp dl,3
je num3
cmp dl,4
je num4
cmp dl,5
je num5
cmp dl,6
je num6
cmp dl,7
je num7
cmp dl,8
je num8
cmp dl,9
je num9
num0:
mov dl,30h
ret
num1:
mov dl,31h
ret
num2:
mov dl,32h
ret
num3:
mov dl,33h
ret
num4:
mov dl,34h
ret
num5:
mov dl,35h
ret
num6:
mov dl,36h
ret
num7:
mov dl,37h
ret
num8:
mov dl,38h
ret
num9:
mov dl,39h
ret
tonum endp
;===========================
pointaddr proc
xor ax,ax
xor dx,dx
mov ax,[py]
mov bx,[getmaxx]
mul bx
add ax,[px]
mov [paddr],ax
ret
pointaddr endp
pointxy proc
call pointaddr
mov di,[paddr]
mov al,[color]
stosb
ret
pointxy endp
drawpoint proc
call pointxy
inc [px]
mov ax,[px]
cmp ax,[getmaxx]
jb drawpointend
mov [px],0
inc [py]
mov ax,[py]
cmp ax,[getmaxy]
jb drawpointend
mov [py],0
drawpointend: ret
drawpoint endp
setcolor proc
; mov al,[pc]
; mov ah,[maxcolor]
; mul ah
; add al,[palette]
; mov [color],al
mov al,[pc]
mov [color],al
ret
setcolor endp
graphinit proc
; push 0A000h ; graphic screen addr
; pop es ; point to es
mov ax,0a000h
mov es,ax
ret
graphinit endp
datainit proc
mov ax,@data
mov ds,ax
ret
datainit endp
draw_cursor proc
mov ax,[block8]
mov dx,0
mul [x]
mov [px1],ax
mov ax,[block8]
mov dx,0
mul [y]
mov [py1],ax
call setcolor
call vgablock
ret
draw_cursor endp
draw_block proc
mov ax,[block8]
mov dx,0
mul [x]
mov [px1],ax
mov ax,[block8]
mov dx,0
mul [y]
mov [py1],ax
call setcolor
call vgablock
ret
draw_block endp
vgablock proc
mov ax,[px1]
mov [px],ax
mov ax,[py1]
mov [py],ax
push cx
mov cx,[block7]
vgaloopj:
push cx
mov cx,[block7]
vgaloopi:
push cx
call drawpoint
pop cx
loop vgaloopi
xor ax,ax
mov ax,[px1]
mov [px],ax
inc [py]
pop cx
loop vgaloopj
pop cx
ret
vgablock endp
clear_cursor proc
call blink_cursor
mov [pc],17
call draw_cursor
ret
clear_cursor endp
blink_cursor proc
mov cx,16
setc: mov [pc],cl
push cx
call draw_cursor
pop cx
loop setc
ret
blink_cursor endp
settime proc
mov ah,2dh
int 21h
ret
settime endp
gettime proc
mov ah,2ch
int 21h
ret
gettime endp
delay proc
mov cx,[delaytime]
delayloop:
push cx
call gettime
mov [sec],dl
readtime:
call gettime
cmp dl,[sec]
je readtime
pop cx
loop delayloop
ret
delay endp
paletteblock proc
mov al,[x]
mov ah,[y]
push ax
mov [pc],255
mov cx,[palette]
paletteloopj:
mov [paly],cl
dec [paly]
push cx
mov cx,[palette]
paletteloopi:
mov [palx],cl
dec [palx]
mov al,[palx]
add al,1
mov [x],al
mov al,[paly]
add al,5
mov [y],al
push cx
call setcolor
call draw_block
pop cx
dec [pc]
loop paletteloopi
pop cx
loop paletteloopj
pop ax
mov [x],al
mov [y],ah
ret
paletteblock endp
workblock proc
mov si,offset mydata
mov ah,0
mov al,[pages]
mov dx,0
mov bx,64
mul bx
add si,ax
mov [nextaddr],0
mov [nextx],0
mov [nexty],0
mov al,[x]
mov ah,[y]
push ax
workmainloop:
mov cx,8
workloopj1:
mov [paly],cl
dec [paly]
push cx
mov cx,8
workloopi1:
mov [palx],cl
dec [palx]
mov al,19+7
sub al,[palx]
add al,[nextx]
mov [x],al
mov al,5+7
sub al,[paly]
add al,[nexty]
mov [y],al
push cx
mov cx,[si]
mov [pc],cl
call setcolor
call draw_block
pop cx
inc si
loop workloopi1
pop cx
loop workloopj1
inc [nextaddr]
cmp [nextaddr],1
jne workcon1
mov [nextx],8
jmp workmainloop
workcon1:
cmp [nextaddr],2
jne workcon2
mov [nextx],0
mov [nexty],8
jmp workmainloop
workcon2:
cmp [nextaddr],3
jne workcon3
mov [nextx],8
jmp workmainloop
workcon3:
pop ax
mov [x],al
mov [y],ah
ret
workblock endp
workpixelblock proc
mov si,offset mydata
mov ah,0
mov al,[pages]
mov dx,0
mov bx,64
mul bx
add si,ax
mov ax,[block8]
mov dx,0
mul [x]
mov [px1],ax
mov ax,[block8]
mov dx,0
mul [y]
mov [py1],ax
mov ax,[px1]
mov [px],ax
mov ax,[py1]
mov [py],ax
mov cx,[block8]
workpixloopj:
push cx
mov cx,[block8]
workpixloopi:
push cx
mov cx,[si]
mov [pc],cl
call setcolor
call drawpoint
inc si
pop cx
loop workpixloopi
xor ax,ax
mov ax,[px1]
mov [px],ax
inc [py]
pop cx
loop workpixloopj
ret
workpixelblock endp
createfile proc
mov dx,offset filename ; create file
mov ah,16h
int 21h
ret
createfile endp
delfile proc
mov dx,offset filename ; create file
mov ah,13h
int 21h
ret
delfile endp
openfile proc
mov dx,offset filename ; open file
mov ah,0fh
int 21h
ret
openfile endp
writefile proc
mov dx,offset filename ; write file
mov ah,15h
int 21h
ret
writefile endp
writefile2 proc
mov dx,offset filename ; write file
mov ah,22h
int 21h
ret
writefile2 endp
readfile proc
mov dx,offset filename ; write file
mov ah,14h
int 21h
ret
readfile endp
setfileblock proc
mov dx,offset mydata ; new block
add dx,[dataaddr]
mov ah,1ah
int 21h
ret
setfileblock endp
closefile proc
mov dx,offset filename ; close file
mov ah,10h
int 21h
ret
closefile endp
fileinit proc
call openfile
cmp al,0
je filecanopen
call createfile
mov si,offset mydata
mov al,0
mov cx,128*16
assign: mov [si],al
inc si
loop assign
; call savefile
call openfile
filecanopen:
mov [dataaddr],0 ; read from file to buffer
mov cx,16
readold:
call setfileblock
call readfile
add [dataaddr],128
loop readold
call closefile
; call showfiledata
ret
fileinit endp
savefile proc
; call showfiledata
call openfile
mov [dataaddr],0 ; write from buffer to file
call writefile2 ; write at begining of file
mov cx,16
writenew:
push cx
call setfileblock
call writefile
add [dataaddr],128
pop cx
loop writenew
call closefile
ret
savefile endp
showfiledata proc
mov dx,0
call setcursor
mov si,offset mydata
mov cx,64
showdataloop:
push cx
mov ax,[si]
mov ah,0
call bytetochar
inc si
pop cx
loop showdataloop
call keypress
ret
showfiledata endp
calmem proc
mov si,offset mydata
xor ax,ax
xor dx,dx
mov al,[pages]
; mov bx,128
mov bx,64
mul bx
push ax
xor ax,ax
mov al,[y]
sub al,5
mov cl,al
mov bx,8
mul bl
mov ah,[x]
sub ah,19
cmp cl,7 ; if side y page next
jbe calcony
add ah,8
; sub ah,64
calcony:
cmp ah,7 ; if side x page next
jbe calconx
add ah,64
sub ah,8
calconx:
add al,ah
pop bx
mov ah,0
add bx,ax
mov [dataaddr],bx
add si,bx
mov ah,0
mov al,[palcolor]
mov [si],al
mov dx,0
call setcursor
mov ax,[dataaddr]
call wordtochar
mov dx,10
call setcursor
mov ah,0
mov al,[palcolor]
call bytetochar
ret
calmem endp
end