Код:
!====================================!
! BANKS.PRG !
! Using 130XE Extended Banks in !
! PL65 Programming Language !
!------------------------------------!
! Evgeny Zolotarev,(aka 576XE), 2020 !
!====================================!
INCLUDE TERMINAL.LIB
!- CONSTANTS & VARIABLES:
CONST bkMask=%10010001
BYTE PORTB=$D301,NMIEN=$D40E,bkTag
INT bkNum
!- DUMMY array representing ---------!
!- selected BANK's slice ------------!
BYTE bkMem[$4000]=$4000
!- Bank Selector Values -------------!
!- Atari800WinPlus 576XE ------------!
BYTE bkSel[33]
DATA $93,
$81,$83,$85,$87,$89,$8B,$8D,$8F,
$A1,$A3,$A5,$A7,$A9,$AB,$AD,$AF,
$C1,$C3,$C5,$C7,$C9,$CB,$CD,$CF,
$E1,$E3,$E5,$E7,$E9,$EB,$ED,$EF;
!- Bank Selector Values -------------!
!- Altirra 576XE Compy scheme -------!
! BYTE bkSel[33]
! DATA $33,
! $21,$23,$25,$27,$29,$2B,$2D,$2F,
! $61,$63,$65,$67,$69,$6B,$6D,$6F,
! $A1,$A3,$A5,$A7,$A9,$AB,$AD,$AF,
! $E1,$E3,$E5,$E7,$E9,$EB,$ED,$EF;
! String VAR to store in all BANKS
STRING inp$[4+27]
DATA "==> User DATA from Bank #00";
! Set string as VAR for appending
STRING out$[4+27]
DATA " ";
!- PROCEDURES:
!- Clear Screen Procedure -----------!
PROC clrScr()
CONST clr=255
BEGIN WRTSTR(CHR$(125)) END
!- Wait for Any Key Pressed ---------!
PROC anyKey()
CONST none=255
BYTE CH=764
BEGIN
WRTSTR("Wait for a Key...") CR()
WHILE CH=none DO ENDWHILE
CH=none
END
!- Place bkSel Tags into PORTB ------!
PROC setBk*(BYTE bkTag)
BEGIN
!- Wrapper STOPs/STARTs IRQ & NMI ---!
SEI LDA #$00 STA NMIEN
LDA PORTB
AND bkMask OR bkTag
STA PORTB
LDA #$40 STA NMIEN CLI
END
!- Send bkNum to setBk subroutine ---!
PROC setBank(INT bkNum)
BEGIN
bkTag=bkSel[bkNum]
setBk*(bkTag)
END
!- Writes to Bank -------------------!
PROC writBk()
BEGIN
FOR bkNum=0 TO 32 DO
WRTSTR("Writing to BANK #") WRITE(bkNum) CR()
IF bkNum<10 THEN
inp$[25,25]=STR$(0) inp$[26,26]=STR$(bkNum)
ELSE inp$[25]=STR$(bkNum) ENDIF
out$=inp$
setBank(bkNum)
MOVE(.out,LEN(out$),.bkMem)
NEXT
END
!- Reads from Bank ------------------!
PROC readBk()
BEGIN
FOR bkNum=0 TO 32 DO
WRTSTR("Reading BANK #") WRITE(bkNum) CR()
setBank(bkNum)
MOVE(.bkMem,LEN(out$),.out)
WRTSTR(out$) CR()
NEXT
END
!------------------------------------!
MAIN()
BEGIN
clrScr() anyKey() writBk()
anyKey() clrScr() readBk()
END
! >>> EOF <<< !
Заметьте, что я оставил маску ПРЕЖНЕЙ (Маска просто сохраняет от стирания системные данные в PORTB), зато значение нулевого тэга поменял. Можно ещё в конце MAIN добавить восстановление PORTB, но мне не это было нужно, а работа с EXTMEM.