home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / sampler0 / cprintat.asm < prev    next >
Assembly Source File  |  1987-01-08  |  3KB  |  143 lines

  1.         TITLE CPRINTAT.ASM 
  2.         page ,132
  3.  
  4.  
  5. ;------------------------------------------------------------------------------
  6.  
  7. DYNS            STRUC
  8.  
  9. OLD_BP            DW    ?
  10. RETN            DW    ?
  11.  
  12. STR_PTR            DW  ?        ; these are passed parameters:
  13. ROW                DW    ?        ; starting row, col
  14. COL                DW    ?
  15. ATTRIB          DW    ?        ; desired attribute
  16. DYNS            ENDS
  17.  
  18.  
  19. ;------------------------------------------------------------------------------
  20.  
  21. PGROUP        GROUP    PROG
  22.  
  23. PROG        SEGMENT    BYTE PUBLIC 'PROG'
  24.             PUBLIC    CPRINTAT
  25.             ASSUME    CS:PGROUP
  26.  
  27.  
  28. TRUE            EQU    1
  29. FALSE            EQU    0
  30.  
  31.  
  32.  
  33. FIRST_CALL        DB    TRUE
  34. VIDEO_RAM_SEG    DW    ?
  35. CRT_STATUS_PORT    DW    ?
  36.  
  37.  
  38. CPRINTAT    PROC    NEAR
  39.  
  40.             PUSH    BP
  41.             MOV        BP, SP
  42.             PUSH    ES
  43.             CMP        CS:FIRST_CALL, TRUE    ; is this the first call by this prog?
  44.             JNE        CPRINTAT_10
  45.             CALL     GET_VIDEO_MODE      ; yes - then get video details
  46.  
  47. CPRINTAT_10:
  48.  
  49.             MOV        AX, CS:VIDEO_RAM_SEG
  50.             MOV        ES, AX              
  51.                 
  52.             MOV        DX, CS:CRT_STATUS_PORT
  53.  
  54.             MOV        AX, [BP].ROW
  55.             SUB        AX, 1               ; adjust for home of 1,1
  56.             MOV     CL, 80              ; determine offset of starting position
  57.             MUL        CL                  ; from video ram segment
  58.             MOV        CX, [BP].COL        ; CX = COL
  59.             SUB        CX, 1               ; adjust for home of 1,1
  60.             ADD        AX, CX        
  61.             SHL        AX, 1                ; offset = ((row x 80) + col) * 2
  62.             MOV        DI, AX              ; DI will index video ram
  63.  
  64.             
  65.             MOV        AX, [BP].ATTRIB
  66.             XCHG    AH, AL              ; AH = attribute
  67.  
  68.  
  69.             MOV        BX, [BP].STR_PTR     ; BX = pointer to string
  70.             MOV        SI, 00               ; SI will index string
  71.  
  72.  
  73. CPRINTAT_20:
  74.             MOV        AL, BYTE PTR DS:[BX + SI]   ; get byte
  75.             CMP        AL, 0
  76.             JE        CPRINTAT_30
  77.             PUSH    AX                          ; save byte and attribute
  78. WAIT_1:
  79.             IN        AL, DX                      ; wait for retrace to end
  80.             TEST    AL, 1
  81.             JNZ        WAIT_1
  82.             CLI
  83. WAIT_2:
  84.             IN        AL, DX                      ; wait for retrace to start
  85.             TEST    AL, 1
  86.             JZ        WAIT_2
  87.             POP        AX                          ; recover byte
  88.             MOV        ES:[DI], AL                 ; plug 'em
  89.             STI
  90.             INC        DI                            ; once for character byte
  91.             PUSH    AX
  92. WAIT_3:
  93.             IN        AL, DX
  94.             TEST    AL, 1
  95.             JNZ        WAIT_3
  96.             CLI
  97. WAIT_4:
  98.             IN        AL, DX
  99.             TEST    AL, 1
  100.             JZ        WAIT_4
  101.             POP        AX
  102.             MOV        ES:[DI], AH                    ; enter attribute byte
  103.             STI
  104.             INC        DI                            ; once for attribute byte
  105.             INC        SI                          ; ++string
  106.             JMP        CPRINTAT_20                
  107.  
  108. CPRINTAT_30:
  109.  
  110.             POP        ES
  111.             POP        BP
  112.             RET        
  113.  
  114. CPRINTAT    ENDP
  115.  
  116.  
  117.  
  118. GET_VIDEO_MODE PROC NEAR
  119.  
  120.     MOV     AX, 40H                 ; ES = BIOS data segment
  121.     MOV     ES, AX
  122.     MOV     AX, ES:[63H]            ; base address of CRT controller
  123.     ADD     AX, 6                   ; addresss of CRT status port
  124.     MOV        CS:CRT_STATUS_PORT, AX
  125.     MOV        CS:VIDEO_RAM_SEG, 0B000H   ; address of mono video ram
  126.     MOV        AH, 15                  ; check if graphics display
  127.     INT        10H
  128.     CMP    AL, 3
  129.     JNE        GOT_MODE
  130.     ADD        CS:VIDEO_RAM_SEG, 800H        ; if so then adjust video ram address
  131.  
  132. GOT_MODE:
  133.  
  134.     MOV        CS:FIRST_CALL, FALSE
  135.     RET
  136.  
  137. GET_VIDEO_MODE ENDP
  138.  
  139.  
  140.  
  141. PROG    ENDS
  142.         END
  143.