home *** CD-ROM | disk | FTP | other *** search
/ The Unsorted BBS Collection / thegreatunsorted.tar / thegreatunsorted / programming / misc_programming / AGUL / ADA_UTIL.ASM next >
Encoding:
Assembly Source File  |  1990-10-25  |  10.0 KB  |  348 lines

  1. ;        ╔═════════════════════════════════════════════════════════════╗
  2. ;        ║█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█║
  3. ;        ║█                                                           █║
  4. ;        ║█                 Meridian Software Systems                 █║
  5. ;        ║█                                                           █║
  6. ;        ║█                    Copyright (C)  1990                    █║
  7. ;        ║█                                                           █║
  8. ;        ║█                    ALL RIGHTS RESERVED                    █║
  9. ;        ║█                                                           █║
  10. ;        ║█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█║
  11. ;        ╚═════════════════════════════════════════════════════════════╝
  12.  
  13.               TITLE     'ADA Utility Routines'
  14.               NAME      Ada_Util
  15.               PAGE      55, 132
  16.  
  17.  
  18. ARGx1         EQU       WORD PTR [BP+ 6]  ; Stack frame addressing
  19. ARGy1         EQU       WORD PTR [BP+ 8]
  20. ARGx2         EQU       WORD PTR [BP+10]
  21. ARGy2         EQU       WORD PTR [BP+12]
  22. ARGn          EQU       WORD PTR [BP+14]
  23. VARleafincr   EQU       WORD PTR [BP- 6]
  24. VARincr1      EQU       WORD PTR [BP- 8]
  25. VARincr2      EQU       WORD PTR [BP-10]
  26. VARroutine    EQU       WORD PTR [BP-12]
  27.  
  28. ByteOffShift  EQU       3                 ; Used to convert pixels to byte off
  29.  
  30. COMMENT *
  31.  
  32. DGROUP        GROUP     $$DATA
  33.  
  34. *
  35.  
  36. $$DATA        SEGMENT  PARA PUBLIC 'DATA'
  37.  
  38.  
  39. START_X       DW ?
  40. END_X         DW ?
  41. START_Y       DW ?
  42. END_Y         DW ?
  43. COLOR         DB ?
  44. W_UPPER_X     DW ?
  45. W_UPPER_Y     DW ?
  46. W_LOWER_X     DW ?
  47. W_LOWER_Y     DW ?
  48. CLP_ENBL      DW ?
  49. VIDEO_PAGE    DB ?
  50. DIAGONAL_Y_INCREMENT DW ?
  51. DIAGONAL_X_INCREMENT DW ?
  52. SHORT_DISTANCE       DW ?
  53. STRAIGHT_X_INCREMENT DW ?
  54. STRAIGHT_Y_INCREMENT DW ?
  55. STRAIGHT_COUNT       DW ?
  56. DIAGONAL_COUNT       DW ?
  57.  
  58.  
  59. CRTCParms     DB        00H,35H
  60.           DB        01H,2DH
  61.           DB        02H,2EH
  62.           DB        03H,07H
  63.           DB        04H,5BH
  64.           DB        05H,02H
  65.           DB        06H,57H
  66.           DB        07H,57H
  67.           DB        09H,03H
  68.  
  69.  
  70. CRTCParmsLen  EQU       ($-CRTCParms)/2
  71.  
  72. BIOSData      DB        7
  73.           DW        80
  74.           DW        8000H
  75.           DW        0
  76.           DW        0
  77.           DW        0
  78.           DW        0
  79.           DW        0
  80.           DW        0
  81.           DW        0
  82.           DW        0
  83.           DW        0
  84.           DW        0
  85.               DB        0
  86. CRTCAddr      DW        3B4H
  87. CRTMode       DB        0AH
  88.               DB        0
  89.  
  90. BIOSDataLen   EQU       $-BIOSData
  91.  
  92. $$DATA        ENDS
  93.  
  94.  
  95. ASM_PACKAGE   SEGMENT   PARA PUBLIC 'CODE'
  96.           ASSUME    CS: ASM_PACKAGE, DS: $$DATA
  97.  
  98.               PUBLIC    HERC_GRAPH_MODE
  99. HERC_GRAPH_MODE PROC      FAR
  100.  
  101.           PUSH      BP
  102.           MOV       BP,SP
  103.           PUSH      SI
  104.           PUSH      DI
  105.  
  106.           MOV       AX,40H
  107.           MOV       ES,AX
  108.           MOV       DI,49H
  109.  
  110.           MOV       SI,OFFSET $$DATA: BIOSData
  111.           MOV       CX,BIOSDataLen
  112.           REP       MOVSB
  113.  
  114.           MOV       DX,3BFH
  115.           MOV       AL,1
  116.           OUT       DX,AL
  117.  
  118.           MOV       DX,3B8H
  119.           XOR       AL,AL
  120.           OUT       DX,AL
  121.  
  122.           SUB       DL,4
  123.           MOV       SI,OFFSET $$DATA: CRTCParms
  124.           MOV       CX,CRTCParmsLen
  125.  
  126. L01:          LODSW
  127.           OUT       DX,AX
  128.           LOOP      L01
  129.  
  130.           ADD       DL,4
  131.           MOV       AL,CRTMode
  132.           OUT       DX,AL
  133.  
  134.           POP       DI
  135.           POP       SI
  136.           MOV       SP,BP
  137.           POP       BP
  138.           RET
  139.  
  140. HERC_GRAPH_MODE ENDP
  141.  
  142.  
  143.           PUBLIC    VIDEO_MODE
  144. VIDEO_MODE    PROC      FAR
  145.  
  146.           PUSH      BP
  147.           MOV       BP,SP
  148.           MOV       AX, 6[BP]         ; Get Video mode
  149.           MOV       AH, 00H
  150.           INT       10H
  151.           POP       BP
  152.           RET       02H
  153.  
  154. VIDEO_MODE    ENDP
  155.  
  156.  
  157.           PUBLIC    PLOT
  158. PLOT          PROC      FAR
  159.  
  160.           PUSH      BP                ; Save base pointer
  161.           MOV       BP,SP
  162.           MOV       CX,  6[BP]        ; Get column of pixel
  163.           MOV       DX,  8[BP]        ; Get row    of pixel
  164.           MOV       AX, 10[BP]        ; Get color
  165.           MOV       BX, 12[BP]        ; Get Video Page
  166.           XCHG      BH, BL
  167.           MOV       AH,0CH            ; Plot pixel
  168.           INT       10H
  169.           POP       BP
  170.           RET       08H
  171.  
  172. PLOT          ENDP
  173.  
  174. ;----------------------------------------------------------------
  175. PAGE
  176. ;----------------------------------------------------------------
  177. ;
  178. ; This subroutine draws a straight line between two points in
  179. ; preset video mode, and location parameters passed from calling routine
  180. ;
  181. ;----------------------------------------------------------------
  182.  
  183.           PUBLIC    DRAW
  184. DRAW          PROC      FAR
  185.  
  186.           PUSH      BP
  187.           MOV       BP,SP             ; Save Stack
  188.           MOV       AX,  6[BP]        ; Get X1
  189.           MOV       START_X,AX
  190.           MOV       AX,  8[BP]        ; Get Y1
  191.           MOV       START_Y,AX
  192.           MOV       AX, 10[BP]        ; Get X2
  193.           MOV       END_X,AX
  194.           MOV       AX, 12[BP]        ; Get Y2
  195.           MOV       END_Y,AX
  196.           MOV       AX, 14[BP]        ; Get color
  197.           MOV       COLOR,AL
  198.           MOV       AX, 16[BP]        ; Get window_upper_x coordinate
  199.           MOV       W_UPPER_X,AX
  200.           MOV       AX, 18[BP]        ; Get window_upper_y coordinate
  201.           MOV       W_UPPER_Y,AX
  202.           MOV       AX, 20[BP]        ; Get window_lower_x coordinate
  203.           MOV       W_LOWER_X,AX
  204.           MOV       AX, 22[BP]        ; Get window_lower_y coordinate
  205.           MOV       W_LOWER_Y,AX
  206.           MOV       AX, 24[BP]        ; Get window clipping (boolean)
  207.           MOV       CLP_ENBL,AX
  208.           MOV       AX, 26[BP]        ; Get Video Page
  209.           MOV       VIDEO_PAGE,AL
  210.           MOV       AX,START_X        ; Are the points the same?
  211.           CMP       AX,END_X
  212.           JNE       NOT_SAME
  213.           MOV       AX,START_Y
  214.           CMP       AX,END_Y
  215.           JNE       NOT_SAME
  216.           MOV       CX,START_X        ; Yes, then just plot one point
  217.           MOV       DX,START_Y
  218.           MOV       AL,COLOR
  219.           MOV       BH,VIDEO_PAGE
  220.           MOV       AH,0CH
  221.           INT       10H
  222.           POP       BP
  223.           RET       14H               ; No, then draw a line between them
  224. NOT_SAME:
  225.           MOV       CX,01H
  226.           MOV       DX,01H
  227.           MOV       DI,END_Y
  228.           SUB       DI,START_Y        ; Get DeltaY = EndY - StartY
  229.           JGE       KEEP_Y
  230.           NEG       DX
  231.           NEG       DI                ; Otherwise force DeltaY positive
  232. KEEP_Y:
  233.           MOV       DIAGONAL_Y_INCREMENT,DX
  234.           MOV       SI,END_X
  235.           SUB       SI,START_X        ; Get DeltaX = EndX - StartX
  236.           JGE       KEEP_X
  237.           NEG       CX
  238.           NEG       SI                ; Force DeltaX positive
  239. KEEP_X:
  240.           MOV       DIAGONAL_X_INCREMENT,CX
  241.           CMP       SI,DI
  242.           JGE       HORZ_SEG
  243.           MOV       CX,0
  244.           XCHG      SI,DI
  245.           JMP       SAVE_VALUES
  246. HORZ_SEG:
  247.           MOV       DX,00H
  248. SAVE_VALUES:
  249.           MOV       SHORT_DISTANCE,DI
  250.           MOV       STRAIGHT_X_INCREMENT,CX
  251.           MOV       STRAIGHT_Y_INCREMENT,DX
  252.           MOV       AX,SHORT_DISTANCE
  253.           SHL       AX,1
  254.           MOV       STRAIGHT_COUNT,AX
  255.           SUB       AX,SI
  256.           MOV       BX,AX
  257.           SUB       AX,SI
  258.           MOV       DIAGONAL_COUNT,AX
  259.           MOV       CX,START_X
  260.           MOV       DX,START_Y
  261.           INC       SI
  262. MAINLOOP:
  263.           DEC       SI
  264.           JZ        LINE_FINISHED
  265.           MOV       AX,CLP_ENBL       ; If window clipping is enable
  266.           CMP       AL,00H            ; then have to check boundaries
  267.           JZ        PLOT_THE_POINT    ; otherwise just plot the point
  268.           CMP       CX,W_UPPER_X      ; Check for LEFT boundary
  269.           JLE       BYPASS            ; if less than then don't plot it
  270.           CMP       CX,W_LOWER_X      ; Check for RIGHT boundary
  271.           JGE       BYPASS            ; if less than then don't plot it
  272.           CMP       DX,W_UPPER_Y      ; Check for UPPER boundary
  273.           JLE       BYPASS            ; if less than then don't plot it
  274.           CMP       DX,W_LOWER_Y      ; Check for LOWER boundary
  275.           JGE       BYPASS            ; if less than then don't plot it
  276. PLOT_THE_POINT:
  277.           MOV       AH,12
  278.           MOV       AL,COLOR
  279.           PUSH      BX                ; Save BX
  280.           MOV       BH,VIDEO_PAGE
  281.           INT       10H
  282.           POP       BX                ; Restore BX
  283. BYPASS:
  284.           CMP       BX,0
  285.           JGE       DIAGONAL_LINE
  286.           ADD       CX,STRAIGHT_X_INCREMENT
  287.           ADD       DX,STRAIGHT_Y_INCREMENT
  288.           ADD       BX,STRAIGHT_COUNT
  289.           JMP       SHORT MAINLOOP
  290. DIAGONAL_LINE:
  291.           ADD       CX,DIAGONAL_X_INCREMENT
  292.           ADD       DX,DIAGONAL_Y_INCREMENT
  293.           ADD       BX,DIAGONAL_COUNT
  294.           JMP       SHORT MAINLOOP
  295. LINE_FINISHED:
  296.           POP       BP
  297.           RET       16H
  298.  
  299. DRAW          ENDP
  300.  
  301.  
  302.           PUBLIC    BEEP
  303. BEEP          PROC      FAR
  304.  
  305.           IN        AL,61H            ; Access sound port
  306.           AND       AL,0FEH           ; Clear audio bit only
  307.           XOR       AL,2              ; Toggle audio gate bit to beep
  308.           OUT       61H,AL            ; Do it
  309.           RET
  310.  
  311. BEEP          ENDP
  312.  
  313.           PUBLIC    READPIX
  314. READPIX       PROC      FAR
  315.  
  316.           PUSH      BP
  317.           MOV       BP,SP
  318.           MOV       CX, 6[BP]         ; Get pixel x-coordinate
  319.           MOV       DX, 8[BP]         ; Get pixel y-coordinate
  320.           MOV       AH,0DH            ; Read attribute mode
  321.           MOV       BH,00H            ; Video page 0 only
  322.           INT       10H               ; Call video intr
  323.           MOV       CL,AL             ; Return attribute in CX for Meridian Ada
  324.           MOV       CH,0H
  325.           POP       BP
  326.           RET       4H
  327.  
  328. READPIX       ENDP
  329.  
  330.  
  331.           PUBLIC    CLRSCR
  332. CLRSCR        PROC      FAR
  333.  
  334.           MOV       AX,0619H          ; AH = scroll up    AL = 25 rows
  335.           MOV       BH,00H            ; BH = black
  336.           MOV       CX,0000H          ; Left corner
  337.           MOV       DX,184FH          ; Right corner
  338.           INT       10H
  339.           RET
  340.  
  341. CLRSCR        ENDP
  342.  
  343. ASM_PACKAGE   ENDS
  344.  
  345.  
  346.           END
  347.  
  348.