There have been a few versions of the utility imd2raw.c floating around
that will take Dave Dunfield's ImageDisk-created images (i.e. an .IMD file)
and make a linear binary image devoid of any metadata. This is similar to
the function of Dave's IMDU.COM program's /b switch.
I've corrected a problem with the assumption that all imd2raw.c descendants
to date have made: sectors that have a skew (i.e. not 1-1 interleaved)
weren't linearized correctly. The skewed sectors need to be written out in
"sorted" order, which is not necessarily captured/physical order. This is
easily verified by comparing output from "IMDU /b" to earlier imd2raw
outputs on any .IMD that has a sector skew that isn't 1, 2, 3 [...].
It's up on github here:
https://github.com/RetroFloppy/imd2raw
Hello,
I'm an employee with the National radio astronomy observatory here in Socorro New Mexico.
As part of our NGVLA upgrades, we are seeking to get rid of old data tapes from the tape reel days of Computing. These contain things such as the boot loaders, OS, specific collection programs and antenna movement programs.
I personally would hate to see these just wind up in the literal dumpster and would like to see them sent out to a museum or an archiving body that can preserve them and keep them safe as a dynamic part of history.
If anyone is interested or knows someone who would be interested in the VLAs data tape library please let me know.
V/R
Danielle Werts
Front end engineer
VLA Socorro New Mexico
One of the greatest joys of classic computing was running what you wanted
on your own computer. What has happened in the intervening years? Have
‘software walls’ created a computing environment that benefits software
gate-keepers(owners of computing technology) by monopolizing creativity,
freedom to program and establishing a defacto ‘true ownership’. Will the
future be this or will it be more like the earliest years of
microcomputing?
Murray 🙂
Can someone explain how the Intel 8008 (yes, the 8008, NOT the 8080!)
handled saving and restoring the flags during an interrupt?
The 8008 has four flag bits - CZS&P - but there doesn't seem to be any
explicit equivalent to the PSW register nor any "PUSH PSW" or "POP PSW" type
instructions. Other than testing the flag bits with the JUMP/CALL/RET
instructions there doesn't seem to be any way to access them.
Interrupts work pretty much like the 8080 - during the interrupt response
the peripheral forces an instruction onto the bus, typically an RST opcode
but in theory it could be anything. RST and CALL however only appear to
save the PC on the internal stack, and RET only restores the PC. So how do
you save and restore the flag bits?
It seems like interrupts would be pretty much useless without this, so I
must be missing something.
Thanks,
Hey all -
I came across a big box of 12 of these disks which my dad acquired through
work back in the 70s, and squirreled them away in the attic after they had
copied the data. 4 of them have a broken metal access door. I opened one of
the broken ones (in a clean of an environment as possible) to see what was
going on inside. It looks like the door is held on by plastic divets that
have broken off. They might be able to be repaired with small screws. I
have no idea if these are functional or not. I am offering them up for free
for anyone that can use them. I'm willing to ship or you pick up in San
Diego.
Here is a link to photos of them:
https://drive.google.com/drive/folders/1wnzqjAtiq44MGU-wDJR-AQdzu-Mkyii8?us…
-Kurt
To use Greaseweazle with a 640kB drive (5.25, 80 track, DSDD) use the
acorn.adfs.640 definition (diskdefs); it works like a charm ! More here:
https://computarium.lcd.lu/literature/COMPUTARIUM_CREW/MASSEN/HANDLING_VINT…
Francis
PS: I am looking for a Kermit version usable with my P2000C (it is the
2010-1 model, very similar to the 2012); everything I tried until now did
not work correctly...
I didn’t see anyone post this clever way to save and restore flags in interrupt for the 8008.
This is from https://stevemorse.org/8086history/8086history.pdf
APPENDIX 1 SAVING AND RESTORING FLAGS IN THE 8008
Interrupt routines must leave all processor flags and registers unaltered so as not to contaminate the processing that was interrupted. This is most simply done by having the interrupt routine save all flags and registers on entry and restore them prior to exiting.
The 8008, unlike its successors, has no instruction for directly saving or restoring flags.
Thus 8008 interrupt routines that alter flags (practically every routine does) must conditionally test each flag to obtain its value and then save that value.
Since there are no instructions for directly setting or clearing flags, the flag values must be restored by
executing code that will put the flags in the saved state.
The 8008 flags can be restored very efficiently if they are saved in the following format in a byte in memory.
Most significant bit = bit 7
bit 7 = original value of CARRY
bit 6 = original value of SIGN
bit 5 = original value of SIGN
bit 4 = 0
bit 3 = 0
bit 2 = complement of original value of ZERO
bit 1 = complement of original value of ZERO
bit 0 = complement of original value of PARITY
With the information saved in the above format in a byte called FLAGS, the following two instructions will restore all the saved flag values:
LDA FLAGS ;load saved flags into accumulator
ADD A ;add the accumulator to itself
This instruction sequence loads the saved flags into the accumulator and then doubles the value, thereby moving each bit one position to the left.
This causes each flag to be set to its original value, for the following reasons:
The original value of the CARRY flag, being in the leftmost bit, will be moved out of the accumulator and wind up in the CARRY flag.
The original value of the SIGN flag, being in bit 6, will wind up in bit 7 and will become
the sign of the result.
The new value of the SIGN flag will reflect this sign.
The complement of the original value of the PARITY flag will wind up in bit 1, and it alone will determine the parity of the result (all other bits in the result are paired up and have no net effect on parity).
The new setting of the PARITY flag will be the complement of this bit (the flag denotes even parity) and therefore will take on the original value of the PARITY flag.
Whenever the ZERO flag is 1, the SIGN flag must be 0 (zero is a positive two's- complement number) and the PARITY flag must be 1 (zero has even parity). Thus an original ZERO flag value of 1 will cause all bits of FLAGS, with the possible exception of bit 7, to be 0. After the ADD instruction is executed, all bits of the result will be 0 and the new value of the ZERO flag will therefore be 1.
An original ZERO flag value of 0 will cause two bits in FLAGS to be 1 and will wind up
in the result as well. The new value of the ZERO flag will therefore be 0.
The above algorithm relies on the fact that flag values are always consistent, i.e., that the
SIGN flag cannot be a 1 when the ZERO flag is a 1.
This is always true in the 8008, since the flags come up in a consistent state whenever the processor is reset and flags can only be modified by instructions which always leave the flags in a consistent state.
The 8080 and its derivatives allow the programmer to modify the flags in an arbitrary manner by popping a value of his choice off the stack and into the flags. Thus the above algorithm will not work on those processors.
A code sequence for saving the flags in the required format is as follows:
MVI A,0 ; move zero in accumulator
JNC L1 ; jump if CARRY not set
ORA 80H ; OR accumulator with 80 hex (set bit 7)
L1: JZ L3 ; jump if ZERO set (and SIGN not set and PARITY set)
ORA 06H ; OR accumulator with 06 hex (set bits 1 and 2)
JM L2 ; jump if negative (SIGN set)
ORA 60H ; OR accumulator with 60 hex (set bits 5 and 6)
L2: JPE L3 ; jump if parity even (PARITY set)
ORA 01H ; OR accumulator with 01 hex (set bit 0)
L3: STA FLAGS ; store accumulator in FLAGS