int32 mba_wrbufW (uint32 mb, int32 bc, uint16 *buf) { int32 i, j, ba, mbc, pbc; uint32 pa, dat; if (mb >= MBA_NUM) /* valid MBA? */ return 0; ba = mba_va[mb]; /* get virt addr */ mbc = (MBABC_WR + 1) - mba_bc[mb]; /* get Mbus bc */ if (bc > mbc) /* use smaller */ bc = mbc; for (i = 0; i < bc; i = i + pbc) { /* loop by pages */ if (!mba_map_addr (ba + i, &pa, mb)) /* page inv? */ break; if (!ADDR_IS_MEM (pa)) { /* NXM? */ mba_upd_sr (MBASR_RTMO, 0, mb); break; } pbc = VA_PAGSIZE - VA_GETOFF (pa); /* left in page */ if (pbc > (bc - i)) /* limit to rem xfr */ pbc = bc - i; if (DEBUG_PRI (mba_dev[mb], MBA_DEB_XFR)) fprintf (sim_deb, ">>MBA%d: write, pa = %X, bc = %X\n", mb, pa, pbc); if ((pa | pbc) & 1) { /* aligned word? */ for (j = 0; j < pbc; pa++, j++) { /* no, bytes */ if ((i + j) & 1) { WriteB (pa, (*buf >> 8) & BMASK); buf++; } else WriteB (pa, *buf & BMASK); } }
t_stat vax780_fload (int32 flag, char *cptr) { char gbuf[CBUFSIZE]; uint16 file_name[3], blkbuf[BLK_SIZE]; t_stat r; uint32 i, j, start, size, origin; if ((fl_unit.flags & UNIT_ATT) == 0) /* floppy attached? */ return SCPE_UNATT; if (*cptr == 0) return SCPE_2FARG; cptr = get_glyph (cptr, gbuf, 0); /* get file name */ if (!rtfile_parse (gbuf, file_name)) /* legal file name? */ return SCPE_ARG; if ((size = rtfile_lookup (file_name, &start)) == 0) /* file on floppy? */ return SCPE_ARG; if (*cptr) { /* origin? */ origin = (uint32) get_uint (cptr, 16, MEMSIZE, &r); if ((r != SCPE_OK) || (origin & 1)) /* must be even */ return SCPE_ARG; } else origin = 512; /* no, use default */ for (i = 0; i < size; i++) { /* loop thru blocks */ if (!rtfile_read (start + i, 1, blkbuf)) /* read block */ return SCPE_FMT; for (j = 0; j < BLK_SIZE; j++) { /* loop thru words */ if (ADDR_IS_MEM (origin)) WriteW (origin, blkbuf[j]); else return SCPE_NXM; origin = origin + 2; } } return SCPE_OK; }
int32 mba_rdbufW (uint32 mb, int32 bc, uint16 *buf) { int32 i, j, ba, mbc, pbc; uint32 pa, dat; if (mb >= MBA_NUM) /* valid MBA? */ return 0; ba = mba_va[mb]; /* get virt addr */ mbc = (MBABC_WR + 1) - mba_bc[mb]; /* get Mbus bc */ if (bc > mbc) /* use smaller */ bc = mbc; for (i = 0; i < bc; i = i + pbc) { /* loop by pages */ if (!mba_map_addr (ba + i, &pa, mb)) /* page inv? */ break; if (!ADDR_IS_MEM (pa)) { /* NXM? */ mba_upd_sr (MBASR_RTMO, 0, mb); break; } pbc = VA_PAGSIZE - VA_GETOFF (pa); /* left in page */ if (pbc > (bc - i)) /* limit to rem xfr */ pbc = bc - i; if (DEBUG_PRI (mba_dev[mb], MBA_DEB_XFR)) fprintf (sim_deb, ">>MBA%d: read, pa = %X, bc = %X\n", mb, pa, pbc); if ((pa | pbc) & 1) { /* aligned word? */ for (j = 0; j < pbc; pa++, j++) { /* no, bytes */ if ((i + j) & 1) { /* odd byte? */ *buf = (*buf & BMASK) | (ReadB (pa) << 8); buf++; } else *buf = (*buf & ~BMASK) | ReadB (pa); } } else if ((pa | pbc) & 3) { /* aligned LW? */ for (j = 0; j < pbc; pa = pa + 2, j = j + 2) { /* no, words */ *buf++ = ReadW (pa); /* get word */ } } else { /* yes, do by LW */ for (j = 0; j < pbc; pa = pa + 4, j = j + 4) { dat = ReadL (pa); /* get lw */ *buf++ = dat & WMASK; /* low 16b */ *buf++ = (dat >> 16) & WMASK; /* high 16b */ } } } mba_bc[mb] = (mba_bc[mb] + i) & MBABC_WR; mba_va[mb] = (mba_va[mb] + i) & MBAVA_WR; return i; }