Rev 1928 |
Blame |
Compare with Previous |
Last modification |
View Log
| Download
| RSS feed
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <oscalls.h>
#include <intrz80.h>
#include <terminal.c>
#define datareg 179
#define cmdreg 187
#include <booter.c>
unsigned char getStat
(void)
{
// Принять данные из регистра статуса
unsigned char dataread
;
dataread
= input
(cmdreg
);
return dataread
;
}
unsigned char getDat
(void)
{
// Принять данные из регистра данных
unsigned char dataread
;
dataread
= input
(datareg
);
return dataread
;
}
void sendDat
(unsigned char data
)
{
// Послать код команды в регистр команд
unsigned char dataread2
;
output
(datareg
, data
);
dataread2
= 128;
while (dataread2
!= 0)
{
dataread2
= (input
(cmdreg
) & 128);
}
}
void sendDatnv
(unsigned char data
)
{
// Послать данные в регистр данных, без ожидания готовности
output
(datareg
, data
);
}
void sendCmd
(unsigned char command
)
{
// Послать код команды в регистр команд
unsigned char dataread2
;
output
(cmdreg
, command
);
dataread2
= 1;
while (dataread2
== 1)
{
dataread2
= input
(cmdreg
) & 1;
}
}
void resetGS
(void)
{
sendCmd
(0xF4);
}
unsigned long getMem
(void)
{
unsigned char ramL
, ramM
, RamH
;
sendCmd
(0x20);
ramL
= getDat
();
ramM
= getDat
();
RamH
= getDat
();
return (65536 * RamH
+ 256 * ramM
+ ramL
);
}
/* Convert an int to it's binary representation */
char *int2bin
(int num
, int pad
)
{
char *str
= malloc(sizeof(char) * (pad
+1));
if (str
) {
str
[pad
]='\0';
while (--pad
>=0) {
str
[pad
] = num
& 1 ? '1' : '0';
num
>>= 1;
}
} else {
return "";
}
return str
;
}
C_task main
(void)
{
unsigned char dataread
, modHandle
, q
, qdec
;
unsigned long loadloop
;
os_initstdio
();
getDat
();
BOX
(1, 1, 80, 25, 40);
AT
(23, 1);
ATRIB
(92);
printf("[GENERAL SOUND LOW LEVEL TESTER]\r\n\r\n");
printf("Testing STATUS register 0xBB \r\n\r\n");
qdec
= getStat
();
q
= qdec
& 129; // 10000001
switch (q
)
{
case 0:
printf(" DATA bit and COMMAND bit are reset [0xxxxxx0][%u][%s]. OK.\r\n\r\n",qdec
, int2bin
(qdec
, 8));
break;
case 129:
printf(" DATA bit and COMMAND bit are set [1xxxxxx1][%u][%s]. FAIL.\r\n\r\n",qdec
, int2bin
(qdec
, 8));
break;
case 128:
printf(" DATA bit are set [1xxxxxx0][%u][%s]. FAIL. \r\n\r\n",qdec
, int2bin
(qdec
, 8));
break;
case 1:
printf(" COMMAND bit are set [0xxxxxx1][%u][%s]. FAIL. \r\n\r\n",qdec
, int2bin
(qdec
, 8));
default:
printf(" Error detecting status. [%u][%s]. FAIL.\r\n\r\n",qdec
, int2bin
(qdec
, 8));
}
printf("Resetting GS... \r\n");
resetGS
();
printf("Reset OK. Internal memory test...\r\n\r\n");
dataread
= 0;
while (dataread
== 0)
{
dataread
= input
(datareg
);
}
printf("Reported by boot : %u pages\r\n", dataread
);
printf("Reported by 0x20 : %lu bytes\r\n\r\n", getMem
());
sendCmd
(0xFA);
printf("sendCmd (0xFA) - Test mode on;\r\n");
sendCmd
(11);
printf("sendCmd (11) - Sound in chanel #1;\r\n");
sendCmd
(12);
printf("sendCmd (12) - Sound in chanel #2;\r\n");
sendCmd
(13);
printf("sendCmd (13) - Sound in chanel #3;\r\n");
sendCmd
(14);
printf("sendCmd (14) - Sound in chanel #4;\r\n\r\n");
printf("Uploading test tune...\r\n");
sendCmd
(0x30);
modHandle
= getDat
();
sendCmd
(0xD1);
for (loadloop
= 0; loadloop
< sizeof(rawData
); loadloop
++)
{
sendDat
(rawData
[loadloop
]);
}
sendCmd
(0xD2);
loadloop
= sizeof(rawData
);
printf("%lu bytes uploaded.\r\n", loadloop
);
sendDatnv
(modHandle
);
sendCmd
(0x31);
printf("Playing handle %u...\r\n", modHandle
);
do
{
} while (_low_level_get
() == 0);
sendCmd
(0xf3);
return 0;
}