• Please review our updated Terms and Rules here

OSI Ohio Scientific 8K BASIC Copyright 1976 Microsoft on Paper Tape

tgarnold

Experienced Member
Joined
Jan 31, 2022
Messages
58
I have a paper tape copy of OSI 8K BASIC. The original owner had a 400 series system. I sold the boards to a collector. I still have the original manual. I have had this paper tape for years and never unrolled it far enough to reveal the Copyright 1976 MICROSOFT. I still have a dozen or so other OSI paper tapes and some reels and cassettes. Anyone have any insight into what this really is? It seems plausible this was made and distributed by Microsoft as a Master for OSI. I'm not sure how the original owner got the Master, but he purchased the OSI 400 in 1976 as well as an OSI 300. Based on the order of the leader OSI 8K BASIC COPYRIGHT 1976 MICROSOFT it seems more likely to be from Microsoft than from OSI. Here is a video of the paper tape.

1976 Microsoft BASIC

It would be interesting to review the actual software to find out if it is the Altair version or a 6502 version. The Altair 8080 version was copyright 1976. I've included some closeups of the handwriting on the side. Let me know if you want any other photos. Does anyone know any more about this?

20260505_163535942_iOS.jpg20260505_163541100_iOS.jpg
 
eh... wouldn't just be easier to unroll the tape a bit and copy the few first ten or so bytes, then see what machine code it goes with?
 
I can do that. I'm not familiar with how any of it is formatted. If the machine code is identifiable in 10 or so bytes I can post pictures.
 
Paper tape was used as a distribution medium back then, alongside cassette tape, people building the kits would often have use of a terminal. I remember seeing an ad for Small C on Paper tape for the Kim1. MS Basic on cassette tape was available for the Kim and Apple 1, paper tape may have been an end user option. I think the early OSI machines were mainly 6502. (but was 6800 an option?)
 
Last edited:
I have some KIM loader dumper tapes that I assume were used on the OSI since he didn't have a KIM. My understanding is that was not uncommon back then. I also had a distribution copy of Microsoft BASIC for the OSI but it was a later version.

20220325_183922027_iOS.jpg20220328_162324839_iOS.jpg
 
This is likely the receipt for the software purchase. Notice it is for the 300 trainer manual, 420 memory boards and software from 2/27/77. The 300 and 400 systems were purchased in 1976.

software receipt.jpg
 
This guy has disassembled and analysed these early 6502 basics for the OSI, Kim, Apple, PET..


(C) 1976 Microsoft is the earliest date to assert copyright, that version might be later, the website says 1977 for 6502. It may have the terrible string collector bug.

I don't know if they are official copies, people passed copies around, famously bill gates wrote a letter about it.

There was the Kansas City portable tape format, used by kim and OSI, so you could have a version of a program to work on different machines, then patch/add the vectors for console in/out, punch, etc..

Interesting bit of history you have there, shame you don't have the boards!
 
Last edited:
I was under the impression that OSI didn't release it's 8K BASIC until 1977, per advertisements in BYTE among other places. BASIC is not mentioned at all in the Winter 1976 catalog from OSI, which you would think they would have in there if it was available.
1778039774358.png
Paper tape BASIC on an OSI-400 is something I would love to take a crack at one day. I've got a suitable system to test it on, just haven't gotten my paper tape equipment situation sorted yet...
1778040527694.png
 
Really cool setup. Is that "Desert miner" running on the screen?
1976 would be when it was written, so thats the (c) date on the product.

The ad says "Our OSI 6502 8k basic has automatic string space handling, and it runs faster. Upto 8 times faster than 8080 basic". That is until you have to do a garbage collection, and it crashes!

The first OSI board had the option of 6800 or 6501, a working one of those with 6501 would be neat.
 
Last edited:
Really cool setup. Is that "Desert miner" running on the screen?
It's a game I'm working on for the OSI-400. But let's not get lost in the weeds...

The first OSI board had the option of 6800 or 6501, a working one of those with 6501 would be neat.
At least one of those exists, I got to see it a few weeks ago at VCF East.

I know at least one other copy of OSI 8K BASIC on paper tape exists, but I don't think a tape dump exists at this time. tgarnold, you have the opportunity to do something really righteous for the OSI community at large.
 
That tape decodes to:

