void GetScrap(void **handle, uint32 type, int32 offset) { #if defined(__LP64__) D(bug("GetScrap handle %p, type %08x, offset %d\n", handle, type, offset)); #warning Carbon scrapbook function are not implemented in 64-bit mode #else D(bug("GetScrap handle %p, type %08x, offset %d\n", handle, type, offset)); ScrapRef theScrap; if (GetCurrentScrap(&theScrap) != noErr) { D(bug(" could not open scrap\n")); return; } Size byteCount; if (GetScrapFlavorSize(theScrap, type, &byteCount) == noErr) { // Allocate space for new scrap in MacOS side M68kRegisters r; r.d[0] = byteCount; Execute68kTrap(0xa71e, &r); // NewPtrSysClear() uint32 scrap_area = r.a[0]; // Get the native clipboard data if (scrap_area) { uint8 * const data = Mac2HostAddr(scrap_area); if (GetScrapFlavorData(theScrap, type, &byteCount, data) == noErr) { SwapScrapData(type, data, byteCount, FALSE); // Add new data to clipboard static uint8 proc[] = { 0x59, 0x8f, // subq.l #4,sp 0xa9, 0xfc, // ZeroScrap() 0x2f, 0x3c, 0, 0, 0, 0, // move.l #length,-(sp) 0x2f, 0x3c, 0, 0, 0, 0, // move.l #type,-(sp) 0x2f, 0x3c, 0, 0, 0, 0, // move.l #outbuf,-(sp) 0xa9, 0xfe, // PutScrap() 0x58, 0x8f, // addq.l #4,sp M68K_RTS >> 8, M68K_RTS & 0xff }; r.d[0] = sizeof(proc); Execute68kTrap(0xa71e, &r); // NewPtrSysClear() uint32 proc_area = r.a[0]; if (proc_area) { Host2Mac_memcpy(proc_area, proc, sizeof(proc)); WriteMacInt32(proc_area + 6, byteCount); WriteMacInt32(proc_area + 12, type); WriteMacInt32(proc_area + 18, scrap_area); we_put_this_data = true; Execute68k(proc_area, &r); r.a[0] = proc_area; Execute68kTrap(0xa01f, &r); // DisposePtr } } r.a[0] = scrap_area; Execute68kTrap(0xa01f, &r); // DisposePtr }
int16 EtherOpen(uint32 pb, uint32 dce) { D(bug("EtherOpen\n")); // Allocate driver data M68kRegisters r; r.d[0] = SIZEOF_etherdata; Execute68kTrap(0xa71e, &r); // NewPtrSysClear() if (r.a[0] == 0) return openErr; ether_data = r.a[0]; D(bug(" data %08lx\n", ether_data)); WriteMacInt16(ether_data + ed_DeferredTask + qType, dtQType); WriteMacInt32(ether_data + ed_DeferredTask + dtAddr, ether_data + ed_Code); WriteMacInt32(ether_data + ed_DeferredTask + dtParam, ether_data + ed_Result); // Deferred function for signalling that packet write is complete (pointer to mydtResult in a1) WriteMacInt16(ether_data + ed_Code, 0x2019); // move.l (a1)+,d0 (result) WriteMacInt16(ether_data + ed_Code + 2, 0x2251); // move.l (a1),a1 (dce) WriteMacInt32(ether_data + ed_Code + 4, 0x207808fc); // move.l JIODone,a0 WriteMacInt16(ether_data + ed_Code + 8, 0x4ed0); // jmp (a0) WriteMacInt32(ether_data + ed_DCE, dce); // ReadPacket/ReadRest routines WriteMacInt16(ether_data + ed_ReadPacket, 0x6010); // bra 2 WriteMacInt16(ether_data + ed_ReadPacket + 2, 0x3003); // move.w d3,d0 WriteMacInt16(ether_data + ed_ReadPacket + 4, 0x9041); // sub.w d1,d0 WriteMacInt16(ether_data + ed_ReadPacket + 6, 0x4a43); // tst.w d3 WriteMacInt16(ether_data + ed_ReadPacket + 8, 0x6702); // beq 1 WriteMacInt16(ether_data + ed_ReadPacket + 10, M68K_EMUL_OP_ETHER_READ_PACKET); WriteMacInt16(ether_data + ed_ReadPacket + 12, 0x3600); //1 move.w d0,d3 WriteMacInt16(ether_data + ed_ReadPacket + 14, 0x7000); // moveq #0,d0 WriteMacInt16(ether_data + ed_ReadPacket + 16, 0x4e75); // rts WriteMacInt16(ether_data + ed_ReadPacket + 18, M68K_EMUL_OP_ETHER_READ_PACKET); //2 WriteMacInt16(ether_data + ed_ReadPacket + 20, 0x4a43); // tst.w d3 WriteMacInt16(ether_data + ed_ReadPacket + 22, 0x4e75); // rts return 0; }