home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / C-ASM_VI.ARJ / PROGASM.ZIP / PROG061.ASM < prev    next >
Assembly Source File  |  1988-05-15  |  4KB  |  137 lines

  1.  
  2. ;************************************************************************
  3. ; Load a new character generator into plane 2                           *
  4. ; Entry:        Ptr_CG  - Pointer to new character generator            *
  5. ;               Start   - First ASCII code to use                       *
  6. ;               Count   - Number of characters to load                  *
  7. ;************************************************************************
  8.  
  9. Ptr_CG  EQU     [BP+4]
  10. Start   EQU     [BP+6]
  11. Count   EQU     [BP+8]
  12.  
  13.         PUBLIC  _Write_Char_Gen
  14.  
  15. _Write_Char_Gen PROC    NEAR
  16.         PUSH    BP
  17.         MOV     BP,SP
  18.         PUSH    ES
  19.         PUSH    DS
  20.         PUSH    DI
  21.         PUSH    SI
  22.  
  23.         ;--- Enable memory for write into plane 2
  24.  
  25.         MOV     DX,03C4h                ; sequencer enable map 2 for write
  26.         MOV     AL,2
  27.         OUT     DX,AL
  28.         INC     DX
  29.         MOV     AL,4
  30.         OUT     DX,AL
  31.  
  32.         DEC     DX                      ; sequencer no chaining
  33.         MOV     AL,4
  34.         OUT     DX,AL
  35.         INC     DX
  36.         MOV     AL,6
  37.         OUT     DX,AL
  38.  
  39.         MOV     DX,03CEh                ; graphics use data from processor
  40.         MOV     AL,1
  41.         OUT     DX,AL
  42.         INC     DX
  43.         MOV     AL,0
  44.         OUT     DX,AL
  45.  
  46.         DEC     DX                      ; graphics read and write modes
  47.         MOV     AL,5
  48.         OUT     DX,AL
  49.         INC     DX
  50.         MOV     AL,0
  51.         OUT     DX,AL
  52.  
  53.         DEC     DX                      ; graphics address mapped to A000
  54.         MOV     AL,6
  55.         OUT     DX,AL
  56.         INC     DX
  57.         MOV     AL,05h
  58.         OUT     DX,AL
  59.  
  60.         DEC     DX                      ; graphics enable 8 bits per write
  61.         MOV     AL,8
  62.         OUT     DX,AL
  63.         INC     DX
  64.         MOV     AL,0FFh
  65.         OUT     DX,AL
  66.  
  67.         ;--- load the character generator into plane 2
  68.  
  69.         MOV     AX,0A000h               ;Point to segment A000
  70.         MOV     ES,AX
  71.         MOV     AX,Start                ;Compute offset into char gen plane
  72.         MOV     CL,5                    ;as index * bytes_per_char
  73.         SHL     AX,CL                   ;which is index * 32
  74.         MOV     DI,AX                   ;Copy offset in char gen plane into DI
  75.         MOV     SI,Ptr_CG               ;Fetch pointer to new characters
  76.         MOV     AX,Count                ;Fetch number of characters to copy
  77.         SHL     AX,CL                   ;Compute how many bytes to copy
  78.         SHR     AX,1                    ;Divide by two so we can use MOV WORD
  79.         MOV     CX,AX                   ;Copy count into CX
  80.  
  81.         REP     MOVSW                   ;Copy the data
  82.  
  83.         ;--- Restore Sequencer and Graphics Controller
  84.  
  85.         MOV     DX,03C4h                ; Enable plane 0 & 1 for write
  86.         MOV     AL,2
  87.         OUT     DX,AL
  88.         INC     DX
  89.         MOV     AL,03H
  90.         OUT     DX,AL
  91.  
  92.         DEC     DX                      ; sequencer even/odd & text
  93.         MOV     AL,4
  94.         OUT     DX,AL
  95.         INC     DX
  96.         MOV     AL,3
  97.         OUT     DX,AL
  98.  
  99.         MOV     DX,3CEH                 ; graphics read and write modes
  100.         MOV     AL,5
  101.         OUT     DX,AL
  102.         INC     DX
  103.         MOV     AL,10H
  104.         OUT     DX,AL
  105.         DEC     DX
  106.  
  107.         XOR     AX,AX
  108.         MOV     ES,AX
  109.         TEST    BYTE PTR ES:[BIOS_Equipment],2
  110.         JNZ     WCG_Set_B000
  111.  
  112.         MOV     DX,3CEH                 ;Map display buffer to B800
  113.         MOV     AL,6
  114.         OUT     DX,AL
  115.         INC     DX
  116.         MOV     AL,0EH
  117.         OUT     DX,AL
  118.         JMP     WCG_Done
  119. WCG_Set_B000:
  120.         MOV     DX,3CEH                 ;Map display buffer to B000
  121.         MOV     AL,6
  122.         OUT     DX,AL
  123.         INC     DX
  124.         MOV     AL,0AH
  125.         OUT     DX,AL
  126.  
  127.         ;--- Clean up and exit
  128. WCG_Done:
  129.         POP     SI
  130.         POP     DI
  131.         POP     DS
  132.         POP     ES
  133.         MOV     SP,BP
  134.         POP     BP
  135.         RET
  136. _Write_Char_Gen ENDP
  137.