home *** CD-ROM | disk | FTP | other *** search
/ Piper's Pit BBS/FTP: ibm 0000 - 0009 / ibm0000-0009 / ibm0003.tar / ibm0003 / TPOWER53.ZIP / TPASM.ARC / TPMEMO.ASM < prev    next >
Encoding:
Assembly Source File  |  1989-07-10  |  4.6 KB  |  170 lines

  1. ;******************************************************
  2. ;           TPMEMO.ASM 5.07
  3. ;          Misc. routines for TPMEMO
  4. ;     Copyright (c) TurboPower Software 1987.
  5. ; Portions copyright (c) Sunny Hill Software 1985, 1986
  6. ;     and used under license to    TurboPower Software
  7. ;         All rights reserved.
  8. ;******************************************************
  9.  
  10.     INCLUDE    TPCOMMON.ASM
  11.  
  12. ;******************************************************    Data
  13.  
  14. DATA    SEGMENT    BYTE PUBLIC
  15.  
  16.     ;Pascal    variables
  17.  
  18.     EXTRN    CheckSnow : BYTE        ;If true, check    for retrace
  19.     EXTRN    VirtualSegment : WORD        ;Segment of Video Memory--alt
  20.     EXTRN    VirtualWidth : BYTE        ;Current width of virtual display
  21.  
  22. DATA    ENDS
  23.  
  24. ;******************************************************    Code
  25.  
  26. CODE    SEGMENT    BYTE PUBLIC
  27.  
  28.     ASSUME    CS:CODE, DS:DATA
  29.  
  30.     PUBLIC    FastWriteCtrl, Scan
  31.  
  32. ;******************************************************    CalcOffset
  33.  
  34. ;calculate Offset in video memory.
  35. ;On entry, AX has Row, DI has Column
  36. ;On exit, CX and ES have VideoSegment, DI has offset,
  37. ; and DL = 1 if    snow checking is needed
  38.  
  39. CalcOffset    PROC NEAR
  40.  
  41.     DEC    AX            ;Row to    0..24 range
  42.     MOV    CX, WP VirtualWidth    ;CX = Rows per column
  43.     MUL    CX            ;AX = Row * VirtualWidth
  44.     DEC    DI            ;Column    to 0..79 range
  45.     ADD    DI,AX            ;DI = (Row * VirtualWidth) + Col
  46.     SHL    DI,1            ;Account for attribute bytes
  47.     MOV    CX,VirtualSegment    ;CX = VirtualSegment
  48.     MOV    ES,CX            ;ES:DI points to VideoSegment:Row,Col
  49.     CLD                ;Set direction to forward
  50.     MOV    DL,CheckSnow        ;Get snow check    into DL
  51.     CMP    DL,True            ;Is it set?
  52.     JNE    CalcExit        ;Exit if not
  53.     CMP    CH,0B8h            ;Writing to CGA    memory?
  54.     JE    CalcExit        ;Exit if so
  55.     SetZero    DL            ;Otherwise turn    snow checking off
  56. CalcExit:
  57.     RET                ;Return
  58.  
  59. CalcOffset    ENDP
  60.  
  61. ;******************************************************    FastWriteCtrl
  62.  
  63. ;procedure FastWriteCtrl(St : String; Row, Col,    Attr, Ctrl : Byte);
  64. ;Write St at Row,Col in    Attr (video attribute) without snow. Ctrl characters
  65. ;displayed in Ctrl as upper-case letters
  66.  
  67. FWCtrl        EQU    BYTE PTR SS:[BX+4]
  68. FWAttr        EQU    BYTE PTR SS:[BX+6]
  69. FWCol        EQU    BYTE PTR SS:[BX+8]
  70. FWRow        EQU    BYTE PTR SS:[BX+10]
  71. FWSt        EQU    DWORD PTR SS:[BX+12]
  72.  
  73. FastWriteCtrl    PROC FAR
  74.  
  75.     StackFrame            ;Set up    stack frame
  76.     PUSH    DS            ;Save DS
  77.     PUSH    BP            ;Save BP
  78.     SetZero    AH            ;AH = 0
  79.     MOV    AL,FWRow        ;AX = Row
  80.     SetZero    CH            ;CH = 0
  81.     MOV    CL,FWCol        ;CX = Column
  82.     MOV    DI,CX            ;DI = Column
  83.     CALL    CalcOffset        ;Call routine to calculate offset
  84.     GetDSPtr    FWSt        ;DS:SI points to St[0]
  85.     SetZero    CX            ;CX = 0
  86.     LODSB                ;AL = Length(St); DS:SI    -> St[1]
  87.     MOV    CL,AL            ;CX = Length
  88.     JCXZ    FWExit            ;If string empty, exit
  89.     MOV    AH,FWAttr        ;AH = Attr
  90.     MOV    BL,FWCtrl        ;BL = Ctrl
  91.     MOV    BH,AH            ;BH = Attr
  92.     SHR    DL,1            ;If snow checking is off...
  93.     JNC    FWNoWait        ; use FWNoWait routine
  94.     MOV    DX,03DAh        ;Point DX to CGA status    port
  95. FWGetNext:
  96.     MOV    AH,BH            ;Assume    regular    attribute
  97.     LODSB                ;Load next character into AL
  98.     CMP    AL,' '            ;Is it a ctrl character?
  99.     JAE    FWnotCtrl        ;If not, continue
  100.     MOV    AH,BL            ;Else use Ctrl attribute
  101.     ADD    AL,64            ;Convert ^A to A, etc.
  102. FWnotCtrl:
  103.     MOV    BP,AX            ;Store video word in BX
  104.     WaitForRetrace            ;Wait for an opportunity to write
  105.     WordToCGA    BP        ;Move the word
  106.     LOOP    FWGetNext        ;Get next character
  107.     JMP    SHORT FWExit        ;Done
  108. FWNoWait:
  109.     MOV    DX,4020h        ;DH = 64, DL = ' '
  110. FWNoWaitAgain:
  111.     MOV    AH,BH            ;Assume    regular    attribute
  112.     LODSB                ;Load next character into AL
  113.     CMP    AL,DL            ;Is it a ctrl character?
  114.     JAE    FWnotCtrl2        ;If not, continue
  115.     MOV    AH,BL            ;Else use Ctrl attribute
  116.     ADD    AL,DH            ;Convert ^A to A, etc.
  117. FWnotCtrl2:
  118.     STOSW                ;Move video word into place
  119.     LOOP    FWNoWaitAgain        ;Get next character
  120. FWExit:
  121.     POP    BP            ;Restore BP
  122.     POP    DS            ;Restore DS
  123.     RET    12            ;Remove    parameters and return
  124.  
  125. FastWriteCtrl    ENDP
  126.  
  127. ;******************************************************    Scan
  128.  
  129. ;function Scan(Limit : Integer;    Ch : Char; T : Pointer)    : Integer;
  130. ;Scan limit chars for char, ch not found if rslt=limit
  131.  
  132. ScT    EQU    DWORD PTR [BP+6]
  133. ScCh    EQU    BYTE PTR [BP+10]
  134. ScLimit    EQU    WORD PTR [BP+12]
  135.  
  136. Scan    PROC FAR
  137.  
  138.     PUSH    BP            ;Save BP
  139.     MOV    BP,SP            ;Set up    stack frame
  140.     CLD                ;assume    forward
  141.     MOV    AL,ScCh            ;char to search    for
  142.     MOV    CX,ScLimit        ;bytes to search
  143.     OR    CX,CX            ;check sign
  144.     PUSHF                ;save flags
  145.     JNS    X1
  146.     NEG    CX            ;make positive
  147.     STD                ;but search in reverse
  148. X1:
  149.     MOV    DX,CX            ;save full count
  150.     LES    DI,ScT            ;ptr to    start
  151.     REPNE    SCASB            ;search
  152.     JNE    X2
  153.     INC    CX            ;found a match
  154. X2:
  155.     SUB    DX,CX            ;find count to match
  156.     MOV    AX,DX            ;ready for return
  157.     POPF
  158.     JNS    X3
  159.     NEG    AX            ;make negative if reverse
  160. X3:
  161.     MOV    SP,BP            ;Restore SP
  162.     POP    BP            ;Restore BP
  163.     RET    8            ;Remove    parameters and return
  164.  
  165. Scan    ENDP
  166.  
  167. CODE    ENDS
  168.  
  169.     END
  170.