dos_compilers/Mix Power C v1/PUT.ASM
2024-07-01 15:26:34 -07:00

223 lines
4.8 KiB
NASM

;
; Copyright (c) Mix Software 1988
;
; fputc(c,fp)
; int c;
; FILE *fp;
;
IDT fputc
DEF fputc
FREF _rflush
FREF _putc
fputc MOV BX,SP
MOV SI,[BX][%PARM2-2]
TEST SI,SI
JZ ENDFL
;
; if (fp == NULL || !fp->file.init || !fp->file.openflg) return EOF;
;
; TEST SI,SI ; File ok?
; JZ ENDFL
; CMP %[SI][%FD$INIT],%0
; JZ ENDFL
; CMP %[SI][%FD$OPEN],%0
; JZ ENDFL
;
; if (fp->file.dirty & fdread) {
; if (_rflush(fp) != 0) return EOF;
;
TEST %[SI][%FD$DIRTY],%FL$READ
JNZ FLUSH
;
; if (c != NEWLINE) {
;
NOFLUSH MOV AX,[BX][%PARM1-2]
CMP AL,>0A
JZ NEWLINE
;
; if (fp->file.count--) return (*(fp->file.ptr++) = c);
;
MOV CX,[SI][%FD$COUNT]
JCXZ BUFFULL
DEC CX
MOV [SI][%FD$COUNT],CX
MOV DI,[SI][%FD$PTR]
MOV %[DI],AL
INC DI
MOV [SI][%FD$PTR],DI
RETSEG
;
; else {
; fp->file.count++;
; return _putc(c,fp); } }
;
BUFFULL PUSH SI
PUSH AX
CALLFAR _putc
ADD SP,%4
RETSEG
;
; if ( (fp->file.flags & fdbinary) ||
; ((fp->file.flags & fdfilter) == 0) ) return _putc(c,fp);
;
NEWLINE TEST [SI][%FD$FLAGS],%FL$LFEED
JZ NOCR
;
; if (_putc('\r',fp) == EOF) return EOF;
;
PUSH SI
MOV AX,>000D
PUSH AX
CALLFAR _putc
POP DX
POP SI
INC AX
JNZ PUTLF
DEC AX
RETSEG
PUTLF MOV AX,>000A
NOCR PUSH SI
PUSH AX
;
; return _putc(c,fp);
;
CALLFAR _putc
ADD SP,%4
RETSEG
;
FLUSH PUSH SI
CALLFAR _rflush
POP SI
MOV BX,SP
TEST AX,AX
JZ NOFLUSH
;
ENDFL MOV AX,-1
RETSEG
END
;
;
; _putc(c,fp)
; int c;
; FILE *fp;
;
; Lowest level file output (one character)
; file validity has already been checked
;
IDT _putc
DEF _putc
FREF _fflush
FREF _seekend
REF _fileerr
DISKFULL EQU >009A
;
_putc PUSH BP
MOV BP,SP
MOV SI,[BP][%PARM2]
;
; if (fp->file.device == 'o') {
; _sys_adx(0x0200,c);
; return c; }
;
CMP %[SI][%FD$DEV],'o'
JNZ NOTSTD
MOV DX,[BP][%PARM1]
MOV AX,>0200
INT >21
MOV AX,[BP][%PARM1]
POP BP
RETSEG
;
; if (fp->file.count--) return (*(fp->file.ptr++) = c);
;
NOTSTD MOV AX,[BP][%PARM1]
MOV CX,[SI][%FD$COUNT]
JCXZ BUFFULL
DEC CX
MOV [SI][%FD$COUNT],CX
MOV DI,[SI][%FD$PTR]
MOV %[DI],AL
INC DI
MOV [SI][%FD$PTR],DI
EXIT POP BP
RETSEG
;
; fp->file.count = 0;
;
BUFFULL MOV [SI][%FD$COUNT],0
;
; if (fp->file.device == 'd') return c;
;
CMP [SI][%FD$DEV],'d'
JZ EXIT
;
; if (fp->file.dirty & fdwrite) {
; if (_fflush(fp) != 0) return EOF; }
;
TEST %[SI][%FD$DIRTY],%FL$WRITE
JZ NOFLUSH
PUSH SI
CALLFAR _fflush
POP SI
TEST AX,AX
JNZ ENDFL
;
; if (fp->file.flags & fdunbufr) {
; if (_sysabcd(0x4000,fp->file.handle,1,&c,&status) != 0) {
; (*_fileerr)(status,fp);
; return EOF; }
;
NOFLUSH TEST %[SI][%FD$FLAGS],%FL$UNBUF
JZ USEBUFR
; Seek to end of file if append mode
TEST [SI][%FD$FLAGS],FL$APPEN
JNZ PUTACHAR
PUSH SI
CALLFAR _seekend
POP SI
PUTACHAR LEA DX,[BP][%PARM1]
MOV BX,[SI][%FD$HNDL]
MOV CX,1
MOV AX,>4000
INT >21
JNB OK1
ERROR PUSH [BP][%PARM2]
PUSH AX
MOV BX,[_fileerr]
CALLSEG [BX]
ADD SP,%4
ENDFL MOV AX,-1
POP BP
RETSEG
;
; return c;
;
OK1 EQU $
CMP AX,1
JZ OK2
MOV AX,DISKFULL
JMPS ERROR
OK2 MOV AX,[BP][%PARM1]
POP BP
RETSEG
;
; fp->file.ptr = fp->file.bufr;
; fp->file.count = fp->file.bufsize - 1;
; *fp->file.ptr++ = c;
; fp->file.dirty |= fdwrite;
; return c;
;
USEBUFR MOV BX,[SI][%FD$BUFR]
MOV AX,[SI][%FD$BUFSZ]
DEC AX
MOV [SI][%FD$COUNT],AX
MOV AX,[BP][%PARM1]
MOV %[BX],AL
INC BX
MOV [SI][%FD$PTR],BX
OR %[SI][%FD$DIRTY],%FL$WRITE
POP BP
RETSEG
;
END