home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1990
/
02
/
tricks
/
scolor.asm
< prev
next >
Wrap
Assembly Source File
|
1989-11-14
|
5KB
|
158 lines
A CS:100
;* ------------------------------------------------------- *
;* SCOLOR.ASM *
;* Setzt Farbattribute auf Monitor ohne daß der Text *
;* gelöscht wird. *
;* *
;* Syntax: SCOLOR x, y, a, h, v, b *
;* *
;* x,y : Cursorposition *
;* a,h : Breite * Höhe *
;* v,b : Vordergrund / Hintergrund *
;* *
;* Aufruf: DEBUG < SCOLOR.ASM *
;* ------------------------------------------------------- *
;
JMP 019A ; Überspringe Konstantenvereinbarung
;
DB 00,00,00,00,00,00,00
DB 0D,0A,"SCOLOR 1.0 (c) 1989 by R. Seelig",0D,0A
DB 0D,0A,"Syntax: SCOLOR x,y,a,h,v,b",0D,0A
DB "x,y = Koordinaten; a,h= Breite,Höhe; "
DB "v,b= Vorder- und Hintergrundfarbe"
DB 0D,0A,"$"
;
; Eigentlicher Programmanfang
;
MOV CX,0006 ; Vorwahl für 6 Parameter
CALL 01D1 ; UPRO: Einlesen Parameter
CMP AL,00 ; Param. nicht gefunden
JZ 01AA ; Springe zum Abbruch
CALL 0219 ; UPRO: Führe Param. aus
JMP 01B1 ; Springe zum Programmabbruch
NOP
MOV DX,010A ; Setze Zeiger auf Textkonstante
MOV AH,09 ; Bereite Textausgabe vor
INT 21 ; Gebe Text aus
INT 20 ; Beende Programm
;
; Unterprogramm zum Lesen der Parameter, und
; errechnen als Nummerischen Wert. Speichern
; ab Adresse 103
;
LODSB ; Lade Zeichen
SUB AL,30 ; ASCII => nummerisch
PUSH AX ; Wert retten
LODSB ; Lade Zeichen
CMP AL,2C ; war es ","
JZ 01CF ; dann springe Unterprogramm Ende
CMP AL,0D ; war es RETURN Taste
JZ 01CF ; dann springe Unterprogramm Ende
SUB AL,30 ; ASCII => nummerisch
MOV DL,AL ; Wert nach DL
POP AX ; 1. Param. restaurieren
XOR AH,AH ; AH löschen
MOV BL,0A ; Multiplikation mit 10
MUL BL ; durchführen
ADD AL,DL ; und 2. Zeichen dazu addieren
PUSH AX ; Zahl speichern
LODSB ; nächstes Zeichen laden
POP AX ; Zahl restaurieren
RET ; Unterprogramm Ende
;
; Liest Parameter von Kommandoebene in Puffer;
; Werden Param. gefunden AL=1,
; nicht gefunden AL=0;
;
MOV AL,[0080] ; Parameteranzahl laden
CMP AL,00 ; keine Parameter
JZ 01FC ; dann springe Unterprogramm Ende
MOV SI,0082 ; Zeiger auf 1. Parameterzeichen
LODSB ; 1. Parameterzeichen laden
CMP AL,20 ; war es ein Leerzeichen
JZ 01DB ; dann Wiederhole Ladevorgang
CMP AL,0D ; war 1. Zeichen RETURN Taste
JNZ 01E9
MOV AL,00 ; dann setze AL=0
JMP 01FC ; und springe Unterprogramm Ende
NOP
DEC SI ; Zeiger wieder auf 1. Zeichen setzen
XOR BX,BX ; BX als Anzahl gelesener Parameter
PUSH CX ; Schleifenanfang
PUSH BX
CALL 01B3 ; Rechen und Speichern aufrufen
POP BX
MOV [BX+0103],AL ; Errechneter Wert speichern
INC BX ; Speicherplatz für Param. um 1 versetzen
POP CX ; Restauriere Schleifenzaähler
LOOP 01EC ; Wiederhole den Aufruf 6 mal
MOV AL,01 ; Parameter vorhanden markieren
RET ; Unterprogramm Ende
;
; Unterprogramm, daß direkt in den Bildspeicher schreibt
; in BX steht die Bildspeicherstelle
;
PUSH BX ; Bildspeicherstelle retten
MOV BL,[0107] ; hole Vordergrundfarbe
MOV BH,[0108] ; hole Hintergrundfarbe
MOV CX,0004 ;
SHL BH,CL ; schiebe Hintergrund um 4 Bit nach rechts
ADD BL,BH ; errechne Attributbyte
POP CX ; restauriere Bildspeicherstelle
MOV AX,B800 ; (B000 bei Hercules Karte)
MOV ES,AX ; Offset Adresse nach ES
MOV DI,CX ; Speicherstelle nach DI
ES:
MOV [DI],BL ; Setze Farbattribut
RET ; Unterprogramm End
;
; Unterprogramm daß Bildschirmspeicherstellen
; errechnet und anschließend die Farbattribute
; setzt
;
XOR CX,CX
MOV CL,[0106] ; Hoehenanzahl laden
PUSH CX ; Schleifenzähler1 retten
XOR AX,AX
MOV AL,[0104] ; y - Anfangswert laden
DEC AL
MOV BX,0050 ; Multiplikator setzen
MUL BX ; AX= y * 80
XOR BX,BX
MOV BL,[0103] ; x - Anfangswert laden
DEC BL
ADD AX,BX ; AX= (y * 80)+x
MOV BX,0002 ; Multiplikator setzen
MUL BX ; AX= ((y * 80)+x)*2
INC AX ; AX= (((y * 80)+x)*2)+1
XOR CX,CX
MOV CL,[0105] ; x-Anzahl als Schleifenzähler2
PUSH CX ; Schleifenzähler2 retten
PUSH AX
MOV BX,AX ; Speicherstelle nach BX
CALL 01FD ; Farbattribut setzen aufrufen
POP AX
INC AX ; Bildschirmadresse auf
INC AX ; nächstes Attributbyte setzen
POP CX ; Schleifenzähler2 restaurieren
LOOP 0242 ; Schleife wiederholen
MOV AL,[0104] ; Y Wert laden
INC AL ; und um 1 erhöhen
MOV [0104],AL ; neuen Y Wert speichern
POP CX ; Schleifenzähler1 restaurieren
LOOP 021F ; und Schleife wiederholen
RET ; Unterprogramm Ende
;
; Programmcode zu Ende. Leerzeile beendet
; den Assembler Modus
n scolor.com
r bx
0
r cx
15b
w
q
;* ------------------------------------------------------- *
;* Ende von SCOLOR.ASM *