2016-10-16 15:11:04 +00:00
|
|
|
;
|
|
|
|
; 4LIVE
|
|
|
|
; a 4am & san inc hack
|
|
|
|
;
|
|
|
|
!cpu 6502
|
|
|
|
*=$8000
|
2016-10-27 19:16:02 +00:00
|
|
|
!to "_4live#068000", plain
|
2016-10-16 15:11:04 +00:00
|
|
|
;
|
2016-10-27 19:16:02 +00:00
|
|
|
!addr WNDLFT = $20
|
|
|
|
!addr WNDWDTH = $21
|
|
|
|
!addr WNDTOP = $22
|
|
|
|
!addr WNDBTM = $23
|
2016-10-26 21:02:52 +00:00
|
|
|
!addr CH = $24
|
|
|
|
!addr CV = $25
|
|
|
|
!addr GBASL = $26
|
|
|
|
!addr GBASH = $27
|
|
|
|
!addr BASL = $28
|
|
|
|
!addr BASH = $29
|
|
|
|
!addr BAS2L = $2A
|
|
|
|
!addr BAS2H = $2B
|
2016-10-16 18:32:54 +00:00
|
|
|
!addr KSWL = $38
|
2016-10-26 21:02:52 +00:00
|
|
|
!addr KSWH = $39
|
2016-10-27 19:16:02 +00:00
|
|
|
!addr GETIOB = $3E3
|
2016-10-16 18:32:54 +00:00
|
|
|
!addr RECONNECTDOS = $3EA
|
|
|
|
!addr WARMDOS = $3D0
|
2016-10-27 19:16:02 +00:00
|
|
|
!addr DOSBASE = $3D2
|
|
|
|
!addr FILEMAN = $3D6
|
|
|
|
!addr GETPARM = $3DC
|
2016-10-16 18:32:54 +00:00
|
|
|
!addr KBD = $C000
|
|
|
|
!addr STROBE = $C010
|
2016-10-27 19:16:02 +00:00
|
|
|
!addr GBASCALC = $F847
|
2016-10-26 21:02:52 +00:00
|
|
|
!addr BASCALC = $FBC1
|
|
|
|
!addr SCROLL = $FC70
|
|
|
|
!addr WAIT = $FCA8
|
|
|
|
!addr KEYIN = $FD1B
|
2016-10-16 18:32:54 +00:00
|
|
|
!addr COUT = $FDED
|
|
|
|
|
2016-10-26 21:02:52 +00:00
|
|
|
;private arbitrary addresses
|
2016-10-27 19:16:02 +00:00
|
|
|
!addr MANPARML = $40
|
|
|
|
!addr MANPARMH = $41
|
|
|
|
!addr DOSBUFL = $42
|
|
|
|
!addr DOSBUFH = $43
|
|
|
|
!addr ADDRESSL = $44
|
|
|
|
!addr ADDRESSH = $45
|
|
|
|
!addr FILESIZEL = $46
|
|
|
|
!addr FILESIZEH = $47
|
|
|
|
!addr OPSRCL = $48
|
|
|
|
!addr OPSRCH = $49
|
|
|
|
!addr OPDSTL = $4a
|
|
|
|
!addr OPDSTH = $4b
|
|
|
|
!addr LINE = $4c
|
|
|
|
!addr ANIMATE = $4d
|
2016-10-26 21:02:52 +00:00
|
|
|
|
2016-10-16 18:32:54 +00:00
|
|
|
HOTKEY = $80 ; CTRL-@
|
2016-10-27 19:16:02 +00:00
|
|
|
IMPORTKEY = $89 ; CTRL-I
|
|
|
|
SAVEKEY = $93 ; CTRL-S
|
2016-10-16 18:32:54 +00:00
|
|
|
|
2016-10-26 21:02:52 +00:00
|
|
|
;constants
|
|
|
|
RETURN = $8D
|
|
|
|
WIDTH = 40
|
|
|
|
HEIGHT = 24
|
2016-10-27 19:16:02 +00:00
|
|
|
IOBSLOT = 1
|
|
|
|
IOBDRIVE = 2
|
|
|
|
NEXTFILE = 36
|
|
|
|
PARMRANGE = 6
|
|
|
|
PARMFILE = 8
|
|
|
|
PARMWORK = 12
|
|
|
|
NAMELEN = 30
|
|
|
|
CREATEFILE = 0
|
|
|
|
OPENEXISTING = 1
|
|
|
|
SPECIAL = 16
|
|
|
|
CMDOPEN = 1
|
|
|
|
CMDCLOSE = 2
|
|
|
|
CMDREAD = 3
|
|
|
|
CMDWRITE = 4
|
|
|
|
READRANGE = 2
|
2016-10-26 21:02:52 +00:00
|
|
|
|
2016-10-16 18:32:54 +00:00
|
|
|
;
|
|
|
|
|
2016-10-27 19:16:02 +00:00
|
|
|
Install
|
|
|
|
|
|
|
|
;find a free DOS buffer
|
|
|
|
|
|
|
|
ldy #0
|
|
|
|
sty DOSBUFL
|
|
|
|
lda DOSBASE
|
|
|
|
sta DOSBUFH
|
|
|
|
!byte $2C ;mask LDY
|
|
|
|
- ldy #NEXTFILE
|
|
|
|
lda (DOSBUFL), y
|
|
|
|
tax
|
|
|
|
iny
|
|
|
|
lda (DOSBUFL), y
|
|
|
|
stx DOSBUFL
|
|
|
|
sta DOSBUFH
|
|
|
|
|
|
|
|
;set filename pointer in MLI request packet
|
|
|
|
|
|
|
|
stx FileName
|
|
|
|
sta FileName + 1
|
|
|
|
|
|
|
|
;check for empty filename (indicates free buffer)
|
|
|
|
|
|
|
|
ldy #0
|
|
|
|
lda (DOSBUFL), y
|
|
|
|
bne -
|
|
|
|
|
|
|
|
;get file manager parameter list
|
|
|
|
|
|
|
|
jsr GETPARM
|
|
|
|
sty MANPARML
|
|
|
|
sta MANPARMH
|
|
|
|
|
|
|
|
;copy DOS buffer pointers to file manager parameter list
|
|
|
|
|
|
|
|
lda #NAMELEN
|
|
|
|
sta OPDSTL
|
|
|
|
lda #PARMWORK
|
|
|
|
sta OPDSTH
|
|
|
|
ldx #(6 - 1)
|
|
|
|
- ldy OPDSTL
|
|
|
|
lda (DOSBUFL), y
|
|
|
|
ldy OPDSTH
|
|
|
|
sta (MANPARML), y
|
|
|
|
inc OPDSTL
|
|
|
|
inc OPDSTH
|
|
|
|
dex
|
|
|
|
bpl -
|
|
|
|
|
|
|
|
;set input name
|
|
|
|
|
|
|
|
ldy #(NAMELEN - 1)
|
|
|
|
lda #$A0
|
|
|
|
- cpy #(FileName_e - FileName_b)
|
|
|
|
bcs +
|
|
|
|
lda FileName_b, y
|
|
|
|
+ sta (DOSBUFL), y
|
|
|
|
dey
|
|
|
|
bpl -
|
|
|
|
sty ANIMATE ;enable visible screen-swapping via #$FF
|
|
|
|
|
|
|
|
;open source file and read it if available
|
|
|
|
|
|
|
|
jsr OpenReadFile
|
|
|
|
lda SaveCH
|
|
|
|
sta MyCH
|
|
|
|
lda SaveCV
|
|
|
|
sta MyCV
|
|
|
|
|
|
|
|
;switch to write mode for future accesses
|
|
|
|
|
|
|
|
inc ReadWriteCmd ;lda WRITECMD / sta ReadWriteCmd
|
|
|
|
|
|
|
|
;display the welcome message, now that we're finally done
|
|
|
|
|
2016-10-16 18:32:54 +00:00
|
|
|
ldy #0
|
|
|
|
beq +
|
2016-10-26 21:02:52 +00:00
|
|
|
- jsr COUT
|
|
|
|
+ iny
|
|
|
|
lda _WelcomeMessage-1,y
|
2016-10-16 18:32:54 +00:00
|
|
|
bne -
|
|
|
|
lda #<GlobalKeyboardHook
|
|
|
|
sta KSWL
|
|
|
|
lda #>GlobalKeyboardHook
|
2016-10-26 21:02:52 +00:00
|
|
|
sta KSWH
|
2016-10-27 19:16:02 +00:00
|
|
|
jsr RECONNECTDOS
|
|
|
|
jmp WARMDOS
|
|
|
|
|
|
|
|
_WelcomeMessage
|
|
|
|
!scrxor $80, $8D, "4LIVE READY. PRESS CTRL-", HOTKEY + $40, " TO ACTIVATE.", $8D, 0
|
|
|
|
|
|
|
|
;support enhanced flashing cursor while waiting for key, if available
|
|
|
|
;it works by passing to the routine the character under the cursor
|
|
|
|
;the ROM toggles between that character and the Delete character
|
|
|
|
|
|
|
|
GetKey
|
|
|
|
ldy CH
|
|
|
|
lda (BASL), y
|
2016-10-16 18:32:54 +00:00
|
|
|
|
|
|
|
GlobalKeyboardHook
|
2016-10-27 19:16:02 +00:00
|
|
|
;let DOS handle initial cursor
|
|
|
|
|
2016-10-26 21:02:52 +00:00
|
|
|
jsr KEYIN
|
2016-10-16 18:32:54 +00:00
|
|
|
cmp #HOTKEY
|
2016-10-27 19:16:02 +00:00
|
|
|
bne KeyRet
|
|
|
|
jsr SwitchScreens
|
2016-10-26 21:02:52 +00:00
|
|
|
jsr EditorMode
|
|
|
|
jsr SwitchScreens
|
2016-10-27 19:16:02 +00:00
|
|
|
beq GetKey ;always
|
2016-10-26 21:02:52 +00:00
|
|
|
|
|
|
|
SwitchScreens
|
|
|
|
jsr SwapCoords
|
|
|
|
|
|
|
|
;copy first line of physical screen to first line of virtual screen
|
|
|
|
|
|
|
|
lda #HEIGHT
|
2016-10-27 19:16:02 +00:00
|
|
|
sta LINE
|
|
|
|
-- ldy #(WIDTH - 1)
|
2016-10-26 21:02:52 +00:00
|
|
|
- lda $400, y
|
2016-10-27 19:16:02 +00:00
|
|
|
sta FirstLine, y
|
2016-10-26 21:02:52 +00:00
|
|
|
dey
|
|
|
|
bpl -
|
|
|
|
|
|
|
|
;scroll up physical screen
|
|
|
|
|
|
|
|
jsr SCROLL
|
|
|
|
|
|
|
|
;append line from virtual screen
|
|
|
|
|
2016-10-27 19:16:02 +00:00
|
|
|
ldy #(WIDTH - 1)
|
|
|
|
- lda LastLine, y
|
|
|
|
sta $7D0, y
|
2016-10-26 21:02:52 +00:00
|
|
|
dey
|
|
|
|
bpl -
|
|
|
|
|
|
|
|
;scroll down virtual screen
|
|
|
|
|
2016-10-27 19:16:02 +00:00
|
|
|
jsr VirtScroll
|
|
|
|
|
|
|
|
lda ANIMATE
|
|
|
|
beq +
|
2016-10-26 21:02:52 +00:00
|
|
|
|
|
|
|
;animate it just for fun
|
|
|
|
|
|
|
|
jsr Delay
|
2016-10-27 19:16:02 +00:00
|
|
|
|
|
|
|
+ dec LINE
|
2016-10-26 21:02:52 +00:00
|
|
|
bne --
|
2016-10-27 19:16:02 +00:00
|
|
|
|
|
|
|
KeyRet
|
2016-10-26 21:02:52 +00:00
|
|
|
rts
|
|
|
|
|
|
|
|
;scroll HEIGHT lines
|
|
|
|
|
2016-10-27 19:16:02 +00:00
|
|
|
VirtScroll
|
|
|
|
lda #<(LastLine - WIDTH)
|
2016-10-26 21:02:52 +00:00
|
|
|
sta GBASL
|
2016-10-27 19:16:02 +00:00
|
|
|
lda #>(LastLine - WIDTH)
|
2016-10-26 21:02:52 +00:00
|
|
|
sta GBASH
|
2016-10-27 19:16:02 +00:00
|
|
|
lda #<LastLine
|
2016-10-26 21:02:52 +00:00
|
|
|
sta BAS2L
|
2016-10-27 19:16:02 +00:00
|
|
|
lda #>LastLine
|
2016-10-26 21:02:52 +00:00
|
|
|
sta BAS2H
|
|
|
|
ldx #HEIGHT
|
2016-10-27 19:16:02 +00:00
|
|
|
-- ldy #(WIDTH - 1)
|
2016-10-26 21:02:52 +00:00
|
|
|
- lda (GBASL), y
|
|
|
|
sta (BAS2L), y
|
|
|
|
dey
|
|
|
|
bpl -
|
|
|
|
sec
|
|
|
|
lda GBASL
|
|
|
|
sbc #WIDTH
|
|
|
|
sta GBASL
|
|
|
|
bcs +
|
|
|
|
dec GBASH
|
|
|
|
sec
|
|
|
|
+ lda BAS2L
|
|
|
|
sbc #WIDTH
|
|
|
|
sta BAS2L
|
|
|
|
bcs +
|
|
|
|
dec BAS2H
|
|
|
|
+ dex
|
|
|
|
bne --
|
|
|
|
rts
|
|
|
|
|
|
|
|
Delay
|
|
|
|
ldy #5
|
2016-10-27 19:16:02 +00:00
|
|
|
lda #0
|
|
|
|
- jsr WAIT
|
2016-10-26 21:02:52 +00:00
|
|
|
dey
|
|
|
|
bne -
|
|
|
|
rts
|
|
|
|
|
|
|
|
;swap real X/Y with virtual X/Y
|
|
|
|
;and recalculate screen position
|
|
|
|
|
|
|
|
SwapCoords
|
2016-10-27 19:16:02 +00:00
|
|
|
ldx #(6 - 1)
|
|
|
|
- ldy WNDLFT, x
|
|
|
|
lda MyWNDLFT, x
|
|
|
|
sta WNDLFT, x
|
|
|
|
tya
|
|
|
|
sta MyWNDLFT, x
|
|
|
|
dex
|
|
|
|
bpl -
|
2016-10-26 21:02:52 +00:00
|
|
|
jmp BASCALC
|
|
|
|
|
2016-10-27 19:16:02 +00:00
|
|
|
;restore temporarily the original screen
|
|
|
|
;so that notes are stored together
|
|
|
|
|
|
|
|
SaveFile
|
|
|
|
lda CH
|
|
|
|
sta SaveCH
|
|
|
|
lda CV
|
|
|
|
sta SaveCV
|
|
|
|
inc ANIMATE ;disable animation (was #$FF from above)
|
|
|
|
jsr SwitchScreens
|
|
|
|
jsr CreateWriteFile
|
|
|
|
jsr SwitchScreens
|
|
|
|
dec ANIMATE ;re-enable animation
|
|
|
|
|
|
|
|
;print anything that isn't a special key
|
|
|
|
;wrap around screen position when we hit edges
|
|
|
|
|
2016-10-26 21:02:52 +00:00
|
|
|
EditorMode
|
|
|
|
ldy CH
|
|
|
|
lda (BASL), y
|
|
|
|
jsr KEYIN
|
|
|
|
cmp #HOTKEY
|
2016-10-27 19:16:02 +00:00
|
|
|
beq KeyRet
|
|
|
|
cmp #SAVEKEY
|
|
|
|
beq SaveFile
|
|
|
|
cmp #IMPORTKEY
|
|
|
|
beq ImportScreen
|
|
|
|
jsr COUT
|
|
|
|
lda CV
|
|
|
|
eor #(HEIGHT - 1) ;zero on match
|
|
|
|
bne EditorMode
|
|
|
|
sta CV
|
|
|
|
jsr BASCALC
|
|
|
|
bcc EditorMode ;always
|
|
|
|
|
|
|
|
ImportScreen
|
|
|
|
lda #<(FirstLine + WIDTH)
|
|
|
|
sta OPSRCL
|
|
|
|
lda #>(FirstLine + WIDTH)
|
|
|
|
sta OPSRCH
|
|
|
|
ldx #(HEIGHT - 2)
|
|
|
|
|
|
|
|
;use graphics function to not disturb text state
|
|
|
|
|
|
|
|
-- txa
|
|
|
|
jsr GBASCALC
|
|
|
|
ldy #(WIDTH - 1)
|
|
|
|
- lda (OPSRCL), y
|
|
|
|
sta (GBASL), y
|
|
|
|
dey
|
|
|
|
bpl -
|
|
|
|
lda OPSRCL
|
|
|
|
clc
|
|
|
|
adc #WIDTH
|
|
|
|
sta OPSRCL
|
|
|
|
bcc +
|
|
|
|
inc OPSRCH
|
|
|
|
+ dex
|
|
|
|
bpl --
|
|
|
|
bmi EditorMode
|
|
|
|
|
|
|
|
OpenReadFile
|
|
|
|
jsr GETIOB
|
|
|
|
sty OPSRCL
|
|
|
|
sta OPSRCH
|
|
|
|
ldy #IOBSLOT
|
|
|
|
lda (OPSRCL), y
|
|
|
|
lsr
|
|
|
|
lsr
|
|
|
|
lsr
|
|
|
|
lsr
|
|
|
|
sta FileSlot
|
|
|
|
iny ;ldy #IOBDRIVE
|
|
|
|
lda (OPSRCL), y
|
|
|
|
sta FileDrive
|
|
|
|
ldx #OPENEXISTING
|
|
|
|
jsr OpenCommon
|
|
|
|
bcs OpenRet
|
|
|
|
|
|
|
|
ReadFile
|
|
|
|
WriteFile
|
|
|
|
jsr DOSMLI
|
|
|
|
!byte ReadMLI_e - ReadMLI_b
|
|
|
|
ReadMLI_b
|
|
|
|
ReadWriteCmd
|
|
|
|
!byte CMDREAD
|
|
|
|
!byte READRANGE
|
|
|
|
!word 0 ;record number
|
|
|
|
!word 0 ;offset
|
|
|
|
WriteSize
|
|
|
|
!word -1 ;number of bytes
|
|
|
|
!word LoadSaveStart ;buffer
|
|
|
|
ReadMLI_e
|
|
|
|
|
|
|
|
CloseFile
|
|
|
|
jsr DOSMLI
|
|
|
|
!byte CloseMLI_e - CloseMLI_b
|
|
|
|
CloseMLI_b
|
|
|
|
!byte CMDCLOSE
|
|
|
|
CloseMLI_e
|
|
|
|
OpenRet
|
|
|
|
rts
|
|
|
|
|
|
|
|
OpenCommon
|
|
|
|
jsr DOSMLI
|
|
|
|
!byte OpenMLI_e - OpenMLI_b
|
|
|
|
OpenMLI_b
|
|
|
|
!byte CMDOPEN
|
|
|
|
!byte 0 ;unused
|
|
|
|
!word 0 ;variable records
|
|
|
|
!byte 0 ;any volume
|
|
|
|
FileDrive
|
|
|
|
!text "Q" ;self-modified
|
|
|
|
FileSlot
|
|
|
|
!text "Q" ;self-modified
|
|
|
|
!byte SPECIAL ;file type for when we save
|
|
|
|
FileName
|
|
|
|
!text "4s" ;self-modified
|
|
|
|
OpenMLI_e
|
|
|
|
rts
|
2016-10-26 21:02:52 +00:00
|
|
|
|
2016-10-27 19:16:02 +00:00
|
|
|
CreateWriteFile
|
|
|
|
ldx #CREATEFILE
|
|
|
|
jsr OpenCommon
|
|
|
|
bcs OpenRet
|
|
|
|
lda #<(LoadSaveEnd - LoadSaveStart)
|
|
|
|
sta WriteSize
|
|
|
|
lda #>(LoadSaveEnd - LoadSaveStart)
|
|
|
|
sta WriteSize + 1
|
|
|
|
bcc WriteFile ;always
|
|
|
|
|
|
|
|
;first byte fetched is number of byte to follow,
|
|
|
|
;copy parameters to file manager parameter list,
|
|
|
|
;and then dispatch the request
|
|
|
|
|
|
|
|
DOSMLI
|
|
|
|
pla
|
|
|
|
tay
|
|
|
|
pla
|
|
|
|
sta OPSRCH
|
|
|
|
iny
|
|
|
|
sty OPSRCL
|
|
|
|
bne +
|
|
|
|
inc OPSRCH
|
|
|
|
+ ldy #0
|
|
|
|
lda (OPSRCL), y
|
|
|
|
tay
|
|
|
|
- lda (OPSRCL), y
|
|
|
|
dey
|
|
|
|
sta (MANPARML), y
|
|
|
|
bne -
|
|
|
|
lda (OPSRCL), y
|
|
|
|
clc
|
|
|
|
adc OPSRCL
|
|
|
|
tay
|
|
|
|
lda OPSRCH
|
|
|
|
adc #0
|
|
|
|
pha
|
|
|
|
tya
|
|
|
|
pha
|
|
|
|
jmp FILEMAN
|
|
|
|
|
|
|
|
FileName_b
|
|
|
|
!scrxor $80, $DF, "4LIVE DATA"
|
|
|
|
FileName_e
|
|
|
|
|
|
|
|
MyWNDLFT
|
|
|
|
!byte 0
|
|
|
|
MyWNDWDTH
|
|
|
|
!byte WIDTH
|
|
|
|
MyWNDTOP
|
|
|
|
!byte 0
|
|
|
|
MyWNDBTM
|
|
|
|
!byte HEIGHT
|
|
|
|
MyCH
|
|
|
|
!byte 0
|
|
|
|
MyCV
|
|
|
|
!byte 0
|
|
|
|
|
|
|
|
LoadSaveStart
|
|
|
|
|
|
|
|
SaveCH
|
|
|
|
!byte 0 ;loaded from file if exists
|
|
|
|
SaveCV
|
|
|
|
!byte 0 ;loaded from file if exists
|
|
|
|
|
|
|
|
FirstLine
|
2016-10-26 21:02:52 +00:00
|
|
|
;pre-screen line to catch scroll
|
2016-10-27 19:16:02 +00:00
|
|
|
!fill WIDTH, $A0
|
2016-10-26 21:02:52 +00:00
|
|
|
|
|
|
|
;we reserve one line for status
|
2016-10-27 19:16:02 +00:00
|
|
|
|
|
|
|
!text "CTRL+("
|
|
|
|
!scrxor $40, IMPORTKEY
|
|
|
|
!text ")MPORT ("
|
|
|
|
!scrxor $40, SAVEKEY
|
|
|
|
!text ")AVE"
|
|
|
|
!text " "
|
2016-10-26 21:02:52 +00:00
|
|
|
!scrxor $80, "4LIVE-1"
|
|
|
|
|
|
|
|
;not the full $400 to save memory
|
2016-10-27 19:16:02 +00:00
|
|
|
!fill WIDTH * (HEIGHT - 2), $A0
|
|
|
|
|
|
|
|
LastLine
|
|
|
|
!fill WIDTH, $A0
|
2016-10-26 21:02:52 +00:00
|
|
|
|
2016-10-27 19:16:02 +00:00
|
|
|
LoadSaveEnd
|