-
Notifications
You must be signed in to change notification settings - Fork 1
/
everynes.txt
13980 lines (12513 loc) · 656 KB
/
everynes.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Everynes - Nocash NES Specs
---------------------------
Contents
--------
No$nes Emulator / Debugger
--> No$nes Controls
--> No$nes Emulation Files
Everynes NES Hardware Specifications
--> Tech Data
--> Memory Maps
--> I/O Map
--> Picture Processing Unit (PPU)
--> Audio Processing Unit (APU)
--> Controllers
--> Cartridges and Mappers
--> Famicom Disk System (FDS)
--> VS System
--> Nintendo Playchoice 10
--> FamicomBox
--> Modems
--> Hardware Pin-Outs
--> CPU 65XX Microprocessor
--> About Everynes
No$nes Controls
---------------
General Joypad Controls
Keyboard controls for up to four players can be defined in setup. Buttons of
USB Gamepads & Joysticks & the like can be also changed per player.
Special Controls
F1..F5 Enable/Disable Sound Channel 1-5
F9 Enable/Disable Showing Screen Splits as dotted line
NUM * Hard Reset
NUM / Soft Reset
NUM - Switch to Debug Mode
NUM + Disable Realtime Delays and use 10% frameskip (while held down)
BS Disable Realtime Delays (same as above, for notebook keyboards)
Famicom Disk System (FDS)
INS Flip Disk (some games ignore fast flips; hold down for some seconds)
VS Unisystem (Arcade Cabinet)
INS Credit Left Coin Slot
HOME Credit Right Coin Slot
PGUP Credit Service Button
1..4 Button 1..4 (aliases for NES Start/Select buttons)
0 DIP-Switch Window
Playchoice 10 (Arcade Cabinet)
INS Credit Coin Slot 1
HOME Credit Coin Slot 2 (works only if enabled via DIP switches)
PGUP Service Button (add credit) (during reset: bookkeeping)
DEL Reset Button (if any)
END Enter Button (also works via Num-Enter)
PGDN Channel Select Button
0 DIP-Switch Window
Mouse Zapper (Lightgun Move/Trigger)
FamicomBox
INS XXX Insert Coin
HOME RESET Button
PGUP XXX GAME/TV Button
123456 1st..6th Keyswitch Position (from left) [=INTENDED, see Note]
0 DIP-Switch Window
Mouse Zapper (Lightgun Move/Trigger)
Note: The ordering of the keyswitch positions from left-to-right is still
unknown; currently keys 1..6 are simply mapped to keyswitch bit0..5.
Multi-cart loading isn't emulated yet, so you'll only see the menu & self-test
feature, without any games.
Famicom Keyboard
BS/DEL DEL
HOME CLR
TAB ESC
END STOP
L-ALT GRPH
R-ALT KANA
Party Tap Push Buttons
123456 Buttons for Player 1-6
Konami Hyper Shot Push Buttons
Joypad Button A --> "RUN"-Button (or, used as "Shoot-Right" in Hyper Sports)
Joypad Button B --> "JUMP"-Button (or, used as "Shoot-Left" in Hyper Sports)
The games do replace joypad data by button data; no$nes somewhat undoes that
replacement.
Lightguns (NES Zapper, Famicom Beam Gun, VS Zapper, Bandai Hyper Shot Gun)
Mouse Move
Left Mouse Button Trigger
Paddle (NES and both Famicom versions)
Mouse (left/right) Move
Left Mouse Button Button
Oeka Kids Tablet
Mouse Move & Touch
Left Mouse Button Click
Mouse / Trackball
Mouse (move) Move
Left/Right Button Left/Right Button (A/B Button on Trackball)
Middle Button or ESC Return mouse to operating system
Power Glove
Gamepad Analog X/Y/Z/R Position X/Y/Z and Wrist Rotation
Gamepad Button 1..4 Thumb/Index/Middle/Ring Finger Flex
Gamepad Digital POV Keypad DPAD
Keyboard 0..9 Keypad 0..9
Keyboard Buttons/DPAD Keypad A,B,Start,Select,DPAD
XXX Keypad Prog,Center,Enter
UForce
Page Down Top-most sensor ;\for push-button
NUM-/ NUM-* Upper Left/Right sensors in upper field ; style usage (with
NUM-8 NUM-9 Lower Left/Right sensors in upper field ; sensor=min/max)
NUM-5 Upper Left sensor in lower field ; (eg. Nuclear Rat,
NUM-2 NUM-3 Lower Left/Right sensors in lower field ; and Rock on Air)
Page Up Bottom-most sensor ;/
Gamepad Analog X Top-most sensor ;\for analog usage
Gamepad Analog Y Bottom-most sensor, or, ; (eg. Hose'em Down
Gamepad Analog Y Lower-Left sensor in lower field ;/and Rock on Air)
Plus Start/Select as configured in joypad setup. Analog mode is activate when
moving the analog gamepad (and will then override the corresponding keyboard
keys). Analog input emulation is matched to the existing "UForce Power Games"
cartridge (and may mismatch with other/homebrew UForce games).
Top-Rider Bike
Gamepad Analog X Steering Handles Left/Right
Gamepad Analog Y Forward=GearLo, Back=GearHi
Gamepad Analog Z Forward=Accelerate Slow/Fast, Back=Accelerate Turbo
Gamepad Button 1,2,3,4 Brake,Wheelie,Start,Select
Pachinko
Digital Joypad/Keyboard Pachinko Joypad Buttons
Analog Joypad Forward Pachinko Analog Dial
Barcode Reader (Barcode Batter and Datach)
INS-Key Paste numeric ASCII string from clipboard and Send barcode
DEL-Key Manually Clear input buffer (without sending)
Keypad 0..9 Manually Key-in Barcode digits
Keypad Dot Manually Confirm input and Send (or re-send) barcode
Note: For the Barcode Battler, only EAN-13 is implemented (since it's unknown
how/if it supports shorter UPC-A, UPC-E, or EAN-8 barcodes). For Datach,
EAN-13, UPC-A, EAN-8 are supported (however, the Datach software seems to
support a further non-standard unknown barcode format, which isn't emulated).
Capcom Mahjong Controller
A..N Drop Card A..N (or N=Draw new card)
Space Same as N
F1..F7 Function Keys (Select, Start, and five "japanese" keys)
Tab/LeftCtrl Same as F1 (Select)
Enter Same as F2 (Enter)
Piano Keyboard
12345... 1st Octave (12 keys) (only last 7 keys used on Doremikko)
QWERT... 2nd Octave (12 keys) (all keys used)
ASDFG... 3rd Octave (12 keys) (all keys used)
ZXCVB... 4th Octave (10 keys) (only first 5 keys used on Doremikko)
Rshift/Ctrl 4th Octave (last 2) (Miracle only)
NUM-Dot 5th Octave (1 key) (Miracle only)
NUM-0..7 Control Buttons 0..7 (Miracle only)
Left Shift Sustain Foot Pedal (Miracle only)
Note: The miracle sound isn't emulated (as far as known there aren't any dumps
of it's BIOS and SOUND-ROM existing yet). The FDS sound for Doremikko isn't
emulated yet (when I last checked, there seems to have been little known about
FDS sound hardware).
Mats (Power Pad/Family Trainer/Tap-tap Mat)
QWER --> Upper row (Side B) RTYU --> Upper Row (Side A, or Tap-tap Mat)
ASDF --> Middle row (Side B) FGHJ --> Middle Row (Side A, or Tap-tap Mat)
ZXCV --> Lower row (Side B) VBNM --> Lower Row (Side A, or Tap-tap Mat)
Safety Note: Put the keyboard on the floor if you are using feet or hammer.
Exciting Boxing Bag
Num-7,8,9 Left Hook, N/A ,Right Hook
Num-4,5,6 Left Jabb, Straight ,Right Jabb
Num-1,2,3 Left Push, Body ,Right Push
RacerMate Bicycle Trainer
Gamepad Analog X Pulse
Gamepad Analog Y Speed
Gamepad Analog Z Watts
F1 or Enter Button F1 (START)
F2 Button F2 (DISPLAY)
F3 Button F3 (SET)
F4 or End Button RESET
PGUP or Up Button Plus (UP)
PGDN or Down Button Minus (DOWN)
XED Editor
----------
--> XED About
--> XED Hotkeys
--> XED Assembler/Debugger Interface
--> XED Commandline based standalone version
XED About
---------
About XED
XED is a text editor, the executable is fast and small, and it includes
comfortable editing functions. It is both intended for standard .TXT files (or
any other ASCII files, such like .ASM for assembler source code). Also, the
line-wrapping support (.XED files) can be used for authoring stories,
specifications, etc. Most of the features are much the same as for other text
editors, some special functions are pointed out below:
Block Selection
XED supports good old quality block mechanisms, allowing to copy/move the
selection directly to cursor position by Ctrl+K,C/V hotkeys (without needing to
use paste). For data exchange with other programs or text files, the block can
be directly written to (or loaded from) file by Ctrl+K,R/W. And, mainstream
copy/cut/paste functions are supported as well, by Ctrl+Ins, Shift+Del,
Shift+Ins.
Note: The block remains selected even when typing text, and it won't get
deleted when touching Del-key.
Condensed Display Mode
Condensed mode is activated by "F6,C" key combination. In this mode, only lines
beginning with colon ":", or (for assembler source code files) with
semicolon-colon ";:", for example:
:Chapter IV
;:---Sound Engine---
Normal block functions can be used in this mode to Move, Copy, or Delete whole
'chapter(s)'. Cursor keys can be used to move the cursor to a specific chapter.
Pushing Enter or Escape terminates condensed mode.
Column Block Mode
Column mode is activated by "Ctrl+K,N" key combination. In this mode, the block
selection appears as a rectangular area, allowing to deal with tables & columns
in text files by using copy/delete, indent/unindent block functions.
Typing "Ctrl+K,N" again will return to normal block mode (in which any lines
between begin/end of the block will be selected at full length).
Blank Space
Unlike most other editors, XED allows to move the cursor to any screen
location, including at horizontal positions after the end of the current line.
Entering space characters at such locations advances the cursor position, but
does not actually store space characters in the file.
When typing text, spaces are automatically inserted between line-end and cursor
position. Respectively, ending spaces are automatically deleted (eg. assume
that the line contains "Hello !", deleting "!" will also remove the space
character, internally).
That is of course all happening behind your back, you won't have to care about
it - but you can be sure that there'll be no hidden spaces filling up disk
space.
Tabulation Marks / TAB-Key
The TAB Key advances the cursor to the next higher tabulation location (usually
in steps of eight columns, counted from leftmost screen border), and the
appropriate number of spaces is inserted into the file if necessary.
In overwrite mode (de-/activated by INS Key), the TAB Key simply advances the
cursor without actually inserting spaces (and without overwriting existing text
by spaces).
Tabulation Marks / CHR(9)
When enabled in setup (default), TAB marks are automatically expanded into
appropriate number of spaces (ie. towards next "8-column" position) when
loading a file.
The file is normally saved by using raw SPC characters, without any TABs.
Optionally, it can be saved by using "best-fill" SPCs and TABs (disabled by
default), that feature may conflict with third party tools (assemblers,
compilers, etc). In order to reduce the risk of such problems, best-fill is
suppressed in quoted lines (by using ' or " or <> quotation marks, eg. db
'Hello !').
Line Wrapping
Line wrapping is enabled/disabled by "F5+W" key combination. Wrapping is
automatically enabled when loading a file with extension ".XED".
In the file, wrapped lines are using CR characters as soft linebreaks,
paragraphs are terminated by normal CR,LF characters.
Note: It'd be recommended to convert .XED files into 'standard' formats such
like .TXT or .HTM before releasing them, but preferably NOT into disliked
bloated file formats such like .PDF or .DOC.
Word Processing
Aside from the above line-wrapping support, no other 'word processing' features
are included, the program provides normal 'type writer' functions, not more,
not less. In particular, any overload such like bold or colored text, big and
small fonts, bitmaps and different fonts are disliked.
XED Hotkeys
-----------
XED recognizes both CP/M Wordstar hotkeys (also used by Borland PC compilers),
and Norton editor hotkeys (NU.EXE). The "Ctrl+X,Y" style hotkeys are wordstar
based, particulary including good block functions. The F4,X and Alt/Ctrl+X type
hotkeys are norton based, particulary very useful for forwards/backwards
searching.
Standard Cursor Keys
Up Move line up
Down Move line down
Left Move character left
Right Move character right
Pgup Scroll page up / to top of screen
Pgdn Scroll page down / to bottom of screen
Ctrl+Pgup Go to start of file (or Ctrl+Home)
Ctrl+Pgdn Go to end of file (or Ctrl+End)
Home Go to start of line
End Go to end of line
Ctrl+Left Move word left
Ctrl+Right Move word right
Ins Toggle Insert/Overwrite mode
Del Delete char below cursor
Backspace Delete char left of cursor
Tab Move to next tabulation mark
Enter New line/paragraph end
Esc Quit (or Alt+X, F3+Q, Ctrl+K+D, Ctrl+K+Q, Ctrl+K+X)
Note: Pgup/Pgdn are moving the cursor to top/bottom of screen, page scrolling
takes place only if the cursor was already at that location.
Editor Keys
Ctrl+Y Delete line (or Alt+K)
Alt+L Delete to line end (or Ctrl+Q,Y)
Alt+V Caseflip to line end
Ctrl+V Caseflip from line beginning
Norton Search/Replace Functions
Alt+F Norton - search/replace, forwards
Ctrl+F Norton - search/replace, backwards
Alt+C Norton - continue search/replace, forwards
Ctrl+C Norton - continue search/replace, backwards
Search: Type "Alt/Ctrl+F, String, Enter".
Search+replace: "Type Alt/Ctrl+F, String1, Alt+F, String2, Enter".
Non-case sensitive: Terminate by Escape instead of Enter.
Wordstar Search/Replace Functions
Ctrl+Q,F Wordstar - search
Ctrl+Q,A Wordstar - replace
Ctrl+L Wordstar - continue search/replace
Search options: B=Backwards, G=Global, N=No query,
U=non-casesensitive, W=whole words only, n=n times.
Disk Commands
F3,E Save+exit
F3,S Save (or Ctrl+K,S)
F3,N Edit new file
F3,A Append a file
See also: Block commands (read/write block).
Block Selection
Shift+Cursor Select block begin..end
Ctrl+K,B Set block begin (or F4,S)
Ctrl+K,K Set block end (or F4,S)
Ctrl+K,H Remove/hide block markers (or F4,R)
F4,L Mark line including ending CRLF (or Ctrl+K,L)
F4,E Mark line excluding ending CRLF
Ctrl+K,T Mark word
Ctrl+K,N Toggle normal/column blocktype
Clipboard Commands
Shift+Ins Paste from Clipboard
Shift+Del Cut to Clipboard
Ctrl+Ins Copy to Clipboard
Ctrl+Del Delete Block
Block Commands
Ctrl+K,C Copy block (or F4,C)
Ctrl+K,V Move block (or F4,M)
Ctrl+K,Y Delete block (or F4,D)
Ctrl+K,P Print block (or F7,B)
Ctrl+Q,B Find block begin (or F4,F)
Ctrl+Q,K Find block end (or F4,F)
Ctrl+K,R Read block from disk towards cursor location
Ctrl+K,W Write block to disk
Ctrl+K,U Unindent block (delete one space at begin of each line)
Ctrl+K,I Indent block (insert one space at begin of each line)
F5,F Format block (with actual x-wrap size) (or ;Ctrl+B)
F8,A Add values within column-block
Setup Commands
F11 Setup menu (or F8,S)
F5,S Save editor configuration
F5,L Set line len for word wrap (or Ctrl+O,R)
F5,W Wordwrap on/off (or Ctrl+O,W) (*)
F5,I Auto indent on/off (or Ctrl+O,I)
F5,T Set tab display spacing
(*) Wrapped lines will be terminated by CR, paragraphs by CRLF.
Other
F1 Help
F2 Status (displays info about file & currently selected block)
F8,M Make best fill tabs
F8,T Translate all tabs to spaces
SrcLock Freeze cursor when typing text ("useful" for backwards writing)
Ctrl+O,C Center current line
Ctrl+K,# Set marker (#=0..9)
Ctrl+Q,# Move to marker (#=0..9)
Ctrl+Q,P Move to previous pos
F6,C Condensed display mode on/off (*)
Ctrl+G Go to line nnnn (or F6,G) (or commandline switch /l:nnnn)
(*) only lines starting with ':' or ';:' will be displayed. cursor and block
commands can be used (e.g. to copy a text-sequence by just marking it's
headline)
Hex-Edit Keys (Binary Files)
This mode is activated by /b commandline switch, allowing to view and modify
binary files. Aside from normal cursor keys, the following hotkeys are used:
Tab Toggle between HEX and ASC mode (or Shift+Left/Right)
Ctrl+Arrow Step left/right one full byte (instead one single HEX digit)
Ctrl+G Goto hex-address
Ctrl+K,S Save file (as usually)
Printer Commands
F7,P Print file
F7,B Print block (or Ctrl+K,P)
F7,E Eject page
F7,S Set page size
More printer options can be found in setup. Printing was working well (at least
with my own printer) in older XED versions, but it is probably badly bugged (at
least untested) for years now.
XED Assembler/Debugger Interface
--------------------------------
Nocash Debuggers
The XED editor provides simple but very useful interaction with the various
nocash debuggers/emulators (no$gba, no$gmb, no$cpc, no$msx, no$c64, no$2k6,
no$zx, no$nes, no$sns, no$x51).
The editor can be launched from inside of the debugger (by Alt+E hotkey, by
retaining the recently edited line number when re-launching the editor).
And, when editing assembler source code files, F9-key can used to launch the
assembler from inside of XED. That is, the file is saved to disk, the A22i
assembler is started (built-in in all debuggers), and, in case of successful
assembly, the program is loaded & started in the emulator. Otherwise, the
assembler displays a list of errors, and the editor is moved directly to the
source code line number in which the first error has occured.
16bit DOS debuggers
The XED editor is included built-in in all nocash windows debuggers, and in the
no$gba 32bit DOS version only.
For use with other nocash 16bit DOS debuggers the XED editor must be downloaded
separately at http://problemkaputt.de/xed.htm, and must be installed in a
directory which is included in your PATH statement.
XED Commandline based standalone version
----------------------------------------
Standalone 16bit DOS version
This version is written in turbo pascal, nevertheless fast enough to work on
computer with less than 10MHz. It uses 16bit 8086 code, and works with all
80x86 compatible CPUs, including very old XTs.
The downside is that it is restricted to Conventional DOS Memory, so that the
maximum filesize is 640K (actually less, because the program and operating
system need to use some of that memory).
Using the 32bit debugger-built-in version as 32bit standalone editor
I haven't yet compiled a 32bit standalone version, however, any of the no$xxx
32bit debuggers can be used for that purpose. By commandline input:
no$xxx /x <filename> Edit text file in standalone mode
no$xxx /b <filename> Edit binary file in standalone hexedit mode
Standalone Commandline Syntax
Syntax: XED <filename> [/l:<line number>] | /?
<name> Filename, optionally d:\path\name.ext
/? Displays commandline help
/l:<nnn> Moves to line number nnn after loading
The filename does not require to include an extension, the program
automatically loads the first existing file with any of following extensions
appended: XED, ASM, ASC, INC, BAT, TXT, HTM, DOC, A22, PAS.
Standalone DOS Return Value
XED returns a three-byte return value after closing the program. This data is
used when calling XED as external editor from inside of nocash DOS debuggers,
but it might be also useful for other purposes.
Because normal DOS return values are limited to 8bits only, the three bytes are
written into video RAM at rightmost three character locations in first line:
VSEG:77*2 Exit code (00h=Exit normal, F9h=Exit by F9-key)
VSEG:78*2 Line number (Lower 8bits, 1..65536 in total)
VSEG:79*2 Line number (Upper 8bits)
The color attribute for these characters is set to zero (invisible, black on
black). Use INT 10h/AH=0Fh to determine the current video mode (AL AND 7Fh), if
it is monochrome (07h) then use VSEG=B000h, otherwise VSEG=B800h.
No$nes Emulation Files
----------------------
SLOT Folder
Default location for Game ROM-Images is "SLOT" folder (in same directory as
"no$nes.exe").
ZIPped ROM-Images can be loaded if PKUNZIP.EXE is installed (ie. it must be
somewhere in your "PATH") (if you don't know what that means, put it into a
folder like C:\WINDOWS\COMMAND or so).
BIOS Folder
The "BIOS" folder (in same directory as "no$nes.exe") should contain following
files:
DISKSYS.ROM 8Kbytes Famicom Disk System (FDS) BIOS
PC10BIOS.ROM 16Kbytes Playchoice 10 (PC10) BIOS (IC "8T")
PC10CHAR.ROM 24Kbytes Playchoice 10 (PC10) Charset (ICs "8P+8M+8K")
Playchoice 10 Games
PC10 games require the BIOS files (see above), and completely dumped ROMs. As
of 2012, most or all existing PC10 dumps are incomplete: They contain only the
NES PRG/CHR-ROMs, and the Z80 INST-ROM, but do miss the Z80 PROM (which is
absolutely required to use/decrypt the INST-ROMs). A tool for adding the
missing PROM data to existing ROM-images can be found here:
http://problemkaputt.de/pc10make.zip
Tech Data
---------
Overall Specs
CPU 2A03 - customized 6502 CPU - audio - does not contain support for decimal
The NTSC NES runs at 1.7897725MHz, and 1.662607MHz for PAL.
NMIs may be generated by PPU each VBlank.
IRQs may be generated by APU and by external hardware.
Internal Memory: 2K WRAM, 2K VRAM, 256 Bytes SPR-RAM, and Palette/Registers
The cartridge connector also passes audio in and out of the cartridge, to allow
for external sound chips to be mixed in with the Famicom audio.
Original Famicom (Family Computer) (1983) (Japan)
60-pin cartridge slot, with external sound-input, without lockout chip.
Two joypads directly attached to console, Joypad 1 with Start/Select buttons,
Joypad 2 with microphone, but without Start/Select. 15pin Expansion port for
further controllers. Video RF-Output only.
"During its first year, people found the Famicom to be unreliable, with
programming errors and freezing rampant. Yamauchi recalled all sold Famicom
systems, and put the Famicom out of production until the errors were fixed. The
Famicom was re-released with a new motherboard."
Original NES (Nintendo Entertainment System) (1985) (US, Europe, Australia)
Same as Famicom, but with slightly different pin-outs on cartridge slot, and
controllers/expansion ports: Front-loading 72-pin cartridge slot, without
external sound-input on cartridge slot, without microphone on joypads, with
lockout chip.
Newer Famicom, AV Famicom (1993-1995)
60-pin cartridge slot, with external sound-input, without lockout chip.
Includes NES-style joystick connectors, plus the original 15pin Famicom
Expansion port. Doesn't have microphone. Video AV-Output only.
Newer NES (1993-1995)
Top-loading 72-pin cartridge slot, without external sound-input, without
lockout chip. Poorer video signal than old NES. Video WHAT?-output only.
VS Unisystem
Arcade Machine. Coin-detect inputs, eight Dip-switches, different palette.
Play Choice 10
Arcade Machine with 10 cartridge slots. Uses Z80 as second CPU.
Memory Maps
-----------
Internal Memory: 2K WRAM, 2K VRAM, 256 Bytes SPR-RAM, and Palette/Registers
CPU Memory Map (16bit buswidth, 0-FFFFh)
0000h-07FFh Internal 2K Work RAM (mirrored to 800h-1FFFh)
2000h-2007h Internal PPU Registers (mirrored to 2008h-3FFFh)
4000h-4017h Internal APU Registers
4018h-5FFFh Cartridge Expansion Area almost 8K
6000h-7FFFh Cartridge SRAM Area 8K
8000h-FFFFh Cartridge PRG-ROM Area 32K
CPU Reset vector located at [FFFC], even smaller carts must have memory at that
location. Larger carts may use whatever external mappers to access more than
the usual 32K.
PPU Memory Map (14bit buswidth, 0-3FFFh)
0000h-0FFFh Pattern Table 0 (4K) (256 Tiles)
1000h-1FFFh Pattern Table 1 (4K) (256 Tiles)
2000h-23FFh Name Table 0 and Attribute Table 0 (1K) (32x30 BG Map)
2400h-27FFh Name Table 1 and Attribute Table 1 (1K) (32x30 BG Map)
2800h-2BFFh Name Table 2 and Attribute Table 2 (1K) (32x30 BG Map)
2C00h-2FFFh Name Table 3 and Attribute Table 3 (1K) (32x30 BG Map)
3000h-3EFFh Mirror of 2000h-2EFFh
3F00h-3F1Fh Background and Sprite Palettes (25 entries used)
3F20h-3FFFh Mirrors of 3F00h-3F1Fh
Note: The NES contains only 2K built-in VRAM, which can be used for whatever
purpose (for example, as two Name Tables, or as one Name Table plus 64 Tiles).
Palette Memory is built-in as well. Any additional VRAM (or, more regulary,
VROM) is located in the cartridge, which may also contain mapping hardware to
access more than 12K of video memory.
SPR-RAM Memory Map (8bit buswidth, 0-FFh)
00-FF Sprite Attributes (256 bytes, for 64 sprites / 4 bytes each)
Sprite RAM is directly built-in in the PPU chip. SPR-RAM is not connected to
CPU or PPU bus, and can be accessed via I/O Ports only.
I/O Map
-------
I/O Map
2000h - PPU Control Register 1 (W)
2001h - PPU Control Register 2 (W)
2002h - PPU Status Register (R)
2003h - SPR-RAM Address Register (W)
2004h - SPR-RAM Data Register (RW)
2005h - PPU Background Scrolling Offset (W2)
2006h - VRAM Address Register (W2)
2007h - VRAM Read/Write Data Register (RW)
4000h - APU Channel 1 (Rectangle) Volume/Decay (W)
4001h - APU Channel 1 (Rectangle) Sweep (W)
4002h - APU Channel 1 (Rectangle) Frequency (W)
4003h - APU Channel 1 (Rectangle) Length (W)
4004h - APU Channel 2 (Rectangle) Volume/Decay (W)
4005h - APU Channel 2 (Rectangle) Sweep (W)
4006h - APU Channel 2 (Rectangle) Frequency (W)
4007h - APU Channel 2 (Rectangle) Length (W)
4008h - APU Channel 3 (Triangle) Linear Counter (W)
4009h - APU Channel 3 (Triangle) N/A (-)
400Ah - APU Channel 3 (Triangle) Frequency (W)
400Bh - APU Channel 3 (Triangle) Length (W)
400Ch - APU Channel 4 (Noise) Volume/Decay (W)
400Dh - APU Channel 4 (Noise) N/A (-)
400Eh - APU Channel 4 (Noise) Frequency (W)
400Fh - APU Channel 4 (Noise) Length (W)
4010h - APU Channel 5 (DMC) Play mode and DMA frequency (W)
4011h - APU Channel 5 (DMC) Delta counter load register (W)
4012h - APU Channel 5 (DMC) Address load register (W)
4013h - APU Channel 5 (DMC) Length register (W)
4014h - SPR-RAM DMA Register (W)
4015h - DMC/IRQ/length counter status/channel enable register (RW)
4016h - Joypad #1 (RW)
4017h - Joypad #2/APU SOFTCLK (RW)
Additionally, external hardware may contain further ports:
4020h - VS Unisystem Coin Acknowledge
4020h-40FFh - Famicom Disk System (FDS)
4100h-FFFFh - Various addresses used by various cartridge mappers
Picture Processing Unit (PPU)
-----------------------------
--> PPU Reset
--> PPU Control and Status Registers
--> PPU SPR-RAM Access Registers
--> PPU VRAM Access Registers
--> PPU Scrolling
--> PPU Tile Memory
--> PPU Background
--> PPU Sprites
--> PPU Palettes
--> PPU Dimensions & Timings
Based on "Nintendo Entertainment System Documentation" Version 2.00 by Jeremy
Chadwick aka Y0SHi aka JDC. Which was itself based on "Nintendo Entertainment
System Architecture" by Marat Fayzullin.
--> 3D Glasses
PPU Reset
---------
Registers
Some registers are reset to zero upon reset; namely NMIs are disabled. Other
registers are kept unchanged (or contain semi-stable initial values on
Power-Up).
Locked Registers
During first frame after Reset, Ports 2000h, 2001h, 2005h, and 2006h are
reportedly write-protected. And, Port 2007h is read-protected (always returns
00h, even if all VRAM at 0000h..3FFFh is FFh-filled, and even if the 2007h
prefetch latch was pre-loaded with a nonzero value before reset; the origin of
the 00h is unknown, it might be an open-bus value).
The read/write protection is released when:
NTSC: At END of First Vblank (261 scanlines after reset)
PAL: At END of First Vblank (311 scanlines after reset)
PPU Control and Status Registers
--------------------------------
2000h - PPU Control Register 1 (W)
Bit7 Execute NMI on VBlank (0=Disabled, 1=Enabled)
Bit6 PPU Master/Slave Selection (0=Master, 1=Slave) (Not used in NES)
Bit5 Sprite Size (0=8x8, 1=8x16)
Bit4 Pattern Table Address Background (0=VRAM 0000h, 1=VRAM 1000h)
Bit3 Pattern Table Address 8x8 Sprites (0=VRAM 0000h, 1=VRAM 1000h)
Bit2 Port 2007h VRAM Address Increment (0=Increment by 1, 1=Increment by 32)
Bit1-0 Name Table Scroll Address (0-3=VRAM 2000h,2400h,2800h,2C00h)
(That is, Bit0=Horizontal Scroll by 256, Bit1=Vertical Scroll by 240)
2001h - PPU Control Register 2 (W)
Bit7-5 Color Emphasis (0=Normal, 1-7=Emphasis) (see Palettes chapter)
Bit4 Sprite Visibility (0=Not displayed, 1=Displayed)
Bit3 Background Visibility (0=Not displayed, 1=Displayed)
Bit2 Sprite Clipping (0=Hide in left 8-pixel column, 1=No clipping)
Bit1 Background Clipping (0=Hide in left 8-pixel column, 1=No clipping)
Bit0 Monochrome Mode (0=Color, 1=Monochrome) (see Palettes chapter)
If both sprites and BG are disabled (Bit 3,4=0) then video output is disabled,
and VRAM can be accessed at any time (instead of during VBlank only). However,
SPR-RAM does no longer receive refresh cycles, and its content will gradually
degrade when the display is disabled.
2002h - PPU Status Register (R)
Bit7 VBlank Flag (1=VBlank)
Bit6 Sprite 0 Hit (1=Background-to-Sprite0 collision)
Bit5 Lost Sprites (1=More than 8 sprites in 1 scanline)
Bit4-0 Not used (Undefined garbage)
Reading resets the 1st/2nd-write flipflop (used by Port 2005h and 2006h).
Reading resets Bit7, can be used to acknowledge NMIs, Bit7 is also
automatically reset at the end of VBlank, so manual acknowledge is normally not
required (unless one wants to free the NMI signal for external NMI inputs) (and
unless one wants to disable/reenable NMIs during NMI handling, in that case
Bit7 MUST be acknowledge before reenabling NMIs, else NMI would be executed
another time).
Status Notes
VBlank flag is set in each frame, even if the display is fully disabled, and
even if NMIs are disabled. Hit flag may become set only if both BG and OBJ are
enabled. Lost Sprites flag may become set only if video is enabled (ie. BG or
OBJ must be on). For info about the "Not used" status bits, and some other PPU
bits see:
--> Unpredictable Things
VS System
Some VS System PPUs have Port 2000h/2001h swapped, and do have a Chip ID in
LSBs of 2002h. For details, see
--> VS System
PPU SPR-RAM Access Registers
----------------------------
2003h - SPR-RAM Address Register (W)
D7-D0: 8bit address in SPR-RAM (00h-FFh)
Specifies the destination address in Sprite RAM for use with Port 2004h (Single
byte write), and Port 4014h (256 bytes DMA transfer).
This register is internally used during rendering (and typically contains 00h
at the begin of the VBlank period).
2004h - SPR-RAM Data Register (Read/Write)
D7-D0: 8bit data written to SPR-RAM.
Read/write data to/from selected address in Sprite RAM.
The Port 2003h address is auto-incremented by 1 after each <write> to 2004h.
The address is NOT auto-incremented after <reading> from 2004h.
Caution: Single byte access via 2004h is somewhat working, but DMA via 4014h is
more robust.
4014h - Sprite DMA Register (W)
Transfers 256 bytes from CPU Memory area into SPR-RAM. The transfer takes 512
CPU clock cycles, two cycles per byte, the transfer starts about immediately
after writing to 4014h: The CPU either fetches the first byte of the next
instruction, and then begins DMA, or fetches and executes the next instruction,
and then begins DMA. The CPU is halted during transfer.
Bit7-0 Upper 8bit of source address (Source=N*100h) (Lower bits are zero)
Data is written to Port 2004h. The destination address in SPR-RAM is thus
[2003h], which should be normally initialized to zero - unless one wants to
"rotate" the target area, which may be useful when implementing more than eight
(flickering) sprites per scanline.
Notes
SPR-RAM should be accessed during VBlank only, preferably by issuing Sprite DMA
at begin of Vblank.
SPR-RAM is dynamic memory, refreshed during rendering, it does no longer
receive refresh cycles (and will lose its content quickly within about a frame)
when the display is disabled (by clearing both Bit3+Bit4 in Port 2001h).
PAL issues another refresh somewhere mid-vblank even when display disabled?
NTSC doesn't do so and tends to forget data more easily - using DMA to rewrite
sprite memory on vblank is somewhat forcefully fixing that issue.
Port 2003h/2004h are internally used during rendering. The unlicensed game
Micro Machines is reading 2004h to determine the currently rendered line,
however, that doesn't work with all PPU revisions and PPU clones.
PPU VRAM Access Registers
-------------------------
Registers used to Read and Write VRAM data, and for Background Scrolling.
The CPU can Read/Write VRAM during VBlank only - because the PPU permanently
accesses VRAM during rendering (even in HBlank phases), and because the PPU
uses the VRAM Address register as scratch pointer. Respectively, the address in
Port 2006h is destroyed after rendering, and must be re-initialized before
using Port 2007h.
1st/2nd Write
Below Port 2005h and 2006h require two 8bit writes to receive a 16bit
parameter, the current state (1st or 2nd write) is memorized in a single
flipflop, which is shared for BOTH Port 2005h and 2006h. The flipflop is reset
when reading from PPU Status Register Port 2002h (the next write will be then
treated as 1st write) (and of course it is also reset after any 2nd write).
2005h - PPU Background Scrolling Offset (W2)
Defines the coordinates of the upper-left background pixel, together with PPU
Control Register 1, Port 2000h, Bits 0-1).
Port 2005h-1st write: Horizontal Scroll Origin (X*1) (0-255)
Port 2005h-2nd write: Vertical Scroll Origin (Y*1) (0-239)
Port 2000h-Bit0: Horizontal Name Table Origin (X*256)
Port 2000h-Bit1: Vertical Name Table Origin (Y*240)
Caution: The above scroll reload settings are overwritten by writes to Port
2006h. See PPU Scrolling chapter for more info.
2006h - VRAM Address Register (W2)
Used to specify the 14bit VRAM Address for use with Port 2007h.
Port 2006h-1st write: VRAM Address Pointer MSB (6bit)
Port 2006h-2nd write: VRAM Address Pointer LSB (8bit)
Caution: Writes to Port 2006h are overwriting scroll reload bits (in Port 2005h
and Bit0-1 of Port 2000h). And, the PPU uses the Port 2006h register internally
during rendering, when the display is enabled one should thus reinitialize Port
2006h at begin of VBlank before accessing VRAM via Port 2007h.
2007h - VRAM Read/Write Data Register (RW)
The PPU will auto-increment the VRAM address (selected via Port 2006h) after
each read/write from/to Port 2007h by 1 or 32 (depending on Bit2 of $2000).
Bit7-0 8bit data read/written from/to VRAM
Caution: Reading from VRAM 0000h-3EFFh loads the desired value into a latch,
and returns the OLD content of the latch to the CPU. After changing the address
one should thus always issue a dummy read to flush the old content. However,
reading from Palette memory VRAM 3F00h-3FFFh, or writing to VRAM 0000-3FFFh
does directly access the desired address.
Note: Some (maybe all) RGB PPUs (as used in Famicom Titler) do not allow to
read palette memory (instead, they appear to mirror 3Fxxh to 2Fxxh).
Caution
The APU (if DMC sound is used) can conflict with joypad reads! For details,
see:
--> APU DMC-DMA Glitch
PPU Scrolling
-------------
The PPU allows to scroll the background pixelwise horizontally and vertically.
The total scroll-able area is 512x480 pixels (though the full size can be
usedwith external memory only, see Name Tables chapter), of which circa 256x240
pixels are displayed (see visible screen resolution).
Vertical offsets 240-255 (aka Tile Rows 30-31) will cause garbage Tile numbers
to be fetched from the Attribute Table (instead of from Name Table), after line
255 it will wrap to line 0, but without producing a carry-out to the Name Table
Address.
Scroll Pointer and Reload Registers
Scrolling relies on a Pointer register (Port 2006h), and on a Reload register
(Port 2005h, and Bit0-1 of Port 2000h). The Pointer is automatically
incremented by the hardware during rendering, and points to the currently drawn
tile row, the same pointer register is also used by software to access VRAM
during VBlank or when the display is disabled. The Reload value defines the
horizontal and vertical origin of upper-left pixel, the reload value is
automatically loaded into the Pointer at the end of the vblank period (vertical
reload bits), and at the begin of each scanline (horizontal reload bits). The
relation between Pointer and Reload bits is:
VRAM-Pointer Scroll-Reload
A8 2006h/1st-Bit0 <--> Y*64 2005h/2nd-Bit6
A9 2006h/1st-Bit1 <--> Y*128 2005h/2nd-Bit7
A10 2006h/1st-Bit2 <--> X*256 2000h-Bit0
A11 2006h/1st-Bit3 <--> Y*240 2000h-Bit1
A12 2006h/1st-Bit4 <--> Y*1 2005h/2nd-Bit0
A13 2006h/1st-Bit5 <--> Y*2 2005h/2nd-Bit1
- 2006h/1st-Bit6 <--> Y*4 2005h/2nd-Bit2
- 2006h/1st-Bit7 <--> - -
A0 2006h/2nd-Bit0 <--> X*8 2005h/1st-Bit3
A1 2006h/2nd-Bit1 <--> X*16 2005h/1st-Bit4
A2 2006h/2nd-Bit2 <--> X*32 2005h/1st-Bit5
A3 2006h/2nd-Bit3 <--> X*64 2005h/1st-Bit6
A4 2006h/2nd-Bit4 <--> X*128 2005h/1st-Bit7
A5 2006h/2nd-Bit5 <--> Y*8 2005h/2nd-Bit3
A6 2006h/2nd-Bit6 <--> Y*16 2005h/2nd-Bit4
A7 2006h/2nd-Bit7 <--> Y*32 2005h/2nd-Bit5
- - <--> X*1 2005h/1st-Bit0
- - <--> X*2 2005h/1st-Bit1
- - <--> X*4 2005h/1st-Bit2
Port 2006h-1st Write (VRAM Pointer MSB)
As one might (not) have expected, this does NOT change the VRAM Pointer,
instead, the written value is stored in the corresponding Reload bits (Port
2005h/2000h settings), the VRAM pointer is left unchanged for now.
Port 2006h-2nd Write (VRAM Pointer LSB)
The written value is stored in the VRAM Pointer LSB Bits (and maybe also in the
corresponding Reload bits ?). And, the VRAM Pointer MSB is now loaded from the
corresponding Reload bits (ie. the value from the previous Port 2006h-1st Write
is applied now).
Port 2005h-1st Write (Horizontal Scroll Origin, X*1, 0-255)
Port 2005h-2nd Write (Vertical Scroll Origin, Y*1, 0-239)
Port 2000h-Bit0 (Horizontal Name Table Origin, X*256)
Port 2000h-Bit1 (Vertical Name Table Origin, Y*240)
Writing to these registers changes the Reload value bits only, the VRAM Pointer
is left unchanged (except for indirect changes at times when the Reload value
is loaded into the Pointer during rendering).
Full-screen and Mid-frame Scrolling
Simple full-screen scrolling can be implemented by initializing the Reload
value via Ports 2005h and 2000h. Many games change the scroll settings
mid-frame to split the screen into a scrolled and non-scrolled area: The
Horizontal bits can be changed by re-writing the Reload value via Ports 2005h
and 2000h, the vertical bits by re-writing the Pointer value via Port 2006h.
Changing both horizontal and vertical bits is possible by mixed writes to Port
2005h and 2006h, for example:
[2006h.1st]=(X/256)*4 + (Y/240)*8
[2005h.2nd]=((Y MOD 240) AND C7h)
[2005h.1st]=(X AND 07h)
[2006h.2nd]=(X AND F8h)/8 + ((Y MOD 240) AND 38h)*4
Notes: In that example, most bits are updated twice, once via 2006h and once
via 2005h, above shows only the relevant bits, the other bits would be don't
care (eg. writing unmasked values to 2005h would be faster, and wouldn't change
the functionality). The 1st/2nd-write-flipflop is toggled on each of the four
writes, so that above does <first> change 2005h-2nd-write, and <then>
2005h-1st-write.
Pointer Increment/Reload during Rendering
During rendering, A4-A0 is incremented per tile, with carry-out to A10, at end
of HBlank A4-A0 and A10 are reset to the Reload value. "A14-A12" are used as
LSBs of Tile Data address, these bits are incremented per scanline, with
carry-out to tile row A9-A5, the tile row wraps from 29 to 0 with carry-out to
A11.
Note: Initializing the tile row to 30 or 31 will display garbage tiles (fetched
from Attribute table area), in that case the row wraps from 31 to 0, but
without carry-out to A11.
PPU Tile Memory
---------------
PPU 0000h-0FFFh - Pattern Table 0 (4K) (256 Tiles)
PPU 1000h-1FFFh - Pattern Table 1 (4K) (256 Tiles)
Pattern Table Format
Each pattern table contains 256 tiles. When using both pattern table 0 and 1,
up to 512 tiles can be used for Background and Sprites.
Each tile consists of a 8x8 pixel bitmap with 2bit depth (4 colors). Each tile
occopies 16 bytes, the first 8 bytes contain color bit 0 for each pixel, the
next 8 bytes color bit 1. Each byte defines a row of 8 pixels (MSB left).
Pattern Table Memory
The console does NOT include built-in Pattern Table Memory. Instead, Pattern
tables are located in the cartridge, usually in a separate ROM chip, or (less
often) in a SRAM chip. Cartridges with more than 8K Pattern memory may contain
whatever mapping mechanisms to map the memory into the PPU 8K Pattern Memory
area.
There are some special mappers that do automatically change the CHR banks
during rendering (allowing to access more than 8K in one frame):
--> Mapper 5: MMC5 - BANKING, IRQ, SOUND, VIDEO, MULTIPLY, etc.
--> Mapper 9: MMC2 - PRG/24K/8K, VROM/4K, NT, LATCH
--> Mapper 10: MMC4 - PRG/16K, VROM/4K, NT, LATCH
--> Mapper 96: 74161/32 - PRG/32K, CHR/16K/4K, LATCH
Cartridges with CHR-RAM (instead CHR-ROM) usually have 8K RAM, but there also a
few with 16K, 32K or 64K RAM:
--> Mapper 13: CPROM - 16K VRAM
--> Mapper 96: 74161/32 - PRG/32K, CHR/16K/4K, LATCH
--> Mapper 168: RacerMate PRG/16K, VRAM/4K, IRQ
PPU Background
--------------
PPU 2000h-23FFh - Name Table 0 and Attribute Table 0 (1K)
PPU 2400h-27FFh - Name Table 1 and Attribute Table 1 (1K)
PPU 2800h-2BFFh - Name Table 2 and Attribute Table 2 (1K)
PPU 2C00h-2FFFh - Name Table 3 and Attribute Table 3 (1K)
PPU 3000h-3EFFh - Mirror of 2000h-2EFFh
Name Table Format
Each Name Table occupies 3C0h bytes, containing 8bit tile numbers for 32x30
tiles (256x240 pixels). The tiles are fetched from Pattern Table 0 or 1
(depending on Bit 4 in PPU Control Register 1). Note that NTSC displays may be
unable to display the whole 256x240 pixels, basically the relevant portion of
screen output should be in the <middle> 32x28 tiles (256x224 pixels) see PPU
Dimensions and Timings chapter for more info.
Attribute Table Format
Each Name Table is directly followed by an Attribute Table of 40h bytes,
containing 2bit background palette numbers for each 16x16 pixel field. Each
byte in the Attribute table defines palette numbers for a 32x32 pixel area:
Bit0-1 Palette Number for upperleft 16x16 pixels of the 32x32 area
Bit2-3 Palette Number for upperright 16x16 pixels of the 32x32 area
Bit4-5 Palette Number for lowerleft 16x16 pixels of the 32x32 area
Bit6-7 Palette Number for lowerright 16x16 pixels of the 32x32 area
Note: Attributes for each 8x1 pixel row are fetched from cartridge bus. The
MMC5 Mapper with EXRAM allows to use different palettes for each 8x8 pixel
tile, instead of sharing one palette for above 16x16 areas.
Background Scrolling
Scrolling origin is defined by the Name Table selection in Bit0-1 of $2000, and
by offsets in $2005, of which Horizontal offsets may range in 0-255, vertical
offsets in 0-239; values above 239 are considered negative (eg. 248 is -8). The
picture wraps to the next Name Table when drawing exceeds the boundaries of the
current Name Table...
Multiple Name Tables
The NES has the capability of addressing up to four Name Tables (NT0-3),
allowing to define backgrounds of up to 512x480 pixels, arranged as such:
Square Horizontal Scroll Vertical Scroll
NT0 NT1 NT0 left/right NT1 NT0 above/below NT2
NT2 NT3 NT2 left/right NT3 NT1 above/below NT3
However, the NES includes only 2K VRAM, so that not more than two Name Tables
can be used (unless the cartridge includes external Name Table memory).
Name Table Mapping/Mirroring
The NES outputs the desired Name Table number (NT0-3) to the cartridge, which
may then respond by selecting one of the two internal 1K RAM blocks (BLK0-1),
or by presenting an external RAM/ROM block (eg. BLK2-3). Examples:
_Name Table____________NT0___NT1___NT2___NT3___Purpose______________
Horizontal Mirroring BLK0 BLK0 BLK1 BLK1 Vertical Scrolling
Vertical Mirroring BLK0 BLK1 BLK0 BLK1 Horizontal Scrolling
Four-screen BLK0 BLK1 BLK2 BLK3 Four-Way Scrolling
When using only the internal blocks, the cartridge may use a simple hardwired
connection between two pins to select horizontal or vertical mirroring. Also,
the cartridge may contain whatever circuits to map Single-Screen or CHR-ROM to
whatever addresses dependently or independently of the selected NT number.
Background Clipping
The PPU allows to mask the left 8 pixels of BG, allowing to use horizontal