home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource4 / 235_01 / direct.asm < prev    next >
Assembly Source File  |  1987-06-18  |  20KB  |  672 lines

  1.         PAGE   60,132
  2.         TITLE  Routines to do direct screen I/O
  3.  
  4. ;  011  12-Dec-86  direct.asm
  5.  
  6. ;       Copyright (c) 1986 by Blue Sky Software.  All rights reserved.
  7.  
  8.  
  9. _TEXT   SEGMENT  BYTE PUBLIC 'CODE'
  10. _TEXT   ENDS
  11. CONST   SEGMENT  WORD PUBLIC 'CONST'
  12. CONST   ENDS
  13. _BSS    SEGMENT  WORD PUBLIC 'BSS'
  14. _BSS    ENDS
  15. _DATA   SEGMENT  WORD PUBLIC 'DATA'
  16. _DATA   ENDS
  17.  
  18. DGROUP  GROUP   CONST,  _BSS,   _DATA
  19.         ASSUME  CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP
  20.  
  21. _DATA   SEGMENT
  22.         EXTRN   _screen:DWORD
  23.         EXTRN   _cursor:DWORD
  24.         EXTRN   _vid_attrib:BYTE
  25.         EXTRN   _vid_snow:BYTE
  26.         boxloc  dw    0           ; stores the starting offset to the dialog box
  27. _DATA   ENDS
  28.  
  29. _TEXT      SEGMENT
  30.  
  31. ;******************************************************************************
  32. ;
  33. ;  gotorc(r,c)    move 'cursor' to specified row, col
  34. ;
  35. ;******************************************************************************
  36.  
  37.         PUBLIC _gotorc
  38.  
  39. _gotorc PROC   NEAR
  40.         push    bp
  41.         mov     bp,sp
  42.  
  43.         mov     ax,[bp+4]                      ; row to ax
  44.         mov     cl,5
  45.         shl     ax,cl                          ; row * 32
  46.         mov     bx,ax
  47.         shl     ax,1
  48.         shl     ax,1                           ; row * 128
  49.         add     ax,bx                          ; row * 160
  50.  
  51.         mov     bx,[bp+6]                      ; col to bx
  52.         shl     bx,1                           ; col * 2
  53.  
  54.         add     ax,bx                          ; row * 160 + col * 2 = cursor
  55.         mov     WORD PTR _cursor,ax
  56.  
  57.         mov     sp,bp
  58.         pop     bp
  59.         ret
  60.  
  61. _gotorc ENDP
  62.  
  63. ;******************************************************************************
  64. ;
  65. ;  disp_str(s)    display a string at current location
  66. ;
  67. ;******************************************************************************
  68.  
  69.         PUBLIC  _disp_str
  70.  
  71. _disp_str  PROC NEAR
  72.         push    bp
  73.         mov     bp,sp
  74.         push    di
  75.         push    si
  76.         mov     si,[bp+4]
  77.  
  78.         mov     ah,_vid_attrib         ; attribute byte to ah
  79.         les     di,DWORD PTR _cursor   ; cursor ptr to es:di
  80.  
  81.         jmp     SHORT tst_ch           ; skip to load/test code
  82.  
  83. chloop:
  84.  
  85.         IFDEF  nosnow                  ; if adapter doesn't snow, its quick
  86.            stosw                       ; store char and attrib to es:[di++]
  87.         ELSE                           ; well, its not so quick or easy....
  88.            mov    cx,1
  89.            call   stvideo
  90.         ENDIF
  91.  
  92. tst_ch: lodsb                          ; string char to al
  93.         or      al,al                  ; done when char = 0
  94.         jne     chloop
  95.  
  96.         mov     WORD PTR _cursor,di    ; update cursor offset
  97.  
  98.         pop     si
  99.         pop     di
  100.         mov     sp,bp
  101.         pop     bp
  102.         ret
  103. _disp_str ENDP
  104.  
  105. ;******************************************************************************
  106. ;
  107. ;   disp_char(ch)   display a single char at current location
  108. ;
  109. ;******************************************************************************
  110.  
  111.         PUBLIC  _disp_char
  112.  
  113. _disp_char  PROC NEAR
  114.         push    bp
  115.         mov     bp,sp
  116.         push    di
  117.  
  118.         les     di,DWORD PTR _cursor   ; cursor loc to es:di
  119.  
  120.         mov     al,[bp+4]              ; get char to store in video memory
  121.         mov     ah,_vid_attrib         ; get video attribute
  122.  
  123.         IFDEF nosnow
  124.            stosw                       ; store 'em and update di
  125.         ELSE
  126.            mov  cx,1
  127.            call stvideo
  128.         ENDIF
  129.  
  130.         mov     WORD PTR _cursor,di    ; update cursor offset
  131.  
  132.         pop     di
  133.         mov     sp,bp
  134.         pop     bp
  135.         ret
  136. _disp_char      ENDP
  137.  
  138.  
  139. ;******************************************************************************
  140. ;
  141. ;   disp_rep(ch,cnt)   display a single char cnt times at current location
  142. ;
  143. ;******************************************************************************
  144.  
  145.         PUBLIC  _disp_rep
  146.  
  147. _disp_rep  PROC NEAR
  148.         push    bp
  149.         mov     bp,sp
  150.         push    di
  151.  
  152.         les     di,DWORD PTR _cursor   ; cursor loc to es:di
  153.  
  154.         mov     al,[bp+4]              ; get char to store in video memory
  155.         mov     ah,_vid_attrib         ; get video attribute
  156.         mov     cx,[bp+6]              ; rep count to cx
  157.  
  158.         IFDEF  nosnow
  159.            rep stosw                   ; store 'em and update di
  160.         ELSE
  161.            call stvideo
  162.         ENDIF
  163.  
  164.         mov     WORD PTR _cursor,di    ; update cursor offset
  165.  
  166.         pop     di
  167.         mov     sp,bp
  168.         pop     bp
  169.         ret
  170. _disp_rep  ENDP
  171.  
  172.  
  173. ;******************************************************************************
  174. ;
  175. ;       insert_line(r,n)   insert a line at row, effects n lines
  176. ;
  177. ;******************************************************************************
  178.  
  179.         PUBLIC _insert_line
  180.  
  181. _insert_line PROC NEAR
  182.  
  183.         push    bp
  184.         mov     bp,sp
  185.         push    di
  186.         push    si
  187.  
  188.         mov     bx,[bp+4]              ; ( r + n - 1) * 160 - 2 =
  189.         add     bx,[bp+6]              ;   end of new last row
  190.         dec     bx
  191.         mov     ax,160
  192.         imul    bx
  193.         dec     ax
  194.         dec     ax
  195.         mov     si,ax                  ;   (but its the source for the move)
  196.  
  197.         add     ax,160                 ; call addr of dest (where new last
  198.         mov     di,ax                  ;   line will go)
  199.  
  200.         std                            ; to insert a row, need to go backwards
  201.  
  202.         call    scroll_video           ; scroll the video buffer
  203.  
  204.         mov     al,20h                 ; fill the inserted line with blanks
  205.         mov     ah,_vid_attrib
  206.         mov     cx,80
  207.         IFDEF  nosnow
  208.            rep stosw
  209.         ELSE
  210.            call stvideo
  211.         ENDIF
  212.  
  213.         cld                            ; C expects it this way
  214.  
  215.         pop     si
  216.         pop     di
  217.         mov     sp,bp
  218.         pop     bp
  219.         ret
  220.  
  221. _insert_line ENDP
  222.  
  223.  
  224. ;******************************************************************************
  225. ;
  226. ;       delete_line(r,n)   delete a line at row, effects n lines
  227. ;
  228. ;******************************************************************************
  229.  
  230.         PUBLIC _delete_line
  231.  
  232. _delete_line PROC NEAR
  233.  
  234.         push    bp
  235.         mov     bp,sp
  236.         push    di
  237.         push    si
  238.  
  239.         mov     ax,160                 ; get row
  240.         imul    WORD PTR [bp+4]        ;   turn into offset in video ram
  241.         mov     di,ax
  242.  
  243.         add     ax,160                 ; calc offset of next row
  244.         mov     si,ax
  245.  
  246.         call    scroll_video           ; scroll the video buffer
  247.  
  248.         mov     al,20h                 ; fill the last line with blanks
  249.         mov     ah,_vid_attrib
  250.         mov     cx,80
  251.         IFDEF  nosnow
  252.            rep stosw
  253.         ELSE
  254.            call stvideo
  255.         ENDIF
  256.  
  257.         pop     si
  258.         pop     di
  259.         mov     sp,bp
  260.         pop     bp
  261.         ret
  262. _delete_line  ENDP
  263.  
  264.  
  265. ;*****************************************************************************
  266. ;
  267. ;   scroll_video   support routine for insert/delete line
  268. ;
  269. ;*****************************************************************************
  270.  
  271. scroll_video PROC NEAR
  272.  
  273.         mov     ax,80                  ; get # rows to move and
  274.         imul    WORD PTR [bp+6]        ;   turn into # words to move
  275.         mov     cx,ax
  276.  
  277.         IFNDEF  nosnow
  278.            mov  al,_vid_snow           ; movideo needs vid_snow - get it
  279.         ENDIF                          ;   before ds gets changed
  280.  
  281.         push    ds                     ; save current ds
  282.         mov     bx,WORD PTR _screen+2  ; segment address of video ram
  283.         mov     ds,bx                  ; moving to/from video ram
  284.         mov     es,bx
  285.  
  286.         IFDEF   nosnow
  287.            rep movsw                   ; scroll the data in the video buffer
  288.         ELSE
  289.            call movideo
  290.         ENDIF
  291.  
  292.         pop    ds                      ; restore ds
  293.  
  294.         ret