Annotation of nono/vm/sprite.cpp, revision 1.1.1.3

1.1       root        1: //
                      2: // nono
1.1.1.3 ! root        3: // Copyright (C) 2020 nono project
        !             4: // Licensed under nono-license.txt
1.1       root        5: //
                      6: 
                      7: #include "sprite.h"
                      8: #include <sys/time.h>
                      9: 
                     10: SpriteDevice::SpriteDevice()
                     11: {
                     12:        logname = "sprite";
                     13:        devname = "Sprite";
                     14:        devaddr = baseaddr;
                     15:        devlen  = 0x010000;
                     16: 
1.1.1.2   root       17:        mem.reset(new uint8[4 * 8192]);
1.1       root       18: }
                     19: 
                     20: SpriteDevice::~SpriteDevice()
                     21: {
                     22: }
                     23: 
                     24: uint64
                     25: SpriteDevice::Read8(uint32 addr)
                     26: {
                     27:        if (addr >= 0xeb8000) {
                     28:                return mem[HB(addr - 0xeb8000)];
                     29:        }
                     30:        PANIC("not impl");
                     31: }
                     32: 
                     33: uint64
                     34: SpriteDevice::Read16(uint32 addr)
                     35: {
                     36:        if (addr >= 0xeb8000) {
                     37:                return *(uint16 *)&mem[addr - 0xeb8000];
                     38:        }
                     39:        if (addr < 0xeb0400) {
                     40:                int n = (addr - 0xeb0000) / 8;
                     41:                switch (addr % 8) {
                     42:                 case 0:
                     43:                        return reg.sprite[n].xpos;
                     44:                 case 2:
                     45:                        return reg.sprite[n].ypos;
                     46:                 case 4:
                     47:                        return reg.sprite[n].col;
                     48:                 case 6:
                     49:                        return reg.sprite[n].prw;
                     50:                }
                     51:        }
                     52:        if (0xeb0800 <= addr && addr < 0xeb0812) {
                     53:                switch (addr) {
                     54:                 case 0xeb0800:
                     55:                        return reg.bg0x;
                     56:                 case 0xeb0802:
                     57:                        return reg.bg0y;
                     58:                 case 0xeb0804:
                     59:                        return reg.bg1x;
                     60:                 case 0xeb0806:
                     61:                        return reg.bg1y;
                     62:                 case 0xeb0808:
                     63:                        return reg.bgctrl;
                     64:                 case 0xeb080a:
                     65:                        return reg.htotal;
                     66:                 case 0xeb080c:
                     67:                        return reg.hdisp;
                     68:                 case 0xeb080e:
                     69:                        return reg.vdisp;
                     70:                 case 0xeb0810:
                     71:                        return reg.res;
                     72:                }
                     73:        }
                     74: 
                     75:        return (uint64)-1;
                     76: }
                     77: 
                     78: uint64
                     79: SpriteDevice::Write8(uint32 addr, uint32 data)
                     80: {
                     81:        if (addr >= 0xeb8000) {
                     82:                mem[HB(addr - 0xeb8000)] = data;
                     83:                return 0;
                     84:        }
                     85:        PANIC("not impl");
                     86: }
                     87: 
                     88: uint64
                     89: SpriteDevice::Write16(uint32 addr, uint32 data)
                     90: {
                     91:        putlog(2, "Write16 $%06x <- $%04x", addr, data);
                     92:        if (addr >= 0xeb8000) {
                     93:                *(uint16 *)&mem[addr - 0xeb8000] = data;
                     94:                return 0;
                     95:        }
                     96:        if (addr < 0xeb0400) {
                     97:                int n = (addr - 0xeb0000) / 8;
                     98:                switch (addr % 8) {
                     99:                 case 0:
                    100:                        reg.sprite[n].xpos = data & 0x3ff;
                    101:                        break;
                    102:                 case 2:
                    103:                        reg.sprite[n].ypos = data & 0x3ff;
                    104:                        break;
                    105:                 case 4:
                    106:                        reg.sprite[n].col = data & 0xcfff;
                    107:                        break;
                    108:                 case 6:
                    109:                        reg.sprite[n].prw = data & 0x3;
                    110:                        break;
                    111:                }
                    112:                return 0;
                    113:        }
                    114:        if (0xeb0800 <= addr && addr < 0xeb0812) {
                    115:                switch (addr) {
                    116:                 case 0xeb0800:
                    117:                        reg.bg0x = data & 0x3ff;
                    118:                        break;
                    119:                 case 0xeb0802:
                    120:                        reg.bg0y = data & 0x3ff;
                    121:                        break;
                    122:                 case 0xeb0804:
                    123:                        reg.bg1x = data & 0x3ff;
                    124:                        break;
                    125:                 case 0xeb0806:
                    126:                        reg.bg1y = data & 0x3ff;
                    127:                        break;
                    128:                 case 0xeb0808:
                    129:                        reg.bgctrl = data & 0x23f;
                    130:                        break;
                    131:                 case 0xeb080a:
                    132:                        reg.htotal = data & 0xff;
                    133:                        break;
                    134:                 case 0xeb080c:
                    135:                        reg.hdisp = data & 0x3f;
                    136:                        break;
                    137:                 case 0xeb080e:
                    138:                        reg.vdisp = data & 0xff;
                    139:                        break;
                    140:                 case 0xeb0810:
                    141:                        reg.res = data & 0x1f;
                    142:                        break;
                    143:                }
                    144:                return 0;
                    145:        }
                    146: 
                    147:        return (uint64)-1;
                    148: }
                    149: 
                    150: uint64
                    151: SpriteDevice::Peek8(uint32 addr)
                    152: {
                    153:        if (addr >= 0xeb8000) {
                    154:                return mem[HB(addr - 0xeb8000)];
                    155:        }
                    156:        if (addr < 0xeb0400) {
                    157:                int n = (addr - 0xeb0000) / 8;
                    158:                switch (addr % 8) {
                    159:                 case 0:
                    160:                        return reg.sprite[n].xpos;
                    161:                 case 2:
                    162:                        return reg.sprite[n].ypos;
                    163:                 case 4:
                    164:                        return reg.sprite[n].col;
                    165:                 case 6:
                    166:                        return reg.sprite[n].prw;
                    167:                }
                    168:        }
                    169:        if (0xeb0800 <= addr && addr < 0xeb0812) {
                    170:                switch (addr) {
                    171:                 case 0xeb0800:
                    172:                        return reg.bg0x;
                    173:                 case 0xeb0802:
                    174:                        return reg.bg0y;
                    175:                 case 0xeb0804:
                    176:                        return reg.bg1x;
                    177:                 case 0xeb0806:
                    178:                        return reg.bg1y;
                    179:                 case 0xeb0808:
                    180:                        return reg.bgctrl;
                    181:                 case 0xeb080a:
                    182:                        return reg.htotal;
                    183:                 case 0xeb080c:
                    184:                        return reg.hdisp;
                    185:                 case 0xeb080e:
                    186:                        return reg.vdisp;
                    187:                 case 0xeb0810:
                    188:                        return reg.res;
                    189:                }
                    190:        }
                    191: 
                    192:        return (uint64)-1;
                    193: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.