Extension CMOC pour les Thomsons!

Cette catégorie traite de développements récents pour nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Papy.G, fneck, Carl

Répondre
Linzino
Messages : 67
Enregistré le : 26 août 2017 02:40

Extension CMOC pour les Thomsons!

Message par Linzino » 12 déc. 2018 10:29

Je confirme qu'on a un compilateur ANSI C pour les Thomsons qui marche bien! :-)

J'ai réussi à compiler mon jeu Cross Chase avec CMOC et le mettre dans un fichier .k5 qu'on peut loader avec DCMOTO.

CMOC ne prévoit que coco, dragon, os9 et vectrex comme targets. Donc pas de Thomsons mais on peut l'utiliser quand même! :-)

J'ai vu que le format binaire coco est compatible avec celui de la série M (Mo5/Mo6/Prodest PC128)

CMOC ne contient pas encore une lib pour l'input/output pour la série M ou T.
Par contre,
- j'ai implémenté la pluspart de graphismes nécessaires pour mon jeu sur la serie M en codant à bas niveau des écritures dans la mémoire vidéo;
- j'ai implémenté l'input en lisant sur 0xA7C1

Le but serait de faire une extension de CMOC pour gerer tout cela.
Mes compétences en Assembleur sont très limitées.
J'aurais besoin d'aide pour implementer certains chosses comme par exemple:
- gotoxy(x,y) -> pour gérer le curseur text
- putchar(c) -> afficher le caractère ASCII c à la position du curseur
- cacher le curseur
- changer les couleurs

Si j'ai bien compris tout cela est fait par la routine PUTCH. Je dois juste comprendre comment l'appeler.

Fabrizio

__sam__
Messages : 5411
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Extension CMOC pour les Thomsons!

Message par __sam__ » 12 déc. 2018 11:22

Les fonctions que tu souhaites sont dispo dans la bibliothèque de gcc6809 pour thomson: https://web.archive.org/web/20150501022 ... ement.html

On trouve dans le code source de la LIBC la routine putchar

Code : Tout sélectionner

	.module putchar.s
	.area _CODE
	.globl _putchar	; int putchar(unsigned char c)
_putchar:
	ldb	2,s	; c -> B
put:
	jsr	0xE803	; call "PUTC" monitor routine
;	MO version
;	.byte	2
;	swi
; LF (\n) is LF/CR (\n\r) in the C language
	cmpb	#10	; LF
	bne	end
	ldb	#13	; CR
	bra	put
end:
	clra
	clrb
	rts
à partir de laquelle tu peux définir

Code : Tout sélectionner

#define gotoxy(x,y) do {putchar(0x1B); putchar(0x40+y); putchar(0x41+x);} while(0)
et autre goodies (maskage curseur etc.) Se référer au manuels technique pour avoir les codes d'échappement correspondants.
Samuel.
A500 Vampire V2+ ^8^, A1200(030@50mhz/fpu/64mb/cf 8go),
GVP530 (MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.

Linzino
Messages : 67
Enregistré le : 26 août 2017 02:40

Re: Extension CMOC pour les Thomsons!

Message par Linzino » 12 déc. 2018 12:22

Merci __sam__!

Donc pour la série M?
void putchar(unsigned char c)
__asm__
{
ldb c
.byte 2
swi
}
?

Pourquoi ldb 2,s?

__sam__
Messages : 5411
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Extension CMOC pour les Thomsons!

Message par __sam__ » 12 déc. 2018 14:24

L'offset 0 et 1 contiennent l'adresse de retour. Donc le caractère empilé est à l'offset 2 de la pile (2,s), ou peut-être 3 si le compilateur aligne les valeurs sur des mots de 16 bits (peu probable pour CMOC vu les machines ciblées).

Autre chose: le ".byte 2" doit suivre le SWI, c'est une sorte d'argument au SWI utilisé par le moniteur (l'OS en quelque sorte) pour savoir quelle fonction est appelée. On aurait donc quelque chose comme ca pour les ordis "MO" en effet:

Code : Tout sélectionner

void putchar(unsigned char c)
__asm__
{
   ldb 2,s <=== on récupère la valeur de c dans la pile
   swi
   .byte 2
}
Pour les "TO" le swi/.byte 2 est remplacé par un JSR $E803.

Tu peux détecter la présence d'une machine MO ou TO par la valeur de $FFF2. On y trouve $F0 (valeur négative) pour les "MO" et $70 (valeur positive) pour les "TO". Donc un putchar "universel" serait un truc genre:

Code : Tout sélectionner

void putchar(unsigned char c)
  if(0 > *(signed char*)0xFFF2) {
__asm__
{
   ldb 2,s <=== on récupère la valeur de c dans la pile
   swi
   .byte 2
}
  } else {
__asm__
{
   ldb 2,s <=== on récupère la valeur de c dans la pile
   jsr $E803
}
  }
Samuel.
A500 Vampire V2+ ^8^, A1200(030@50mhz/fpu/64mb/cf 8go),
GVP530 (MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.

Répondre