mirror of https://github.com/dschmenk/VM02.git
420 lines
6.3 KiB
ArmAsm
Executable File
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 = * |