123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- .define Inn
- .sect .text
- .sect .rom
- .sect .data
- .sect .bss
- .sect .text
- ! This subroutine checks if a certain bit is set in a set
- ! of n bytes on top of the stack.
- Inn:
- stx ARTH ! save bit number (lowbyte)
- sta ARTH+1 ! save bit number (highbyte)
- and #0x80
- beq 1f
- lda #0 ! bit number is negative
- sta ARTH+2 ! make it zero
- beq 3f
- 1: txa
- and #0x07 ! get bit number mod 8
- tax
- lda #1
- cpx #0 ! bit number = 0
- beq 2f ! no shifting to right place
- 1: asl a ! shift left until bit is in place
- dex
- bne 1b
- 2: sta ARTH+2 ! bit is one in place
- ldx #3
- 1: lsr ARTH+1 ! shift left 3 times bit number (highbyte)
- ror ARTH ! shift left 3 times bit number (lowbyte)
- dex ! this is bit number div 8
- bne 1b ! which is byte number
- 3: lda SP+1
- ldx SP+2
- stx ADDR ! address of the set (lowbyte)
- sta ADDR+1 ! address of the set (highbyte)
- iny
- tya
- bne 2f
- inc SP+1
- 2: clc ! remove the set
- adc SP+2
- sta SP+2 ! new stackpointer (lowbyte)
- lda #0
- adc SP+1
- sta SP+1 ! new stackpointer (highbyte)
- ldy ARTH
- lda (ADDR),y ! load the byte in A
- bit ARTH+2 ! test bit
- bne 1f
- 3: lda #0 ! bit is zero
- tax
- rts
- 1: lda #0 ! bit is one
- ldx #1
- rts
|