Website

Here are all the learning tasks grouped together with pointers to the example programs and explanatory notes.

### Simple Arithmetic

Example - 01first.asm - Arithmetic

1. Write a program that subtracts using SUB
2. Write a program that multiplies using MUL
3. Write a program that divides using DIV
4. Write a program that divides by zero. Make a note to avoid doing this in real life.

Example - 02tlight.asm - Traffic Lights

1. Use the help page on Hexadecimal and Binary numbers. Work out what hexadecimal numbers will activate the correct traffic lights. Modify the program to step the lights through a realistic sequence.

### ASCII Codes

Example - 03move.asm

1. Look up the ASCII codes of H, E, L, L and O and copy these values to memory locations C0, C1, C2, C3 and C4. This is a simple and somewhat crude way to display text on a memory mapped display.

### Counting and Jump Commands

Example - 04incjmp.asm

1. Rewrite the example program to count backwards using DEC BL.
2. Rewrite the example program to count in threes using ADD BL,3.
3. Rewrite the program to count 1 2 4 8 16 using MUL BL,2
4. Here is a more difficult task. Count 0 1 1 2 3 5 8 13 21 34 55 98 overflow. Here each number is the sum of the previous two. You will need to use two registers and two RAM locations for temporary storage of numbers. If you have never programmed before, this is a real brain teaser. Remember that the result will overflow when it goes above 127.
This number sequence was first described by Leonardo Fibonacci of Pisa (1170_1230)

### Character Input Output

Example - 05keybin.asm

1. Easy! Input characters and display each character at the top left position of the VDU by copying them all to address [C0].
2. Harder Use BL to point to address [C0] and increment BL after each key press in order to see the text as you type it.
3. Harder! Store all the text you type in RAM when you type it in. When you press Enter, display the stored text on the VDU display.
4. Difficult Type in text and store it. When Enter is pressed, display it on the VDU screen in reverse order. Using the stack makes this task easier

### Procedures

Example - 06proc.asm

1. Re-do the traffic lights program and use this procedure to set up realistic time delays. 02tlight.asm
2. Re-do the text input and display program with procedures. Use one procedure to input the text and one to display it.

### Text IO and Procedures

Example - 07textio.asm

1. Write a program using three procedures. The first should read text from the keyboard and store it in RAM. The second should convert any upper case characters in the stored text to lower case. The third should display the text on the VDU screen.

### Data Tables

Example - 08table.asm

1. Improve the traffic lights data table so there is an overlap with both sets of lights on red.
2. Use a data table to navigate the snake through the maze. This is on port 04. Send FF to the snake to reset it. Up, down left and right are controlled by the left four bits. The right four bits control the distance moved.
3. Write a program to spin the stepper motor. Activate bits 1, 2, 4 and 8 in sequence to energise the electromagnets in turn. The motor can be half stepped by turning on pairs of magnets followed by a single magnet followed by a pair and so on.
4. Use a data table to make the motor perform a complex sequence of forward and reverse moves. This is the type of control needed in robotic systems, printers and plotters. For this exercise, it does not matter exactly what the motor does.

### Parameters

Example - 09param.asm

1. Write a procedure that doubles a number. Pass the single parameter into the procedure using a register. Use the same register to return the result.
2. Write a procedure to invert all the bits in a byte. All the zeros should become ones. All the ones should become zeros. Pass the value to be processed into the procedure using a RAM location. Return the result in the same RAM location.
3. Write a procedure that works out Factorial N. This example shows one method for working out factorial N. Factorial 5 is 5 * 4 * 3 * 2 * 1 = 120. Your procedure should work properly for factorial 1, 2, 3, 4 or 5. Factorial 6 would cause an overflow. Use the stack to pass parameters and return the result. Calculate the result. Using a look up table is cheating!
4. Write a procedure that works out Factorial N. Use the stack for parameter passing. Write a recursive procedure. Use this definition of Factorial.
Factorial ( 0 ) is defined as 1.
Factorial ( N ) is defined as N * Factorial (N - 1).
To work out Factorial (N), the procedure first tests to see if N is zero and if not then re-uses itself to work out N * Factorial (N - 1). This problem is hard to understand in any programming language. In assembly code it is harder still.

### Software Interrupts

Example - 10swint.asm

1. The simulated keyboard generates INT 03 every time a key is pressed. Write an interrupt 03 handler to process the key presses. Use IN 07 to fetch the pressed key into the AL register. The original IBM PC allocated 16 bytes for key press storage. The 16 locations are used in a circular buffer fashion. Try to implement this.
2. Build on task 26 by puting characters onto the next free screen location. See if you can get correct behaviour in response to the Enter key being pressed (fairly easy) and if the Back Space key being pressed (harder).

### Hardware Interrupts

Example - 11hwint.asm

1. Write a program that controls the heater and thermostat whilst at the same time counting from 0 to 9 repeatedly, displaying the result on one of the seven segment displays. If you want a harder challenge, count from 0 to 99 repeatedly using both displays. Use the simulated hardware interrupt to control the heater and thermostat.
2. A fiendish problem. Solve the Tower of Hanoi problem whilst steering the snake through the maze. Use the text characters A, B, C Etc. to represent the disks. Use three of the four rows on the simulated screen to represent the pillars.

I am not aware of anyone having solved the tower of Hanoi (including me), let alone controlling the snake at the same time.

3. Use the keyboard on Port 07. Write an interrupt handler (INT 03) to process the key presses. You must also process INT 02 (the hardware timer) but it need not perform any task. For a more advanced task, implement a 16 byte circular buffer. Write code to place the buffered text on the VDU screen when you press Enter. For an even harder task, implement code to process the Backspace key to delete text characters in the buffer.