343 lines
3.7 KiB
NASM
343 lines
3.7 KiB
NASM
|
;*
|
||
|
;* Read both game controllers in parallel
|
||
|
;*
|
||
|
GCREAD BIT GCSTROBE
|
||
|
LDY #$00
|
||
|
LDX #$00
|
||
|
LDA #GCMAX
|
||
|
GCLOOP BIT GC0
|
||
|
BPL +
|
||
|
INY
|
||
|
BNE ++ ; Timing
|
||
|
+ NOP
|
||
|
NOP
|
||
|
++ BIT GC1
|
||
|
BPL +
|
||
|
INX
|
||
|
BNE ++ ; Timing
|
||
|
+ NOP
|
||
|
NOP
|
||
|
++ SEC
|
||
|
SBC #$01
|
||
|
BNE GCLOOP
|
||
|
LDA GCPB1 ; Read GC buttons
|
||
|
ASL
|
||
|
LDA GCPB2
|
||
|
ROR
|
||
|
AND #$C0
|
||
|
RTS
|
||
|
;*
|
||
|
;* Text routines
|
||
|
;*
|
||
|
GOTOXY STX CH
|
||
|
STY CV
|
||
|
LDA TXT_TBLL,Y
|
||
|
STA TBAS1L
|
||
|
STA TBAS2L
|
||
|
LDA TXT_TBLH,Y
|
||
|
ORA #$04
|
||
|
STA TBAS1H
|
||
|
EOR #$0C
|
||
|
STA TBAS2H
|
||
|
RTS
|
||
|
NORMAL LDA #$FF
|
||
|
STA INVFLAG
|
||
|
RTS
|
||
|
INVERSE LDA #$3F
|
||
|
STA INVFLAG
|
||
|
RTS
|
||
|
FLASH LDA #$7F
|
||
|
STA INVFLAG
|
||
|
RTS
|
||
|
PUTXA PHA
|
||
|
TXA
|
||
|
JSR PUTA
|
||
|
PLA
|
||
|
PUTA PHA
|
||
|
LSR
|
||
|
LSR
|
||
|
LSR
|
||
|
LSR
|
||
|
TAX
|
||
|
LDA HEXCHR,X
|
||
|
JSR PUTC
|
||
|
PLA
|
||
|
AND #$0F
|
||
|
TAX
|
||
|
LDA HEXCHR,X
|
||
|
PUTC ORA #$80
|
||
|
AND INVFLAG
|
||
|
LDY CH
|
||
|
STA (TBAS1),Y
|
||
|
STA (TBAS2),Y
|
||
|
INC CH
|
||
|
RTS
|
||
|
PUTSXY JSR GOTOXY
|
||
|
PUTS TSX
|
||
|
LDA $101,X
|
||
|
STA LDCHR+1
|
||
|
LDA $102,X
|
||
|
STA LDCHR+2
|
||
|
LDX #$01
|
||
|
LDCHR LDA $1000,X
|
||
|
BEQ +
|
||
|
JSR PUTC
|
||
|
INX
|
||
|
BNE LDCHR
|
||
|
+ TXA
|
||
|
TSX
|
||
|
CLC
|
||
|
ADC $101,X
|
||
|
STA $101,X
|
||
|
BCC +
|
||
|
INC $102,X
|
||
|
+ RTS
|
||
|
HEXCHR !TEXT "0123456789ABCDEF"
|
||
|
;*
|
||
|
;* Fill screen with color
|
||
|
;*
|
||
|
GFILL LDX #$23
|
||
|
-- PHA
|
||
|
LDA TXT_TBLL,X
|
||
|
STA GBASL
|
||
|
LDA TXT_TBLH,X
|
||
|
ORA GPAGE
|
||
|
STA GBASH
|
||
|
PLA
|
||
|
LDY #39
|
||
|
- STA (GBASE),Y
|
||
|
DEY
|
||
|
BPL -
|
||
|
DEX
|
||
|
BPL --
|
||
|
RTS
|
||
|
;*
|
||
|
;* Plot X,Y with GCLR
|
||
|
;*
|
||
|
GPLOT TYA
|
||
|
PHA
|
||
|
LSR
|
||
|
TAY
|
||
|
LDA TXT_TBLL,Y
|
||
|
STA GPLOTA+1
|
||
|
STA GPLOTB+1
|
||
|
LDA TXT_TBLH,Y
|
||
|
ORA GPAGE
|
||
|
STA GPLOTA+2
|
||
|
STA GPLOTB+2
|
||
|
GPLOTA LDA $FFFF,X
|
||
|
BCC +
|
||
|
AND #$0F
|
||
|
STA TMP
|
||
|
LDA GCLR
|
||
|
AND #$F0
|
||
|
BCS ++
|
||
|
+ AND #$F0
|
||
|
STA TMP
|
||
|
LDA GCLR
|
||
|
AND #$0F
|
||
|
++ ORA TMP
|
||
|
GPLOTB STA $FFFF,X
|
||
|
-- PLA
|
||
|
TAY
|
||
|
RTS
|
||
|
;*
|
||
|
;* Plot horizontal line from X,Y to A,Y with GCLR
|
||
|
;*
|
||
|
GHLIN STA GHLRHT
|
||
|
TYA
|
||
|
PHA
|
||
|
LSR
|
||
|
TAY
|
||
|
LDA #$F0
|
||
|
BCC +
|
||
|
LDA #$0F
|
||
|
+ STA DSTMASK
|
||
|
EOR #$FF
|
||
|
STA SRCMASK
|
||
|
LDA TXT_TBLL,Y
|
||
|
STA GHLINA+1
|
||
|
STA GHLINB+1
|
||
|
LDA TXT_TBLH,Y
|
||
|
ORA GPAGE
|
||
|
STA GHLINA+2
|
||
|
STA GHLINB+2
|
||
|
GHLINA LDA $FFFF,X
|
||
|
AND DSTMASK
|
||
|
STA TMP
|
||
|
LDA GCLR
|
||
|
AND SRCMASK
|
||
|
ORA TMP
|
||
|
GHLINB STA $FFFF,X
|
||
|
CPX GHLRHT
|
||
|
BEQ --
|
||
|
INX
|
||
|
BNE GHLINA
|
||
|
GHLRHT !BYTE $00
|
||
|
;*
|
||
|
;* Fill rectangle fro X,Y to A,SCANLN with GCLR
|
||
|
;*
|
||
|
GRECT STX GRCTLFT
|
||
|
- PHA
|
||
|
JSR GHLIN
|
||
|
PLA
|
||
|
CPY SCANLN
|
||
|
BEQ +
|
||
|
LDX GRCTLFT
|
||
|
INY
|
||
|
BNE -
|
||
|
+ RTS
|
||
|
GRCTLFT !BYTE $00
|
||
|
;*
|
||
|
;* Swap rendered and displayed GR pages
|
||
|
;*
|
||
|
GSWAP LDA #$01
|
||
|
EOR CURPAGE
|
||
|
STA CURPAGE
|
||
|
TAX
|
||
|
LDA $C054,X
|
||
|
LDA PGBASE,X
|
||
|
STA GPAGE
|
||
|
RTS
|
||
|
;*
|
||
|
;* Multiply X by A, return X:A
|
||
|
;*
|
||
|
MUL8X8 LSR
|
||
|
STA TMP
|
||
|
LDA #$00
|
||
|
BCC + ; BIT 0
|
||
|
TXA
|
||
|
+ DEX ; Because carry will be set for ADC
|
||
|
STX TMP+1
|
||
|
LSR
|
||
|
ROR TMP
|
||
|
BCC + ; BIT 1
|
||
|
ADC TMP+1
|
||
|
+ LSR
|
||
|
ROR TMP
|
||
|
BCC + ; BIT 2
|
||
|
ADC TMP+1
|
||
|
+ LSR
|
||
|
ROR TMP
|
||
|
BCC + ; BIT 3
|
||
|
ADC TMP+1
|
||
|
+ LSR
|
||
|
ROR TMP
|
||
|
BCC + ; BIT 4
|
||
|
ADC TMP+1
|
||
|
+ LSR
|
||
|
ROR TMP
|
||
|
BCC + ; BIT 5
|
||
|
ADC TMP+1
|
||
|
+ LSR
|
||
|
ROR TMP
|
||
|
BCC + ; BIT 6
|
||
|
ADC TMP+1
|
||
|
+ LSR
|
||
|
ROR TMP
|
||
|
BCC + ; BIT 7
|
||
|
ADC TMP+1
|
||
|
+ LSR
|
||
|
TAX
|
||
|
LDA TMP
|
||
|
ROR
|
||
|
RTS
|
||
|
;*
|
||
|
;* Signed multiply 8x8
|
||
|
;*
|
||
|
SMUL8X8 STX SIGN
|
||
|
PHA
|
||
|
EOR SIGN
|
||
|
STA SIGN
|
||
|
CPX #$80
|
||
|
BCC +
|
||
|
TXA
|
||
|
EOR #$FF
|
||
|
TAX
|
||
|
INX
|
||
|
+ PLA
|
||
|
CMP #$80
|
||
|
BCC +
|
||
|
EOR #$FF
|
||
|
ADC #$00
|
||
|
+ JSR MUL8X8
|
||
|
ASL SIGN ; SIGN(RESULT) = SIGN(MULTIPLCAND) ^ SIGN(MULTIPLIER)
|
||
|
BCC +
|
||
|
EOR #$FF
|
||
|
ADC #$00
|
||
|
PHA
|
||
|
TXA
|
||
|
EOR #$FF
|
||
|
ADC #$00
|
||
|
TAX
|
||
|
PLA
|
||
|
+ RTS
|
||
|
;*
|
||
|
;* Unsigned divide, return X:A
|
||
|
;*
|
||
|
DIV LDX #$00
|
||
|
STX TMP ; REMNDRL
|
||
|
STX TMP+1 ; REMNDRH
|
||
|
; LDA DVSR+1 ; Check for divide by zero
|
||
|
; ORA DVSR
|
||
|
LDA DVDND+1 ; Check for zero divide
|
||
|
ORA DVDND
|
||
|
BEQ ++
|
||
|
LDY #$11 ; #BITS+1
|
||
|
- ASL DVDND
|
||
|
ROL DVDND+1
|
||
|
DEY
|
||
|
BCC -
|
||
|
- ROL TMP ; REMNDRL
|
||
|
ROL TMP+1 ; REMNDRH
|
||
|
LDA TMP ; REMNDRL
|
||
|
CMP DVSR
|
||
|
LDA TMP+1 ; REMNDRH
|
||
|
SBC DVSR+1
|
||
|
BCC +
|
||
|
STA TMP+1 ; REMNDRH
|
||
|
LDA TMP ; REMNDRL
|
||
|
SBC DVSR
|
||
|
STA TMP ; REMNDRL
|
||
|
SEC
|
||
|
+ ROL DVDND
|
||
|
ROL DVDND+1
|
||
|
DEY
|
||
|
BNE -
|
||
|
LDA DVDND
|
||
|
LDX DVDND+1
|
||
|
++ RTS
|
||
|
;*
|
||
|
;* Signed divide: return X:A
|
||
|
;*
|
||
|
SDIV LDX DVSR+1
|
||
|
STX SIGN
|
||
|
BPL +
|
||
|
LDA DVSR
|
||
|
JSR NEG
|
||
|
STX DVSR+1
|
||
|
STA DVSR
|
||
|
+ LDX DVDND+1
|
||
|
BPL +
|
||
|
TXA
|
||
|
EOR SIGN
|
||
|
STA SIGN
|
||
|
LDA DVDND
|
||
|
JSR NEG
|
||
|
STX DVDND+1
|
||
|
STA DVDND
|
||
|
+ JSR DIV
|
||
|
ASL SIGN ; SIGN(RESULT) = SIGN(DIVIDEND) ^ SIGN(DIVISOR)
|
||
|
BCC +
|
||
|
NEG STA TMP
|
||
|
STX TMP+1
|
||
|
LDA #$00
|
||
|
SEC
|
||
|
SBC TMP
|
||
|
STA TMP
|
||
|
LDA #$00
|
||
|
SBC TMP+1
|
||
|
TAX
|
||
|
LDA TMP
|
||
|
+ RTS
|