Byte 0: 0x00 (NUL)
Byte 1: 0x00 (NUL) -> tape leader
Byte 2: 0x32 ('2')
Byte 3: 0x44 ('D')
Byte 4: 0x36 ('6')
Byte 5: 0x30 ('0') -> "2D60" load address
Byte 6: 0x0C (FF)
Byte 7: 0x0A (LF) -> form feed + line feed
Byte 8: 0x40 ('@') -> deposit-command marker?
Byte 9: 0x32 ('2')
Byte 10: 0x20 (' ') -> "2 " parses to 0x02 (illegal opcode / sync byte)
Byte 11: 0x32 ('2')
Byte 12: 0x38 ('8')
Byte 13: 0x20 (' ') -> "28" -> 0x28 -> PLP
Byte 14: 0x39 ('9')
Byte 15: 0x41 ('A')
Byte 16: 0x20 (' ') -> "9A" -> 0x9A -> TXS
Byte 17: 0x41 ('A')
Byte 18: 0x30 ('0')
Byte 19: 0x20 (' ') -> "A0"
Byte 20: 0x30 ('0')
Byte 21: 0x30 ('0')
Byte 22: 0x20 (' ') -> "00" -> A0 00 -> LDY #$00
Byte 23: 0x38 ('8')
Byte 24: 0x34 ('4')
Byte 25: 0x20 (' ') -> "84"
')
Byte 27: 0x41 ('A')
Byte 28: 0x20 (' ') -> "0A" -> 84 0A -> STY $0A
Byte 29: 0x38 ('8')
Byte 30: 0x34 ('4')
Byte 31: 0x20 (' ') -> "84"
Byte 32: 0x0D (CR)
Byte 33: 0x0A (LF) -> end of line
Byte 34: 0x30 ('0')
Byte 35: 0x42 ('B')
Byte 36: 0x20 (' ') -> "0B" -> 84 0B -> STY $0B
Byte 37: 0x38 ('8')
Byte 38: 0x34 ('4')
Byte 39: 0x20 (' ') -> "84"
Byte 40: 0x30 ('0')
Byte 41: 0x34 ('4')
Byte 42: 0x20 (' ') -> "04" -> 84 04 -> STY $04
Byte 43: 0x38 ('8')
Byte 44: 0x34 ('4')
Byte 45: 0x20 (' ') -> "84" (first half of next STY pair)
Byte 46: 0x11 (DC1) -> ??? suspect decoding (right edge of photo)
Byte 47: 0x34 ('4') -> ???
Byte 48: 0x21 ('!') -> ???
Byte 49: 0x20 (' ') -> ???Byte 26: 0x30 ('0')

Can anyone find a match in microsoft basic?
 
I am in contact right now with the Microsoft head archivist. I would like to share this with the general community, but I want to make sure I'm not risking damaging something that is irreplaceable, especially sense I don't have proper equipment or expertise. It may take a little time, but it has been close to 50 years already.

I was under the impression that OSI didn't release it's 8K BASIC until 1977, per advertisements in BYTE among other places. BASIC is not mentioned at all in the Winter 1976 catalog from OSI, which you would think they would have in there if it was available.

If you see the invoice, it was February 1977. OSI may not have released 8K BASIC until 1977, but Microsoft may have sent this sometime after November 1976 when they copyrighted the name Microsoft.
 
