;==================================================== ; ; Library ASM code ; ;==================================================== IDEAL P386N MODEL medium,C extrn xormask:WORD,yshift:WORD,CGAfont:WORD,VGAfont:WORD DATASEG SCindex = 3c4h SCmapmask = 2 GCindex = 3CEh GCreadmap = 4 GCmode = 5 a = 0 LABEL CGAlookup WORD PUBLIC CGAlookup REPT 100 dw a,a XOR 2000h a = a+80 ENDM a = 0 LABEL EGA1lookup WORD PUBLIC EGA1lookup REPT 200 dw a a = a+40 ENDM a = 0 LABEL EGA2lookup WORD PUBLIC EGA2lookup REPT 480 dw a a = a+80 ENDM a = 0 LABEL VGAlookup WORD PUBLIC VGAlookup REPT 200 dw a a = a+320 ENDM CODESEG ;==================================================== ; ; Draw CGA chars ; ;==================================================== PROC CGAcharout PUBLIC CGAcharout ARG x:WORD,y:WORD,chr:BYTE USES si,di,ds mov bx,[y] shl bx,1 shl bx,1 shl bx,1 shl bx,1 mov di,[CGAlookup+bx] mov ax,[x] shl ax,1 add di,ax mov al,[chr] xor ah,ah shl ax,1 shl ax,1 shl ax,1 shl ax,1 mov si,ax mov ax,0b800h mov es,ax mov ds,[CGAfont] cld cmp [ss:xormask],0 ja @@1 REPT 4 movsw add di,2000h-2 movsw sub di,2000h-78 ENDM jmp @@exit @@1: REPT 4 lodsw xor ax,0ffffh stosw add di,2000h-2 lodsw xor ax,0ffffh stosw sub di,2000h-78 ENDM @@exit: ret ENDP ;==================================================== ; ; Draw EGA chars ; ;==================================================== PROC EGAcharout PUBLIC EGAcharout ARG x:WORD,y:WORD,chr:BYTE,video:WORD USES si,di,ds,bp mov dx,GCindex mov ax,GCmode out dx,ax mov bx,[y] shl bx,1 shl bx,1 shl bx,1 add bx,[yshift] shl bx,1 cmp [video],1 jne @@0 mov cx,39 mov di,[EGA1lookup+bx] jmp @@1 @@0: mov cx,79 mov di,[EGA2lookup+bx] @@1: add di,[x] mov ax,0a000h mov es,ax mov ds,ax mov si,0f000h mov al,[chr] xor ah,ah shl ax,1 shl ax,1 shl ax,1 add si,ax cld cmp [ss:xormask],0 ja @@2 mov dx,GCindex mov ax,GCmode OR 100h out dx,ax mov dx,SCindex mov ax,SCmapmask OR 0f00h out dx,ax REPT 8 movsb add di,cx ENDM jmp @@exit @@2: ga = 100h gb = 0 mov bp,si mov bx,di REPT 4 mov dx,SCindex mov ax,SCmapmask OR ga out dx,ax mov dx,GCindex mov ax,GCreadmap OR gb out dx,ax REPT 8 lodsb xor al,0ffh stosb add di,cx ENDM mov di,bx mov si,bp ga = ga*2 gb = gb+100h ENDM @@exit: mov dx,GCindex mov ax,GCmode out dx,ax ret ENDP ;==================================================== ; ; Draw VGA chars ; ;==================================================== PROC VGAcharout PUBLIC VGAcharout ARG x:WORD,y:WORD,chr:BYTE USES si,di,ds mov bx,[y] shl bx,1 shl bx,1 shl bx,1 add bx,[yshift] shl bx,1 mov di,[VGAlookup+bx] mov ax,[x] shl ax,1 shl ax,1 shl ax,1 add di,ax mov ah,[chr] xor al,al shr ax,1 shr ax,1 ;[chr]*64! mov si,ax mov ax,0a000h mov es,ax mov ds,[VGAfont] cmp [ss:xormask],0 ja @@1 REPT 8 REPT 4 movsw ENDM add di,320-8 ENDM jmp @@exit @@1: REPT 8 REPT 4 lodsw xor ax,0ffffh stosw ENDM add di,320-8 ENDM @@exit: ret ENDP END