VM02/src/loader.s

420 lines
6.3 KiB
ArmAsm
Executable File

;*
;* JAVA LOADER FOR 6502
;*
.MACRO PSTR MSG
JSR PUTS
.ASCIIZ MSG
.ENDMACRO
.MACRO PSTRLN MSG
JSR PUTSLN
.ASCIIZ MSG
.ENDMACRO
;*
;* HARDWARE ADDRESSES
;*
KEYBD = $C000
CLRKBD = $C010
SPKR = $C030
ROMIN = $C081
LCBNK2 = $C083
LCBNK1 = $C08B
;*
;* HANDY ROM ROUTINES
;*
MONITOR = $FF65
HOME = $FC58
BELL = $FF3A
COUT = $FDED
CROUT = $FD8E
CROUT1 = $FD8B
PRBLNK = $F948
PRBL2 = $F94A
PRBYTE = $FDDA
PRNTAX = $F941
GETLN = $FD6A
;*
;* PRODOS
;*
PRODOS = $BF00
DEVCNT = $BF31 ; GLOBAL PAGE DEVICE COUNT
DEVLST = $BF32 ; GLOBAL PAGE DEVICE LIST
MACHID = $BF98 ; GLOBAL PAGE MACHINE ID BYTE
RAMSLOT = $BF26 ; SLOT 3, DRIVE 2 IS /RAM'S DRIVER VECTOR
NODEV = $BF10
;*
;* ZERO PAGE LOCATIONS
;*
SRCADDR = $DA
DSTADDR = $DC
TMP = $DE
TMPTR = $DE
;*
;* LOW MEMORY AREAS
;*
PBUFF = $0800 ; PARAMETER BUFFER
RLOADER = $0C00 ; RELOCATED LOADER
.CODE
;*
;* LOAD 64K VM02 OR 128K VM02E
;*
ENTRY: JMP LOADER ; SET UP ARG PASSING FROM LAUNCHER
.BYTE $EE,$EE
.BYTE 65
ARGSTR: .BYTE 0
.RES 64
LOADER: LDA #26 ; DEACTIVATE 80 COL CARDS
JSR COUT ; THIS SHOULD BE IN CONSOLE DEACTIVATE
LDA #'1'|$80
JSR COUT
LDA #8 ; PRINT BACKSPACE IN CASE 1 SHOWED UP
JSR COUT
LDA #' '|$80
JSR COUT
LDA #21
JSR COUT
BIT $C054 ; SET TEXT MODE
BIT $C051
BIT $C058
STA $C05F ; TURN OFF 80 COL ON IIE & IIC
JSR HOME
SEI ; DISABLE /RAM
LDA MACHID
AND #$30
CMP #$30
BNE RAMDONE
INC VM02FILE ; LOAD 128K VERSION OF VM02
LDA RAMSLOT
CMP NODEV
BNE RAMCONT
LDA RAMSLOT+1
CMP NODEV+1
BEQ RAMDONE
RAMCONT: LDY DEVCNT
RAMLOOP: LDA DEVLST,Y
AND #$F3
CMP #$B3
BEQ GETLOOP
DEY
BPL RAMLOOP
BMI RAMDONE
GETLOOP: LDA DEVLST+1,Y
STA DEVLST,Y
BEQ RAMEXIT
INY
BNE GETLOOP
RAMEXIT: LDA NODEV
STA RAMSLOT
LDA NODEV+1
STA RAMSLOT+1
DEC DEVCNT
RAMDONE: CLI
LDA #<RELOC
LDX #>RELOC
JSR MEMSRC
LDA #<RLOADER
LDX #>RLOADER
JSR MEMDST
LDA #<(BLOAD_END-MOUSE_INIT)
LDX #>(BLOAD_END-MOUSE_INIT)
JSR MEMCPY
LDA #<VM02FILE
LDX #>VM02FILE
JSR MEMSRC
LDA #<FILENAME
LDX #>FILENAME
JSR MEMDST
LDA VM02FILE
CLC
ADC #$01
LDX #$00
JSR MEMCPY
LDY #$01 ; STUFF ARG STRING INTO PARAMETER BUFFER
LDA ARGSTR
STA PBUFF
: LDA ARGSTR,Y
ORA #$80
STA PBUFF,Y
CPY ARGSTR
BCS :+
INY
BNE :-
: JMP RLOADER
VM02FILE: .BYTE 4,"VM02E" ; JUST INC VM02FILE TO LOAD BIGMEM VERSION
;*
;* PRINT ASCIIZ STRING FOLLOWING JSR PUTS
;*
PUTSLN: LDX #$0D
BNE :+
PUTS: LDX #$00
: PLA
STA TMP
PLA
STA TMP+1
LDY #$00
PUTS_LP: INC TMP
BNE :+
INC TMP+1
: LDA (TMP),Y
BEQ PUTS_EXIT
JSR COUT
JMP PUTS_LP
PUTS_EXIT: TXA
BEQ :+
JSR COUT
: LDA TMP+1
PHA
LDA TMP
PHA
RTS
;*
;* PRINT STRING IN AX
;*
PRSTR: STA TMP
STX TMP+1
LDY #$00
LDA (TMP),Y
TAX
INY
PRSTR_LP: LDA (TMP),Y
JSR COUT
INY
DEX
BNE PRSTR_LP
RTS
PRSTRLN: JSR PRSTR
JSR CROUT
RTS
;*
;* WAIT FOR KEYPRESS
;*
KBWAIT: LDA KEYBD
BPL KBWAIT
LDA CLRKBD
RTS
;*
;* SET MEMORY SRC OPERAND
;* ENTRY: AX = ADDRESS
;*
MEMSRC: STA SRCADDR
STX SRCADDR+1
RTS
;*
;* SET MEMORY DST OPERAND
;* ENTRY: AX = ADDRESS
;*
MEMDST: STA DSTADDR
STX DSTADDR+1
RTS
;*
;* COPY MEMORY
;*
;* ENTRY: SRCADDR = SOURCE ADDRESS
;* DSTADDR = DESTINATION ADDRESS
;* AX = LENGTH IN BYTES
;*
MEMCPY: TAY
LDA SRCADDR+1
CMP DSTADDR+1
BEQ :+
BCS FORCPY
BCC REVCPY
: LDA SRCADDR
CMP DSTADDR
BCS FORCPY
REVCPY: TXA ; REVERSE DIRECTION COPY
CLC
ADC SRCADDR+1
STA SRCADDR+1
TXA
CLC
ADC DSTADDR+1
STA DSTADDR+1
INX
CPY #$00
BEQ :++
DEY
BEQ :+
REVCPY_LOOP: LDA (SRCADDR),Y
STA (DSTADDR),Y
DEY
BNE REVCPY_LOOP
: LDA (SRCADDR),Y ; DO ONE MORE COPY, Y = #$00
STA (DSTADDR),Y ; (THIS MAKES FOR A SLIGHTLY FASTER INNER LOOP)
: DEY ; NOW Y = #$FF
DEX
BEQ :+
DEC SRCADDR+1
DEC DSTADDR+1
BNE REVCPY_LOOP
: RTS
FORCPY: TYA ; FORWARD DIRECTION COPY
EOR #$FF
TAY
INY
BNE :+
DEX
: LDA SRCADDR
STY SRCADDR
SEC
SBC SRCADDR
STA SRCADDR
LDA SRCADDR+1
SBC #$00
STA SRCADDR+1
LDA DSTADDR
STY DSTADDR
SEC
SBC DSTADDR
STA DSTADDR
LDA DSTADDR+1
SBC #$00
STA DSTADDR+1
INX
FORCPY_LOOP: LDA (SRCADDR),Y
STA (DSTADDR),Y
INY
BNE FORCPY_LOOP
DEX
BEQ :+
INC SRCADDR+1
INC DSTADDR+1
BNE FORCPY_LOOP
: RTS
;*
;* RELOC FROM HERE
;*
RELOC:
.ORG RLOADER
;*
;* MOUSE INIT ROUTINES. MUST HAPPEN HERE BECAUSE II/II+ WILL CLEAR $2000-$4000 FOR
;* VBL CALCULATION
;*
MOUSE_INIT: SEI
LDX #$20 ; LOOK FOR MOUSE
LDA #$01
JSR SCAN_SLOTS
BCS BLOAD
STX INITMOUSE+2
STX SETMOUSE1+2
STX SETMOUSE2+2
LDY #$19
LDA (TMPTR),Y
STA INITMOUSE+1
LDY #$12
LDA (TMPTR),Y
STA SETMOUSE1+1
STA SETMOUSE2+1
LDX TMPTR+1
TXA
ASL
ASL
ASL
ASL
STA TMPTR
TAY
INITMOUSE: JSR $C400
LDX TMPTR+1
LDY TMPTR
LDA #$08 ; TURN MOUSE OFF, VBL ACTIVE
SETMOUSE1: JSR $C400
LDA #$00 ; TURN MOUSE OFF, VBL INACTIVE
SETMOUSE2: JSR $C400
;*
;* READ BINARY FILE
;* ENTRY: AX = POINTER TO FILE NAME/ADDRESS
;*
BLOAD: LDA #<FILENAME
STA OPENPARMS+1 ; SET FILENAME BUFFER
LDA #>FILENAME
STA OPENPARMS+2
LDA #$00 ; SET DATA ADDRESS
STA READPARMS+2
LDA #$10
STA READPARMS+3
JSR PRODOS
.BYTE $C8 ; OPEN FILE
.ADDR OPENPARMS
BCS :+
LDA OPENPARMS+5
STA GETEOFPARMS+1
STA READPARMS+1
STA CLOSEPARMS+1
JSR PRODOS
.BYTE $D1 ; GET EOF (FILE LEN)
.ADDR GETEOFPARMS
BCS :+
LDA GETEOFPARMS+2
STA READPARMS+4
LDA GETEOFPARMS+3
STA READPARMS+5
JSR PRODOS
.BYTE $CA ; READ FILE
.ADDR READPARMS
BCS :+
JSR PRODOS
.BYTE $CC ; CLOSE FILE
.ADDR CLOSEPARMS
: LDY #$00 ; STUFF ARG STRING INTO INPUT BUFFER
: LDA PBUFF,Y
STA $01FF,Y
CPY PBUFF
BEQ :+
INY
BNE :-
: LDX #$FE ; LEAVE BUFFER SIZE AT TOP OF STACK
TXS
JMP $1000 ; JUMP TO VM02
OPENPARMS: .BYTE $03
.ADDR $0000 ; PATH ADDR
.ADDR $B000 ; BUFF ADDR
.BYTE $00 ; REF NUM
GETEOFPARMS: .BYTE $02
.BYTE $00 ; REF NUM
.BYTE $00,$00,$00 ; EOF L/M/H
READPARMS: .BYTE $04
.BYTE $00 ; REF NUM
.ADDR $0000 ; DATA ADDR
.ADDR $0000 ; DATA LEN
.ADDR $0000 ; ACTUAL LEN
CLOSEPARMS: .BYTE $01
.BYTE $00 ; REF NUM
FILENAME: .RES 65
;
; SCAN SLOTS FOR MATCHING CARD ID
; ENTRY: A = START SLOT SCAN
; X = CARD ID
; EXIT: A = SLOT # :: C = 0
; X = SLOT PAGE
;
SCAN_SLOTS: ORA #$C0
STA TMPTR+1
LDA #$00
STA TMPTR
CHKSIG: LDY #$05
LDA (TMPTR),Y
CMP #$38 ; LOOK FOR PASCAL COMPAT SIG
BNE :+
LDY #$07
LDA (TMPTR),Y
CMP #$18
BNE :+
LDY #$0B
LDA (TMPTR),Y
CMP #$01
BNE :+
LDY #$0C
TXA ; LOOK FOR MATCHING ID
CMP (TMPTR),Y
BNE :+
LDA TMPTR+1
TAX
AND #$07
CLC
RTS
: INC TMPTR+1
LDA TMPTR+1
CMP #$C8
BCC CHKSIG
SEC
RTS
BLOAD_END = *