645 lines
29 KiB
HTML
645 lines
29 KiB
HTML
|
|
<!DOCTYPE html>
|
|
|
|
<html class="no-js" lang="en">
|
|
<head>
|
|
<meta charset="utf-8"/>
|
|
<meta content="width=device-width,initial-scale=1" name="viewport"/>
|
|
<link href="https://psx-spx.consoledev.net/unpredictablethings/" rel="canonical"/>
|
|
<link href="../assets/images/favicon.png" rel="icon"/>
|
|
<meta content="mkdocs-1.1.2, mkdocs-material-7.1.3" name="generator"/>
|
|
<title>Unpredictable Things - PlayStation Specifications - psx-spx</title>
|
|
<link href="../assets/stylesheets/main.e35208c4.min.css" rel="stylesheet"/>
|
|
<link href="../assets/stylesheets/palette.ef6f36e2.min.css" rel="stylesheet"/>
|
|
<link crossorigin="" href="https://fonts.gstatic.com" rel="preconnect"/>
|
|
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700%7CRoboto+Mono&display=fallback" rel="stylesheet"/>
|
|
<style>:root{--md-text-font-family:"Roboto";--md-code-font-family:"Roboto Mono"}</style>
|
|
<link href="../css/extra.css" rel="stylesheet"/>
|
|
</head>
|
|
<body data-md-color-accent="indigo" data-md-color-primary="indigo" data-md-color-scheme="default" dir="ltr">
|
|
<script>function __prefix(e){return new URL("..",location).pathname+"."+e}function __get(e,t=localStorage){return JSON.parse(t.getItem(__prefix(e)))}</script>
|
|
<script>var palette=__get("__palette");if(null!==palette&&"object"==typeof palette.color)for(var key in palette.color)document.body.setAttribute("data-md-color-"+key,palette.color[key])</script>
|
|
<input autocomplete="off" class="md-toggle" data-md-toggle="drawer" id="__drawer" type="checkbox"/>
|
|
<input autocomplete="off" class="md-toggle" data-md-toggle="search" id="__search" type="checkbox"/>
|
|
<label class="md-overlay" for="__drawer"></label>
|
|
<div data-md-component="skip">
|
|
<a class="md-skip" href="#unpredictable-things">
|
|
Skip to content
|
|
</a>
|
|
</div>
|
|
<div data-md-component="announce">
|
|
</div>
|
|
<header class="md-header" data-md-component="header">
|
|
<nav aria-label="Header" class="md-header__inner md-grid">
|
|
<a aria-label="PlayStation Specifications - psx-spx" class="md-header__button md-logo" data-md-component="logo" href=".." title="PlayStation Specifications - psx-spx">
|
|
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54z"></path></svg>
|
|
</a>
|
|
<label class="md-header__button md-icon" for="__drawer">
|
|
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"></path></svg>
|
|
</label>
|
|
<div class="md-header__title" data-md-component="header-title">
|
|
<div class="md-header__ellipsis">
|
|
<div class="md-header__topic">
|
|
<span class="md-ellipsis">
|
|
PlayStation Specifications - psx-spx
|
|
</span>
|
|
</div>
|
|
<div class="md-header__topic" data-md-component="header-topic">
|
|
<span class="md-ellipsis">
|
|
|
|
Unpredictable Things
|
|
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<form class="md-header__option" data-md-component="palette">
|
|
<input class="md-option" data-md-color-accent="indigo" data-md-color-media="(prefers-color-scheme: light)" data-md-color-primary="indigo" data-md-color-scheme="default" id="__palette_1" name="__palette" type="radio"/>
|
|
<label class="md-header__button md-icon" for="__palette_2" hidden="" title="Switch to dark mode">
|
|
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M7 10a2 2 0 0 1 2 2 2 2 0 0 1-2 2 2 2 0 0 1-2-2 2 2 0 0 1 2-2m10-3a5 5 0 0 1 5 5 5 5 0 0 1-5 5H7a5 5 0 0 1-5-5 5 5 0 0 1 5-5h10M7 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3h10a3 3 0 0 0 3-3 3 3 0 0 0-3-3H7z"></path></svg>
|
|
</label>
|
|
<input class="md-option" data-md-color-accent="blue" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-primary="blue" data-md-color-scheme="slate" id="__palette_2" name="__palette" type="radio"/>
|
|
<label class="md-header__button md-icon" for="__palette_1" hidden="" title="Switch to light mode">
|
|
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3z"></path></svg>
|
|
</label>
|
|
</form>
|
|
<label class="md-header__button md-icon" for="__search">
|
|
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"></path></svg>
|
|
</label>
|
|
<div class="md-search" data-md-component="search" role="dialog">
|
|
<label class="md-search__overlay" for="__search"></label>
|
|
<div class="md-search__inner" role="search">
|
|
<form class="md-search__form" name="search">
|
|
<input aria-label="Search" autocapitalize="off" autocomplete="off" autocorrect="off" class="md-search__input" data-md-component="search-query" data-md-state="active" name="query" placeholder="Search" required="" spellcheck="false" type="text"/>
|
|
<label class="md-search__icon md-icon" for="__search">
|
|
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"></path></svg>
|
|
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"></path></svg>
|
|
</label>
|
|
<button aria-label="Clear" class="md-search__icon md-icon" tabindex="-1" type="reset">
|
|
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"></path></svg>
|
|
</button>
|
|
</form>
|
|
<div class="md-search__output">
|
|
<div class="md-search__scrollwrap" data-md-scrollfix="">
|
|
<div class="md-search-result" data-md-component="search-result">
|
|
<div class="md-search-result__meta">
|
|
Initializing search
|
|
</div>
|
|
<ol class="md-search-result__list"></ol>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="md-header__source">
|
|
<a class="md-source" data-md-component="source" href="https://github.com/psx-spx/psx-spx.github.io/" title="Go to repository">
|
|
<div class="md-source__icon md-icon">
|
|
<svg viewbox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"></path></svg>
|
|
</div>
|
|
<div class="md-source__repository">
|
|
GitHub
|
|
</div>
|
|
</a>
|
|
</div>
|
|
</nav>
|
|
</header>
|
|
<div class="md-container" data-md-component="container">
|
|
<main class="md-main" data-md-component="main">
|
|
<div class="md-main__inner md-grid">
|
|
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation">
|
|
<div class="md-sidebar__scrollwrap">
|
|
<div class="md-sidebar__inner">
|
|
<nav aria-label="Navigation" class="md-nav md-nav--primary" data-md-level="0">
|
|
<label class="md-nav__title" for="__drawer">
|
|
<a aria-label="PlayStation Specifications - psx-spx" class="md-nav__button md-logo" data-md-component="logo" href=".." title="PlayStation Specifications - psx-spx">
|
|
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54z"></path></svg>
|
|
</a>
|
|
PlayStation Specifications - psx-spx
|
|
</label>
|
|
<div class="md-nav__source">
|
|
<a class="md-source" data-md-component="source" href="https://github.com/psx-spx/psx-spx.github.io/" title="Go to repository">
|
|
<div class="md-source__icon md-icon">
|
|
<svg viewbox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"></path></svg>
|
|
</div>
|
|
<div class="md-source__repository">
|
|
GitHub
|
|
</div>
|
|
</a>
|
|
</div>
|
|
<ul class="md-nav__list" data-md-scrollfix="">
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="..">
|
|
Home
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../memorymap/">
|
|
Memory Map
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../iomap/">
|
|
I/O Map
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../graphicsprocessingunitgpu/">
|
|
Graphics Processing Unit (GPU)
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../geometrytransformationenginegte/">
|
|
Geometry Transformation Engine (GTE)
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../macroblockdecodermdec/">
|
|
Macroblock Decoder (MDEC)
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../soundprocessingunitspu/">
|
|
Sound Processing Unit (SPU)
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../interrupts/">
|
|
Interrupts
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../dmachannels/">
|
|
DMA Channels
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../timers/">
|
|
Timers
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../cdromdrive/">
|
|
CDROM Drive
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../controllersandmemorycards/">
|
|
Controllers and Memory Cards
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../pocketstation/">
|
|
Pocketstation
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../serialportsio/">
|
|
Serial Port (SIO)
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../expansionportpio/">
|
|
Expansion Port (PIO)
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../memorycontrol/">
|
|
Memory Control
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item md-nav__item--active">
|
|
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" id="__toc" type="checkbox"/>
|
|
<label class="md-nav__link md-nav__link--active" for="__toc">
|
|
Unpredictable Things
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
<a class="md-nav__link md-nav__link--active" href="./">
|
|
Unpredictable Things
|
|
</a>
|
|
<nav aria-label="Table of contents" class="md-nav md-nav--secondary">
|
|
<label class="md-nav__title" for="__toc">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Table of contents
|
|
</label>
|
|
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix="">
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#io-write-datasize">
|
|
I/O Write Datasize
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#io-read-datasize">
|
|
I/O Read Datasize
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#cache-problems">
|
|
Cache Problems
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#writebuffer-problems">
|
|
Writebuffer Problems
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#cpu-loadstore-problems">
|
|
CPU Load/Store Problems
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#cpu-register-problems-r1-at-r26-k0-r29-sp">
|
|
CPU Register Problems - R1 (AT), R26 (K0), R29 (SP)
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#locked-locations-in-memory-and-io-area">
|
|
Locked Locations in Memory and I/O Area
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#mirrors-in-io-area">
|
|
Mirrors in I/O Area
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#garbage-locations-in-io-area">
|
|
Garbage Locations in I/O Area
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#psx-as-abbreviation-for-playstation-1">
|
|
PSX as Abbreviation for Playstation 1
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#psx-as-abbreviation-for-posix1">
|
|
PSX as Abbreviation for POSIX.1
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#psx-as-abbreviation-for-an-extended-playstation-2">
|
|
PSX as Abbreviation for an Extended Playstation 2
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../cpuspecifications/">
|
|
CPU Specifications
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../kernelbios/">
|
|
Kernel (BIOS)
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../arcadecabinets/">
|
|
Arcade Cabinets
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../cheatdevices/">
|
|
Cheat Devices
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../psxdevboardchipsets/">
|
|
PSX Dev-Board Chipsets
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../hardwarenumbers/">
|
|
Hardware Numbers
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../pinouts/">
|
|
Pinouts
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../aboutcredits/">
|
|
About & Credits
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../cdromvideocdsvcd/">
|
|
CDROM Video CDs (VCD)
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="../cdrominternalinfoonpsxcdromcontroller/">
|
|
CDROM Internal Info on PSX CDROM Controller
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc">
|
|
<div class="md-sidebar__scrollwrap">
|
|
<div class="md-sidebar__inner">
|
|
<nav aria-label="Table of contents" class="md-nav md-nav--secondary">
|
|
<label class="md-nav__title" for="__toc">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Table of contents
|
|
</label>
|
|
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix="">
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#io-write-datasize">
|
|
I/O Write Datasize
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#io-read-datasize">
|
|
I/O Read Datasize
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#cache-problems">
|
|
Cache Problems
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#writebuffer-problems">
|
|
Writebuffer Problems
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#cpu-loadstore-problems">
|
|
CPU Load/Store Problems
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#cpu-register-problems-r1-at-r26-k0-r29-sp">
|
|
CPU Register Problems - R1 (AT), R26 (K0), R29 (SP)
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#locked-locations-in-memory-and-io-area">
|
|
Locked Locations in Memory and I/O Area
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#mirrors-in-io-area">
|
|
Mirrors in I/O Area
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#garbage-locations-in-io-area">
|
|
Garbage Locations in I/O Area
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#psx-as-abbreviation-for-playstation-1">
|
|
PSX as Abbreviation for Playstation 1
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#psx-as-abbreviation-for-posix1">
|
|
PSX as Abbreviation for POSIX.1
|
|
</a>
|
|
</li>
|
|
<li class="md-nav__item">
|
|
<a class="md-nav__link" href="#psx-as-abbreviation-for-an-extended-playstation-2">
|
|
PSX as Abbreviation for an Extended Playstation 2
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="md-content" data-md-component="content">
|
|
<article class="md-content__inner md-typeset">
|
|
<a class="md-content__button md-icon" href="https://github.com/psx-spx/psx-spx.github.io/edit/master/docs/unpredictablethings.md" title="Edit this page">
|
|
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z"></path></svg>
|
|
</a>
|
|
<h1 id="unpredictable-things">Unpredictable Things</h1>
|
|
<p>Normally, I/O ports should be accessed only at their corresponding size (ie.
|
|
16bit read/write for 16bit ports), and of course, only existing memory and I/O
|
|
addresses should be used. When not recursing that rules, some more or less
|
|
(un-)predictable things may happen...<br/></p>
|
|
<h4 id="io-write-datasize">I/O Write Datasize</h4>
|
|
<pre><code> Address Content W.8bit W.16bit W.32bit
|
|
00000000h-00xFFFFFh Main RAM OK OK OK
|
|
1F800000h-1F8003FFh Scratchpad OK OK OK
|
|
1F801000h-1F801023h MEMCTRL (w32) (w32) OK
|
|
1F80104xh JOY_xxx (w16) OK CROP
|
|
1F80105xh SIO_xxx (w16) OK CROP
|
|
1F801060h-1F801063h RAM_SIZE (w32) (w32) OK (with crash)
|
|
1F801070h-1F801077h IRQCTRL (w32) (w32) OK
|
|
1F8010x0h-1F8010x3h DMAx.ADDR (w32) (w32) OK
|
|
1F8010x4h-1F8010x7h DMAx.LEN OK OK OK
|
|
1F8010x8h-1F8010xFh DMAx.CTRL/MIRR (w32) (w32) OK
|
|
1F8010F0h-1F8010F7h DMA.DPCR/DICR (w32) (w32) OK
|
|
1F8010F8h-1F8010FFh DMA.unknown IGNORE IGNORE IGNORE
|
|
1F801100h-1F80110Bh Timer 0 (w32) (w32) OK
|
|
1F801110h-1F80110Bh Timer 1 (w32) (w32) OK
|
|
1F801120h-1F80110Bh Timer 2 (w32) (w32) OK
|
|
1F801800h-1F801803h CDROM OK ? ?
|
|
1F801810h-1F801813h GPU.GP0 ? ? OK
|
|
1F801814h-1F801817h GPU.GP1 ? ? OK
|
|
1F801820h-1F801823h MDEC.CMD/DTA ? ? OK
|
|
1F801824h-1F801827h MDEC.CTRL ? ? OK
|
|
1F801C00h-1F801E7Fh SPU (i16) OK OK
|
|
1F801E80h-1F801FFFh SPU.UNUSED IGNORE IGNORE IGNORE
|
|
1F802020h-1F80202Fh DUART OK ? ?
|
|
1F802041h POST OK ? ?
|
|
FFFE0130h-FFFE0133h CACHE.CTRL (i32) (i32) OK
|
|
</code></pre>
|
|
<p>Whereas,<br/></p>
|
|
<pre><code> OK works
|
|
(w32) write full 32bits (left-shifted if address isn't word-aligned)
|
|
(w16) write full 16bits (left-shifted if address isn't halfword-aligned)
|
|
(i32) write full 32bits (ignored if address isn't word-aligned)
|
|
(i16) write full 16bits (ignored if address isn't halfword-aligned)
|
|
CROP write only lower 16bit (and leave upper 16bit unchanged)
|
|
</code></pre>
|
|
<p>It's somewhat "legit" to use 16bit writes on 16bit registers like RAM_SIZE,
|
|
I_STAT, I_MASK, and Timer 0-2.<br/>
|
|
Non-4-byte aligned 8bit/16bit writes to RAM_SIZE do crash (probably because the
|
|
"(w32)" effect is left-shifting the value, so lower 8bit become zero).<br/>
|
|
Results on unaligned I/O port writes (via SWL/SWR opcodes) are unknown.<br/></p>
|
|
<h4 id="io-read-datasize">I/O Read Datasize</h4>
|
|
<p>In most cases, I/O ports can be read in 8bit, 16bit, or 32bit units, regardless
|
|
of their size, among others allowing to read two 16bit ports at once with a
|
|
single 32bit read. If there's only one 16bit port within a 32bit region, then
|
|
32bit reads often return garbage in the unused 16bits. Also, 8bit or 16bit VRAM
|
|
data reads via GPUREAD probably won't work? Expansion 2 Region can be accessed
|
|
only via 8bit reads, and 16bit/32bit reads seem to cause exceptions (or rather:
|
|
no such exception!) (except, probably 16bit reads are allowed when the region
|
|
is configured to 16bit databus width).<br/>
|
|
There are at least some special cases:<br/></p>
|
|
<pre><code> FFFE0130h-FFFE0133h 8bit (+16bit?) read works ONLY from word-aligned address
|
|
</code></pre>
|
|
<h4 id="cache-problems">Cache Problems</h4>
|
|
<p>The functionality of the Cache is still widely unknown. Not sure if DMA
|
|
transfers are updating or invalidating cache. Cached Data within KSEG0 should
|
|
be automatically also cached at the corresponding mirrored address in KUSEG and
|
|
vice versa. Mirrors within KSEG1 (or within KUSEG) may be a different thing,
|
|
eg. when using addresses spead across the first 8MB region to access the 2MB
|
|
RAM. Same problems may occor for Expansion and BIOS mirrors, although, not sure
|
|
if that regions are cached.<br/></p>
|
|
<h4 id="writebuffer-problems">Writebuffer Problems</h4>
|
|
<p>The writebuffer seems to be disabled for the normal I/O area at 1F801000h,
|
|
however, it appears to be enabled for the Expansion I/O region at 1F802000h
|
|
(after writing to 1F802041h, the BIOS issues 4 dummy writes to RAM, apparently
|
|
(?) in order to flush the writebuffer). The same might apply for Expansion
|
|
Memory region at 1F000000h, although usually that region would contain ROM, so
|
|
it'd be don't care whether it is write-buffered or not.<br/></p>
|
|
<h4 id="cpu-loadstore-problems">CPU Load/Store Problems</h4>
|
|
<p>XXcpuREG ---> applies ONLY to LOAD (not to store)<br/>
|
|
Memory read/write opcodes take a 1-cycle delay until the data arrives at the
|
|
destination, ie. the next opcode should not use the destination register (or
|
|
more unlikely, the destination memory location) as source operand. Usually,
|
|
when trying to do so, the second opcode would receive the OLD value - however,
|
|
if an exception occurs between the two opcodes, then the read/write operation
|
|
may finish, and the second opcode would probably receive the NEW value.<br/></p>
|
|
<h4 id="cpu-register-problems-r1-at-r26-k0-r29-sp">CPU Register Problems - R1 (AT), R26 (K0), R29 (SP)</h4>
|
|
<p>Exception handlers cannot preserve all registers, before returning, they must
|
|
load the return address into a general purpose register (conventionally R26 aka
|
|
K0), so be careful not to use that register, unless you are 100% sure that no
|
|
interrupts and no other exceptions can occur. Some exception handlers might
|
|
also destroy R27 aka K1 (though execption handler in the PSX Kernel leaves that
|
|
register unchanged).<br/>
|
|
Some assemblers (not a22i in nocash syntax mode) are internally using R1 aka AT
|
|
as scratch register for some pseudo opcodes, including for a "sw rx,imm32"
|
|
pseudo opcode (which is nearly impossible to separate from the normal "sw
|
|
rx,imm16" opcode), be careful not to use R1, unless you can trust your
|
|
assembler not to destroy that register behind your back.<br/>
|
|
The PSX Kernel uses "Full-Decrementing-Wasted-Stack", where "Wasted" means that
|
|
when calling a sub-function with N parameters, then the caller must
|
|
pre-allocate N works on stack, and the sub-function may freely use and destroy
|
|
these words; at [SP+0..N*4-1].<br/></p>
|
|
<h4 id="locked-locations-in-memory-and-io-area">Locked Locations in Memory and I/O Area</h4>
|
|
<pre><code> 00800000h ;-when Main RAM configured to end at 7FFFFFh
|
|
1F080000h 780000h ;-when Expansion 1 configured to end at 7FFFFh
|
|
1F800400h C00h ;-region after Scratchpad
|
|
1F801024h 1Ch ;\
|
|
1F801064h 0Ch ;
|
|
1F801078h 08h ;
|
|
1F801140h 6C0h ; gaps in I/O region
|
|
1F801804h 0Ch ;
|
|
1F801818h 08h ;
|
|
1F801828h 3D8h ;/
|
|
1F802080h 3FDF80h ;-when Expansion 2 configured to end at 7Fh
|
|
1FC80000h 60380000h ;-when BIOS ROM configured to end at 7FFFFh
|
|
C0000000h 1FFE0000h ;\
|
|
FFFE0020h E0h ; gaps in KSEG2 (cache control region)
|
|
FFFE0140h 1FEC0h ;/
|
|
</code></pre>
|
|
<p>Trying to access these locations generates an exception. For KSEG0 and KSEG1,
|
|
locked regions are same as for first 512MB of KUSEG.<br/></p>
|
|
<h4 id="mirrors-in-io-area">Mirrors in I/O Area</h4>
|
|
<pre><code> 1F80108Ch+N*10h - D#_CHCR Mirrors - (N=0..6, for DMA channel 0..6)
|
|
</code></pre>
|
|
<p>Read/writeable mirrors of DMA Control registers at 1F801088h+N*10h.<br/></p>
|
|
<h4 id="garbage-locations-in-io-area">Garbage Locations in I/O Area</h4>
|
|
<pre><code> 1F801062h (2 bytes) ;\
|
|
1F801072h (2 bytes) ; unused addresses in Memory and Interrupt Control area
|
|
1F801076h (2 bytes) ;/
|
|
1F801102h (2 bytes) ;\
|
|
1F801106h (2 bytes) ; unused addresses in Timer 0 area
|
|
1F80110Ah (6 bytes) ;/
|
|
1F801112h (2 bytes) ;\
|
|
1F801116h (2 bytes) ; unused addresses in Timer 1 area
|
|
1F80111Ah (6 bytes) ;/
|
|
1F801122h (2 bytes) ;\
|
|
1F801126h (2 bytes) ; unused addresses in Timer 2 area and next some bytes
|
|
1F80112Ah (22 bytes) ;/
|
|
1F801820h (4 bytes) ;-read MDEC Data-Out port (if there is no data)
|
|
FFFE0000h (32 bytes) ;\
|
|
FFFE0100h (48 bytes) ; unused addresses in Cache control area
|
|
FFFE0132h (2 bytes) ; (including write-only upper 16bit of Port FFFE0130h)
|
|
FFFE0134h (12 bytes) ;/
|
|
</code></pre>
|
|
<p>Unlike all other unused I/O addresses, these addresses are unlocked (ie. they
|
|
do not trigger exceptions on access), however they do not seem to contain
|
|
anything useful. The BIOS never seems to use them. Writing any values to them
|
|
seems to have no effect. And reading acts somewhat unstable:<br/>
|
|
Usually returns zeros in most cases. Except that, the first byte on a 10h-byte
|
|
boundary often returns the lower 8bit of the memory address (eg.
|
|
[FFFE0010h]=10h). And, when [FFFE0130h].Bit11=0, then reading from these
|
|
registers does return the 32bit opcode that is to be executed next (or at some
|
|
locations, the opcode thereafter).<br/></p>
|
|
<h4 id="psx-as-abbreviation-for-playstation-1">PSX as Abbreviation for Playstation 1</h4>
|
|
<p>In gaming and programming scene, "PSX" is most commonly used as abbreviation
|
|
for the original Playstation series (occasionally including PSone). Sony has
|
|
never officially used that abbreviation, however, the Playstation BIOS contains
|
|
the ASCII strings "PSX" and "PS-X" here and there. The letters "PS" are widely
|
|
believed to stand for PlayStation, and the meaning of the "X" is totally
|
|
unknown (although, actually it may stand for POSIX.1, see below).<br/></p>
|
|
<h4 id="psx-as-abbreviation-for-posix1">PSX as Abbreviation for POSIX.1</h4>
|
|
<p>According to JMI Software Systems, "PSX" is a trademark of themselves, and
|
|
stands for "single-user, single-group, subset of POSIX.1" (POSIX stands for
|
|
something commonly used by HLL programmers under UNIX or so). That "PSX" kernel
|
|
from JMI is available for various processors, including MIPS processors, and
|
|
like the playstation, it does include functions like "atoi", and does support
|
|
TTY access via Signetics 2681 DUART chips. The DTL-H2000 does also have
|
|
POSIX-style "PSX>" prompt. So, altogether, it's quite possible that Sony has
|
|
licensed the kernel from JMI.<br/></p>
|
|
<h4 id="psx-as-abbreviation-for-an-extended-playstation-2">PSX as Abbreviation for an Extended Playstation 2</h4>
|
|
<p>As everybody agrees, PSX should be used only as abbreviation for Playstation 1,
|
|
and nobody should never ever use it for the Playstation 2. Well, nobody, except
|
|
Sony... despite of the common use as abbreviation for Playstation 1 (and
|
|
despite of the JMI trademark)... in 2003, Sony has have released a "Playstation
|
|
2 with built-in HDD/DVD Videorecorder" and called that thing "PSX" for the best
|
|
of confusion.<br/></p>
|
|
</article>
|
|
</div>
|
|
</div>
|
|
</main>
|
|
<footer class="md-footer">
|
|
<nav aria-label="Footer" class="md-footer__inner md-grid">
|
|
<a class="md-footer__link md-footer__link--prev" href="../memorycontrol/" rel="prev">
|
|
<div class="md-footer__button md-icon">
|
|
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"></path></svg>
|
|
</div>
|
|
<div class="md-footer__title">
|
|
<div class="md-ellipsis">
|
|
<span class="md-footer__direction">
|
|
Previous
|
|
</span>
|
|
Memory Control
|
|
</div>
|
|
</div>
|
|
</a>
|
|
<a class="md-footer__link md-footer__link--next" href="../cpuspecifications/" rel="next">
|
|
<div class="md-footer__title">
|
|
<div class="md-ellipsis">
|
|
<span class="md-footer__direction">
|
|
Next
|
|
</span>
|
|
CPU Specifications
|
|
</div>
|
|
</div>
|
|
<div class="md-footer__button md-icon">
|
|
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4z"></path></svg>
|
|
</div>
|
|
</a>
|
|
</nav>
|
|
<div class="md-footer-meta md-typeset">
|
|
<div class="md-footer-meta__inner md-grid">
|
|
<div class="md-footer-copyright">
|
|
|
|
Made with
|
|
<a href="https://squidfunk.github.io/mkdocs-material/" rel="noopener" target="_blank">
|
|
Material for MkDocs
|
|
</a>
|
|
... <a class="link--pdf-download" download href="../psx-spx.pdf" title="PDF">download PDF</a></div>
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
</div>
|
|
<div class="md-dialog" data-md-component="dialog">
|
|
<div class="md-dialog__inner md-typeset"></div>
|
|
</div>
|
|
<script id="__config" type="application/json">{"base": "..", "features": [], "translations": {"clipboard.copy": "Copy to clipboard", "clipboard.copied": "Copied to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.placeholder": "Type to start searching", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.term.missing": "Missing"}, "search": "../assets/javascripts/workers/search.fe42c31b.min.js", "version": null}</script>
|
|
<script src="../assets/javascripts/bundle.4ea5477f.min.js"></script>
|
|
</body>
|
|
</html> |