;------------------------------- ; YE OLDE GRAND UNIFIED MEMORY MAP ; ; 0200..03FF - clobbered by DOS 3.2 tracer (and other supported 13-sector disks like Choplifter) ; 0200..02CB - clobbered by exodecrunch ; 02D8..038D - clobbered by Optimum reader ; 0300..0395 - clobbered by DOS 3.3 tracer ; 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 ; 0CD0..0EFF - sector map ; 0F00..0FFF - backup of page $BF (SwapProDOS) ; 1000..1FFF - data buffer for current track ; 2000..35FF - clobbered by Special Delivery tracer ; 2600..26FF - clobbered by all boot tracers (copy of C600) ; 3600..3FFF - clobbered by lomem DOS 3.2/3.3 tracers, Special Delivery tracer ; 4000..B1FF - program code ; B200..BFFF - clobbered by DOS boot tracer (RDOS is B200+, DOS 3.x is B600+) ;------------------------------- ; /!\ execution falls through from CreateFileOnHardDisk ;------------------------------- ; SwapProDOS ; saves/restores memory used by ProDOS ($BF00..$BFFF) ; in: none ; out: all flags and registers preserved ;------------------------------- SwapProDOS php pha lda #$BF ldx #$0F ldy #$01 sec jsr SwapMemory pla plp - rts ;------------------------------- ; MoveT00PakLow/MoveT00PakHigh ; ; Copy compressed blob of track 0 patchers ; from low memory to high memory or vice versa. ; Each entry point is always safe to call, ; e.g. if the blob is already low and you call ; MoveT00PakLow, it just exits. ; ; in: none ; out: if blob needs to be copied, exits via CopyMemory ; if no action, all registers preserved ;------------------------------- MoveT00PakLow bit T00PakPtr+1 bpl - ; already low lda #$B2 ldx #$32 bne + ; always branches MoveT00PakHigh bit T00PakPtr+1 bmi - ; already high lda #$32 ldx #$B2 + stx T00PakPtr+1 ldy #$0D !byte $2C ; hide next LDY ; /!\ execution falls through here CopyMemory1 ldy #$01 ; /!\ execution falls through here ;------------------------------- ; CopyMemory ; in: A = source address (high) ; X = destination address (high) ; Y = number of pages to copy ; out: Z = 1 ; X = 0 ; Y = 0 ; all other 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 ;------------------------------- ; 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