Тёмный
Hopper Development Environment
Hopper Development Environment
Hopper Development Environment
Подписаться
The purpose of this channel is to provide more thorough documentation about Hopper that is easy for people familiar with modern semi-colon and curly brace languages (like C# or Java) to follow.
Ordering your PCB : Hopper 6502 SBC Part 1
7:31
19 часов назад
Useful Tools: Hopper 6502 SBC Part 2
6:36
19 часов назад
Sourcing Components: Hopper 6502 SBC Part 3
15:07
19 часов назад
USB-C for your project power: TLDR
7:54
День назад
Tigger C : an efficient 6502 C compiler
49:04
21 день назад
Hopper : all about the file system
31:26
21 день назад
Hopper on Teensy 4.1 - first steps ..
8:46
Месяц назад
Hopper development using Chat GPT
13:33
Месяц назад
Hopper single board 6502 : final PCB
17:27
Месяц назад
I2C on the Hopper Minimal Runtime for 6502
3:30
2 месяца назад
Комментарии
@NoHandle167
@NoHandle167 2 дня назад
How is this channel not famous yet ?
@DavidLatham-productiondave
@DavidLatham-productiondave 3 дня назад
Ace!! The runtime runs sweet now on the 6502-Retro!
@hanspeterbestandig2054
@hanspeterbestandig2054 3 дня назад
Very cool Project! You explained the internal Functions of the compiler as well as the challenges you was faced with very well! Thank you for sharing your knowledge with us! 👍👏👏👏
@bobcharles3029
@bobcharles3029 3 дня назад
shithub links not working
@biggertigger
@biggertigger 3 дня назад
Fixed. Thanks.
@coffeecuppepsi
@coffeecuppepsi 3 дня назад
This is amazing. Id love to run this on my 6502 emulator. Current it has basic , Ben Eater project ", but I want to work out how file save and load is done. I imagine it's the same system call on any 6502 OS?
@biggertigger
@biggertigger 3 дня назад
It is as simple as possible a set of file system APIs (with support for multiple levels of subdirectories) I could come up with: - using 8 bit indices in the file allocation table (FAT is one 256 byte block) - requiring only two external APIs (read a block of 256 bytes, write a block of 256 bytes) - while accepting that it was designed to support my tiny serial EEPROM (64K max), for now
@Coffeenator3000
@Coffeenator3000 4 дня назад
Really been interested in the MECB system.
@biggertigger
@biggertigger 3 дня назад
Mine is in the mail. I'm first building a 6502 version and then later I plan to build the 6809 version (which is why I started working on a 6809 Assembly toolchain for Hopper).
@tlclstuff
@tlclstuff 4 дня назад
BE6502 Memory map is: Ram - $0000-$3FFF 6551 - $5000 6522 - $6000 Rom - $8000-$FFFF
@biggertigger
@biggertigger 4 дня назад
Thanks. You could tell that I spotted that I was wrong mid-video. These clash with the 32K SRAM on our board. Easiest fix is to configure the heap to end at 0x4FFF for now for the BE6502. Corrected and tested: (PLD update is easy .. if we abandon 12K of RAM for 2 ports) github.com/sillycowvalley/Hopper/commit/6384669248ebc17fcef095abddf55e64f2445bcb
@DavidLatham-productiondave
@DavidLatham-productiondave 3 дня назад
My 6502Retro ROM begins at C000 and ends at FFFF. When I make the ROM image for the SST27F512 flash, I concatenate each of the 16k images together and flash them all at once. So the assumption that ROM ends at FFFF is perfectly fine. 😊
@RoyAntaw
@RoyAntaw 4 дня назад
What are great project I think I need to build one of these boards, as the 6502 is my favourite 8-bit processor. When I order my PCBs I'm going to do them black, I think.
@ownpj
@ownpj 5 дней назад
Thanks. Very informative.
@markhebberd5285
@markhebberd5285 5 дней назад
Show me LCDs.
@biggertigger
@biggertigger 5 дней назад
:-) Oh, all right ...
@Coffeenator3000
@Coffeenator3000 6 дней назад
Actually in the early 70's it was common to use another mini computer for development like a PDP-11.
@GeorgeTavernKeeper
@GeorgeTavernKeeper 4 дня назад
Yeah, early Microsoft products (BASICs etc.) were developed using a PDP-10 (IIRC). They used a peculiar approach to build emulators for microcomputers: when running compiled i8080 or 6502 code, the system would raise "Unknown Instruction" interrupts, and the handler would look up a subroutine for that instruction, execute it and pass control back to the program, which would step to the next instruction… rinse & repeat. That allowed Allen and Gates to quickly build emulators for the new systems they targeted
@RoyAntaw
@RoyAntaw 6 дней назад
Great work. I always clean the flux off my boards with a little isopropyl alcohol, paper towel and toothbrush (don't use your own or your partner's to brush from the bathroom :-).
@biggertigger
@biggertigger 6 дней назад
:-)
@christophereddy9263
@christophereddy9263 9 дней назад
Cool.. when are you adding an RTOS and hardware debugger? Kidding aside, this is very smart, and I have an immediate use for it!
@bigfarfar219
@bigfarfar219 10 дней назад
I see that you are using the ATF22V10C PLD chip, does it get hot? I'm using it in my 6502 computer design and it gets quite hot, and I was wondering if this is normal?
@biggertigger
@biggertigger 9 дней назад
No. I used the same PLD in my previous design too and it never got warm on that board either.
@bigfarfar219
@bigfarfar219 8 дней назад
@@biggertigger Wonder what i could be doing wrong then. My design works peerfectly but the PLD gets pretty damn hot.
@biggertigger
@biggertigger 5 дней назад
What's the part number of your PLD and what speed are you running the CPU at? Mine is the F22V10C-7PX (7ns propagation delay) and I'm running at 8MHz (125ns clock cycle period). The slowest 22V10C would be around 25ns propagation delay. Clock period for a 14MHz 6502 would be 71.4ns - at that point that's a significant chunk of the clock cycle being allocated to glue logic. I still think it shouldn't get warm (the negative effect should be unreliable behaviour). Another possible reason for heat could be overloading one of the output pins by trying to drive too much. Have you shared your schematic anywhere? I searched for generic overheating reasons for CPLDs. Maybe one of these triggers an idea of what's going wrong: - applying a higher voltage than specified can increase power consumption and heat generation - driving too many loads or driving outputs that require more current than the PLD is rated for can cause excessive current draw and heating - connecting too many inputs to a single output (high fan-out) can increase the load on the output driver, causing it to draw more current and generate more heat - if the internal logic of the PLD is poorly designed, it can lead to unintended oscillations, which can increase power consumption
@bigfarfar219
@bigfarfar219 2 дня назад
@@biggertigger Thank you for being so incredibly helpful, it's difficult to find information about these old plds haha. The part im using is ATF22V10C-10PU. I don't have the schematic in digital form unfortunatley, but basically it's just simple glue logic, I'm using all the IN pins as adress input and the I/O pins as outputs. I run the system at 8mhz, same as you. The last thing you point out there might be the culprit. "if the internal logic of the PLD is poorly designed, it can lead to unintended oscillations, which can increase power consumption" But I looked at your PLD code and it's pretty similar to mine. I am however not using pin 1 as the input for the clock, the clock is connected to another IN pin. The output is connected to at most 5 CMOS inputs, which should be within spec. The system runs at 5V. When meassuring with a heat camera the PLD stays at a constant 50degrees celsius or 122degrees farenheit
@DrMortalWombat
@DrMortalWombat 10 дней назад
Great progress there. I tested the Sieve benchmark with Oscar64 on a C64 and got 12.5 seconds - so there may still be some easy gains for your compiler.
@biggertigger
@biggertigger 10 дней назад
Nice. 1.023 MHz version, I presume. Out of interest, can you share the C code? Here is my version: gist.github.com/sillycowvalley/37afedf1cb7105e70ad7b51ce7cb8105
@DrMortalWombat
@DrMortalWombat 10 дней назад
@@biggertigger This is the version I have based my test on, just hammering it into C shape with printfs, [] and clock_t. It is a PAL C64 running at 0.985MHZ. Without badlines and at 1MHZ we would be at around 11.4 seconds.
@biggertigger
@biggertigger 10 дней назад
That's pretty darn impressive!
@DrMortalWombat
@DrMortalWombat 10 дней назад
@@biggertigger You made the perfect comment at the three minute mark. The extrem disparity of modern compilers and systems and the potential code size of the target system allow for an amount of optimization that would not be possible in a reasonable amount of code and time when compiling on and to systems of comparable power. Oscar64 can easily consume gigabytes of RAM when compiling larger cartridge based games.
@biggertigger
@biggertigger 10 дней назад
Can you share the disassembly for your version of main() for Sieve?
@soteful9949
@soteful9949 10 дней назад
You may want to invest in a mic filter shield.
@biggertigger
@biggertigger 10 дней назад
I actually have one, just wasn't using it. My cloth ears can't hear the difference but I'm keen to learn more since the video part is clearly not one of my strengths. I just did some test recordings with it to see if I could hear the difference. Happy to be schooled on this .. already using the RNNNoise filter in OBS to remove my keyboard noise (on the advice of another viewer).
@soteful9949
@soteful9949 10 дней назад
@@biggertigger Either that or get further back from your mic. It's picking up too much. Nice video though. I have videos up on my other channel, so I'm speaking from experience.
@anon_y_mousse
@anon_y_mousse 12 дней назад
Cool project. I've been thinking about adding a 6502 target to my code generator. The best advice I can give you is to not use recursion, especially for such a limited platform. It's been my mantra for years to avoid recursion because it's rather easy to accidentally blow the stack when you have one, and worse when you don't. I am a little curious why you left the Fibonacci implementation as recursive since it's so easy to write iterative. Also, I'm curious if the 6502 detects overflow and throws an interrupt in such a situation since as you started writing that one loop it would've been infinite without it as an unsigned 8-bit value being used as a counter with an exit condition of `i <= 255` would loop infinitely. Luckily you changed it to 10, but if your compiler doesn't detect such cases you should consider adding some code to do so. An easy catch is when it's a constant, but if it's a variable that you can't immediately determine the value of, then a good rule of thumb would be if the typeof() the exit condition is unsigned then warn on it at the very least.
@biggertigger
@biggertigger 12 дней назад
>I am a little curious why you left the Fibonacci implementation as recursive since it's so easy to write iterative. This is a deliberate test, usually fibo(24), to test both function call performance and that we have at least got reasonable stack depth capability. It was originally ported from MicroPython to benchmark the Hopper VM on RP2040 against MicroPython .. and then I found that it is also good test to check if we have a reasonable amount of stack depth .. For Hopper, I have a CHECKED build mode which does tons of stack limit checking and also checks that stack balance is as expected on exiting a function (SP same as it was on entry). I intend to add a CHECKED mode to Tigger C. Obviously it is not something you want in production code (and it also includes other checks like range checking on arrays, division by zero, etc)
@anon_y_mousse
@anon_y_mousse 12 дней назад
@@biggertigger If you don't already, you should consider doing static checking in the compiler for obvious things. Loop conditions like `i <= U{TYPE}` should net a warning at least when you can't check the value and if they use a constant that matches U{TYPE}_MAX it should be an error.
@biggertigger
@biggertigger 12 дней назад
Agreed. "for (byte i = 0; i < 256; i++)" is the common form of this mistake for Tigger C. Really should be caught at compile time. Another variant of this is "while (i > 0) { i--; }" for an unsigned type. Hopper currently catches neither of these ..
@notexactlysiev
@notexactlysiev 15 дней назад
This is very cool! That llvm-mos project can generate fairly impressive code nowadays, but I still like seeing languages made specifically to target the 6502.
@billchatfield3064
@billchatfield3064 16 дней назад
What are the tall yellow bars on your bar graph? They're not labeled so I can't see what you're comparing it to.
@biggertigger
@biggertigger 15 дней назад
Yellow is the times or Hopper (which runs on a VM), orange Tigger C.
@billchatfield3064
@billchatfield3064 16 дней назад
You might as well use Pascal or Modula-2 which has these features. It's going to be hard to remember the differences between this pseudo C and real C.
@tiggerbiggo
@tiggerbiggo 16 дней назад
nice name
@biggertigger
@biggertigger 16 дней назад
Couldn't agree more. :-)
@bugeyedcreepy
@bugeyedcreepy 17 дней назад
Hey! Nice! this is Awesome! Also, Welcome to the MECB ecosystem too! can't wait to see more...! :D
@biggertigger
@biggertigger 17 дней назад
I have a 6809 RetroShield on the shelf ... just started work on a 6809 toolchain for Hopper ...
@tmbarral664
@tmbarral664 17 дней назад
Just a thought You may try a LDA $FF,X instead of DEX LDA $100,X ;)
@biggertigger
@biggertigger 17 дней назад
Thanks. Well spotted. Had a problem with $00FF (probably because the Hopper 6502 Assembler saw it a $FF which would make it the zero page version of the instruction where adding X wraps back into the zero page). However, even $00FF, X is suboptimal because it causes the crossing of a page boundary (+1 cycle). So, the eventual implementation of your idea was put the offset of the MSB in X instead. Here's your DEX-less / INX-less version without the zero page wrap or extra page boundary cycle cost: // POPL [BP+0x00] // POP [0x01FF - BP -0] (16 bit) LDA ZP.BP SEC SBC # 0x01 TAX PLA STA 0x0100, X // MSB PLA STA 0x0101, X // LSB Or: // INCLI [BP+0x00] # 0x0001 LDA ZP.BP SEC SBC # 0x01 TAX INC 0x0101, X // LSB if (Z) { INC 0x0100, X // MSB } (and yes, the premble in these two cases should be LDX ZP.BP followed by DEX - this is what the code looks like between peephole optimizer and whole program optimizer)
@tmbarral664
@tmbarral664 17 дней назад
@@biggertigger I believe you were mentioning something similar in the video so I may be repeating you…. 😀 But a further optimization here would be, for value of 1, to replace the SEC SBC #$01 By TAX DEX ;)
@biggertigger
@biggertigger 17 дней назад
Yes. See the note at the end of my (long) reply above. Here's an invite link to the Hopper Discord server if you are interested in further optimizations ... :-) discord.gg/H8cVAvhK
@DrMortalWombat
@DrMortalWombat 17 дней назад
@@biggertigger The main problem is the code representation on which you try to perform the optimizations. A stack based evaluation hides most interdependencies - you notice this in your video at around the 29 minute mark. Since the 70s compilers use intermediate representations that expose the dataflow, which culimated into SSA in the late 80s. The other problem is the low level at which you start optimizing. Compilers usually go through several levels of lowering from AST over SSAs with various levels of IL, and finally assembler with basic blocks. Each of these levels provide inside and optimization opportunities for the compiler, that cannot be done by later stages. So your compiler may benefit a lot, if you try to go with a more dataflow virtual register representation before the actual assembler.
@dr.ignacioglez.9677
@dr.ignacioglez.9677 18 дней назад
I REALY LOVE 6502 ❤❤❤
@DrMortalWombat
@DrMortalWombat 19 дней назад
The 6502 is in fact a nice target for a C compiler. And it does help, if the compiler plays to its strength, e.g. using zero page instead of stack allocated variables. Most code is non recursive, so a static allocation of local variables can be done with a simple call graph analysis.
@biggertigger
@biggertigger 17 дней назад
Excellent suggestion. Thanks. Globals can now at a configurable location (any starting point and range in the zero page is an option, or just somewhere else in memory). I added call graph analysis (required lightweight first pass) and now I allocate most locals statically in the same location as the globals. With this, and other improvements, the Sieve benchmark is already running > 2x faster than in this video (2.3 seconds).
@espfusion
@espfusion 16 дней назад
First time I've heard someone actually think 6502 is C friendly but I respect this perspective! If your whole program's live local variable footprint fits in 256 bytes you can manage okay but if not things could get tough. Not sure what the best strategy is then, maybe relocation? I don't think MOS made the wrong choice but if they found a way to fit a 16-bit SP or zero-page relocation thst may have been a game changer. Then again 6809 wasn't really ever that big so who knows.
@biggertigger
@biggertigger 16 дней назад
I've moved on from benchmarks to use Tigger C to implement something useful: a little file system for the serial EEPROM on my 6502 SBC that runs the Hopper Runtime (virtual machine). Since Tigger C emits my Hopper 6502 Assembly syntax, I'll easily be able to prototype in C and then integrate the resulting assembly into the Hopper Runtime (which is all 6502 assembly). This exercise should prove one way or the other if Tigger C is actually good for anything in the real world ...
@DrMortalWombat
@DrMortalWombat 16 дней назад
@@espfusion A stack is only one way to implement the calling semantic of C. Most real world programs that you want to run on these machines are not recursive, and thus local variables can be assigned to a "static" stack using call graph analysis. I have spent almost three years now implementing a C++ compiler for the 6502 (Oscar64) - and given the limitation of the potential programs that may be developed for the platform the CPU is an excellent design for a high level language target.
@espfusion
@espfusion 15 дней назад
@@DrMortalWombat Understood, it's a good strategy. Still, even just storing the maximum live variable depth you're probably going to run out of zero page space pretty quickly, especially with competition from global/static variables and other housekeeping needed in zero page. You can start allocating the rest by absolute addressing but you'd still need pointers to be somewhere zero page at least temporarily, so I wonder if it's not usually better to just start spilling the oldest variables to and from absolute space in big blocks and writing the new stuff there... Also, while I do expect actual loop recursion isn't that common (and pretty easily specially cased) it's probably a lot more common to see the same functions appear at multiple sites in a call trace. I assume this would be handled at least to a point by aliasing the function into multiple versions but that becomes a bit of a code bloat problem.
@DavidLatham-productiondave
@DavidLatham-productiondave 21 день назад
8mhz on an 8086 could well be slower than your 8mhz 6502. The 8086 had many more cycles per instruction than the 6502. Most of the 6502 instructions are only 2 or 3 cycles long. Then you start getting into wait states for IO and other complexities the 6502 just doesn't have and these benchmark comparisons become hard to reason about.
@biggertigger
@biggertigger 21 день назад
Exactly. The 6502 shares its small instruction set and minimal cycles per instruction with later RISC processors. It's clear that the engineers at Acorn drew inspiration from the 6502 (used in their Atom and BBC Micro computers), influencing their design philosophy for the first ARM processors. Creating benchmarks where the 8086 excels would be straightforward: just perform multiplication or division using the MUL and DIV instructions, or leverage string-specific instructions like SCAS and CMPS. I'm pretty sure the Mandelbrot demo / benchmark would be way faster on an 8086 (thanks to IMUL and IDIV).
@DavidLatham-productiondave
@DavidLatham-productiondave 21 день назад
@@biggertigger yeah, I very conveniently failed to acknowledge the superior alu in the later processors. LoL. I should be in marketing.
@MechanicaMenace
@MechanicaMenace 18 дней назад
​​@@biggertiggerboth at the same clock speed I'm not sure. The MUL and DIV operations aren't very efficient. They helped reduce memory operations which back in the day did help the 8088 and 8086 make up for their lack of bandwidth and win out on multiplication and division but back then we were comparing ≈1mhz 6502s to ≈5mhz 8088/8086s, and in most other cases we thought of them being roughly equivalent. Both at 8mhz would see what? The 6502 at 8MiB/s, the 8086 at 4MiB/s, and the 8088 at 2MiB/s. I'm not sure even the native 16bit ALU could make up for that. Edit: this is me being curious rather than argumentative btw. I was more of a 68k weenie anyway 😋
@espfusion
@espfusion 16 дней назад
It's not really a fair comparison because the 6502 basically needs 4-8x faster memory. At 8MHz in the early 80s you're probably already limited to SRAM. Hence why you didn't see > 4MHz 65xx until you got cards with small SRAM caches.
@biggertigger
@biggertigger 16 дней назад
@@espfusion I've already got it running about 2x as fast as it was a week ago (2.2 seconds for the Sieve benchmark compared to 4.5 seconds in this video). Even after multiplying that by 8 to make up for my 8MHz clock, that's faster than anything on 6502 from the BYTE magazine article other than a pure assembly solution. Most of the speed improvment came from implementing a suggestion from @DrMortalWombat to use simple call graph analysis to determine which locals to use static storage for (zero page of course). The compiler uses what is available and then overflows into regular memory (which is still faster than BP+offset stack storage). With the exception of the Fibonacci sample, all local variables can be static. Arguments are still on the stack (obviously). One massive advantage we have over the gods of the 70's, like Woz for example, is our completely overkill development platforms. Back then it was mostly self-hosted which is incredibly impressive. So much easier for me to just focus on the outcome without worrying about how efficient the tools are.
@derekchristenson5711
@derekchristenson5711 23 дня назад
Neat!
@DavidLatham-productiondave
@DavidLatham-productiondave 29 дней назад
Heyo. Please can you invite me to the discord server?
@biggertigger
@biggertigger 29 дней назад
See my reply on GitHub, or: discord.gg/QmZ68cmQ
@Rich-can-do
@Rich-can-do Месяц назад
That's a lovley looking PCB. I see two cyrstals. Does it have hardware serial too? I dont care for the max chip
@biggertigger
@biggertigger Месяц назад
Yes, my previous board last year used the MAX232 as per Ben Eater's design: www.hackster.io/michael-cartwright/rs232-using-the-motorola-6850-acia-with-a-6502-computer-33ea36 It seems kinda silly to convert from TTL to RS232 and then back again so this time I just went direct to FTDI. Current version with schematic can be found here: github.com/sillycowvalley/Hopper/tree/main/Source/Projects/6502SBC/EasyEDA/6502%20Machine/rev12
@Rich-can-do
@Rich-can-do Месяц назад
@@biggertigger Not a Max you dont need it. that is a voltage pump. As you would know. We really only need 0 and 5 volts. no Minus or 25+ stuff that was way back in the day when they had looooooong cables and they needed it. Today we use things like arduino and they just use 0 5 volt serial perfectly fine.
@Rich-can-do
@Rich-can-do Месяц назад
@@biggertiggerThat makes more sense to me as well. Ben Eater I am not sure why he would want to do that old rs323 as only older gear will be able to use it. I am glad you are working on Hopper cross platform. I am very quickly running out of love for the 65uino. If your very skilled with assembly and such I feel it would be great for you, but I am a newbie and I feel Anders great patience will run out very soon with me
@Rich-can-do
@Rich-can-do Месяц назад
I really like the look of hooper. I would love to check it out. I am getting a very basic Ben Eater PCB soon I hope. and I will be just doing newbie asm stuff with it, no trying to load code into ram.
@Rich-can-do
@Rich-can-do Месяц назад
I dont care for windows but I very much like the look of hopper
@Rich-can-do
@Rich-can-do Месяц назад
Maybe I can run Hopper with WINE? it looks very nice
@Rich-can-do
@Rich-can-do Месяц назад
This looks amazing can I run this Hopper on Linux?
@biggertigger
@biggertigger Месяц назад
I've been dabbling with a cross-platform version of the desktop runtime using Terminal.Gui (with .NET Core). I like this approach since it could give me a single version to maintain for Windows, macOS and Linux. If there is interest in that sort of solution, I'll continue with that project.
@Rich-can-do
@Rich-can-do Месяц назад
@@biggertigger That is great, as linux has a lot of tools to use. cross platform would be super nice.
@carlo_geiss
@carlo_geiss Месяц назад
no chat gpt please ... it's nonsens ...
@biggertigger
@biggertigger Месяц назад
That's what I believed too .. until I tested GPT 4. It excels at the boiler-plate / boring stuff. For example, generating documentation. Take a look at this page. It was entirely generated by GPT (zero edits, modifications or formatting by me : I just gave it the source code for my HopperFORTH and asked it to generate reference and user documentation). It may be a bit boring but it is a hell of a lot better than the documentation I would have written (nothing): github.com/sillycowvalley/Hopper/tree/main/Source/Languages/FORTH
@DaveVW
@DaveVW Месяц назад
See some use of SD support in c-simple-emu6502-cbm project on my github, davervw, unified branch that does SD slightly differently on Teensy 4.1 vs. ESP32. I think the trick is Teensy supports multiple simultaneous filesystems differently.
@biggertigger
@biggertigger Месяц назад
I've added some references to the source from the Teensy site (for SD and timers/alarms). The problem I'm having now is a conflict between the generic/Teensy SDFat library and the RP2040 library : it is a bit annoying that you don't seem to be able to keep them both installed at the same time.
@DaveVW
@DaveVW Месяц назад
@@biggertigger Maybe I'll run into the same conflict with RP2040 when I get around to integrating it. Between ESP32 and Teensy I get warnings about multiple SD libraries but it seems to resolve. Maybe you can temporarily rename libraries to resolve the conflict. Maintenance nightmare though.
@instatemp
@instatemp Месяц назад
I am working on a game using esp32 and oled display module, are you interested
@biggertigger
@biggertigger Месяц назад
Sounds interesting. In C, I assume? I'd love to port it to Hopper as a demo on the RP2040 when you are ready with it. Here's an invite to the Hopper Discord server if you want to discuss: discord.gg/xbskyHGG
@instatemp
@instatemp Месяц назад
@biggertigger getting an error saying the link is invalid
@biggertigger
@biggertigger Месяц назад
@@instatemp They expire after a while. Here's a fresh one: discord.gg/D5qf4fHr
@Rich-can-do
@Rich-can-do Месяц назад
It looks like the screen is in graphics mode?
@biggertigger
@biggertigger Месяц назад
The SSD1306 OLED is essentially a matrix of monochrome pixels (it only has 'graphics mode'). My sprite engine works in 4x4 pixel cells because it is designed to minimize memory use on the CPU side : to have a memory map of the entire matrix of pixels would take 1K. The 65uino only has 128 bytes total. I keep track of my sprites rather than the entire display to make this possible. When running on my 6502 SBC we have 32K of RAM available so this is a non-issue (and the Hopper library keeps a 1K buffer for this screen and supports graphics and text APIs similar to the AdaFruit APIs for MCUs, but on the 6502).
@Rich-can-do
@Rich-can-do Месяц назад
Very interesting. I am writing 6502 asm and I am translating some code. I am a neat freak and like things is the right places. I like my vars. EQUs at the started. I like my data at the end. I am using the as65 assembler and cl65 linker. I really like the idea and see what you can do with one of these displays. I am using Ben Eaters design. This gives me 16k or RAM *HUGE RAM* compared to 128 bytes. I am on a Linux machine. I want nothing to do with Billy's software. I have lots of breadboards and atmega328ps to play with, maybe its possible to set it up in my mintlinux?
@Brian_Of_Melbourne
@Brian_Of_Melbourne Месяц назад
I'm trying to get an overview of the project, rather than detail. So I googled. This came up second: publications.lib.chalmers.se/records/fulltext/218906/218906.pdf Is this it?
@AndersNielsenAA
@AndersNielsenAA Месяц назад
Nice board! It’ll do amazing things🎉 If you forced some suggestions out of me it would be to round the edges, add a ground pour, and maybe break out all busses and control signals .. but that takes space too :) I’m sure you’ll be happy with it 😊
@biggertigger
@biggertigger Месяц назад
Yes, there is room for a revision by someone that isn't a software guy. ;-) (the top layer is indeed filled (GND))
@DaveVW
@DaveVW Месяц назад
I like the PCB! Great work!
@DaveVW
@DaveVW Месяц назад
Hint: I've had boards built with 6-pin holes staggered back and forth just a bit so they grab the FTDI pins very well, and only a tiny extra resistance putting in, but the plus is an even better connection without soldering. I stole the idea from others.
@biggertigger
@biggertigger Месяц назад
You mean like a minor zig-zag and just regular thru-plated holes?
@DaveVW
@DaveVW Месяц назад
@@biggertigger exactly!
@AndersNielsenAA
@AndersNielsenAA Месяц назад
That is so cool 😎 And it doesn’t look like you’re missing cycles for smooth updates at all. Exactly what the 65uino was made for 🎉
@AndersNielsenAA
@AndersNielsenAA 2 месяца назад
Nice progress! 🎉 The next version of the 65uino will also have an i2c EEPROM for exactly that reason - besides being able to erase and write to its own ROM if it’s 5V/flash based.
@petermuller608
@petermuller608 2 месяца назад
The IDE reminds me of the good old Turbo Pascal days. Very nice
@biggertigger
@biggertigger 2 месяца назад
Indeed. 'uses' and units are absolutely inspired by Turbo Pascal. My favourite time spent with Turbo Pascal was circa v4, just before objects were introduced. In Turbo Pascal they were a necessity to provide separate compilation units but the same structure still allows you to live without project files, a 'make' utility, etc. And then there are the obvious benefits (like encapsulation).
@paulscottrobson
@paulscottrobson 2 месяца назад
On my to watch list. Have you thought of using Agon (eZ80) or Neo6502 (65C02) as your base machine (Disclaimer: I'm one of the firmware authors on the latter !) ; they're fairly cheap (£50/£30) stand alone machines. (eZ80 is *very* like a fast Z80 with 24 bit address registers if you don't know it)
@biggertigger
@biggertigger 2 месяца назад
I have two Neo6502's and I'd appreciate a little help getting from zero to WozMon using the Arduino IDE. After that, I'd be able to get my 6502 runtime working on it. Need to simulate RAM, ROM and an ACIA (prefer 6850)
@biggertigger
@biggertigger 2 месяца назад
discord.com/invite/wsR6vBDC
@SainiSalami
@SainiSalami 2 месяца назад
Very impressive. Well done!
@sosoo383
@sosoo383 2 месяца назад
Increase the sound please!!!
@Thomas10962
@Thomas10962 2 месяца назад
So cool!!
@carlo_geiss
@carlo_geiss 3 месяца назад
very very nice idea ... i'm interested cause i'm a 6502 passionist since the early days in 1978 ... but please make a version for Linux ... i don't use windows any more since i pushed out of my working company ... or push the sources at your github ... that i can compile myself ... but it's a very nice project here ... good luck ... greetings form North-Sweden ... Carlo SA2KHG/DG5FW ...
@biggertigger
@biggertigger 2 месяца назад
All the source for the different runtimes is on GitHub. A good starting point for a Linux port would be the C version of the Portable Runtime that I use to get the VM onto Arduino-style device (like the RP2040 boards). This version of the runtime is machine translated from Hopper to C (easy to update as the runtime evolves in future). To get a client runtime working (to support a first class GUI development environment including editor and debugger) you need very little from the host operating system: - 2x keyboard APIs (IsAvailable and ReadKey) (mouse interface is done as 'special' keyboard events) - 6x screen APIs (Columns, Rows, SetXY(col, row), Print(char)) - one font, foreground and background colours for text cells - access to the file system (Arduino version is close to the usual C / Linux file APIs) - 5x COM port APIs (Connect, Close, IsAvailable, ReadChar, WriteChar) That's it. Getting a blinking text cursor can be dealt with later .. Interested in taking on the project? Here is an invite to the Hopper Discord server: discord.gg/v9p8rDPk
@carlo_geiss
@carlo_geiss 2 месяца назад
@@biggertigger thanks for your work and the answer ... i will discover these C Area .. ok ...