;; stable raster on cpc ;; ;; The easiest way to have stable interrupts is to use HALT. ;; This will execute the equivalent of a NOP instruction until an ;; interrupt is acknowledged. ;; ;; At this point you need your own interrupt handler so you always ;; get the same number of cycles ;; ;; The minimal one: ;; ;; EI ;; RET ;; ;; or ;; ;; EI ;; RETI ;; ;; will take constant time ;; ;; the following happens: ;; 1. HALT waits for an interrupt to come and burns cycles performing ;; NOP instructions ;; 2. Interrupt comes ;; 3. Interrupt is acknowledged (takes some fixed number of cycles ;; to start your interrupt routine) ;; 4. Your interrupt routine takes a furthur number of fixed cycles) ;; 5. Code returns to after the HALT. ;; At this point we are synchronised to the screen and have a stable ;; raster position. ;; example: org &8000 di im 1 ;; write EI:RET to &0038 ;; EI is 1 NOP cycle ;; RET is 4 NOP cycles ;; interrupt acknowledge in mode 1 is 5 NOP cycles ld hl,&c9fb ld (&0038),hl ei mainloop: ld b,&f5 ml1: in a,(c) rra jr nc,ml1 halt ;; sychronised with raster position here halt ;; sychronised with raster position here halt ;; sychronised with raster position here halt ;; sychronised with raster position here halt ;; sychronised with raster position here halt ;; sychronised with raster position here jp mainloop