home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
QBasic & Borland Pascal & C
/
Delphi5.iso
/
C
/
Samples
/
C-ASM_VI.ARJ
/
PROGASM.ZIP
/
PROG061P.ASM
< prev
next >
Wrap
Assembly Source File
|
1988-05-25
|
3KB
|
139 lines
;************************************************************************
; Load a new character generator into plane 2 *
; Entry: Ptr_CG - Pointer to new character generator *
; Start - First ASCII code to use *
; Count - Number of characters to load *
;************************************************************************
cg_seg EQU [BP+12]
cg_offset EQU [BP+10]
Start EQU [BP+8]
Count EQU [BP+6]
PUBLIC Write_Char_Gen
Write_Char_Gen PROC FAR
PUSH BP
MOV BP,SP
PUSH ES
PUSH DS
PUSH DI
PUSH SI
;--- Enable memory for write into plane 2
MOV DX,03C4h ; sequencer enable map 2 for write
MOV AL,2
OUT DX,AL
INC DX
MOV AL,4
OUT DX,AL
DEC DX ; sequencer no chaining
MOV AL,4
OUT DX,AL
INC DX
MOV AL,6
OUT DX,AL
MOV DX,03CEh ; graphics use data from processor
MOV AL,1
OUT DX,AL
INC DX
MOV AL,0
OUT DX,AL
DEC DX ; graphics read and write modes
MOV AL,5
OUT DX,AL
INC DX
MOV AL,0
OUT DX,AL
DEC DX ; graphics address mapped to A000
MOV AL,6
OUT DX,AL
INC DX
MOV AL,05h
OUT DX,AL
DEC DX ; graphics enable 8 bits per write
MOV AL,8
OUT DX,AL
INC DX
MOV AL,0FFh
OUT DX,AL
;--- load the character generator into plane 2
MOV AX,0A000h ;Point to segment A000
MOV ES,AX
MOV AX,Start ;Compute offset into char gen plane
MOV CL,5 ;as index * bytes_per_char
SHL AX,CL ;which is index * 32
MOV DI,AX ;Copy offset in char gen plane into DI
MOV DS,cg_seg
MOV SI,cg_offset ;Fetch pointer to new characters
MOV AX,Count ;Fetch number of characters to copy
SHL AX,CL ;Compute how many bytes to copy
SHR AX,1 ;Divide by two so we can use MOV WORD
MOV CX,AX ;Copy count into CX
REP MOVSW ;Copy the data
;--- Restore Sequencer and Graphics Controller
MOV DX,03C4h ; Enable plane 0 & 1 for write
MOV AL,2
OUT DX,AL
INC DX
MOV AL,03H
OUT DX,AL
DEC DX ; sequencer even/odd & text
MOV AL,4
OUT DX,AL
INC DX
MOV AL,3
OUT DX,AL
MOV DX,3CEH ; graphics read and write modes
MOV AL,5
OUT DX,AL
INC DX
MOV AL,10H
OUT DX,AL
DEC DX
XOR AX,AX
MOV ES,AX
TEST BYTE PTR ES:[BIOS_Equipment],2
JNZ WCG_Set_B000
MOV DX,3CEH ;Map display buffer to B800
MOV AL,6
OUT DX,AL
INC DX
MOV AL,0EH
OUT DX,AL
JMP WCG_Done
WCG_Set_B000:
MOV DX,3CEH ;Map display buffer to B000
MOV AL,6
OUT DX,AL
INC DX
MOV AL,0AH
OUT DX,AL
;--- Clean up and exit
WCG_Done:
POP SI
POP DI
POP DS
POP ES
MOV SP,BP
POP BP
RET 8
Write_Char_Gen ENDP