.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


Hosted by www.Geocities.ws

1