SUBTTL PRINTOPS PAGE ;PRINTC (PRINT CHAR WHOSE ASCII VALUE IS GIVEN) PUBLIC OPPRNC,OPPRNN OPPRNC PROC JMP PUTCHR ;QUEUE THE CHARACTER FOR PRINTING OPPRNC ENDP ;PRINTN (PRINT A NUMBER) OPPRNN PROC MOV BX,AX ;NUMBER TO PRINT CMP BX,0 JNE OPN1$ ;NON-ZERO MOV AX,"0" ;SPECIAL CASE ZERO JMP PUTCHR OPN1$: JG OPN2$ ;POSITIVE? MOV AX,"-" ;NO, PRINT MINUS SIGN CALL PUTCHR NEG BX ;AND MAKE IT POSITIVE OPN2$: SUB CX,CX ;COUNT OF DIGITS ON STACK JMP OPN4$ ;START WITH GREATER-THAN-10 TEST OPN3$: MOV AX,BX ;EXTRACT A DIGIT MOV BP,10 CWD IDIV BP PUSH DX ;PUSH IT INC CX ;BUMP COUNT MOV BX,AX ;GET QUOTIENT OPN4$: CMP BX,10 ;MORE DIGITS TO EXTRACT? JGE OPN3$ ;YES, GO LOOP MOV AX,BX ;NO, GET LAST (FIRST) DIGIT JMP OPN6$ ;ALREADY IN PLACE OPN5$: POP AX ;POP NEXT DIGIT OPN6$: ADD AX,"0" ;ASCIIZE IT CALL PUTCHR ;QUEUE IT DEC CX ;REDUCE DIGIT COUNT JGE OPN5$ ;LOOP IF SOME LEFT RET ;ELSE, RETURN OPPRNN ENDP PUBLIC OPPRIN,OPPRNB ;PRINT (THE STRING POINTED TO BY ES:AX) OPPRIN PROC CALL BSPLITQ ; (A0) SPLIT THE BLOCK & WORD NUMBERS (QUAD) JMP PUTSTR ;PRINT THE STRING OPPRIN ENDP ;PRINTB (PRINT THE STRING POINTED TO BY THE BYTE-POINTER ES:AX) OPPRNB PROC CALL BSPLTB ;SPLIT THE BLOCK & BYTE NUMBERS JMP PUTSTR ;PRINT THE STRING OPPRNB ENDP PUBLIC OPPRND,OPPRNI,OPPRNR ;PRINTD (PRINT OBJ'S SHORT DESCRIPTION) OPPRND PROC CALL OBJLOC ;FIND OBJ'S LOCATION MOV BP,AX GTAWRD A,[BP].PROPS ; (A0) GET IT INC AX ;POINT TO STRING CALL BSPLTB ;SPLIT POINTER JMP PUTSTR ;AND PRINT THE STRING OPPRND ENDP ;PRINTI (PRINT THE STRING FOLLOWING THIS INSTRUCTION) OPPRNI PROC MOV LSTNGD,0 ; (A16) LAST NXT BYTE RUINED MOV AX,ZPC1 ;GET POINTER TO STRING MOV BX,ZPC2 CALL PUTSTR ;AND PRINT IT MOV ZPC1,AX ;UPDATE ZPC MOV ZPC2,BX JMP NEWZPC OPPRNI ENDP ;PRINTR (PRINTI FOLLOWED BY RTRUE) OPPRNR PROC CALL OPPRNI ;DO A PRINTI CALL OPCRLF ;A CRLF JMP OPRTRU ;AND AN RTRUE OPPRNR ENDP PUBLIC OPCRLF ;CRLF (DO A NEWLINE) OPCRLF PROC JMP NEWLIN ;DO A NEWLINE OPCRLF ENDP