home *** CD-ROM | disk | FTP | other *** search
/ ftp.update.uu.se / ftp.update.uu.se.2014.03.zip / ftp.update.uu.se / pub / rainbow / msdos / decus / RB140 / grlibfor.arj / GTEXT.ASM < prev    next >
Assembly Source File  |  1988-12-11  |  10KB  |  380 lines

  1. PAGE ,132
  2. ;GTEXT.ASM
  3. ;UPDATE HISTORY
  4. ;==============
  5. ;15 nov 84    Conver
  6. t to C86 V2.2
  7.  
  8.     include    asmc.h
  9.  
  10.     SEGEND    CODE
  11.  
  12.     SE
  13. GDEF    DATA
  14.  
  15. EXTRN    t_x_:WORD, t_y_:WORD, t_col_:BYTE, gbmod_:BYTE,
  16.  sh_p_lin_:BYTE
  17. EXTRN    ymax_:WORD, xmax_:WORD, curl0_:BYTE, curl2_:BY
  18. TE
  19. EXTRN    y_start_:WORD,x_start_:WORD
  20. EXTRN    tfonts_:BYTE, t_font_
  21. :BYTE, gbmskl_:BYTE
  22.  
  23.     SEGEND    DATA
  24.  
  25.     SEGDEF    CODE
  26.  
  27. P
  28. UBLIC    gtext_, gchar_
  29.  
  30.     IF    @bigmodel
  31. EXTRN    gdc_nb_:FAR, chk_
  32. col_:FAR, a_mode_:FAR, a_gbmsk_:FAR, a_cur_:FAR
  33. EXTRN    fifo_mt_:FAR, 
  34. cxy2cp_:FAR
  35.     ELSE
  36. EXTRN    gdc_nb_:NEAR, chk_col_:NEAR, a_mode_:NEA
  37. R, a_gbmsk_:NEAR, a_cur_:NEAR
  38. EXTRN    fifo_mt_:NEAR, cxy2cp_:NEAR
  39.     
  40. ENDIF
  41.  
  42.  
  43. ;************************************************************************
  44. ;*                                                                      *
  45. ;*      F U N C T I O N    gtext_(x, y, s
  46. tring)                          *
  47. ;*                         int x, y;                                    *
  48. ;*                         char *string;                                *
  49. ;*                                                                      *
  50.  
  51. ;*      purpose:        print a string of text at a specific 'xy'       *
  52. ;*                      po
  53. sition. X & Y are defined as pixel locations  *
  54. ;*                      at the bottom le
  55. ft of the character cell.       *
  56. ;*                                                                      *
  57. ;*      entry:            6[bp] 'x' posit
  58. ion                            *
  59. ;*                        8[bp] 'y' position                            *
  60. ;*                       10[bp] pointer to NULL te
  61. rminated string       *
  62. ;*                                                                      *
  63. ;************************************************************************
  64.  
  65.     PROCDEF    gtext_
  66.         pus
  67. h    si
  68.         push    bp
  69.         mov     bp,sp
  70.  
  71.         mov     ax,6[bp]                ;get
  72.  'x' position
  73.         mov     WORD PTR t_x_,ax        ;and save.
  74.         mov     ax,8
  75. [bp]                ;get 'y' position
  76.         mov     WORD PTR t_y_,ax        ;and save.
  77.  
  78.  
  79.         call    gdc_nb_
  80.         mov     al,BYTE PTR t_col_
  81.         call    chk_col_
  82.  
  83.         mov     si,10[bp]               ;point to start of string
  84.         cld                             ;make sur
  85. e we inc 'si'.
  86.         test    BYTE PTR gbmod_,2
  87.         jz      Lt0                     ;jump if a
  88. lready in text mode else
  89.         and     BYTE PTR gbmod_,0FDH    ;assert text
  90.  mode.
  91.         call    a_mode_
  92. Lt0:    lodsb
  93.         or      al,al                   ;check fo
  94. r the end of string.
  95.         jz      Lt1                     ;quit if it is.
  96.         push    ax
  97.  
  98.         call    gchar_
  99.         add     sp,2
  100.         jmp     Lt0
  101.  
  102. Lt1:    pop     bp
  103.  
  104.         pop     si
  105.         ret
  106.     PROCEND    gtext_
  107.  
  108. ;************************************************************************
  109. ;*                                                                      *
  110.  
  111. ;*        f u n c t i o n   gchar_(char)                                 *
  112. ;*                                                                      *
  113. ;*  purpose:    writ
  114. e graphics text                                     *
  115. ;*  entry:      6[bp] character to be written                           *
  116.  
  117. ;*                                                                      *
  118. ;*  conditions: 1) text cursor is correctly placed                      *
  119. ;*              
  120. 2) fgbg and alups already defined                       *
  121. ;*              3) text font has been sele
  122. cted                          *
  123. ;************************************************************************
  124.  
  125.     PROCDEF    gchar_
  126.         push    si
  127.         push    b
  128. p
  129.         mov     bp,sp
  130.  
  131.         mov     ax,6[bp]
  132.         cmp    al,1FH                  ;unprin
  133. table character0
  134.         ja      L0                      ;jump if not.
  135.         call    L20                     ;see i
  136. f it's one of the control chars
  137.         jmp    L11                     ; we can handle, then e
  138. xit.
  139. L0:     test    al,80H                  ;is character within table0
  140.         jz      L1                      
  141. ;jump if not.
  142.         jmp    L11                     ;if yes just exit.
  143.  
  144. ;adjust co-ordi
  145. nates in t_x_ & t_y_ and assert the cursor.
  146.  
  147. L1:     mov     ax,WORD P
  148. TR t_x_         ;get column number
  149.         and     ax,0FFF0H
  150.     mov    WORD PTR x_
  151. start_,ax
  152.         mov     ax,WORD PTR ymax_
  153.         sub     ax,WORD PTR t_y_      ;
  154. t_y_ specified as bot_left of ch cell.
  155.         sub     ax,10                 ;move 'y' to 
  156. top left of character cell.
  157.         jns     L1a
  158.         xor     ax,ax
  159. L1a:    
  160. mov    WORD PTR y_start_,ax
  161.         call    cxy2cp_
  162.  
  163.         mov     ax, 6[bp]
  164.  
  165.         sub    al,20H                  ;table starts with a space at 0.
  166.         xor    ah,ah
  167.  
  168.         shl     ax,1
  169.         mov     bx,ax                   ;bx = al * 2
  170.         shl     ax,1
  171.         sh
  172. l     ax,1                    ;ax = al * 8
  173.         add     bx,ax                   ;bx = al * 10
  174.         lea     si
  175. , tfonts_       ;point to start of font table
  176.         mov     al,BYTE PTR t_font
  177. _     ;get font type
  178.         inc     al
  179. L4:     dec     al
  180.         jz      L5
  181.         
  182. add     si,960          ;add font table size to table offset
  183.         jmp     L4
  184. L5
  185. :     add     si,bx           ;si now points to the 10DB table entry
  186.  
  187.         test    
  188. WORD PTR t_x_,8
  189.         jnz     L3a
  190.         mov     WORD PTR gbmskl_,000FFH
  191.         
  192. jmp     L3b
  193. L3a:    mov     WORD PTR gbmskl_,0FF00H
  194. L3b:    call    gdc_n
  195. b_
  196.         call    a_gbmsk_                ;assert the graf board mask
  197.  
  198.         cld                             ;
  199. make sure lodsb incs si.
  200.         mov    al,0FEH                 ;reset the char ram counte
  201. r.
  202.         out    53H,al
  203.         out    51H,al
  204.         lodsw                           ;fetch both bytes.
  205.  
  206.         out    52H,al         ;put the byte into both 1 and 2 char ram bytes.
  207.         
  208. out    52H, al
  209.         mov    al,ah
  210.         out    52H, al        ;put theDB into both 
  211. 1 and 2 char ram bytes.
  212.         out    52H, al
  213.         mov    al,0FEH                 ;reset t
  214. he char ram counter.
  215.         out    53H,al
  216.         out    51H,al
  217.  
  218.         call    
  219. a_cur_                  ;assert the cursor command.
  220.         mov    al,4CH                  ;assert the {04
  221. c command.
  222.         out    57H,al
  223.         xor     al,al                   ;assert the down direct
  224. inon to write.
  225.         out    56H,al
  226.         inc    al                      ;do it 2 write cycles.
  227.  
  228.         out    56H,al
  229.         dec     al
  230.         out    56H,al
  231.         mov    al,22H                    
  232. ;assert the wdat command.
  233.         out    57H,al
  234.         mov    al,0FFH
  235.         out
  236.     56H,al
  237.         out    56H,al
  238.  
  239.         call    gdc_nb_
  240.  
  241.         mov     cx,8
  242.                     ;eight scan lines.
  243. L8:     lodsb                           ;fetch theDB.
  244.         out    52H, a
  245. l            ;put theDB into both 1 and 2 char ram bytes.
  246.         out    52H, al
  247.         
  248. loop    L8
  249.  
  250.         mov    al,4CH                  ;assert the figs command.
  251.         out    5
  252. 7H,al
  253.         mov     al,00                   ;assert the down directinon to write.
  254.         ou
  255. t    56H,al
  256.         mov     ax,7                    ;do 8 write cycles.
  257.         out    56H,al
  258.  
  259.         mov    al,ah
  260.         out    56H,al
  261.         mov    al,22H                  ;assert the wdat com
  262. mand.
  263.         out    57H,al
  264.         mov    al,0FFH
  265.         out    56H,al
  266.         out    
  267. 56H,al
  268.  
  269. ;Now adjust the text character position & test for word wr
  270. apping
  271.  
  272.         mov     ax, WORD PTR t_x_
  273.         add     ax,8                    ;character w
  274. idth
  275.         cmp     WORD PTR xmax_,ax       ;have we gone past the end of the l
  276. ine0
  277.         jns     L9
  278.         xor     ax,ax                   ;back to start of line
  279. L9:     
  280. mov     WORD PTR t_x_,ax
  281.         jnz     L11                 ;exit if we don't have to go to
  282.  a new line.
  283.         mov     ax,WORD PTR t_y_
  284.         sub     ax,10                   ;move to n
  285. ext character line
  286.         or      ax,ax                   ;are we on last line already0
  287.         
  288. jns     L10
  289.         xor     ax,ax
  290. L10:    mov     WORD PTR t_y_,ax
  291.  
  292. L11:
  293.     pop     bp
  294.         pop     si
  295.         ret
  296.  
  297. ;Control character handler [
  298. ax contains the character]:
  299. ;       007     bell
  300. ;       008     back_space
  301.  
  302. ;       009     tab
  303. ;       00a     line_feed       [also does a carriage_return]
  304.  
  305. ;       00c     clear_screen    [********* not yet *********]
  306. ;       00d     carriage_return
  307.  
  308.  
  309. L20:    cmp     al,7                    ;is it a bell ?
  310.         jnz     L30
  311. L21:    mov     
  312. cl,2
  313.         mov     dl, al
  314.         int     0E0H
  315.         ret
  316.  
  317. L30:    cmp     a
  318. l,8                    ;is it back_space ?
  319.         jnz     L40
  320.         cmp     WORD PTR t_x_, 0
  321.  
  322.         jnz     L31
  323.         mov     ax,7
  324.         jmp     L21
  325. L31:    sub     WORD PTR
  326.  t_x_,8
  327.         ret
  328.  
  329. L40:    cmp     al,9                    ;is it tab ?
  330.         jnz     L5
  331. 0
  332.         mov     ax, WORD PTR t_x_
  333.         and     ax, 0FFC0H              ;go back to las
  334. t multiple of 64
  335.         add     ax,64                   ;next tab position
  336.         cmp     WORD
  337.  PTR xmax_,ax
  338.         jns     L41
  339.         mov     ax,7
  340.         jmp     L21
  341. L41:    
  342. mov     WORD PTR t_x_,ax
  343.         ret
  344.  
  345. L50:    cmp     al,0AH  ;is it line
  346. _feed ?
  347.         jnz     L60
  348. L51:    mov     ax,WORD PTR t_y_
  349.         sub     ax,
  350.  10
  351.         or      ax,ax
  352.         jns     L52
  353.         mov     ax,7
  354.         jmp     L21
  355.  
  356. L52:    mov     WORD PTR t_y_, ax
  357.         ret
  358.  
  359. L60:    cmp     al,0CH  ;is
  360.  it clear_screen ?
  361.         jnz     L70
  362.         mov     WORD PTR t_y_,10        ;for n
  363. ow, just home cursor.
  364.         mov     WORD PTR t_x_,10
  365. L61:    ret
  366.  
  367.  
  368. L70:    cmp     al,0DH                  ;is it carriage_return ?
  369.         jnz     L61                     ;exit i
  370. f not.
  371.         mov     WORD PTR t_x_,0
  372.         jmp     L51
  373.  
  374.     PROCEND    gch
  375. ar_
  376.  
  377.     include    epilogue.h
  378.     END
  379. 
  380.