segment p 0000 br 0x0000$0800 always // reset vector reti always data 0000 reti always data 0000 br 0x0000$5000 always // int0 data 0000 data 0000 data 0000 data 0000 data 0000 data 0000 reti always // int1 data 0000 data 0000 data 0000 data 0000 data 0000 data 0000 data 0000 reti always // int2 segment p 0800 // init mov 0x$f000 sp // set stack pointer mov 0x$0180 mod3 // enable interrupt load 0x0082u8 page // configure ICU mov 0x$4000 r0 mov r0 [page:0x000eu8] mov r0 [page:0x0010u8] mov r0 [page:0x0006u8] // enable apbp as int0 br 0x0000$1000 always segment p 1000 // Main loop load 0x0000u8 page mov 0x$80CC r0 // transfer APBP register mov [r0++] r1 mov r1 [page:0x0005u8] modr [r0++] mov [r0++] r1 mov r1 [page:0x0006u8] modr [r0++] mov [r0++] r1 mov r1 [page:0x0007u8] modr [r0++] mov [r0++] r1 mov r1 [page:0x0008u8] modr [r0++] mov [r0++] r1 mov r1 [page:0x0009u8] modr [r0++] mov [r0++] r1 mov r1 [page:0x000au8] modr [r0++] mov [r0++] r1 mov r1 [page:0x000bu8] modr [r0++] mov [page:0x0000u8] b0l // get signal br 0x0000$1000 eq // loop back if no signal mov [page:0x0001u8] b0l // get command type cmpv 0x$0000 b0l br 0x0000$2000 eq cmpv 0x$0001 b0l br 0x0000$3000 eq br 0x0000$4000 always segment p 2000 // read mov [page:0x0002u8] r0 mov [r0] r1 mov r1 [page:0x0003u8] br 0x0000$4000 always segment p 3000 // write mov [page:0x0002u8] r0 mov [page:0x0003u8] r1 mov r1 [r0] br 0x0000$4000 always segment p 4000 // end clr b0 always mov b0l [page:0x0000u8] // clear signal br 0x0000$1000 always segment p 5000 // interrupt handler mov 0x$4000 r5 mov 0x$8202 r4 mov r5 [r4] // ack mov 0x$0004 r4 mov [r4] r5 modr [r5++] mov r5 [r4] reti always segment d 0000 // signal area data 0000 // 0, Start signal data 0000 // 1, Operation type data 0000 // 2, Address data 0000 // 3, Data data 0000 // 4, interrupt counter data 0000 // 5, 80CC data 0000 // 6, 80CE data 0000 // 7, 80D0 data 0000 // 8, 80D2 data 0000 // 9, 80D4 data 0000 // A, 80D6 data 0000 // B, 80D8