The simplest program will be the obligatory „flashing LED“. In truth, – we don't have many other ways to verify that the system is working, other than the aforementioned connection of resistors to the data bus, simulating the NOP instruction, and monitoring changes on the address bus. But we do have an LED on the SOD output!
So connect both memories to the processor and let's try to program the first program. It goes something like this:
initialize()
while(true) {
SOD = 1
delay()
SOD = 0
delay()
}
And there we are, the rumble is over, we can continue…
Actually, no, it's just beginning. We have to program all this in assembly. We'll start by initializing.
.org 0
; initialize()
RESET: DI
LXI SP, 0000h
First, we tell the assembler that the program will start at address 0. It is good practice to name this point something – for example, the RESET flag.
The first instruction is DI. This will disable the interrupt. Although our system does not use interrupts, it is good practice to disable interrupts at the beginning of a job, before all the necessary things are set up. If one came before the stack pointer is set, for example, the system would crash.
The next instruction sets the stack pointer to the end of RAM. This takes up 8000h – FFFFh of memory space in the Alpha. So we set SP to a value „one higher than the last free address“ – i.e., FFFFh+1 = 0000H. The LXI SP instruction serves well.
After this initialization, the processor is ready to work. We do not need to initialize anything more – after all, there is nothing more in our system. So we can write the loop:
LOOP:
MVI A, 11000000b
SIM
CALL DELAY
MVI A, 01000000b
SIM
CALL DELAY
JMP LOOP
First we set the SOD to 1. The SIM instruction is used for this. Recall: this instruction takes the value in register A and sets the SOD and the interrupt mask (which we are not interested in now) according to it. To set it, the second highest bit (D6) must be 1. If it is, the processor sends the value of the highest bit (D7) to the SOD output.
This is followed by a call to the wait loop. We don't deal with this one yet, it will be „somewhere, somehow, later“. We just jump to the address where the wait routine will be, and it will return again using the RET instruction.
Then we set SOD to 0, call the wait routine again, and then jump back to the beginning of the process.
This completes the core of the program. How to do the waiting loop?
Comments powered by Talkyard.