|
|
1.1 ! root 1: .xlist ! 2: include mdef ! 3: ;************************************************************************ ! 4: ;* * ! 5: ;* lclol: direct BIOS interface console output for C * ! 6: ;* * ! 7: ;* prototypes: int lclini(int); initialize * ! 8: ;* int lclatr(int); set attributes * ! 9: ;* void lclxy(int,int); set cursor position * ! 10: ;* int lclwx(void); get current column * ! 11: ;* int lclwy(void); get current line * ! 12: ;* void lputc(int); put character * ! 13: ;* long lputs(char far *); put string * ! 14: ;* * ! 15: ;************************************************************************ ! 16: ! 17: setmod %mm ! 18: .data ! 19: wid db 79 ;columns per screen (zero based) ! 20: lps db 24 ;lines per screen (zero based) ! 21: col db 0 ;current column ! 22: lin db 0 ;current line ! 23: atr db 7 ;current attribute ! 24: pag db 0 ;current display page ! 25: xla db 0 ;tab expansion (bit 1), lf->cr/lf (bit 0) ! 26: ! 27: .code ! 28: public _lputc,_lputs,_lclini,_lclxy,_lclwx,_lclwy,_lclatr ! 29: ! 30: ; Initialize ! 31: ; Gets current cursor position, attribute, and display page ! 32: ; from BIOS. Integer argument defines the size of the screen. ! 33: ! 34: _lclini proc ! 35: push bp ! 36: mov bp,sp ! 37: mov ax,pb[bp] ;fetch parameter 1 (16-bit int) ! 38: or ah,ah ! 39: jz noxla ;no translation change ! 40: ! 41: shr ah,1 ! 42: mov xla,ah ;set new translation flags ! 43: noxla: dec al ! 44: jns clps ;lines specified ! 45: ! 46: push ds ! 47: xor ax,ax ! 48: mov ds,ax ! 49: mov al,ds:[484h] ;get parameter from BIOS ! 50: or al,al ! 51: jnz blps ;use BIOS value if non-zero ! 52: mov al,24 ;else 25 assume lines ! 53: blps: pop ds ! 54: clps: mov lps,al ;set lines per screen ! 55: mov ah,0fh ! 56: int 10h ;get video mode ! 57: dec ah ! 58: mov wid,ah ;set screen width ! 59: mov pag,bh ;set current display page ! 60: mov ah,3 ! 61: int 10h ;get cursor position ! 62: cmp dh,lps ! 63: jc cuupd ;current line within range ! 64: mov dh,lps ;else set to maximum ! 65: cuupd: mov ah,2 ;set cursor and update current pointers ! 66: int 10h ;move cursor to last line ! 67: mov col,dx ;set current column and line ! 68: xor ah,ah ! 69: mov al,lps ! 70: inc al ;return number of lines set ! 71: pop bp ! 72: ret ! 73: _lclini endp ! 74: ! 75: ; Set current cursor position ! 76: ! 77: _lclxy proc ! 78: push bp ! 79: mov bp,sp ! 80: mov dx,pb[bp] ;get parameter 1, x (column) ! 81: dec dl ! 82: mov col,dl ! 83: mov ax,pb[bp+2] ;get parameter 2, y (line) ! 84: dec al ! 85: mov lin,al ! 86: mov dh,al ! 87: mov bh,pag ! 88: mov ah,2 ! 89: int 10h ;set cursor ! 90: xor ax,ax ! 91: pop bp ! 92: ret ! 93: _lclxy endp ! 94: ! 95: ; Get current cursor position (x,y) ! 96: ! 97: _lclwx proc ! 98: xor ah,ah ! 99: mov al,col ;return x (column) ! 100: inc al ! 101: ret ! 102: _lclwx endp ! 103: ! 104: _lclwy proc ! 105: xor ah,ah ! 106: mov al,lin ;return y (line) ! 107: inc al ! 108: ret ! 109: _lclwy endp ! 110: ! 111: ; Set local attributes ! 112: ! 113: _lclatr proc ! 114: push bp ! 115: mov bp,sp ! 116: xor ah,ah ! 117: mov al,atr ;get old attribute in ax ! 118: mov dx,pb[bp] ;fetch parameter 1 (16-bit int) ! 119: mov atr,dl ;set current attribute ! 120: pop bp ! 121: ret ! 122: _lclatr endp ! 123: ! 124: ; Put character to console (local) ! 125: ! 126: _lputc proc ! 127: push bp ! 128: mov bp,sp ! 129: mov ax,pb[bp] ;fetch parameter 1 (16-bit int) ! 130: ! 131: cmp ax,100h ! 132: jz clreol ;clear to end of line ! 133: cmp al,7 ! 134: jnz notbl ;bell ! 135: ! 136: mov ax,0e07h ;write in tty mode (ah) bell (al) ! 137: mov bx,atr ;get page (bh) and attribute (bl) ! 138: int 10h ;beep ! 139: jmp updc ;make sure cursor is not changed ! 140: ! 141: notbl: cmp al,8 ! 142: jnz notbs ;backspace ! 143: ! 144: mov al,col ! 145: or al,al ! 146: jz pexitj ;at column zero, no action ! 147: dec col ! 148: jmp updc ;move cursor back one column ! 149: ! 150: notbs: cmp al,9 ! 151: jz outtb ;horizontal tab ! 152: cmp al,12 ! 153: jz outcs ;screen clear ! 154: cmp al,10 ! 155: jz outlf ;line feed ! 156: cmp al,13 ! 157: jnz nonctl ;carriage return ! 158: mov col,0 ;set column zero ! 159: jmp updc ! 160: ! 161: clreol: mov ax,920h ! 162: mov bx,atr ;get page (bh) and attribute (bl) ! 163: mov cl,wid ;line length ! 164: sub cl,col ;get remainder ! 165: inc cl ;include current position ! 166: xor ch,ch ;replication factor in cx ! 167: int 10h ;clear to end of line ! 168: pexitj: jmp pexit ! 169: ! 170: outtb: test xla,2 ! 171: jz nonctl ;no tab expansion ! 172: mov al,col ! 173: and al,7 ! 174: mov cl,8 ! 175: sub cl,al ! 176: xor ch,ch ;number of spaces in cx ! 177: mov al,20h ! 178: tbexp: push cx ! 179: push ax ;parameter 1 ! 180: call _lputc ! 181: pop ax ! 182: pop cx ! 183: cmp col,0 ! 184: loopnz tbexp ;stop if cursor wraps ! 185: jmp pexit ! 186: ! 187: outcs: mov ax,600h ;scroll (clear screen) ! 188: mov bh,atr ;current attribute ! 189: xor cx,cx ;upper left corner of window (0,0) ! 190: mov dx,wid ;lower right corner of window (wid,lps) ! 191: int 10h ;scroll window up one line ! 192: mov col,cx ;new cursor ! 193: jmp updc ! 194: ! 195: nonctl: mov ah,9 ! 196: mov bx,atr ;get page (bh) and attribute (bl) ! 197: mov cx,1 ! 198: int 10h ;write char and attr at cursor position ! 199: mov ah,col ! 200: inc col ;advance cursor on line ! 201: cmp ah,wid ! 202: jc updc ;not at end of line, update cursor and exit ! 203: ! 204: mov col,0 ;set column zero (cr) ! 205: outlf: test xla,1 ! 206: jz nocrlf ;send lf alone ! 207: mov col,0 ! 208: nocrlf: mov ah,lin ! 209: cmp ah,lps ! 210: jc upda ;not at end of screen, update cursor and exit ! 211: jnz updn ;past end of screen, cr only ! 212: ! 213: mov ax,601h ;scroll (ah) number of lines (al) ! 214: mov bh,atr ;current attribute ! 215: xor cx,cx ;upper left corner of window (0,0) ! 216: mov dx,wid ;lower right corner of window (wid,lps) ! 217: int 10h ;scroll window up one line ! 218: ! 219: updn: dec lin ;leave current line number unchanged ! 220: upda: inc lin ;advance to next line ! 221: updc: mov ah,2 ! 222: mov bh,pag ! 223: mov dx,col ! 224: int 10h ;update cursor position ! 225: ! 226: pexit: xor ax,ax ;return zero ! 227: pop bp ! 228: ret ! 229: _lputc endp ! 230: ! 231: ; Put string to console (uses _lputc for each character) ! 232: ! 233: _lputs proc ! 234: push bp ! 235: mov bp,sp ! 236: push es ! 237: mov ax,pb[bp+2] ;string segment ! 238: mov bx,pb[bp] ;string offset ! 239: mov es,ax ! 240: xor dh,dh ! 241: nxtch: mov dl,es:[bx] ;character to output ! 242: or dl,dl ! 243: jz sexit ! 244: ! 245: inc bx ;address next character ! 246: jnz nowrap ! 247: mov ax,es ! 248: add ax,100h ;add 64k to segment pointer ! 249: mov es,ax ! 250: nowrap: push bx ;save offset ! 251: push dx ;arg 1 ! 252: call _lputc ;put character ! 253: pop dx ! 254: pop bx ! 255: jmp nxtch ! 256: ! 257: sexit: mov ax,pb[bp] ! 258: mov dx,pb[bp+2] ! 259: pop es ! 260: pop bp ! 261: ret ! 262: _lputs endp ! 263: ! 264: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.