Byte 0: 0x00 (NUL)
Byte 1: 0x00 (NUL) -> tape leader
Byte 2: 0x32 ('2')
Byte 3: 0x44 ('D')
Byte 4: 0x36 ('6')
Byte 5: 0x30 ('0') -> "2D60" load address
Byte 6: 0x0C (FF)
Byte 7: 0x0A (LF) -> form feed + line feed
Byte 8: 0x40 ('@') -> deposit-command marker?
Byte 9: 0x32 ('2')
Byte 10: 0x20 (' ') -> "2 " parses to 0x02 (illegal opcode / sync byte)
Byte 11: 0x32 ('2')
Byte 12: 0x38 ('8')
Byte 13: 0x20 (' ') -> "28" -> 0x28 -> PLP
Byte 14: 0x39 ('9')
Byte 15: 0x41 ('A')
Byte 16: 0x20 (' ') -> "9A" -> 0x9A -> TXS
Byte 17: 0x41 ('A')
Byte 18: 0x30 ('0')
Byte 19: 0x20 (' ') -> "A0"
Byte 20: 0x30 ('0')
Byte 21: 0x30 ('0')
Byte 22: 0x20 (' ') -> "00" -> A0 00 -> LDY #$00
Byte 23: 0x38 ('8')
Byte 24: 0x34 ('4')
Byte 25: 0x20 (' ') -> "84"
')
Byte 27: 0x41 ('A')
Byte 28: 0x20 (' ') -> "0A" -> 84 0A -> STY $0A
Byte 29: 0x38 ('8')
Byte 30: 0x34 ('4')
Byte 31: 0x20 (' ') -> "84"
Byte 32: 0x0D (CR)
Byte 33: 0x0A (LF) -> end of line
Byte 34: 0x30 ('0')
Byte 35: 0x42 ('B')
Byte 36: 0x20 (' ') -> "0B" -> 84 0B -> STY $0B
Byte 37: 0x38 ('8')
Byte 38: 0x34 ('4')
Byte 39: 0x20 (' ') -> "84"
Byte 40: 0x30 ('0')
Byte 41: 0x34 ('4')
Byte 42: 0x20 (' ') -> "04" -> 84 04 -> STY $04
Byte 43: 0x38 ('8')
Byte 44: 0x34 ('4')
Byte 45: 0x20 (' ') -> "84" (first half of next STY pair)
Byte 46: 0x11 (DC1) -> ??? suspect decoding (right edge of photo)
Byte 47: 0x34 ('4') -> ???
Byte 48: 0x21 ('!') -> ???
Byte 49: 0x20 (' ') -> ???Byte 26: 0x30 ('0')
I'm no expert, but I ran it through Claude which said:

Strong Matches to Known Microsoft 6502 BASIC​


The PLP / TXS opening sequence is particularly telling:


  • This exact pairing appears in Apple I BASIC (1976)
  • Also found in KIM-1 Microsoft BASIC
  • It's essentially a Microsoft "signature" initialization

The zero-page zeroing routine (STY $0A, STY $0B, STY $04):


  • These exact zero-page addresses appear in other OSI Microsoft BASIC versions
  • Consistent with how Microsoft reused their codebase across platforms

What Makes This Potentially Unique​


However the load address of $2D60 is interesting:


  • Apple I BASIC loads at $E000
  • Commodore PET BASIC loads at $C000
  • $2D60 is distinctly OSI — fitting their specific memory map

The Bigger Picture​


Microsoft's 6502 BASIC was essentially one codebase adapted for different memory maps per licensee. The initialization code being nearly identical across versions is actually strong evidence of authenticity — a forgery would be unlikely to get these subtle details right.


Bottom Line​


What's been decoded so far is entirely consistent with a genuine 1976 Microsoft 6502 BASIC implementation.
 
It's a game I'm working on for the OSI-400. But let's not get lost in the weeds...
At least one of those exists, I got to see it a few weeks ago at VCF East.
The setup is a 400 Superboard, 420C 4K SRAM, and 440 Video on a three-position backplane?
I can't quite read the descriptive card ... perhaps you can?
What is the little daughter-board on the 400 doing?
What's going on in the wooden box that mounts the backplane?
I wonder what was considered to be the "stock" keyboard in this era?
 
The setup is a 400 Superboard, 420C 4K SRAM, and 440 Video on a three-position backplane?
I can't quite read the descriptive card ... perhaps you can?
What is the little daughter-board on the 400 doing?
What's going on in the wooden box that mounts the backplane?
I wonder what was considered to be the "stock" keyboard in this era?
I'll give you the longer version than what's on the little placard:

20260309_071653.jpg
The little brown mezzanine on the replica 400 is a baud rate clock divider to get 1200 and 300 baud to talk to an NEC Spinwriter terminal at a speed it can handle.

20260404_113645.jpg

The wooden box contains the power supply and mounting points for the various I/O ports. Makes the whole thing sturdy, and fits the vibe of how authentic 400-based kit builds might go if you didn't spring for the more complete original Challenger. The backplane is a replica 582 4-slot model, a bit anachronistic as it came out with the Challenger II/2P series. In 1976, your only option was an 8-slot 480 backplane, but I wanted this a bit more compact for the moment.
20260405_102747.jpg
Besides the 400 replica, there is a 495 protoboard replica containing a socket for a 2KB EPROM. There are also a pair of original boards, the 420 and 440 you mentioned.

