home *** CD-ROM | disk | FTP | other *** search
- ifndef ??version
- ?debug macro
- endm
- publicdll macro name
- public name
- endm
- $comm macro name,dist,size,count
- comm dist name:BYTE:count*size
- endm
- else
- $comm macro name,dist,size,count
- comm dist name[size]:BYTE:count
- endm
- endif
- ?debug S "ibmpc.cpp"
- ?debug C E9D7A80D170969626D70632E637070
- ?debug C E90010971614443A5C4243435C494E434C5544455C646F732E68
- _TEXT segment byte public 'CODE'
- _TEXT ends
- DGROUP group _DATA,_BSS
- assume cs:_TEXT,ds:DGROUP
- _DATA segment word public 'DATA'
- d@ label byte
- d@w label word
- _DATA ends
- _BSS segment word public 'BSS'
- b@ label byte
- b@w label word
- _BSS ends
- _TEXT segment byte public 'CODE'
- ;
- ; void pascal cursor(int x, int y)
- ;
- assume cs:_TEXT
- @CURSOR$QII proc near
- push bp
- mov bp,sp
- ;
- ; {
- ; rg.x.ax = 0x0200;
- ;
- mov word ptr DGROUP:rg,512
- ;
- ; rg.x.bx = 0;
- ;
- mov word ptr DGROUP:rg+2,0
- ;
- ; rg.x.dx = ((y << 8) & 0xff00) + x;
- ;
- mov ax,word ptr [bp+4]
- mov cl,8
- shl ax,cl
- and ax,65280
- add ax,word ptr [bp+6]
- mov word ptr DGROUP:rg+6,ax
- ;
- ; int86(16, &rg, &rg);
- ;
- mov ax,offset DGROUP:rg
- push ax
- mov ax,offset DGROUP:rg
- push ax
- mov ax,16
- push ax
- call near ptr _int86
- add sp,6
- ;
- ; }
- ;
- pop bp
- ret 4
- @CURSOR$QII endp
- ;
- ; void pascal curr_cursor(int *x, int *y)
- ;
- assume cs:_TEXT
- @CURR_CURSOR$QPIT1 proc near
- push bp
- mov bp,sp
- push si
- push di
- mov si,word ptr [bp+6]
- mov di,word ptr [bp+4]
- ;
- ; {
- ; rg.x.ax = 0x0300;
- ;
- mov word ptr DGROUP:rg,768
- ;
- ; rg.x.bx = 0;
- ;
- mov word ptr DGROUP:rg+2,0
- ;
- ; int86(16, &rg, &rg);
- ;
- mov ax,offset DGROUP:rg
- push ax
- mov ax,offset DGROUP:rg
- push ax
- mov ax,16
- push ax
- call near ptr _int86
- add sp,6
- ;
- ; *x = rg.h.dl;
- ;
- mov al,byte ptr DGROUP:rg+6
- mov ah,0
- mov word ptr [si],ax
- ;
- ; *y = rg.h.dh;
- ;
- mov al,byte ptr DGROUP:rg+7
- mov ah,0
- mov word ptr [di],ax
- ;
- ; }
- ;
- pop di
- pop si
- pop bp
- ret 4
- @CURR_CURSOR$QPIT1 endp
- ;
- ; void pascal set_cursor_type(int t)
- ;
- assume cs:_TEXT
- @SET_CURSOR_TYPE$QI proc near
- push bp
- mov bp,sp
- ;
- ; {
- ; rg.x.ax = 0x0100;
- ;
- mov word ptr DGROUP:rg,256
- ;
- ; rg.x.bx = 0;
- ;
- mov word ptr DGROUP:rg+2,0
- ;
- ; rg.x.cx = t;
- ;
- mov ax,word ptr [bp+4]
- mov word ptr DGROUP:rg+4,ax
- ;
- ; int86(16, &rg, &rg);
- ;
- mov ax,offset DGROUP:rg
- push ax
- mov ax,offset DGROUP:rg
- push ax
- mov ax,16
- push ax
- call near ptr _int86
- add sp,6
- ;
- ; }
- ;
- pop bp
- ret 2
- @SET_CURSOR_TYPE$QI endp
- _TEXT ends
- _DATA segment word public 'DATA'
- _attrib label byte
- db 7
- _DATA ends
- _TEXT segment byte public 'CODE'
- ;
- ; void pascal clear_screen()
- ;
- assume cs:_TEXT
- @CLEAR_SCREEN$QV proc near
- push bp
- mov bp,sp
- ;
- ; {
- ; cursor(0, 0);
- ;
- xor ax,ax
- push ax
- xor ax,ax
- push ax
- call near ptr @CURSOR$QII
- ;
- ; rg.h.al = ' ';
- ;
- mov byte ptr DGROUP:rg,32
- ;
- ; rg.h.ah = 9;
- ;
- mov byte ptr DGROUP:rg+1,9
- ;
- ; rg.x.bx = attrib;
- ;
- mov al,byte ptr DGROUP:_attrib
- cbw
- mov word ptr DGROUP:rg+2,ax
- ;
- ; rg.x.cx = 2000;
- ;
- mov word ptr DGROUP:rg+4,2000
- ;
- ; int86(16, &rg, &rg);
- ;
- mov ax,offset DGROUP:rg
- push ax
- mov ax,offset DGROUP:rg
- push ax
- mov ax,16
- push ax
- call near ptr _int86
- add sp,6
- ;
- ; }
- ;
- pop bp
- ret
- @CLEAR_SCREEN$QV endp
- ;
- ; int pascal vmode()
- ;
- assume cs:_TEXT
- @VMODE$QV proc near
- push bp
- mov bp,sp
- ;
- ; {
- ; rg.h.ah = 15;
- ;
- mov byte ptr DGROUP:rg+1,15
- ;
- ; int86(16, &rg, &rg);
- ;
- mov ax,offset DGROUP:rg
- push ax
- mov ax,offset DGROUP:rg
- push ax
- mov ax,16
- push ax
- call near ptr _int86
- add sp,6
- ;
- ; return rg.h.al;
- ;
- mov al,byte ptr DGROUP:rg
- mov ah,0
- jmp short @5@50
- @5@50:
- ;
- ; }
- ;
- pop bp
- ret
- @VMODE$QV endp
- ;
- ; int pascal scroll_lock()
- ;
- assume cs:_TEXT
- @SCROLL_LOCK$QV proc near
- push bp
- mov bp,sp
- ;
- ; {
- ; rg.x.ax = 0x0200;
- ;
- mov word ptr DGROUP:rg,512
- ;
- ; int86(0x16, &rg, &rg);
- ;
- mov ax,offset DGROUP:rg
- push ax
- mov ax,offset DGROUP:rg
- push ax
- mov ax,22
- push ax
- call near ptr _int86
- add sp,6
- ;
- ; return rg.h.al & 0x10;
- ;
- mov al,byte ptr DGROUP:rg
- mov ah,0
- and ax,16
- jmp short @6@50
- @6@50:
- ;
- ; }
- ;
- pop bp
- ret
- @SCROLL_LOCK$QV endp
- _TEXT ends
- _BSS segment word public 'BSS'
- _helpfunc label word
- db 2 dup (?)
- _BSS ends
- _DATA segment word public 'DATA'
- _helpkey label word
- db 0
- db 0
- _DATA ends
- _BSS segment word public 'BSS'
- _BSS ends
- _DATA segment word public 'DATA'
- _helping label word
- db 0
- db 0
- _DATA ends
- _BSS segment word public 'BSS'
- _BSS ends
- _TEXT segment byte public 'CODE'
- ;
- ; void pascal vpoke(unsigned vseg, unsigned adr, unsigned chr)
- ;
- assume cs:_TEXT
- @VPOKE$QUIUIUI proc near
- push bp
- mov bp,sp
- push si
- push di
- mov si,word ptr [bp+8]
- mov cx,word ptr [bp+6]
- ;
- ; {
- ; if (vseg == 45056) /* monochrome mode */
- ;
- xor ax,ax
- or ax,ax
- jne short @7@98
- cmp si,45056
- jne short @7@98
- ;
- ; poke(vseg, adr, chr);
- ;
- mov es,si
- mov bx,cx
- mov ax,word ptr [bp+4]
- mov word ptr es:[bx],ax
- jmp short @7@458
- @7@98:
- ;
- ; else {
- ; _DI = adr; /* offset of video character */
- ;
- mov di,cx
- ;
- ; _ES = vseg; /* video segment */
- ;
- mov es,si
- ;
- ; asm cld;
- ;
- cld
- ;
- ; _BX = chr; /* the attribute and character */
- ;
- mov bx,word ptr [bp+4]
- ;
- ; _DX = 986; /* video status port */
- ;
- mov dx,986
- @7@170:
- ;
- ; // wait for video retrace to start
- ; do
- ; asm in al,dx;
- ;
- in al,dx
- ;
- ; while (_AL & 1);
- ;
- mov ah,0
- test ax,1
- jne short @7@170
- @7@218:
- ;
- ; // wait for video retrace to stop
- ; do
- ; asm in al,dx;
- ;
- in al,dx
- ;
- ; while (!(_AL & 1));
- ;
- and al,1
- mov ah,0
- or ax,ax
- je short @7@218
- ;
- ; _AL = _BL;
- ;
- mov al,bl
- ;
- ; asm stosb; /* store character */
- ;
- stosb
- @7@314:
- ;
- ; // wait for video retrace to start
- ; do
- ; asm in al,dx;
- ;
- in al,dx
- ;
- ; while (_AL & 1);
- ;
- mov ah,0
- test ax,1
- jne short @7@314
- @7@362:
- ;
- ; // wait for video retrace to stop
- ; do
- ; asm in al,dx;
- ;
- in al,dx
- ;
- ; while (!(_AL & 1));
- ;
- and al,1
- mov ah,0
- or ax,ax
- je short @7@362
- ;
- ; _AL = _BH;
- ;
- mov al,bh
- ;
- ; asm stosb; // store attribute
- ;
- stosb
- @7@458:
- ;
- ; }
- ; }
- ;
- pop di
- pop si
- pop bp
- ret 6
- @VPOKE$QUIUIUI endp
- ;
- ; int pascal vpeek(unsigned vseg, unsigned adr)
- ;
- assume cs:_TEXT
- @VPEEK$QUIUI proc near
- push bp
- mov bp,sp
- push si
- push di
- mov di,word ptr [bp+6]
- mov cx,word ptr [bp+4]
- ;
- ; {
- ; int ch, at;
- ;
- ; if (vseg == 45056) // monochrome mode
- ;
- xor ax,ax
- or ax,ax
- jne short @8@98
- cmp di,45056
- jne short @8@98
- ;
- ; return peek(vseg, adr);
- ;
- mov es,di
- mov bx,cx
- mov ax,word ptr es:[bx]
- jmp short @8@506
- @8@98:
- ;
- ; asm push ds;
- ;
- push ds
- ;
- ; _DX = 986; // video status port
- ;
- mov dx,986
- ;
- ; _DS = vseg; // video segment address
- ;
- mov ds,di
- ;
- ; _SI = adr; // video character offset
- ;
- mov si,cx
- ;
- ; asm cld;
- ;
- cld
- @8@170:
- ;
- ; // wait for video retrace to start
- ; do
- ; asm in al,dx;
- ;
- in al,dx
- ;
- ; while (_AL & 1);
- ;
- mov ah,0
- test ax,1
- jne short @8@170
- @8@218:
- ;
- ; // wait for video retrace to stop
- ; do
- ; asm in al,dx;
- ;
- in al,dx
- ;
- ; while (!(_AL & 1));
- ;
- and al,1
- mov ah,0
- or ax,ax
- je short @8@218
- ;
- ; asm lodsb; /* get the character */
- ;
- lodsb
- ;
- ; _BL = _AL;
- ;
- mov bl,al
- @8@314:
- ;
- ; // wait for video retrace to start
- ; do
- ; asm in al,dx;
- ;
- in al,dx
- ;
- ; while (_AL & 1);
- ;
- mov ah,0
- test ax,1
- jne short @8@314
- @8@362:
- ;
- ; // wait for video retrace to stop
- ; do
- ; asm in al,dx;
- ;
- in al,dx
- ;
- ; while (!(_AL & 1));
- ;
- and al,1
- mov ah,0
- or ax,ax
- je short @8@362
- ;
- ; asm lodsb; // get the attribute
- ;
- lodsb
- ;
- ; _BH = _AL;
- ;
- mov bh,al
- ;
- ; _AX = _BX;
- ;
- mov ax,bx
- ;
- ; asm pop ds;
- ;
- pop ds
- ;
- ; return _AX;
- ;
- jmp short @8@506
- @8@506:
- ;
- ; }
- ;
- pop di
- pop si
- pop bp
- ret 4
- @VPEEK$QUIUI endp
- _TEXT ends
- _BSS segment word public 'BSS'
- rg label word
- db 16 dup (?)
- ?debug C E9
- _BSS ends
- _DATA segment word public 'DATA'
- s@ label byte
- _DATA ends
- _TEXT segment byte public 'CODE'
- _TEXT ends
- _s@ equ s@
- _rg equ rg
- public @CURSOR$QII
- extrn _int86:near
- public @CURR_CURSOR$QPIT1
- public @SET_CURSOR_TYPE$QI
- public _attrib
- public @CLEAR_SCREEN$QV
- public @VMODE$QV
- public @SCROLL_LOCK$QV
- public _helpfunc
- public _helpkey
- public _helping
- public @VPOKE$QUIUIUI
- public @VPEEK$QUIUI
- end