All'indirizzo di I/O
43h si trova il registro di programmazione del timer. Per prima cosa bisogna scrivere, in questo registro, il byte di programmazione
0B6h, poi bisogna inviare in successione due byte all'indirizzo di I/O
42h, che specificano la frequenza da generare. Infine bisogna porre a livello 1 i bit 0 e 1 della porta 61.
| offset | Istruzione | Commento |
| 0100 | MOV DX, 0007 | Il brano è composto da 7 note. |
| 0103 | MOV SI, 0300 | le note sono memorizzate a partire dall’offset 300 rispetto a DS |
La programmazione del TIMER inizia sempre con la scrittura della "parola di comando" nel suo
REGISTRO di COMANDO accessibile attraverso la
PORTA 0043H , secondo lo schema: 1 0 1 1 0 1 1 0 corrispondente a
0B6h.
Il significato dei bit, nell'ordine da sinistra verso destra è:
10=Canale2
11=lettura/scrittura LSB/MSB
011=Modo 3
0=bin.
| offset | Istruzione | Commento |
| 0106 | MOV AL,B6 | |
| 0108 | OUT 43,AL | |
Nel contatore (a 16 bit) viene scritto un valore che viene decrementato e, quando raggiunge il valore 0, il timer genera un segnale di livello basso; poichè l'accesso al contatore è disponibile attraverso un bus di 8 bit, per scrivere nel registro bisogna fare 2 accessi, prima si scrive la parte bassa e poi la parte alta (come previsto nel byte di programmazione).
| offset | Istruzione | Commento |
| 010A | MOV AL, [SI] | si legge il primo byte della nota |
| 010C | INC SI | si prepara per leggere il secondo byte |
| 010D | OUT 42, AL | il primo byte viene scritto nel contatore |
| 010F | MOV AL, [SI] | si legge il secondo byte della nota |
| 0111 | INC SI | si prepara per leggere il primo byte della nota successiva |
| 0112 | OUT 42, AL | il secondo byte della nota viene scritto nel contatore |
| 0114 | MOV AL, 99 | |
| 0116 | OUT 63, AL | 99h = 10011001b predispone i port (A: input, B: output, e C: input). |
| 0118 | MOV AL, 03 | |
| 011A | OUT 61, AL | Invia un livello alto sui bit 0 e 1 del port B |
| 011C | CALL 0150 | Genera un ciclo di ritardo |
| 011F | DEC DX | Conta le note lette |
| 0120 | JNZ 010A | legge la nota successiva |
| 0122 | MOV AL, 00 | |
| 0124 | OUT 61, AL | Invia un livello basso sui bit 0 e 1 del port B |
Routine di ritardo
| offset | Istruzione | Commento |
| 0150 | PUSH AX | salva i registri che verranno modificati dalla routine |
| 0151 | PUSH BX | |
| 0152 | PUSH DS | |
| 0153 | MOV AX, 0040 | |
| 0156 | MOV DS, AX | Si modifica il registro DS per accedere a un segmento di sistema |
| 0158 | MOV BX, [006C] | il S.O. incrementa il valore all’indirizzo 0040:006C ogni 54.9 ms |
| 015C | MOV AX, [006C] | lo si legge in ciclo |
| 015F | SUB AX, BX | |
| 0161 | SUB AX, 0005 | dopo 5 incrementi sono trascorsi 54.9x5 ms, la durata della nota. |
| 0164 | JL 015C | trascorso questo tempo si ripristinano i registri |
| 0166 | POP DS | |
| 0167 | POP BX | |
| 0168 | POP AX | |
| 0169 | RET | |