@@ -12,6 +12,7 @@ import (
12
12
"github.com/USA-RedDragon/go-gba/internal/emulator/ppu"
13
13
)
14
14
15
+ //nolint:golint,revive
15
16
const (
16
17
// BIOSROMSize is 16KB
17
18
BIOSROMSize = 16 * 1024
@@ -29,6 +30,7 @@ const (
29
30
CPSR_REG = 16
30
31
)
31
32
33
+ //nolint:golint,revive
32
34
type ARM7TDMI struct {
33
35
// Registers R0-R16
34
36
r [17 ]uint32
@@ -129,7 +131,7 @@ func (c *ARM7TDMI) DebugRegisters() string {
129
131
ret += fmt .Sprintf (" R0: 0x%08X\t R1: 0x%08X\t R2: 0x%08X\t R3: 0x%08X\n " , c .ReadRegister (0 ), c .ReadRegister (1 ), c .ReadRegister (2 ), c .ReadRegister (3 ))
130
132
ret += fmt .Sprintf (" R4: 0x%08X\t R5: 0x%08X\t R6: 0x%08X\t R7: 0x%08X\n " , c .ReadRegister (4 ), c .ReadRegister (5 ), c .ReadRegister (6 ), c .ReadRegister (7 ))
131
133
if c .GetThumbMode () {
132
- ret += fmt .Sprintf (" R8: 0x%08X\t R9: 0x%08X\t R10: 0x%08X\t R11: 0x%08X\n " , c .ReadHighRegister (8 - 8 ), c .ReadHighRegister (9 - 8 ), c .ReadHighRegister (10 - 8 ), c .ReadHighRegister (11 - 8 ))
134
+ ret += fmt .Sprintf (" R8: 0x%08X\t R9: 0x%08X\t R10: 0x%08X\t R11: 0x%08X\n " , c .ReadHighRegister (0 ), c .ReadHighRegister (9 - 8 ), c .ReadHighRegister (10 - 8 ), c .ReadHighRegister (11 - 8 ))
133
135
ret += fmt .Sprintf ("R12: 0x%08X\t SP: 0x%08X\t LR: 0x%08X\t PC: 0x%08X\n " , c .ReadHighRegister (12 - 8 ), c .ReadHighRegister (13 - 8 ), c .ReadHighRegister (14 - 8 ), c .ReadHighRegister (15 - 8 ))
134
136
} else {
135
137
ret += fmt .Sprintf (" R8: 0x%08X\t R9: 0x%08X\t R10: 0x%08X\t R11: 0x%08X\n " , c .ReadRegister (8 ), c .ReadRegister (9 ), c .ReadRegister (10 ), c .ReadRegister (11 ))
@@ -405,119 +407,122 @@ func (c *ARM7TDMI) WriteHighRegister(reg uint8, value uint32) {
405
407
default :
406
408
panic ("Unknown CPU mode" )
407
409
}
408
-
409
410
}
410
411
412
+ //nolint:golint,gocyclo
411
413
func (c * ARM7TDMI ) ReadRegister (reg uint8 ) uint32 {
412
414
if c .GetThumbMode () {
413
415
if reg > 7 && reg != PC_REG && reg != LR_REG && reg != SP_REG && reg != CPSR_REG {
414
416
panic (fmt .Sprintf ("Invalid register number %d" , reg ))
415
417
}
416
- if reg == PC_REG {
418
+ switch reg {
419
+ case PC_REG :
417
420
return c .ReadPC ()
418
- } else if reg == LR_REG {
421
+ case LR_REG :
419
422
return c .ReadLR ()
420
- } else if reg == SP_REG {
423
+ case SP_REG :
421
424
return c .ReadSP ()
422
- } else if reg == CPSR_REG {
425
+ case CPSR_REG :
423
426
return c .ReadCPSR ()
424
427
}
425
428
return c .r [reg ]
426
- } else {
427
- if reg > 16 {
428
- panic (fmt .Sprintf ("Invalid register number %d" , reg ))
429
+ }
430
+ if reg > 16 {
431
+ panic (fmt .Sprintf ("Invalid register number %d" , reg ))
432
+ }
433
+ switch cpuMode (c .r [CPSR_REG ] & 0x1F ) {
434
+ case systemMode :
435
+ return c .r [reg ]
436
+ case userMode :
437
+ return c .r [reg ]
438
+ case fiqMode :
439
+ switch reg {
440
+ case 8 :
441
+ return c .r8_fiq
442
+ case 9 :
443
+ return c .r9_fiq
444
+ case 10 :
445
+ return c .r10_fiq
446
+ case 11 :
447
+ return c .r11_fiq
448
+ case 12 :
449
+ return c .r12_fiq
450
+ case 13 :
451
+ return c .sp_fiq
452
+ case 14 :
453
+ return c .lr_fiq
454
+ default :
455
+ return c .r [reg ]
456
+ }
457
+ case irqMode :
458
+ switch reg {
459
+ case 13 :
460
+ return c .sp_irq
461
+ case 14 :
462
+ return c .lr_irq
463
+ default :
464
+ return c .r [reg ]
429
465
}
430
- switch cpuMode (c .r [CPSR_REG ] & 0x1F ) {
431
- case systemMode :
466
+ case supervisorMode :
467
+ switch reg {
468
+ case 13 :
469
+ return c .sp_svc
470
+ case 14 :
471
+ return c .lr_svc
472
+ default :
432
473
return c .r [reg ]
433
- case userMode :
474
+ }
475
+ case abortMode :
476
+ switch reg {
477
+ case 13 :
478
+ return c .sp_abt
479
+ case 14 :
480
+ return c .lr_abt
481
+ default :
434
482
return c .r [reg ]
435
- case fiqMode :
436
- switch reg {
437
- case 8 :
438
- return c .r8_fiq
439
- case 9 :
440
- return c .r9_fiq
441
- case 10 :
442
- return c .r10_fiq
443
- case 11 :
444
- return c .r11_fiq
445
- case 12 :
446
- return c .r12_fiq
447
- case 13 :
448
- return c .sp_fiq
449
- case 14 :
450
- return c .lr_fiq
451
- default :
452
- return c .r [reg ]
453
- }
454
- case irqMode :
455
- switch reg {
456
- case 13 :
457
- return c .sp_irq
458
- case 14 :
459
- return c .lr_irq
460
- default :
461
- return c .r [reg ]
462
- }
463
- case supervisorMode :
464
- switch reg {
465
- case 13 :
466
- return c .sp_svc
467
- case 14 :
468
- return c .lr_svc
469
- default :
470
- return c .r [reg ]
471
- }
472
- case abortMode :
473
- switch reg {
474
- case 13 :
475
- return c .sp_abt
476
- case 14 :
477
- return c .lr_abt
478
- default :
479
- return c .r [reg ]
480
- }
481
- case undefinedMode :
482
- switch reg {
483
- case 13 :
484
- return c .sp_und
485
- case 14 :
486
- return c .lr_und
487
- default :
488
- return c .r [reg ]
489
- }
483
+ }
484
+ case undefinedMode :
485
+ switch reg {
486
+ case 13 :
487
+ return c .sp_und
488
+ case 14 :
489
+ return c .lr_und
490
490
default :
491
- panic ( "Unknown CPU mode" )
491
+ return c . r [ reg ]
492
492
}
493
+ default :
494
+ panic ("Unknown CPU mode" )
493
495
}
494
496
}
495
497
498
+ //nolint:golint,gocyclo
496
499
func (c * ARM7TDMI ) WriteRegister (reg uint8 , value uint32 ) {
497
500
if c .GetThumbMode () {
498
501
if reg > 7 && reg != PC_REG && reg != LR_REG && reg != SP_REG && reg != CPSR_REG {
499
502
panic (fmt .Sprintf ("Invalid register number %d" , reg ))
500
503
}
501
- if reg == PC_REG {
504
+ switch reg {
505
+ case PC_REG :
502
506
c .WritePC (value )
503
- } else if reg == LR_REG {
507
+ case LR_REG :
504
508
c .WriteLR (value )
505
- } else if reg == SP_REG {
509
+ case SP_REG :
506
510
c .WriteSP (value )
507
- } else if reg == CPSR_REG {
511
+ case CPSR_REG :
508
512
c .WriteCPSR (value )
509
- } else {
513
+ default :
510
514
c .r [reg ] = value
511
515
}
512
516
} else {
513
517
if reg > 16 {
514
518
panic (fmt .Sprintf ("Invalid register number %d" , reg ))
515
519
}
516
- if reg == PC_REG {
520
+ switch reg {
521
+ case PC_REG :
517
522
c .WritePC (value )
518
- } else if reg == LR_REG {
523
+ case LR_REG :
519
524
c .WriteLR (value )
520
- } else {
525
+ default :
521
526
switch cpuMode (c .r [CPSR_REG ] & 0x1F ) {
522
527
case systemMode :
523
528
c .r [reg ] = value
@@ -786,6 +791,7 @@ func (c *ARM7TDMI) fetchThumb() uint16 {
786
791
return instruction
787
792
}
788
793
794
+ //nolint:golint,gocyclo
789
795
func (c * ARM7TDMI ) stepARM () {
790
796
// FETCH
791
797
instruction := c .fetchARM ()
@@ -796,7 +802,7 @@ func (c *ARM7TDMI) stepARM() {
796
802
}
797
803
798
804
// DECODE
799
- var condition uint32 = instruction >> 28
805
+ var condition = instruction >> 28
800
806
conditionFailed := false
801
807
// c.r[CSPR_REG] has condition flags N Z C V at bits 31-28
802
808
// c.r[CSPR_REG] has control bits I F T at bits 7-5
@@ -1051,11 +1057,7 @@ func (c *ARM7TDMI) SetThumbMode(value bool) {
1051
1057
}
1052
1058
1053
1059
func (c * ARM7TDMI ) GetThumbMode () bool {
1054
- if c .r [CPSR_REG ]& (1 << 5 )>> 5 == 0 {
1055
- return false
1056
- } else {
1057
- return true
1058
- }
1060
+ return c .r [CPSR_REG ]& (1 << 5 )>> 5 != 0
1059
1061
}
1060
1062
1061
1063
// InteractiveRun runs the CPU one instruction at a time, waiting for user input
0 commit comments