[BACK]Return to pcgraph.asm CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gnuplot

Annotation of OpenXM_contrib/gnuplot/pcgraph.asm, Revision 1.1.1.1

1.1       maekawa     1: TITLE  PC graphics module
                      2: ;      uses LINEPROC.MAC
                      3:
                      4: ;      Michael Gordon - 8-Dec-86
                      5: ;
                      6: ; Certain routines were taken from the Hercules BIOS of        Dave Tutelman - 8/86
                      7: ; Others came from pcgraph.asm included in GNUPLOT by Colin Kelley
                      8: ;
                      9: ; modified slightly by Colin Kelley - 22-Dec-86
                     10: ;      added header.mac, parameterized declarations
                     11: ; added dgroup: in HVmodem to reach HCh_Parms and HGr_Parms - 30-Jan-87
                     12: ;
                     13: ; modified and added to for use in plot(3) routines back end.
                     14: ; Gil Webster.
                     15: ;
                     16: ; Assemble with masm ver. 4.
                     17:
                     18: include header.mac
                     19:
                     20: if1
                     21: include lineproc.mac
                     22: endif
                     23:
                     24: GPg1_Base equ 0B800h   ; Graphics page 1 base address
                     25:
                     26:        extrn _inter:far
                     27:
                     28: _text  segment
                     29:
                     30:        public _PC_line, _PC_color, _PC_mask, _PC_curloc, _PC_puts, _Vmode
                     31:        public _erase, _save_stack, _ss_interrupt
                     32:
                     33: pcpixel proc near
                     34:        ror word ptr linemask,1
                     35:        jc cont
                     36:        ret
                     37: cont:
                     38:        push ax
                     39:        push bx
                     40:        push cx
                     41:        push dx
                     42:        push bp
                     43:        mov cx,ax               ; x
                     44:        mov dx,bx               ; y
                     45:        mov ah,0ch              ; ah = write pixel
                     46:        mov al,byte ptr color
                     47:
                     48:        mov bh, 0               ; page 0
                     49:        int 10h
                     50:        pop bp
                     51:        pop dx
                     52:        pop cx
                     53:        pop bx
                     54:        pop ax
                     55:        ret
                     56: pcpixel endp
                     57:
                     58: lineproc _PC_line, pcpixel
                     59:
                     60: ;
                     61: ; erase - clear page 1 of the screen buffer to zero (effectively, blank
                     62: ;      the screen)
                     63: ;
                     64: beginproc _erase
                     65:        push es
                     66:        push ax
                     67:        push cx
                     68:        push di
                     69:        mov ax, GPg1_Base
                     70:        mov es, ax
                     71:        xor di, di
                     72:        mov cx, 4000h
                     73:        xor ax, ax
                     74:        cld
                     75:        rep stosw                       ; zero out screen page
                     76:        pop di
                     77:        pop cx
                     78:        pop ax
                     79:        pop es
                     80:        ret
                     81: _erase endp
                     82:
                     83: beginproc _PC_color
                     84:        push bp
                     85:        mov bp,sp
                     86:        mov al,[bp+X]                   ; color
                     87:        mov byte ptr color,al
                     88:        pop bp
                     89:        ret
                     90: _PC_color endp
                     91:
                     92: beginproc _PC_mask
                     93:        push bp
                     94:        mov bp,sp
                     95:        mov ax,[bp+X]                   ; mask
                     96:        mov word ptr linemask,ax
                     97:        pop bp
                     98:        ret
                     99: _PC_mask endp
                    100:
                    101: beginproc _Vmode
                    102:        push bp
                    103:        mov bp,sp
                    104:        push si
                    105:        push di
                    106:        mov ax,[bp+X]
                    107:        int 10h
                    108:        pop di
                    109:        pop si
                    110:        pop bp
                    111:        ret
                    112: _Vmode endp
                    113:
                    114: beginproc _PC_curloc
                    115:        push bp
                    116:        mov bp,sp
                    117:        mov dh, byte ptr [bp+X] ; row number
                    118:        mov dl, byte ptr [bp+X+2] ; col number
                    119:        mov bh, 0
                    120:        mov ah, 2
                    121:        int 10h
                    122:        pop bp
                    123:        ret
                    124: _PC_curloc endp
                    125:
                    126: ;
                    127: ; thanks to watale!broehl for finding a bug here--I wasn't pushing BP
                    128: ;   and reloading AH before INT 10H, which is necessary on genuine IBM
                    129: ;   boards...
                    130: ;
                    131: beginproc _PC_puts
                    132:        push bp
                    133:        mov bp,sp
                    134:        push si
                    135:        mov bl,byte ptr color
                    136:        mov si,[bp+X]           ; offset
                    137:
                    138: ifdef LARGE_DATA
                    139:        mov es,[bp+X+2]         ; segment if large or compact data model
                    140: endif
                    141:
                    142: puts2:
                    143:
                    144: ifdef LARGE_DATA
                    145:        mov al,es:[si]
                    146: else
                    147:        mov al,[si]
                    148: endif
                    149:        or al,al
                    150:        jz puts3
                    151:        mov ah,0eh              ; write TTY char
                    152:        int 10h
                    153:        inc si
                    154:        jmp short puts2
                    155: puts3: pop si
                    156:        pop bp
                    157:        ret
                    158: _PC_puts endp
                    159:
                    160:
                    161: ; int kbhit();
                    162: ;   for those without MSC 4.0
                    163: ; Use BIOS interrupt 16h to determine if a key is waiting in the buffer.
                    164: ; Return nonzero if so.
                    165: ;
                    166:
                    167: beginproc _kbhit
                    168:        mov ah, 1               ; function code 1 is keyboard test
                    169:        int 16h                 ; keyboard functions
                    170:        jnz kbfin               ; Exit if char available
                    171:        xor ax, ax              ; No char:  return zero.
                    172: kbfin: ret
                    173: _kbhit endp
                    174:
                    175:
                    176: ; _save_stack and _ss_interrupt are needed due to a bug in the MSC 4.0
                    177: ; code when run under MS-DOS 3.x.  Starting with 3.0, MS-DOS automatically
                    178: ; switches to an internal stack during system calls.  This leaves SS:SP
                    179: ; pointing at MS-DOS's stack when the ^C interrupt (INT 23H) is triggered.
                    180: ; MSC should restore its own stack before calling the user signal() routine,
                    181: ; but it doesn't.
                    182: ;
                    183: ; Presumably this code will be unnecessary in later releases of the compiler.
                    184: ;
                    185:
                    186: ; _save_stack saves the current SS:SP to be loaded later by _ss_interrupt.
                    187: ;
                    188:
                    189: beginproc _save_stack
                    190:        mov ax,ss
                    191:        mov cs:save_ss,ax
                    192:        mov ax,sp
                    193:        mov cs:save_sp,ax
                    194:        ret
                    195: _save_stack endp
                    196:
                    197:
                    198: ; _ss_interrupt is called on ^C (INT 23H).  It restores SS:SP as saved in
                    199: ; _save_stack and then jumps to the C routine interrupt().
                    200: ;
                    201: beginproc _ss_interrupt
                    202:        cli                     ; no interrupts while the stack is changed!
                    203:        mov ax,-1               ; self-modifying code again
                    204: save_ss        equ this word - 2
                    205:        mov ss,ax
                    206:        mov sp,-1               ; here too
                    207: save_sp equ this word - 2
                    208:        sti
                    209:        jmp far ptr _inter; now it's safe to call the real routine
                    210: _ss_interrupt endp
                    211:
                    212:
                    213: _text  ends
                    214:
                    215:
                    216: const  segment
                    217: linemask dw -1
                    218: color   db 1
                    219: const  ends
                    220:
                    221:        end

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>