Changes

PlayCity

2,712 bytes added, 17:12, 17 March 2021
Restore the official CTC detection routine.
==PlayCity coding tips==
Interesting tips or "magic tricks" using the board should be documented here. If the code is long, you must put in other wiki page and link it here.
 
===PlayCity detection===
We are going to use the NMI interrupt generator to check if our program is running in a CPC with a PlayCity board.
<pre>
; ---------------------------------------------------------------------------
; PlayCity check
; (c) 2013 SyX
; ---------------------------------------------------------------------------
 
; Constantes
CTC_TIM1 EQU $F881 ; Channel 1 (I: Cursor CRTC | O: NMI)
CTC_START_TIMER256 EQU %00110111
CTC_STOP_CHANNEL EQU %00000011
 
; ---------------------------------------------------------------------------
; NOTE: The lower ROM must be disabled before to run this code.
check_playcity
; Disable interrupts
DI
; Install NMI handler
LD A,$C3 ; JP $xxxx
LD HL,nmi_interrupt
LD ($0066),A
LD ($0067),HL
 
; Initialize playcity variable to 0
XOR A
LD (playcity),A
 
; Wait VBlank
LD B,$F5
.wait_vbl
IN A,(C)
RRA
JR NC,.wait_vbl
; Initialize CTC timer 1 (NMI generator)
LD HL,32 ; 32 scanlines
LD BC,CTC_TIM1
LD A,CTC_START_TIMER256
OUT (C),A ; Enable Timer
OUT (C),L ; Set new time constant
 
; Extra delay
LD IX,33 * 4 - 1 ; Wait 33 scanlines
CALL wait_scanlines_ix
LD A,(playcity)
OR A
JR NZ,.playcity_detected
; No PlayCity detected
.
.
.
 
.playcity_detected
.
.
.
 
; ---------------------------------------------------------------------------
nmi_interrupt
PUSH BC
PUSH AF
 
; Change playcity variable
LD A,$FF
LD (playcity),A
 
; Disable CTC timer 1 (NMI generator)
LD BC,CTC_TIM1
LD A,CTC_STOP_CHANNEL
OUT (C),A ; Disable Timer
 
POP AF
POP BC
EI
RETN
 
; ---------------------------------------------------------------------------
; Wait scanlines
; INPUT:
; IX: Scanlines to wait * 4 - 1
; ---------------------------------------------------------------------------
wait_scanlines_ix
DEFS 5,0 ; (5)
 
.loop_wait_scanlines_ix
DEFS 6 ; (6)
DEC IX ; (3)
LD A,IXH ; (2)
OR IXL ; (2)
JR NZ,.loop_wait_scanlines_ix ; (2/3)
; Total loop --> 16 * (IX - 1) + 15
RET ; (3)
; Total Routine --> 64 * SCANLINES
; ---------------------------------------------------------------------------
playcity
DEFS 1
</pre>
 
===PlayCity detection (alternative)===
Faster and shorter, but untested or not working on all CPC.
<pre>
;=========================
213
edits