.model small,c
public current_x, current_y, current_attr
.stack
.data
current_x db 0
current_y db 0
current_attr db 0
columns db 0
.code
gotoxy proc
mov current_x, al
mov current_y, ah
ret
gotoxy endp
getx proc
mov al,current_x
ret
getx endp
gety proc
mov al,current_y
ret
gety endp
getattr proc
mov al,current_attr
ret
getattr endp
setattr proc
mov current_attr, al
ret
setattr endp
setbackground proc
mov ah,current_attr
and ah,0fh
mov cl, 4
shl al, cl
or ah,al
mov current_attr, ah
ret
setbackground endp
setforeground proc
and al, 0fh
mov ah, current_attr
and ah, 0f0h
or ah, al
mov current_attr, ah
ret
setforeground endp
putstring proc uses es di
; call with ds:si = address of ASCIIZ string to print out.
; uses: di, cx, dx
; The following section takes a pair of coordinates and figures
; out their address.
mov cx,0b000h ; First get the video buffer segment.
mov ah, 0fh
int 10h
mov columns,ah
cmp al, 7
jz @f
mov cx, 0b800h
@@:
mov es,cx
mov al,current_y
mov dl,ah
mul dl
mov di,ax
mov al,current_x
cbw
add di,ax
shl di, 1
; This next bit actually writes the string to the screen.
mov ah,current_attr
lodsb
@@:
stosw
lodsb
test al,al
jnz @b
; This converts the final address back to a pair of coordinates
; and stores them so the next string will immediately follow this
; one if the current position isn't repositioned beforehand.
mov dl, columns
div dl
mov current_y, al
mov current_x, ah
done:
ret
putstring endp
ifdef DOTEST
.data
string1 db "This is blue on green.", 0
string2 db "This is green on blue.", 0
.code
.startup
main proc
mov al, 21h
call setattr
xor ax, ax
call gotoxy
mov si, offset string1
call putstring
mov al, 12h
call setattr
mov ax, 0100h
call gotoxy
mov si, offset string2
call putstring
xor ax, ax
int 16h
mov ax, 4c00h
int 21h
main endp
endif
end
Lm1vZGVsIHNtYWxsLGMKCnB1YmxpYyBjdXJyZW50X3gsIGN1cnJlbnRfeSwgY3VycmVudF9hdHRyCgouc3RhY2sKCi5kYXRhCmN1cnJlbnRfeCAgICAgICBkYiAwCmN1cnJlbnRfeSAgICAgICBkYiAwCmN1cnJlbnRfYXR0ciAgICBkYiAwCmNvbHVtbnMgICAgICAgICBkYiAwCgouY29kZQpnb3RveHkgIHByb2MKICAgIG1vdiBjdXJyZW50X3gsIGFsCiAgICBtb3YgY3VycmVudF95LCBhaAogICAgcmV0CmdvdG94eSBlbmRwCgpnZXR4IHByb2MKICAgIG1vdiBhbCxjdXJyZW50X3gKICAgIHJldApnZXR4IGVuZHAKCmdldHkgcHJvYwogICAgbW92IGFsLGN1cnJlbnRfeQogICAgcmV0CmdldHkgZW5kcAoKZ2V0YXR0ciBwcm9jCiAgICBtb3YgYWwsY3VycmVudF9hdHRyCiAgICByZXQKZ2V0YXR0ciBlbmRwCgpzZXRhdHRyIHByb2MKICAgIG1vdiBjdXJyZW50X2F0dHIsIGFsCiAgICByZXQKc2V0YXR0ciBlbmRwCgpzZXRiYWNrZ3JvdW5kIHByb2MKICAgIG1vdiBhaCxjdXJyZW50X2F0dHIKICAgIGFuZCBhaCwwZmgKICAgIG1vdiBjbCwgNAogICAgc2hsIGFsLCBjbAogICAgb3IgIGFoLGFsCiAgICBtb3YgY3VycmVudF9hdHRyLCBhaAogICAgcmV0CnNldGJhY2tncm91bmQgZW5kcAoKc2V0Zm9yZWdyb3VuZCBwcm9jCiAgICBhbmQgYWwsIDBmaAogICAgbW92IGFoLCBjdXJyZW50X2F0dHIKICAgIGFuZCBhaCwgMGYwaAogICAgb3IgIGFoLCBhbAogICAgbW92IGN1cnJlbnRfYXR0ciwgYWgKICAgIHJldApzZXRmb3JlZ3JvdW5kIGVuZHAKCnB1dHN0cmluZyBwcm9jIHVzZXMgZXMgZGkKOyBjYWxsIHdpdGggZHM6c2kgPSBhZGRyZXNzIG9mIEFTQ0lJWiBzdHJpbmcgdG8gcHJpbnQgb3V0Lgo7IHVzZXM6ICAgICBkaSwgY3gsIGR4CiAgICA7IFRoZSBmb2xsb3dpbmcgc2VjdGlvbiB0YWtlcyBhIHBhaXIgb2YgY29vcmRpbmF0ZXMgYW5kIGZpZ3VyZXMKICAgIDsgb3V0IHRoZWlyIGFkZHJlc3MuCgogICAgbW92IGN4LDBiMDAwaCAgICAgICA7IEZpcnN0IGdldCB0aGUgdmlkZW8gYnVmZmVyIHNlZ21lbnQuCiAgICBtb3YgYWgsIDBmaAogICAgaW50IDEwaAogICAgbW92IGNvbHVtbnMsYWgKICAgIGNtcCBhbCwgNwogICAganogQGYKICAgIG1vdiBjeCwgMGI4MDBoCkBAOgogICAgbW92IGVzLGN4CgogICAgbW92IGFsLGN1cnJlbnRfeQogICAgbW92IGRsLGFoCiAgICBtdWwgZGwKICAgIG1vdiBkaSxheAogICAgbW92IGFsLGN1cnJlbnRfeAogICAgY2J3CiAgICBhZGQgZGksYXgKICAgIHNobCBkaSwgMQoKICAgIDsgVGhpcyBuZXh0IGJpdCBhY3R1YWxseSB3cml0ZXMgdGhlIHN0cmluZyB0byB0aGUgc2NyZWVuLgogICAgbW92IGFoLGN1cnJlbnRfYXR0cgogICAgbG9kc2IKQEA6CiAgICBzdG9zdwogICAgbG9kc2IKICAgIHRlc3QgIGFsLGFsCiAgICBqbnogQGIKCiAgICA7IFRoaXMgY29udmVydHMgdGhlIGZpbmFsIGFkZHJlc3MgYmFjayB0byBhIHBhaXIgb2YgY29vcmRpbmF0ZXMKICAgIDsgYW5kIHN0b3JlcyB0aGVtIHNvIHRoZSBuZXh0IHN0cmluZyB3aWxsIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGlzCiAgICA7IG9uZSBpZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpc24ndCByZXBvc2l0aW9uZWQgYmVmb3JlaGFuZC4KICAgIG1vdiBkbCwgY29sdW1ucwogICAgZGl2IGRsCiAgICBtb3YgY3VycmVudF95LCBhbAogICAgbW92IGN1cnJlbnRfeCwgYWgKZG9uZToKICAgIHJldApwdXRzdHJpbmcgZW5kcAoKaWZkZWYgRE9URVNUCgouZGF0YQpzdHJpbmcxIGRiICJUaGlzIGlzIGJsdWUgb24gZ3JlZW4uIiwgMApzdHJpbmcyIGRiICJUaGlzIGlzIGdyZWVuIG9uIGJsdWUuIiwgMAoKLmNvZGUKLnN0YXJ0dXAKbWFpbiBwcm9jCgltb3YgIGFsLCAyMWgKCWNhbGwgc2V0YXR0cgoJeG9yICBheCwgYXgKCWNhbGwgZ290b3h5Cgltb3YgIHNpLCBvZmZzZXQgc3RyaW5nMQoJY2FsbCBwdXRzdHJpbmcKCgltb3YgIGFsLCAxMmgKCWNhbGwgc2V0YXR0cgoJbW92ICBheCwgMDEwMGgKCWNhbGwgZ290b3h5Cgltb3YgIHNpLCBvZmZzZXQgc3RyaW5nMgoJY2FsbCBwdXRzdHJpbmcKCXhvciBheCwgYXgKCWludCAxNmgKCW1vdiBheCwgNGMwMGgKCWludCAyMWgKbWFpbiBlbmRwCmVuZGlmCgogICAgZW5kCg==