home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* MEMWRITE.PAS *)
- (* ------------------------------------------------------ *)
- UNIT MemWrite;
-
- INTERFACE
-
- PROCEDURE WriteMem(x,y : INTEGER; s : STRING; Farbe : BYTE);
- PROCEDURE WriteAtt(x, y, Len, Farbe : INTEGER);
- PROCEDURE WritePart(x, y, Len, Disp : INTEGER; S : STRING);
-
- VAR
- VideoBuffer : WORD;
-
- IMPLEMENTATION
-
- CONST
- MonoScreen = $B000;
- ColorScreen = $B800;
- LineTab : ARRAY [0..25] OF INTEGER =
- (0,-1,79,159,239,319,399,479,559,639,
- 719,799,879,959,1039,1119,1199,
- 1279,1359,1439,1519,1599,1679,1759,
- 1839,1919);
- VAR
- ScreenMode : BYTE ABSOLUTE $0040:$0049;
-
- PROCEDURE InitTest;
- BEGIN
- IF ScreenMode = 7 THEN VideoBuffer := MonoScreen
- ELSE VideoBuffer := ColorScreen;
- END;
-
- PROCEDURE WriteMem(x,y : INTEGER; s : STRING; Farbe : BYTE);
- { Schreibt s mit Farbe an Position xy }
- BEGIN
- INLINE($8B/$76/<Y); { MOV SI,[BP+<Y] }
- INLINE($D1/$E6); { SHL SI }
- INLINE($8B/$BC/>LINETAB); { MOV DI,[SI+>LINETAB] }
- INLINE($03/$7E/<X); { ADD DI,[BP+<X] }
- INLINE($D1/$E7); { SHL DI }
- INLINE($8E/$06/>VIDEOBUFFER); { MOV ES,[VIDEOBUFFER] }
- INLINE($1E); { PUSH DS }
- INLINE($8C/$D0); { MOV AX,SS }
- INLINE($8E/$D8); { MOV DS,AX }
- INLINE($8A/$8E/>S); { MOV CL,[BP+S] }
- INLINE($20/$C9); { AND CL,CL }
- INLINE($74/<$0D); { JZ $0D }
- INLINE($30/$ED); { XOR CH,CH }
- INLINE($8A/$66/<FARBE); { MOV AH,[BP+<FARBE] }
- INLINE($8D/$B6/>S+1); { LEA SI,[BP+S+1] }
- INLINE($AC); { LODSB }
- INLINE($AB); { STOSW }
- INLINE($E2/<$FC); { LOOP $FC }
- INLINE($1F); { POP DS }
- END;
-
- PROCEDURE WritePart(x, y, Len, Disp : INTEGER; S : STRING);
- { Schreibt s ab Disp in ein Len breites }
- { Feld. }
- BEGIN
- INLINE($8B/$76/<Y); { MOV SI,[BP+<Y] }
- INLINE($D1/$E6); { SHL SI }
- INLINE($8B/$BC/>LINETAB); { MOV DI,[SI+>LINETAB] }
- INLINE($03/$7E/<X); { ADD DI,[BP+<X] }
- INLINE($D1/$E7); { SHL DI }
- INLINE($8A/$96/>S); { MOV DL,[BP+S] }
- INLINE($30/$F6); { XOR DH,DH }
- INLINE($8A/$4E/<LEN); { MOV CL,[BP+<LEN] }
- INLINE($30/$ED); { XOR CH,CH }
- INLINE($8B/$76/<DISP); { MOV SI,[BP+<DISP] }
- INLINE($8E/$06/>VIDEOBUFFER); { MOV ES,[VIDEOBUFFER] }
- INLINE($39/$F2); { CMP DX,SI }
- INLINE($7C/<$6); { JL $6 }
- INLINE($8A/$82/$FF00); { MOV AL,[BP+SI+$FF00] }
- INLINE($EB/$2); { JMP $2 }
- INLINE($B0/32); { MOV AL,32 'Space' }
- INLINE($26); { ES: }
- INLINE($88/$05); { MOV [DI],AL }
- INLINE($46); { INC SI }
- INLINE($47); { INC DI }
- INLINE($47); { INC DI }
- INLINE($E2/<$EC); { LOOP $EC }
- END;
-
- PROCEDURE WriteAtt(x, y, Len, Farbe : INTEGER);
- { Schreibt Len Attribute mit Farbe an xy }
- BEGIN
- INLINE($8B/$76/<Y); { MOV SI,[BP+<Y] }
- INLINE($D1/$E6); { SHL SI }
- INLINE($8B/$BC/>LINETAB); { MOV DI,[SI+>LINETAB] }
- INLINE($03/$7E/<X); { ADD DI,[BP+<X] }
- INLINE($D1/$E7); { SHL DI }
- INLINE($47); { INC DI }
- INLINE($8A/$4E/$08); { MOV CL,[BP+$08] }
- INLINE($20/$C9); { AND CL,CL }
- INLINE($74/<$10); { JZ $10 }
- INLINE($30/$ED); { XOR CH,CH }
- INLINE($8A/$46/$06); { MOV AL,[BP+$06] }
- INLINE($8E/$06/>VIDEOBUFFER); { MOV ES,[VIDEOBUFFER] }
- INLINE($26); { ES: }
- INLINE($88/$05); { MOV [DI],AL }
- INLINE($47); { INC DI }
- INLINE($47); { INC DI }
- INLINE($E2/<$F9); { LOOP $F9 }
- END;
-
- BEGIN
- InitTest;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von MEMWRITE.PAS *)