But to be as painfully pedantic as possible: can we please use the word 'monitor', here? Calling it a 'microkernel' really gives one the wrong initial impression.
Still, very neat. Now write a BASIC!
No doubt an educational project. However, all the versions of Microsoft 6502 BASIC were collected and annotated by a Michael Steil in 2008.
Nice to see the coefficients for the taylor series computation for sin() in the POLY_SIN table.
http://commodore.software/downloads/download/211-application...
I like this explanation of "monitor", from https://www.atarimagazines.com/creative/v9n12/272_A_monitor_...
"The novice machine language programmer often does not have an assembler. Without an assembler, the programmer must assemble the program by hand, and then enter it by hand. Even a small program could require hundreds of POKEs followed by hundreds of PEEKs to verify that everything has been entered correctly.
A good monitor gets around these problems. It allows the programmer to examine memory locations sequentially. As each location is examined, the operator has the option of changing it or looking at the next one. A good monitor program also allows the operator to list a range of memory all at once. A third monitor feature allows the operator to move a range of memory to a new location in the computer. A final feature in a good monitor is the ability to execute and return from a machine language program."
LCD__clear_video_ram:
pha ; preserve A via stack
tya ; same for Y
pha
ldy #$20 ; set index to 32
.loop:
lda #$20 ; set character to 'space'
sta VIDEO_RAM,Y ; clean video ram
dey ; decrease index
bne .loop ; are we done? no, repea
sta VIDEO_RAM ; yes, write zero'th location manually
pla ; restore Y
tay
pla ; restore A
rts
Surely we don't need to keep loading the space character into A on every iteration?Since Y starts at a hard-coded value that is (well) below $80, this could use "bpl .loop" and drop the "sta VIDEO_RAM" special case.
In .select_option, I'd looking into doing a jump table. Ideas here: https://wiki.nesdev.com/w/index.php/Jump_table
Also, if you want to go for idiomatic 6502 code, rather than readability:
- you want to optimize for size and speed by looping down from C to zero (rather than looping up from zero to C) where possible (because you don’t need to do a CMP to compare with zero)
- LCD__print wastes memory and CPU cycles. It can fall-through to LCD__print_with_offset, and that could fall-through to LCD_render,
https://www.amazon.com/gp/product/0672210355/ref=dbs_a_def_r...
https://www.amazon.com/gp/product/0750699434/ref=dbs_a_def_r...
Actually both books are available from Lancaster's website as a free PDF:
There's not much to it at a basic level - theory wise, you need Ohm's law, Kirchhoff's Voltage/Current Laws, a few theorems (Then you add knowledge of active components, obviously)
N.B. Understanding complex numbers is a big help.
His stuff is just fantastic. Even though it's lower level than I've ever worked, it's extremely entertaining and educational.
His 6502 series is just great, but I want to highlight another couple of videos he did:
"Let's build a circuit that displays an image on a VGA monitor! In this video, I talk about how VGA signals work and build a circuit that provides the correct timing of sync signals so that a monitor recognizes the signal."
https://www.atarimagazines.com/compute/issue57/turbotape.htm...
Also let's not forget Bill Gates's 17 bytes loader
https://hackaday.com/2017/03/24/doing-it-with-fewer-bytes-th...
"Load, Save, Verify, Execute 8 K in 38 seconds versus PETs 2 Minute 45 seconds, plus more!"
There was a newer version that I had which was called the ROM Rabbit vs. this version that you had to load and save each time.
[1] http://archive.6502.org/publications/pet_paper/pet_paper_v3_...
[0] https://futurama.fandom.com/wiki/Bender_Bending_Rodríguez
For example: .increase: adc #1 sta POSITION_MENU
I have no idea if you increment or add two, since the carry is not cleared.
clc
lda CURRENT_RAM_ADDRESS_L
adc #$01
sta CURRENT_RAM_ADDRESS_L
lda CURRENT_RAM_ADDRESS_H
adc #$00
sta CURRENT_RAM_ADDRESS_H
this is done by the usual INC CURRENT_RAM_ADDRESS_L BNE *+2 INC CURRENT_RAM_ADDRESS_H ldy POSITION_CURSOR
cpy #0
cpy #0 is useless.lda POSITION_CURSOR cmp #0 cmp #0 is useless
jsr / rts can be replaced by jmp
clear_ram is super slow
As a regular programmer, it's quite interesting to get into how the bits actually end up getting the work done.
[1]: https://www.youtube.com/watch?v=85ZCTuekjGA&list=PLEeZWGE3Pw...
The interest eventually morphed into doing something with all of the old parts I've hoarded. Going through the bins of parts, I've found things like 8051 microcontrollers (P80C550) and UARTs (AM85C30) and some old RTC units (MC146818). I ended up picking up a few 68010's (among other things) off of eBay with the hope of building a breadboard Linux computer, as slow as that may be. I believe the 68010 may be the only CPU in a DIP package still supported in some capacity by Linux (as long as you provide an MMU).
Hopefully this will actually get me back into writing/making videos about my projects.