franklin/ace2000_c000_cfff.s

2197 lines
44 KiB
ArmAsm
Raw Normal View History

2021-11-12 04:09:01 +00:00
;;; ============================================================
;;; Franklin ACE 2X00 ROM V6.0 Disassembly
;;;
;;; First $1000 bytes of U2 ROM (usually banked in $C000-$CFFF)
;;;
;;; Build with CC65's ca65 assembler
;;; ============================================================
2021-11-06 00:44:04 +00:00
.setcpu "65C02"
2021-11-06 01:21:23 +00:00
.include "opcodes.inc"
2021-11-07 20:52:15 +00:00
.feature string_escapes
2021-11-06 00:44:04 +00:00
2021-11-12 04:09:01 +00:00
;;; ============================================================
;;; Patches
;;; Set to 1 to include fixes for:
2021-11-10 02:17:23 +00:00
;;; * MouseText mode failing to exist on $18 output.
;;; * CH not working to set horizontal cursor position.
2021-11-11 07:17:24 +00:00
;;; * MouseText displaying if $40-$5F sent to COUT.
2021-11-10 02:17:23 +00:00
INCLUDE_PATCHES = 0
2021-11-12 04:09:01 +00:00
;;; ============================================================
;;; Equates
2021-11-06 03:24:49 +00:00
;;; Zero Page
2021-11-06 00:44:04 +00:00
WNDLFT := $20
WNDWDTH := $21
WNDTOP := $22
WNDBTM := $23
CH := $24
CV := $25
BASL := $28
BASH := $29
BAS2L := $2A
BAS2H := $2B
2021-11-06 01:21:23 +00:00
INVFLG := $32
2021-11-08 05:16:34 +00:00
CSWL := $36
CSWH := $37
KSWL := $38
KSWH := $39
2021-11-06 01:21:23 +00:00
A1L := $3C
A1H := $3D
A2L := $3E
A2H := $3F
A4L := $42
A4H := $43
RNDL := $4E
RNDH := $4F
2021-11-06 03:24:49 +00:00
;;; Page 3 Vectors
XFERVEC := $3ED
;;; Screen Holes
2021-11-06 01:21:23 +00:00
SAVEA := $4F8
SAVEX := $578
SAVEY := $478
2021-11-06 00:44:04 +00:00
2021-11-10 04:55:40 +00:00
SAVECV := $6F8
SAVECH := $778
2021-11-06 00:44:04 +00:00
OLDCH := $47B
MODE := $4FB
2021-11-06 03:00:40 +00:00
;; Bit 7 = Escape Mode
;; Bit 6 = MouseText active
;; Bit 5 = ??? set when "normal"
;; Bit 4 = ??? set when "normal"
;; Bit 3 = ??? unused ???
;; Bit 2 = ??? unused ???
;; Bit 1 = ??? used for ???
;; Bit 0 = ??? used for ???
M_ESC = %10000000
M_MOUSE = %01000000
M_NORMAL= %00110000
2021-11-10 02:17:23 +00:00
M_INACTIVE = $FF ; When firmware is inactive
2021-11-06 03:00:40 +00:00
2021-11-06 00:44:04 +00:00
OURCH := $57B
OURCV := $5FB
2021-11-07 03:56:03 +00:00
CHAR := $67B
2021-11-06 00:44:04 +00:00
XCOORD := $6FB
TEMP1 := $77B ; Unused
OLDBASL := $77B
TEMP2 := $7FB
OLDBASH := $7FB
2021-11-06 03:24:49 +00:00
;;; I/O Soft Switches
2021-11-06 00:44:04 +00:00
KBD := $C000
CLR80COL:= $C000
SET80COL:= $C001
RDMAINRAM := $C002
RDCARDRAM := $C003
WRMAINRAM := $C004
WRCARDRAM := $C005
ALTZPOFF:= $C008
ALTZPON := $C009
CLR80VID:= $C00C
SET80VID:= $C00D
CLRALTCHAR := $C00E
SETALTCHAR := $C00F
KBDSTRB := $C010
RDLCBNK2:= $C011
RDLCRAM := $C012
RDRAMRD := $C013
RDRAMWRT:= $C014
RD80COL := $C018
RDTEXT := $C01A
ALTCHARSET := $C01E
RD80VID := $C01F
TXTPAGE1:= $C054
TXTPAGE2:= $C055
ROMIN := $C081
ROMIN2 := $C082
LCBANK2 := $C083
LCBANK1 := $C08B
2021-11-06 03:24:49 +00:00
;;; Documented Firmware Entry Points
C3KeyIn := $C305
C3COut1 := $C307
AUXMOVE := $C311
XFER := $C314
CLRROM := $CFFF
;;; Monitor ROM
2021-11-06 00:44:04 +00:00
BELLB := $FBE2
SETWND := $FB4B
SETKBD := $FE89
SETVID := $FE93
MON_VTAB:= $FC22
CLREOP := $FC42
HOME := $FC58
CLREOL := $FC9C
;;; ============================================================
2021-11-12 04:09:01 +00:00
.org $C000
;;; ============================================================
;;; Page $C0 - Unused (garbage data?)
.byte $80
.byte $2C
.byte $80
.byte $03
nop
pha
pla
pha
pla
clc
clv
pha
phx
phy
.byte $8D
.byte $79
.byte $06
.byte $8D
.byte $FF
.byte $CF
sta $C079
.byte $50
.byte $0B
.byte $A2
rmb0 $86
rol $A2,x
.byte $C1
stx $37
jsr $B000
jsr $B02C
sta $C078
ply
plx
pla
rts
bit $C12D
bra $C00B
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
brk
bbs7 $FF,$C0D3
brk
bbs7 $FF,$C0D7
brk
bbs7 $FF,$C0DB
brk
bbs7 $FF,$C0DF
brk
bbs7 $FF,$C0E3
brk
bbs7 $FF,$C0E7
brk
bbs7 $FF,$C0EB
brk
bbs7 $FF,$C0EF
brk
bbs7 $FF,$C0F3
brk
bbs7 $FF,$C0F7
brk
bbs7 $FF,$C0FB
brk
bbs7 $FF,$C0FF
brk
;;; ============================================================
;;; Page $C1 - Parallel Port Firmware
LC100: lda $24
pha
lda $22
sta $25
stz $24
jsr MON_VTAB
LC10C: jsr $FA37 ; ???
ldy $29
sty $2B
ldy $28
sty $2A
lda $23
beq LC151
dec a
cmp $25
beq LC151
bcc LC151
inc $25
jsr MON_VTAB
ldy $21
dey
bit RD80VID
LC12D: bmi LC138
LC12F: lda ($28),y
sta ($2A),y
dey
bpl LC12F
bra LC10C
LC138: tya
lsr a
tay
LC13B: bit TXTPAGE1
lda ($28),y
sta ($2A),y
bit TXTPAGE2
lda ($28),y
sta ($2A),y
dey
bpl LC13B
bit TXTPAGE1
bra LC10C
LC151: stz $24
jsr CLREOL
plx
stx $24
jmp MON_VTAB
;;; ============================================================
.res $C300 - *, 0
;;; ============================================================
;;; Page $C3 - Enhanced 80 Column Firmware
2021-11-06 00:44:04 +00:00
2021-11-06 01:21:23 +00:00
;; Init
2021-11-06 00:44:04 +00:00
LC300: bit SETV ; V = init
2021-11-08 05:16:34 +00:00
bra MainEntry
2021-11-06 00:44:04 +00:00
2021-11-06 01:21:23 +00:00
;; Input
2021-11-06 03:24:49 +00:00
.assert * = C3KeyIn, error, "Entry point mismatch"
2021-11-06 00:44:04 +00:00
LC305: sec
2021-11-06 01:21:23 +00:00
.byte OPC_BCC ; never taken; skip next byte
;; Output
2021-11-06 03:24:49 +00:00
.assert * = C3COut1, error, "Entry point mismatch"
2021-11-06 01:21:23 +00:00
LC307: clc
2021-11-06 00:44:04 +00:00
clv
2021-11-08 05:16:34 +00:00
bra MainEntry
2021-11-06 00:44:04 +00:00
;; Signature bytes
.byte $01, $88
;; Pascal 1.1 Firmware Protocol Table
.byte <JPINIT
.byte <JPREAD
.byte <JPWRITE
.byte <JPSTAT
;; AUXMOVE
.assert * = AUXMOVE, error, "Entry point mismatch"
2021-11-06 03:24:49 +00:00
jmp JumpAuxMove
2021-11-06 00:44:04 +00:00
;; XFER
.assert * = XFER, error, "Entry point mismatch"
php
2021-11-06 03:24:49 +00:00
bit CLRROM
2021-11-06 00:44:04 +00:00
plp
2021-11-06 03:24:49 +00:00
jmp DoXfer
2021-11-06 00:44:04 +00:00
2021-11-06 01:21:23 +00:00
;;; ============================================================
;;; Pascal Entry Points
2021-11-06 03:24:49 +00:00
JPINIT: bit CLRROM
jmp PascalInit
2021-11-06 00:44:04 +00:00
2021-11-06 03:24:49 +00:00
JPREAD: bit CLRROM
jmp PascalRead
2021-11-06 00:44:04 +00:00
2021-11-06 03:24:49 +00:00
JPWRITE:bit CLRROM
jmp PascalWrite
2021-11-06 00:44:04 +00:00
2021-11-06 03:24:49 +00:00
JPSTAT: bit CLRROM
jmp PascalStatus
2021-11-06 00:44:04 +00:00
2021-11-06 03:24:49 +00:00
JumpAuxMove:
bit CLRROM
jmp DoAuxMove
2021-11-06 00:44:04 +00:00
2021-11-06 01:21:23 +00:00
;;; ============================================================
;;; Main Entry Points
2021-11-08 05:16:34 +00:00
MainEntry:
sta CLRROM
2021-11-06 01:21:23 +00:00
sta SAVEA
stx SAVEX
sty SAVEY
2021-11-06 00:44:04 +00:00
pha
2021-11-09 17:02:08 +00:00
bvc l1
2021-11-06 00:44:04 +00:00
;; Init firmware
2021-11-06 00:44:04 +00:00
lda #<LC305
2021-11-08 05:16:34 +00:00
sta KSWL
2021-11-06 00:44:04 +00:00
ldx #>LC305
2021-11-08 05:16:34 +00:00
stx KSWH
lda #<LC307
sta CSWL
stx CSWH
2021-11-06 00:44:04 +00:00
jsr LC800
clc
2021-11-09 17:02:08 +00:00
l1: php
2021-11-06 00:44:04 +00:00
bit RD80VID
2021-11-09 17:02:08 +00:00
bpl l2
2021-11-06 00:44:04 +00:00
lsr WNDWDTH
asl WNDWDTH
sta SET80COL
2021-11-09 04:59:50 +00:00
;; NOTE: In ACE 500 ROM, the below is patched to
;; address the CH/OURCH issue.
2021-11-10 02:17:23 +00:00
.if !INCLUDE_PATCHES
2021-11-06 00:44:04 +00:00
lda OURCH
2021-11-10 02:17:23 +00:00
.else
jsr Patch1
.endif
2021-11-06 00:44:04 +00:00
sta CH
2021-11-09 04:59:50 +00:00
2021-11-09 17:02:08 +00:00
l2: plp
2021-11-06 00:44:04 +00:00
pla
bcs l3 ; input or output?
2021-11-11 05:07:34 +00:00
;; Output
jsr OutputChar
2021-11-09 17:02:08 +00:00
bra l9
2021-11-06 00:44:04 +00:00
;; Input
2021-11-09 17:02:08 +00:00
l3: ldx SAVEX
beq l4
2021-11-06 00:44:04 +00:00
dex
lda $0678
cmp #$88 ; left?
2021-11-09 17:02:08 +00:00
beq l4
2021-11-06 00:44:04 +00:00
cmp $0200,x
2021-11-09 17:02:08 +00:00
bne l7
2021-11-06 00:44:04 +00:00
sta $0200,x
2021-11-09 17:02:08 +00:00
l4: jsr LC877
2021-11-06 00:44:04 +00:00
cmp #$9B ; escape?
2021-11-06 03:00:40 +00:00
beq EscapeMode
2021-11-06 00:44:04 +00:00
cmp #$8D ; return?
2021-11-09 17:02:08 +00:00
bne l5
2021-11-06 00:44:04 +00:00
pha
jsr DoClearEOL
pla
2021-11-09 17:02:08 +00:00
l5: cmp #$95 ; right?
bne l6
2021-11-06 00:44:04 +00:00
jsr LCEBE
ora #$80
cmp #$A0 ; non-control char
2021-11-09 17:02:08 +00:00
bcs l6
2021-11-06 00:44:04 +00:00
ora #$40
2021-11-09 17:02:08 +00:00
l6: sta $0678
bra l8
2021-11-06 00:44:04 +00:00
2021-11-09 17:02:08 +00:00
l7: jsr LC850
2021-11-06 00:44:04 +00:00
stz $0678
2021-11-09 17:02:08 +00:00
l8: bra l10
2021-11-06 00:44:04 +00:00
2021-11-09 17:02:08 +00:00
l9: lda SAVEA
l10: ldx SAVEX
2021-11-06 00:44:04 +00:00
ldy CH
2021-11-10 02:17:23 +00:00
.if !INCLUDE_PATCHES
2021-11-06 00:44:04 +00:00
sty OURCH
2021-11-10 02:17:23 +00:00
.else
jsr Patch2
.endif
2021-11-06 01:21:23 +00:00
ldy SAVEY
2021-11-06 00:44:04 +00:00
SETV: rts ; has V flag set
2021-11-06 03:00:40 +00:00
;;; ============================================================
;;; Escape Mode
EscapeMode:
lda #M_ESC
tsb MODE
2021-11-06 00:44:04 +00:00
jsr LC850
2021-11-07 20:52:15 +00:00
jsr ProcessEscapeModeKey
2021-11-06 00:44:04 +00:00
cmp #$98 ; ctrl-x (clear)
2021-11-09 17:02:08 +00:00
beq l6
2021-11-06 03:00:40 +00:00
lda MODE ; still in escape mode?
bmi EscapeMode
2021-11-09 17:02:08 +00:00
bra l4
2021-11-06 00:44:04 +00:00
2021-11-06 03:00:40 +00:00
;;; ============================================================
2021-11-10 02:17:23 +00:00
.assert * = $C3DC, error, "Potential entry point moved"
2021-11-06 03:24:49 +00:00
;; ???
bit CLRROM
2021-11-10 04:55:40 +00:00
jmp UnknownEP1
2021-11-06 00:44:04 +00:00
2021-11-06 03:00:40 +00:00
;;; ============================================================
2021-11-06 01:21:23 +00:00
2021-11-06 00:44:04 +00:00
brk
brk
brk
brk
brk
brk
2021-11-06 03:00:40 +00:00
;;; ============================================================
;;; Entry points called by Monitor ROM
2021-11-06 03:00:40 +00:00
.assert * = $C3E8, error, "Entry point moved"
;; Called by U3 ROM ($F37A)
2021-11-06 03:24:49 +00:00
bit CLRROM
2021-11-10 04:55:40 +00:00
jmp UnknownEP2
2021-11-06 00:44:04 +00:00
;; Called by U3 ROM ($F809)
2021-11-06 03:24:49 +00:00
bit CLRROM
2021-11-10 04:55:40 +00:00
jmp UnknownEP3
2021-11-06 00:44:04 +00:00
;; Called by U3 ROM ($F9B7)
2021-11-06 03:24:49 +00:00
bit CLRROM
2021-11-10 04:55:40 +00:00
jmp UnknownEP4
2021-11-06 00:44:04 +00:00
;; Called by U3 ROM ($FA9E)
2021-11-06 03:24:49 +00:00
bit CLRROM
2021-11-10 04:55:40 +00:00
jmp UnknownEP5
2021-11-06 00:44:04 +00:00
2021-11-06 01:21:23 +00:00
;;; ==================================================
2021-11-12 04:09:01 +00:00
;;; Page $C4 - ???
2021-11-06 01:21:23 +00:00
.assert * = $C400, error, "Mismatch"
.scope
LF813 := $F813 ; Not an Apple II entry point
LF981 := $F981 ; Not an Apple II entry point
LFA37 := $FA37 ; Not an Apple II entry point
LFA52 := $FA52 ; Not an Apple II entry point
LFC45 := $FC45 ; Not an Apple II entry point
LFEEB := $FEEB ; Not an Apple II entry point
2021-11-06 00:44:04 +00:00
ldx #$00
eor #$20
beq LC419
and #$9F
beq LC41B
asl a
eor #$12
beq LC41A
and #$1A
eor #$02
beq LC41B
and #$10
bne LC41A
LC419: inx
LC41A: inx
LC41B: stx $2F
jmp LF813
lda KBD
eor #$93
bne LC439
lda KBDSTRB
LC42A: jsr LFA37
lda KBD
bpl LC42A
eor #$83
beq LC439
sta KBDSTRB
LC439: jmp LF813
lda $2E
eor #$FF
and ($26),y
sta ($26),y
lda $2E
and $30
ora ($26),y
sta ($26),y
jmp LF813
LC44F: ldx #$3C
jsr LFC45
beq LC463
jsr LC469
jsr LFA52
ldx #$42
jsr LFA52
bra LC44F
LC463: jsr LC469
jmp LF813
LC469: lda ($00,x)
sta ($06,x)
rts
and #$0F
asl a
tax
lda LC47E,x
pha
2021-11-06 01:21:23 +00:00
lda LC47E+1,x
2021-11-06 00:44:04 +00:00
tax
pla
jmp LF813
2021-11-06 01:21:23 +00:00
;; Jump Table (target address-1)
2021-11-06 00:44:04 +00:00
LC47E: .byte $F0
2021-11-06 01:21:23 +00:00
sbc $C100,x
2021-11-06 00:44:04 +00:00
brk
.byte $C2
brk
.byte $C3
brk
cpy $00
cmp $00
dec $00
smb4 $1B
sbc a:$A9,x
2021-11-06 01:21:23 +00:00
stz A2L
stz A2H
2021-11-06 00:44:04 +00:00
stz $2C
2021-11-06 01:21:23 +00:00
LC498: ora A2L
sta A2L
2021-11-06 00:44:04 +00:00
lda $0200,y
iny
jsr LFEEB
bmi LC4B2
dec $2C
ldx #$04
2021-11-06 01:21:23 +00:00
LC4A9: asl A2L
LC4AB: rol A2H
2021-11-06 00:44:04 +00:00
dex
bne LC4A9
bra LC498
LC4B2: jmp LF813
lsr a
phx
php
ldx #$26
jsr LF981
plp
php
lda #$00
adc #$00
tax
lda LC4CE,x
sta $2E
plp
plx
LC4CB: jmp LF813
2021-11-06 01:21:23 +00:00
;; Data table
2021-11-06 00:44:04 +00:00
LC4CE: bbr0 $F0,LC4AB
and #$0F
tax
2021-11-06 01:21:23 +00:00
lda $C4DD,x
2021-11-06 00:44:04 +00:00
sta $30
plx
jmp LF813
2021-11-06 01:21:23 +00:00
brk
2021-11-06 00:44:04 +00:00
ora ($22),y
.byte $33
.byte $44
eor $66,x
rmb7 $88
sta $BBAA,y
cpy $EEDD
.byte $FF
tya
2021-11-06 01:21:23 +00:00
ldy $C4FD,x
2021-11-06 00:44:04 +00:00
beq * + (8)
cmp $C000,y
inx
2021-11-06 01:21:23 +00:00
bra $C4EE
2021-11-06 00:44:04 +00:00
tay
jmp LF813
eor ($54)
lsr $00,x
lsr $50,x
.byte $53
brk
.byte $9B
trb $88FA
ora #$FA
tya
adc ($FD,x)
sta $21,x
plx
sta $FA16
brk
sta $FC3A
txa
adc $FC
smb0 $E1
.byte $FB
dey
.byte $42
plx
brk
eor #$F5
.byte $FC
lsr a
.byte $5B
plx
.byte $4B
sbc $FB,x
eor $FCBC
brk
sta $FEBE
ldy #$C9
inc $AAAE,x
sbc $47BA,x
sbc $12BC,x
inc $80C7,x
sed
dec $FE8C
.byte $82
bbs7 $DF,LC4CB
.byte $02
cpx #$99
smb7 $03
bcc $C574
sbc a:$00,x
2021-11-06 01:21:23 +00:00
.endscope
2021-11-06 00:44:04 +00:00
;;; ============================================================
2021-11-11 07:17:24 +00:00
.res $C800 - *, 0
2021-11-06 00:44:04 +00:00
;;; ============================================================
2021-11-12 04:09:01 +00:00
;;; Pages $C8-$CF - Enhanced 80 Column Firmware
2021-11-06 00:44:04 +00:00
2021-11-06 03:00:40 +00:00
LC800: lda #M_NORMAL
2021-11-06 01:21:23 +00:00
sta MODE
jsr Enable80Col
2021-11-06 03:00:40 +00:00
jsr DoSETWND
2021-11-06 00:44:04 +00:00
jmp DoHomeAndClear
LC80E: ldy #$00
ldx #$00
LC812: cpy WNDWDTH
bcs LC820
jsr LCEC0
sta $0200,x
inx
iny
bra LC812
LC820: dey
sty CH
2021-11-06 01:21:23 +00:00
stx SAVEX
2021-11-06 00:44:04 +00:00
lda #$8D
2021-11-06 01:21:23 +00:00
rts1: rts
2021-11-06 00:44:04 +00:00
Do40Col:
bit RD80VID
php
jsr Disable80Col
2021-11-10 04:55:40 +00:00
jsr SaveCHCV
2021-11-06 03:00:40 +00:00
jsr DoSETWND
2021-11-06 00:44:04 +00:00
plp
2021-11-06 01:21:23 +00:00
bpl rts1
2021-11-06 00:44:04 +00:00
jmp LCC4E
2021-11-10 04:55:40 +00:00
;;; ============================================================
2021-11-11 07:17:24 +00:00
.if !INCLUDE_PATCHES
2021-11-06 00:44:04 +00:00
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
2021-11-11 07:17:24 +00:00
.else
Patch4:
lda CHAR ; char to be printed
bit INVFLG
bmi :+ ; normal
and #$7F ; clear high bit
: and #$FF ; set N flag
rts
.endif
;;; ============================================================
.res $C84D - *, 0
2021-11-06 01:21:23 +00:00
2021-11-10 04:55:40 +00:00
;;; ============================================================
;; ???
jsr InitTextWindow
2021-11-06 00:44:04 +00:00
LC850: jsr LCBC7
2021-11-06 01:21:23 +00:00
LC853: inc RNDL
bne :+
inc RNDH
:
2021-11-10 04:55:40 +00:00
jsr UnknownEP4
2021-11-06 00:44:04 +00:00
bcc LC853
2021-11-10 04:55:40 +00:00
jsr UnknownEP5
2021-11-06 00:44:04 +00:00
cmp #$06
bcc LC86E
and #$7F
sta CHAR
ora #$80
bra LC871
LC86E: sta CHAR
LC871: pha
jsr LCBDE
pla
2021-11-06 01:21:23 +00:00
rts2: rts
2021-11-06 00:44:04 +00:00
2021-11-07 20:52:15 +00:00
;;; ============================================================
2021-11-06 00:44:04 +00:00
LC877: jsr LC850
cmp #$00
2021-11-07 20:52:15 +00:00
beq @l4
2021-11-06 00:44:04 +00:00
cmp #$02
beq LC80E
cmp #$05
2021-11-06 01:21:23 +00:00
bne rts2
2021-11-06 00:44:04 +00:00
ldy CH
2021-11-07 20:52:15 +00:00
@l1: iny
2021-11-06 00:44:04 +00:00
cpy WNDWDTH
2021-11-07 20:52:15 +00:00
beq @l2
2021-11-06 00:44:04 +00:00
jsr LCEC0
dey
jsr LCECB
iny
2021-11-07 20:52:15 +00:00
bra @l1
2021-11-06 00:44:04 +00:00
2021-11-07 20:52:15 +00:00
@l2: dey
@l3: lda #$A0
2021-11-06 00:44:04 +00:00
jsr LCECB
bra LC877
2021-11-07 20:52:15 +00:00
@l4: ldy WNDWDTH
2021-11-06 00:44:04 +00:00
dey
2021-11-07 20:52:15 +00:00
@l5: cpy CH
beq @l3
2021-11-06 00:44:04 +00:00
dey
jsr LCEC0
iny
jsr LCECB
dey
2021-11-07 20:52:15 +00:00
bra @l5
;;; ============================================================
2021-11-06 00:44:04 +00:00
OutputChar:
sta CHAR
2021-11-07 20:52:15 +00:00
LC8B4: jsr CheckPauseListing
2021-11-06 01:21:23 +00:00
lda MODE
2021-11-11 05:07:34 +00:00
and #$03 ; test low 2 bits (why???)
2021-11-07 20:52:15 +00:00
beq @l1
2021-11-06 00:44:04 +00:00
jmp LCA11
2021-11-07 20:52:15 +00:00
@l1: lda CHAR
2021-11-06 00:44:04 +00:00
and #$7F
cmp #$20
2021-11-06 03:00:40 +00:00
bcc DoCtrlCharOut
2021-11-06 00:44:04 +00:00
ldy CH
cpy WNDWDTH
2021-11-07 20:52:15 +00:00
bcc @l2
2021-11-06 00:44:04 +00:00
jsr DoReturn
2021-11-11 05:07:34 +00:00
;; If MouseText is not active, make sure to map inverse
;; uppercase range to the control character range.
2021-11-11 07:17:24 +00:00
@l2:
.if !INCLUDE_PATCHES
lda CHAR ; char to be printed
2021-11-11 05:07:34 +00:00
bit INVFLG ; inverse?
2021-11-11 07:17:24 +00:00
.else
jsr Patch4 ; sets N flag if inverse char
nop
nop
.endif
2021-11-11 05:07:34 +00:00
bmi @l3 ; no, so not MT, just print it
2021-11-06 00:44:04 +00:00
and #$7F
2021-11-11 05:07:34 +00:00
bit MODE ; MT active? (bit 6 = M_MOUSE)
bvs @l3 ; yes, so skip correction
bit ALTCHARSET ; also skip correction if
bpl @l3 ; alt charset is disabled
;; If within "@ABC...XYZ[\]^_" range, map to $00-$1F
;; so it shows as inverse uppercase, not MouseText.
cmp #'@'
bcc :+
cmp #'_'+1
bcs :+
2021-11-06 00:44:04 +00:00
and #$1F
2021-11-11 05:07:34 +00:00
:
2021-11-07 20:52:15 +00:00
@l3: jsr LCBF9
2021-11-06 00:44:04 +00:00
jmp DoForwardSpace
2021-11-07 03:06:39 +00:00
;;; ============================================================
2021-11-06 00:44:04 +00:00
DoNothing:
rts
;;; ============================================================
2021-11-06 03:00:40 +00:00
;;; Output control character handling
2021-11-06 00:44:04 +00:00
;; Input is char, < $20
2021-11-06 03:00:40 +00:00
DoCtrlCharOut:
sec
2021-11-06 00:44:04 +00:00
sbc #$07
bcc DoNothing
asl a
tax
2021-11-07 20:52:15 +00:00
jmp (@jt,x)
2021-11-06 00:44:04 +00:00
2021-11-07 20:52:15 +00:00
@jt:
2021-11-06 00:44:04 +00:00
.addr DoBell ; $07 Ctrl-G Bell
2021-11-06 01:21:23 +00:00
.addr DoBackspace ; $08 Ctrl-H Backspace
.addr DoNothing ; $09 Ctrl-I
2021-11-06 00:44:04 +00:00
.addr DoLineFeed ; $0A Ctrl-J Line feed
.addr DoClearEOS ; $0B Ctrl-K Clear EOS
.addr DoHomeAndClear ; $0C Ctrl-L Home and clear
.addr DoReturn ; $0D Ctrl-M Return
.addr DoNormal ; $0E Ctrl-N Normal
.addr DoInverse ; $0F Ctrl-O Inverse
2021-11-06 01:21:23 +00:00
.addr DoNothing ; $10 Ctrl-P
2021-11-06 00:44:04 +00:00
.addr Do40Col ; $11 Ctrl-Q 40-column
.addr Do80Col ; $12 Ctrl-R 80-column
2021-11-06 01:21:23 +00:00
.addr DoNothing ; $13 Ctrl-S
.addr DoNothing ; $14 Ctrl-T
2021-11-06 00:44:04 +00:00
.addr DoQuit ; $15 Ctrl-U Quit
.addr DoScroll ; $16 Ctrl-V Scroll
.addr DoScrollUp ; $17 Ctrl-W Scroll-up
.addr DoDisableMouseText ; $18 Ctrl-X Disable MouseText
.addr DoHome ; $19 Ctrl-Y Home
.addr DoClearLine ; $1A Ctrl-Z Clear line
.addr DoEnableMouseText ; $1B Ctrl-[ Enable MouseText
.addr DoForwardSpace ; $1C Ctrl-\ Forward space
.addr DoClearEOL ; $1D Ctrl-] Clear EOL
2021-11-07 03:27:30 +00:00
.addr DoCtrlCaret ; $1E Ctrl-^ ???
2021-11-06 00:44:04 +00:00
.addr DoUp ; $1F Ctrl-_ Up
;;; ============================================================
2021-11-06 03:00:40 +00:00
;;; For Escape key sequences
2021-11-06 00:44:04 +00:00
2021-11-07 20:52:15 +00:00
ProcessEscapeModeKey:
pha
2021-11-06 03:00:40 +00:00
lda #M_ESC
2021-11-07 20:52:15 +00:00
trb MODE
2021-11-06 00:44:04 +00:00
pla
and #$7F
cmp #'a'
2021-11-07 20:52:15 +00:00
bcc @l1
2021-11-06 00:44:04 +00:00
cmp #'z'+1
2021-11-07 20:52:15 +00:00
bcs @l1
2021-11-06 00:44:04 +00:00
and #$DF ; convert to uppercase
;; Scan table for match
2021-11-07 20:52:15 +00:00
@l1: ldx #$00
@l2: ldy @code_table,x
2021-11-06 00:44:04 +00:00
beq DoNothing
2021-11-07 20:52:15 +00:00
cmp @code_table,x
beq @l3
2021-11-06 00:44:04 +00:00
inx
2021-11-07 20:52:15 +00:00
bra @l2
2021-11-06 00:44:04 +00:00
2021-11-07 20:52:15 +00:00
@l3: txa
2021-11-06 00:44:04 +00:00
asl a
tax
2021-11-07 20:52:15 +00:00
jmp (@jt,x)
2021-11-06 00:44:04 +00:00
2021-11-07 20:52:15 +00:00
@code_table:
2021-11-06 03:00:40 +00:00
.byte '@' ; Escape @ - clear, home & exit mode
.byte 'A' ; Escape A - right & exit mode
.byte 'B' ; Escape B - left & exit mode
.byte 'C' ; Escape C - down & exit mode
.byte 'D' ; Escape D - up & exit mode
.byte 'E' ; Escape E - clear EOL & exit mode
.byte 'F' ; Escape F - clear EOS & exit mode
.byte 'I' ; Escape I - up
.byte 'J' ; Escape J - left
.byte 'K' ; Escape K - right
.byte 'M' ; Escape M - down
.byte $0b ; Escape up - up
.byte $0a ; Escape down - down
.byte $08 ; Escape left - left
.byte $15 ; Escape right - right
.byte '4' ; Escape 4 - 40 col mode
.byte '8' ; Escape 8 - 80 col mode
.byte $11 ; Escape Ctrl+Q - deactivate
2021-11-06 00:44:04 +00:00
.byte $00 ; sentinel
2021-11-07 20:52:15 +00:00
@jt:
2021-11-06 03:00:40 +00:00
.addr DoHomeAndClear ; Escape @ - clear, home & exit mode
.addr DoForwardSpace ; Escape A - right & exit mode
.addr DoBackspace ; Escape B - left & exit mode
.addr DoLineFeed ; Escape C - down & exit mode
.addr DoUp ; Escape D - up & exit mode
.addr DoClearEOL ; Escape E - clear EOL & exit mode
.addr DoClearEOS ; Escape F - clear EOS & exit mode
.addr DoUpRemain ; Escape I - up
.addr DoLeftRemain ; Escape J - left
.addr DoRightRemain ; Escape K - right
.addr DoDownRemain ; Escape M - down
.addr DoUpRemain ; Escape up - up
.addr DoDownRemain ; Escape down - down
.addr DoLeftRemain ; Escape left - left
.addr DoRightRemain ; Escape right - right
.addr Do40Col ; Escape 4 - 40 col mode
.addr Do80Col ; Escape 8 - 80 col mode
.addr DoQuit ; Escape Ctrl+Q - deactivate
2021-11-06 00:44:04 +00:00
;;; ============================================================
2021-11-07 20:52:15 +00:00
CheckPauseListing:
2021-11-06 03:00:40 +00:00
lda KBD
2021-11-06 00:44:04 +00:00
cmp #$93 ; Ctrl-S
2021-11-06 01:21:23 +00:00
bne rts3
2021-11-06 00:44:04 +00:00
bit KBDSTRB
2021-11-06 01:21:23 +00:00
: lda KBD
bpl :-
2021-11-06 00:44:04 +00:00
cmp #$83 ; Ctrl-C
2021-11-06 01:21:23 +00:00
beq rts3
2021-11-06 00:44:04 +00:00
bit KBDSTRB
2021-11-06 01:21:23 +00:00
rts3: rts
2021-11-06 00:44:04 +00:00
2021-11-06 03:00:40 +00:00
;;; ============================================================
;; Unused???
2021-11-06 00:44:04 +00:00
nop
jmp LCB60
2021-11-06 03:00:40 +00:00
;;; ============================================================
DoUpRemain:
jsr DoUp
bra Remain
2021-11-06 00:44:04 +00:00
2021-11-06 03:00:40 +00:00
DoDownRemain:
jsr DoLineFeed
bra Remain
2021-11-06 00:44:04 +00:00
2021-11-06 03:00:40 +00:00
DoRightRemain:
jsr DoForwardSpace
bra Remain
2021-11-06 00:44:04 +00:00
2021-11-06 03:00:40 +00:00
DoLeftRemain:
jsr DoBackspace
2021-11-07 03:56:03 +00:00
;; fall through
2021-11-06 03:00:40 +00:00
Remain: lda #M_ESC ; stay in Escape Mode
jmp SetModeBits
2021-11-06 00:44:04 +00:00
2021-11-07 03:56:03 +00:00
;;; ============================================================
2021-11-06 00:44:04 +00:00
DoInverse:
ldy #$3F
bra LC9CA
DoNormal:
ldy #$FF
2021-11-06 01:21:23 +00:00
LC9CA: sty INVFLG
rts4: rts
2021-11-06 00:44:04 +00:00
2021-11-07 03:56:03 +00:00
;;; ============================================================
2021-11-06 00:44:04 +00:00
Do80Col:
bit RD80VID
php
jsr Enable80Col
2021-11-10 04:55:40 +00:00
jsr SaveCHCV
2021-11-06 03:00:40 +00:00
jsr DoSETWND
2021-11-06 00:44:04 +00:00
plp
2021-11-06 01:21:23 +00:00
bmi rts4
2021-11-06 00:44:04 +00:00
jmp LCBFE
2021-11-07 03:56:03 +00:00
;;; ============================================================
2021-11-06 00:44:04 +00:00
DoQuit:
jsr Do40Col
2021-11-06 03:00:40 +00:00
jsr DoSETVID
jsr DoSETKBD
lda #23
ldx #0
2021-11-10 04:55:40 +00:00
jsr SetCHCV
2021-11-06 03:00:40 +00:00
2021-11-10 02:17:23 +00:00
lda #M_INACTIVE
2021-11-06 00:44:04 +00:00
sta MODE ; set all mode bits (???)
2021-11-06 03:00:40 +00:00
lda #$98 ; Ctrl-X ???
2021-11-06 00:44:04 +00:00
rts
2021-11-06 03:00:40 +00:00
;;; ============================================================
;;; Adusting MODE Bits
2021-11-07 03:27:30 +00:00
DoCtrlCaret:
lda #$FC ; clear mode bits %xxxxxx00
2021-11-06 03:00:40 +00:00
jsr PreserveModeBits
2021-11-06 00:44:04 +00:00
lda #$32 ; set mode bits %xx11xx1x
2021-11-06 03:00:40 +00:00
bra SetModeBits
2021-11-06 00:44:04 +00:00
DoDisableMouseText:
2021-11-10 02:17:23 +00:00
.if !INCLUDE_PATCHES
lda #M_MOUSE ; BUG! Should be ~M_MOUSE
.else
lda #.lobyte(~M_MOUSE)
.endif
2021-11-06 03:00:40 +00:00
PreserveModeBits:
and MODE
bra StoreMode
2021-11-06 00:44:04 +00:00
DoEnableMouseText:
2021-11-06 03:00:40 +00:00
lda #M_MOUSE
SetModeBits:
ora MODE
StoreMode:
sta MODE
2021-11-06 00:44:04 +00:00
rts
2021-11-06 03:00:40 +00:00
;;; ============================================================
2021-11-06 00:44:04 +00:00
LCA11: lda CHAR ; character to read/print
sec
sbc #$20
and #$7F
pha
2021-11-06 01:21:23 +00:00
dec MODE ; clear low bit???
2021-11-06 00:44:04 +00:00
lda MODE
2021-11-06 01:21:23 +00:00
and #$03 ; test low 2 bits
2021-11-07 04:07:03 +00:00
bne @l2
2021-11-06 00:44:04 +00:00
pla
cmp #$18 ; +$20 is $38 = '8' ???
2021-11-07 04:07:03 +00:00
bcs @l1
2021-11-10 04:55:40 +00:00
jsr SetCV
2021-11-07 04:07:03 +00:00
@l1: lda $05F8
2021-11-06 00:44:04 +00:00
cmp WNDWDTH
2021-11-06 03:00:40 +00:00
bcs :+
2021-11-06 00:44:04 +00:00
sta CH
2021-11-06 03:00:40 +00:00
: rts
2021-11-06 00:44:04 +00:00
2021-11-07 04:07:03 +00:00
@l2: pla
2021-11-06 00:44:04 +00:00
sta $05F8
rts
2021-11-06 03:00:40 +00:00
;;; ============================================================
2021-11-06 00:44:04 +00:00
DoForwardSpace:
inc CH
lda CH
cmp WNDWDTH
bcs DoReturn
rts
2021-11-06 03:00:40 +00:00
;;; ============================================================
2021-11-06 00:44:04 +00:00
DoBackspace:
lda CH
2021-11-06 03:00:40 +00:00
beq :+
2021-11-06 00:44:04 +00:00
dec CH
2021-11-06 03:00:40 +00:00
rts5: rts
2021-11-06 00:44:04 +00:00
2021-11-06 03:00:40 +00:00
: lda CV
beq rts5
2021-11-06 00:44:04 +00:00
lda WNDWDTH
dec a
sta CH
2021-11-06 03:00:40 +00:00
;;; ============================================================
2021-11-06 00:44:04 +00:00
DoUp:
lda CV
2021-11-06 03:00:40 +00:00
beq rts5
2021-11-06 00:44:04 +00:00
dec CV
2021-11-10 04:55:40 +00:00
bra JumpMON_VTAB
2021-11-06 00:44:04 +00:00
2021-11-06 03:00:40 +00:00
;;; ============================================================
2021-11-06 00:44:04 +00:00
DoReturn:
stz CH
2021-11-06 03:00:40 +00:00
;; fall through
;;; ============================================================
2021-11-06 00:44:04 +00:00
DoLineFeed:
lda CV
2021-11-06 03:00:40 +00:00
cmp #23
2021-11-06 00:44:04 +00:00
bcs DoScrollUp
inc CV
2021-11-10 04:55:40 +00:00
bra JumpMON_VTAB
2021-11-06 00:44:04 +00:00
2021-11-06 03:00:40 +00:00
;;; ============================================================
2021-11-06 00:44:04 +00:00
DoHome:
lda WNDTOP
ldx #$00
2021-11-10 04:55:40 +00:00
bra SetCHCV
2021-11-06 00:44:04 +00:00
2021-11-06 03:00:40 +00:00
;;; ============================================================
2021-11-06 00:44:04 +00:00
DoClearLine:
lda CH
pha
stz CH
jsr DoClearEOL
pla
sta CH
rts
2021-11-06 03:00:40 +00:00
;;; ============================================================
2021-11-10 04:55:40 +00:00
RestoreCHCV:
lda SAVECV
ldx SAVECH
SetCHCV:
stx CH
SetCV:
sta CV
JumpMON_VTAB:
jmp DoMON_VTAB
2021-11-06 03:00:40 +00:00
;;; ============================================================
2021-11-06 00:44:04 +00:00
DoScrollUp:
lda CH
pha
jsr DoHome
2021-11-07 04:07:03 +00:00
@l1: ldy BASH
2021-11-06 00:44:04 +00:00
sty BAS2H
ldy BASL
sty BAS2L
lda WNDBTM
2021-11-07 04:07:03 +00:00
beq @l5
2021-11-06 00:44:04 +00:00
dec a
cmp CV
2021-11-07 04:07:03 +00:00
beq @l5
bcc @l5
2021-11-06 00:44:04 +00:00
inc CV
2021-11-10 04:55:40 +00:00
jsr JumpMON_VTAB
2021-11-06 00:44:04 +00:00
ldy WNDWDTH
dey
bit RD80VID
2021-11-07 04:07:03 +00:00
bmi @l3
@l2: lda (BASL),y
2021-11-06 00:44:04 +00:00
sta (BAS2L),y
dey
2021-11-07 04:07:03 +00:00
bpl @l2
bra @l1
2021-11-06 00:44:04 +00:00
2021-11-07 04:07:03 +00:00
@l3: tya
2021-11-06 00:44:04 +00:00
lsr a
tay
2021-11-07 04:07:03 +00:00
@l4: bit TXTPAGE1
2021-11-06 00:44:04 +00:00
lda (BASL),y
sta (BAS2L),y
bit TXTPAGE2
lda (BASL),y
sta (BAS2L),y
dey
2021-11-07 04:07:03 +00:00
bpl @l4
2021-11-06 00:44:04 +00:00
bit TXTPAGE1
2021-11-07 04:07:03 +00:00
bra @l1
2021-11-06 00:44:04 +00:00
2021-11-07 04:07:03 +00:00
@l5: stz CH
2021-11-06 00:44:04 +00:00
jsr DoClearEOL
plx
lda CV
2021-11-10 04:55:40 +00:00
jmp SetCHCV
2021-11-06 00:44:04 +00:00
2021-11-07 04:07:03 +00:00
;;; ============================================================
2021-11-10 04:55:40 +00:00
SaveCHCV:
lda CV
sta SAVECV
2021-11-06 00:44:04 +00:00
lda CH
2021-11-10 04:55:40 +00:00
sta SAVECH
2021-11-06 00:44:04 +00:00
rts
2021-11-06 03:00:40 +00:00
;;; ============================================================
;;; Load X,Y with address of a routine -1 (for `ROMCall`)
2021-11-06 00:44:04 +00:00
.macro LDXY addr
ldx #.hibyte(addr-1)
ldy #.lobyte(addr-1)
.endmacro
2021-11-06 03:00:40 +00:00
;;; ============================================================
2021-11-06 00:44:04 +00:00
DoBell:
LDXY BELLB
2021-11-06 03:00:40 +00:00
jmp ROMCall
;;; ============================================================
2021-11-06 00:44:04 +00:00
DoScroll:
2021-11-10 04:55:40 +00:00
jsr SaveCHCV
2021-11-06 00:44:04 +00:00
lda WNDBTM
dec a
dec a
sta $05F8
2021-11-07 04:07:03 +00:00
@l1: lda $05F8
2021-11-10 04:55:40 +00:00
jsr SetCV
2021-11-06 00:44:04 +00:00
lda BASL
sta BAS2L
lda BASH
sta BAS2H
lda $05F8
inc a
2021-11-10 04:55:40 +00:00
jsr SetCV
2021-11-06 00:44:04 +00:00
ldy WNDWDTH
dey
2021-11-07 04:07:03 +00:00
@l2: phy
2021-11-06 00:44:04 +00:00
bit TXTPAGE1
bit RD80VID
2021-11-07 04:07:03 +00:00
bpl @l3
2021-11-06 00:44:04 +00:00
tya
lsr a
tay
2021-11-07 04:07:03 +00:00
bcs @l3
2021-11-06 00:44:04 +00:00
bit TXTPAGE2
2021-11-07 04:07:03 +00:00
@l3: lda (BAS2L),y
2021-11-06 00:44:04 +00:00
sta (BASL),y
ply
dey
2021-11-07 04:07:03 +00:00
bpl @l2
2021-11-06 00:44:04 +00:00
bit TXTPAGE1
lda $05F8
cmp WNDTOP
2021-11-07 04:07:03 +00:00
beq @l4
2021-11-06 00:44:04 +00:00
dec $05F8
2021-11-07 04:07:03 +00:00
bra @l1
2021-11-06 00:44:04 +00:00
2021-11-07 04:07:03 +00:00
@l4: lda #$00
2021-11-10 04:55:40 +00:00
jsr SetCV
2021-11-06 00:44:04 +00:00
jsr DoClearLine
bit TXTPAGE1
2021-11-10 04:55:40 +00:00
jmp RestoreCHCV
2021-11-06 00:44:04 +00:00
2021-11-06 03:24:49 +00:00
;;; ============================================================
PascalInit:
jsr LC800
2021-11-06 00:44:04 +00:00
LCB47: jsr LCBC7
LCB4A: ldx CH
2021-11-10 02:17:23 +00:00
.if !INCLUDE_PATCHES
2021-11-06 00:44:04 +00:00
stx OURCH
2021-11-10 02:17:23 +00:00
.else
jsr Patch3
.endif
2021-11-06 00:44:04 +00:00
ldx #$00
rts
2021-11-06 03:24:49 +00:00
;;; ============================================================
PascalRead:
jsr InitTextWindow
2021-11-06 00:44:04 +00:00
jsr LC850
lda CHAR
bra LCB4A
2021-11-06 03:24:49 +00:00
;;; ============================================================
PascalWrite:
sta CHAR
LCB60: jsr InitTextWindow
2021-11-06 00:44:04 +00:00
jsr LCBDE
lda CHAR
ora #$80
sta CHAR
and #$7F
cmp #$15 ; right?
beq LCB4A
cmp #$0D ; return?
beq LCB7D
jsr LC8B4
bra LCB47
LCB7D: stz CH
bra LCB47
2021-11-06 03:24:49 +00:00
;;; ============================================================
PascalStatus:
cmp #$00
2021-11-07 04:07:03 +00:00
beq @l1
2021-11-06 00:44:04 +00:00
cmp #$01
2021-11-07 04:07:03 +00:00
bne @l2
2021-11-10 04:55:40 +00:00
jsr UnknownEP4
2021-11-06 00:44:04 +00:00
bra LCB4A
2021-11-07 04:07:03 +00:00
@l1: sec
2021-11-06 00:44:04 +00:00
bra LCB4A
2021-11-07 04:07:03 +00:00
@l2: ldx #$03
2021-11-06 00:44:04 +00:00
clc
rts
2021-11-06 03:24:49 +00:00
;;; ============================================================
InitTextWindow:
pha
2021-11-06 00:44:04 +00:00
lda OLDBASL
sta BASL
lda OLDBASH
sta BASH
stz WNDTOP
stz WNDLFT
lda #80
sta WNDWDTH
lda #24
sta WNDBTM
.if !INCLUDE_PATCHES
2021-11-06 00:44:04 +00:00
lda OURCH
.else
jsr Patch1
.endif
2021-11-06 00:44:04 +00:00
sta CH
pla
rts
;;; ==================================================
2021-11-06 03:24:49 +00:00
;; ???
2021-11-06 00:44:04 +00:00
sta CLRALTCHAR
Disable80Col:
sta CLR80COL
2021-11-06 00:44:04 +00:00
sta CLR80VID
rts
Enable80Col:
sta SET80COL
2021-11-06 00:44:04 +00:00
sta SET80VID
sta SETALTCHAR
rts
;;; ============================================================
2021-11-06 00:44:04 +00:00
LCBC7: lda MODE ; all mode bits set?
2021-11-10 02:17:23 +00:00
cmp #M_INACTIVE
2021-11-06 00:44:04 +00:00
beq LCBEA
2021-11-06 03:00:40 +00:00
and #M_ESC ; escape mode?
2021-11-06 00:44:04 +00:00
beq LCBEA
jsr LCEBE
sta OLDCH
and #$80
eor #$AB
bra LCBF9
2021-11-06 01:21:23 +00:00
LCBDE: lda MODE ; test high bit
2021-11-06 03:00:40 +00:00
and #M_ESC ; escape mode?
2021-11-06 00:44:04 +00:00
beq LCBEA
lda OLDCH
bra LCBF9
LCBEA: jsr LCEBE
eor #$80
2021-11-11 05:07:34 +00:00
;; If within "@ABC...XYZ[\]^_" range, map to $00-$1F
;; so it shows as inverse uppercase, not MouseText.
cmp #'@'
bcc :+
cmp #'_'+1
bcs :+
2021-11-06 00:44:04 +00:00
and #$1F
2021-11-11 05:07:34 +00:00
:
2021-11-06 00:44:04 +00:00
LCBF9: ldy CH
jmp LCECB
LCBFE: php
sei
lda WNDTOP
sta $05F8
LCC05: lda $05F8
2021-11-10 04:55:40 +00:00
jsr SetCV
2021-11-06 00:44:04 +00:00
lda BASL
sta BAS2L
lda BASH
sta BAS2H
ldy #$00
LCC15: bit TXTPAGE1
lda (BAS2L)
bit TXTPAGE2
sta (BASL),y
bit TXTPAGE1
inc BAS2L
lda (BAS2L)
sta (BASL),y
iny
inc BAS2L
cpy #$14
bcc LCC15
lda #$A0
LCC31: bit TXTPAGE2
sta (BASL),y
bit TXTPAGE1
sta (BASL),y
iny
cpy #$28
bcc LCC31
inc $05F8
lda $05F8 ; vertical position
cmp #24
bcc LCC05
LCC4A: plp
2021-11-10 04:55:40 +00:00
jmp RestoreCHCV
2021-11-06 00:44:04 +00:00
LCC4E: php
sei
sta SET80COL
lda WNDTOP
sta $05F8
LCC58: lda $05F8
2021-11-10 04:55:40 +00:00
jsr SetCV
2021-11-06 00:44:04 +00:00
ldy #$13
bit TXTPAGE1
LCC63: lda (BASL),y
pha
dey
bpl LCC63
ldy #$00
lda BASL
sta BAS2L
lda BASH
sta BAS2H
LCC73: bit TXTPAGE2
lda (BASL),y
bit TXTPAGE1
sta (BAS2L)
inc BAS2L
pla
sta (BAS2L)
inc BAS2L
iny
cpy #$14
bcc LCC73
inc $05F8 ; vertical position
lda $05F8
cmp #24
bcc LCC58
sta CLR80COL
bra LCC4A
2021-11-06 03:24:49 +00:00
;;; ============================================================
;;; XFER
DoXfer:
2021-11-06 00:44:04 +00:00
pha
2021-11-06 03:24:49 +00:00
lda XFERVEC
pha
lda XFERVEC+1
2021-11-06 00:44:04 +00:00
pha
sta RDMAINRAM
sta WRMAINRAM
2021-11-06 03:24:49 +00:00
bcc :+
2021-11-06 00:44:04 +00:00
sta RDCARDRAM
sta WRCARDRAM
2021-11-06 03:24:49 +00:00
: pla
sta XFERVEC+1
2021-11-06 00:44:04 +00:00
pla
2021-11-06 03:24:49 +00:00
sta XFERVEC
2021-11-06 00:44:04 +00:00
pla
sta ALTZPOFF
2021-11-06 03:24:49 +00:00
bvc :+
2021-11-06 00:44:04 +00:00
sta ALTZPON
2021-11-06 03:24:49 +00:00
: jmp (XFERVEC)
;;; ============================================================
2021-11-06 00:44:04 +00:00
2021-11-06 03:24:49 +00:00
DoAuxMove:
pha
2021-11-06 00:44:04 +00:00
bit RDRAMRD
php
bit RDRAMWRT
php
sta WRMAINRAM
sta RDCARDRAM
bcc LCCDA
sta RDMAINRAM
sta WRCARDRAM
2021-11-06 01:21:23 +00:00
LCCDA: lda (A1L)
sta (A4L)
inc A4L
2021-11-06 00:44:04 +00:00
bne LCCE4
2021-11-06 01:21:23 +00:00
inc A4H
LCCE4: lda A1L
cmp A2L
lda A1H
sbc A2H
inc A1L
2021-11-06 00:44:04 +00:00
bne LCCF2
2021-11-06 01:21:23 +00:00
inc A1H
2021-11-06 00:44:04 +00:00
LCCF2: bcc LCCDA
sta WRCARDRAM
plp
bmi LCCFD
sta WRMAINRAM
LCCFD: sta RDCARDRAM
plp
bmi LCD06
sta RDMAINRAM
LCD06: pla
sec
rts
2021-11-06 22:15:30 +00:00
;;; ============================================================
;;; Unknown Monitor ROM Routine
2021-11-06 22:15:30 +00:00
2021-11-10 04:55:40 +00:00
UnknownEP4:
bit $0579
bmi @l3
@l1: bit KBD
bmi @l2
2021-11-06 00:44:04 +00:00
clc
rts
@l2: sec
2021-11-06 00:44:04 +00:00
rts
@l3: jsr LCDB3
beq @l5
@l4: stz $0579
bra @l1
2021-11-06 00:44:04 +00:00
@l5: phx
2021-11-06 00:44:04 +00:00
ldx $0479
jsr LCE1F
lda $0200,x
jsr LCE2E
plx
cmp #$00
beq @l4
bra @l2
;;; ============================================================
;;; Unknown Monitor ROM Routine
2021-11-06 00:44:04 +00:00
2021-11-10 04:55:40 +00:00
UnknownEP5:
bit $0579
bmi @l11
2021-11-06 00:44:04 +00:00
lda KBD
bit KBDSTRB
bit $C027 ; ???
bpl @l3
@l1: cmp #$06
bcc @l2
2021-11-06 00:44:04 +00:00
ora #$80
@l2: rts
2021-11-06 00:44:04 +00:00
@l3: and #$7F
2021-11-06 00:44:04 +00:00
cmp #$01
bne @l4
2021-11-06 00:44:04 +00:00
lda #$1A
bra @l1
2021-11-06 00:44:04 +00:00
@l4: cmp #$03
bne @l5
2021-11-06 00:44:04 +00:00
lda #$0C
bra @l1
2021-11-06 00:44:04 +00:00
@l5: cmp #$04
bne @l6
2021-11-06 00:44:04 +00:00
lda #$19
bra @l1
2021-11-06 00:44:04 +00:00
@l6: cmp #$06
bne @l7
2021-11-06 00:44:04 +00:00
lda #$2C
bra @l9
2021-11-06 00:44:04 +00:00
@l7: cmp #$1F
bne @l8
2021-11-06 00:44:04 +00:00
lda #$2D
bra @l9
2021-11-06 00:44:04 +00:00
@l8: cmp #$20 ; space?
bcc @l1
2021-11-06 00:44:04 +00:00
cmp #$2C ; comma?
bcs @l1
@l9: pha
2021-11-06 00:44:04 +00:00
jsr LCDB3
beq @l10
2021-11-06 00:44:04 +00:00
pla
bra @l1
2021-11-06 00:44:04 +00:00
@l10: lda #$FF
2021-11-06 00:44:04 +00:00
sta $0579
pla
jsr LCDC9
@l11: jsr LCDB3
beq @l13
@l12: stz $0579
2021-11-06 00:44:04 +00:00
lda #$A0
bra @l1
2021-11-06 00:44:04 +00:00
@l13: phx
2021-11-06 00:44:04 +00:00
ldx $0479
jsr LCE1F
lda $0200,x
jsr LCE2E
plx
inc $0479
cmp #$00
beq @l12
bra @l1
;;; ============================================================
2021-11-06 00:44:04 +00:00
LCDB3: jsr LCE1F
lda #$00
phx
tax
clc
@l1: adc $0200,x
2021-11-06 00:44:04 +00:00
inx
bne @l1
2021-11-06 00:44:04 +00:00
plx
jsr LCE2E
cmp $04F9
rts
2021-11-10 04:55:40 +00:00
;;; ============================================================
2021-11-06 00:44:04 +00:00
LCDC9: phx
phy
jsr LCE1F
sec
sbc #$20
ldy #$00
tax
beq LCDE2
LCDD6: lda $0200,y
beq LCDDE
iny
bra LCDD6
LCDDE: iny
LCDDF: dex
bne LCDD6
LCDE2: jsr LCE2E
sty $0479
ply
plx
rts
2021-11-07 20:52:15 +00:00
;;; ============================================================
;; Function key shortcuts ???
.byte "RUN\r", 0
.byte "LIST\r", 0
.byte $ff
2021-11-06 00:44:04 +00:00
2021-11-06 03:00:40 +00:00
;;; ============================================================
;;; Unknown Monitor ROM Routine
2021-11-06 00:44:04 +00:00
2021-11-10 04:55:40 +00:00
UnknownEP3:
sta WRCARDRAM
2021-11-06 00:44:04 +00:00
lda #$00
tax
2021-11-10 04:55:40 +00:00
@l1: sta $0200,x
2021-11-06 00:44:04 +00:00
inx
cpx #$0C
2021-11-10 04:55:40 +00:00
bcc @l1
@l2: lda LCDDF,x
2021-11-06 00:44:04 +00:00
cmp #$FF
2021-11-10 04:55:40 +00:00
beq @l3
2021-11-06 00:44:04 +00:00
sta $0200,x
inx
2021-11-10 04:55:40 +00:00
bra @l2
2021-11-06 00:44:04 +00:00
2021-11-10 04:55:40 +00:00
@l3: sta WRMAINRAM
2021-11-06 00:44:04 +00:00
stz $0579
2021-11-10 04:55:40 +00:00
;;; ============================================================
;;; Unknown Monitor ROM Routine
2021-11-10 04:55:40 +00:00
UnknownEP2:
jsr LCDB3
2021-11-06 00:44:04 +00:00
sta $04F9
rts
2021-11-10 04:55:40 +00:00
;;; ============================================================
2021-11-06 00:44:04 +00:00
LCE1F: pha
lda RDRAMRD
sta RDMAINRAM
sta $07F8
sta RDCARDRAM
pla
rts
LCE2E: pha
sta RDMAINRAM
lda $07F8
2021-11-10 04:55:40 +00:00
bpl @l1
2021-11-06 00:44:04 +00:00
sta RDCARDRAM
2021-11-10 04:55:40 +00:00
@l1: pla
2021-11-06 00:44:04 +00:00
rts
2021-11-06 03:00:40 +00:00
;;; ============================================================
DoSETWND:
lda #0 ; set cursor to row 0
bit RDTEXT ; unless graphics mode
bmi :+
lda #20 ; then use row 20
: LDXY SETWND
bra ROMCall
;;; ============================================================
DoSETKBD:
LDXY SETKBD
bra ROMCall
;;; ============================================================
2021-11-06 00:44:04 +00:00
2021-11-06 03:00:40 +00:00
DoSETVID:
LDXY SETVID
bra ROMCall
2021-11-06 00:44:04 +00:00
2021-11-06 03:00:40 +00:00
;;; ============================================================
2021-11-06 00:44:04 +00:00
2021-11-06 03:00:40 +00:00
DoMON_VTAB:
LDXY MON_VTAB
bra ROMCall
2021-11-06 00:44:04 +00:00
2021-11-06 03:00:40 +00:00
;;; ============================================================
2021-11-06 00:44:04 +00:00
DoClearEOS:
LDXY CLREOP
2021-11-06 03:00:40 +00:00
bra ROMCall
;;; ============================================================
2021-11-06 00:44:04 +00:00
DoHomeAndClear:
LDXY HOME
2021-11-06 03:00:40 +00:00
bra ROMCall
;;; ============================================================
2021-11-06 00:44:04 +00:00
DoClearEOL:
LDXY CLREOL
2021-11-07 20:52:15 +00:00
;; fall through
2021-11-06 00:44:04 +00:00
2021-11-06 03:00:40 +00:00
;;; ============================================================
2021-11-06 00:44:04 +00:00
;;; A = character, X,Y = ROM address-1 (return value to push to stack)
2021-11-06 03:00:40 +00:00
ROMCall:
sta TEMP2
2021-11-06 00:44:04 +00:00
bit RDLCRAM
php
bit RDLCBNK2
php
2021-11-07 20:52:15 +00:00
lda #.hibyte(ROMCallReturn-1)
2021-11-06 00:44:04 +00:00
pha
2021-11-07 20:52:15 +00:00
lda #.lobyte(ROMCallReturn-1)
2021-11-06 00:44:04 +00:00
pha
phx
phy
bit ROMIN2
lda TEMP2
rts
2021-11-07 20:52:15 +00:00
ROMCallReturn:
2021-11-06 00:44:04 +00:00
plp
2021-11-07 20:52:15 +00:00
bpl @l2
plp
bpl @l1
2021-11-06 00:44:04 +00:00
bit LCBANK2
bit LCBANK2
2021-11-07 20:52:15 +00:00
bra @l4
2021-11-06 00:44:04 +00:00
2021-11-07 20:52:15 +00:00
@l1: bit ROMIN
2021-11-06 00:44:04 +00:00
bit ROMIN
2021-11-07 20:52:15 +00:00
bra @l4
2021-11-06 00:44:04 +00:00
2021-11-07 20:52:15 +00:00
@l2: plp
bpl @l3
2021-11-06 00:44:04 +00:00
bit LCBANK1
bit LCBANK1
2021-11-07 20:52:15 +00:00
bra @l4
2021-11-06 00:44:04 +00:00
2021-11-07 20:52:15 +00:00
@l3: bit $C089 ; ???
2021-11-06 00:44:04 +00:00
bit $C089 ; ???
2021-11-07 20:52:15 +00:00
@l4: lda BASL
2021-11-06 00:44:04 +00:00
sta OLDBASL
lda BASH
sta OLDBASH
lda CH
sta OURCH
rts
2021-11-07 20:52:15 +00:00
;;; ============================================================
2021-11-06 00:44:04 +00:00
LCEBE: ldy CH
LCEC0: phy
jsr LCED5
lda (BASL),y
LCEC6: ply
bit TXTPAGE1
rts
2021-11-07 20:52:15 +00:00
;;; ============================================================
LCECB:
phy
2021-11-06 00:44:04 +00:00
pha
jsr LCED5
pla
sta (BASL),y
bra LCEC6
2021-11-07 20:52:15 +00:00
;;; ============================================================
LCED5:
bit RD80VID
bpl @l1
2021-11-06 00:44:04 +00:00
tya
lsr a
tay
2021-11-07 20:52:15 +00:00
bcc @l2
@l1: bit TXTPAGE1
2021-11-06 00:44:04 +00:00
rts
2021-11-07 20:52:15 +00:00
@l2: bit TXTPAGE2
2021-11-06 00:44:04 +00:00
rts
2021-11-06 03:24:49 +00:00
;;; ============================================================
;;; ???
2021-11-06 03:24:49 +00:00
2021-11-10 04:55:40 +00:00
UnknownEP1:
bit RD80COL
2021-11-06 00:44:04 +00:00
php
sta CLR80COL
bit RDRAMRD
php
bit RDRAMWRT
php
phx
plx
beq @l1
jmp @l13
2021-11-06 00:44:04 +00:00
@l1: bcc @l5
2021-11-06 00:44:04 +00:00
sta RDMAINRAM
sta WRCARDRAM
2021-11-06 01:21:23 +00:00
lda A4L
ldx A4H
2021-11-06 00:44:04 +00:00
sta ALTZPON
2021-11-06 01:21:23 +00:00
sta A4L
stx A4H
2021-11-06 00:44:04 +00:00
sta ALTZPOFF
@l2: lda (A1L)
2021-11-06 00:44:04 +00:00
sta ALTZPON
2021-11-06 01:21:23 +00:00
sta (A4L)
inc A4L
bne @l3
2021-11-06 01:21:23 +00:00
inc A4H
@l3: sta ALTZPOFF
2021-11-06 01:21:23 +00:00
lda A1L
cmp A2L
lda A1H
sbc A2H
inc A1L
bne @l4
2021-11-06 01:21:23 +00:00
inc A1H
@l4: bcc @l2
bra @l9
2021-11-06 00:44:04 +00:00
@l5: sta RDCARDRAM
2021-11-06 00:44:04 +00:00
sta WRMAINRAM
2021-11-06 01:21:23 +00:00
lda A1L
ldx A1H
2021-11-06 00:44:04 +00:00
sta ALTZPON
2021-11-06 01:21:23 +00:00
sta A1L
stx A1H
@l6: sta ALTZPON
2021-11-06 01:21:23 +00:00
lda (A1L)
ldx A1L
ldy A1H
inc A1L
bne @l7
2021-11-06 01:21:23 +00:00
inc A1H
@l7: sta ALTZPOFF
2021-11-06 01:21:23 +00:00
sta (A4L)
inc A4L
bne @l8
2021-11-06 01:21:23 +00:00
inc A4H
@l8: cpx A2L
2021-11-06 00:44:04 +00:00
tya
2021-11-06 01:21:23 +00:00
sbc A2H
bcc @l6
@l9: sta ALTZPOFF
2021-11-06 00:44:04 +00:00
sta WRCARDRAM
plp
bmi @l10
2021-11-06 00:44:04 +00:00
sta WRMAINRAM
@l10: sta RDCARDRAM
2021-11-06 00:44:04 +00:00
plp
bmi @l11
2021-11-06 00:44:04 +00:00
sta RDMAINRAM
@l11: plp
bpl @l12
2021-11-06 00:44:04 +00:00
sta SET80COL
@l12: rts
2021-11-06 00:44:04 +00:00
@l13: bcc @l14
2021-11-06 00:44:04 +00:00
sta RDMAINRAM
sta WRCARDRAM
2021-11-06 01:21:23 +00:00
lda A4L
ldy A4H
2021-11-06 00:44:04 +00:00
sta ALTZPON
2021-11-06 01:21:23 +00:00
sta A4L
sty A4H
2021-11-06 00:44:04 +00:00
sta ALTZPOFF
ldy #$00
2021-11-06 03:24:49 +00:00
: lda (A1L),y
2021-11-06 00:44:04 +00:00
sta ALTZPON
2021-11-06 01:21:23 +00:00
sta (A4L),y
2021-11-06 00:44:04 +00:00
sta ALTZPOFF
iny
2021-11-06 03:24:49 +00:00
bne :-
2021-11-06 01:21:23 +00:00
inc A1H
2021-11-06 03:24:49 +00:00
sta ALTZPON
2021-11-06 01:21:23 +00:00
inc A4H
2021-11-06 00:44:04 +00:00
sta ALTZPOFF
dex
2021-11-06 03:24:49 +00:00
bne :-
bra @l15
2021-11-06 00:44:04 +00:00
@l14: sta RDCARDRAM
2021-11-06 00:44:04 +00:00
sta WRMAINRAM
2021-11-06 01:21:23 +00:00
lda A1L
ldy A1H
2021-11-06 00:44:04 +00:00
sta ALTZPON
2021-11-06 01:21:23 +00:00
sta A1L
sty A1H
2021-11-06 00:44:04 +00:00
ldy #$00
2021-11-06 03:24:49 +00:00
: sta ALTZPON
2021-11-06 01:21:23 +00:00
lda (A1L),y
2021-11-06 00:44:04 +00:00
sta ALTZPOFF
2021-11-06 01:21:23 +00:00
sta (A4L),y
2021-11-06 00:44:04 +00:00
iny
2021-11-06 03:24:49 +00:00
bne :-
2021-11-06 01:21:23 +00:00
inc A4H
2021-11-06 00:44:04 +00:00
sta ALTZPON
2021-11-06 03:24:49 +00:00
inc A1H
sta ALTZPOFF
dex
bne :-
@l15: jmp @l9
2021-11-06 00:44:04 +00:00
2021-11-11 07:17:24 +00:00
;;; ============================================================
.assert * = $CFE7, error, "Something changed size"
2021-11-10 02:17:23 +00:00
;;; ============================================================
.if INCLUDE_PATCHES
Patch1:
lda CH
cmp XCOORD
bne :+
lda OURCH
: rts
Patch2:
sty OURCH
sty XCOORD
rts
Patch3:
stx OURCH
stx XCOORD
rts
.endif
2021-11-06 03:24:49 +00:00
;;; ============================================================
.res $D000 - *, 0
2021-11-10 02:17:23 +00:00
;;; ============================================================
.assert * = $D000, error, "Length changed"