# Bank switching

Bank switching (alle volte indicata anche come paging), in informatica, indica una tecnica molto comune nei microcomputer ad 8 bit degli anni ottanta usata per incrementare la quantità di memoria RAM o ROM indirizzabile oltre il quantitativo direttamente gestibile dal bus indirizzi di una particolare CPU.
Tale tecnica può anche essere utilizzata per configurare un sistema in maniera differente a seconda delle situazioni: ad esempio, agli indirizzi a cui inizialmente una CPU accede ad una ROM utilizzata per avviare un sistema da un dischetto può risultare in seguito visibile un'altra memoria, dopo che la prima ha terminato il suo compito. Alcuni microcontrollori e microprocessori ad 8 bit più moderni utilizzano il bank switching per gestire la memoria leggibile/scrivibile, la memoria non volatile, i dispositivi di input/output ed i registri di gestione dei piccoli sistemi embedded.

## Home computer

I processori ad 8 bit degli home computer degli anni ottanta quali lo Z80 ed il 6502 avevano bus indirizzi a 16 bit per cui potevano indirizzare direttamente solo 64 KB di memoria: i sistemi con un quantitativo di memoria superiore dovevano perciò dividere lo spazio indirizzabile in un certo numero di blocchi che poi erano mappati dinamicamente in parti di un più grande spazio indirizzi. I banchi, o pagine o blocchi, le cui dimensioni variavano da sistema a sistema, erano attivati e disattivati tramite dei registri di selezione banchi o altri meccanismi similari; alcuni blocchi erano in genere attivi sempre. Era necessario però adottare alcuni accorgimenti per evitare di corrompere la gestione delle chiamate, gli interrupt e lo stack della macchina.
A differenza di altre tecniche di gestione della memoria il bank switching era generalmente controllato direttamente dal software (anche se non mancano esempi di gestione lasciata al sistema, come nel caso del sistema CP/M 3.0). Anche se il contenuto della memoria che era stata temporaneamente resa inattiva dalla CPU non era accessibile a "quel" processore, esso poteva in genere essere ancora letto o modificato da un altro componente hardware, come ad esempio la circuiteria video, il DMA, i dispositivi di I/O, ecc.
Grazie al bank switching, potevano essere aggiunte al progetto di un computer sia della memoria extra sia anche delle funzioni supplementari, senza i costi ed i problemi di compatibilità derivanti dall'impiego di una CPU con un bus d'indirizzi più grande. Ad esempio, il Commodore 64 usava il bank switching per avere 64 KB di memoria RAM effettivi oltre alla ROM ed ai sistemi di input/output mappati in memoria (MMIO); negli Atari 130XE, grazie a questa tecnica, la CPU 6502 ed il chip grafico ANTIC erano capaci di accedere a banchi RAM differenti permettendo ai programmatori di ricreare degli scenari di gioco molto complessi senza utilizzare la memoria visibile alla CPU.

## PC IBM

Nel 1988 le società Lotus, Intel e Microsoft proposero una specifica chiamata Expanded Memory Specification (EMS, o anche LIM-EMS, dalle iniziali delle tre società) da utilizzare nei computer PC IBM e compatibili con MS-DOS come sistema operativo.
L'EMS era una tecnica di bank switching che permetteva al sistema di gestire più dei 640 KB di memoria permessi dall'originaria architettura dei PC IBM: per far ciò la memoria appariva divisa alla stregua di blocchi in una "finestra" di 64 KB locata nell'area di memoria superiore (Upper Memory Area, UMA). I blocchi da 64 KB erano divisi in 4 pagine da 16 KB ciascuno, ognuno dei quali poteva essere attivato o disattivato in maniera indipendente. Alcuni giochi utilizzavano l'EMS per cui, anche se questa tecnica divenne presto obsoleta, essa veniva emulata nei successivi sistemi DOS e Microsoft Windows per retrocompatibilità con quei programmi.
Successivamente all'EMS fu sviluppata un'altra tecnica, anch'essa ormai obsoleta, denominata eXtended Memory Specification (XMS) che, in teoria, doveva simulare il bank switching per la parte di memoria superiore al primo megabyte (chiamata memoria estesa) che non era direttamente indirizzabile dai processori x86 in quanto sotto MS-DOS essi giravano in modalità reale. L'XMS permetteva alla memoria estesa di essere copiata in qualunque punto della memoria convenzionale per cui i confini dei "banchi" non erano fissi; ciò nonostante l'XMS lavorava come il bank switching dell'EMS, secondo la prospettiva di un programma che la utilizzava. Le versioni dell'MS-DOS a partire dalla 5.0 includevano il driver EMM386 che simulava la memoria EMS utilizzando l'XMS, permettendo ai programmi di utilizzare la memoria estesa anche se essi erano stati scritti per gestire solo l'EMS. Anche il sistema Windows emula l'XMS, per quei programmi che lo richiedono.

## Console da gioco

Il bank switching fu utilizzato anche in diverse console da gioco degli anni ottanta. Ad esempio, l'Atari 2600 poteva indirizzare solo 4 KB di ROM per cui alcune cartucce contenevano un proprio sistema hardware di bank switching capace di gestire più memoria ROM ed offrire così giochi molto più sofisticati: più memoria significava infatti più spazio per memorizzare più codice programma ma anche più dati per il gioco stesso, con il risultato di avere titoli con più musiche, grafiche più curate e livelli extra. Per il Nintendo Entertainment System, nonostante fosse basato su una CPU ad 8 bit (un 6502 modificato), esistevano cartucce gioco che potevano arrivare a contenere fino ad 1 megabit di dati su ROM, indirizzabili grazie ad un sistema di bank switching denominato Memory Management Controller. Le cartucce per il Game Boy utilizzavano un chip denominato MBC (Memory Bank Controller) che non solo offriva il bank switching della ROM ma anche della memoria SRAM e, in aggiunta, la gestione di alcune periferiche quali i collegamenti ad infrarosso o i sistemi di vibrazione.
Anche console più recenti hanno adottato la tecnica del bank switching. Ad esempio alcune cartucce per il SEGA Mega Drive, nonostante il suo limite di indirizzamento di 4 MB di memoria, presentavano ROM con dimensioni maggiori. La console portatile GP2X utilizzava il bank switching per controllare l'indirizzo di partenza (o offset di memoria) del secondo processore.

## Tecniche alternative e seguenti

Il bank switching è stato soppiantato, su molti sistemi a 16 bit, dalla segmentazione della memoria, che ha permesso alle unità di gestione della memoria di effettuare il paging della stessa. Nei sistemi integrati, comunque, il bank switching è ancora molto utilizzato sia per la sua semplicità sia per il suo basso costo.

## Computer che hanno utilizzato il bank switching

Elenco non completo di computer che hanno utilizzato la tecnica del bank switching:
* TRS-80 Modello 4
* Amstrad CPC
* Amstrad PCW
* Apple II
* Apple III
* Commodore 16
* Commodore 64
* Commodore 128
* MSX
* PIC (microcontrollore)
* ZX Spectrum modello 128
* TV-Boy
* Memotech MTX