; ; Program to print amount of memory available. Uses max-alloc ; field in PSP and segment of PSP to determine amount of memory ; free. ; ; Note: this is a .com file. To assemble a version, use: ; ; masm memsiz; ; link memsiz; ; exe2bin memsiz.exe memsiz.com ; del memsiz.exe ; dos equ 21h ;equates for system calls outc equ 02h ;output a character print equ 09h ;output a string term equ 4c00h ;termination (exit code = 0) cr equ 0dh ;carrage-return lf equ 0ah ;line-feed code segment assume cs:code, ds:code, es:code org 2h ;place max segment located in psp maxseg dw ? ;filled in by loader org 100h ;place for com file main proc near mov ax,maxseg ;load max segment into ax mov bx,ds ;load psp segment into bx sub ax,bx ;find out available paragraphs mov bx,16 ;set to multiply by 16 mul bx ;I know, I know, a shift is faster... ; ; number of bytes is in dx:ax. Print this out and exit. ; push dx ;save number push ax ; mov dx,offset mesg ;point to message mov ah,print ;set to print it int 21h ;do it pop ax ;restore number pop dx ; call ltoa ;output dx:ax to console mov dx,offset bmesg ;point to second message mov ah,print ;print it int dos ; mov ax,term ;and exit int dos ;bye-bye main endp ltoa proc near mov bx,1000 ;set to split number div bx ;divide number push dx ;save remainder call itoa ;output as integer pop ax ;get second half call itoa ;output it ret ;all done ltoa endp ; ; convert number in ax to decimal. Number in ax is less ; than one-thousand. ; itoa proc near mov bx,offset tens ;point to powers of ten table mov cx,3 ;move count of characters to output zloop: mov dx,0 ;clear dx div word ptr [bx] ;divide dx:ax by power of ten push dx ;save remainder call decout ;output decimal number pop ax ;restore remainder to ax inc bx ;point to next power of ten inc bx ; loop zloop ;loop until zero ret ;return itoa endp ; ; decout - output decimal in al to console ; decout proc near cmp al,0 ;is it a zero? jnz ok ;nope, output it cmp outzero,0 ;have we output something else? jz nope ;no, suppress leading zeros ok: inc outzero ;set output true add al,'0' ;make a 00h a '0' mov dl,al ;move to dl mov ah,outc ;set to output character int dos ;do it nope: ret ;return decout endp mesg db 'Available memory = $' bmesg db ' bytes', cr, lf, '$' outzero db 0 tens dw 100 ;power of tens table dw 10 ; dw 1 code ends end main