sark02 wrote:
It might be fun to hear about members' largest 65xx programming feats (as opposed small projects that integrated large external works).
The largest single assembly language project I ever did was a truck (lorry) leasing and billing package that ran on a bunch of Commodore 128Ds multiplexed to an 80 megabyte Lt. Kernal hard disk subsystem. The package made heavy use of ISAM databases, which were not natively supported by the Lt. Kernal DOS, requiring that I scratch-develop a lot of primitive code to manage record and file locking, arbitration of access, etc.
The finished project had nearly 100,000 lines of code. Assembling the entire package took nearly two days of run time. However, excepting a REX (resident executive) and the ISAM database engine, programs were mostly standalone and could be independently assembled, with all definitions in INCLUDE files.
En masse assembly was only necessary if a common definition had to be changed. Most of the time, assembly of a few files was all that was necessary to make changes or add functions and features.
In the area of development for my POC project, the largest single program right now is my
mkfs (make filesystem) program, which has around 17,000 lines of code. Again, it makes heavy use of INCLUDE files that have common definitions that all programs that run on POC would need (e.g., BIOS jump table, data types, etc.). In the case of
mkfs, I didn't actually type in 17,000 lines, as about half of it was stuff that had already been written for other purposes.
POC's firmware currently has about 12,300 lines of code. Again, it's heavily dependent on INCLUDE files. Of course, I had to write all the INCLUDE files.
Quote:
- Was the project scale/function known going in, or did the project evolve over time?
In most cases, I have a pretty good idea where I wanted the project to go and the scale of it. However, all non-trivial projects evolve, especially when better algorithms are worked out for key parts of the code.
Quote:
- Was the program modular, with each module developed and tested within a test environment and then integrated into the whole, or were new things added in-place?
I seldom do assembly language programs that way. I do have tested functions (especially for display management) that get integrated. However, they are not standalone programs.
Quote:
- Did you make heavy use of macros?
I make extensive use of macros, especially in calling functions that require a parameter stack frame. Macros not only save a lot of typing, they reduce the likelihood of introducing bugs, as the assembler will halt with an error if the parameters associated with the macro call are incorrect, insufficient, etc. I have written a macro that is used in macros for the purpose of generating the instructions that generate the stack frame. If I hadn't written it, I'd spend a lot of time pounding in instructions to figure out how to generate a stack frame whose elements are in the right order and of the right type and size.
Quote:
- Was the project spread around multiple independently assembled source files and then combined using a linker to produce a single binary, or did you use independent binaries with jump tables, or did you include all source files into one large file for assembly, or something else?
On POC I assemble everything
en masse.
Quote:
- If your system processed I/O and had timing elements, could you exhaustively test all the code paths prior to integration, or did you cook up a test environment that let you simulate events, or something else?
I concocted tests to prove that I/O works as it should, simply by loading the code on the machine and running it. Serial I/O wasn't too much work (other than the timing issue involving NXP UARTs). Testing and debugging SCSI was a challenge at first, as it is interrupt-driven and does stack acrobatics to route execution as the SCSI bus changes phases. If something was wrong, the machine went down like an engine-less DC-10.
Quote:
- Did your program include telemetry, stats, counters or other run-time data to let you examine the run-time condition of the system? If so, how was that data extracted and observed?
Other than occasional use of a UART timer to measure SCSI performance, I just watched what happened through the M/L monitor.
Quote:
- Did your system include an interface for debugging and/or examination? If so, and if your system included real-time elements (e.g. service I/O or dealt with critical timing), did you encounter any particular conflicts between debug/run-time.
I suppose the M/L monitor would be the debugging interface. Since I scratch-developed both the monitor and the underlying environment on which it runs, conflicts were (in theory) non-existent.