Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .ALPHA
- TITLE MINIDRAW ;$Revision: 1.10 $
- ; Dr. Dave's Diversions, $Date: 2020-12-21 12:50:26-05 $
- ; (original by Dave, 1988)
- ;----------------------------------
- VIDEO SEGMENT AT 0B800H
- DB 16384 DUP(?)
- VIDEO ENDS
- ;----------------------------------
- DATASG SEGMENT PARA 'Data'
- REVISION DB 'minidraw $Revision: 1.10 $, released to the public domain.',0
- MENUTEXT DB ' FREE BOX LINE CLEAR LOAD SAVE QUIT $'
- ROW DW ?
- COL DW ?
- ROW2 DW ?
- COL2 DW ?
- TEMP DW ? ;for swapping coord.s
- COUNT DW ? ;for line drawing
- CHANGECOL DW ?
- CHANGEROW DW ?
- HALFCCOL DW ?
- HALFCROW DW ?
- PIX DB ? ;pixel value (1or0)
- CLEARFLAG DB ? ; signals to redraw menu
- CURSORON DB ? ; track cursor on/off in FREEDRAW
- FILENAME DB 'A:\SAVED.PIC',0
- HANDLE DW ?
- VIDBU DB 16384 DUP(?) ;video backup
- DATASG ENDS
- ;--------------------------------------
- CODESG SEGMENT PARA 'Code'
- ASSUME CS:CODESG, DS:DATASG, ES:VIDEO
- MAIN PROC
- MOV AX,DATASG
- MOV DS,AX
- MOV AX,VIDEO
- MOV ES,AX
- ; ---------------------------
- MOV AH,00H
- MOV AL,06H
- INT 10H ;640 X 200
- ; ---------------------------
- ; The following sets the background color to blue on MCGA or better.
- ; Unfortunately, on 640x200 2-color mode in CGA, it sets the foreground
- ; color to blue. Blue on black... yuck.
- ; Thanks, RetroTech Chris (YouTube) for finding the differing behavior.
- ; Comment for better CGA/TGA compatibility:
- ; MOV AH,0BH
- ; MOV BH,00H
- ; MOV BL,01 ;color
- ; INT 10H
- ; ---------------------------
- MOV CLEARFLAG,0
- MOV PIX,1
- START:: ;create menu bar
- MOV AH,02H
- MOV BH,0
- MOV DH,0
- MOV DL,0
- INT 10H
- MOV AH,09H
- LEA DX,MENUTEXT
- INT 21H
- MOV ROW,10
- MOV COL,0
- BAR: MOV AH,0CH
- MOV AL,PIX
- MOV BH,0
- MOV DX,ROW
- MOV CX,COL
- INT 10H ;write pix
- INC COL
- CMP COL,640
- JNZ BAR
- BAR2:
- MOV CX,95
- LOP2: MOV DX,0
- LOP: MOV AH,0CH
- MOV AL,PIX
- MOV BH,0
- INT 10H
- INC DX
- INC DX
- CMP DX,10
- JZ OUT1
- JMP LOP
- OUT1: CMP CX,545
- JZ OUT2
- ADD CX,90
- JMP LOP2
- OUT2:
- ; ---------------------------
- SETUP:: ;init mouse position
- CMP CLEARFLAG,1
- JZ SETOUT
- MOV AX,4
- MOV CX,320
- MOV DX,100
- INT 33H
- SETOUT:
- MOV AX,01H
- INT 33H ;show cursor
- ; ---------------------------
- CALL FREEDRAW ;***** START *****
- MAIN ENDP
- MENU PROC
- MENUBEGIN: CMP CX,95
- JB FREEDRAWC
- CMP CX,185
- JB BOXDRAWC
- CMP CX,275
- JB LINEDRAWC
- CMP CX,365
- JB CLRSCREENC
- CMP CX,455
- JB LOADPICC
- CMP CX,545
- JB SAVEPICC
- CALL QUIT
- FREEDRAWC: CALL FREEDRAW
- JMP MENUBEGIN ;on return
- BOXDRAWC: CALL BOXDRAW
- JMP MENUBEGIN
- LINEDRAWC: CALL LINEDRAW
- JMP MENUBEGIN
- CLRSCREENC: CALL CLRSCREEN
- JMP START
- LOADPICC: CALL LOADPIC
- JMP START
- SAVEPICC: CALL SAVEPIC
- JMP SETUP
- MENU ENDP
- ; ----------------------------
- FREEDRAW PROC
- BEGINFREE:
- MOV AX,01H
- INT 33H ;show cursor
- MOV CURSORON,1
- BEGINDRAW:
- MOV PIX,1
- CLC
- MOV AX,3
- INT 33H
- SHR BX,1 ;check for lft button
- JC CONTINUE
- CLC
- SHR BX,1 ;check for rght button
- JNC BEGINFREE
- MOV PIX,0 ;set to border color
- CONTINUE:
- CMP DX,10 ;if in menu
- JBE MENUC
- CLC
- MOV BL,CURSORON
- SHR BL,1 ; check for cursor on
- JNC CONT2
- MOV AX,02H
- INT 33H ;turn off cursor
- MOV CURSORON,0
- JMP CONT2
- MENUC:
- MOV AX,01H
- INT 33H ;show cursor
- MOV CURSORON,1
- RET
- CONT2:
- MOV AH,0CH
- MOV AL,PIX
- MOV BH,0
- INT 10H ;write pixel
- JMP BEGINDRAW
- FREEDRAW ENDP
- ;-----------------------------------
- BOXDRAW PROC
- BEGINBOX:
- B2EGINDRAW:
- MOV PIX,1
- CLC
- MOV AX,3
- INT 33H
- SHR BX,1 ;chk for lft button
- JC C2ONTINUE
- CLC
- SHR BX,1 ;chk right
- JNC B2EGINDRAW
- MOV PIX,0
- C2ONTINUE:
- CMP DX,10 ;if menu
- JBE M2ENUC
- JMP C2ONT2
- M2ENUC: RET
- C2ONT2:
- ; -----------------------------
- MOV AH,0CH
- MOV AL,PIX
- MOV BH,0
- INT 10H ;write pixel (1or0)
- MOV COL,CX ; at init coord
- MOV ROW,DX
- ; ---------------
- CMP PIX,0
- JZ CHKRIGHT
- CHKLEFT: CLC
- MOV AX,05H
- MOV BX,0
- INT 33H
- SHR AX,1
- JC CHKLEFT
- JMP RELOUT ; on button release
- CHKRIGHT: CLC
- MOV AX,05H
- MOV BX,1
- INT 33H
- SHR AX,1
- SHR AX,1
- JC CHKRIGHT
- RELOUT:
- MOV AX,03H
- INT 33H
- CMP DX,10 ;if menu
- JA C3ONT
- RET
- C3ONT: MOV COL2,CX
- MOV ROW2,DX ;store 2nd coord
- ; ---------------------------
- MOV AX,COL
- CMP AX,COL2
- JZ INVALID
- MOV AX,ROW
- CMP AX,ROW2
- JZ INVALID
- JMP VALID
- INVALID: JMP BEGINBOX
- ; ---------------------------
- VALID: MOV AX,02H
- INT 33H ;cursor off
- MOV AX,ROW2
- CMP AX,ROW ;flip coords
- JA OKROW ;if necessary
- MOV AX,ROW
- MOV TEMP,AX
- MOV AX,ROW2
- MOV ROW,AX
- MOV AX,TEMP
- MOV ROW2,AX
- OKROW: ;now, row < row2
- MOV AX,COL2
- CMP AX,COL
- JA OKCOL
- MOV AX,COL
- MOV TEMP,AX
- MOV AX,COL2
- MOV COL,AX
- MOV AX,TEMP
- MOV COL2,AX
- OKCOL: ;now, col < col2
- MOV CX,COL2
- SUB CX,COL
- HORIZ: ;draw horiz line
- PUSH CX
- MOV AH,0CH
- MOV AL,PIX
- MOV BH,0
- ADD CX,COL
- MOV DX,ROW
- INT 10H ;write pixel
- POP CX
- LOOP HORIZ
- ; ----------------------------
- MOV CX,COL2
- SUB CX,COL
- HORIZ2:
- PUSH CX
- MOV AH,0CH
- MOV AL,PIX
- MOV BH,0
- ADD CX,COL
- MOV DX,ROW2
- INT 10H ;write pixel
- POP CX
- LOOP HORIZ2
- ; ----------------------------
- MOV CX,ROW2
- SUB CX,ROW
- VERT: ;draw vert line
- PUSH CX
- MOV AH,0CH
- MOV AL,PIX
- MOV BH,0
- ADD CX,ROW
- MOV DX,CX
- MOV CX,COL
- INT 10H ;write pixel
- POP CX
- LOOP VERT
- ; -------------
- MOV AH,0CH
- MOV AL,PIX
- MOV BH,0
- MOV CX,COL
- MOV DX,ROW
- INT 10H ;write up lft pixel
- ; ---------------------------
- MOV CX,ROW2
- SUB CX,ROW
- VERT2:
- PUSH CX
- MOV AH,0CH
- MOV AL,PIX
- MOV BH,0
- ADD CX,ROW
- MOV DX,CX
- MOV CX,COL2
- INT 10H ;write pixel
- POP CX
- LOOP VERT2
- MOV AX,01H
- INT 33H ;cursor on
- JMP BEGINBOX
- BOXDRAW ENDP
- ;-----------------------------------
- QUIT PROC
- MOV AX,0
- INT 33H ;reset mouse
- MOV AH,00H
- MOV AL,03H
- INT 10H ;80 X 25 text
- MOV AH,04CH
- INT 21H ;terminate
- QUIT ENDP
- ;-------------------------------------
- SAVEPIC PROC
- MOV AX,02H
- INT 33H ;turn off mouse
- MOV AX,DS
- MOV BX,AX
- PUSH AX
- MOV AX,ES
- PUSH AX
- MOV DS,AX ;swap ES & DS
- MOV ES,BX
- MOV SI,0
- LEA DI,VIDBU ;copy 16K video
- MOV CX,16384 ;to datasg backup
- REP MOVS ES:BYTE PTR[DI],DS:[SI]
- POP AX
- MOV ES,AX
- POP AX
- MOV DS,AX ;restore ES & DS
- MOV AH,03CH
- MOV CX,0
- LEA DX,FILENAME
- INT 21H ;create file
- MOV HANDLE,AX
- ; -----------------------------
- MOV AH,40H
- MOV BX,HANDLE
- MOV CX,16384
- LEA DX,VIDBU
- INT 21H ;write file
- ; -----------------------------
- MOV AH,3EH
- MOV BX,HANDLE
- INT 21H ;close file
- MOV AX,01H
- INT 33H ;turn on cursor
- RET
- SAVEPIC ENDP
- ;-------------------------------------
- LOADPIC PROC
- MOV AX,02H
- INT 33H ;cursor off
- MOV AH,03DH
- MOV AL,0
- LEA DX,FILENAME
- INT 21H ;open file
- MOV HANDLE,AX
- ; -----------------------------
- MOV AH,03FH
- MOV BX,HANDLE
- MOV CX,16384
- LEA DX,VIDBU
- INT 21H ;read file
- ; -----------------------------
- MOV AH,03EH
- MOV BX,HANDLE
- INT 21H ;close file
- LEA SI,VIDBU
- MOV DI,0 ;copy loaded pic
- MOV CX,16384 ;to video
- REP MOVS ES:BYTE PTR[DI],DS:[SI]
- MOV CLEARFLAG,1
- RET
- LOADPIC ENDP
- ;-------------------------------------
- CLRSCREEN PROC
- MOV AX,02H
- INT 33H ;turn off cursor
- MOV DI,0
- MOV CX,16384
- MOV AL,0
- CMP PIX,1
- JZ SAME
- NOT AL ;reverse
- SAME: REP STOSB ;clear video 16K
- MOV CLEARFLAG,1
- RET
- CLRSCREEN ENDP
- ;-------------------------------------
- LINEDRAW PROC
- BEGINLINE:
- B4EGINDRAW:
- MOV PIX,1
- CLC
- MOV AX,3
- INT 33H
- SHR BX,1 ;chk left
- JC C4ONTINUE
- CLC
- SHR BX,1 ;check right
- JNC B4EGINDRAW
- MOV PIX,0
- C4ONTINUE:
- CMP DX,10 ;if menu
- JBE M4ENUC
- JMP C4ONT2
- M4ENUC: RET
- C4ONT2:
- ; -----------------------------
- MOV AH,0CH
- MOV AL,PIX
- MOV BH,0
- INT 10H ;write pixel (1or0)
- MOV COL,CX ; at init coord.
- MOV ROW,DX
- ; ---------------
- CMP PIX,0
- JZ C4HKRIGHT
- C4HKLEFT: CLC
- MOV AX,05H
- MOV BX,0
- INT 33H
- SHR AX,1
- JC C4HKLEFT
- JMP R4ELOUT ;on release
- C4HKRIGHT: CLC
- MOV AX,05H
- MOV BX,1
- INT 33H
- SHR AX,1
- SHR AX,1
- JC C4HKRIGHT
- R4ELOUT:
- MOV AX,03H
- INT 33H
- CMP DX,10 ;if menu
- JA C4ONT
- RET
- C4ONT: MOV COL2,CX
- MOV ROW2,DX ;store 2nd coord
- ; ---------------------------
- MOV AX,02H
- INT 33H ;cursor off
- CALL DRAWLINE ;draw
- MOV AX,01H
- INT 33H ;cursor on
- JMP BEGINLINE
- LINEDRAW ENDP
- ;-------------------------------------
- DRAWLINE PROC
- MOV AX,ROW2
- SUB AX,ROW
- ; ---------------------------
- MOV SI,1
- JGE STOREROW
- MOV SI,-1
- NEG AX
- STOREROW:
- MOV CHANGEROW,AX
- ; ---------------------------
- MOV AX,COL2
- SUB AX,COL
- ; ---------------------------
- MOV DI,1
- JGE STORECOL
- MOV DI,-1
- NEG AX
- STORECOL:
- MOV CHANGECOL,AX
- ; ---------------------------
- MOV AX,CHANGECOL
- CMP AX,CHANGEROW
- JL MORET45
- CALL LT45DEG
- JMP DDDONE
- ; ---------------------------
- MORET45: CALL GT45DEG
- DDDONE: RET
- DRAWLINE ENDP
- ;-----------------------------------
- LT45DEG PROC ;if slope < 45 degrees
- MOV AX,CHANGECOL
- SHR AX,1
- MOV HALFCCOL,AX
- ; ---------------------------
- MOV CX,COL
- MOV DX,ROW
- MOV BX,0
- MOV AX,CHANGECOL
- MOV COUNT,AX
- DRAW:
- PUSH AX
- PUSH BX
- PUSH CX
- PUSH DX
- PUSH SI
- PUSH DI
- MOV AH,0CH
- MOV AL,PIX
- MOV BH,0
- INT 10H ;write pixel
- POP DI
- POP SI
- POP DX
- POP CX
- POP BX
- POP AX
- ; ----------------------------
- ADD CX,DI ;inc/dec col
- ADD BX,CHANGEROW
- CMP BX,HALFCCOL
- JLE C6ONT
- SUB BX,CHANGECOL
- ADD DX,SI ;inc/dec row
- C6ONT: DEC COUNT
- JGE DRAW
- RET
- LT45DEG ENDP
- ;-------------------------------------
- GT45DEG PROC ;if slope > 45 degrees
- MOV AX,CHANGECOL
- SHR AX,1
- MOV HALFCROW,AX
- ; -----------------------------
- MOV CX,COL
- MOV DX,ROW
- MOV BX,0
- MOV AX,CHANGEROW
- MOV COUNT,AX
- DRAW2:
- PUSH AX
- PUSH BX
- PUSH CX
- PUSH DX
- PUSH SI
- PUSH DI
- MOV AH,0CH
- MOV AL,PIX
- MOV BH,0
- INT 10H ;write pixel
- POP DI
- POP SI
- POP DX
- POP CX
- POP BX
- POP AX
- ; ----------------------------
- ADD DX,SI ;inc/dec row
- ADD BX,CHANGECOL
- CMP BX,HALFCROW
- JLE C7ONT
- SUB BX,CHANGEROW
- ADD CX,DI ;inc/dec col
- C7ONT: DEC COUNT
- JGE DRAW2
- RET
- GT45DEG ENDP
- ;-------------------------------------
- CODESG ENDS
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement