1c701ec62SLaurent Vivier /* 2c701ec62SLaurent Vivier * QEMU Macintosh floppy disk controller emulator (SWIM) 3c701ec62SLaurent Vivier * 4c701ec62SLaurent Vivier * Copyright (c) 2014-2018 Laurent Vivier <laurent@vivier.eu> 5c701ec62SLaurent Vivier * 6c701ec62SLaurent Vivier * This work is licensed under the terms of the GNU GPL, version 2. See 7c701ec62SLaurent Vivier * the COPYING file in the top-level directory. 8c701ec62SLaurent Vivier * 9c701ec62SLaurent Vivier */ 10c701ec62SLaurent Vivier 11c701ec62SLaurent Vivier #ifndef SWIM_H 12c701ec62SLaurent Vivier #define SWIM_H 13c701ec62SLaurent Vivier 1482651e87SMarkus Armbruster #include "hw/block/block.h" 15c701ec62SLaurent Vivier #include "hw/sysbus.h" 16db1015e9SEduardo Habkost #include "qom/object.h" 17c701ec62SLaurent Vivier 18c701ec62SLaurent Vivier #define SWIM_MAX_FD 2 19c701ec62SLaurent Vivier 20c701ec62SLaurent Vivier typedef struct SWIMCtrl SWIMCtrl; 21c701ec62SLaurent Vivier 22c701ec62SLaurent Vivier #define TYPE_SWIM_DRIVE "swim-drive" 238063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(SWIMDrive, SWIM_DRIVE) 24c701ec62SLaurent Vivier 25c701ec62SLaurent Vivier struct SWIMDrive { 26c701ec62SLaurent Vivier DeviceState qdev; 27c701ec62SLaurent Vivier int32_t unit; 28c701ec62SLaurent Vivier BlockConf conf; 29c701ec62SLaurent Vivier }; 30c701ec62SLaurent Vivier 31c701ec62SLaurent Vivier #define TYPE_SWIM_BUS "swim-bus" 328063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(SWIMBus, SWIM_BUS) 33c701ec62SLaurent Vivier 34c701ec62SLaurent Vivier struct SWIMBus { 35c701ec62SLaurent Vivier BusState bus; 36c701ec62SLaurent Vivier struct SWIMCtrl *ctrl; 37c701ec62SLaurent Vivier }; 38c701ec62SLaurent Vivier 39c701ec62SLaurent Vivier typedef struct FDrive { 40c701ec62SLaurent Vivier SWIMCtrl *swimctrl; 41c701ec62SLaurent Vivier BlockBackend *blk; 42c701ec62SLaurent Vivier BlockConf *conf; 43c701ec62SLaurent Vivier } FDrive; 44c701ec62SLaurent Vivier 45c701ec62SLaurent Vivier struct SWIMCtrl { 4657004204SMark Cave-Ayland MemoryRegion swim; 4757004204SMark Cave-Ayland MemoryRegion iwm; 4857004204SMark Cave-Ayland MemoryRegion ism; 49c701ec62SLaurent Vivier FDrive drives[SWIM_MAX_FD]; 50c701ec62SLaurent Vivier int mode; 51c701ec62SLaurent Vivier /* IWM mode */ 52c701ec62SLaurent Vivier int iwm_switch; 53*994af0b2SMark Cave-Ayland uint8_t iwm_latches; 54*994af0b2SMark Cave-Ayland uint8_t iwmregs[8]; 55c701ec62SLaurent Vivier /* SWIM mode */ 5657004204SMark Cave-Ayland uint8_t ismregs[16]; 57c701ec62SLaurent Vivier uint8_t swim_phase; 58c701ec62SLaurent Vivier uint8_t swim_mode; 59*994af0b2SMark Cave-Ayland uint8_t swim_status; 60*994af0b2SMark Cave-Ayland uint8_t pram[16]; 61*994af0b2SMark Cave-Ayland uint8_t pram_idx; 62c701ec62SLaurent Vivier SWIMBus bus; 63c701ec62SLaurent Vivier }; 64c701ec62SLaurent Vivier 65c701ec62SLaurent Vivier #define TYPE_SWIM "swim" 668063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(Swim, SWIM) 67c701ec62SLaurent Vivier 68db1015e9SEduardo Habkost struct Swim { 69c701ec62SLaurent Vivier SysBusDevice parent_obj; 70c701ec62SLaurent Vivier SWIMCtrl ctrl; 71db1015e9SEduardo Habkost }; 72c701ec62SLaurent Vivier #endif 73