root/modules/ver.asm

Revision 195aa5ee343ca96920b04622f35c27605e050e07, 9.8 KB (checked in by Gene Cumm <gene.cumm@…>, 19 months ago)

ver.com: Update some of how DRMK is handled

  • Property mode set to 100644
Line 
1; ****************************************************************************
2;
3;  ver.asm
4;
5;  A COMBOOT/DOS COM program to display the version of the system
6; (Syslinux, DOS, or DRMK)
7;
8;   Copyright (C) 2009-2010  Gene Cumm
9;
10;  This program is free software; you can redistribute it and/or modify
11;  it under the terms of the GNU General Public License as published by
12;  the Free Software Foundation, Inc., 53 Temple Place Ste 330,
13;  Boston MA 02111-1307, USA; either version 2 of the License, or
14;  (at your option) any later version; incorporated herein by reference.
15;
16; ****************************************************************************
17
18; %define DEBUG
19
20                section .text
21                org     0x100
22
23_start:
24                call crlf
25                mov si,info_str
26                call writestr
27                call getdosver
28                call chkprn_dosver
29                jnz .end
30                call chkprn_syslinux
31                call crlf
32.end:
33;               pop ds
34                ret
35
36
37; chkprn_syslinux
38chkprn_syslinux:
39%ifdef DEBUG
40                mov si,may_sysl_str
41                call writestr
42%endif
43                cmp eax,59530000h
44                jne .end
45                cmp ebx,4C530000h
46                jne .end
47                cmp ecx,4E490000h
48                jne .end
49                cmp edx,58550000h
50                jne .end
51.is_syslinux:
52                pushad
53%ifdef DEBUG
54                mov si,is_sysl_str
55                call writestr
56%endif
57.get_sysl_ver:
58                mov ax,0001h
59                int 22h
60; AX=0001h [2.00]       Get Version
61;
62;       Input:  AX      0001h
63;       Output: AX      number of INT 22h API functions available
64;               CH      Syslinux major version number
65;               CL      Syslinux minor version number
66;               DL      Syslinux derivative ID (e.g. 32h = PXELINUX)
67;               ES:SI   Syslinux version string
68;               ES:DI   Syslinux copyright string
69%ifdef DEBUG
70                push si
71                push cs
72                pop ds
73                mov si,gotver_str
74                call writestr
75                pop si
76%endif
77
78.prn_ver_str:
79                mov si,syslban_str
80                call writestr
81                push ds
82                push es
83                pop ds
84                call writestr
85                call crlf
86                pop ds
87.prn_var:
88                cmp dl,31h
89                je .var_sysl
90                cmp dl,32h
91                je .var_pxel
92                cmp dl,33h
93                je .var_isol
94                cmp dl,34h
95                je .var_extl
96                jmp .var_unk
97.var_sysl:
98                mov si,sysl_str
99                call writestr
100                jmp .prn_lnxsp
101.var_pxel:
102                mov si,pxel_str
103                call writestr
104                jmp .prn_lnxsp
105.var_isol:
106                mov si,isol_str
107                call writestr
108                jmp .prn_lnxsp
109.var_extl:
110                mov si,extl_str
111                call writestr
112;               jmp .prn_lnxsp
113.prn_lnxsp:
114                mov si,linsp_str
115                call writestr
116                jmp .prn_ver
117.var_unk:
118                mov si,unkvar_str
119                call writestr
120.prn_ver:
121%ifdef DEBUG
122                push si
123                push cs
124                pop ds
125                mov si,prn_ver_str
126                call writestr
127                pop si
128%endif
129.prn_ver_maj:
130                mov al,ch
131                call writedecb
132                mov dl,'.'
133                call writechr_dl
134.prn_ver_min:
135                mov al,cl
136;               cmp al,10
137;               jae .min_wri
138;               mov al,'0'
139;               call writechr
140;               mov al,cl
141; .min_wri:
142;               call writedecb
143                call writedecb2
144
145.end_prn:
146                popad
147.end:
148                ret
149
150; chkprn_dosver Check and print DOS version;
151;       Input   Data from INT21 AH=30h
152;       AH      Major version of DOS or 0
153;       AL      Minor Version
154;       BH      DOS type
155;       BL:CX   24-bit OEM serial number
156;       Return
157;       ZF      Unset if DOS, Set if not DOS (AX=0)
158chkprn_dosver:
159                and ax,ax       ; cmp ax,0
160                jz .end
161.is_dos:
162                push eax
163                push edx
164                push si
165%ifdef DEBUG
166                mov si,is_dos_str
167                call writestr
168                call crlf
169                call prnreg_gp_l
170                call crlf
171%endif
172.var_prn:
173                cmp bh,0
174                je .var_pcdos
175                cmp bh,0FFh
176                je .var_msdos
177                cmp bh,0FDh
178                je .var_freedos
179                cmp bh,0DEh
180                je .var_drmk
181                jmp .var_unk
182.var_pcdos:
183                mov si,pcdos_str
184                call writestr
185                jmp .var_end
186.var_msdos:
187                mov si,msdos_str
188                call writestr
189                jmp .var_end
190.var_freedos:
191                mov si,freedos_str
192                call writestr
193                jmp .var_end
194.var_drmk:
195                mov si,drmk_str
196                call writestr
197                jmp .var_end
198.var_unk:
199                mov si,unkdos_str
200                call writestr
201                mov si,spparen_str
202                call writestr
203                push eax
204                mov al,bh
205                call writehex2
206                pop eax
207                mov si,parensp_str
208                call writestr
209;               jmp .var_end
210.var_end:
211                call prn_dosver_num
212                call crlf
213.subver:
214                pop si
215                pop edx
216                pop eax
217                cmp bh,0FFh
218                je .msdos_ver
219                cmp bh,0DEh
220                jne .end_ver
221.drmk_ver:
222                call getprn_drmkver
223;               jmp .end_ver            ; DRMK returns Extended/True DOS
224.msdos_ver:
225                cmp al,5
226                jb .end_ver
227                call getprn_msdosver
228.end_ver:
229                and ax,ax               ; Unset ZF
230.end:
231                ret
232
233; prn_dosver_num        Print the numerical DOS version
234;       Input   Data from INT21 AH=30h
235;       AH      Major version of DOS or 0
236;       AL      Minor Version
237;       BH      DOS type
238;       BL:CX   24-bit OEM serial number
239prn_dosver_num:
240                push eax
241                push edx
242                push si
243                pushfd
244.vmaj_prn:
245                call writedecb
246;               call writehex2
247                mov dl,'.'
248                call writechr_dl
249.vmin_prn:
250                mov al,ah
251                call writedecb
252;               call writehex2
253.serial:        ; Skip if 0
254                cmp bl,0
255                jne .ser_start
256                cmp cx,0
257                je .end
258.ser_start:
259                mov si,spparen_str
260                call writestr
261                mov si,zerox_str
262                call writestr
263.ser_bl:
264                mov al,bl
265                call writehex2
266.ser_cx:
267                mov ax,cx
268                call writehex4
269.serial_end:
270                mov si,parensp_str
271                call writestr
272.end:
273                popfd
274                pop si
275                pop edx
276                pop eax
277                ret
278
279; getdosver     Get the DOS version
280;       Return  Version or 0 + SYSLINUX message
281;       EAX     Part 1
282;       EBX     Part 2
283;       ECX     Part 3
284;       EDX     Part 4
285getdosver:
286                mov ecx,0
287                mov edx,0
288                mov ebx,0
289                mov eax,3000h
290                int 21h
291                ret
292
293; getmsdosver   Get the Extended MS-DOS version
294;       Returns Version
295;       EAX     Part 1
296;       EBX     Part 2
297;       ECX     Part 3
298;       EDX     Part 4
299getmsdosver:
300                mov ecx,0
301                mov edx,0
302                mov ebx,0
303                mov eax,3306h
304                int 21h
305                ret
306
307; getprn_msdosver
308getprn_msdosver:
309                pushad
310                pushfd
311                call getmsdosver
312%ifdef DEBUG
313                call prnreg_gp_l
314                call crlf
315%endif
316                mov si,dosext_str
317                call writestr
318                mov eax,ebx
319                mov ebx,0
320                mov ecx,edx
321                call prn_dosver_num
322.end:
323                popfd
324                popad
325                ret
326
327; getdrmkver:   Get the DRMK-specifc OS version
328;       Returns Version
329;       AX      OS Version
330;       DX      Patch Version
331getdrmkver:
332                mov ax,4452h
333                int 21h
334                ret
335
336; getdrmkver:   Get the DRMK-specifc Kernel build info
337;       Returns Kernel build info
338;       AX      Kernel build date in DOS 16-bit format
339;       [ES:BX] Kernel private data
340getdrmkbld:
341                mov ax,4458h
342                int 21h
343                ret
344
345; getprn_drmkver: Get/Print DRMK-specific Version info
346getprn_drmkver:
347                pushad
348                pushfd
349.getver:
350                call getdrmkver
351.prnosver:      ; "OS Version"
352                mov si,osver_str
353                call writestr
354                mov si,zerox_str
355                call writestr
356;               mov ax,0
357                call writehex4
358                call crlf
359.prnpatchver:   ; "Patch Version"
360                mov si,patchver_str
361                call writestr
362                mov si,zerox_str
363                call writestr
364                mov ax,dx
365                call writehex4
366                call crlf
367.getbld:
368                call getdrmkbld
369.prnkernbld:    ; "Kernel Build Date"
370                mov si,kernbld_str
371                call writestr
372                call writedate_ax
373                call crlf
374.prnkernprvaddr:
375                mov si,prvdat_str
376                call writestr
377                mov ax,es
378                call writehex4
379                mov dl,':'
380                call writechr_dl
381                mov ax,bx
382                call writehex4
383                call crlf
384%ifdef DEBUG
385.prnkernprv:
386                mov di,[es:bx]
387                mov ax,di
388                call writehex4
389                call crlf
390                mov si,2
391                mov cx,8
392.prnkernprv2:
393                push cx
394                mov cx,8
395.prnkernprv1:
396                mov eax,[es:bx+si]
397                call writehex8
398                cmp cx,1
399                jbe .prnkern0dash
400                mov ax,'-'
401                call writechr
402.prnkern0dash:
403                add si,4
404                sub di,4
405                cmp di,0
406                jbe .prnkernprvend
407                loop .prnkernprv1
408                call crlf
409                pop cx
410                loop .prnkernprv2
411                jmp .end
412.prnkernprvend:
413                pop cx
414%endif
415.end:
416                popfd
417                popad
418                ret
419
420;writedate_ax   Write a date in AX in ISO8601 big endian format
421;       Input
422;       AX      Date in 16-bit DOS format
423; 2006-01-11
424; 0011010 0001 01011
425writedate_ax:
426                pushad
427                pushfd
428                mov dx,ax
429%ifdef DEBUG
430                call writehex4
431                call crlf
432%endif
433.year:
434                shr ax,9
435                add ax,1980
436                call writedecw
437                mov al,'-'
438                call writechr
439                mov ax,dx
440.month:
441                shr ax,5
442                and ax,0Fh
443;               cmp ax,10
444;               jae .month_wri
445;               mov cx,ax
446;               mov ax,'0'
447;               call writechr
448;               mov ax,cx
449; .month_wri:
450;               call writedecb
451                call writedecb2
452                mov al,'-'
453                call writechr
454                mov ax,dx
455.day:
456                and ax,1Fh
457;               cmp ax,10
458;               jae .day_wri
459;               mov cx,ax
460;               mov ax,'0'
461;               call writechr
462;               mov ax,cx
463; .day_wri:
464;               call writedecb
465                call writedecb2
466.end:
467                popfd
468                popad
469                ret
470
471; writechr_dl   Write a character to the console saving AX
472;       Input
473;       DL      character to write
474writechr_dl:
475                push ax
476                mov ah,02h
477                int 21h
478.end:
479                pop ax
480                ret
481
482; writechr_al   Write a character to the console saving AX
483;       Input
484;       AL      character to write
485writechr:
486writechr_al:
487                push dx
488                mov dl,al
489                call writechr_dl
490.end:           pop dx
491                ret
492
493; writedecb[23] Print byte as fixed width
494;       Input
495;       AL      number to write
496writedecb3:
497                pushfd
498                cmp al,100
499                jae .skip
500                push ax
501                mov ax,'0'
502                call writechr
503                pop ax
504.skip:          popfd
505writedecb2:
506                pushfd
507                cmp al,10
508                jae .skip
509                push ax
510                mov ax,'0'
511                call writechr
512                pop ax
513.skip:          popfd
514                call writedecb
515                ret
516
517
518; prnreg_gp_l   Dump GP registers (Long)
519prnreg_gp_l:
520                push eax
521                push si
522                call crlf
523                mov si,sp2_str
524                call writestr
525                mov si,eax_str
526                call writestr
527                call writehex8
528                mov si,sp2_str
529                call writestr
530                mov si,ecx_str
531                call writestr
532                mov eax,ecx
533                call writehex8
534                mov si,sp2_str
535                call writestr
536                mov si,edx_str
537                call writestr
538                mov eax,edx
539                call writehex8
540                mov si,sp2_str
541                call writestr
542                mov si,ebx_str
543                call writestr
544                mov eax,ebx
545                call writehex8
546                call crlf
547                pop si
548                pop eax
549.end:
550                ret
551
552; is_zf
553is_zf:
554                push si
555                jz .true
556.false:
557                mov si,zero_not_str
558                call writestr
559                jmp .end
560.true:
561                mov si,zero_is_str
562                call writestr
563.end:
564                pop si
565                ret
566
567%include "../core/macros.inc"           ; CR/LF
568%include "../core/writestr.inc"         ; String output
569%include "../core/writehex.inc"         ; Hexadecimal output
570%include "../core/writedec.inc"         ; Decimal output
571
572                section .data
573info_str        db 'Ver.com b026', CR, LF, 0
574is_dos_str      db 'Found DOS', CR, LF, 0
575is_sysl_str     db 'Found a Syslinux variant', CR, LF, 0
576is_drmk_str     db 'Found DRMK', CR, LF, 0
577may_sysl_str    db 'Maybe Syslinux variant', CR, LF, 0
578gotver_str      db 'Got the version back', CR, LF, 0
579prn_ver_str     db 'Printing version number', CR, LF, 0
580syslban_str     db 'Syslinux banner: ',0
581sysl_str        db 'SYS', 0
582pxel_str        db 'PXE', 0
583isol_str        db 'ISO', 0
584extl_str        db 'EXT', 0
585linsp_str       db 'LINUX ', 0
586unkvar_str      db 'Unkown-Variant ', 0
587pcdos_str       db 'PC-DOS ', 0
588msdos_str       db 'MS-DOS ', 0
589freedos_str     db 'FreeDOS ', 0
590unkdos_str      db 'Unknown-DOS ', 0
591drmk_str        db 'DRMK ', 0
592dosext_str      db '  Extended DOS version: ', 0
593osver_str       db '  OS Version: ', 0
594patchver_str    db '  Patch Version: ', 0
595kernbld_str     db '  Kernel Build Date: ', 0
596prvdat_str      db '  Private Data Ptr: ', 0
597spparen_str     db ' (', 0
598zerox_str       db '0x', 0
599parensp_str     db ') ', 0
600eax_str         db 'EAX=', 0
601ebx_str         db 'EBX=', 0
602ecx_str         db 'ECX=', 0
603edx_str         db 'EDX=', 0
604sp2_str         db '  ', 0
605zero_not_str    db ' NOT_Zero ',0
606zero_is_str     db ' IS_Zero ',0
Note: See TracBrowser for help on using the browser.