20260315_131652.jpg
OSI didn't produce a keyboard until the 542, so there wasn't a stock keyboard as yet in 1976. Before then, they suggested one of a few 3rd party options for a parallel ASCII keyboard. The 440 manual specifically names a SWTPC option, and surplus Sanders 720 keyboards, the latter of which I happened to have. They even went so far as to mention Byte issue #1's article about reverse engineering mystery keyboards which featured one of the Sanders 720 variants as its example -- this is the other later variant.

20240514_030959.jpg20260313_110406.jpg
I spent a good deal of time coming up with a reversible, non-invasive solution to augment the features of the 720 (like adding CONTROL, graphics toggle, reset keys and the correct DELETE key) while cleaning up the signal issues it posed. I'm on my 4th revision, and have plans for a 5th at some point in the future since DELETE still doesn't work right. It may not look authentic, totally but it seemed to me to be the best of a bunch of bad options. It's hidden inside of the keyboard chassis, connected between the external DC-37 and internal card-edge connector on the keyboard PCB.
 
That tape decodes to:

Byte 0: 0x00 (NUL)
Byte 1: 0x00 (NUL) -> tape leader
Byte 2: 0x32 ('2')
Byte 3: 0x44 ('D')
Byte 4: 0x36 ('6')
Byte 5: 0x30 ('0') -> "2D60" load address
Byte 6: 0x0C (FF)
Byte 7: 0x0A (LF) -> form feed + line feed
Byte 8: 0x40 ('@') -> deposit-command marker?
Byte 9: 0x32 ('2')
Byte 10: 0x20 (' ') -> "2 " parses to 0x02 (illegal opcode / sync byte)
Byte 11: 0x32 ('2')
Byte 12: 0x38 ('8')
Byte 13: 0x20 (' ') -> "28" -> 0x28 -> PLP
Byte 14: 0x39 ('9')
Byte 15: 0x41 ('A')
Byte 16: 0x20 (' ') -> "9A" -> 0x9A -> TXS
Byte 17: 0x41 ('A')
Byte 18: 0x30 ('0')
Byte 19: 0x20 (' ') -> "A0"
Byte 20: 0x30 ('0')
Byte 21: 0x30 ('0')
Byte 22: 0x20 (' ') -> "00" -> A0 00 -> LDY #$00
Byte 23: 0x38 ('8')
Byte 24: 0x34 ('4')
Byte 25: 0x20 (' ') -> "84"
')
Byte 27: 0x41 ('A')
Byte 28: 0x20 (' ') -> "0A" -> 84 0A -> STY $0A
Byte 29: 0x38 ('8')
Byte 30: 0x34 ('4')
Byte 31: 0x20 (' ') -> "84"
Byte 32: 0x0D (CR)
Byte 33: 0x0A (LF) -> end of line
Byte 34: 0x30 ('0')
Byte 35: 0x42 ('B')
Byte 36: 0x20 (' ') -> "0B" -> 84 0B -> STY $0B
Byte 37: 0x38 ('8')
Byte 38: 0x34 ('4')
Byte 39: 0x20 (' ') -> "84"
Byte 40: 0x30 ('0')
Byte 41: 0x34 ('4')
Byte 42: 0x20 (' ') -> "04" -> 84 04 -> STY $04
Byte 43: 0x38 ('8')
Byte 44: 0x34 ('4')
Byte 45: 0x20 (' ') -> "84" (first half of next STY pair)
Byte 46: 0x11 (DC1) -> ??? suspect decoding (right edge of photo)
Byte 47: 0x34 ('4') -> ???
Byte 48: 0x21 ('!') -> ???
Byte 49: 0x20 (' ') -> ???Byte 26: 0x30 ('0')

Can anyone find a match in microsoft basic?

Based on a fair amount of disassembly work that I've done over the years, the various Microsoft Basic iterations that were available for the different 8-bit platforms back in the day (6502, 6800, 8080/Z80) followed a very similar approach from a code perspective. They generally started with token/function address and string tables, error code tables, etc... The cold start entry point was invariably near the end of the code, which is where the Basic initialization code typically resided. Strings associated with the initialization process... like the memory size and line length prompts, sometimes math function prompts for RAM based releases, and Basic release/version strings were also typically located at the end of the code.

You my wish to examine the end of the tape to determine if it is indeed Basic, and if so which variation.
 
1778182770791.png Anyone know what the original version number and Rev was for this first version.
 
Back
Top