home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 December
/
simtel1292_SIMTEL_1292_Walnut_Creek.iso
/
msdos
/
computpc
/
comp8802.arc
/
WRIMAGE.ASM
< prev
next >
Wrap
Assembly Source File
|
1987-09-22
|
7KB
|
266 lines
; TEXT.ASM Assembly routines for Color Graphics Adapter text printing.
; Used by WRIMAGE.C and written by John W. Ratcliff
; Copyright (c) 1987 Compute!
_TEXT SEGMENT BYTE PUBLIC 'CODE'
_TEXT ENDS
CONST SEGMENT WORD PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT WORD PUBLIC 'BSS'
_BSS ENDS
_DATA SEGMENT WORD PUBLIC 'DATA'
_DATA ENDS
DGROUP GROUP CONST, _BSS, _DATA
ASSUME CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP
_DATA SEGMENT
_sec db 0
_hsec db 0
durat dw 0
start dw 0
x db 0
y db 0
x1 db 0
x2 db 0
y1 db 0
y2 db 0
col db 0, 1, 9, 3, 11, 4, 12, 2, 10, 5, 13, 6, 14, 8, 7, 15
ytab dw 0, 160, 320, 480, 640, 800, 960, 1120, 1280, 1440
dw 1600, 1760, 1920, 2080, 2240, 2400, 2560, 2720, 2880, 3040
dw 3200, 3360, 3520, 3680, 3840, 4000
_DATA ENDS
public _tprint,_sec,_hsec,_setmode
public _getime,_keystat,_flushk,_cursoff
public _sound,_sound2
_TEXT SEGMENT
_setmode proc near
; This routine set the graphics mode as specified
; by the BIOS interrupt 10h function 0
; al contains the video mode
; Modes are as follows:
; 0 40x25 Black and White text
; 1 40x25 Color text
; 2 80x25 Black and White text
; 3 80x25 Color text
; 4 320x200 Color graphics
; 5 320x200 Black and White graphics
; 6 640x200 Black and White graphics
; 7 mono graphics
; 9 TANDY MODE GRAPHICS
; 13 320x200 16 color EGA graphics
; 14 640x200 16 color EGA graphics
; 16 640x350 16 color EGA graphics
push bp
mov bp,sp
mov ax,[bp+4]
mov ah,0
int 10h
pop bp
ret
_setmode endp
_sound proc near
; sound(tone,duration)
push bp
mov bp,sp
mov ax,[bp+6]
mov durat,ax
mov bx,[bp+4]
mov al,10110110b
out 43h,al
mov ax,bx
out 42h,al
mov al,ah
out 42h,al
in al,61h
or al,3
out 61h,al
mov bl,al
mov ah,00h
int 1ah ; get clock count
mov start,dx
snd0: mov ah,00
int 1ah
sub dx,start
cmp dx,durat
jl snd0
mov al,bl
and al,0fch
out 61h,al
pop bp
ret
_sound endp
_sound2 proc near
; sound(tone,duration)
push bp
mov bp,sp
mov cx,[bp+6]
mov bx,[bp+4]
call _sounder
pop bp
ret
_sound2 endp
_sounder proc near
; bx register contains the tone
; cx contains the duration
mov al,10110110b
out 43h,al
mov ax,bx
out 42h,al
mov al,ah
out 42h,al
in al,61h
or al,3
out 61h,al
mov bl,al
snd20: nop
nop
nop
nop
loop snd20
mov al,bl
and al,0fch
out 61h,al
ret
_sounder endp
_tprint proc near
; This routine will cause a text print. the format of the call is
; as follows:
; tprint(x,y,l,bc,fc,text)
; x is the x location on the screen
; y is the y location on the screen
; l is the length to be output (padded on the right with spaces to length)
; is length is passed as zero then only the string will be output.
; bc is the background color 0-15
; fc is the foreground color 0-15
; text is the pointer to the text you wish to output.
push bp
mov bp,sp
push es
mov ax,0b800h
mov es,ax ; es addresses the screen ram
mov ax,[bp+4]
shl ax,1 ; times two
mov bx,[bp+6] ; get the y location
shl bx,1 ; times two for word boundaries
mov si,ytab[bx] ; multiply by 160
add si,ax ; now ax has offset into screen ram
mov cx,[bp+8] ; cx contains the length
mov bx,[bp+10] ; background color
shl bl,1
shl bl,1
shl bl,1
shl bl,1 ; moved to high nibble
mov ax,[bp+12]
mov bh,al ; foreground color goes into bl
or bh,bl ; now the atribute byte in in bl
mov di,[bp+14] ; offset to text pointer in di
mov ch,0 ; counter for number of chars done
tp0: mov bl,ds:[di] ; get character
cmp bl,0
je tpdn ; text print finished
mov dx,03dah
rtr: in al,dx
sar al,1
jc rtr
rtr1: in al,dx
sar al,1
jnc rtr1
mov es:[si],bl
inc si
rtr0: in al,dx
sar al,1
jc rtr0
rtr2: in al,dx
sar al,1
jnc rtr2
mov es:[si],bh
inc si
inc di
inc ch
jmp tp0
tpdn: cmp ch,cl
jge tpdn0
sub cl,ch
mov ch,0
mov bl,20h
tpd: mov dx,03dah
rtr3: in al,dx
sar al,1
jc rtr3
rtr4: in al,dx
sar al,1
jnc rtr4
mov es:[si],bl
inc si
rtr5: in al,dx
sar al,1
jc rtr5
rtr6: in al,dx
sar al,1
jnc rtr6
mov es:[si],bh
inc si
loop tpd
tpdn0: pop es
pop bp
ret
_tprint endp
_flushk proc near
mov ah,0ch
mov al,0
int 21h
ret
_flushk endp
_keystat proc near
mov ah,0bh
int 21h
mov ah,0
ret
_keystat endp
_getime proc near
mov ah,2ch
int 21h
mov _sec,dh
mov _hsec,dl
ret
_getime endp
_cursoff proc near
; Move the cursor to a position we have set to a background color of
; black during the game
mov ah,02h
mov dh,16h
mov dl,0
mov bh,0h
int 10h
ret
_cursoff endp
_TEXT ENDS
END