;------------------------------- ; YE OLDE GRAND UNIFIED MEMORY MAP ; ; 02D8..038D - clobbered by Optimum reader ; 0800..08FF - clobbered by all boot tracers and RAM disk ; 0900..09FF - clobbered by Special Delivery tracer and RAM disk ; 0A00..0AFF - backup of zero page during Special Delivery tracer, used by RAM disk ; 0B00..0BFF - used by RAM disk ; 0C00..0CFF - clobbered by Special Delivery tracer ; 0D00..0EFF - unused ; 0F00..0FFF - backup of page $BF (SaveProDOS, SwapProDOS) ; 1000..1FFF - data buffer for current track ; 2000..35FF - clobbered by Special Delivery tracer ; 3600..3FFF - clobbered by lomem DOS 3.3 / Special Delivery tracers ; 4000..B1FF - program code ; B200..BFFF - clobbered by DOS boot tracer (RDOS is B200+, DOS 3.x is B600+) ;------------------------------- ;------------------------------- ; SaveProDOS ; saves memory pages used by ProDOS ; pages $BF ; in: none ; out: all flags and registers preserved ;------------------------------- !zone { SaveProDOS php pha lda #$BF ldx #$0F ldy #$01 jsr CopyMemory pla plp rts ;------------------------------- ; SwapProDOS ; saves/restores memory pages used by ProDOS ; pages $BF ; in: none ; out: all flags and registers preserved ;------------------------------- SwapProDOS php pha lda #$BF ldx #$0F ldy #$01 sec jsr SwapMemory pla plp rts ;------------------------------- ; CopyMemory ; in: A = source address (high) ; X = destination address (high) ; Y = number of pages to copy ; out: all flags and registers clobbered ;------------------------------- CopyMemory sta @source+2 stx @dest+2 ldx #$00 @source lda $FF00,x @dest sta $FF00,x inx bne @source inc @source+2 inc @dest+2 dey bne @source rts ;------------------------------- ; ClearTSBuffer ; clear the $1000 byte memory buffer ; used to store the current track's data ; in: none ; out: all flags and registers clobbered ;------------------------------- ClearTSBuffer lda #BASEPAGE ldx #$00 ldy #$10 ; /!\ execution falls through here ;------------------------------- ; ClearMemory ; in: A = source address (high) ; X = value to set ; Y = number of pages ; out: all flags and registers clobbered ;------------------------------- ClearMemory sta @dest+2 @dest stx $FF00 inc @dest+1 bne @dest inc @dest+2 dey bne @dest rts ;------------------------------- ; ReorderBuffer - convert data ; buffer between ProDOS and ; DOS 3.3 ordering (use after ; read or before write under ; ProDOS) ; in: none ; out: all flags clobbered ; all registers clobbered ;------------------------------- ReorderBuffer lda #BASEPAGE+1 ldx #BASEPAGE+$0E ldy #$07 clc ; /!\ execution falls through here ;------------------------------- ; SwapMemory ; in: A = source address (high) ; X = destination address (high) ; Y = number of pages to copy ; C = dest direction (set: +, clear: -) ; out: all flags and registers clobbered ;------------------------------- SwapMemory sta @source1+2 sta @source2+2 stx @dest1+2 stx @dest2+2 lda #$FF adc #0 ora #1 sta @destadjust+1 ldx #$00 @source1 lda $FF00,x pha @dest1 lda $FF00,x @source2 sta $FF00,x pla @dest2 sta $FF00,x inx bne @source1 inc @source1+2 inc @source2+2 lda @dest1+2 clc @destadjust adc #$D1 sta @dest1+2 sta @dest2+2 dey bne @source1 rts ;------------------------------- ; ReorderLogicalToPhysical - reorder pages in ; track data buffer for disks that expect ; sectors in physical sector order ; ; 1 -> 7 ; 2 -> E ; 3 -> 6 ; 4 -> D ; ; 6 -> C ; 7 -> 4 ; 8 -> B ; 9 -> 3 ; ; B -> 2 ; C -> 9 ; D -> 1 ; E -> 8 ; ; 0123456789ABCDEF ; 07E6D5C4B3A2918F ; in: track buffer has data in logical sector order ; out: A,X,Y clobbered ;------------------------------- ReorderLogicalToPhysical ldy #$00 - ldx $1800,y lda $1e00,y sta $1800,y lda $1200,y sta $1e00,y lda $1b00,y sta $1200,y txa sta $1b00,y ldx $1100,y lda $1d00,y sta $1100,y lda $1400,y sta $1d00,y lda $1700,y sta $1400,y txa sta $1700,y ldx $1900,y lda $1c00,y sta $1900,y lda $1600,y sta $1c00,y lda $1300,y sta $1600,y txa sta $1300,y iny bne - rts }