dos33fsprogs/utils/gr-sim/hgr/seven.c
Vince Weaver c05084c289 gr-sim: uppercase the 6502 emulated registers
probably broke something, but this also was a pain as was
often accidentally using the vars, especially X and Y
2023-12-29 13:47:18 -05:00

109 lines
1.4 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include "6502_emulate.h"
#include "gr-sim.h"
#define HGR_HORIZ 0xff
#define TEMP_R 0xfe
static void fancy_div(int d, int *q, int *r) {
//;Divide by 7 (From December '84 Apple Assembly Line)
//;15 bytes, 27 cycles
// y=xhigh x=xlow a=??
// q in y, r in a
Y=(d>>8)&0xff;
X=d&0xff;
A=X;
sta(TEMP_R);
C=0;
sta(HGR_HORIZ); // 0
lsr(); // 0
lsr(); // 0
lsr(); // 0
adc_mem(HGR_HORIZ); // 0
ror(); // 0
lsr(); // 0
lsr(); // 0
adc_mem(HGR_HORIZ); // 0
ror(); // 0
lsr(); // 0
lsr(); // 0
// calc remainder
C=0;
sta(HGR_HORIZ);
asl();
adc_mem(HGR_HORIZ);
asl();
adc_mem(HGR_HORIZ);
// HGR_HORIZ=x/7, A=HGR_HORIZ*7
C=1;
eor(0xff);
// printf("%d+%d=",d&0xff,a);
adc(d&0xff);
// printf("%d\n",a);
// sta(TEMP_R);
// txa();
// sbc_mem(TEMP_R);
// tax();
if (Y) {
C=0;
adc(4);
pha();
lda(HGR_HORIZ);
adc(36);
sta(HGR_HORIZ);
pla();
}
if (A>6) {
C=1;
sbc(7);
ram[HGR_HORIZ]++;
}
Y=ram[HGR_HORIZ];
*q=Y;
*r=A;
}
int main(int argc, char **argv) {
int i,actual_q,actual_r;
int fancy_q,fancy_r;
grsim_init();
for(i=0;i<280;i++) {
fancy_div(i,&fancy_q,&fancy_r);
actual_q=i/7;
actual_r=i%7;
if ((fancy_q!=actual_q) || (fancy_r!=actual_r)) {
printf("%03x\t%d,%d\t%d,%d\n",
i,actual_q,actual_r,fancy_q,fancy_r);
}
}
return 0;
}