#include #include #include #include #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; }