2012-07-30 19:33:05 +00:00
|
|
|
;*********************************************************
|
|
|
|
; *
|
|
|
|
; APPLECOMMANDER boot code. *
|
|
|
|
; Copyright (c) 2002, Rob Greene *
|
|
|
|
; *
|
|
|
|
; This code is published under the GPL license. See the *
|
|
|
|
; AppleCommander site for license information. *
|
|
|
|
; *
|
|
|
|
;*********************************************************
|
|
|
|
|
|
|
|
; Assemble this code with the cc65 toolchain:
|
|
|
|
;
|
2017-11-08 19:27:22 +00:00
|
|
|
; cl65 -t none --start-addr 0x0800 -l AppleCommander-boot.lst AppleCommander-boot.s
|
2012-07-30 19:33:05 +00:00
|
|
|
; then copy resulting AppleCommander-boot to:
|
|
|
|
; .../src/com/webcodepro/applecommander/storage/AppleCommander-boot.dump
|
|
|
|
;
|
2017-11-08 19:27:22 +00:00
|
|
|
; Note that this command will hexdump a useful format for pasting and testing...
|
|
|
|
; hexdump -e '"08%02.2_ax:" 16/1 "%02x " "\n"' AppleCommander-boot
|
|
|
|
;
|
2012-07-30 19:33:05 +00:00
|
|
|
|
|
|
|
; Define as ASCII string with no attributes
|
|
|
|
.macro asc Arg
|
|
|
|
.repeat .strlen(Arg), I
|
|
|
|
.byte .strat(Arg, I) | $80
|
|
|
|
.endrep
|
|
|
|
.endmacro
|
|
|
|
|
|
|
|
; Define as ASCII string with trailing CR
|
|
|
|
.macro asccr Arg
|
|
|
|
.repeat .strlen(Arg), I
|
|
|
|
.byte .strat(Arg, I) | $80
|
|
|
|
.endrep
|
|
|
|
.byte $8d
|
|
|
|
.endmacro
|
|
|
|
|
|
|
|
.org $0800
|
|
|
|
;
|
|
|
|
; Zero page variables. Used by Apple ][ ROM routines
|
|
|
|
; as well as this code.
|
|
|
|
;
|
|
|
|
XEND = $2C
|
|
|
|
ADDR = $26
|
|
|
|
;
|
|
|
|
; Keyboard switches
|
|
|
|
;
|
|
|
|
KEYBOARD = $C000
|
|
|
|
KEYCLEAR = $C010
|
|
|
|
;
|
|
|
|
; Disk ][ interface locations
|
|
|
|
;
|
|
|
|
MOTOROFF = $C088
|
|
|
|
;
|
|
|
|
; General Apple ][ ROM locations
|
|
|
|
;
|
|
|
|
TEXT = $FB2F
|
|
|
|
HOME = $FC58
|
|
|
|
GR = $FB40
|
|
|
|
COLOR = $F864
|
|
|
|
HLIN = $F819
|
|
|
|
PRINT = $FDF0
|
|
|
|
REBOOT = $FAA6
|
|
|
|
CALCADDR = $F847
|
|
|
|
DELAY = $FCA8
|
|
|
|
;
|
|
|
|
; Image offset locations (from upper-left).
|
|
|
|
; Note that, due to space, the XOFFSET isn't
|
|
|
|
; currently used - but, because of the rotating
|
|
|
|
; image, it doesn't really matter!
|
|
|
|
;
|
|
|
|
XOFFSET = 14
|
|
|
|
YOFFSET = 13
|
|
|
|
;
|
|
|
|
; The boot rom (probably $C600) uses the first byte
|
|
|
|
; to indicate the number of sectors to load. Normally
|
|
|
|
; this is just one sector, so this program is constrained
|
|
|
|
; to 256 bytes - just in case of compatibility problems.
|
|
|
|
; This also avoids problems with sector ordering.
|
|
|
|
; Zero is always zero!
|
|
|
|
;
|
2014-04-18 17:11:59 +00:00
|
|
|
; Added a little chicanery for the Apple /// to branch around
|
|
|
|
; since it starts executing at the zeroeth byte, not the first.
|
2017-11-08 19:27:22 +00:00
|
|
|
; This has the effect of setting carry based on machine type.
|
2014-04-18 17:11:59 +00:00
|
|
|
;
|
|
|
|
.byte $01
|
|
|
|
SEC
|
|
|
|
BCS $0807 ; The General setup section, below
|
|
|
|
JMP $A132 ; Apple /// code to pull in the next sector
|
2012-07-30 19:33:05 +00:00
|
|
|
;
|
|
|
|
; General setup.
|
|
|
|
;
|
|
|
|
LDA MOTOROFF,X
|
|
|
|
JSR TEXT
|
|
|
|
JSR HOME
|
|
|
|
JSR GR
|
|
|
|
;
|
|
|
|
; Draw the AppleCommander logo (well, sorta).
|
|
|
|
; DATA1 and DATA2 contain 4 values - the color value,
|
|
|
|
; the xstart (start of line), xend (end of line), as
|
|
|
|
; well as the Y position.
|
|
|
|
;
|
|
|
|
LDX #DATA2-DATA1
|
|
|
|
LOGO:
|
|
|
|
LDA DATA1-1,X
|
|
|
|
LSR
|
|
|
|
LSR
|
|
|
|
LSR
|
|
|
|
LSR
|
|
|
|
JSR COLOR
|
|
|
|
LDA DATA2-1,X
|
|
|
|
LSR
|
|
|
|
LSR
|
|
|
|
LSR
|
|
|
|
LSR
|
|
|
|
STA XEND
|
|
|
|
LDA DATA1-1,X
|
|
|
|
AND #$F
|
|
|
|
TAY
|
|
|
|
LDA DATA2-1,X
|
|
|
|
AND #$F
|
|
|
|
CLC
|
|
|
|
ADC #YOFFSET
|
|
|
|
JSR HLIN
|
|
|
|
DEX
|
|
|
|
BNE LOGO
|
|
|
|
;
|
|
|
|
; Display AppleCommander message.
|
|
|
|
;
|
|
|
|
DISPMSG:
|
|
|
|
LDA MESSAGE,X
|
|
|
|
BEQ WAIT
|
|
|
|
JSR PRINT
|
|
|
|
INX
|
|
|
|
BNE DISPMSG
|
|
|
|
;
|
|
|
|
; Check for a keypress
|
|
|
|
;
|
|
|
|
WAIT:
|
|
|
|
LDA KEYBOARD
|
|
|
|
BPL SETUP
|
|
|
|
STA KEYCLEAR
|
|
|
|
JMP REBOOT
|
|
|
|
;
|
|
|
|
; Rotate the screen (isn't that retro)!
|
|
|
|
;
|
|
|
|
SETUP:
|
2017-11-08 19:27:22 +00:00
|
|
|
LDX #19
|
2012-07-30 19:33:05 +00:00
|
|
|
ROTATE:
|
2017-11-08 19:27:22 +00:00
|
|
|
TXA
|
|
|
|
JSR CALCADDR
|
|
|
|
LDY #39
|
|
|
|
LDA (ADDR),Y
|
|
|
|
PHA
|
2012-07-30 19:33:05 +00:00
|
|
|
SHIFT:
|
2017-11-08 19:27:22 +00:00
|
|
|
DEY
|
|
|
|
LDA (ADDR),Y
|
|
|
|
INY
|
|
|
|
STA (ADDR),Y
|
|
|
|
DEY
|
|
|
|
BNE SHIFT
|
|
|
|
PLA
|
|
|
|
STA (ADDR),Y
|
|
|
|
DEX
|
|
|
|
BPL ROTATE
|
2012-07-30 19:33:05 +00:00
|
|
|
;
|
|
|
|
; Introduce a pause between rotations.
|
|
|
|
;
|
|
|
|
KEYLOOP:
|
|
|
|
LDA #$08
|
|
|
|
JSR DELAY
|
|
|
|
DEX
|
|
|
|
BNE KEYLOOP
|
|
|
|
BEQ WAIT
|
|
|
|
;
|
|
|
|
; The image data codes the upper nybble with one
|
|
|
|
; value and the lower nybble with the second value
|
|
|
|
; in an effort to conserve space. Thus, 17 HLINs
|
|
|
|
; are stored in 34 bytes instead of 68.
|
|
|
|
;
|
|
|
|
; DATA1 consists of color and x1 (start) position.
|
|
|
|
;
|
|
|
|
DATA1:
|
|
|
|
.byte $C8, $C7, $C6, $C3, $C8, $C2 ; green
|
|
|
|
.byte $D1, $D1 ; yellow
|
|
|
|
.byte $90, $90 ; orange
|
|
|
|
.byte $10, $10 ; red
|
|
|
|
.byte $31, $31 ; purple
|
|
|
|
.byte $62, $63, $68 ; blue
|
|
|
|
;
|
|
|
|
; DATA2 consists of x2 (end) and y position.
|
|
|
|
;
|
|
|
|
DATA2:
|
|
|
|
.byte $90, $81, $72, $53, $B3, $C4
|
|
|
|
.byte $D5, $D6
|
|
|
|
.byte $C7, $B8
|
|
|
|
.byte $B9, $CA
|
|
|
|
.byte $DB, $DC
|
|
|
|
.byte $CD, $5E, $BE
|
|
|
|
;
|
|
|
|
; Text message to display at bottom of screen.
|
|
|
|
;
|
|
|
|
MESSAGE:
|
2014-04-18 17:11:59 +00:00
|
|
|
asccr "APPLECOMMANDER CREATED THIS DISK"
|
2017-11-08 19:27:22 +00:00
|
|
|
asccr "VISIT APPLECOMMANDER.GITHUB.IO"
|
2012-07-30 19:33:05 +00:00
|
|
|
.byte $8d
|
|
|
|
asc "INSERT ANOTHER DISK AND PRESS ANY KEY"
|
|
|
|
.byte $00
|