mirror of
https://github.com/cc65/cc65.git
synced 2024-09-21 18:47:31 +00:00
139 lines
3.6 KiB
ArmAsm
139 lines
3.6 KiB
ArmAsm
|
;
|
||
|
; 2015-03-06, Greg King
|
||
|
;
|
||
|
|
||
|
; When you want to create a program with the alternate file format,
|
||
|
; add "-u __BOOT__" to the cl65/ld65 command line. Then, the linker
|
||
|
; will import this symbol name; and, link this module at the front
|
||
|
; of your program file.
|
||
|
;
|
||
|
.export __BOOT__:abs = 1
|
||
|
|
||
|
.import __RAM_START__, __RAM_SIZE__, __BSS_RUN__
|
||
|
|
||
|
; ------------------------------------------------------------------------
|
||
|
|
||
|
load_addr := __RAM_START__
|
||
|
load_size = __BSS_RUN__ - __RAM_START__
|
||
|
ram_top := __RAM_START__ + __RAM_SIZE__
|
||
|
|
||
|
.segment "BOOT"
|
||
|
|
||
|
.ifdef ASM
|
||
|
|
||
|
.include "osic1p.inc"
|
||
|
.macpack generic
|
||
|
|
||
|
load := $08 ; private variables
|
||
|
count := $0A
|
||
|
|
||
|
GETCHAR := $FFBF ; gets one character from ACIA
|
||
|
|
||
|
FIRSTVISC = $85 ; Offset of first visible character in video RAM
|
||
|
LINEDIST = $20 ; Offset in video RAM between two lines
|
||
|
|
||
|
lda #<load_addr
|
||
|
ldx #>load_addr
|
||
|
tay
|
||
|
stx load+1
|
||
|
lda #<load_size
|
||
|
eor #$FF
|
||
|
sta count ; store (-size - 1)
|
||
|
lda #>load_size
|
||
|
eor #$FF
|
||
|
sta count+1
|
||
|
|
||
|
L1: inc count ; pre-count one's-complement upwards
|
||
|
bnz L2
|
||
|
inc count+1
|
||
|
bze L3
|
||
|
L2: jsr GETCHAR ; (doesn't change .Y)
|
||
|
sta (load),y
|
||
|
|
||
|
; Show that the file is being loaded by rotating an arrow on the screen.
|
||
|
;
|
||
|
tya
|
||
|
lsr a
|
||
|
lsr a
|
||
|
and #8 - 1
|
||
|
ora #$10 ; eight arrow characters
|
||
|
sta SCRNBASE + FIRSTVISC + 2 * LINEDIST + 11
|
||
|
|
||
|
iny
|
||
|
bnz L1
|
||
|
inc load+1
|
||
|
bnz L1 ; branch always
|
||
|
|
||
|
L3: jmp load_addr
|
||
|
|
||
|
.else
|
||
|
|
||
|
.mac hex1 h
|
||
|
.lobytes ((h) & $0F) + (((h) & $0F) > 9) * 7 + '0'
|
||
|
.endmac
|
||
|
|
||
|
.mac hex2 h
|
||
|
hex1 (h) >> 4
|
||
|
hex1 (h) >> 0
|
||
|
.endmac
|
||
|
|
||
|
.mac hex4 h
|
||
|
hex2 >(h)
|
||
|
hex2 <(h)
|
||
|
.endmac
|
||
|
|
||
|
CR = $0D
|
||
|
|
||
|
.byte CR, CR
|
||
|
.byte "." ; set an address
|
||
|
hex4 ram_top ; put loader where stack will sit
|
||
|
.byte "/" ; write bytes into RAM
|
||
|
|
||
|
; ASCII-coded hexadecimal translation of the above assembly code.
|
||
|
; It was copied from the assembler listing.
|
||
|
|
||
|
.byte "A9", CR
|
||
|
hex2 <load_addr
|
||
|
.byte CR, "A2", CR
|
||
|
hex2 >load_addr
|
||
|
.byte CR, "A8", CR
|
||
|
.byte "86", CR, "09", CR
|
||
|
.byte "A9", CR
|
||
|
hex2 <load_size
|
||
|
.byte CR, "49", CR, "FF", CR
|
||
|
.byte "85", CR, "0A", CR
|
||
|
.byte "A9", CR
|
||
|
hex2 >load_size
|
||
|
.byte CR, "49", CR, "FF", CR
|
||
|
.byte "85", CR, "0B", CR
|
||
|
|
||
|
.byte "E6", CR, "0A", CR
|
||
|
.byte "D0", CR, "04", CR
|
||
|
.byte "E6", CR, "0B", CR
|
||
|
.byte "F0", CR, "16", CR
|
||
|
.byte "20", CR, "BF", CR, "FF", CR
|
||
|
.byte "91", CR, "08", CR
|
||
|
|
||
|
.byte "98", CR
|
||
|
.byte "4A", CR
|
||
|
.byte "4A", CR
|
||
|
.byte "29", CR, "07", CR
|
||
|
.byte "09", CR, "10", CR
|
||
|
.byte "8D", CR, "D0", CR, "D0", CR
|
||
|
|
||
|
.byte "C8", CR
|
||
|
.byte "D0", CR, "E6", CR
|
||
|
.byte "E6", CR, "09", CR
|
||
|
.byte "D0", CR, "E2", CR
|
||
|
|
||
|
.byte "4C", CR
|
||
|
hex2 <load_addr
|
||
|
.byte CR
|
||
|
hex2 >load_addr
|
||
|
|
||
|
.byte CR, "."
|
||
|
hex4 ram_top
|
||
|
.byte "G" ; go to address
|
||
|
|
||
|
.endif
|