Programowanie: Dostęp do pamięci rozszerzonej

From Atariki

Revision as of 07:43, 19 paź 2013; view current revision
←Older revision | Newer revision→
Jump to: navigation, search

SpartaDOS X udostępnia procedury zarządzania dostępem do pamięci opisane w rozdziale 3 podręcznika programowania.

Podczas pisania operacji szczególnie krytycznych czasowo zachodzi czasem potrzeba własnoręcznego przełączania banków pamięci i dostępu do ich rejestrów sterujących. W tym celu przydatne mogą okazać się następujące procedury:

1. Sprawdzenia jakiego rodzaju jest rozszerzenie, które mamy zainstalowane.

; Checks if Axlon or 130xe extension exist
; N=0 - 130xe, N=1 - Axlon
ismemaxlon:
  bit _EXTTYP
  rts

Od SpartaDOS X 4.46 rozszerzenie typu Axlon jest wykrywane i obsługiwane również na Atari XL i XE.

2. Przetworzenia indeksu banku używanego przez procedury SDX na wartość wpisywaną do portu (PORTB lub rejestr banków Axlona).

; Convert memory index to port value
; IN: A-mem index
; OUT: A-port value
toportvalue:
  stx temp
  jsr ismemaxlon
  bpl ?130xe
?axlon:
  tax
  beq ?axlonbase
?axlonext:
  sec
  sbc #3
  ldx temp
  rts
?axlonbase:
  lda T_,x
  ldx temp
  rts
?130xe:
  tax
  beq ?130xebase
?130xeext:
  pha
  lsr
  lsr
  tax
  pla
  and #%11
  asl
  asl
  ora T_+8-1,x
  ldx temp
  rts
?130xebase:
  lda T_+4,x
  ldx temp
  rts

3. Obliczenia ilości wolnych banków pamięci.

memdetect:
  lda NBANKS
  sta banksfree
  rts

4. Emulacji alokacji pamięci rozszerzonej.

; Allocate XRAM memory - replacement for MALLOC
; hack for lack of MALLOC for XRAM (sdx 4.47-)
memalloc:
  cpx #4
  jne MALLOC

  lda banksfree
  beq ?noroom
  dec banksfree
  ldx #<$4000
  ldy #>$4000
  stx FAUX1
  sty FAUX2
  clc
  adc #3
  tax
  rts
?noroom:
  lda #$80
  rts

UWAGA! Procedura alokacji powinna być używana zamiast MALLOC. Nie oznacza w systemie banków pamięci rozszerzonej jako zajętych (więc de facto nie rezerwuje pamięci XRAM), lecz pozwala z niej korzystać w programach przeznaczonych dla wersji DOS-a mniejszych niż 4.47 i powinna być używana po uprzednim wywołaniu procedury memdetect.

Personal tools