Oh my god, you guys rock! Just a heads up, I'm actually away at Maryland for an Open house this week (wonderful timing on releasing this specific video...), but I'll be back home by mid-week and will start updating the Wiki!
I love your channel and your passion for the formative technologies that eventually led to the computer science wonderland that we all get to live in today. Thank you for all you do, I appreciate all your hard work.
I was watching this with my friend and his non-verbal brother and all of the sudden his brother shouts "You stupid rabbit, that's not ASCII!". We both jumped because I've heard him speak like twice in 10 years.
That diagnostic card actually allows a Z80 installed on it to master the Centurion bus. That's what the unpopulated 40 pin chip is. I figured out what all but a couple of the unpopulated chips are and one of the uninstalled DIP switch positions (SW-8) is used to put the card into master mode given it also has a crystal, Z80, and the rest of the chips installed. WIthout SW-8 installed the card just operates as a peripheral. It appears to have three functional blocks, one base block for CPU5/6 driven diagnostics, one optional block for onboard Z80 driven diagnostics, and one more optional block to exercise the DMA mechanics. Those Centurions could also run CP/M with such a card, and it could run from EPROM.
That was the one of the future plans for the Centurion Diag. PROM Bd. but we never made it happen before bankruptcy. I think the main hardware engineer ( Steve W. ) built only one Centurion Diag. PROM Bd. with the Z80 CPU installed but it never left his office. I personally did the high level hardware & software spec doc and then handed it off to Steve for the hardware design & Terry for the software design.
@@kenromaine2387 Thank you for that! As I'm making some high-level guesses, I was wondering if you recall if the Z80 was able to run code in the Centurion memory directly or if it was a more of a byte-at-a-time access to the Centurion's memory space? I could see access through a page long window being probable. If I had to guess, my guess would be that the latches at A7 and A8 provide the high 12 bits of the address and the Z80 sees a 256 byte window of the backplane memory in its own address space. Not quite CP/M capable directly, but if somebody wants to spin a board which has a Z8000 on it, the diagnostic board hold all the keys to making it run.
@@Peter_S_ The Diag. PROM Bd. running with a Z80 installed never was released from the design engineer ( Steve W. ). I know Steve built "one" and the Z80 was talked about but I never touched one installed in the Diag. PROM Bd.
I am 62 years old and started programming in 1976; i.e., more than four decades ago. I used to subscribe to the IEEE "Annals of the History of Computing" journal. I love what you are doing with this series of videos to show how the immediate past is relevant to computing today. I hope to see more of your work in the future.
Considering that it's got a completely custom CPU from long ago... the Centurion assembly language "makes sense" coming from a Z80, 6502, 6800, AVR perspective.
And it was that moment, hearing David describe something that feels like it was maybe weeks ago as "way back in time", that he realized that he was, in fact, extremely old.
Good job using the Centurion assembler. Next rev. of the "Hellorld" program need to do a "Rolling Barber Pole of "Hellorld " . Should be a easy edit to the assm. code by adding a few spaces after "Hellorld " and not sending any LF or CR codes to the terminal. The ADDS terminal should already be setup to do a Auto-LF after receiving the 80-th chart. sent.
Great trick for v2! Thank you for all you've done for this project, I don't think we'd be anywhere as close without your help. Also thank you for all your family has done for salads, especially the Ceasar!!
5:56 It's ASCII... if you set the high-bit of every octet. The actual ASCII would be "48 45 4c 4c 4f 52 4c 44 21 0D 0A 00". (I know ASCII is 7-bit, don't at me)
i thought *halaurel* was what retail shops call this time of year when they have halloween decorations one side of the aisle and Christmas decos, the other! 😆
I remember the old Ti99, it was absolutely crippled by the convoluted method it had to use to access RAM - so was actually far slower than other 8-bit machines at the time, even though they referred to it as a 16bit machine. I actually had one and switched to the Speccy at the time (well, I nagged my parents until they gave in!)
Wow the Centurion aesthetics screams 70s and the cumbersome assembler has a nice direct-to-memory entry and run style too.Of course the detail the whole system takes an entire wall adds up to its cool nostalgic effect.
I recall that a few episodes ago you mentioning that you like switching up the machines you work on. I full agree and enjoy this as I too would bet bored plugging away at the same system for any extended period. I really enjoy your format and am looking forward to some Bendix stuff! Thank you for your work covering all of this on video; I know that it must be a tremendous amount of overhead.
I learned programming with COBOL and FORTRAN then jumped to OOP with C and its derivatives. After learning those three basic languages, I have yet to encounter a new language that poses any difficulty to learn. That being said, I always wish I had started with an assembler/symbolic language. While learning some type of assembly won't be hard, it's actually not as easy as moving to languages of higher abstractions. I find that really fascinating - the learning more abstracted languages seems more difficult for me compared to less abstracted languages. I guess it's probably not that unusual, still I find it fascinating. Also, my Dad and I watched your video this afternoon and we got into a discussion about how back in the late 70s and early 80s he remembers purchasing a Apple II knock off computer in Hong Kong where our family lived at the time. We really wished we had that strange and esoteric knock off computer, what a fascinating system that would be to dissect! Even though memories are somewhat murky, he remembers putting it together in probably 81 or 82 and it was meant to basically mimic what the Apple II offered in its spec. Unfortunately it has disappeared into the ether many decades ago.
> I have yet to encounter a new language that poses any difficulty to learn. I’d recommend trying an array programming language (APL or BQN) or something “purely” functional (like Haskell). Those are not hard per se but require a fair bit of mind bending.
This video is the one that gave me the little push to actually make the homebrew I had in my head for so long…. I really want to add my “Hellorld!” On that page 😁
A very inspiring video again! Thank you so much. A comment to the experiment on the TI99: We had fun doing these experiments on our C64s. Try filling the entire screen with characters, e.g. „HELLORLD“ and compare the time it takes the machine to do it in BASIC and in ASM. Maybe you want to try this in another video. It’s astonishing.
That's the overhead of the BASIC interpreter. While the Print statement uses a machine-language routine, the parsing of the BASIC statements with every iteration destroys performance. That can be solved with an assembly-language implementation that calls the same output routine in ROM that BASIC uses. For an even better result you can write your own assembly language to output the values directly to video memory. It's more work, but for ultimate performance that's where you have to go. I don't know why I wrote this. I guess I'm reminiscing about better days. 😂
I had a TI 99/4A back in 1983 and I taught myself how to program on that system. I learned assembly as well. I decided I needed a program that would show a grid of large "pixels" in a 16x16 grid. I could toggle each "pixel" on or off, rotate as well as invert. All the while it was showing the hexadecimal value I needed to use to generate sprites in Extended BASIC. That assembly program was over 800 lines of code. That computer is what gave me the programming bug that I "suffer" from to this day as I've been a VB (4,5,6), C#, C++ and now a TSQL developer.
Re the 9900 Branch and link instructions - eg BLWP. The TI9900 chip is almost unique in CPU design in that it does not have a stack pointer. The 990x processors were (if I remember correctly) designed to be communication processors rather than general purpose processors. A critical part of this design was a response to an interrupt. Interrupt processing must save the registers of the interrupted application, do work and then restore the registers. The TI9900 family does this by having a register bank pointer which points to a chunk of RAM that hold the registers. Interrupt switching then changes the value in the register pointer to another chunk of RAM and on completion restores the original value. The venerable PDP11 family uses a similar mechanism. Subroutines were an afterthought and could only be supported as a single execution unit one level below the main application. The main application would push the return address into register R11 (?) and then jump to the subroutine. On completion the subroutine would then jump to the address in R11. No further subroutine calls could be made inside the subroutine without saving the current R11 content, which made code reuse incredibly challenging. Thankfully other CPU chip makers implemented stack pointers. One other annoying detail - all TI900 instructions have to start on a even memory address as they are 16-bit instructions.
Yes. Also, after the TMS9900, TI made the TMS99000 family (99105 and 99110), which included the BLSK instruction to implement a stack based mechanism for handling return addresses. This made nested routines in code much simpler to implement. The return call, if using R11 as the stack pointer, would be simply B *11+, which would restore the saved program pointer as well as auto-incrementing the stack pointer.
Ok, so you've got me... I now need to see if I can write a 'Hellorld!' program for a couple of my machines. One is less unique than the other, of which there weren't many made, but I'm going to hold of saying what they are so nobody beats me to it, though they probably will as I'm rubbish at this sort of thing!!
I’ve been wearing one of your awesome shirts. I posted to the Antique Computer Club page in Facebook at so many pictures from people who met you were posted.
I designed and built a custom 6809 based computer board that will fit in to an Altoids mint tin. It has a bit banged serial port. I will have to make it say "Hellorld!". I can also have it say "Hellorld!" on the 6 7-segment displays on the front panel by scrolling the characters through the display.
I once saw a "Hello world" in Fortran which had the printout routine hardcoded in machine code as a (surprisingly short) array. It ran on VAX Unix both BSD and AT&T System V. Some hacking should be able to come up with the equivalent on Linux.
I don't keep too many old systems around in a ready-to-program state, but I do have a couple of Heathkit ET-3400 trainers. They're always ready. So here's one for the Heathkit ET-3400. It wouldn't be so long except that it only has six digits, so it needed to do some scrolling. Also nice was that I didn't need to display a "W" on a seven-segment display! (Loads at 0000) CE0026DF 24BDFCBC C606A600 270108BD FE3A5A26 F5CEC000 0926FDDE 24A60027 DF0820DF 0000374F 0E0E7E05 0E3DA000
I do have an old Altos 5-15D Z-80 CP/M microcomputer in storage, that my parents bought in 1982 as their first office computer. Maybe could get it running some day. I would also like to build a working 8 bit system from TTL IC's.
Ours actually had 2) 5-1/4 inch 720K double sided floppy drives. The case was about 12 inches wide and 16 to 18 inches long and about 6 inches in height. My dad bought it in June of '82. I had to keep regular back ups of the frequently used floppies because they only lasted about 1 or 2 months if used daily.@@dhpbear2
It looked like he skipped entering the HLT instruction on the Centurion, which means the return from the PRINTNULL subroutine would have just resumed executing at the top of the PRINTNULL subroutine, but it didn't seem to have any impact on the program. I'm surprised it didn't crash! (Maybe it did LOL.)
I love TMS9900 assembly language. It was a key part of my life from 1981 to 1991 writing test software for a bunch of application specific computer hardware, although with the help of the additional instructions found in the less well known TMS99000. While registers held in RAM would not be efficient these days, it made OS calls and interrupt handling fast and efficient (change one pointer register in the cpu to get a whole new bunch of registers). That's part of what the BLWP instruction is all about, used for subroutine calls.
Oh, I was making a joke there, Bill Cosby used to do ads for the Ti computers and Jello Puddin' Pops. It only seemed (il)logical that the chip designers would have seen the synergy and created specialized circuitry to handle gelatinous dairy products (Puddin' Pops).
@@GodmanchesterGoblin I was wondering if you were from across the pond when I saw "Manchester" in your username. There's probably some very cheesy examples of the ads on TH-cam if you're interested.
On the 99/4 I think you're branching to the VMBW video multiple byte write routine which will write the text to the VDP to be displayed. That routine will have it's own independent set of 16 registers to play with. The TMS9900 has a revolutionary architecture, far beyond anything else at the time.
I now use "Hellorld!" as my all purpose "test out a new programming language and/or computer thing" string. :) - I've been teaching myself 6502 assembly language on the Commodore 64. What was the very first program I tried writing? Why, "Hellorld!" of course! - I've been working through building John Winans' Z80-Retro! single-board computer. Got it running and built up a CP/M SD card image. While looking around the interwebs, I found the Aztec C compiler for CP/M, and decided to give it a try. Yep, "Hellorld!" was my very first test program. - And just this evening I finally resurrected a SPARCstation LX that I've had kicking around for ages. Installed NetBSD on it, and tried compiling something as a test. What did I compile? A "Hellorld!" C program, naturally. :)
I am "new" to this channel. In reality, I've been a subscriber for a long time. I just don't say much. I'm trying to work on that. I'm trying to comment more often. Anyhow, I'd wondered about hellorld before. I figured it was something similar. I figured it was a malformed 'hello world'. So, my powers of observation are doing okay!
I found a PNG where I had written this: "BA0C01B409 CD21B8004C CD2148656C 6C6F726C64 210D0A2400". Looks like code for an x86 running MS-DOS, juding by the CD21s.
I had to explain to my wife why I just yelled “blowup” at the TV: Around 1986 when I was a Computer Science undergraduate at the University of New Mexico, the assembly language class was taught using TI development boards that I was reasonably sure used the same microprocessor as the TI-99/4. When I saw the “BLWP” (Branch and load workspace pointer) instruction, I knew it was that processor. AFIK, it was the only, or one of very few, processors to use that register architecture so that one called a subroutine by loading a new set of registers, including IIRC, the program counter. A semester or two after I took the class, they changed to using 68000 and Atari 8000s.
I did it on a Signetics 2650 system based on the 1979 Electronics Australia magazine project. It's on my YT channel. My last post seems to have been deleted...
I really enjoy your channel. Great contents very well explained. Making these video's must be a hell of a lot of work. This time, I have a little question: I'm not familiar with the specific Centurion assembly, but shouldn't there be some kind of an 'ENDPROG JMP ENDPROG' or a 'HLT' between the 'JSR PRINTNULL' and the 'DW X'8D8A'' lines so not to execute the bytes 0x8a, 0x8d, 'HELLORLD'!, 0x00 as part of the program after returning from PRINTNULL ? Or are DB, DC and DW allocations automatically put in a different data segment? I'm looking forward to your next video!
It's a bit more cursed from my understanding, the print subroutine *modifies the return address* while consuming those data bytes to print them, so when the `RSR` opcode is executed it returns to the point just past the string data. Instead what seems to be missing is a `HLT` right before the PRINTNULL entry point to stop the CPU from getting back into the subroutine code the second time.
Does it need to be software? I have some ideas that are more hardware-based and as such they would violate rule #1. Do you think you could make an exception?
TI-99/4 is plenty unique. It's not a 6502 or 8080 or Z-80 or even 8088. Many people don't reallize this was the first consumer 16-bit CPU competing against the 8-bit machines of the day. Also, as you suggested, TI kept specific programming information very close to their vest. You were supposed to "just use BASIC."
If you had made this program print anything besides HELLORD! - like something crazy like "Hello World" or some other nonsense I would have been so mad.
From memory its long ago Hellorld for the zx Spectrum all hex (Z80 Assembly) org 8000 LD HL, text next: LD A,(HL) ; fetch character CP 0 ; check for zero RET Z ; return if zero RST 10 ; print character INC HL ; increase pointer JR next ; next character text: DB "Hellorld!" DB 0 start with randomize user 32768
Damn! You're first! :-) I'd put DB 22, 12, 11 before "Hellorld!" to place text at center of the screen. Also call #0d6b then ld a,#02: call #1601 to clear screen and setup output to main part of the screen
i have the TI99 4a with the alps key switches. currently no monitor. so i have yet to try it, but i came advertised as working and came with some things, its in really good shape. my radioshack coco2 uses a tv but i would like to find a more period correct one, my vic 20, ibm 5150 and apple iie all have their correct monitor, and of course my radioshack trs80 model 3 as thats all in one. i only use them for the games as i never learned basic. i also have the atari 2600 and NES.
Would a machine that has two architectures in one (a la DEC Rainbow) would satisfy rule #2's requirement even if it's two common architectures (in my case, x86 and PowerPC/AIM PowerISA)? If yes, I've got a potential candidate... It's not a very unique machine, but I feel it's a significant oddity that it would qualify.
But it's rather smart. It makes it easier to place the text right un the middle of the code and it spares a load instruction for the start of the text. However, it only works for static text.
if you're a total nerd you got the joke the first time you saw the world haha, but the details of it made it even funnier! e: not even bothering to correct that one
can you super smart folks, out here condition this machine by way of a compiler . to run MS-DOS 2.01 or DOS 5.1 which i think was my very first introduction into a windows look and feel ,operating system. i feel? 👈👺👀👀👍
Just a small point - your "HELLOLRD" string isn't ASCII, it's ASCII with the top bit set. Which given some of the 8-bit micros around in the seventies might have output graphics, or flashing text, or inverse text... maybe even actual text! p.s. I've just built myself a new 65c02 proof of concept SBC that has no fixed memory on board and requires the serial download of a binary file before it will run anything. It could be a tiny boot loader or (as I'm using it at the moment) it could be e.g. MS Basic from 1976. It's definitely an IPL though :)
Confused... where does the first instruction after reset live? Do you write ram with something other than the 6502 and then bring the 6502 out of reset to run it?
@@rivimey I use three 74lv8153s (which accept UART data if it's in the right shape) to drive the address and data; the signal which enables their outputs disables the 65c02 output busses and holds the reset low. Once the upload is finished the 65c02 is enabled and the reset goes high, so it wakes up. If you remembered to include the reset vectors in your initial hex file... I massage the hex file to give the specially formatted file that the 8153s require (they accept a four bit data half and a 0-7 address, so need two writes per byte).
I don't have a unique system I know how to program in Machine code, but, here is a version for the ZX Spectrum..... 10 DATA 33,19,125,126,222,0, 40,8,205,55,25,35,195,3,125, 205,61,31,201 20 DATA 72,69,76,76,79,82,76,68,0 30 FOR f=32000 TO 32027: READ a: POKE f , a: NEXT f 40 LET l=USR 32000: PAUSE 0 Just type it into BASIC. And RUN it.
I have enough C64s to pull it off, but not enough power supplies. And unless I use as many tiny TVs as possible for it, the total image size will be... smol. And then again it'll be an insane amount of work. And then again I'd rather use the C64s to listen to music. I have enough TVs/monitors to pull it off, but none of them are identical apart from two 1701s.
Back around 1988 I designed a colour graphics card for a TMS99105 system and wrote the device drivers. The display card used the MHS82716, and had 128k bytes of RAM. Not VGA though, but it supported text and graphics with sprites. The host used the 74LS610 memory mapper chip and supported up to 2MB of system memory. The graphics project died, but the rest of the system was in production for around 10 years from 83 to 93. It was a key part of my career in hardware and software design. I still have some of that hardware in my collection.
Oh my god, you guys rock!
Just a heads up, I'm actually away at Maryland for an Open house this week (wonderful timing on releasing this specific video...), but I'll be back home by mid-week and will start updating the Wiki!
Oh, coming to a place near me and dont even make dinner plans? I see how it is! :D
More Seriously, see you at VCFe next year?
I love your channel and your passion for the formative technologies that eventually led to the computer science wonderland that we all get to live in today. Thank you for all you do, I appreciate all your hard work.
I'll be there!
where do we send the code, pics, and video to? (my 7-segment displays scroll the message)
I was watching this with my friend and his non-verbal brother and all of the sudden his brother shouts "You stupid rabbit, that's not ASCII!". We both jumped because I've heard him speak like twice in 10 years.
That diagnostic card actually allows a Z80 installed on it to master the Centurion bus. That's what the unpopulated 40 pin chip is. I figured out what all but a couple of the unpopulated chips are and one of the uninstalled DIP switch positions (SW-8) is used to put the card into master mode given it also has a crystal, Z80, and the rest of the chips installed. WIthout SW-8 installed the card just operates as a peripheral. It appears to have three functional blocks, one base block for CPU5/6 driven diagnostics, one optional block for onboard Z80 driven diagnostics, and one more optional block to exercise the DMA mechanics. Those Centurions could also run CP/M with such a card, and it could run from EPROM.
CP/M on the Centurion would be so damn cool! I want to see that now, that would be a heck of a project
Some of the IC GUESSES are.... A7 = 74LS373, A8 quad latch possibly old National chip (gets writes from $F130-$F13F), B1 = 74LS04, B2 = ????, B7 = 7437, B8 = 5 resistors + XTAL, C1 = 74LS74?, C2 = ?74LS161?, C5 = 74LS259 (for Z80 emulation of CPU5/6), C6 = 7438, C7 = 74LS74, D3 = 74LS241, D4 = 74LS241, DE5 = Z80, D6 = 2inputGate (LS00, LS02, or LS32), D7 = 74LS04, D8 = 74LS74, E6 = 74LS245, E8 = 74LS04, J1 = 74LS259, J3 = ?????, K1 = ?74LS109?, K2 = 330/220 terminator, K3 = 7437, K4 = 7437.
That was the one of the future plans for the Centurion Diag. PROM Bd. but we never made it happen before bankruptcy. I think the main hardware engineer ( Steve W. ) built only one Centurion Diag. PROM Bd. with the Z80 CPU installed but it never left his office. I personally did the high level hardware & software spec doc and then handed it off to Steve for the hardware design & Terry for the software design.
@@kenromaine2387 Thank you for that! As I'm making some high-level guesses, I was wondering if you recall if the Z80 was able to run code in the Centurion memory directly or if it was a more of a byte-at-a-time access to the Centurion's memory space? I could see access through a page long window being probable. If I had to guess, my guess would be that the latches at A7 and A8 provide the high 12 bits of the address and the Z80 sees a 256 byte window of the backplane memory in its own address space. Not quite CP/M capable directly, but if somebody wants to spin a board which has a Z8000 on it, the diagnostic board hold all the keys to making it run.
@@Peter_S_ The Diag. PROM Bd. running with a Z80 installed never was released from the design engineer ( Steve W. ). I know Steve built "one" and the Z80 was talked about but I never touched one installed in the Diag. PROM Bd.
GOORD! An entire episode dedicated to HELLORLD!
We need some sort of bit bucket where we collect all the omitted WOs and DLs!
You had me at Hellorld!
Me too.
Yup!
For me, the best part is that "Hellorld" is 7-seg display friendly. Gotta write it in HP 15C synthetics.
You need to get Ken or Marc to write a Hellorld program on punchcards for the IBM 1401 at the Computer History Museum!
Good Idea!
Heh... better yet, get @CuriousMarc to gather the team together to write something for the AGC to scroll some sort of 'HELLORLD' across the DSKY. 🌕🚀
That would be fun, but sadly the AGC they had restored has been sold and they no longer have access to it.
@@dariusliadon Sure but they still have a reproduction DSKY and I think there's an emulator...
@@kelli217 But isn't the whole point of the exercise to run the original hardware?
to be fair, i was starting to miss the "hellord" at the start of the videos
this is one of the few series that i still wait for
I am 62 years old and started programming in 1976; i.e., more than four decades ago. I used to subscribe to the IEEE "Annals of the History of Computing" journal. I love what you are doing with this series of videos to show how the immediate past is relevant to computing today. I hope to see more of your work in the future.
Considering that it's got a completely custom CPU from long ago... the Centurion assembly language "makes sense" coming from a Z80, 6502, 6800, AVR perspective.
Yeah, I had vague memories of printing in a similar way using 6502 (the jsr business), back in the 80s on a BBC Model B.
I am still amazed seeing the Centurion matching the car colors ;)
This is really inspiring! I'm going to dig up the Z80 reference and start coding.
In class I typed "shitdown /r now" with my instructor looking over my shoulder. He just said "that command won't work" and smiled then walked off.
And it was that moment, hearing David describe something that feels like it was maybe weeks ago as "way back in time", that he realized that he was, in fact, extremely old.
Good job using the Centurion assembler. Next rev. of the "Hellorld" program need to do a "Rolling Barber Pole of "Hellorld " . Should be a easy edit to the assm. code by adding a few spaces after "Hellorld " and not sending any LF or CR codes to the terminal. The ADDS terminal should already be setup to do a Auto-LF after receiving the 80-th chart. sent.
Great trick for v2! Thank you for all you've done for this project, I don't think we'd be anywhere as close without your help. Also thank you for all your family has done for salads, especially the Ceasar!!
5:56 It's ASCII... if you set the high-bit of every octet. The actual ASCII would be "48 45 4c 4c 4f 52 4c 44 21 0D 0A 00". (I know ASCII is 7-bit, don't at me)
i thought *halaurel* was what retail shops call this time of year when they have halloween decorations one side of the aisle and Christmas decos, the other! 😆
I remember the old Ti99, it was absolutely crippled by the convoluted method it had to use to access RAM - so was actually far slower than other 8-bit machines at the time, even though they referred to it as a 16bit machine. I actually had one and switched to the Speccy at the time (well, I nagged my parents until they gave in!)
It had the best CPU crippled by the worst system architecture.
Wow the Centurion aesthetics screams 70s and the cumbersome assembler has a nice direct-to-memory entry and run style too.Of course the detail the whole system takes an entire wall adds up to its cool nostalgic effect.
Hey, that's some nice old school programming! None of that newfangled object oriented rubbish. I may try dabbling with assembly someday.
Loved the glimpse of the AH at the start, as for HELLORLD, most of if sailed way over my head, but I did thoroughly enjoy the video, thanks ... 🙂
👹Hellord!👹
10 PRINT "Hellord!"
20 SYSTEM
😆
Assembly?! Gah, now i need to learn 1802 assembler...
A nice test for when the rotating-drum memory of the G100 works?
I recall that a few episodes ago you mentioning that you like switching up the machines you work on. I full agree and enjoy this as I too would bet bored plugging away at the same system for any extended period. I really enjoy your format and am looking forward to some Bendix stuff! Thank you for your work covering all of this on video; I know that it must be a tremendous amount of overhead.
I learned programming with COBOL and FORTRAN then jumped to OOP with C and its derivatives. After learning those three basic languages, I have yet to encounter a new language that poses any difficulty to learn. That being said, I always wish I had started with an assembler/symbolic language. While learning some type of assembly won't be hard, it's actually not as easy as moving to languages of higher abstractions. I find that really fascinating - the learning more abstracted languages seems more difficult for me compared to less abstracted languages. I guess it's probably not that unusual, still I find it fascinating.
Also, my Dad and I watched your video this afternoon and we got into a discussion about how back in the late 70s and early 80s he remembers purchasing a Apple II knock off computer in Hong Kong where our family lived at the time. We really wished we had that strange and esoteric knock off computer, what a fascinating system that would be to dissect! Even though memories are somewhat murky, he remembers putting it together in probably 81 or 82 and it was meant to basically mimic what the Apple II offered in its spec. Unfortunately it has disappeared into the ether many decades ago.
> I have yet to encounter a new language that poses any difficulty to learn.
I’d recommend trying an array programming language (APL or BQN) or something “purely” functional (like Haskell). Those are not hard per se but require a fair bit of mind bending.
YAY! Hope the travels are going well!
This video is the one that gave me the little push to actually make the homebrew I had in my head for so long…. I really want to add my “Hellorld!” On that page 😁
A very inspiring video again! Thank you so much. A comment to the experiment on the TI99: We had fun doing these experiments on our C64s. Try filling the entire screen with characters, e.g. „HELLORLD“ and compare the time it takes the machine to do it in BASIC and in ASM. Maybe you want to try this in another video. It’s astonishing.
That's the overhead of the BASIC interpreter. While the Print statement uses a machine-language routine, the parsing of the BASIC statements with every iteration destroys performance.
That can be solved with an assembly-language implementation that calls the same output routine in ROM that BASIC uses. For an even better result you can write your own assembly language to output the values directly to video memory. It's more work, but for ultimate performance that's where you have to go.
I don't know why I wrote this. I guess I'm reminiscing about better days. 😂
Wellp time to create a custom RISC-V core with a custom Hellorld instruction. Seems useful.
I think you forgot the HLT instruction right before LDAB B’00000010’. 🤔
He never did an RSR, so it wasn't needed.
A good use of BASIC on the TI-99/4 might be for writing an assembler.
A good (and slightly cursed) idea. I endorse it.
I had a TI 99/4A back in 1983 and I taught myself how to program on that system. I learned assembly as well. I decided I needed a program that would show a grid of large "pixels" in a 16x16 grid. I could toggle each "pixel" on or off, rotate as well as invert. All the while it was showing the hexadecimal value I needed to use to generate sprites in Extended BASIC. That assembly program was over 800 lines of code.
That computer is what gave me the programming bug that I "suffer" from to this day as I've been a VB (4,5,6), C#, C++ and now a TSQL developer.
You've started a MOVEMENT! This is so awesome-I love it! Hope to see you at the Museum tomorrow!
Hellorld and can't wait to see you at system source!
Re the 9900 Branch and link instructions - eg BLWP.
The TI9900 chip is almost unique in CPU design in that it does not have a stack pointer. The 990x processors were (if I remember correctly) designed to be communication processors rather than general purpose processors.
A critical part of this design was a response to an interrupt. Interrupt processing must save the registers of the interrupted application, do work and then restore the registers. The TI9900 family does this by having a register bank pointer which points to a chunk of RAM that hold the registers. Interrupt switching then changes the value in the register pointer to another chunk of RAM and on completion restores the original value. The venerable PDP11 family uses a similar mechanism.
Subroutines were an afterthought and could only be supported as a single execution unit one level below the main application. The main application would push the return address into register R11 (?) and then jump to the subroutine. On completion the subroutine would then jump to the address in R11. No further subroutine calls could be made inside the subroutine without saving the current R11 content, which made code reuse incredibly challenging. Thankfully other CPU chip makers implemented stack pointers.
One other annoying detail - all TI900 instructions have to start on a even memory address as they are 16-bit instructions.
Yes. Also, after the TMS9900, TI made the TMS99000 family (99105 and 99110), which included the BLSK instruction to implement a stack based mechanism for handling return addresses. This made nested routines in code much simpler to implement. The return call, if using R11 as the stack pointer, would be simply B *11+, which would restore the saved program pointer as well as auto-incrementing the stack pointer.
Ok, so you've got me... I now need to see if I can write a 'Hellorld!' program for a couple of my machines. One is less unique than the other, of which there weren't many made, but I'm going to hold of saying what they are so nobody beats me to it, though they probably will as I'm rubbish at this sort of thing!!
I’ve been wearing one of your awesome shirts. I posted to the Antique Computer Club page in Facebook at so many pictures from people who met you were posted.
I designed and built a custom 6809 based computer board that will fit in to an Altoids mint tin. It has a bit banged serial port. I will have to make it say "Hellorld!". I can also have it say "Hellorld!" on the 6 7-segment displays on the front panel by scrolling the characters through the display.
I once saw a "Hello world" in Fortran which had the printout routine hardcoded in machine code as a (surprisingly short) array. It ran on VAX Unix both BSD and AT&T System V. Some hacking should be able to come up with the equivalent on Linux.
4:01 Ancient scribes did this, too.
I don't keep too many old systems around in a ready-to-program state, but I do have a couple of Heathkit ET-3400 trainers. They're always ready. So here's one for the Heathkit ET-3400. It wouldn't be so long except that it only has six digits, so it needed to do some scrolling. Also nice was that I didn't need to display a "W" on a seven-segment display!
(Loads at 0000)
CE0026DF 24BDFCBC C606A600 270108BD
FE3A5A26 F5CEC000 0926FDDE 24A60027
DF0820DF 0000374F 0E0E7E05 0E3DA000
Nice. And good call about the seven seggers... that gives me another path to consider.
I, for one, welcome our new Hellorld overlords.
I do have an old Altos 5-15D Z-80 CP/M microcomputer in storage, that my parents bought in 1982 as their first office computer. Maybe could get it running some day. I would also like to build a working 8 bit system from TTL IC's.
I remember that computer! It had 2 8-inch floppy drives oriented side-by-side, making for a whopping 17-inch-wide chassis!
Ours actually had 2) 5-1/4 inch 720K double sided floppy drives. The case was about 12 inches wide and 16 to 18 inches long and about 6 inches in height. My dad bought it in June of '82. I had to keep regular back ups of the frequently used floppies because they only lasted about 1 or 2 months if used daily.@@dhpbear2
have you ever thought about or tried having a terminal in another room? either for multi user shenanigans or for other odd experiments.
It looked like he skipped entering the HLT instruction on the Centurion, which means the return from the PRINTNULL subroutine would have just resumed executing at the top of the PRINTNULL subroutine, but it didn't seem to have any impact on the program. I'm surprised it didn't crash! (Maybe it did LOL.)
So I was not the only one noticing 😊
Then again, that’s the whole theme of this episode… stuff he forgot to type in! 🤣
Can't wait to see Hellorld! on the vacuum tube computer!
How about mechanical programming on a teletype???
wow your computer behind you really amazing Sir
To repeat the past won't let us enter next time....
I'm working on a little fpga computer and the first code it'll run will be hellorld :)
I love TMS9900 assembly language. It was a key part of my life from 1981 to 1991 writing test software for a bunch of application specific computer hardware, although with the help of the additional instructions found in the less well known TMS99000. While registers held in RAM would not be efficient these days, it made OS calls and interrupt handling fast and efficient (change one pointer register in the cpu to get a whole new bunch of registers). That's part of what the BLWP instruction is all about, used for subroutine calls.
The TMS9900 also had undocumented instructions for handling "Jello Puddin' Pops" in memory, the so-named BCxxx instructions.
@@spacewolfjr I'm not aware of those. Is there any info out there? A quick search didn't find anything.
Oh, I was making a joke there, Bill Cosby used to do ads for the Ti computers and Jello Puddin' Pops. It only seemed (il)logical that the chip designers would have seen the synergy and created specialized circuitry to handle gelatinous dairy products (Puddin' Pops).
@@spacewolfjr OK, fair enough. My bad. We didn't have those ads in the UK as far as I'm aware.
@@GodmanchesterGoblin I was wondering if you were from across the pond when I saw "Manchester" in your username. There's probably some very cheesy examples of the ads on TH-cam if you're interested.
On the 99/4 I think you're branching to the VMBW video multiple byte write routine which will write the text to the VDP to be displayed. That routine will have it's own independent set of 16 registers to play with.
The TMS9900 has a revolutionary architecture, far beyond anything else at the time.
Greetings Galaxy!
We have a galaxy of transistors on the planet now. We must reach out to the silicon aliens.
I now use "Hellorld!" as my all purpose "test out a new programming language and/or computer thing" string. :)
- I've been teaching myself 6502 assembly language on the Commodore 64. What was the very first program I tried writing? Why, "Hellorld!" of course!
- I've been working through building John Winans' Z80-Retro! single-board computer. Got it running and built up a CP/M SD card image. While looking around the interwebs, I found the Aztec C compiler for CP/M, and decided to give it a try. Yep, "Hellorld!" was my very first test program.
- And just this evening I finally resurrected a SPARCstation LX that I've had kicking around for ages. Installed NetBSD on it, and tried compiling something as a test. What did I compile? A "Hellorld!" C program, naturally. :)
Hellord! to you too! I totally did not see the 660 instead of 60 🙂
I am "new" to this channel. In reality, I've been a subscriber for a long time. I just don't say much. I'm trying to work on that. I'm trying to comment more often.
Anyhow, I'd wondered about hellorld before. I figured it was something similar. I figured it was a malformed 'hello world'. So, my powers of observation are doing okay!
I found a PNG where I had written this: "BA0C01B409 CD21B8004C CD2148656C 6C6F726C64 210D0A2400". Looks like code for an x86 running MS-DOS, juding by the CD21s.
I had to explain to my wife why I just yelled “blowup” at the TV:
Around 1986 when I was a Computer Science undergraduate at the University of New Mexico, the assembly language class was taught using TI development boards that I was reasonably sure used the same microprocessor as the TI-99/4. When I saw the “BLWP” (Branch and load workspace pointer) instruction, I knew it was that processor. AFIK, it was the only, or one of very few, processors to use that register architecture so that one called a subroutine by loading a new set of registers, including IIRC, the program counter.
A semester or two after I took the class, they changed to using 68000 and Atari 8000s.
Wait until you see it run through my modified NorthStar Horizon with the program inputted through paper tape.
I did it on a Signetics 2650 system based on the 1979 Electronics Australia magazine project. It's on my YT channel. My last post seems to have been deleted...
Hello world
My ears perked up!
Cat just yawned "hellorld"
I really enjoy your channel. Great contents very well explained. Making these video's must be a hell of a lot of work.
This time, I have a little question: I'm not familiar with the specific Centurion assembly, but shouldn't there be some kind of an 'ENDPROG JMP ENDPROG' or a 'HLT' between the 'JSR PRINTNULL' and the 'DW X'8D8A'' lines so not to execute the bytes 0x8a, 0x8d, 'HELLORLD'!, 0x00 as part of the program after returning from PRINTNULL ? Or are DB, DC and DW allocations automatically put in a different data segment?
I'm looking forward to your next video!
It's a bit more cursed from my understanding, the print subroutine *modifies the return address* while consuming those data bytes to print them, so when the `RSR` opcode is executed it returns to the point just past the string data. Instead what seems to be missing is a `HLT` right before the PRINTNULL entry point to stop the CPU from getting back into the subroutine code the second time.
One moment I thought you would run Hellorld! on a pinball machine
He said the word(s)!!!!!
Hmm… I have A Tms9995 based computer, built from a kit in the 80s. Might give this a whirl.
That sounds like a Powertran Cortex! ;-)
Does it need to be software? I have some ideas that are more hardware-based and as such they would violate rule #1. Do you think you could make an exception?
It's "Hellorld" for me from now on.
TI-99/4 is plenty unique. It's not a 6502 or 8080 or Z-80 or even 8088.
Many people don't reallize this was the first consumer 16-bit CPU competing against the 8-bit machines of the day. Also, as you suggested, TI kept specific programming information very close to their vest. You were supposed to "just use BASIC."
@16:26 / @16:45 What calculator is that? Is that an old LED TI-30?
If you had made this program print anything besides HELLORD! - like something crazy like "Hello World" or some other nonsense I would have been so mad.
Quick, register "Hellorld" as a trademark or maybe you will get in trouble and will be sued by someone who is faster than you.
From memory its long ago Hellorld for the zx Spectrum all hex (Z80 Assembly)
org 8000
LD HL, text
next: LD A,(HL) ; fetch character
CP 0 ; check for zero
RET Z ; return if zero
RST 10 ; print character
INC HL ; increase pointer
JR next ; next character
text: DB "Hellorld!"
DB 0
start with randomize user 32768
OR A instead of CP 0? I think it’s one byte shorter.
@@peterfireflylund
Yep i was not sure
Damn! You're first! :-) I'd put DB 22, 12, 11 before "Hellorld!" to place text at center of the screen. Also call #0d6b then ld a,#02: call #1601 to clear screen and setup output to main part of the screen
@@SemizarovAV
Could not remember the Clear screen routine, its long ago i program for the speccy.
That's assembly. Hex would be
21 00 81
E7
FE 00
... (etc)
I should put Hellorld on the iPod Classic!
i have the TI99 4a with the alps key switches. currently no monitor. so i have yet to try it, but i came advertised as working and came with some things, its in really good shape. my radioshack coco2 uses a tv but i would like to find a more period correct one, my vic 20, ibm 5150 and apple iie all have their correct monitor, and of course my radioshack trs80 model 3 as thats all in one. i only use them for the games as i never learned basic. i also have the atari 2600 and NES.
2:56 sounds very like the old DOS debug program!
And there's ne thinking this had to do with 8 letter file names or something
I would also consider this the VIC-20 friendly version of HW ;)
Would a machine that has two architectures in one (a la DEC Rainbow) would satisfy rule #2's requirement even if it's two common architectures (in my case, x86 and PowerPC/AIM PowerISA)?
If yes, I've got a potential candidate... It's not a very unique machine, but I feel it's a significant oddity that it would qualify.
Would the CPU-6 be considered a CISC processor or is that not relevant to CPU's from that era?
Looks like that 6 key is a bit sensitive.
I can do one on my Apple IIGS if that counts...
Revision is coming up in March next year maybe this is the first step to doing a demo on Centurion and submitting it to the oldschool compo?
Have it print "All Your Base Are Belong To Us!" or "Don't Panic!" or "Bite My Shiny Metal A**!".
When are you going to try getting the printer working?
I also read it as 'hell-orld' :)
That convention that the JSR 0x8623 reads from the next byte of the return address (and then jumps back after the 0 byte) is odd
But it's rather smart. It makes it easier to place the text right un the middle of the code and it spares a load instruction for the start of the text. However, it only works for static text.
@@heinzk023 or self modifying code ,)
Systems needed the Desktop system and the Bendix/es ?
if you're a total nerd you got the joke the first time you saw the world haha, but the details of it made it even funnier!
e: not even bothering to correct that one
You should add TI-99 to the title.
can you super smart folks, out here condition this machine by way of a compiler . to run MS-DOS 2.01 or DOS 5.1 which i think was my very first introduction into a windows look and feel ,operating system. i feel? 👈👺👀👀👍
Should have ended the Hellorld vid with THEND.
Just a small point - your "HELLOLRD" string isn't ASCII, it's ASCII with the top bit set. Which given some of the 8-bit micros around in the seventies might have output graphics, or flashing text, or inverse text... maybe even actual text!
p.s. I've just built myself a new 65c02 proof of concept SBC that has no fixed memory on board and requires the serial download of a binary file before it will run anything. It could be a tiny boot loader or (as I'm using it at the moment) it could be e.g. MS Basic from 1976. It's definitely an IPL though :)
Confused... where does the first instruction after reset live? Do you write ram with something other than the 6502 and then bring the 6502 out of reset to run it?
@@rivimey I use three 74lv8153s (which accept UART data if it's in the right shape) to drive the address and data; the signal which enables their outputs disables the 65c02 output busses and holds the reset low. Once the upload is finished the 65c02 is enabled and the reset goes high, so it wakes up. If you remembered to include the reset vectors in your initial hex file...
I massage the hex file to give the specially formatted file that the 8153s require (they accept a four bit data half and a 0-7 address, so need two writes per byte).
I've heard of hoarding, but this must be hellorlding? :)
I don't have a unique system I know how to program in Machine code, but,
here is a version for the ZX Spectrum.....
10 DATA 33,19,125,126,222,0,
40,8,205,55,25,35,195,3,125,
205,61,31,201
20 DATA 72,69,76,76,79,82,76,68,0
30 FOR f=32000 TO 32027: READ a: POKE f , a: NEXT f
40 LET l=USR 32000: PAUSE 0
Just type it into BASIC. And RUN it.
I wonder if one could hook up 9 Commodore 64's, and have them display one huge letter of "Hellorld!" each?
I have enough C64s to pull it off, but not enough power supplies. And unless I use as many tiny TVs as possible for it, the total image size will be... smol. And then again it'll be an insane amount of work. And then again I'd rather use the C64s to listen to music.
I have enough TVs/monitors to pull it off, but none of them are identical apart from two 1701s.
@@senilyDeluxe Well, it's a cool thought, nonetheless!
When will someone create a new version of the TI99/4A running a TMS99105A with 512MB of RAM and a VGA adapter.
It will still feature 128 words of 'scratchpad' RAM.
@@Peter_S_ I would have thought that 15GB=536870912 Bytes of RAM.
Back around 1988 I designed a colour graphics card for a TMS99105 system and wrote the device drivers. The display card used the MHS82716, and had 128k bytes of RAM. Not VGA though, but it supported text and graphics with sprites. The host used the 74LS610 memory mapper chip and supported up to 2MB of system memory. The graphics project died, but the rest of the system was in production for around 10 years from 83 to 93. It was a key part of my career in hardware and software design. I still have some of that hardware in my collection.
(19:35) _“There are 16 workspace registers: R0 through R16.“_
Wouldn´t that be instead R0 through R15?