diff options
| author | 2024-04-25 21:24:10 +0100 | |
|---|---|---|
| committer | 2024-04-25 22:32:27 +0000 | |
| commit | 2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch) | |
| tree | 80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/DOS/PRINT.ASM | |
| parent | Merge pull request #430 from jpbaltazar/typoptbr (diff) | |
| download | ms-dos-main.tar.gz ms-dos-main.tar.xz ms-dos-main.zip | |
Diffstat (limited to 'v4.0/src/DOS/PRINT.ASM')
| -rw-r--r-- | v4.0/src/DOS/PRINT.ASM | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/v4.0/src/DOS/PRINT.ASM b/v4.0/src/DOS/PRINT.ASM new file mode 100644 index 0000000..c2bbe55 --- /dev/null +++ b/v4.0/src/DOS/PRINT.ASM | |||
| @@ -0,0 +1,199 @@ | |||
| 1 | ; SCCSID = @(#)print.asm 1.1 85/04/10 | ||
| 2 | ; | ||
| 3 | ; PFMT - formatted output. Calling sequence: | ||
| 4 | ; PUSH BP | ||
| 5 | ; PUSH fmtstr | ||
| 6 | ; MOV BP,SP | ||
| 7 | ; PUSH args | ||
| 8 | ; CALL PFMT | ||
| 9 | ; ADD SP,n | ||
| 10 | ; POP BP | ||
| 11 | ; | ||
| 12 | ; The format string contains format directives and normal output characters | ||
| 13 | ; much like the PRINTF for C. We utilize NO format widths. Special chars | ||
| 14 | ; and strings are: | ||
| 15 | ; | ||
| 16 | ; $x output a hex number | ||
| 17 | ; $s output an offset string | ||
| 18 | ; $c output a character | ||
| 19 | ; $S output a segmented string | ||
| 20 | ; $p output userid/processid | ||
| 21 | ; \t output a tab | ||
| 22 | ; \n output a CRLF | ||
| 23 | ; | ||
| 24 | ; The format string must be addressable via CS | ||
| 25 | ; | ||
| 26 | |||
| 27 | Procedure PFMT,NEAR | ||
| 28 | SaveReg <AX,BX,DS,SI> | ||
| 29 | MOV AX,8007h | ||
| 30 | INT 2Ah | ||
| 31 | PUSH CS | ||
| 32 | POP DS | ||
| 33 | SUB BP,2 | ||
| 34 | Call FMTGetArg | ||
| 35 | MOV SI,AX | ||
| 36 | FmtLoop: | ||
| 37 | LODSB | ||
| 38 | OR AL,AL | ||
| 39 | JZ FmtDone | ||
| 40 | CMP AL,'$' | ||
| 41 | JZ FmtOpt | ||
| 42 | CMP AL,'\' | ||
| 43 | JZ FmtChr | ||
| 44 | FmtOut: | ||
| 45 | CALL Out | ||
| 46 | JMP FmtLoop | ||
| 47 | Out: | ||
| 48 | SaveReg <SI,DI,BP> | ||
| 49 | INT 29h | ||
| 50 | RestoreReg <BP,DI,SI> | ||
| 51 | return | ||
| 52 | FmtDone: | ||
| 53 | MOV AX,8107h | ||
| 54 | INT 2Ah | ||
| 55 | RestoreReg <SI,DS,BX,AX> | ||
| 56 | RET | ||
| 57 | ; | ||
| 58 | ; \ leads in a special character. See what the next char is. | ||
| 59 | ; | ||
| 60 | FmtChr: LODSB | ||
| 61 | OR AL,AL ; end of string | ||
| 62 | JZ fmtDone | ||
| 63 | CMP AL,'n' ; newline | ||
| 64 | JZ FmtCRLF | ||
| 65 | CMP AL,'t' ; tab | ||
| 66 | JNZ FmtOut | ||
| 67 | MOV AL,9 | ||
| 68 | JMP FmtOut | ||
| 69 | FmtCRLF:MOV AL,13 | ||
| 70 | CALL Out | ||
| 71 | MOV AL,10 | ||
| 72 | JMP FmtOut | ||
| 73 | ; | ||
| 74 | ; $ leads in a format specifier. | ||
| 75 | ; | ||
| 76 | FmtOpt: LODSB | ||
| 77 | CMP AL,'x' ; hex number | ||
| 78 | JZ FmtX | ||
| 79 | CMP AL,'c' ; single character | ||
| 80 | JZ FmtC | ||
| 81 | CMP AL,'s' ; offset string | ||
| 82 | JZ FmtSoff | ||
| 83 | CMP AL,'S' ; segmented string | ||
| 84 | JZ FmtSseg | ||
| 85 | CMP AL,'p' | ||
| 86 | JZ FmtUPID | ||
| 87 | JMP FmtOut | ||
| 88 | FmtX: | ||
| 89 | Call FMTGetArg | ||
| 90 | MOV BX,AX | ||
| 91 | CALL MNUM | ||
| 92 | JMP FmtLoop | ||
| 93 | FmtC: | ||
| 94 | Call FmtGetArg | ||
| 95 | CALL Out | ||
| 96 | JMP FmtLoop | ||
| 97 | FmtSoff: | ||
| 98 | SaveReg <SI> | ||
| 99 | Call FmtGetArg | ||
| 100 | MOV SI,AX | ||
| 101 | CALL fmtsout | ||
| 102 | RestoreReg <SI> | ||
| 103 | JMP FmtLoop | ||
| 104 | FmtSSeg: | ||
| 105 | SaveReg <DS,SI> | ||
| 106 | CALL FMTGetArg | ||
| 107 | MOV DS,AX | ||
| 108 | CALL FMTGetArg | ||
| 109 | MOV SI,AX | ||
| 110 | CALL fmtsout | ||
| 111 | RestoreReg <SI,DS> | ||
| 112 | JMP FmtLoop | ||
| 113 | FmtUPID: | ||
| 114 | SaveReg <DS> | ||
| 115 | MOV BX,0 | ||
| 116 | MOV DS,BX | ||
| 117 | MOV DS,DS:[82h] | ||
| 118 | ASSUME DS:DOSGroup | ||
| 119 | MOV BX,User_ID | ||
| 120 | CALL MNUM | ||
| 121 | MOV AL,':' | ||
| 122 | CALL OUT | ||
| 123 | MOV BX,Proc_ID | ||
| 124 | CALL MNUM | ||
| 125 | RestoreReg <DS> | ||
| 126 | Assume DS:NOTHING | ||
| 127 | JMP FmtLoop | ||
| 128 | EndProc PFMT | ||
| 129 | |||
| 130 | Procedure FMTGetArg,NEAR | ||
| 131 | MOV AX,[BP] | ||
| 132 | SUB BP,2 | ||
| 133 | return | ||
| 134 | EndProc FMTGetArg | ||
| 135 | |||
| 136 | Procedure FmtSOut,NEAR | ||
| 137 | LODSB | ||
| 138 | OR AL,AL | ||
| 139 | retz | ||
| 140 | CALL OUT | ||
| 141 | JMP FmtSOut | ||
| 142 | EndProc FMTSout | ||
| 143 | |||
| 144 | ; | ||
| 145 | ; MOut - output a message via INT 29h | ||
| 146 | ; Inputs: BX points to bytes to output relative to CS | ||
| 147 | ; Outputs: message | ||
| 148 | ; Registers modified: BX | ||
| 149 | Procedure MOut,Near | ||
| 150 | ASSUME DS:NOTHING,SS:NOTHING,ES:NOTHING | ||
| 151 | PUSHF | ||
| 152 | SaveReg <DS,SI,AX> | ||
| 153 | PUSH CS | ||
| 154 | POP DS | ||
| 155 | MOV SI,BX | ||
| 156 | Call FMTSout | ||
| 157 | RestoreReg <AX,SI,DS> | ||
| 158 | POPF | ||
| 159 | return | ||
| 160 | EndProc MOut | ||
| 161 | |||
| 162 | ; MNum - output a number in BX | ||
| 163 | ; Inputs: BX contains a number | ||
| 164 | ; Outputs: number in hex appears on screen | ||
| 165 | ; Registers modified: BX | ||
| 166 | |||
| 167 | Procedure MNum,NEAR | ||
| 168 | ASSUME DS:NOTHING,ES:NOTHING,SS:NOTHING | ||
| 169 | PUSHF | ||
| 170 | SaveReg <ES,DI,AX,BX,CX,SI,DS> | ||
| 171 | PUSH SS | ||
| 172 | POP ES | ||
| 173 | SUB SP,6 | ||
| 174 | MOV DI,SP ; p = MNumBuf; | ||
| 175 | SaveReg <DI> | ||
| 176 | MOV CX,4 ; for (i=0; i < 4; i++) | ||
| 177 | DLoop: SaveReg <CX> | ||
| 178 | MOV CX,4 ; rotate(n, 4); | ||
| 179 | ROL BX,CL | ||
| 180 | RestoreReg <CX> | ||
| 181 | MOV AL,BL | ||
| 182 | AND AL,0Fh | ||
| 183 | ADD AL,'0' | ||
| 184 | CMP AL,'9' | ||
| 185 | JBE Nok | ||
| 186 | ADD AL,'A'-'0'-10 | ||
| 187 | Nok: STOSB ; *p++ = "0123456789ABCDEF"[n]; | ||
| 188 | LOOP DLoop | ||
| 189 | XOR AL,AL | ||
| 190 | STOSB ; *p++ = 0; | ||
| 191 | RestoreReg <SI> | ||
| 192 | PUSH ES | ||
| 193 | POP DS | ||
| 194 | CALL FMTSOUT ; mout (mNumBuf); | ||
| 195 | ADD SP,6 | ||
| 196 | RestoreReg <DS,SI,CX,BX,AX,DI,ES> | ||
| 197 | POPF | ||
| 198 | return | ||
| 199 | EndProc MNum | ||