Skip to main content

  | मौसम…

411 समाचार
Public archive edition · Attributed source reporting with original dates · AI drafts are excluded

411 REFERENCE · Wikibooks

Oberon/ETH Oberon/2.3.7/VGA.Display.Mod

Reference material by Wikibooks contributors. This retains its source identity and is not 411 news reporting.

(* ETH Oberon, Copyright 1990-2003 Computer Systems Institute, ETH Zurich, CH-8092 Zurich. Refer to the license.txt file provided with this distribution. *) MODULE Display; (* Ott Hans-Werner, ard, pjm *) IMPORT Kernel, SYSTEM, Objects; CONST BG* = 0; FG* = 15; (*background, foreground*) replace* = 0; paint* = 1; invert* = 2; (*operation modes*) remove* = 0; suspend* = 1; restore* = 2; newprinter* = 3; (*ControlMsg id*) reduce* = 0; extend* = 1; move* = 2; (*ModifyMsg id*) display* = 0; state* = 1; (*ModifyMsg mode*) screen* = 0; printer* = 1; (* DisplayMsg device *) full* = 0; area* = 1; contents* = 2; (* DisplayMsg id. *) get* = 0; set* = 1; reset* = 2; (*SelectMsg id*) drop* = 0; integrate* = 1; (*ConsumeMsg id*) unknown* = 0; index8* = 8; color555* = 16; color565* = 17; color664* = 18; color888* = 24; color8888* = 32; TYPE Color* = LONGINT; Pattern* = LONGINT; PatternPtr = POINTER TO RECORD w, h: CHAR; pixmap: ARRAY 8192 OF CHAR END; List = POINTER TO ListDesc; ListDesc = RECORD next: List; pat: PatternPtr END; Frame* = POINTER TO FrameDesc; FrameDesc* = RECORD (Objects.ObjDesc) next*, dsc*: Frame; X*, Y*, W*, H*: INTEGER END; FrameMsg* = RECORD (Objects.ObjMsg) F*: Frame; (*target*) x*, y*, res*: INTEGER END; ControlMsg* = RECORD (FrameMsg) id*: INTEGER END; ModifyMsg* = RECORD (FrameMsg) id*, mode*: INTEGER; dX*, dY*, dW*, dH*: INTEGER; X*, Y*, W*, H*: INTEGER END; DisplayMsg* = RECORD (FrameMsg) device*: INTEGER; id*: INTEGER; u*, v*, w*, h*: INTEGER END; LocateMsg* = RECORD (FrameMsg) loc*: Frame; X*, Y*, u*, v*: INTEGER END; SelectMsg* = RECORD (FrameMsg) id*: INTEGER; time*: LONGINT; sel*: Frame; obj*: Objects.Object END; ConsumeMsg* = RECORD (FrameMsg) id*: INTEGER; u*, v*: INTEGER; obj*: Objects.Object END; MsgProc* = PROCEDURE (VAR M: FrameMsg); VAR Unit*: LONGINT; (* RasterUnit = Unit/36000 mm *) Left*, (* left margin of black-and-white maps *) ColLeft*, (* left margin of color maps *) Bottom*, (* bottom of primary map *) UBottom*, (* bottom of secondary map *) Width*, (* map width *) Height*: (* map hight*) INTEGER; arrow*, star*, cross*, downArrow*, hook*, grey0*, grey1*, grey2*, ticks*, solid*: Pattern; Broadcast*: MsgProc; pattern: List; clipx, clipy, clipright, cliptop, height, width: INTEGER; (* clipping variables *) width3: LONGINT; mask, imask: ARRAY 9 OF CHAR; rev: ARRAY 256 OF CHAR; depth: INTEGER; palette: ARRAY 256 OF LONGINT; PROCEDURE max (i, j: INTEGER): INTEGER; BEGIN IF i >= j THEN RETURN i ELSE RETURN j END END max; PROCEDURE min (i, j: LONGINT): INTEGER; BEGIN IF i >= j THEN RETURN SHORT(j) ELSE RETURN SHORT(i) END END min; PROCEDURE Map*(x: LONGINT): LONGINT; BEGIN RETURN 0A0000H END Map; PROCEDURE AdjustClip*(x, y, w, h: LONGINT); VAR right, top: INTEGER; BEGIN right := SHORT(x + w); top := SHORT(y + h); clipx := max(clipx, SHORT(x)); clipy := max(clipy, SHORT(y)); clipright := min(right, clipright); cliptop := min(top, cliptop) END AdjustClip; PROCEDURE GetDim*(pat: Pattern; VAR w, h: INTEGER); VAR ch: CHAR; BEGIN SYSTEM.GET(pat, ch); w := ORD(ch); SYSTEM.GET(pat+1, ch); h := ORD(ch) END GetDim; PROCEDURE ResetClip*; BEGIN clipx := 0; clipy := UBottom; clipright := width; cliptop := height END ResetClip; PROCEDURE SetClip*(x, y, w, h: LONGINT); BEGIN clipright := SHORT(x+w); cliptop := SHORT(y+h); clipy := SHORT(y); clipx := SHORT(x) END SetClip; PROCEDURE GetClip*(VAR x, y, w, h: INTEGER); BEGIN x := clipx; y := clipy; w := clipright - clipx; h := cliptop - clipy END GetClip; PROCEDURE SetColor*(col: Color; red, green, blue: LONGINT); (* 0 <= col, red, green, blue < 256 *) VAR ch: CHAR; BEGIN palette[col] := ASH(ASH(red, 8) + green, 8) + blue; col := col MOD 16; (* see table 8.11 of Ferraro, 3rd edition *) IF col = 6 THEN col := 14H ELSIF col > 7 THEN INC(col, 30H) END; red := (red + 4) DIV 4 -1; green := (green + 4) DIV 4 -1; blue := (blue + 4) DIV 4 -1; SYSTEM.PORTOUT(3C8H, CHR(col)); SYSTEM.PORTOUT(3C9H, CHR(red)); SYSTEM.PORTOUT(3C9H, CHR(green)); SYSTEM.PORTOUT(3C9H, CHR(blue)) END SetColor; PROCEDURE GetColor*(col: Color; VAR red, green, blue: INTEGER); BEGIN IF col >= 0 THEN col := palette[col] END; red := SHORT(ASH(col, -16) MOD 256); green := SHORT(ASH(col, -8) MOD 256); blue := SHORT(col MOD 256) END GetColor; PROCEDURE RGB*(red, green, blue: LONGINT): Color; BEGIN RETURN MIN(LONGINT) + ASH(red, 16) + ASH(green, 8) + blue END RGB; PROCEDURE Dot*(col: Color; x, y, mode: LONGINT); CODE {SYSTEM.i386} MOV AX, clipy CMP WORD y[EBP], AX JL ret MOV AX, cliptop CMP WORD y[EBP], AX JGE ret MOV AX, clipx CMP WORD x[EBP], AX JL ret MOV AX, clipright CMP WORD x[EBP], AX JGE ret MOV AX, 1803H ; AL = Data/Rotate; AH = Modus; DX = Graphic-Controller MOV DX, 03CEH CMP mode[EBP],invert JE smode MOV AX,3 CMP mode[EBP],replace JE smode MOV AX, 1003H ; paint smode: OUT DX, AX MOV DX, 03C4H ; AX = Default map mask; DX = Sequencer MOV AX, 0F02H OUT DX, AX MOV DX, 03CEH ; AL = Gaphics mode; AH = Read-Mode = 0/Write-Mode = 2 (bits 0,1) MOV AX, 0205H OUT DX, AX MOV AX, Height SUB AX, WORD y[EBP] DEC AX MOVSX EAX,AX IMUL EAX,width3 MOV ESI, x[EBP] SHR ESI, 3 ADD ESI, EAX AND ESI, 0FFFFH ADD ESI, 0A0000H MOV DX, 03CEH MOV CL, BYTE x[EBP] AND CL, 7 MOV AH, 128 SHR AH, CL MOV AL, 8 OUT DX, AX MOV AL, [ESI] ; latch bytes MOV AL, BYTE col[EBP] MOV [ESI], AL ret: END Dot; PROCEDURE CopyBlock*(sx, sy, w, h, dx, dy, mode: LONGINT); VAR top, right: INTEGER; x1, x2, x3, x4, x5, x6, x7, x8: LONGINT; help, help2, diff, start, end, msk, imsk, lh: LONGINT; leftmask, rightmask: CHAR; plane, count: SHORTINT; CODE {SYSTEM.i386} MOV EDX, dx[EBP] MOV AX,DX ADD AX, WORD w[EBP] MOV right[EBP], AX ; right := DX + W MOV AX, WORD dy[EBP] ADD AX, WORD h[EBP] MOV top[EBP], AX ; top := DY + H ; IF DX < clipx THEN W := W - (clipx - DX); DX := clipx END CMP DX, clipx JGE ok0 MOV AX, clipx SUB AX, DX SUB WORD w[EBP], AX MOV DX, clipx ok0: ; IF DY < clipy THEN H := H - (clipy - DY); DY := clipy END MOV AX, WORD dy[EBP] CMP AX, clipy JGE ok1 MOV AX, clipy SUB AX, WORD dy[EBP] SUB WORD h[EBP], AX MOV AX, clipy MOV WORD dy[EBP], AX ok1: ; IF clipright < right THEN W := clipright - DX END MOV AX, clipright CMP AX, right[EBP] JGE ok2 MOV AX, clipright SUB AX, DX MOV WORD w[EBP], AX ok2: ; IF cliptop < top THEN H := cliptop - DY END MOV AX, cliptop CMP AX, top[EBP] JGE ok3 MOV AX, cliptop SUB AX, WORD dy[EBP] MOV WORD h[EBP], AX ok3: ; IF (W <= 0) OR (H <= 0) THEN RETURN END; CMP WORD w[EBP], 0 JLE ret CMP WORD h[EBP], 0 JLE ret LEA EAX, mask MOV msk[EBP], EAX ; msk := SYSTEM.ADR(mask[0]) LEA EAX, imask MOV imsk[EBP], EAX ; imsk := SYSTEM.ADR(imask[0]) MOV AX, height DEC AX MOVSX EAX,AX MOV lh[EBP], EAX ; h := height-1 MOV dx[EBP], EDX ; DX := DX MOV EAX, lh[EBP] MOV EBX, EAX SUB EAX, sy[EBP] ; EAX := height - sy MOV sy[EBP], EAX SUB EBX, dy[EBP] ; EBX := height - dy MOV dy[EBP], EBX MOV EAX, sx[EBP] ; EAX := sx MOV ECX, EAX MOV EBX, EAX MOV EDX, EAX SHR EAX, 3 ; EAX := sx DIV 8 AND ECX, 7 ; ECX := sx MOD 8 ADD EBX, w[EBP] ADD EDX, w[EBP] SHR EBX, 3 ; EBX := (sx+w) DIV 8 AND EDX, 7 ; EDX := (sx+w) MOD 8 MOV x1[EBP], EAX ; x1 := sx DIV 8 MOV x2[EBP], EBX ; x2 := (sx+w) DIV 8 MOV x3[EBP], ECX ; x3 := sx MOD 8 INC EDX MOV x4[EBP], EDX ; x4 := (sx+w) MOD 8 (+1) MOV EAX, dx[EBP] ; EAX := dx MOV ECX, EAX MOV EBX, EAX MOV EDX, EAX SHR EAX, 3 ; EAX := dx DIV 8 AND ECX, 7 ; ECX := dx MOD 8 ADD EBX, w[EBP] ; EBX := dx +w ADD EDX, w[EBP] SHR EBX, 3 ; EBX := (dx+w) DIV 8 AND EDX, 7 ; EDX := (dx+w) MOD 8 MOV x5[EBP], EAX ; x5 := dx DIV 8 MOV x6[EBP], EBX ; x6 := (dx+w) DIV 8 MOV x7[EBP], ECX ; x7 := dx MOD 8 INC EDX MOV x8[EBP], EDX ; x8 := (dx+w) MOD 8 MOV ESI, sy[EBP] IMUL ESI, width3 ; w3[EBP] ADD ESI, x1[EBP] ; ESI := startbyte source bottomleft AND ESI, 0FFFFH ADD ESI, 0A0000H ; offset of screen MOV EDI, dy[EBP] IMUL EDI, width3 ; w3[EBP] ADD EDI, EAX AND EDI, 0FFFFH ADD EDI, 0A0000H ; offset of screen MOV start[EBP], ESI ; starbyte source bottom left MOV end[EBP], EDI ; startbyte dest bottom left MOV DX, 03CEH MOV AX, 0005 OUT DX, AX ; read/writemode = 0 MOV AX, 0001 OUT DX, AX ; enable/reset = 0000b MOV AH, 0 MOV AL, 3 OUT DX, AX ; replacemode MOV EBX, x8[EBP] DEC EBX MOV EDX, msk[EBP] MOV AH, [EDX][EBX] ; MOV AH, mask[EBX] MOV rightmask[EBP], AH MOV EBX, x7[EBP] MOV EDX, imsk[EBP] MOV AH, [EDX][EBX] ; MOV AH, imask[EBX] MOV leftmask[EBP], AH MOV EBX, x6[EBP] SUB EBX, x5[EBP] ; EBX := difference in bytes dx/dx+w DEC EBX MOV diff[EBP], EBX JGE inmorebytes MOV DH, rightmask[EBP] ; EBX = 0 /only one byte AND DH, leftmask[EBP] MOV leftmask[EBP], DH MOV rightmask[EBP], DH inmorebytes: MOV EDX, h[EBP] ; EDX := h MOV EAX, sx[EBP] ; EAX := sx MOV EBX, sy[EBP] ; EBX := sy CMP EAX, dx[EBP] ; sx < dx ? JGE CB1 ; no -> goto CB1 MOV ECX, x8[EBP] ; sx < dx ! SUB ECX, x4[EBP] ; ECX := difference between s/dest x ADD ECX, 32 AND CL, 1FH ; CL := rotate shift count CMP BX, WORD dy[EBP] ; sy < dy ? was EBX JL CB10 ; yes goto CB10 JMP CB13 ; else goto CB13 CB1: SUB ECX, x3[EBP] ; sx >= dx ADD ECX, 32 AND CL, 1FH ; CL:= rotate shift count CMP BX, WORD dy[EBP] ; sy >= dy? JGE CB12 ; yes goto CB12 CB11: MOV help[EBP], EDX ; (sx >= dx) & (sy < dy) / save linecounter MOV EBX, diff[EBP] CMP EBX, 1 JLE byte11 ; in 1 Byte => normal CopyBlock CMP CL, 0 ; rotateoffset = 0 ? JE qCB11 ; QuickCopy byte11: MOV count[EBP], 3 ; there are 4 Bitplanes MOV plane[EBP], 8 ; begin with plane 4 CB11h: MOV DX, 03CEH MOV AH, count[EBP] MOV AL, 4 OUT DX, AX ; select plane to read MOV AH, leftmask[EBP] ; bitmask select MOV AL, 8 OUT DX, AX ; set mask at destination MOV DX, 03C4H MOV AH, plane[EBP] ; set bitplanemask MOV AL, 2 OUT DX, AX ; set sequencer XOR EAX, EAX MOV AH, [ESI] MOV AL, 1[ESI] ADD ESI, 2 ROR EAX, CL CMP EBX, 0 ; in one byte ? JL cbl31 cbl6i: MOV DL, [EDI] ; latch bytes MOV [EDI], AH INC EDI ROL EAX, 8 CMP EBX, 0 ; in 2 bytes ? JE cbl3 ;** MOV help2[EBP], EAX MOV DX, 03CEH MOV AX, 0FF08H ; all maskbits OUT DX, AX MOV EAX, help2[EBP] cbl6: ROL EAX, CL MOV AL, [ESI] INC ESI ROR EAX, CL MOV [EDI], AH INC EDI ROL EAX, 8 DEC BX JG cbl6 cbl3: MOV EBX, x6[EBP] SUB EBX, x5[EBP] MOV help2[EBP], EBX MOV EBX, x2[EBP] SUB EBX, x1[EBP] CMP EBX, help2[EBP] JE cbl31 ROL EAX, CL MOV AL, [ESI] ROR EAX, CL cbl31: PUSH EAX MOV DX, 03CEH MOV AH, rightmask[EBP] MOV AL, 8 OUT DX, AX ; set right dest bitmask POP EAX MOV DL, [EDI] MOV [EDI], AH MOV ESI, start[EBP] MOV EDI, end[EBP] SHR plane[EBP], 1 MOV EBX, diff[EBP] DEC count[EBP] JGE CB11h MOV EDX, help[EBP] ; next line / get linecounter SUB start[EBP], 80 SUB end[EBP], 80 MOV ESI, start[EBP] MOV EDI, end[EBP] MOV count[EBP], 3 MOV plane[EBP], 8 DEC EDX MOV help[EBP], EDX ; save new linecounter CMP EDX, 0 JG CB11h JMP resetgrafCB CB12: MOV EAX, h[EBP] ; (sx >= dx) & (sy >= dy) DEC EAX IMUL EAX, width3 ; w3[EBP] ; (Note: EDX is not modified) SUB ESI, EAX SUB EDI, EAX MOV start[EBP], ESI MOV end[EBP], EDI MOV help[EBP], EDX ; save linecounter MOV EBX, diff[EBP] CMP EBX, 1 JLE byte12 CMP CL, 0 ; rotate shift = 0 ? JE qCB12 ; quick CopyBlock byte12: MOV count[EBP], 3 ; there are 4 Bitplanes MOV plane[EBP], 8 cbl1: MOV DX, 03CEH MOV AH, count[EBP] MOV AL, 4 OUT DX, AX ; select plane to read MOV AH, leftmask[EBP] ; bitmask select MOV AL, 8 OUT DX, AX ; set mask at destination MOV DX, 03C4H MOV AH, plane[EBP] MOV AL, 2 OUT DX, AX ; set sequencer XOR EAX, EAX MOV AH, [ESI] MOV AL, 1[ESI] ADD ESI, 2 ROR EAX, CL CMP EBX, 0 JL cbl41 cbl7i: MOV DL, [EDI] ; latch bytes MOV [EDI], AH INC EDI ROL EAX, 8 ; ready for new out CMP EBX, 0 ; in 2 bytes ? JE cbl4 ;** MOV help2[EBP], EAX MOV DX, 03CEH MOV AX, 0FF08H ; all maskbits OUT DX, AX MOV EAX, help2[EBP] cbl7: ROL EAX, CL MOV AL, [ESI] INC ESI ROR EAX, CL MOV [EDI], AH INC EDI ROL EAX, 8 DEC BX JG cbl7 cbl4: MOV EBX, x6[EBP] SUB EBX, x5[EBP] MOV help2[EBP], EBX MOV EBX, x2[EBP] SUB EBX, x1[EBP] CMP EBX, help2[EBP] JE cbl41 ROL EAX, CL MOV AL, [ESI] ROR EAX, CL cbl41: PUSH EAX MOV DX, 03CEH MOV AH, rightmask[EBP] MOV AL, 8 OUT DX, AX ; set right dest bitmask POP EAX MOV DL, [EDI] MOV [EDI], AH MOV ESI, start[EBP] MOV EDI, end[EBP] SHR plane[EBP], 1 MOV EBX, diff[EBP] DEC count[EBP] JGE cbl1 MOV EDX, help[EBP] ; next line / get linecounter ADD start[EBP], 80 ADD end[EBP], 80 MOV ESI, start[EBP] MOV EDI, end[EBP] MOV plane[EBP], 8 MOV count[EBP], 3 DEC EDX MOV help[EBP], EDX ; save new linecounter CMP EDX, 0 JG cbl1 JMP resetgrafCB CB10: MOV EAX, x2[EBP] ; (sx < dx) & (sy < dy) SUB EAX, x1[EBP] ADD ESI, EAX MOV EAX, x6[EBP] SUB EAX, x5[EBP] ADD EDI, EAX MOV start[EBP], ESI ; startbyte source bottom right MOV end[EBP], EDI ; starbyte dest bottom right MOV help[EBP], EDX ; save linecounter MOV EBX, diff[EBP] CMP EBX, 1 JLE byte10 CMP CL, 0 JE qCB10 ; Quick CopyBlock byte10: MOV count[EBP], 3 ; there are 4 Bitplanes MOV plane[EBP], 8 cbl10: MOV DX, 03CEH MOV AH, count[EBP] MOV AL, 4 OUT DX, AX ; select plane to read MOV AH, rightmask[EBP] ; bitmask select MOV AL, 8 OUT DX, AX ; set mask at destination MOV DX, 03C4H MOV AH, plane[EBP] MOV AL, 2 OUT DX, AX ; set sequencer XOR EAX, EAX MOV AL, [ESI] MOV AH, -1[ESI] SUB ESI, 2 ROR EAX, CL CMP EBX, 0 ; in one byte ? JGE cbl11i MOV DL, rightmask[EBP] ; xchg masks MOV leftmask[EBP], DL JMP cbl121 cbl11i: MOV DL, [EDI] ; latch bytes MOV [EDI], AL DEC EDI ROR EAX, 8 CMP EBX, 0 JE cbl12 ;** MOV help2[EBP], EAX MOV DX, 03CEH MOV AX, 0FF08H ; all maskbits OUT DX, AX MOV EAX, help2[EBP] cbl11: ROL EAX, CL MOV AH, [ESI] DEC ESI ROR EAX, CL MOV [EDI], AL DEC EDI ROR EAX, 8 DEC BX JG cbl11 cbl12: MOV EBX, x6[EBP] SUB EBX, x5[EBP] MOV help2[EBP], EBX MOV EBX, x2[EBP] SUB EBX, x1[EBP] CMP EBX, help2[EBP] JE cbl121 ROL EAX, CL MOV AH, [ESI] ROR EAX, CL cbl121: PUSH EAX MOV DX, 03CEH MOV AH, leftmask[EBP] MOV AL, 8 OUT DX, AX ; set left dest bitmask POP EAX MOV DL, [EDI] MOV [EDI], AL MOV ESI, start[EBP] MOV EDI, end[EBP] SHR plane[EBP], 1 MOV EBX, diff[EBP] DEC count[EBP] JGE cbl10 MOV EDX, help[EBP] ; next line / get linecounter SUB start[EBP], 80 SUB end[EBP], 80 MOV ESI, start[EBP] MOV EDI, end[EBP] MOV plane[EBP], 8 MOV count[EBP], 3 DEC EDX MOV help[EBP], EDX ; save new linecounter CMP EDX, 0 JG cbl10 JMP resetgrafCB CB13: MOV EAX, h[EBP] ; (sx < dx) & (sy >= dy) DEC EAX IMUL EAX, width3 ; w3[EBP] SUB ESI, EAX SUB EDI, EAX MOV EAX, x2[EBP] SUB EAX, x1[EBP] ADD ESI, EAX MOV EAX, x6[EBP] SUB EAX, x5[EBP] ADD EDI, EAX MOV start[EBP], ESI MOV end[EBP], EDI MOV help[EBP], EDX ; save linecounter MOV EBX, diff[EBP] CMP EBX, 1 JLE byte13 CMP CL, 0 JE qCB13 byte13: MOV count[EBP], 3 ; there are 4 Bitplanes MOV plane[EBP], 8 cbl13: MOV DX, 03CEH MOV AH, count[EBP] MOV AL, 4 OUT DX, AX ; select plane to read MOV AH, rightmask[EBP] ; bitmask select MOV AL, 8 OUT DX, AX ; set mask at destination MOV DX, 03C4H MOV AH, plane[EBP] MOV AL, 2 OUT DX, AX ; set sequencer XOR EAX, EAX MOV AL, [ESI] MOV AH, -1[ESI] SUB ESI, 2 ROR EAX, CL CMP EBX, 0 JGE cbl14i MOV DL, rightmask[EBP] MOV leftmask[EBP], DL JMP cbl151 cbl14i: MOV DL, [EDI] ; latch bytes MOV [EDI], AL DEC EDI ROR EAX, 8 CMP EBX, 0 ; in 2 bytes ? JE cbl15 ;** MOV help2[EBP], EAX MOV DX, 03CEH MOV AX, 0FF08H ; all maskbits OUT DX, AX MOV EAX, help2[EBP] cbl14: ROL EAX, CL MOV AH, [ESI] DEC ESI ROR EAX, CL MOV [EDI], AL DEC EDI ROR EAX, 8 DEC BX JG cbl14 cbl15: MOV EBX, x6[EBP] SUB EBX, x5[EBP] MOV help2[EBP], EBX MOV EBX, x2[EBP] SUB EBX, x1[EBP] CMP EBX, help2[EBP] JE cbl151 ROL EAX, CL MOV AH, [ESI] ROR EAX, CL cbl151: PUSH EAX MOV DX, 03CEH MOV AH, leftmask[EBP] MOV AL, 8 OUT DX, AX ; set left dest bitmask POP EAX MOV DL, [EDI] MOV [EDI], AL MOV ESI, start[EBP] MOV EDI, end[EBP] SHR plane[EBP], 1 MOV EBX, diff[EBP] DEC count[EBP] JGE cbl13 MOV EDX, help[EBP] ; next line / get linecounter ADD start[EBP], 80 ADD end[EBP], 80 MOV ESI, start[EBP] MOV EDI, end[EBP] MOV count[EBP], 3 MOV plane[EBP], 8 DEC EDX MOV help[EBP], EDX ; save new linecounter CMP EDX, 0 JG cbl13 JMP resetgrafCB qCB12: MOV DX, 03CEH ; Quick CopyBlock begin MOV AH, leftmask[EBP] ; bitmask select MOV AL, 8 OUT DX, AX ; set mask at destination MOV count[EBP], 3 MOV plane[EBP], 8 q12lloop: MOV DX, 03CEH MOV AH, count[EBP] MOV AL, 4 OUT DX, AX MOV DX, 03C4H MOV AH, plane[EBP] MOV AL, 2 OUT DX, AX MOV CL, [ESI] ; fetch source MOV AL, [EDI] ; latch at destiation MOV [EDI], CL ; set source ; MOV DX, 03CEH SHR plane[EBP], 1 DEC count[EBP] JGE q12lloop ; next plane MOV DX, 03C4H MOV AH, 00FH MOV AL, 2 OUT DX, AX ; all planes again MOV DX, 03CEH INC ESI INC EDI MOV AX, 0105H ; writemode 1 OUT DX, AX qcbl1: MOV AL, [ESI] INC ESI MOV [EDI], AH INC EDI DEC BX JG qcbl1 qcbl7: MOV DX, 03CEH MOV AH, rightmask[EBP] MOV AL, 8 OUT DX, AX ; set right dest bitmask MOV AX, 0005 ; writemode 0 OUT DX, AX MOV count[EBP], 3 MOV plane[EBP], 8 q12rloop: MOV DX, 03CEH MOV AH, count[EBP] MOV AL, 4 OUT DX, AX MOV DX, 03C4H MOV AH, plane[EBP] MOV AL, 2 OUT DX, AX MOV CL, [ESI] ; fetch source MOV AL, [EDI] ; latch at destiation MOV [EDI], CL ; set source ; MOV DX, 03CEH SHR plane[EBP], 1 DEC count[EBP] JGE q12rloop ; next plane MOV EBX, diff[EBP] ADD start[EBP], 80 ADD end[EBP], 80 MOV ESI, start[EBP] MOV EDI, end[EBP] DEC help[EBP] ; dec linecounter JG qCB12 JMP resetgrafCB qCB11: MOV DX, 03CEH MOV AH, leftmask[EBP] ; bitmask select MOV AL, 8 OUT DX, AX ; set mask at destination MOV count[EBP], 3 MOV plane[EBP], 8 q11lloop: MOV DX, 03CEH MOV AH, count[EBP] MOV AL, 4 OUT DX, AX MOV DX, 03C4H MOV AH, plane[EBP] MOV AL, 2 OUT DX, AX MOV CL, [ESI] ; fetch source MOV AL, [EDI] ; latch at destiation MOV [EDI], CL ; set source ; MOV DX, 03CEH SHR plane[EBP], 1 DEC count[EBP] JGE q11lloop ; next plane MOV DX, 03C4H MOV AH, 00FH MOV AL, 2 OUT DX, AX ; all panes again MOV DX, 03CEH INC ESI INC EDI MOV AX, 0105H ; writemode 1 OUT DX, AX qcbl6: MOV AL, [ESI] INC ESI MOV [EDI], AH INC EDI DEC BX JG qcbl6 qcbl3: MOV DX, 03CEH MOV AH, rightmask[EBP] MOV AL, 8 OUT DX, AX ; set right dest bitmask MOV AX, 0005 ; writemode 0 OUT DX, AX MOV count[EBP], 3 MOV plane[EBP], 8 q11rloop: MOV DX, 03CEH MOV AH, count[EBP] MOV AL, 4 OUT DX, AX MOV DX, 03C4H MOV AH, plane[EBP] MOV AL, 2 OUT DX, AX MOV CL, [ESI] ; fetch source MOV AL, [EDI] ; latch at destiation MOV [EDI], CL ; set source ; MOV DX, 03CEH SHR plane[EBP], 1 DEC count[EBP] JGE q11rloop ; next plane MOV EBX, diff[EBP] SUB start[EBP], 80 SUB end[EBP], 80 MOV ESI, start[EBP] MOV EDI, end[EBP] DEC help[EBP] ; dec linecounter JG qCB11 JMP resetgrafCB qCB10: MOV DX, 03CEH MOV AH, rightmask[EBP] ; bitmask select MOV AL, 8 OUT DX, AX ; set mask at destination MOV count[EBP], 3 MOV plane[EBP], 8 q10rloop: MOV DX, 03CEH MOV AH, count[EBP] MOV AL, 4 OUT DX, AX MOV DX, 03C4H MOV AH, plane[EBP] MOV AL, 2 OUT DX, AX MOV CL, [ESI] ; fetch source MOV AL, [EDI] ; latch at destiation MOV [EDI], CL ; set source ; MOV DX, 03CEH SHR plane[EBP], 1 DEC count[EBP] JGE q10rloop ; next plane MOV DX, 03C4H MOV AH, 00FH MOV AL, 2 OUT DX, AX ; all panes again MOV DX, 03CEH DEC ESI DEC EDI MOV AX, 0105H ; writemode 1 OUT DX, AX qcbl10: MOV AL, [ESI] DEC ESI MOV [EDI], AH DEC EDI DEC BX JG qcbl10 qcbl12: MOV DX, 03CEH MOV AX, 0005 ; writemode 0 OUT DX, AX MOV AH, leftmask[EBP] MOV AL, 8 OUT DX, AX ; set left dest bitmask MOV count[EBP], 3 MOV plane[EBP], 8 q10lloop: MOV DX, 03CEH MOV AH, count[EBP] MOV AL, 4 OUT DX, AX MOV DX, 03C4H MOV AH, plane[EBP] MOV AL, 2 OUT DX, AX MOV CL, [ESI] ; fetch source MOV AL, [EDI] ; latch at destiation MOV [EDI], CL ; set source ; MOV DX, 03CEH SHR plane[EBP], 1 DEC count[EBP] JGE q10lloop ; next plane MOV EBX, diff[EBP] SUB start[EBP], 80 SUB end[EBP], 80 MOV ESI, start[EBP] MOV EDI, end[EBP] DEC help[EBP] ; dec linecounter JG qCB10 JMP resetgrafCB qCB13: MOV DX, 03CEH MOV AH, rightmask[EBP] ; bitmask select MOV AL, 8 OUT DX, AX ; set mask at destination MOV AH, 0 MOV AL, 3 OUT DX, AX MOV count[EBP], 3 MOV plane[EBP], 8 q13rloop: MOV DX, 03CEH MOV AH, count[EBP] MOV AL, 4 OUT DX, AX MOV DX, 03C4H MOV AH, plane[EBP] MOV AL, 2 OUT DX, AX MOV CL, [ESI] ; fetch source MOV AL, [EDI] ; latch at destiation MOV [EDI], CL ; set source ; MOV DX, 03CEH SHR plane[EBP], 1 DEC count[EBP] JGE q13rloop ; next plane MOV DX, 03C4H MOV AH, 00FH MOV AL, 2 OUT DX, AX ; all panes again MOV DX, 03CEH DEC ESI DEC EDI MOV AX, 0105H ; writemode 1 OUT DX, AX qcbl13: MOV AL, [ESI] DEC ESI MOV [EDI], AH DEC EDI DEC BX JG qcbl13 qcbl14: MOV DX, 03CEH MOV AX, 0005 ; writemode 0 OUT DX, AX MOV AH, leftmask[EBP] MOV AL, 8 OUT DX, AX ; set left dest bitmask MOV count[EBP], 3 MOV plane[EBP], 8 q13lloop: MOV DX, 03CEH MOV AH, BYTE count[EBP] MOV AL, 4 OUT DX, AX MOV DX, 03C4H MOV AH, plane[EBP] MOV AL, 2 OUT DX, AX MOV CL, [ESI] ; fetch source MOV AL, [EDI] ; latch at destiation MOV [EDI], CL ; set source ; MOV DX, 03CEH SHR plane[EBP], 1 DEC count[EBP] JGE q13lloop ; next plane MOV EBX, diff[EBP] ADD start[EBP], 80 ADD end[EBP], 80 MOV ESI, start[EBP] MOV EDI, end[EBP] DEC help[EBP] ; dec linecounter JG qCB13 JMP resetgrafCB resetgrafCB: MOV DX, 03CEH MOV AX, 0FF08H ; default bitmask OUT DX, AX MOV AX, 0005 ; default mode-reg OUT DX, AX MOV AX, 0003 ; default Function-Select OUT DX, AX MOV AX, 0001 ; default enable set/reset OUT DX, AX MOV DX, 03C4H MOV AX, 0F02H ; default map mask OUT DX, AX endCB: ret: END CopyBlock; PROCEDURE SetMode*(x: LONGINT; s: SET); BEGIN END SetMode; PROCEDURE CPTranslate(pat: LONGINT; cpX, cpY, cpW, cpH: INTEGER; VAR buf: ARRAY OF INTEGER); VAR cpw, cph, cpsw: SHORTINT; CODE {SYSTEM.i386} MOV BX,cpW[EBP] ADD BX,7 SHR BX,3 MOV cpw[EBP],BL ; cpw := cpW DIV 8 MOV ESI,pat[EBP] XOR EAX,EAX MOV AL,[ESI] ADD AX,7 SHR AX,3 MOV cpsw[EBP],AL ; cpsw := p.w DIV 8 MOV EDI,buf[EBP] MOV AX,cpW[EBP] MOV [EDI],AL ; new p.w INC EDI MOV AX,cpH[EBP] ; new p.h MOV [EDI],AL INC EDI MOVSX BX,cpsw[EBP] MOV AX,cpY[EBP] IMUL AX,BX MOVSX EAX,AX ADD ESI,EAX MOV CX,cpX[EBP] SHR CX,3 MOVSX ECX,CX ADD ESI,ECX ADD ESI,2 ; ESI := Sourcepos for Copyloop MOV cph[EBP],0 ; init loop variables MOV DH, 0 MOV DL,cph[EBP] MOV CX,cpX[EBP] AND CX,7 ; cpX MOD 8 loopcp: CMP cpH[EBP],DX JLE l7cp ; height reached ? MOV EAX,[ESI] SHR EAX,CL ; in proper position PUSH ECX MOV EBX,-2 MOV CX,cpW[EBP] SHL EBX,CL SHR EBX, 1 NOT EBX AND EAX,EBX POP ECX MOV [EDI],EAX ; copy for a new pattern MOVSX EAX,cpsw[EBP] ADD ESI,EAX ; one line in source up MOVSX EAX,cpw[EBP] ADD EDI,EAX ; one line at destination up INC DX JMP loopcp l7cp: END CPTranslate; PROCEDURE CP1(col: CHAR; dest, pat, X: LONGINT; h: SHORTINT); CODE {SYSTEM.i386} MOV EDI, dest[EBP] MOV ESI, pat[EBP] ; patternaddress ADD ESI, 2 MOV ECX, X[EBP] ; X MOD 8 AND ECX, 7 MOV EDX, 03C4H ; AL = Plane select; AH = Bitplanemask; DX = Sequencer MOV AH, col[EBP] MOV AL, 2 OUT DX, AX LEA EAX, rev ; MOV EAX, reverse[EBP] MOV DL, h[EBP] XOR EBX, EBX cploop2: MOV BL, [ESI] INC ESI SHL BL, CL MOV BL, [EAX][EBX] MOV DH, [EDI] ; latch byte MOV [EDI], BL ; set pattern SUB EDI, width3 ; w3[EBP] DEC DL JG cploop2 END CP1; PROCEDURE CP2(col: CHAR; dest, pat, X: LONGINT; h: SHORTINT); CODE {SYSTEM.i386} MOV EDI, dest[EBP] MOV ESI, pat[EBP] ; patternaddress ADD ESI, 2 MOV ECX, X[EBP] ; X MOD 8 AND ECX, 7 MOV EDX, 03C4H ; AL = Plane select; AH = Bitplanemask; DX = Sequencer MOV AH, col[EBP] MOV AL, 2 OUT DX, AX LEA EAX, rev ; MOV EAX, reverse[EBP] cploop3: XOR EBX, EBX MOV BL, [ESI] INC ESI SHL BX, CL MOV DX, BX AND BX, 0FFH MOV DL, [EAX][EBX] MOV BL, DH MOV DH, [EAX][EBX] MOV BL, [EDI] ; latch byte MOV [EDI], DL ; set pattern MOV BL, 1[EDI] ; latch byte MOV 1[EDI], DH ; set pattern SUB EDI, width3 DEC h[EBP] JG cploop3 END CP2; PROCEDURE CP3(col: CHAR; dest, pat, X: LONGINT; h: SHORTINT); CODE {SYSTEM.i386} MOV EDI, dest[EBP] MOV ESI, pat[EBP] ; patternaddress ADD ESI, 2 MOV ECX, X[EBP] ; X MOD 8 AND ECX, 7 MOV EDX, 03C4H ; AL = Plane select; AH = Bitplanemask; DX = Sequencer MOV AH, col[EBP] MOV AL, 2 OUT DX, AX LEA EAX, rev ; MOV EAX, reverse[EBP] cploop5: XOR EBX, EBX MOV BX, [ESI] ADD ESI, 2 SHL BX, CL MOV DX, BX AND BX, 0FFH MOV DL, [EAX][EBX] MOV BL, DH MOV DH, [EAX][EBX] MOV BL, [EDI] ; latch byte MOV [EDI], DL ; set pattern MOV BL, 1[EDI] ; latch byte MOV 1[EDI], DH ; set pattern SUB EDI, width3 DEC h[EBP] JG cploop5 END CP3; PROCEDURE CP4(col: CHAR; dest, pat, X: LONGINT; h: SHORTINT); CODE {SYSTEM.i386} MOV EDI, dest[EBP] MOV ESI, pat[EBP] ; patternaddress ADD ESI, 2 MOV ECX, X[EBP] ; X MOD 8 AND ECX, 7 MOV EDX, 03C4H ; AL = Plane select; AH = Bitplanemask; DX = Sequencer MOV AH, col[EBP] MOV AL, 2 OUT DX, AX LEA EAX, rev ; MOV EAX, reverse[EBP] cploop7: XOR EBX, EBX MOV BX, [ESI] ADD ESI, 2 SHL EBX, CL MOV DX, BX SHR EBX, 16 AND BX, 0FFH MOV CH, [EAX][EBX] MOV BL, DL MOV DL, [EAX][EBX] MOV BL, DH MOV DH, [EAX][EBX] MOV BL, [EDI] ; latch byte MOV [EDI], DL ; set pattern MOV BL, 1[EDI] ; latch byte MOV 1[EDI], DH ; set pattern MOV BL, 2[EDI] ; latch byte MOV 2[EDI], CH ; set pattern SUB EDI, width3 DEC h[EBP] JG cploop7 END CP4; PROCEDURE CP5(col: CHAR; dest, pat, X: LONGINT; h: SHORTINT); CODE {SYSTEM.i386} MOV EDI, dest[EBP] MOV ESI, pat[EBP] ; patternaddress ADD ESI, 2 MOV ECX, X[EBP] ; X MOD 8 AND ECX, 7 MOV EDX, 03C4H ; AL = Plane select; AH = Bitplanemask; DX = Sequencer MOV AH, col[EBP] MOV AL, 2 OUT DX, AX LEA EAX, rev ; MOV EAX, reverse[EBP] cploop9: MOV EBX, [ESI] ADD ESI, 3 AND EBX, 0FFFFFFH SHL EBX, CL PUSH ECX MOV DX, BX SHR EBX, 16 MOV CX, BX AND BX, 0FFH MOV CL, [EAX][EBX] MOV BL, CH MOV CH, [EAX][EBX] MOV BL, DL MOV DL, [EAX][EBX] MOV BL, DH MOV DH, [EAX][EBX] MOV BL, [EDI] ; latch byte MOV [EDI], DL ; set pattern MOV BL, 1[EDI] ; latch byte MOV 1[EDI], DH ; set pattern MOV BL, 2[EDI] ; latch byte MOV 2[EDI], CL ; set pattern MOV BL, 3[EDI] ; latch byte MOV 3[EDI], CH ; set pattern POP ECX SUB EDI, width3 DEC h[EBP] JG cploop9 END CP5; PROCEDURE CP6(col: CHAR; dest, pat, X: LONGINT; h: SHORTINT); CODE {SYSTEM.i386} MOV EDI, dest[EBP] MOV ESI, pat[EBP] ; patternaddress ADD ESI, 2 MOV ECX, X[EBP] ; X MOD 8 AND ECX, 7 MOV EDX, 03C4H ; AL = Plane select; AH = Bitplanemask; DX = Sequencer MOV AH, col[EBP] MOV AL, 2 OUT DX, AX LEA EAX, rev ; MOV EAX, reverse[EBP] cploop11: MOV EBX, [ESI] ADD ESI, 4 PUSH ESI XOR ESI, ESI SHLD ESI, EBX, CL SHL EBX, CL PUSH ECX MOV DX, BX SHR EBX, 16 MOV CX, BX AND BX, 0FFH MOV CL, [EAX][EBX] MOV BL, CH MOV CH, [EAX][EBX] MOV BL, DL MOV DL, [EAX][EBX] MOV BL, DH MOV DH, [EAX][EBX] MOV BH, [EAX][ESI] MOV BL, [EDI] ; latch byte MOV [EDI], DL ; set pattern MOV BL, 1[EDI] ; latch byte MOV 1[EDI], DH ; set pattern MOV BL, 2[EDI] ; latch byte MOV 2[EDI], CL ; set pattern MOV BL, 3[EDI] ; latch byte MOV 3[EDI], CH ; set pattern MOV BL, 4[EDI] ; latch byte MOV 4[EDI], BH ; set pattern POP ECX POP ESI SUB EDI, width3 DEC h[EBP] JG cploop11 END CP6; PROCEDURE CP7(col: CHAR; dest, pat, X: LONGINT; h: SHORTINT); CODE {SYSTEM.i386} MOV EDI, dest[EBP] MOV ESI, pat[EBP] ; patternaddress ADD ESI, 2 MOV ECX, X[EBP] ; X MOD 8 AND ECX, 7 MOV EDX, 03C4H ; AL = Plane select; AH = Bitplanemask; DX = Sequencer cploop1: MOV AX, 0F02H OUT DX, AX MOV EDX, 03CEH ; AL = Data/Rotate; AH = Modus; DX = Graphic-Controller MOV AX, 0803H OUT DX, AX XOR EBX, EBX MOV BL, [ESI] INC ESI SHL BL, CL LEA EDX, rev MOV BL, [EDX][EBX] MOV BH, [EDI] ; latch byte NOT BL MOV [EDI], BL ; clear pattern NOT BL MOV EDX, 03CEH ; AL = Data/Rotate; AH = Modus; DX = Graphic-Controller MOV AX, 1003H OUT DX, AX MOV EDX, 03C4H ; AL = Plane select; AH = Bitplanemask; DX = Sequencer MOV AL, 2 MOV AH, col[EBP] OUT DX, AX MOV BH, [EDI] ; latch byte MOV [EDI], BL ; set pattern SUB EDI, width3 DEC h[EBP] JG cploop1 END CP7; PROCEDURE CP8(col: CHAR; dest, pat, X: LONGINT; h: SHORTINT); CODE {SYSTEM.i386} MOV EDI, dest[EBP] MOV ESI, pat[EBP] ; patternaddress ADD ESI, 2 MOV ECX, X[EBP] ; X MOD 8 AND ECX, 7 MOV EDX, 03C4H ; AL = Plane select; AH = Bitplanemask; DX = Sequencer cploop4: MOV AX, 0F02H OUT DX, AX MOV EDX, 03CEH ; AL = Data/Rotate; AH = Modus; DX = Graphic-Controller MOV AX, 0803H OUT DX, AX XOR EBX, EBX MOV BL, [ESI] INC ESI SHL BX, CL LEA EDX, rev MOV AX, BX AND BX, 0FFH MOV AL, [EDX][EBX] MOV BL, AH MOV AH, [EDX][EBX] NOT AX MOV BH, [EDI] ; latch byte MOV [EDI], AL ; clear pattern MOV BH, 1[EDI] ; latch byte MOV 1[EDI], AH ; clear pattern NOT AX MOV BX, AX MOV EDX, 03CEH ; AL = Data/Rotate; AH = Modus; DX = Graphic-Controller MOV AX, 1003H OUT DX, AX MOV EDX, 03C4H ; AL = Plane select; AH = Bitplanemask; DX = Sequencer MOV AL, 2 MOV AH, col[EBP] OUT DX, AX MOV CH, [EDI] ; latch byte MOV [EDI], BL ; set pattern MOV CH, 1[EDI] ; latch byte MOV 1[EDI], BH ; set pattern SUB EDI, width3 DEC h[EBP] JG cploop4 END CP8; PROCEDURE CP9(col: CHAR; dest, pat, X: LONGINT; h: SHORTINT); CODE {SYSTEM.i386} MOV EDI, dest[EBP] MOV ESI, pat[EBP] ; patternaddress ADD ESI, 2 MOV ECX, X[EBP] ; X MOD 8 AND ECX, 7 MOV EDX, 03C4H ; AL = Plane select; AH = Bitplanemask; DX = Sequencer cploop6: MOV AX, 0F02H OUT DX, AX MOV EDX, 03CEH ; AL = Data/Rotate; AH = Modus; DX = Graphic-Controller MOV AX, 0803H OUT DX, AX XOR EBX, EBX MOV BX, [ESI] ADD ESI, 2 SHL BX, CL LEA EDX, rev MOV AX, BX AND BX, 0FFH MOV AL, [EDX][EBX] MOV BL, AH MOV AH, [EDX][EBX] NOT AX MOV BH, [EDI] ; latch byte MOV [EDI], AL ; clear pattern MOV BH, 1[EDI] ; latch byte MOV 1[EDI], AH ; clear pattern NOT AX MOV BX, AX MOV EDX, 03CEH ; AL = Data/Rotate; AH = Modus; DX = Graphic-Controller MOV AX, 1003H OUT DX, AX MOV EDX, 03C4H ; AL = Plane select; AH = Bitplanemask; DX = Sequencer MOV AL, 2 MOV AH, col[EBP] OUT DX, AX MOV CH, [EDI] ; latch byte MOV [EDI], BL ; set pattern MOV CH, 1[EDI] ; latch byte MOV 1[EDI], BH ; set pattern SUB EDI, width3 DEC h[EBP] JG cploop6 END CP9; PROCEDURE CP10(col: CHAR; dest, pat, X: LONGINT; h: SHORTINT); CODE {SYSTEM.i386} MOV EDI, dest[EBP] MOV ESI, pat[EBP] ; patternaddress ADD ESI, 2 MOV ECX, X[EBP] ; X MOD 8 AND ECX, 7 cploop8: MOV EDX, 03C4H ; AL = Plane select; AH = Bitplanemask; DX = Sequencer MOV AX, 0F02H OUT DX, AX MOV EDX, 03CEH ; AL = Data/Rotate; AH = Modus; DX = Graphic-Controller MOV AX, 0803H OUT DX, AX XOR EBX, EBX MOV BX, [ESI] ADD ESI, 2 SHL EBX, CL LEA EDX, rev MOV AX, BX SHR EBX, 16 AND BX, 0FFH MOV CH, [EDX][EBX] MOV BL, AL MOV AL, [EDX][EBX] MOV BL, AH MOV AH, [EDX][EBX] NOT AX NOT CH MOV BH, [EDI] ; latch byte MOV [EDI], AL ; clear pattern MOV BH, 1[EDI] ; latch byte MOV 1[EDI], AH ; clear pattern MOV BH, 2[EDI] ; latch byte MOV 2[EDI], CH ; clear pattern NOT CH NOT AX MOV BX, AX MOV EDX, 03CEH ; AL = Data/Rotate; AH = Modus; DX = Graphic-Controller MOV AX, 1003H OUT DX, AX MOV EDX, 03C4H ; AL = Plane select; AH = Bitplanemask; DX = Sequencer MOV AL, 2 MOV AH, col[EBP] OUT DX, AX MOV DH, [EDI] ; latch byte MOV [EDI], BL ; set pattern MOV DH, 1[EDI] ; latch byte MOV 1[EDI], BH ; set pattern MOV DH, 2[EDI] ; latch byte MOV 2[EDI], CH ; set pattern SUB EDI, width3 DEC h[EBP] JG cploop8 END CP10; PROCEDURE CP11(col: CHAR; dest, pat, X: LONGINT; h: SHORTINT); CODE {SYSTEM.i386} MOV EDI, dest[EBP] MOV ESI, pat[EBP] ; patternaddress ADD ESI, 2 MOV ECX, X[EBP] ; X MOD 8 AND ECX, 7 cploop10: MOV EDX, 03C4H ; AL = Plane select; AH = Bitplanemask; DX = Sequencer MOV AX, 0F02H OUT DX, AX MOV EDX, 03CEH ; AL = Data/Rotate; AH = Modus; DX = Graphic-Controller MOV AX, 0803H OUT DX, AX MOV EBX, [ESI] AND EBX, 0FFFFFFH ADD ESI, 3 SHL EBX, CL PUSH ECX LEA EDX, rev MOV AX, BX SHR EBX, 16 MOV CX, BX AND BX, 0FFH MOV CL, [EDX][EBX] MOV BL, CH MOV CH, [EDX][EBX] MOV BL, AL MOV AL, [EDX][EBX] MOV BL, AH MOV AH, [EDX][EBX] NOT AX NOT CX MOV BH, [EDI] ; latch byte MOV [EDI], AL ; clear pattern MOV BH, 1[EDI] ; latch byte MOV 1[EDI], AH ; clear pattern MOV BH, 2[EDI] ; latch byte MOV 2[EDI], CL ; clear pattern MOV BH, 3[EDI] ; latch byte MOV 3[EDI], CH ; clear pattern NOT CX NOT AX MOV BX, AX MOV EDX, 03CEH ; AL = Data/Rotate; AH = Modus; DX = Graphic-Controller MOV AX, 1003H OUT DX, AX MOV EDX, 03C4H ; AL = Plane select; AH = Bitplanemask; DX = Sequencer MOV AL, 2 MOV AH, col[EBP] OUT DX, AX MOV DH, [EDI] ; latch byte MOV [EDI], BL ; set pattern MOV DH, 1[EDI] ; latch byte MOV 1[EDI], BH ; set pattern MOV DH, 2[EDI] ; latch byte MOV 2[EDI], CL ; set pattern MOV DH, 3[EDI] ; latch byte MOV 3[EDI], CH ; set pattern POP ECX SUB EDI, width3 DEC h[EBP] JG cploop10 END CP11; PROCEDURE CP12(col: CHAR; dest, pat, X: LONGINT; h: SHORTINT); CODE {SYSTEM.i386} MOV EDI, dest[EBP] MOV ESI, pat[EBP] ; patternaddress ADD ESI, 2 MOV ECX, X[EBP] ; X MOD 8 AND ECX, 7 cploop12: MOV EDX, 03C4H ; AL = Plane select; AH = Bitplanemask; DX = Sequencer MOV AX, 0F02H OUT DX, AX MOV EDX, 03CEH ; AL = Data/Rotate; AH = Modus; DX = Graphic-Controller MOV AX, 0803H OUT DX, AX MOV EBX, [ESI] ADD ESI, 4 PUSH ESI XOR ESI, ESI SHLD ESI, EBX, CL SHL EBX, CL PUSH ECX LEA EDX, rev MOV AX, BX SHR EBX, 16 MOV CX, BX AND BX, 0FFH MOV CL, [EDX][EBX] MOV BL, CH MOV CH, [EDX][EBX] MOV BL, AL MOV AL, [EDX][EBX] MOV BL, AH MOV AH, [EDX][EBX] MOV BL, [EDX][ESI] NOT AX NOT CX NOT BL MOV BH, [EDI] ; latch byte MOV [EDI], AL ; clear pattern MOV BH, 1[EDI] ; latch byte MOV 1[EDI], AH ; clear pattern MOV BH, 2[EDI] ; latch byte MOV 2[EDI], CL ; clear pattern MOV BH, 3[EDI] ; latch byte MOV 3[EDI], CH ; clear pattern MOV BH, 4[EDI] ; latch byte MOV 4[EDI], BL ; clear pattern NOT BL NOT CX NOT AX MOV DX, BX MOV BX, AX PUSH EDX MOV EDX, 03CEH ; AL = Data/Rotate; AH = Modus; DX = Graphic-Controller MOV AX, 1003H OUT DX, AX MOV EDX, 03C4H ; AL = Plane select; AH = Bitplanemask; DX = Sequencer MOV AL, 2 MOV AH, col[EBP] OUT DX, AX POP EDX MOV DH, [EDI] ; latch byte MOV [EDI], BL ; set pattern MOV DH, 1[EDI] ; latch byte MOV 1[EDI], BH ; set pattern MOV DH, 2[EDI] ; latch byte MOV 2[EDI], CL ; set pattern MOV DH, 3[EDI] ; latch byte MOV 3[EDI], CH ; set pattern MOV DH, 4[EDI] ; latch byte MOV 4[EDI], DL ; set pattern POP ECX POP ESI SUB EDI, width3 DEC h[EBP] JG cploop12 END CP12; PROCEDURE CopyPattern*(col: Color; pat: Pattern; x, y, mode: LONGINT); VAR dest, i, diff: LONGINT; w, h: SHORTINT; x1, y1, cpX, cpY, cpW, cpH, nofbytes: INTEGER; buf: ARRAY 256 OF INTEGER; lm, rm: CHAR; BEGIN SYSTEM.GET(pat, w); SYSTEM.GET(pat+1, h); cpW := SHORT(w + x); cpH := SHORT(h + y); x1 := SHORT(x); y1 := SHORT(y); IF x1 < clipx THEN x := clipx END; IF y1 < clipy THEN y := clipy END; IF cpW > clipright THEN cpW := clipright END; IF cpH > cliptop THEN cpH := cliptop END; cpW := cpW - SHORT(x); cpH := cpH - SHORT(y); cpX := SHORT(x) - x1; cpY := SHORT(y) - y1; IF (cpW <= 0) OR (cpH <= 0) OR (cpX < 0) OR (cpY < 0) THEN RETURN END; IF (cpW # w) OR (cpH # h) THEN CPTranslate(pat, cpX, cpY, cpW, cpH, buf); pat := SYSTEM.ADR(buf[0]) END; SYSTEM.GET(pat, w); SYSTEM.GET(pat+1, h); dest := ((Height-SHORT(y)-1) * width3 + SHORT(x) DIV 8) MOD 10000H; INC(dest, 0A0000H); (* display offset *) (*help1 := (SHORT(x) + w-1) MOD 8;*) diff := (SHORT(x) + w-1) DIV 8 - (SHORT(x) DIV 8); SYSTEM.PORTOUT(03CEH, SYSTEM.VAL(INTEGER, 0FF08H)); (* AX = Default bitmask; DX = Graphic-Controller *) SYSTEM.PORTOUT(03CEH, SYSTEM.VAL(INTEGER, 5)); (* AL = Graphics mode; AH = Read-Mode = 0/Write-Mode = 0 (bits 0,1) *) IF mode = invert THEN SYSTEM.PORTOUT(03CEH, SYSTEM.VAL(INTEGER, 1803H)); (* AX = invert mode; DX = Graphic-Controller *) IF w <= 8 THEN IF diff = 0 THEN CP1(CHR(col), dest, pat, SHORT(x), h) ELSE CP2(CHR(col), dest, pat, SHORT(x), h) END ELSIF w <= 16 THEN IF diff = 1 THEN CP3(CHR(col), dest, pat, SHORT(x), h) ELSE CP4(CHR(col), dest, pat, SHORT(x), h) END ELSIF w <= 24 THEN CP5(CHR(col), dest, pat, SHORT(x), h) ELSE CP6(CHR(col), dest, pat, SHORT(x), h) END ELSE (* paint & replace *) IF w <= 8 THEN IF diff = 0 THEN CP7(CHR(col), dest, pat, SHORT(x), h) ELSE CP8(CHR(col), dest, pat, SHORT(x), h) END ELSIF w <= 16 THEN IF diff = 1 THEN CP9(CHR(col), dest, pat, SHORT(x), h) ELSE CP10(CHR(col), dest, pat, SHORT(x), h) END ELSIF w <= 24 THEN CP11(CHR(col), dest, pat, SHORT(x), h) ELSE CP12(CHR(col), dest, pat, SHORT(x), h) END END END CopyPattern; PROCEDURE ReplConst1(col: CHAR; H, start: LONGINT; rm, lm: CHAR); CODE {SYSTEM.i386} MOV AH, lm[EBP] AND AH, rm[EBP] MOV AL, 8 MOV EDX, 03CEH OUT DX, AX ; Bitmask MOV AH, col[EBP] MOV ECX, H[EBP] MOV ESI, start[EBP] rcloop1: MOV AL, [ESI] ; latch bytes MOV [ESI], AH SUB ESI, width3 ;w3[EBP] LOOP rcloop1 END ReplConst1; PROCEDURE ReplConst2(col: CHAR; H: INTEGER; start, end: LONGINT; rm, lm: CHAR); VAR temp: LONGINT; CODE {SYSTEM.i386} MOV ESI, start[EBP] MOV BH, col[EBP] MOV EDI, end[EBP] SUB EDI, ESI ; difference beween start and end MOV temp[EBP], EDI ; save difference beween start and end MOV EDX, 03CEH ; set Graphic controller rcloop2: MOV AH, lm[EBP] ; prepare left mask MOV AL, 8 OUT DX, AX ; set left Bitmask MOV AL, [ESI] ; latch byte MOV [ESI], BH ; set byte MOV AX, 0FF08H ; prepare full mask OUT DX, AX ; set full mask MOV ECX,ESI INC ECX rclabel2: CMP EDI, 1 JLE rclabel1 MOV AL, [ECX] ; latch bytes MOV [ECX], BH ; set bytes DEC EDI INC ECX JMP rclabel2 rclabel1: MOV AH, rm[EBP] ; prepare right mask MOV AL, 8 OUT DX, AX ; set right Bitmask MOV AL, [ECX] ; latch byte MOV [ECX], BH ; set byte SUB ESI, width3; w3[EBP] ; next line DEC H[EBP] MOV EDI, temp[EBP] JG rcloop2 END ReplConst2; PROCEDURE ReplConst*(col: Color; x, y, w, h, mode: LONGINT); VAR right, top, X, Y, W, H: INTEGER; addr, start, end: LONGINT; rm, lm: CHAR; BEGIN X := SHORT(x); Y := SHORT(y); W := SHORT(w); H := SHORT(h); top := Y + H; right := X + W; IF X < clipx THEN X := clipx END; IF Y < clipy THEN Y := clipy END; IF clipright < right THEN right := clipright END; IF cliptop < top THEN top := cliptop END; W := right - X; H := top - Y; IF (W <= 0) OR (H <= 0) OR (X < 0) OR (Y < 0) THEN RETURN END; IF mode = invert THEN SYSTEM.PORTOUT(03CEH, SYSTEM.VAL(INTEGER, 1803H)) (* AL = Data/Rotate; AH = Modus; DX = Graphic-Controller *) ELSE (* was replace only *) SYSTEM.PORTOUT(03CEH, SYSTEM.VAL(INTEGER, 03H)) (*ELSE (* mode = paint *) SYSTEM.PORTOUT(03CEH, SYSTEM.VAL(INTEGER, 1003H))*) END; SYSTEM.PORTOUT(03CEH, 205H); (* AL = Gaphics mode; AH = Read-Mode = 0/Write-Mode = 2 (bits 0,1) *) SYSTEM.PORTOUT(03C4H, 0F02H); (* AL = Plane select; AH = Bitplanemask; DX = Sequencer *) addr := ((Height - Y - 1) * width3) MOD 10000H; INC(addr, 0A0000H); start := addr + X DIV 8; end := addr + (X + W) DIV 8; lm := imask[X MOD 8]; rm := mask[(X + W) MOD 8]; IF start = end THEN ReplConst1(CHR(col), H, start, rm, lm) ELSE ReplConst2(CHR(col), H, start, end, rm, lm) END; END ReplConst; PROCEDURE FillPattern1(col: CHAR; pat: Pattern; pX, pY, X, Y, W, H, mode: LONGINT); VAR leftmask, rightmask, flag, color, help3: CHAR; topleft, help, help1, help2: LONGINT; CODE {SYSTEM.i386} MOV EAX, mode[EBP] ; get mode and set local AH CMP AX, 0 JNE Inv4 MOV AH, 0 JMP setGC4 Inv4: CMP AX, 2 JNE Paint4 MOV AH, 18H JMP setGC4 Paint4: MOV AH, 10H ; with wrong mode => ; ; automatically paint mode ; Set graphic-controller-registers setGC4: MOV DX, 03CEH ; Graphic-Controller MOV AL, 3 ; AL = Data/Rotate / AH = Modus OUT DX, AX MOV AX, 0005H ; AL = Read-Mode = 0 ; ; Write-Mode = 0 (bits 0, 1) OUT DX, AX ; Set ; Get params x, y getxy4: MOVSX EBX, height DEC EBX ; MOV EBX, hgt[EBP] SUB EBX, Y[EBP] ; (0, 0) in bottom left corner MOV EAX, Y[EBP] MOV Y[EBP], EBX ; y:= height -1 - y XOR EDX, EDX SUB EAX, pY[EBP] MOV ECX, pat[EBP] MOVSX ECX, BYTE 1[ECX] IDIV EAX,ECX MOV help2[EBP], EDX MOV EBX, X[EBP] ; EBX := x MOV ECX, EBX MOV EDX, EBX MOV ESI, EBX SHR EBX, 3 ; EBX := X DIV 8 ADD EDX, W[EBP] ; EDX := x + w DEC EDX SHR EDX, 3 ; EDX := (x + w-1) DIV 8 AND ECX, 7 ; ECX := x mod 8 ADD ESI, W[EBP] DEC ESI AND ESI, 7 ; ESI := (x+w-1) MOD 8 LEA EDI, imask ; MOV EDI, imsk[EBP] MOV AL, [EDI][ECX] ; MOV AL, imask[ECX] MOV leftmask[EBP], AL INC ESI ; *$* LEA EDI, mask ; MOV EDI, msk[EBP] MOV AL, [EDI][ESI] ; MOV AL, mask[ESI] MOV rightmask[EBP], AL MOV EDI, width3 ; w3[EBP] IMUL EDI, Y[EBP] AND EDI, 0FFFFH ADD EDI,0A0000H ADD EDI, EBX ; EDI := START-Adr SUB EDX, EBX ; Diff in bytes MOV help[EBP], EDX MOV help1[EBP], EDI MOV EBX, H[EBP] IMUL EBX, width3 ; w3[EBP] SUB EDI, EBX MOV topleft[EBP], EDI MOV EDI, help1[EBP] MOV ESI, pat[EBP] ; get addr of pat MOV EAX, X[EBP] ; EAX := x XOR EDX, EDX MOVSX EBX, BYTE [ESI] IDIV EAX,EBX MOV help3[EBP], DL ;help3 := x MOD p.w MOV DX, 03CEH MOV AH, leftmask[EBP] MOV AL, 8 OUT DX, AX MOV DX, 03C4H MOV AH, col[EBP] MOV AL, 2 OUT DX, AX MOV EBX, help2[EBP] MOV flag[EBP], 0 MOV EDX, help[EBP] CMP EDX, 0 ; in one byte ? JE onebyte CMP BYTE [ESI], 16 ; width = 16 ? JNE RP32 RP16: CMP mode[EBP], 0 ; replacemode ? JE R16 CMP mode[EBP], 1 ; paintmode ? JE P16left IP16left: MOV AX, 2[ESI][EBX*2] ; invert/paint p.w = 16 CMP help3[EBP], 8 JGE label ROR AX, 8 label: MOV CL, BYTE pX[EBP] ROL AX, CL XOR EDX, EDX PUSH EBX LEA EBX, rev ; MOV EBX, reverse[EBP] MOV DL, AL MOV AL, [EBX][EDX] ; MOV AL, rev[EDX] MOV DL, AH MOV AH, [EBX][EDX] ; MOV AH, rev[EDX] POP EBX MOV CH, [EDI] ; latch MOV [EDI], AH ROL AX, 8 MOV EDX, 1 CMP EDX, help[EBP] JE IP16right MOV help2[EBP], EAX MOV DX, 03CEH MOV AX, 0FF08H OUT DX, AX MOV EAX, help2[EBP] MOV EDX, 1 IP16mid: MOV CH, [EDI][EDX] ; latch MOV [EDI][EDX], AH ROL AX, 8 INC EDX CMP EDX, help[EBP] JL IP16mid IP16right: MOV help1[EBP], EDX MOV help2[EBP], EAX MOV DX, 03CEH MOV AH, rightmask[EBP] MOV AL, 8 OUT DX, AX MOV EAX, help2[EBP] MOV EDX, help1[EBP] MOV CH, [EDI][EDX] MOV [EDI][EDX], AH SUB EDI, width3 ; w3[EBP] CMP EDI, topleft[EBP] JLE resetgrafRP MOV DX, 03CEH MOV AH, leftmask[EBP] ; prepare rightmask again MOV AL, 8 OUT DX, AX XOR EDX, EDX INC EBX CMP BL, 1[ESI] ; height of pattern reached? JNE IP16left XOR EBX, EBX ; yes, then reset counter JMP IP16left P16left: MOV AX, 2[ESI][EBX*2] ; invert/paint p.w = 16 CMP help3[EBP], 8 JGE plabel ROR AX, 8 plabel: MOV CL, BYTE pX[EBP] ROL AX, CL XOR EDX, EDX MOV DL, AL PUSH EBX LEA EBX, rev ; MOV EBX, reverse[EBP] MOV AL, [EBX][EDX] ; MOV AL, rev[EDX] MOV DL, AH MOV AH, [EBX][EDX] ; MOV AH, rev[EDX] POP EBX MOV CH, [EDI] ; latch PUSH EDX PUSH EAX MOV DX, 03C4H MOV AX, 0F02H ; set all planes OUT DX, AX ; set color/sequencer planemap MOV AH, 8 ; set mode to AND MOV AL, 3 MOV DX, 03CEH OUT DX, AX POP EAX NOT AH ; negate AH MOV [EDI], AH ; clear pattern NOT AH ; negate AH PUSH EAX MOV AH, 10H ; set mode to OR MOV AL, 3 MOV DX, 03CEH OUT DX, AX MOV AH, col[EBP] ; get color and set bitplanes MOV AL, 2 MOV DX, 03C4H OUT DX, AX POP EAX POP EDX MOV [EDI], AH ROL AX, 8 MOV EDX, 1 CMP EDX, help[EBP] JE P16right MOV help2[EBP], EAX MOV DX, 03CEH MOV AX, 0FF08H OUT DX, AX MOV EAX, help2[EBP] MOV EDX, 1 P16mid: MOV CH, [EDI][EDX] ; latch PUSH EDX PUSH EAX MOV DX, 03C4H MOV AX, 0F02H ; set all planes OUT DX, AX ; set color/sequencer planemap MOV AH, 8 ; set mode to AND MOV AL, 3 MOV DX, 03CEH OUT DX, AX POP EAX POP EDX NOT AH ; negate AH MOV [EDI][EDX], AH ; clear pattern NOT AH ; negate AH PUSH EDX PUSH EAX MOV AH, 10H ; set mode to OR MOV AL, 3 MOV DX, 03CEH OUT DX, AX MOV AH, col[EBP] ; get color and set bitplanes MOV AL, 2 MOV DX, 03C4H OUT DX, AX POP EAX POP EDX MOV [EDI][EDX], AH ROL AX, 8 INC EDX CMP EDX, help[EBP] JL P16mid P16right: MOV help1[EBP], EDX MOV help2[EBP], EAX MOV DX, 03CEH MOV AH, rightmask[EBP] MOV AL, 8 OUT DX, AX MOV EAX, help2[EBP] MOV EDX, help1[EBP] MOV CH, [EDI][EDX] PUSH EDX PUSH EAX MOV DX, 03C4H MOV AX, 0F02H ; set all planes OUT DX, AX ; set color/sequencer planemap MOV AH, 8 ; set mode to AND MOV AL, 3 MOV DX, 03CEH OUT DX, AX POP EAX POP EDX NOT AH ; negate AH MOV [EDI][EDX], AH ; clear pattern NOT AH ; negate AH PUSH EDX PUSH EAX MOV AH, 10H ; set mode to OR MOV AL, 3 MOV DX, 03CEH OUT DX, AX MOV AH, col[EBP] ; get color and set bitplanes MOV AL, 2 MOV DX, 03C4H OUT DX, AX POP EAX POP EDX MOV [EDI][EDX], AH SUB EDI, width3 ; w3[EBP] CMP EDI, topleft[EBP] JLE resetgrafRP MOV DX, 03CEH MOV AH, leftmask[EBP] ; prepare rightmask again MOV AL, 8 OUT DX, AX XOR EDX, EDX INC EBX CMP BL, 1[ESI] ; height of pattern reached? JNE P16left XOR EBX, EBX ; yes, then reset counter JMP P16left R16: MOV AH, col[EBP] MOV color[EBP], AH R16left: MOV AX, 2[ESI][EBX*2] ; replace p.w = 16 CMP help3[EBP], 8 JGE label1 ROR AX, 8 label1: MOV CL, BYTE pX[EBP] ROL AX, CL XOR DX, DX MOV DL, AL PUSH EBX LEA EBX, rev ; MOV EBX, reverse[EBP] MOV AL, [EBX][EDX] ; MOV AL, rev[EDX] MOV DL, AH ; MOV AH, rev[EDX] MOV AH, [EBX][EDX] POP EBX MOV help2[EBP], EAX MOV DX, 03C4H MOV AX, 0F02H OUT DX, AX MOV CH, [EDI] ; latch MOV BYTE [EDI], 0 MOV AH, color[EBP] MOV AL, 2 OUT DX, AX ; set color MOV EAX, help2[EBP] MOV [EDI], AH ROL AX, 8 MOV EDX, 1 CMP EDX, help[EBP] JE R16right MOV help2[EBP], EAX MOV DX, 03CEH MOV AX, 0FF08H OUT DX, AX MOV EDX, 1 MOV EAX, help2[EBP] R16mid: MOV help1[EBP], EDX MOV help2[EBP], EAX MOV DX, 03C4H MOV AX, 0F02H OUT DX, AX XCHG help1[EBP], EDX MOV BYTE [EDI][EDX], 0 XCHG help1[EBP], EDX MOV AH, color[EBP] MOV AL, 2 OUT DX, AX ; set color XCHG help1[EBP], EDX XCHG help2[EBP], EAX MOV [EDI][EDX], AH ROL AX, 8 INC EDX CMP EDX, help[EBP] JL R16mid R16right: MOV help1[EBP], EDX MOV help2[EBP], EAX MOV DX, 03CEH MOV AH, rightmask[EBP] MOV AL, 8 OUT DX, AX MOV DX, 03C4H MOV AX, 0F02H OUT DX, AX XCHG help1[EBP], EDX MOV CH, [EDI][EDX] ; latch MOV BYTE [EDI][EDX], 0 XCHG help1[EBP], EDX MOV AH, color[EBP] MOV AL, 2 OUT DX, AX ; set color MOV EAX, help2[EBP] MOV EDX, help1[EBP] MOV [EDI][EDX], AH SUB EDI, width3 ; w3[EBP] CMP EDI, topleft[EBP] JLE resetgrafRP MOV DX, 03CEH MOV AH, leftmask[EBP] ; prepare rightmask again MOV AL, 8 OUT DX, AX XOR EDX, EDX INC EBX CMP BL, 1[ESI] ; height of pattern reached? JNE R16left XOR EBX, EBX ; yes, then reset counter JMP R16left onebyte: CMP BYTE [ESI], 16 ; width = 16 ? SETE flag[EBP] ; flag = 1 if p.w=16 CMP mode[EBP], 0 ; replace ? JE onebyteR CMP mode[EBP], 1 ; paint ? JE onebyteP IPonebyte: CMP flag[EBP], 1 JNE p32 MOV AX, 2[ESI][EBX*2] ; p.w = 16 CMP help3[EBP], 8 JGE label2 ROR AX, 8 label2: MOV CL, BYTE pX[EBP] ROL AX, CL JMP down p32: MOV EAX, 2[ESI][EBX*4] ; p.w = 32 CMP help3[EBP], 24 JL labela ROR EAX, 24 JMP labelc labela: CMP help3[EBP], 16 JL labelb ROR EAX, 16 JMP labelc labelb: CMP help3[EBP], 8 JL labelc ROR EAX, 8 labelc: MOV CL, BYTE pX[EBP] ROL EAX, CL down: XOR DX, DX MOV DL, AL PUSH EBX LEA EBX, rev ; MOV EBX, reverse[EBP] MOV DL, [EBX][EDX] ; MOV DL, rev[EDX] POP EBX AND AL, rightmask[EBP] MOV CH, [EDI] ; latch MOV [EDI], AL SUB EDI, width3 ; w3[EBP] CMP EDI, topleft[EBP] JLE resetgrafRP INC EBX CMP BL, 1[ESI] JNE IPonebyte XOR EBX, EBX JMP IPonebyte onebyteP: CMP flag[EBP], 1 JNE pp32 MOV AX, 2[ESI][EBX*2] ; p.w = 16 CMP help3[EBP], 8 JGE plabel2 ROR AX, 8 plabel2: MOV CL, BYTE pX[EBP] ROL AX, CL JMP pdown pp32: MOV EAX, 2[ESI][EBX*4] ; p.w = 32 CMP help3[EBP], 24 JL plabela ROR EAX, 24 JMP plabelc plabela: CMP help3[EBP], 16 JL plabelb ROR EAX, 16 JMP plabelc plabelb: CMP help3[EBP], 8 JL plabelc ROR EAX, 8 plabelc: MOV CL, BYTE pX[EBP] ROL EAX, CL pdown: XOR DX, DX MOV DL, AL PUSH EBX LEA EBX, rev ; MOV EBX, reverse[EBP] MOV DL, [EBX][EDX] ; MOV DL, rev[EDX] POP EBX AND AL, rightmask[EBP] MOV CH, [EDI] ; latch PUSH EDX PUSH EAX MOV DX, 03C4H MOV AX, 0F02H ; set all planes OUT DX, AX ; set color/sequencer planemap MOV AH, 8 ; set mode to AND MOV AL, 3 MOV DX, 03CEH OUT DX, AX POP EAX NOT AL ; negate AL MOV [EDI], AL ; clear pattern NOT AL ; negate AL PUSH EAX MOV AH, 10H ; set mode to OR MOV AL, 3 MOV DX, 03CEH OUT DX, AX MOV AH, col[EBP] ; get color and set bitplanes MOV AL, 2 MOV DX, 03C4H OUT DX, AX POP EAX POP EDX MOV [EDI], AL SUB EDI, width3 ; w3[EBP] CMP EDI, topleft[EBP] JLE resetgrafRP INC EBX CMP BL, 1[ESI] JNE onebyteP XOR EBX, EBX JMP onebyteP onebyteR: MOV AH, col[EBP] ; replace in 1 byte MOV color[EBP], AH Ronebyte: CMP flag[EBP], 1 JNE p32r MOV AX, 2[ESI][EBX*2] ; p.w = 16 CMP help3[EBP], 8 JGE label3 ROR AX, 8 label3: MOV CL, BYTE pX[EBP] ROL AX, CL JMP downr p32r: MOV EAX, 2[ESI][EBX*4] ; p.w = 32 CMP help3[EBP], 24 JL labelc1 ROR EAX, 24 JMP labelc1 labela1: CMP help3[EBP], 16 JL labelb1 ROR EAX, 16 JMP labelc1 labelb1: CMP help3[EBP], 8 JL labelc1 ROR EAX, 8 labelc1: MOV CL, BYTE pX[EBP] ROL EAX, CL downr: XOR EDX, EDX MOV DL, AL PUSH EBX LEA EBX, rev ; MOV EBX, reverse[EBP] MOV AL, [EBX][EDX] ; MOV AL, rev[EDX] POP EBX MOV help1[EBP], EAX MOV AH, leftmask[EBP] AND AH, rightmask[EBP] MOV DX, 03CEH MOV AL, 8 OUT DX, AX MOV DX, 03C4H MOV AX, 0F02H OUT DX, AX MOV CH, [EDI] ; latch MOV BYTE [EDI], 0 MOV AH, color[EBP] MOV AL, 2 OUT DX, AX ; set color MOV EAX, help1[EBP] MOV [EDI], AL SUB EDI, width3 ; w3[EBP] CMP EDI, topleft[EBP] JLE resetgrafRP INC EBX CMP BL, 1[ESI] JNE Ronebyte XOR EBX, EBX JMP Ronebyte RP32: CMP BYTE [ESI], 32 ; p.w = 32 ? JNE endRP ; only p.w = 16 OR 32 allowed CMP mode[EBP], 0 JE R32 CMP mode[EBP], 1 JE P32left IP32left: MOV EAX, 2[ESI][EBX*4] ;invert/paint p.w = 32 CMP help3[EBP], 24 JL labela2 ROR EAX, 24 JMP labelc2 labela2: CMP help3[EBP], 16 JL labelb2 ROR EAX, 16 JMP labelc2 labelb2: CMP help3[EBP], 8 JL labelc2 ROR EAX, 8 labelc2: MOV CL, BYTE pX[EBP] ROL EAX, CL XOR EDX, EDX PUSH ECX MOV CX, 4 iloop: MOV DL, AL PUSH EBX LEA EBX, rev ; MOV EBX, reverse[EBP] MOV AL, [EBX][EDX] ; MOV AL, rev[EDX] POP EBX ROR EAX, 8 LOOP iloop POP ECX MOV CH, [EDI] ; latch MOV [EDI], AL ROR EAX, 8 MOV EDX, 1 CMP EDX, help[EBP] JE IP32right MOV help2[EBP], EAX MOV DX, 03CEH MOV AX, 0FF08H OUT DX, AX MOV EAX, help2[EBP] MOV EDX, 1 IP32mid: MOV CH, [EDI][EDX] ; latch MOV [EDI][EDX], AL ROR EAX, 8 INC EDX CMP EDX, help[EBP] JL IP32mid IP32right: MOV help2[EBP], EAX MOV help1[EBP], EDX MOV DX, 03CEH MOV AH, rightmask[EBP] MOV AL, 8 OUT DX, AX MOV EAX, help2[EBP] MOV EDX, help1[EBP] MOV CH, [EDI][EDX] MOV [EDI][EDX], AL SUB EDI, width3 ; w3[EBP] CMP EDI, topleft[EBP] JLE resetgrafRP MOV DX, 03CEH MOV AH, leftmask[EBP] ; prepare leftmask again MOV AL, 8 OUT DX, AX XOR EDX, EDX INC EBX CMP BL, 1[ESI] ; height of pattern reached? JNE IP32left XOR EBX, EBX ; yes, then reset counter JMP IP32left P32left: MOV EAX, 2[ESI][EBX*4] ;invert/paint p.w = 32 CMP help3[EBP], 24 JL plabela2 ROR EAX, 24 JMP plabelc2 plabela2: CMP help3[EBP], 16 JL plabelb2 ROR EAX, 16 JMP plabelc2 plabelb2: CMP help3[EBP], 8 JL plabelc2 ROR EAX, 8 plabelc2: MOV CL, BYTE pX[EBP] ROL EAX, CL XOR EDX, EDX PUSH ECX MOV CX, 4 piloop: MOV DL, AL PUSH EBX LEA EBX, rev ; MOV EBX, reverse[EBP] MOV AL, [EBX][EDX] ; MOV AL, rev[EDX] POP EBX ROR EAX, 8 LOOP piloop POP ECX MOV CH, [EDI] ; latch PUSH EDX PUSH EAX MOV DX, 03C4H MOV AX, 0F02H ; set all planes OUT DX, AX ; set color/sequencer planemap MOV AH, 8 ; set mode to AND MOV AL, 3 MOV DX, 03CEH OUT DX, AX POP EAX NOT AL ; negate AL MOV [EDI], AL ; clear pattern NOT AL ; negate AL PUSH EAX MOV AH, 10H ; set mode to OR MOV AL, 3 MOV DX, 03CEH OUT DX, AX MOV AH, col[EBP] ; get color and set bitplanes MOV AL, 2 MOV DX, 03C4H OUT DX, AX POP EAX POP EDX MOV [EDI], AL ROR EAX, 8 MOV EDX, 1 CMP EDX, help[EBP] JE P32right MOV help2[EBP], EAX MOV DX, 03CEH MOV AX, 0FF08H OUT DX, AX MOV EAX, help2[EBP] MOV EDX, 1 P32mid: MOV CH, [EDI][EDX] ; latch PUSH EDX PUSH EAX MOV DX, 03C4H MOV AX, 0F02H ; set all planes OUT DX, AX ; set color/sequencer planemap MOV AH, 8 ; set mode to AND MOV AL, 3 MOV DX, 03CEH OUT DX, AX POP EAX POP EDX NOT AL ; negate AL MOV [EDI][EDX], AL ; clear pattern NOT AL ; negate AL PUSH EDX PUSH EAX MOV AH, 10H ; set mode to OR MOV AL, 3 MOV DX, 03CEH OUT DX, AX MOV AH, col[EBP] ; get color and set bitplanes MOV AL, 2 MOV DX, 03C4H OUT DX, AX POP EAX POP EDX MOV [EDI][EDX], AL ROR EAX, 8 INC EDX CMP EDX, help[EBP] JL P32mid P32right: MOV help2[EBP], EAX MOV help1[EBP], EDX MOV DX, 03CEH MOV AH, rightmask[EBP] MOV AL, 8 OUT DX, AX MOV EAX, help2[EBP] MOV EDX, help1[EBP] MOV CH, [EDI][EDX] PUSH EDX PUSH EAX MOV DX, 03C4H MOV AX, 0F02H ; set all planes OUT DX, AX ; set color/sequencer planemap MOV AH, 8 ; set mode to AND MOV AL, 3 MOV DX, 03CEH OUT DX, AX POP EAX POP EDX NOT AL ; negate AL MOV [EDI][EDX], AL ; clear pattern NOT AL ; negate AL PUSH EDX PUSH EAX MOV AH, 10H ; set mode to OR MOV AL, 3 MOV DX, 03CEH OUT DX, AX MOV AH, col[EBP] ; get color and set bitplanes MOV AL, 2 MOV DX, 03C4H OUT DX, AX POP EAX POP EDX MOV [EDI][EDX], AL SUB EDI, width3 ; w3[EBP] CMP EDI, topleft[EBP] JLE resetgrafRP MOV DX, 03CEH MOV AH, leftmask[EBP] ; prepare leftmask again MOV AL, 8 OUT DX, AX XOR EDX, EDX INC EBX CMP BL, 1[ESI] ; height of pattern reached? JNE IP32left XOR EBX, EBX ; yes, then reset counter JMP P32left R32: MOV AH, col[EBP] MOV color[EBP], AH R32left: MOV EAX, 2[ESI][EBX*4] ; replace p.w = 32 CMP help3[EBP], 24 JL labela3 ROR EAX, 24 JMP labelc3 labela3: CMP help3[EBP], 16 JL labelb3 ROR EAX, 16 JMP labelc3 labelb3: CMP help3[EBP], 8 JL labelc3 ROR EAX, 8 labelc3: MOV CL, BYTE pX[EBP] ROL EAX, CL XOR EDX, EDX PUSH ECX MOV CX, 4 i2loop: MOV DL, AL PUSH EBX LEA EBX, rev ; MOV EBX, reverse[EBP] MOV AL, [EBX][EDX] ; MOV AL, rev[EDX] POP EBX ROR EAX, 8 LOOP i2loop POP ECX MOV help2[EBP], EAX MOV DX, 03C4H MOV AX, 0F02H OUT DX, AX MOV CH, [EDI] ; latch MOV BYTE [EDI], 0 MOV AH, color[EBP] MOV AL, 2 OUT DX, AX ; set color MOV EAX, help2[EBP] MOV [EDI], AL ROR EAX, 8 MOV EDX, 1 CMP EDX, help[EBP] JE R32right MOV help2[EBP], EAX MOV DX, 03CEH MOV AX, 0FF08H OUT DX, AX MOV EDX, 1 MOV EAX, help2[EBP] R32mid: MOV help1[EBP], EDX MOV help2[EBP], EAX MOV DX, 03C4H MOV AX, 0F02H OUT DX, AX XCHG help1[EBP], EDX MOV BYTE [EDI][EDX], 0 XCHG help1[EBP], EDX MOV AH, color[EBP] MOV AL, 2 OUT DX, AX ; set color XCHG help1[EBP], EDX XCHG help2[EBP], EAX MOV [EDI][EDX], AL ROR EAX, 8 INC EDX CMP EDX, help[EBP] JL R32mid R32right: MOV help2[EBP], EAX MOV help1[EBP], EDX MOV DX, 03CEH MOV AH, rightmask[EBP] MOV AL, 8 OUT DX, AX MOV DX, 03C4H MOV AX, 0F02H OUT DX, AX XCHG help1[EBP], EDX MOV CH, [EDI][EDX] ; latch MOV BYTE [EDI][EDX], 0 XCHG help1[EBP], EDX MOV AH, color[EBP] MOV AL, 2 OUT DX, AX ; set color MOV EAX, help2[EBP] MOV EDX, help1[EBP] MOV [EDI][EDX], AL SUB EDI, width3 ; w3[EBP] CMP EDI, topleft[EBP] JLE resetgrafRP MOV DX, 03CEH MOV AH, leftmask[EBP] ; prepare leftmask again MOV AL, 8 OUT DX, AX XOR EDX, EDX INC EBX CMP BL, 1[ESI] ; height of pattern reached? JNE R32left XOR EBX, EBX ; yes, then reset counter JMP R32left JMP endRP resetgrafRP: MOV DX, 03CEH MOV AX, 0FF08H ; default bit mask OUT DX, AX MOV AX, 0005 ; default mode-reg OUT DX, AX MOV AX, 0003 ; default function OUT DX, AX MOV DX, 03C4H MOV AX, 0F02H ; default map mask OUT DX, AX endRP: END FillPattern1; PROCEDURE FillPattern*(col: Color; pat: Pattern; px, py, x, y, w, h, mode: LONGINT); VAR pw: SHORTINT; right, top: INTEGER; BEGIN SYSTEM.GET(pat, pw); IF (pw # 16) & (pw # 32) THEN RETURN END; top := SHORT(y + h); right := SHORT(x + w); IF x < clipx THEN x := clipx END; IF y < clipy THEN y := clipy END; IF clipright < right THEN right := clipright END; IF cliptop < top THEN top := cliptop END; IF (w <= 0) OR (h <= 0) OR (x < 0) OR (y < 0) THEN RETURN END; FillPattern1(CHR(col), pat, px, py, x, y, w, h, mode) END FillPattern; PROCEDURE ReplPattern*(col: Color; pat: Pattern; x, y, w, h, mode: LONGINT); BEGIN FillPattern(col, pat, 0, 0, x, y, w, h, mode) END ReplPattern; PROCEDURE NewPattern*(w, h: LONGINT; VAR image: ARRAY OF SET): Pattern; VAR len, src, dest, i: LONGINT; p: PatternPtr; pl: List; BEGIN len := (w+7) DIV 8; SYSTEM.NEW(p, 4+len*h); p.w := CHR(w); p.h := CHR(h); src := SYSTEM.ADR(image[0]); dest := SYSTEM.ADR(p.pixmap[0]); i := 0; WHILE i < h DO SYSTEM.MOVE(src, dest, len); INC(src, 4); INC(dest, len); INC(i) END; NEW(pl); pl.pat := p; pl.next := pattern; pattern := pl; (* put in list to avoid GC *) RETURN SYSTEM.ADR(p.w) END NewPattern; PROCEDURE CreatePatterns; VAR image: ARRAY 16 OF SET; BEGIN image[0] := {13}; image[1] := {12..14}; image[2] := {11..13}; image[3] := {10..12}; image[4] := {9..11}; image[5] := {8..10}; image[6] := {7..9}; image[7] := {0, 6..8}; image[8] := {0, 1, 5..7}; image[9] := {0..2, 4..6}; image[10] := {0..5}; image[11] := {0..4}; image[12] := {0..5}; image[13] := {0..6}; image[14] := {0..7}; arrow := NewPattern(15, 15, image); image[0] := {0, 10}; image[1] := {1, 9}; image[2] := {2, 8}; image[3] := {3, 7}; image[4] := {4, 6}; image[5] := {}; image[6] := {4, 6}; image[7] := {3, 7}; image[8] := {2, 8}; image[9] := {1, 9}; image[10] := {0, 10}; cross := NewPattern(11, 11, image); image[0] := {6}; image[1] := {5..7}; image[2] := {4..8}; image[3] := {3..9}; image[4] := {2..10}; image[5] := {5..7}; image[6] := {5..7}; image[7] := {5..7}; image[8] := {5..7}; image[9] := {5..7}; image[10] := {5..7}; image[11] := {5..7}; image[12] := {5..7}; image[13] := {5..7}; image[14] := {}; downArrow := NewPattern(15, 15, image); image[0] := {0, 4, 8, 12}; image[1] := {}; image[2] := {2, 6, 10, 14}; image[3] := {}; image[4] := {0, 4, 8, 12}; image[5] := {}; image[6] := {2, 6, 10, 14}; image[7] := {}; image[8] := {0, 4, 8, 12}; image[9] := {}; image[10] := {2, 6, 10, 14}; image[11] := {}; image[12] := {0, 4, 8, 12}; image[13] := {}; image[14] := {2, 6, 10, 14}; image[15] := {}; grey0 := NewPattern(16, 16, image); image[0] := {0, 2, 4, 6, 8, 10, 12, 14}; image[1] := {1, 3, 5, 7, 9, 11, 13, 15}; image[2] := {0, 2, 4, 6, 8, 10, 12, 14}; image[3] := {1, 3, 5, 7, 9, 11, 13, 15}; image[4] := {0, 2, 4, 6, 8, 10, 12, 14}; image[5] := {1, 3, 5, 7, 9, 11, 13, 15}; image[6] := {0, 2, 4, 6, 8, 10, 12, 14}; image[7] := {1, 3, 5, 7, 9, 11, 13, 15}; image[8] := {0, 2, 4, 6, 8, 10, 12, 14}; image[9] := {1, 3, 5, 7, 9, 11, 13, 15}; image[10] := {0, 2, 4, 6, 8, 10, 12, 14}; image[11] := {1, 3, 5, 7, 9, 11, 13, 15}; image[12] := {0, 2, 4, 6, 8, 10, 12, 14}; image[13] := {1, 3, 5, 7, 9, 11, 13, 15}; image[14] := {0, 2, 4, 6, 8, 10, 12, 14}; image[15] := {1, 3, 5, 7, 9, 11, 13, 15}; grey1 := NewPattern(16, 16, image); image[0] := {0, 1, 4, 5, 8, 9, 12, 13}; image[1] := {0, 1, 4, 5, 8, 9, 12, 13}; image[2] := {2, 3, 6, 7, 10, 11, 14, 15}; image[3] := {2, 3, 6, 7, 10, 11, 14, 15}; image[4] := {0, 1, 4, 5, 8, 9, 12, 13}; image[5] := {0, 1, 4, 5, 8, 9, 12, 13}; image[6] := {2, 3, 6, 7, 10, 11, 14, 15}; image[7] := {2, 3, 6, 7, 10, 11, 14, 15}; image[8] := {0, 1, 4, 5, 8, 9, 12, 13}; image[9] := {0, 1, 4, 5, 8, 9, 12, 13}; image[10] := {2, 3, 6, 7, 10, 11, 14, 15}; image[11] := {2, 3, 6, 7, 10, 11, 14, 15}; image[12] := {0, 1, 4, 5, 8, 9, 12, 13}; image[13] := {0, 1, 4, 5, 8, 9, 12, 13}; image[14] := {2, 3, 6, 7, 10, 11, 14, 15}; image[15] := {2, 3, 6, 7, 10, 11, 14, 15}; grey2 := NewPattern(16, 16, image); image[0] := {0..2, 8..11}; image[1] := {0..2, 7..10}; image[2] := {0..2, 6..9}; image[3] := {0..2, 5..8}; image[4] := {0..2, 4..7}; image[5] := {0..6}; image[6] := {0..5}; image[7] := {0..4}; image[8] := {0..3}; image[9] := {0..2}; image[10] := {0, 1}; image[11] := {0}; hook := NewPattern(12, 12, image); image[0] := {7}; image[1] := {7}; image[2] := {2, 7, 12}; image[3] := {3, 7, 11}; image[4] := {4, 7, 10}; image[5] := {5, 7, 9}; image[6] := {6..8}; image[7] := {0..6, 8..14}; image[8] := {6..8}; image[9] := {5, 7, 9}; image[10] := {4, 7, 10}; image[11] := {3, 7, 11}; image[12] := {2, 7, 12}; image[13] := {7}; image[14] := {7}; star := NewPattern(15, 15, image); image[0] := {}; image[1] := {}; image[2] := {0}; image[3] := {}; image[4] := {}; image[5] := {}; image[6] := {}; image[7] := {}; image[8] := {}; image[9] := {}; image[10] := {}; image[11] := {}; image[12] := {}; image[13] := {}; image[14] := {}; image[15] := {}; ticks := NewPattern(16, 16, image); image[0] := -{}; image[1] := -{}; image[2] := -{}; image[3] := -{}; image[4] := -{}; image[5] := -{}; image[6] := -{}; image[7] := -{}; solid := NewPattern(16, 8, image) END CreatePatterns; PROCEDURE Depth*(x: LONGINT): INTEGER; BEGIN RETURN depth END Depth; PROCEDURE TrueColor*(x: LONGINT): BOOLEAN; BEGIN RETURN FALSE END TrueColor; PROCEDURE DisplayBlock*(adr, dx, dy, w, h, sx, sy, mode: LONGINT); VAR BitmapWth, locW, locH, SourceAdr, DestAdr, AreaHeight: LONGINT; CODE {SYSTEM.i386} MOVSX EAX, Width SHR EAX,3 MOV locW[EBP], EAX ; locW := Width DIV 8 MOVSX EAX, Height DEC EAX MOV locH[EBP], EAX ; locH := Height-1 CLI MOV ESI, adr[EBP] ; address of bitmap descriptor MOV EDI, 12[ESI] MOV EAX, 8[ESI] MOV BitmapWth[EBP], EAX MOV ECX, dy[EBP] IMUL EAX,ECX MOV EBX, dx[EBP] ADD EAX, EBX ADD EAX, EDI ; source address MOV SourceAdr[EBP], EAX MOV ESI, EAX ; esi = source index register MOV EAX, locW[EBP] MOV EBX, locH[EBP] SUB EBX, sy[EBP] IMUL EAX,EBX MOV EBX, sx[EBP] SHR EBX,3 ADD EAX, EBX AND EAX, 0FFFFH ADD EAX, 0A0000H ; destination address MOV DestAdr[EBP], EAX MOV EDI, EAX ; edi = destination index register MOV DX, 03C4H ; AX = Default map mask; DX = Sequencer MOV AX, 0F02H OUT DX, AX MOV DX, 03CEH MOV AL, 3 MOV BX, WORD mode[EBP] CMP BX, 1 JE DispPMode JG DispIMode DispRMode: MOV AH,00 JMP DispSetMode DispPMode: MOV AH, 10H JMP DispSetMode DispIMode: MOV AH, 18H DispSetMode: OUT DX, AX ; set rotate and function select MOV AX, 0205H OUT DX, AX ; set writemode 2, readmode 0 XOR AX, AX OUT DX, AX ; disable set/reset MOV CL, BYTE sx[EBP] AND CL, 7 ; ?DX MOD 8 MOV AX, 8008H SHR AH,CL ; prepare bitmask MOV DestAdr[EBP], EDI MOV ECX, h[EBP] IMUL ECX, BitmapWth[EBP] ADD ECX, ESI MOV EBX, w[EBP] MOV AreaHeight[EBP], EBX DispRowLoop: JE DispEnd OUT DX, AX ; set bitmask register MOV SourceAdr[EBP], ESI DispColLoop: CMP ESI, ECX JGE DispColEnd MOV BL, [EDI] MOV BL, [ESI] ; get PEL from bitmap MOV [EDI], BL ; write PEL to VGA ADD ESI, BitmapWth[EBP] SUB EDI, locW[EBP] JMP DispColLoop DispColEnd: MOV ESI, SourceAdr[EBP] INC ESI INC ECX MOV EDI, DestAdr[EBP] ROR AH,1 JNB NextCol INC EDI MOV DestAdr[EBP], EDI NextCol: DEC AreaHeight[EBP] ; next row JMP DispRowLoop DispEnd: MOV AL, 3 ; restore invert mode MOV AH, 18H OUT DX, AX MOV AX, 0FF08H ; enable all latches OUT DX, AX MOV AX, 05H ; restore read/write mode 0 OUT DX, AX STI END DisplayBlock; PROCEDURE TransferFormat*(x: LONGINT): LONGINT; (** non-portable *) BEGIN RETURN unknown END TransferFormat; PROCEDURE TransferBlock*(VAR buf: ARRAY OF CHAR; ofs, stride, x, y, w, h, mode: LONGINT); (** non-portable *) BEGIN HALT(99) END TransferBlock; PROCEDURE SetBorder; VAR ch: CHAR; BEGIN SYSTEM.PORTIN(3DAH, ch); SYSTEM.PORTOUT(3C0H, 11X); SYSTEM.PORTOUT(3C0H, 0FFX); SYSTEM.PORTOUT(3C0H, 020X) END SetBorder; PROCEDURE Init; VAR s: ARRAY 10 OF CHAR; BEGIN Kernel.GetConfig("Color", s); IF s = "0" THEN depth := 1 ELSE depth := 4 END END Init; PROCEDURE InitRev; VAR i, j, x: LONGINT; BEGIN FOR i := 0 TO 255 DO x := 0; FOR j := 0 TO 7 DO x := ASH(x, 1); IF ODD(ASH(i, -j)) THEN INC(x) END END; rev[i] := CHR(x) END END InitRev; BEGIN Init; Width := 640; Height := 480; Left:= 0; ColLeft:= 0; Bottom:= 0; UBottom:= -330; pattern := NIL; width := Width; height := Height; clipx := 0; clipy := UBottom; clipright := width; cliptop := height; width3 := width DIV 8; mask[0] := 0X; mask[1] := 80X; mask[2] := 0C0X; mask[3] := 0E0X; mask[4] := 0F0X; mask[5] := 0F8X; mask[6] := 0FCX; mask[7] := 0FEX; mask[8] := 0FFX; imask[0] := 0FFX; imask[1] := 7FX; imask[2] := 3FX; imask[3] := 1FX; imask[4] := 0FX; imask[5] := 7X; imask[6] := 3X; imask[7] := 1X; imask[8] := 0X; InitRev; CreatePatterns; SetBorder; Unit := 10000 END Display. Compiler.Compile VGA.Display.Mod\X ~