Advertisement
advoskater

minidraw.asm revision 1.10 (white on black for better CGA/TGA compatibility)

Dec 21st, 2020 (edited)
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .ALPHA
  2. TITLE    MINIDRAW        ;$Revision: 1.10 $
  3. ; Dr. Dave's Diversions, $Date: 2020-12-21 12:50:26-05 $
  4. ; (original by Dave, 1988)
  5. ;----------------------------------
  6. VIDEO    SEGMENT AT 0B800H
  7.          DB 16384 DUP(?)
  8. VIDEO    ENDS
  9. ;----------------------------------
  10. DATASG   SEGMENT PARA 'Data'
  11. REVISION DB 'minidraw $Revision: 1.10 $, released to the public domain.',0
  12. MENUTEXT DB '    FREE        BOX        LINE      CLEAR       LOAD       SAVE        QUIT    $'
  13. ROW      DW ?
  14. COL      DW ?
  15. ROW2     DW ?
  16. COL2     DW ?
  17. TEMP     DW ?   ;for swapping coord.s
  18. COUNT    DW ?   ;for line drawing
  19. CHANGECOL DW ?
  20. CHANGEROW DW ?
  21. HALFCCOL DW ?
  22. HALFCROW DW ?
  23. PIX      DB ?   ;pixel value (1or0)
  24. CLEARFLAG DB ?  ; signals to redraw menu
  25. CURSORON DB ?  ; track cursor on/off in FREEDRAW
  26. FILENAME DB 'A:\SAVED.PIC',0
  27. HANDLE   DW ?
  28. VIDBU    DB 16384 DUP(?) ;video backup
  29. DATASG   ENDS
  30. ;--------------------------------------
  31. CODESG   SEGMENT PARA 'Code'
  32.          ASSUME CS:CODESG, DS:DATASG, ES:VIDEO
  33. MAIN     PROC
  34.          MOV    AX,DATASG
  35.          MOV    DS,AX
  36.          MOV    AX,VIDEO
  37.          MOV    ES,AX
  38. ;        ---------------------------
  39.          MOV    AH,00H
  40.          MOV    AL,06H
  41.          INT    10H     ;640 X 200
  42. ;        ---------------------------
  43. ;        The following sets the background color to blue on MCGA or better.
  44. ;        Unfortunately, on 640x200 2-color mode in CGA, it sets the foreground
  45. ;        color to blue. Blue on black... yuck.
  46. ;        Thanks, RetroTech Chris (YouTube) for finding the differing behavior.
  47. ;        Comment for better CGA/TGA compatibility:
  48. ;         MOV    AH,0BH
  49. ;         MOV    BH,00H
  50. ;         MOV    BL,01   ;color
  51. ;         INT    10H
  52. ;        ---------------------------
  53.          MOV    CLEARFLAG,0
  54.          MOV    PIX,1
  55. START::          ;create menu bar
  56.          MOV    AH,02H
  57.          MOV    BH,0
  58.          MOV    DH,0
  59.          MOV    DL,0
  60.          INT    10H
  61.          MOV    AH,09H
  62.          LEA    DX,MENUTEXT
  63.          INT    21H
  64.          MOV    ROW,10
  65.          MOV    COL,0
  66. BAR:     MOV    AH,0CH
  67.          MOV    AL,PIX
  68.          MOV    BH,0
  69.          MOV    DX,ROW
  70.          MOV    CX,COL
  71.          INT    10H     ;write pix
  72.          INC    COL
  73.          CMP    COL,640
  74.          JNZ    BAR
  75. BAR2:
  76.          MOV    CX,95
  77. LOP2:    MOV    DX,0
  78. LOP:     MOV    AH,0CH
  79.          MOV    AL,PIX
  80.          MOV    BH,0
  81.          INT    10H
  82.          INC    DX
  83.          INC    DX
  84.          CMP    DX,10
  85.          JZ     OUT1
  86.          JMP    LOP
  87. OUT1:    CMP    CX,545
  88.          JZ     OUT2
  89.          ADD    CX,90
  90.          JMP    LOP2
  91. OUT2:
  92. ;        ---------------------------
  93. SETUP::          ;init mouse position
  94.          CMP    CLEARFLAG,1
  95.          JZ     SETOUT
  96.          MOV    AX,4
  97.          MOV    CX,320
  98.          MOV    DX,100
  99.          INT    33H
  100. SETOUT:
  101.          MOV    AX,01H
  102.          INT    33H     ;show cursor
  103. ;        ---------------------------
  104.          CALL   FREEDRAW ;***** START *****
  105. MAIN     ENDP
  106. MENU     PROC
  107. MENUBEGIN: CMP  CX,95
  108.          JB     FREEDRAWC
  109.          CMP    CX,185
  110.          JB     BOXDRAWC
  111.          CMP    CX,275
  112.          JB     LINEDRAWC
  113.          CMP    CX,365
  114.          JB     CLRSCREENC
  115.          CMP    CX,455
  116.          JB     LOADPICC
  117.          CMP    CX,545
  118.          JB     SAVEPICC
  119.          CALL   QUIT
  120. FREEDRAWC: CALL FREEDRAW
  121.          JMP    MENUBEGIN ;on return
  122. BOXDRAWC: CALL BOXDRAW
  123.          JMP    MENUBEGIN
  124. LINEDRAWC: CALL LINEDRAW
  125.          JMP    MENUBEGIN
  126. CLRSCREENC: CALL CLRSCREEN
  127.          JMP    START
  128. LOADPICC: CALL LOADPIC
  129.          JMP    START
  130. SAVEPICC: CALL SAVEPIC
  131.          JMP    SETUP
  132. MENU     ENDP
  133. ;        ----------------------------
  134. FREEDRAW PROC
  135. BEGINFREE:
  136.          MOV    AX,01H
  137.          INT    33H     ;show cursor
  138.          MOV    CURSORON,1
  139. BEGINDRAW:
  140.          MOV    PIX,1
  141.          CLC
  142.          MOV    AX,3
  143.          INT    33H
  144.          SHR    BX,1 ;check for lft button
  145.          JC     CONTINUE
  146.          CLC
  147.          SHR    BX,1 ;check for rght button
  148.          JNC    BEGINFREE
  149.          MOV    PIX,0 ;set to border color
  150. CONTINUE:
  151.          CMP    DX,10 ;if in menu
  152.          JBE    MENUC
  153.          CLC
  154.      MOV    BL,CURSORON
  155.      SHR    BL,1 ; check for cursor on
  156.      JNC    CONT2
  157.          MOV    AX,02H
  158.          INT    33H     ;turn off cursor
  159.      MOV    CURSORON,0
  160.          JMP    CONT2
  161. MENUC:
  162.          MOV    AX,01H
  163.          INT    33H     ;show cursor
  164.      MOV    CURSORON,1
  165.          RET
  166. CONT2:
  167.          MOV    AH,0CH
  168.          MOV    AL,PIX
  169.          MOV    BH,0
  170.          INT    10H     ;write pixel
  171.          JMP    BEGINDRAW
  172. FREEDRAW ENDP
  173. ;-----------------------------------
  174. BOXDRAW  PROC
  175. BEGINBOX:
  176. B2EGINDRAW:
  177.          MOV    PIX,1
  178.          CLC
  179.          MOV    AX,3
  180.          INT    33H
  181.          SHR    BX,1 ;chk for lft button
  182.          JC     C2ONTINUE
  183.          CLC
  184.          SHR    BX,1 ;chk right
  185.          JNC    B2EGINDRAW
  186.          MOV    PIX,0
  187. C2ONTINUE:
  188.          CMP    DX,10 ;if menu
  189.          JBE    M2ENUC
  190.          JMP    C2ONT2
  191. M2ENUC:   RET
  192. C2ONT2:
  193. ;        -----------------------------
  194.          MOV    AH,0CH
  195.          MOV    AL,PIX
  196.          MOV    BH,0
  197.          INT    10H     ;write pixel (1or0)
  198.          MOV    COL,CX  ;  at init coord
  199.          MOV    ROW,DX
  200. ;        ---------------
  201.          CMP    PIX,0
  202.          JZ     CHKRIGHT
  203. CHKLEFT: CLC
  204.          MOV    AX,05H
  205.          MOV    BX,0
  206.          INT    33H
  207.          SHR    AX,1
  208.          JC     CHKLEFT
  209.          JMP    RELOUT  ; on button release
  210. CHKRIGHT: CLC
  211.          MOV    AX,05H
  212.          MOV    BX,1
  213.          INT    33H
  214.          SHR    AX,1
  215.          SHR    AX,1
  216.          JC     CHKRIGHT
  217. RELOUT:
  218.          MOV    AX,03H
  219.          INT    33H
  220.          CMP    DX,10   ;if menu
  221.          JA     C3ONT
  222.          RET
  223. C3ONT:   MOV    COL2,CX
  224.          MOV    ROW2,DX ;store 2nd coord
  225. ;        ---------------------------
  226.          MOV    AX,COL
  227.          CMP    AX,COL2
  228.          JZ     INVALID
  229.          MOV    AX,ROW
  230.          CMP    AX,ROW2
  231.          JZ     INVALID
  232.          JMP    VALID
  233. INVALID: JMP    BEGINBOX
  234. ;        ---------------------------
  235. VALID:   MOV    AX,02H
  236.          INT    33H     ;cursor off
  237.          MOV    AX,ROW2
  238.          CMP    AX,ROW  ;flip coords
  239.          JA     OKROW   ;if necessary
  240.          MOV    AX,ROW
  241.          MOV    TEMP,AX
  242.          MOV    AX,ROW2
  243.          MOV    ROW,AX
  244.          MOV    AX,TEMP
  245.          MOV    ROW2,AX
  246. OKROW:          ;now, row < row2
  247.          MOV    AX,COL2
  248.          CMP    AX,COL
  249.          JA     OKCOL
  250.          MOV    AX,COL
  251.          MOV    TEMP,AX
  252.          MOV    AX,COL2
  253.          MOV    COL,AX
  254.          MOV    AX,TEMP
  255.          MOV    COL2,AX
  256. OKCOL:          ;now, col < col2
  257.          MOV    CX,COL2
  258.          SUB    CX,COL
  259. HORIZ:          ;draw horiz line
  260.          PUSH   CX
  261.          MOV    AH,0CH
  262.          MOV    AL,PIX
  263.          MOV    BH,0
  264.          ADD    CX,COL
  265.          MOV    DX,ROW
  266.          INT    10H     ;write pixel
  267.          POP    CX
  268.          LOOP   HORIZ
  269. ;        ----------------------------
  270.          MOV    CX,COL2
  271.          SUB    CX,COL
  272. HORIZ2:
  273.          PUSH   CX
  274.          MOV    AH,0CH
  275.          MOV    AL,PIX
  276.          MOV    BH,0
  277.          ADD    CX,COL
  278.          MOV    DX,ROW2
  279.          INT    10H     ;write pixel
  280.          POP    CX
  281.          LOOP   HORIZ2
  282. ;        ----------------------------
  283.          MOV    CX,ROW2
  284.          SUB    CX,ROW
  285. VERT:           ;draw vert line
  286.          PUSH   CX
  287.          MOV    AH,0CH
  288.          MOV    AL,PIX
  289.          MOV    BH,0
  290.          ADD    CX,ROW
  291.          MOV    DX,CX
  292.          MOV    CX,COL
  293.          INT    10H     ;write pixel
  294.          POP    CX
  295.          LOOP   VERT
  296. ;        -------------
  297.          MOV    AH,0CH
  298.          MOV    AL,PIX
  299.          MOV    BH,0
  300.          MOV    CX,COL
  301.          MOV    DX,ROW
  302.          INT    10H     ;write up lft pixel
  303. ;        ---------------------------
  304.          MOV    CX,ROW2
  305.          SUB    CX,ROW
  306. VERT2:
  307.          PUSH   CX
  308.          MOV    AH,0CH
  309.          MOV    AL,PIX
  310.          MOV    BH,0
  311.          ADD    CX,ROW
  312.          MOV    DX,CX
  313.          MOV    CX,COL2
  314.          INT    10H     ;write pixel
  315.          POP    CX
  316.          LOOP   VERT2
  317.          MOV    AX,01H
  318.          INT    33H     ;cursor on
  319.          JMP    BEGINBOX
  320. BOXDRAW  ENDP
  321. ;-----------------------------------
  322. QUIT     PROC
  323.          MOV    AX,0
  324.          INT    33H     ;reset mouse
  325.          MOV    AH,00H
  326.          MOV    AL,03H
  327.          INT    10H     ;80 X 25 text
  328.          MOV    AH,04CH
  329.          INT    21H     ;terminate
  330. QUIT     ENDP
  331. ;-------------------------------------
  332. SAVEPIC  PROC
  333.          MOV    AX,02H
  334.          INT    33H     ;turn off mouse
  335.          MOV    AX,DS
  336.          MOV    BX,AX
  337.          PUSH   AX
  338.          MOV    AX,ES
  339.          PUSH   AX
  340.          MOV    DS,AX   ;swap ES & DS
  341.          MOV    ES,BX
  342.          MOV    SI,0
  343.          LEA    DI,VIDBU ;copy 16K video
  344.          MOV    CX,16384 ;to datasg backup
  345.          REP MOVS ES:BYTE PTR[DI],DS:[SI]
  346.          POP    AX
  347.          MOV    ES,AX
  348.          POP    AX
  349.          MOV    DS,AX   ;restore ES & DS
  350.          MOV    AH,03CH
  351.          MOV    CX,0
  352.          LEA    DX,FILENAME
  353.          INT    21H     ;create file
  354.          MOV    HANDLE,AX
  355. ;        -----------------------------
  356.          MOV    AH,40H
  357.          MOV    BX,HANDLE
  358.          MOV    CX,16384
  359.          LEA    DX,VIDBU
  360.          INT    21H     ;write file
  361. ;        -----------------------------
  362.          MOV    AH,3EH
  363.          MOV    BX,HANDLE
  364.          INT    21H     ;close file
  365.          MOV    AX,01H
  366.          INT    33H     ;turn on cursor
  367.          RET
  368. SAVEPIC  ENDP
  369. ;-------------------------------------
  370. LOADPIC  PROC
  371.          MOV    AX,02H
  372.          INT    33H     ;cursor off
  373.          MOV    AH,03DH
  374.          MOV    AL,0
  375.          LEA    DX,FILENAME
  376.          INT    21H     ;open file
  377.          MOV    HANDLE,AX
  378. ;        -----------------------------
  379.          MOV    AH,03FH
  380.          MOV    BX,HANDLE
  381.          MOV    CX,16384
  382.          LEA    DX,VIDBU
  383.          INT    21H     ;read file
  384. ;        -----------------------------
  385.          MOV    AH,03EH
  386.          MOV    BX,HANDLE
  387.          INT    21H     ;close file
  388.          LEA    SI,VIDBU
  389.          MOV    DI,0    ;copy loaded pic
  390.          MOV    CX,16384 ;to video
  391.          REP MOVS ES:BYTE PTR[DI],DS:[SI]
  392.          MOV    CLEARFLAG,1
  393.          RET
  394. LOADPIC  ENDP
  395. ;-------------------------------------
  396. CLRSCREEN PROC
  397.          MOV    AX,02H
  398.          INT    33H     ;turn off cursor
  399.          MOV    DI,0
  400.          MOV    CX,16384
  401.          MOV    AL,0
  402.          CMP    PIX,1
  403.          JZ     SAME
  404.          NOT    AL      ;reverse
  405. SAME:    REP STOSB      ;clear video 16K
  406.          MOV    CLEARFLAG,1
  407.          RET
  408. CLRSCREEN ENDP
  409. ;-------------------------------------
  410. LINEDRAW PROC
  411. BEGINLINE:
  412. B4EGINDRAW:
  413.          MOV    PIX,1
  414.          CLC
  415.          MOV    AX,3
  416.          INT    33H
  417.          SHR    BX,1    ;chk left
  418.          JC     C4ONTINUE
  419.          CLC
  420.          SHR    BX,1    ;check right
  421.          JNC    B4EGINDRAW
  422.          MOV    PIX,0
  423. C4ONTINUE:
  424.          CMP    DX,10   ;if menu
  425.          JBE    M4ENUC
  426.          JMP    C4ONT2
  427. M4ENUC:  RET
  428. C4ONT2:
  429. ;        -----------------------------
  430.          MOV    AH,0CH
  431.          MOV    AL,PIX
  432.          MOV    BH,0
  433.          INT    10H     ;write pixel (1or0)
  434.          MOV    COL,CX  ;  at init coord.
  435.          MOV    ROW,DX
  436. ;        ---------------
  437.          CMP    PIX,0
  438.          JZ     C4HKRIGHT
  439. C4HKLEFT: CLC
  440.          MOV    AX,05H
  441.          MOV    BX,0
  442.          INT    33H
  443.          SHR    AX,1
  444.          JC     C4HKLEFT
  445.          JMP    R4ELOUT ;on release
  446. C4HKRIGHT: CLC
  447.          MOV    AX,05H
  448.          MOV    BX,1
  449.          INT    33H
  450.          SHR    AX,1
  451.          SHR    AX,1
  452.          JC     C4HKRIGHT
  453. R4ELOUT:
  454.          MOV    AX,03H
  455.          INT    33H
  456.          CMP    DX,10   ;if menu
  457.          JA     C4ONT
  458.          RET
  459. C4ONT:   MOV    COL2,CX
  460.          MOV    ROW2,DX ;store 2nd coord
  461. ;        ---------------------------
  462.          MOV    AX,02H
  463.          INT    33H     ;cursor off
  464.          CALL   DRAWLINE ;draw
  465.          MOV    AX,01H
  466.          INT    33H     ;cursor on
  467.          JMP    BEGINLINE
  468. LINEDRAW ENDP
  469. ;-------------------------------------
  470. DRAWLINE PROC
  471.          MOV    AX,ROW2
  472.          SUB    AX,ROW
  473. ;        ---------------------------
  474.          MOV    SI,1
  475.          JGE    STOREROW
  476.          MOV    SI,-1
  477.          NEG    AX
  478. STOREROW:
  479.          MOV    CHANGEROW,AX
  480. ;        ---------------------------
  481.          MOV    AX,COL2
  482.          SUB    AX,COL
  483. ;        ---------------------------
  484.          MOV    DI,1
  485.          JGE    STORECOL
  486.          MOV    DI,-1
  487.          NEG    AX
  488. STORECOL:
  489.          MOV    CHANGECOL,AX
  490. ;        ---------------------------
  491.          MOV    AX,CHANGECOL
  492.          CMP    AX,CHANGEROW
  493.          JL     MORET45
  494.          CALL   LT45DEG
  495.          JMP    DDDONE
  496. ;        ---------------------------
  497. MORET45: CALL   GT45DEG
  498. DDDONE:  RET
  499. DRAWLINE ENDP
  500. ;-----------------------------------
  501. LT45DEG  PROC   ;if slope < 45 degrees
  502.          MOV    AX,CHANGECOL
  503.          SHR    AX,1
  504.          MOV    HALFCCOL,AX
  505. ;        ---------------------------
  506.          MOV    CX,COL
  507.          MOV    DX,ROW
  508.          MOV    BX,0
  509.          MOV    AX,CHANGECOL
  510.          MOV    COUNT,AX
  511. DRAW:
  512.          PUSH   AX
  513.          PUSH   BX
  514.          PUSH   CX
  515.          PUSH   DX
  516.          PUSH   SI
  517.          PUSH   DI
  518.          MOV    AH,0CH
  519.          MOV    AL,PIX
  520.          MOV    BH,0
  521.          INT    10H     ;write pixel
  522.          POP    DI
  523.          POP    SI
  524.          POP    DX
  525.          POP    CX
  526.          POP    BX
  527.          POP    AX
  528. ;        ----------------------------
  529.          ADD    CX,DI   ;inc/dec col
  530.          ADD    BX,CHANGEROW
  531.          CMP    BX,HALFCCOL
  532.          JLE    C6ONT
  533.          SUB    BX,CHANGECOL
  534.          ADD    DX,SI   ;inc/dec row
  535. C6ONT:   DEC    COUNT
  536.          JGE    DRAW
  537.          RET
  538. LT45DEG  ENDP
  539. ;-------------------------------------
  540. GT45DEG  PROC   ;if slope > 45 degrees
  541.          MOV    AX,CHANGECOL
  542.          SHR    AX,1
  543.          MOV    HALFCROW,AX
  544. ;        -----------------------------
  545.          MOV    CX,COL
  546.          MOV    DX,ROW
  547.          MOV    BX,0
  548.          MOV    AX,CHANGEROW
  549.          MOV    COUNT,AX
  550. DRAW2:
  551.          PUSH   AX
  552.          PUSH   BX
  553.          PUSH   CX
  554.          PUSH   DX
  555.          PUSH   SI
  556.          PUSH   DI
  557.          MOV    AH,0CH
  558.          MOV    AL,PIX
  559.          MOV    BH,0
  560.          INT    10H     ;write pixel
  561.          POP    DI
  562.          POP    SI
  563.          POP    DX
  564.          POP    CX
  565.          POP    BX
  566.          POP    AX
  567. ;        ----------------------------
  568.          ADD    DX,SI   ;inc/dec row
  569.          ADD    BX,CHANGECOL
  570.          CMP    BX,HALFCROW
  571.          JLE    C7ONT
  572.          SUB    BX,CHANGEROW
  573.          ADD    CX,DI   ;inc/dec col
  574. C7ONT:   DEC    COUNT
  575.          JGE    DRAW2
  576.          RET
  577. GT45DEG  ENDP
  578. ;-------------------------------------
  579. CODESG   ENDS
  580.          END
  581.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement