Files
open-roms/src/basic/print/list_single_line.s
T

302 lines
4.9 KiB
ArmAsm

;; #LAYOUT# STD * #TAKE
;; #LAYOUT# CRT BASIC_1 #TAKE
;; #LAYOUT# M65 BASIC_1 #TAKE
;; #LAYOUT# * BASIC_0 #TAKE
;; #LAYOUT# * * #IGNORE
list_single_line:
!ifdef SEGMENT_M65_BASIC_0 {
jsr map_BASIC_1
jsr (VB1__list_single_line)
jmp map_NORMAL
} else ifdef SEGMENT_CRT_BASIC_0 {
jsr map_BASIC_1
jsr JB1__list_single_line
jmp map_NORMAL
} else {
; Print line number - in a new line
jsr print_return
ldy #3
!ifdef CONFIG_MB_M65 {
jsr peek_via_OLDTXT
} else ifdef ROM_LAYOUT_CRT {
jsr peek_via_OLDTXT
} else ifdef CONFIG_MEMORY_MODEL_60K {
jsr peek_under_roms
} else ifdef CONFIG_MEMORY_MODEL_46K_OR_50K {
jsr peek_under_roms_via_OLDTXT
} else { ; CONFIG_MEMORY_MODEL_38K
lda (OLDTXT),y
}
pha
dey
!ifdef CONFIG_MB_M65 {
jsr peek_via_OLDTXT
} else ifdef ROM_LAYOUT_CRT {
jsr peek_via_OLDTXT
} else ifdef CONFIG_MEMORY_MODEL_60K {
jsr peek_under_roms
} else ifdef CONFIG_MEMORY_MODEL_46K_OR_50K {
jsr peek_under_roms_via_OLDTXT
} else { ; CONFIG_MEMORY_MODEL_38K
lda (OLDTXT),y
}
tax
pla
jsr print_integer
jsr print_space
; Iterate through printing out the line
; contents
lda #0
sta QTSW
ldy #4
list_print_loop:
!ifdef CONFIG_MB_M65 {
jsr peek_via_OLDTXT
} else ifdef ROM_LAYOUT_CRT {
jsr peek_via_OLDTXT
} else ifdef CONFIG_MEMORY_MODEL_60K {
ldx #<OLDTXT
jsr peek_under_roms
cmp #$00
} else ifdef CONFIG_MEMORY_MODEL_46K_OR_50K {
jsr peek_under_roms_via_OLDTXT
cmp #$00
} else { ; CONFIG_MEMORY_MODEL_38K
lda (OLDTXT),y
}
bne @1
rts ; end of line
@1:
cmp #$22
bne list_not_quote
lda QTSW
eor #$FF
sta QTSW
lda #$22
jmp list_is_literal
list_not_quote:
; Check quote mode, and display as literal if required
ldx QTSW
bne list_is_literal
cmp #$FF
beq list_is_pi
; Check for extended BASIC tokens
cmp #$01
beq list_display_token_01
!ifndef HAS_SMALL_BASIC {
cmp #$02
beq list_display_token_02
}
!ifdef CONFIG_MB_M65 {
cmp #$03
beq list_display_token_03
}
; Check for literals
cmp #$7F
bcc list_is_literal
; Display a token - V2 dialect
list_display_token_V2:
; Save registers
tax
pha
+phy_trash_a
; Subtract $80 from token to get offset in token list
txa
and #$7F
tax
; Check if token is known
cpx #TK__MAXTOKEN_keywords_V2
bcs list_display_unknown_token
; Now ask for it to be printed
jsr print_packed_keyword_V2
; FALLTROUGH
list_token_displayed:
; Restore registers
+ply_trash_a
pla
cmp #$8F
bne list_not_rem
; REM command locks quote flag on until the end of the line, allowing
; funny characters in REM statements without problem.
sta QTSW ; Any value other than $00 or $FF will lock quote mode on, so the token value of REM is fine here
; FALLTHROUGH
list_not_rem:
iny
bne list_print_loop ; branch always
list_is_pi:
lda #$7E
; FALLTROUGH
list_is_literal:
pha
bit QTSW
bpl list_is_literal_known ; in quote mode every character is allowed
and #$7F
cmp #$12
beq list_is_literal_known ; enabling/disabling reverse mode is allowed
and #%01100000
bne list_is_literal_known
pla
; FALLTROUGH
list_is_unknown:
+phy_trash_a
lda #<str_rev_question
ldy #>str_rev_question
jsr STROUT
+ply_trash_a
+bra list_is_literal_known_cont
list_is_literal_known:
pla
jsr JCHROUT
; FALLTROUGH
list_is_literal_known_cont:
iny
+bne list_print_loop
rts ; end of line
list_display_unknown_token:
pla
pla
+bra list_is_unknown
list_display_token_01:
; Display a 2-byte token - for extended BASIC
jsr list_fetch_subtoken
; Check if token is known
cpx #TK__MAXTOKEN_keywords_01
bcs list_is_unknown
; Now ask for it to be printed
+phy_trash_a
jsr print_packed_keyword_01
; FALLTROUGH
list_display_token_ext_done:
+ply_trash_a
; Next iteration
+bra list_not_rem
!ifndef HAS_SMALL_BASIC {
list_display_token_02:
; Display a 2-byte token - for extended BASIC
jsr list_fetch_subtoken
; Check if token is known
cpx #TK__MAXTOKEN_keywords_02
bcs list_is_unknown
; Now ask for it to be printed
+phy_trash_a
jsr print_packed_keyword_02
+bra list_display_token_ext_done
}
!ifdef CONFIG_MB_M65 {
list_display_token_03:
; Display a 2-byte token - for extended BASIC
jsr list_fetch_subtoken
; Check if token is known
cpx #TK__MAXTOKEN_keywords_03
bcs list_is_unknown
; Now ask for it to be printed
+phy_trash_a
jsr print_packed_keyword_03
+bra list_display_token_ext_done
}
list_fetch_subtoken:
; Fetch the sub-token
iny
!ifdef CONFIG_MB_M65 {
jsr peek_via_OLDTXT
} else ifdef ROM_LAYOUT_CRT {
jsr peek_via_OLDTXT
} else ifdef CONFIG_MEMORY_MODEL_60K {
ldx #<OLDTXT
jsr peek_under_roms
cmp #$00
} else ifdef CONFIG_MEMORY_MODEL_46K_OR_50K {
jsr peek_under_roms_via_OLDTXT
cmp #$00
} else { ; CONFIG_MEMORY_MODEL_38K
lda (OLDTXT),y
}
; Subtract $1 from token to get offset in token list
tax
beq list_fetch_subtoken_fail
dex
rts
list_fetch_subtoken_fail:
dey
jmp list_display_unknown_token
} ; ROM layout