1 ; **************************************************************************** 2 ; prntest.s (/dev/lpr printer test) - by Erdogan Tan - 13/06/2022 3 ; ---------------------------------------------------------------------------- 4 ; Retro UNIX 386 v1.2 - /dev/lpt -- printer test (LPT1) 5 ; 6 ; [ Last Modification: 13/06/2022 ] 7 ; 8 ; **************************************************************************** 9 10 ; UNIX v1 system calls 11 _rele equ 0 12 _exit equ 1 13 _fork equ 2 14 _read equ 3 15 _write equ 4 16 _open equ 5 17 _close equ 6 18 _wait equ 7 19 _creat equ 8 20 _link equ 9 21 _unlink equ 10 22 _exec equ 11 23 _chdir equ 12 24 _time equ 13 25 _mkdir equ 14 26 _chmod equ 15 27 _chown equ 16 28 _break equ 17 29 _stat equ 18 30 _seek equ 19 31 _tell equ 20 32 _mount equ 21 33 _umount equ 22 34 _setuid equ 23 35 _getuid equ 24 36 _stime equ 25 37 _quit equ 26 38 _intr equ 27 39 _fstat equ 28 40 _emt equ 29 41 _mdate equ 30 42 _stty equ 31 43 _gtty equ 32 44 _ilgins equ 33 45 _sleep equ 34 ; Retro UNIX 8086 v1 feature only ! 46 _msg equ 35 ; Retro UNIX 386 v1 feature only ! 47 _geterr equ 36 ; Retro UNIX 386 v1 feature only ! 48 ; 12/01/2022 - Retro UNIX 386 v1.2 49 ; Retro UNIX 386 v2 system calls 50 _setgid equ 37 51 _getgid equ 38 52 _sysver equ 39 ; (get) Retro Unix 386 version 53 54 ;;; 55 ESCKey equ 1Bh 56 EnterKey equ 0Dh 57 58 %macro sys 1-4 59 ; 03/09/2015 60 ; 13/04/2015 61 ; Retro UNIX 386 v1 system call. 62 %if %0 >= 2 63 mov ebx, %2 64 %if %0 >= 3 65 mov ecx, %3 66 %if %0 = 4 67 mov edx, %4 68 %endif 69 %endif 70 %endif 71 mov eax, %1 72 int 30h 73 %endmacro 74 75 ; Retro UNIX 386 v1 system call format: 76 ; sys systemcall (eax) , , 77 78 [BITS 32] ; 32-bit intructions (for 80386 protected mode) 79 80 [ORG 0] 81 82 START_CODE: 83 ; 13/06/2022 84 00000000 59 pop ecx ; ecx = number of arguments 85 ; 86 00000001 58 pop eax ; eax = argument 0 = executable file name 87 ; 88 00000002 BD[1B010000] mov ebp, program_msg 89 ; 90 ;cmp ecx, 3 91 00000007 80F902 cmp cl, 2 92 0000000A 7251 jb short prntst1 93 94 0000000C 5F pop edi ; argument 1 = txt file name 95 96 sys _stat, edi, stbuf 59 <1> 60 <1> 61 <1> 62 <1> %if %0 >= 2 63 0000000D 89FB <1> mov ebx, %2 64 <1> %if %0 >= 3 65 0000000F B9[E4010000] <1> mov ecx, %3 66 <1> %if %0 = 4 67 <1> mov edx, %4 68 <1> %endif 69 <1> %endif 70 <1> %endif 71 00000014 B812000000 <1> mov eax, %1 72 00000019 CD30 <1> int 30h 97 0000001B 7236 jc short prntst0 98 99 0000001D 8B35[EE010000] mov esi, [stbuf+10] ; file size 100 101 sys _open, edi, 0 ; open for read 59 <1> 60 <1> 61 <1> 62 <1> %if %0 >= 2 63 00000023 89FB <1> mov ebx, %2 64 <1> %if %0 >= 3 65 00000025 B900000000 <1> mov ecx, %3 66 <1> %if %0 = 4 67 <1> mov edx, %4 68 <1> %endif 69 <1> %endif 70 <1> %endif 71 0000002A B805000000 <1> mov eax, %1 72 0000002F CD30 <1> int 30h 102 00000031 7220 jc short prntst0 103 104 ;sys _read, eax, fbuf, 1024 105 106 sys _read, eax, fbuf, esi 59 <1> 60 <1> 61 <1> 62 <1> %if %0 >= 2 63 00000033 89C3 <1> mov ebx, %2 64 <1> %if %0 >= 3 65 00000035 B9[2C020000] <1> mov ecx, %3 66 <1> %if %0 = 4 67 0000003A 89F2 <1> mov edx, %4 68 <1> %endif 69 <1> %endif 70 <1> %endif 71 0000003C B803000000 <1> mov eax, %1 72 00000041 CD30 <1> int 30h 107 108 00000043 833D[2C020000]00 cmp dword [fbuf], 0 109 0000004A 7611 jna short prntst1 110 111 0000004C BD[2C020000] mov ebp, fbuf 112 00000051 EB0A jmp short prntst1 113 prntst0: 114 00000053 B8[A6010000] mov eax, f_not_found 115 00000058 E89B000000 call print_msg 116 prntst1: 117 0000005D 31FF xor edi, edi 118 sys _open, lpt1, 1 ; open /dev/lpr for write 59 <1> 60 <1> 61 <1> 62 <1> %if %0 >= 2 63 0000005F BB[12010000] <1> mov ebx, %2 64 <1> %if %0 >= 3 65 00000064 B901000000 <1> mov ecx, %3 66 <1> %if %0 = 4 67 <1> mov edx, %4 68 <1> %endif 69 <1> %endif 70 <1> %endif 71 00000069 B805000000 <1> mov eax, %1 72 0000006E CD30 <1> int 30h 119 00000070 7320 jnc short prntst2 120 121 prntst_err: 122 00000072 B8[7C010000] mov eax, err_msg 123 pr_ok_exit: 124 00000077 E87C000000 call print_msg 125 0000007C 21FF and edi, edi ; file descriptor 126 0000007E 7409 jz short hang 127 sys _close, edi 59 <1> 60 <1> 61 <1> 62 <1> %if %0 >= 2 63 00000080 89FB <1> mov ebx, %2 64 <1> %if %0 >= 3 65 <1> mov ecx, %3 66 <1> %if %0 = 4 67 <1> mov edx, %4 68 <1> %endif 69 <1> %endif 70 <1> %endif 71 00000082 B806000000 <1> mov eax, %1 72 00000087 CD30 <1> int 30h 128 hang: 129 sys _exit 59 <1> 60 <1> 61 <1> 62 <1> %if %0 >= 2 63 <1> mov ebx, %2 64 <1> %if %0 >= 3 65 <1> mov ecx, %3 66 <1> %if %0 = 4 67 <1> mov edx, %4 68 <1> %endif 69 <1> %endif 70 <1> %endif 71 00000089 B801000000 <1> mov eax, %1 72 0000008E CD30 <1> int 30h 130 00000090 EBF7 jmp short hang 131 prntst2: 132 00000092 89C7 mov edi, eax ; /dev/lpr file descriptor 133 134 00000094 81FD[1B010000] cmp ebp, program_msg 135 0000009A 753B jne short prntst4 136 137 0000009C B8[BB010000] mov eax, p_p_msg 138 000000A1 E852000000 call print_msg 139 140 ; print program message on paper (on LPT1) 141 sys _write, edi, program_msg, size_pmsg 59 <1> 60 <1> 61 <1> 62 <1> %if %0 >= 2 63 000000A6 89FB <1> mov ebx, %2 64 <1> %if %0 >= 3 65 000000A8 B9[1B010000] <1> mov ecx, %3 66 <1> %if %0 = 4 67 000000AD BA40000000 <1> mov edx, %4 68 <1> %endif 69 <1> %endif 70 <1> %endif 71 000000B2 B804000000 <1> mov eax, %1 72 000000B7 CD30 <1> int 30h 142 000000B9 72B7 jc short prntst_err 143 144 sys _write, edi, usage_msg, size_umsg 59 <1> 60 <1> 61 <1> 62 <1> %if %0 >= 2 63 000000BB 89FB <1> mov ebx, %2 64 <1> %if %0 >= 3 65 000000BD B9[5C010000] <1> mov ecx, %3 66 <1> %if %0 = 4 67 000000C2 BA1F000000 <1> mov edx, %4 68 <1> %endif 69 <1> %endif 70 <1> %endif 71 000000C7 B804000000 <1> mov eax, %1 72 000000CC CD30 <1> int 30h 145 000000CE 72A2 jc short prntst_err 146 prntst3: 147 000000D0 B8[9F010000] mov eax, ok_msg 148 000000D5 EBA0 jmp short pr_ok_exit 149 150 prntst4: 151 000000D7 B8[90010000] mov eax, p_f_msg 152 000000DC E817000000 call print_msg 153 154 ; mov ecx, bss_end-fbuf ; 1024 155 ; mov esi, fbuf 156 ; sub edx, edx 157 ;prntst5: 158 ; lodsb 159 ; or al, al 160 ; jz short prntst6 161 ; inc edx 162 ; loop prntst5 163 ;prntst6: 164 ;;edx = character count to be printed 165 ;sys _write, edi, fbuf 166 sys _write, edi, fbuf, esi ; esi = file size 59 <1> 60 <1> 61 <1> 62 <1> %if %0 >= 2 63 000000E1 89FB <1> mov ebx, %2 64 <1> %if %0 >= 3 65 000000E3 B9[2C020000] <1> mov ecx, %3 66 <1> %if %0 = 4 67 000000E8 89F2 <1> mov edx, %4 68 <1> %endif 69 <1> %endif 70 <1> %endif 71 000000EA B804000000 <1> mov eax, %1 72 000000EF CD30 <1> int 30h 167 000000F1 73DD jnc short prntst3 168 000000F3 E97AFFFFFF jmp prntst_err 169 170 ;----------------------------------------------------------------- 171 172 print_msg: 173 ; 08/05/2022 174 ; eax = asciiz string address 175 000000F8 89C2 mov edx, eax 176 000000FA 4A dec edx 177 nextchr: 178 000000FB 42 inc edx 179 000000FC 803A00 cmp byte [edx], 0 180 000000FF 77FA ja short nextchr 181 ;cmp [edx], 0Dh 182 ;ja short nextchr 183 00000101 29C2 sub edx, eax 184 ; edx = asciiz string length 185 ; 186 sys _write, 1, eax 59 <1> 60 <1> 61 <1> 62 <1> %if %0 >= 2 63 00000103 BB01000000 <1> mov ebx, %2 64 <1> %if %0 >= 3 65 00000108 89C1 <1> mov ecx, %3 66 <1> %if %0 = 4 67 <1> mov edx, %4 68 <1> %endif 69 <1> %endif 70 <1> %endif 71 0000010A B804000000 <1> mov eax, %1 72 0000010F CD30 <1> int 30h 187 ; 188 00000111 C3 retn 189 190 ;----------------------------------------------------------------- 191 ; data - initialized data 192 ;----------------------------------------------------------------- 193 194 lpt1: 195 00000112 2F6465762F6C707200 db '/dev/lpr', 0 196 197 program_msg: 198 0000011B 0D0A db 0Dh, 0Ah 199 0000011D 526574726F20554E49- db 'Retro UNIX 386 v1.2 PRINTER Test by Erdogan TAN - 13/06/2022' 199 00000126 58203338362076312E- 199 0000012F 32205052494E544552- 199 00000138 205465737420627920- 199 00000141 4572646F67616E2054- 199 0000014A 414E202D2031332F30- 199 00000153 362F32303232 200 00000159 0D0A00 db 0Dh, 0Ah, 0 201 usage_msg: 202 0000015C 0D0A db 0Dh, 0Ah 203 0000015E 55736167653A207072- db 'Usage: prntest textfilename' 203 00000167 6E7465737420746578- 203 00000170 7466696C656E616D65 204 nextline: 205 00000179 0D0A00 db 0Dh, 0Ah, 0 206 207 size_pmsg equ usage_msg-(program_msg+1) 208 209 err_msg: 210 0000017C 0D0A db 0Dh, 0Ah 211 0000017E 5072696E7465722045- db "Printer Error !" 211 00000187 72726F722021 212 0000018D 0D0A00 db 0Dh, 0Ah, 0 213 214 size_umsg equ err_msg-(usage_msg+1) 215 216 p_f_msg: 217 00000190 0D0A db 0Dh, 0Ah 218 00000192 5072696E74696E6720- db "Printing .. " 218 0000019B 2E2E20 219 0000019E 00 db 0 220 ok_msg: 221 ;db 0Dh, 0Ah 222 0000019F 4F4B2E20 db 'OK. ' 223 000001A3 0D0A00 db 0Dh, 0Ah, 0 224 f_not_found: 225 000001A6 0D0A db 0Dh, 0Ah 226 000001A8 46696C65206E6F7420- db "File not found !" 226 000001B1 666F756E642021 227 000001B8 0D0A00 db 0Dh, 0Ah, 0 228 p_p_msg: 229 000001BB 0D0A db 0Dh, 0Ah 230 000001BD 5072696E74696E6720- db "Printing program message on LPT1 .. " 230 000001C6 70726F6772616D206D- 230 000001CF 657373616765206F6E- 230 000001D8 204C505431202E2E20 231 000001E1 00 db 0 232 233 ;----------------------------------------------------------------- 234 ; bss - uninitialized data 235 ;----------------------------------------------------------------- 236 237 000001E2 90 align 4 238 239 bss_start: 240 241 ABSOLUTE bss_start 242 243 000001E4 stbuf: resb 66 ; stat buffer 244 00000226 ???????????? resb 6 245 246 0000022C fbuf: resb 1024 ; file buffer 247 248 bss_end: 249 250 ;-----------------------------------------------------------------