You don't read from port 70h, you write to port 70h and then read (write) to port 71h, I believe. What do you write? That link Keith gave you:
http://www.nondot.org/sabre/os/files/MiscHW/RealtimeClockFAQ.txtruns it down as well as anything I've seen - better! Some ports work this way, and some don't... They call 'em "registers" which might be confusing. Think of 'em as "sub-ports". You write the register number to one port, and read/write the "answer" to the register selected in the next (usually?) port. Sometimes there's a separate "status" port that you have to check for "not busy" or "buffer empty" or such. You may need to check for "update in progress" before you read time/date - apparently that's "status register 0Ah", bit 7. For a simple experiment, try something like...
mov dx, 70h
top:
mov al, 0 ; current second "register"
out dx, al
inc dx ; port 71h
in al, dx
call show_al_as_hex ; you provide
dec dx ; back to port 70h
jmp top
See if it "updates" every second, and what kind of garbage it hands you when "update in progress" is happening. Break out of it with control-alt-delete or pull the plug, whatever.
If you need to avoid "update in progress", you may want to loop until "update in progress" is true (bit 7 set), then loop until bit 7 is clear, then go read the clock (so you don't start just before "update in progress" goes off). May not be a problem.
As to the format, apparently BCD (Binary Coded Decimal) is the default - one decimal digit per nibble - display it as if it were hex (you just never see 'A' - 'F'). You can apparently change this to "binary" with some of the upper "registers"...
I wouldn't write anything to port 71h until you're sure you've got "read" down pat.
I don't think I've ever done anything with the clock with ports, but I think that's how it goes... Let us know!
Best,
Frank