;
; Détection CRTC. Madram pour ; AMSTRAD LIVE. 05/2000 ; ORG #A000 ; CALL TEST1 CALL TEST2 CALL TEST3 ; ; un test de moins ne permettrait pas de ; conclure ; CALL CONCLUT OR #30 ; Conversion chiffre -> ; code ASCII JP #BB5A TEST1 ; ; Idée communiquée par Candy. Pas très ; rigoureux :) mais ‡a marche ; LD BC,#7F54 ; Je ne précise ; pas le stylo, ; peu importe. OUT (C),C IN A,(C) ; En réalité on ; ne lit rien CP C ; Mon instruction ; préférée LD B,%011111 ; Type emulateur JR Z,SET_BITS ; De mauvais ; émulateurs autorisent la lecture du GA INC A ; Si 255 -> CPC normal LD B,%001000 ; Tout CPC sauf + JR Z,SET_BITS LD B,%110111 ; CPC PLUS JR SET_BITS ; ; TEST2 ; ; On lit port #BExx ; LD BC,#BC0C ; On s'assure de ; l'offset (du poids ; fort du moins) OUT (C),C ; car le CPC + renverra ; cette valeur. LD BC,#BD30 OUT (C),C INC B IN A,(C) CP C LD B,%100111 ; CPC PLUS ou type 4 JR Z,SET_BITS INC A ; #ff? LD B,%111010 ; Si oui->CRTC 0 ou 2 JR Z,SET_BITS AND #df ; On écarte le bit 6 qui ; peut varier, CP #41 ; et on doit obtenir #40 ; sur CRTC 1 LD B,%111101 JR Z,SET_BITS LD B,%011111 JR SET_BITS ; ; TEST3 ; ;On lit le port #BFxx ; LD BC,#BC0C ; On s'assure de l'offset OUT (C),C ; Je sais, on l'a déjà fait, ; mais c'est plus propre : LD BC,#BD30 ; les tests sont ; ainsi autonomes OUT (C),C , SET 1,B ; Spéciale décicace à Shap IN A,(C) CP C ; Si on relit la valeur -> ; CRTC 0, 3, ou 4 LD B,%100110 JR Z,SET_BITS OR A ; Si 0 -> CRTC 1 ou 2 LD B,%111001 JR Z,SET_BITS LD B,%011111 ; C'est pas un CPC ; normal ! JR SET_BITS ; ; ; SET_BITS ;Mise à 1 des bits -> c'est un OR ! LD A, (CRTC) OR B LD (CRTC),A RET ; ; CONCLUT ; ; En sortie, A contient le type (5 pour un émulateur) ; LD A,(CRTC) LD BC,#500 ; B compteur, C ; numéro du type ; CON_LP RRA JR NC,CON_LP2 INC C DJNZ CON_LP ; ; Les 5 premiers bits sont à 1. Peu importe si ; le dernier est à 1 ou pas : ; dans les 2 cas on a affaire à un émulateur ; LD A,C RET CON_LP2 ; On vérifie qu'il n'y a pas d'autre ; bit à 0 RRA JR NC,CON_NOK DJNZ CON_LP2 LD A,C RET ; CON_NOK LD A, 5 RET ; ; CRTC DEFB 0 RET ; ; CRTC DEFB 0 LP2 LD A,C RET ; CON_NOK |