PrintShopCompanion-Apple-II/PSC Source Disk 4 - Fastloa.../S_BOOT2.txt

601 lines
11 KiB
Plaintext

NLS
TTL "S:BOOT2"
NOG
ORG = $4000
;
; The Print Shop Companion
; DOS and title page loader.
;
; Copyright 1985
; by Roland Gustafsson
;
HAS128K = $27F
SCREEN = $7F7
;-----------
OUTVEC = $FF58
INPVEC = $B6FD
;
DAT EPZ $50
;
TMP0 EPZ DAT
TMP1 EPZ DAT+1
TMP2 EPZ DAT+2
TMP3 EPZ DAT+3
;
SLOT EPZ DAT+4
;
ERRORS EPZ DAT+5
TRACK EPZ DAT+6
LASTRK EPZ DAT+7
BUF EPZ DAT+8
BUFHI EPZ DAT+9
;
CHECKSUM EPZ $26
ADDRESS EPZ $2C
;
TMP26 EPZ DAT+10
TMP27 EPZ DAT+11
;
; SECTLO.HI points to 16 bytes
; that specify where to load
; the current track. If zero
; is specified, then skip that
; sector.
;
SECTLO EPZ TMP0
SECTHI EPZ TMP1
;
TEMPBUF = $0200
TEMPTABL = TEMPBUF+$70
READTBL = TEMPBUF+$80
Q6L EQU $C08C
;
;-----------
ORG ORG
OBJ $800
;
JMP START
;-----------
;
; Standard 16 sector fast loader
;
; Read data
;
ERR1 SEC
RTS
;
READBUF STX SLOT
TXA
ORA #$8C
STA SLTMOD1+1
STA SLTMOD2+1
STA SLTMOD3+1
STA SLTMOD4+1
STA SLTMOD5+1
LDA BUF
LDY BUF+1
STA BUFMOD1+1
STY BUFMOD1+2
SEC
SBC #$54
BCS >0
DEY
SEC
^0 STA BUFMOD2+1
STY BUFMOD2+2
SBC #$57
BCS >0
DEY
^0 STA BUFMOD3+1
STY BUFMOD3+2
LDY #$20
^0 DEY
BEQ ERR1
;
^1 LDA Q6L,X
BPL <1
TRYD5 EOR #$D5
BNE <0
NOP
;
^0 LDA Q6L,X
BPL <0
CMP #$AA
BNE TRYD5
NOP
^0 LDA Q6L,X
BPL <0
CMP #$AD
BNE TRYD5
LDY #$AA
LDA #$00
^0 STA CHECKSUM
;
SLTMOD1 LDX Q6L
BPL SLTMOD1
LDA TABLE1,X
STA TEMPBUF,Y
EOR CHECKSUM
INY
BNE <0
LDY #$AA
BNE SLTMOD2
;
BUFMOD3 STA $FFFF,Y
;
SLTMOD2 LDX Q6L
BPL SLTMOD2
EOR TABLE1,X
LDX TEMPBUF,Y
EOR TABLE2,X
INY
BNE BUFMOD3
PHA
AND #$FC
LDY #$AA
;
SLTMOD3 LDX Q6L
BPL SLTMOD3
EOR TABLE1,X
LDX TEMPBUF,Y
EOR TABLE2+1,X
BUFMOD2 STA $FFFF,Y
INY
BNE SLTMOD3
;
SLTMOD4 LDX Q6L
BPL SLTMOD4
AND #$FC
LDY #$AC
^0 EOR TABLE1,X
LDX TEMPBUF-2,Y
EOR TABLE2+2,X
BUFMOD1 STA $FFFF,Y
;
SLTMOD5 LDX Q6L
BPL SLTMOD5
INY
BNE <0
AND #$FC
EOR TABLE1,X
LDX SLOT
TAY
BNE ERR2
^0 LDA Q6L,X
BPL <0
CMP #$DE
BEQ NOERR
;
; Exit
;
ERR2 SEC
HEX 24
NOERR CLC
PLA
LDY #$55
STA (BUF),Y
RTS
;-----------
;
; SEEK routine
;
TRACKSTP ASL
STA TMP26
TRKLOO LDA LASTRK
STA TMP27
SEC
SBC TMP26
BEQ RETURN
BCS SUBTRK
INC LASTRK
BCC ADCTRK
SUBTRK DEC LASTRK
ADCTRK JSR STEP
JSR DELAY
LDA TMP27
AND #$03
ASL
ORA SLOT
TAY
LDA $C080,Y
JSR DELAY
BEQ TRKLOO
STEP LDA LASTRK
AND #$03
ASL
ORA SLOT
TAY
LDA $C081,Y
RETURN RTS
;
DELAY LDA #$28
JMP $FCA8
;-----------
;
; Read address marks
;
ADDERR SEC
RTS
;
ADDMARK LDY #$FC
STY TMP26
^1 INY
BNE >0
INC TMP26
BEQ ADDERR
^0 LDA Q6L,X
BPL <0
TRYD55 CMP #$D5
BNE <1
NOP
^0 LDA Q6L,X
BPL <0
CMP #$AA
BNE TRYD55
LDY #$03
^0 LDA Q6L,X
BPL <0
CMP #$96
BNE TRYD55
LDA #$00
^3 STA TMP27
^0 LDA Q6L,X
BPL <0
ROL
STA TMP26
^0 LDA Q6L,X
BPL <0
AND TMP26
STA ADDRESS,Y
EOR TMP27
DEY
BPL <3
TAY
BNE ADDERR
^0 LDA Q6L,X
BPL <0
CMP #$DE
BNE ADDERR
NOP
^0 LDA Q6L,X
BPL <0
CMP #$AA
BNE ADDERR
CLC
RTS
;
DFS $80-$FF&*,$FF
TABLE1 = *&$FF00
;
HEX 00000000000000000000000000000000
HEX 00000000000000049899080C9C101418
HEX A0A1A2A3A4A51C20A8A9AA24282C3034
HEX B0B1383C4044484CB85054585C606468
HEX C0C1C2C3C4C5C6C7C8C9CA6CCC707478
HEX D0D1D27CD4D58084D8888C9094989CA0
HEX E0E1E2E3E4A4A8ACE8B0B4B8BCC0C4C8
HEX F0F1CCD0D4D8DCE0F8E4E8ECF0F4F8FC
;
; Here is TABLE2
;
TABLE2 HEX 00000096020000970100009A0300009B
HEX 0002009D0202009E0102009F030200A6
HEX 000100A7020100AB010100AC030100AD
HEX 000300AE020300AF010300B2030300B3
HEX 000002B4020002B5010002B6030002B7
HEX 000202B9020202BA010202BB030202BC
HEX 000102BD020102BE010102BF030102CB
HEX 000302CD020302CE010302CF030302D3
HEX 000001D6020001D7010001D9030001DA
HEX 000201DB020201DC010201DD030201DE
HEX 000101DF020101E5010101E6030101E7
HEX 000301E9020301EA010301EB030301EC
HEX 000003ED020003EE010003EF030003F2
HEX 000203F3020203F4010203F5030203F6
HEX 000103F7020103F9010103FA030103FB
HEX 000303FC020303FD010303FE030303FF
;-----------
;
; Read a track
;
; A=track (0-22 format)
;
; SECTLO.HI points to 16 byte
; buffer that contains the
; addresses where the sectors will
; get loaded.
;
READTRAK JSR TRACKSTP
LDX #15
^0 LDY SKEW,X
LDA (SECTLO),Y
STA READTBL,X
DEX
BPL <0
;
LDX SLOT
LDA #96
STA ERRORS
;
^0 DEC ERRORS
BEQ READERR
JSR ADDMARK
BCS <0
LDY $2D ; sector number
LDA READTBL,Y
BEQ <0 ; already done
STA BUF+1 ; hi-byte
LDA #0
STA BUF
JSR READBUF
BCS <0
LDY $2D
LDA #0
STA READTBL,Y
LDY #$0F
^1 LDA READTBL,Y
BNE <0 ; if any still pending
DEY ;then continue reading
BPL <1
CLC
HEX 24
READERR SEC
RTS
;
SKEW HEX 00070E060D050C04
HEX 0B030A020901080F
;-----------
;
; Read track with all sectors
; in sequence, 0-F
;
READSEQU STA >1+1
LDY #TEMPTABL
LDA /TEMPTABL
STY SECTLO
STA SECTHI
LDY #15
;
^0 TYA
CLC
^1 ADC #00
STA (SECTLO),Y
DEY
BPL <0
;-----------
;
; Read current track and INC TRACK
;
READTRK LDA TRACK
INC TRACK
JSR READTRAK
BCS >0
RTS
;
; WHOOP the speaker and try again.
;
^0 DEC TRACK
LDY #0
^1 TYA
BIT $C030
^2 SEC
SBC #1
BNE <2
DEY
BNE <1
BEQ READTRK
;-----------
;
; BOOT2!
;
START STX SLOT
;
; Move hires page one into RAMcard
;
JSR MOVHIRES
;
; Set fastload parms
;
LDY #0
STY LASTRK
INY
STY TRACK
;
; Load Title page
;
LDA #$90
JSR READSEQU
;
; Show the title page
;
JSR $9000
BIT $C057
BIT $C052
BIT $C050
;
; Display version
;
LDA #"B"
STA SCREEN
;
; Load DOS
;
LDA #$A0
JSR READSEQU
LDA #$B0
JSR READSEQU
;
; Initialize DOS variables
;
LDX SLOT
STX $B7E9
STX $B7F7
;
; Set LASTRACK screen holes
;
JSR $BE8E
LDA LASTRK
STA $478,Y
LDA #$A0
STA $4F8,Y
;
; Set I/O hooks to reboot
;
LDY #OUTVEC
LDA /OUTVEC
STY $36
STA $37
LDY #INPVEC
LDA /INPVEC
STY $38
STA $39
;
; Install reset routine
;
LDY #RESETLEN-1
^0 LDA RESET,Y
STA RESETVEC,Y
DEY
BPL <0
;
; Set reset vector
;
LDY #RESETVEC
LDA /RESETVEC
STY $3F2
STA $3F3
EOR #$A5
STA $3F4
;
LDX #$FF
TXS
;
; HELLO program type:
;
; $34:Binary, $06:Applesoft
;
LDA #$34
STA $9E42
;
; <ESC> pressed? YES--backup!
;
LDA $C000
BIT $C010
CMP #$9B
BNE >2
LDA $1000
BEQ >2
JMP $1000
;
; JMP to DOS
;
^2 JSR CHEK128K
JMP $9D84
;-----------
;
; Move HIRES picture into RAMcard
;
MOVHIRES LDY #$00
LDA #$20
STY TMP0
STA TMP1
LDX #$03
JSR >0
LDX #$0B
;
^0 LDA $C080,X
LDA $C080,X
LDX #$10
LDY #$00
LDA #$D0
STY TMP2
STA TMP3
^1 LDA (TMP0),Y
STA (TMP2),Y
LDA #0
STA (TMP0),Y
INY
BNE <1
INC TMP1
INC TMP3
DEX
BNE <1
STA $C081
RTS
;-----------
;
; Check for 128k memory
;
CHEK128K STA $C081
LDA $FBB3
CMP #6
BNE NOT128K
;
BIT $C017
BMI NOT128K
;
LDX #CHECKERL-1
^0 LDA CHECKER,X
STA $80,X
DEX
BPL <0
;
JSR $80
BCS NOT128K
SEC
HEX 24
;
NOT128K CLC
ROR HAS128K
RTS
;
; Zero page routine
;
CHECKER LDA #$EE
STA $C005
STA $C003
STA $0800
LDA $0C00
CMP #$EE
BNE >0
ASL $0C00
LDA $0800
CMP $0C00
BEQ >1
^0 CLC
^1 STA $C004
STA $C002
RTS
CHECKERL = *-CHECKER
;-----------
;
; RESET VECTOR
;
RESET:
PHS $280
;
RESETVEC STA $C081
JSR $FB2F
JSR $FC58
LDY #0
RESET0 TYA
RESET1 STA $0800,Y
INY
BNE RESET1
INC RESET1+2
LDA RESET1+2
CMP #$C0
BLT RESET0
STA $3F3
STA $3F4
JMP ($FFFC)
;
RESETLEN = *-RESETVEC
DPH
;-----------
;
;
;
USR "O:BOOT2",ORG
END