include asm.inc public syshard extrn isems:proc, ismouse:proc, isherc:proc extrn floppies:proc, floppytype:proc extrn getkey:proc, getcrt:proc extrn getcpu:proc, mathchip:proc extrn wclear:proc, wframe:proc, tprint:proc .data notinstalled db 'Not installed',0 f360 db '360 kb drive',0 f12 db '1.2 Mb drive',0 f720 db '720 kb drive',0 f14 db '1.4 Mb drive',0 drive_table dw notinstalled dw f360 dw f12 dw f720 dw f14 i8086 db '8086 or 8088',0 i186 db '80186 or 80188',0 i286 db 'i286',0 i386 db '386',0 i486 db '486',0 cpu_table dw i8086 dw i186 dw i286 dw i386 dw i486 no87 db 'none',0 mc8087 db '8087',0 mc287 db '287',0 mc387 db '387',0 mc487 db '487',0 mathchip_table dw no87 dw mc8087 dw mc287 dw mc387 dw mc487 ; window corner data r0 dw 3 c0 dw 15 r1 dw 3+number_of_labels+1 c1 dw 54 window_color db 0Ch ; bright red, black background text_color db 07h cga db 'CGA',0 mda db 'Monochrome text',0 ega db 'EGA',0 mcga db 'MCGA',0 vga db 'VGA',0 Herc db 'Hercules',0 RamFont db 'Hercules RAMFont',0 InColor db 'Hercules InColor',0 screen_table dw cga dw mda dw ega dw mcga dw vga dw herc dw ramfont dw incolor ; labels labels db 'CPU: ',0 size_of_label equ $-labels db '80x87: ',0 ; db 'RAM: ',0 db 'EMS: ',0 db 'Drive A: ',0 db 'Drive B: ',0 db 'Mouse: ',0 db 'Screen: ',0 number_of_labels equ ($-labels)/size_of_label isinstalled db 'installed and active',0 mouse_installed db ' buttons',0 .code syshard proc ; clear a window for the system info lea bx,r0 mov ah,window_color call wclear mov al,-1 ; double-lined window frame call wframe ; print labels at left side of window mov cx,number_of_labels mov dh,byte ptr r0 mov dl,byte ptr c0 inc dl lea si,labels mov ah,text_color label_loop: inc dh call tprint add si,size_of_label loop label_loop ; determine CPU type call getcpu mov bx,ax shl bx,1 mov si,cpu_table[bx] mov dh,byte ptr r0 inc dh mov dl,byte ptr c0 add dl,size_of_label mov ah,text_color call tprint ; math coprocessor call mathchip mov bx,ax shl bx,1 mov si,mathchip_table[bx] inc dh mov ah,text_color call tprint ; installed RAM ; I haven't done this yet ; inc dh ; EMS memory inc dh call isems lea si,notinstalled jc print_ems lea si,isinstalled print_ems: mov ah,text_color call tprint ; floppy drive types mov cl,0 ; start with drive A: next_floppy: push dx ; save screen coordinates mov dl,cl ; drive number call floppytype pop dx ; screen coordinates or ax,ax ; AX = 0 if bad drive number jz no_more_floppies inc dh ; next row on screen mov bx,ax ; drive ID shl bx,1 ; convert to offset mov si,drive_table[bx] mov ah,text_color call tprint inc cl ; next drive jmp next_floppy no_more_floppies: ; Mouse inc dh call ismouse lea si,notinstalled or ax,ax jz print_mouse lea si,mouse_installed add al,'0' ; convert to ASCII mov [si],al print_mouse: mov ah,text_color call tprint ; Screen inc dh call getcrt inc ax mov bx,ax cmp ax,129 jb print_screen mov bx,5 je print_screen cmp ax,209 ; InColor? inc bx jb print_screen inc bx print_screen: shl bx,1 mov si,screen_table[bx] mov ah,text_color call tprint call getkey ret syshard endp end