61
Ромхакинг и программирование / Пишем ромхакерский/хоумбрюерский софт.
« : 23 Февраль 2025, 12:16:39 »Не сильно в код углубился, но ты походу пытаешь читать конец файла, а там уже ничего нет.
Спасибо! Именно так оно и оказалось.
В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.
Не сильно в код углубился, но ты походу пытаешь читать конец файла, а там уже ничего нет.
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
FILE *fpin, *fpout;
long len;
long i,n;
int main(int argc, char *argv[])
{
if (argc != 2 ) {
printf("Bitmap converter to 4bpp 16x16 tile data.\n");
fprintf(stdout,"Usage: %s [srcfile].bmp\n",argv[0]);
exit(1);
}
if ( (fpin=fopen(argv[1],"rb") ) == NULL ) {
printf("Can't open input file\n");
exit(1);
}
/*
* Now we try to determine the size of the file
* to be converted
*/
if (fseek(fpin,0,SEEK_END)) {
printf("Couldn't determine size of file\n");
fclose(fpin);
exit(1);
}
len=ftell(fpin);
unsigned short bytStr[len];
fread(bytStr, 1, len, fpin);
printf("The first byte is %x.\n",bytStr[0]);
fclose(fpin);
exit(1);
}
Ещё одна проблема - почему-то ASMX неверно определяет размер каждого загружаемого бинарника. Например, прикреплённую 512-байтовую палитру он определил как файл весом всего в 174 Б. Может, в самом коде команды incbin какой-то косячок кроется?Код: [Выделить]case o_Incbin:
DefSym(labl,locPtr,FALSE,FALSE);
GetFName(word);
val = 0;
// open binary file
incbin = fopen(word, "r");
if (incbin)
{
// while not EOF
do {
// n = count of read up to MAX_BYTSTR bytes into bytStr
n = fread(bytStr, 1, MAX_BYTSTR, incbin);
if (n>0)
{
// write data out to the object file
for (i=0; i<n; i++)
CodeOut(bytStr[i]);
val = val + n;
}
} while (n>0);
if (n<0)
sprintf(s,"Error reading INCBIN file '%s'",word);
if (pass == 2)
{
// "XXXX (XXXX)"
p = ListLoc(locPtr-val);
*p++ = ' ';
*p++ = '(';
p = ListAddr(p,val);
*p++ = ')';
}
}
else
{
sprintf(s,"Unable to open INCBIN file '%s'",word);
Error(s);
}
// close binary file
if (incbin) fclose(incbin);
incbin = NULL;
break;
case o_Incbin:
DefSym(labl,locPtr,FALSE,FALSE);
GetFName(word);
val = 0;
// open binary file
incbin = fopen(word, "r");
if (incbin)
{
// while not EOF
do {
// n = count of read up to MAX_BYTSTR bytes into bytStr
n = fread(bytStr, 1, MAX_BYTSTR, incbin);
if (n>0)
{
// write data out to the object file
for (i=0; i<n; i++)
CodeOut(bytStr[i]);
val = val + n;
}
} while (n>0);
if (n<0)
sprintf(s,"Error reading INCBIN file '%s'",word);
if (pass == 2)
{
// "XXXX (XXXX)"
p = ListLoc(locPtr-val);
*p++ = ' ';
*p++ = '(';
p = ListAddr(p,val);
*p++ = ')';
}
}
else
{
sprintf(s,"Unable to open INCBIN file '%s'",word);
Error(s);
}
// close binary file
if (incbin) fclose(incbin);
incbin = NULL;
break;
Решил я тут начать пилить небольшую демку для Playmark'овского железа Excelsior, и тут вырисовалась небольшая проблема - вроде прерывание №2 для данной железки я уже разрешил, однако самого перескока к соответствующему адресу, когда приходит время прерывания, не происходит - только значение 3-го нибла регистра SR меняется с 1 на 2, и MAME'овский дебаггер тоже никакого прерывания не регистрирует.
Внизу прикреплены иллюстрирующий странность в работе M68000 тестовый набросок кода и полученный в результате его сборки ром (запускать через командную строку - mame excelsr -d). Что же я всё-таки упустил?
ASSEMBLER(SH);
в файл asmx.c - туда, где у него список архитектур. Кому лень собирать самому или не знает как - во втором прикреплении готовый exe.
org $bfc00000
lui t0, $1000
ori t0, t0, $3000
addi t1, t1, $6
sb t1, 0(t0)
addi t1, zero, $ffff
lui t1, $ff
addi t3, t3, $100
lui t4, $100
sb t1, 1(t0)
sb t2, 5(t0) ; 1st vertex
or t5, t4, t3
sb t1, 1(t0)
sb t5, 5(t0) ; 2nd vertex
sb t1, 1(t0)
sb t4, 5(t0) ; 3rd vertex
sb t1, 1(t0)
sb t3, 5(t0) ; 4th vertex
j $
А теперь по-русски
Мне купили в 90х, как раз, когда был бум тамагочи (тамагочей). Помню даже, как мы ходили тогда с мамой на рынок, где покупали. Я очень хотел себе, мне было интересно. У меня питомцем была обезьянка. Не могу сказать, что в итоге оказалось сильно интересно. Говорили, что может ночью будить, если хочет есть, и я надеялся, что так будет, но этого не случилось. Следил, кормил, но не помню, чтобы получал большое удовольствие. На седьмой день, когда заканчивался цикл заботы о питомце, я, взглянув на экран, подумал, что с игрой что-то случилось, ибо персонаж ну очень сильно изменился внешне. Оказалось, что так и должно быть на последний день. Больше циклов я не проводил. А потом мой одноклассник где-то на улице нашел тамагочи, там нужно было выращивать диплодока (или схожее существо). Не помню, почему, но он отдал игрушку мне. Динозавр был интереснее обезьяны, но я к тому времени уже охладел к тамагочи. В итоге больше и не играл. Куда делись оба аппарата, не помню.
А потом столь же быстро интерес к тамагочи резко схлынул, во всяком случае у нас в стране. И о них больше даже и не говорили. С появлением у всех ПК и потом Интернета что-то я не слышал особо о возрождении такой штуки. Наверняка есть и эмуляторы старых тамагочи (а есть?), и новые похожие вещи, но, кажется, они не особо популярны.
org $bfc00000
lui t0, $1000
ori t0, t0, $3000
addi t1, t1, $6
sb t1, 0(t0)
addi t1, zero, $ffff
lui t1, $ff
addi t3, t3, $100
lui t4, $100
sb t1, 1(t0)
sb t2, 5(t0) ; 1st vertex
or t5, t4, t3
sb t1, 1(t0)
sb t5, 5(t0) ; 2nd vertex
sb t1, 1(t0)
sb t4, 5(t0) ; 3rd vertex
sb t1, 1(t0)
sb t3, 5(t0) ; 4th vertex
j $
Я перегнул, ты уж не обижайся, читать было всё-равно интересно, но воды лишней многовато.
Вот вариант от Яндекса:
Такой графомании я ещё не встречал, было физически больно читать
Чтобы получить +3 попадания, в начале игры сходите на кухню и съешьте дерьмо с тарелки.
А современный адаптер Coleco Master для SMS? У него встроенный BIOS от CV?
У CV и SG-1000 одни и те же процессор, видео и звук
тебе в какой регистр грузить то надо?
long ARMImmed(unsigned long val)
{
// note: can't abort assembling instruction because it may cause phase errors
if ((val & 0xFFFFFF00) == 0)
return (val & 0xFF);
else
{
// FIXME: need to handle shifts
// bit 25 (I) = 1
// bits 8-11 = rotate (immed8 is rotated right by 2 * this value)
// bits 0-7 = immed8
// the smallest value of rotate should be chosen
}
Error("Invalid immediate constant");
return 0;
}