EdAsm/EDASM.SRC/EI/EDASMINT.S

1537 lines
44 KiB
ArmAsm

Name : EDASMINT.S
End of file : 27,137
This file was generated using the DiskBrowser utility with minimal editing.
It is meant for viewing purposes only.
ORG $B100
;=================================================
; EDASM Command Interpreter
; This module references of a number
; of routines and tables of EdAsm.Ed
;
EIStart EQU *
LDX #3
LB102 LDA LB296,X ;Mark pages $B1-$B8
STA BitMap+20,X ; & $BF as used
LDA LB29D,X
STA PrtError,X
DEX
BPL LB102
;
; Setup RESET vector
;
LDX #2
LB113 LDA LB29A,X
STA SOFTEV,X
DEX
BPL LB113
;
; Setup ctrl-Y command
;
LDA #$4C
STA USRADR
LDA #>EIWrmStrt
STA USRADR+1
LDA #<EIWrmStrt
STA USRADR+2
;
LDA TxtBgn+1 ;R5
STA TxtEnd+1 ;R7
LDA #$01
STA TxtBgn
STA TxtEnd ;=$0801
;
LDA #>X9900
STA HiMem ;HiMem for Editor=$9900
LDA #<X9900
STA HiMem+1
;
SEC
SBC TxtBgn+1
STA FreeMem+1 ;=$99-$08
LDA #$00
STA FreeMem
JSR LB741 ;Load EdAsm.Ed
;
LDA #$00
STA ExitFlag
BIT RDBANK2
JSR LB3A4
BIT RDBANK2
JSR XDD41 ;Init tab table etc
JSR LB85D ;Empty text buffer
JSR ClearScr
;
LDY #0
LB164 LDA X9F83,Y ;Display copyrights
BEQ LB16F
JSR PrChar
INY
BNE LB164
;
; Check for the presence of the EdAsm.AutoST file
;
LB16F LDA #CR
STA SavCmdB
JSR LB836 ;Set curr pfx to EdAsm's dir
LDA #>X9D14 ;Is EdAsm.AutoST present?
STA Reg4
LDA #<X9D14
STA Reg4+1
LDA #TXTtype
JSR CkAttrF
BCS LB195 ;Not Found
BNE LB195 ;Found but wrong type
;
LDX #>XAD00 ;1024-byte I/O buffer
LDY #<XAD00
JSR OpenDFile ;Open it
JSR LB866 ;Set prefix to curr pfx
JMP LB9D6 ;Proceed to read and exec its cmds
;
LB195 JSR LB866
;
; ($B198) Reset/Ctrl-Y Entry Point
;
EIWrmStrt EQU * ;ENTRY
LDA #$00
STA PtrMode ;Disable printer
BIT ExecMode
BPL EIMainLoop ;No
ASL ExecMode
LDA RdExeRN
STA CloseRN
JSR ClsFile
;
; $B1AB
;
EIMainLoop EQU * ;ENTRY
JSR PRODOS8
DB $82
DW *
;
JSR X9E55 ;Date/Time Conversion
JSR XA788 ;Setup/reset I/O Hooks
JSR PrtCR
;
LDY #0 ;Display Date/Time
LB1BC LDA DateTime,Y
JSR PrChar
INY
CPY #16
BCC LB1BC
;
LDA #0
STA MulCmdF
LB1CB EQU * ;ENTRY
BIT RDBANK2
JSR XA788 ;Setup/Reset I/O Hooks
;
LDA #0
STA PrintF ;Default to List
STA HelpF
JSR PrtCR
LB1DA LDA SwapMode ;Do we have a split txt buf?
BEQ LB1E3 ;No
ORA #'0' ;=$31/$32
JSR PrChar
;
LB1E3 LDA #$FF
STA InvFlg
LDA CmdDelim
STA Prompt
JSR LB2BD ;Get next cmd
;
LB1EE TXA ;Do we have a cmd pending?
BEQ EIMainLoop ;No
LDA InBuf
CMP #'*' ;Ignore the cmd
BEQ LB1DA
CMP #CTRLR ;Repeat List cmd?
BNE LB202
JSR LB2A1 ;Yes
JMP LB1EE
;
; Search Editor's command table
;
LB202 LDA #>XDE18 ;Ptr to start of
STA LB286+1
LDA #<XDE18 ; Editor's cmd table
STA LB286+2
JSR X9AA5 ;Set R12 to point @ $BD00 buf
;
; Command parser
;
LB20F LDX #0 ;Index fr BO InBuf
LB211 EQU * ;ENTRY
JSR GetNBChar ;Get a char and store in $12
CPX #1
BNE LB226
CMP #'/' ;Help
BEQ LB220
CMP #'?'
BNE LB226
;
LB220 LDA #$80 ;Flag help
STA HelpF
BNE LB211 ;always
;
; NB: Command Text is stored as a string of hi-ASCII
;
LB226 JSR GetToken ;Get token/char fr cmd table
BPL LB250 ;It's a token
;
AND #$7F
CMP Z12 ;Char fr InBuf (cmd line)
BEQ LB211 ;Got a match
CMP #'a'-1
BCC LB23D
AND #$DF ;Convert to ucase
CMP Z12 ; and try again
BEQ LB211 ;Got a match
BNE LB226 ;No hit, try next token fr cmd table
;
LB23D CMP #','
BEQ LB226
CMP #'-'
BEQ LB226
;
; Not this command
;
LB245 JSR GetToken ;Get token fr cmd table
BNE LB245 ;Skip cmd text
JSR GetToken ;Get token fr cmd table
JMP LB20F ;Start fr BO InBuf
;
LB250 BIT HelpF ;Display Help?
BPL LB257
JMP DoHelp ;Yes
;
; (A)-index (even #) into JMP table
; Use helper functions to parse a
; command line for user's parms
;
LB257 TAY ;Got the cmd now
INY
LDA X9D21,Y ;Get its jmp addr
PHA ;Hibyte
DEY
LDA X9D21,Y ;JMP via RTS
PHA ;LoByte
RTS
;=================================================
; Get char fr input buffer
; Input
; ( X)-index into input buffer
; InBuf - user entry
; Output
; (A)-char converted to ucase as required
; (X)=(X)+1
;
GetChar EQU *
LDA InBuf,X
AND #$7F
INX
CMP #'z'+1
BCS LB273
CMP #'a'
BCC LB273
AND #$DF
LB273 RTS
;=================================================
; ($B274) Get a non-blank char ignoring preceding spaces
; Output
; (A)-char fr InBuf
; (Z12)-char fr InBuf
;
GetNBChar EQU * ;ENTRY
JSR GetChar ;Get char fr InBuf
CMP #SPACE
BEQ GetNBChar ;skip spaces
STA Z12
RTS
;=================================================
; ($B27E) Get token fr cmd table ($DE18)
;
GetToken EQU *
INC LB286+1
BNE LB286
INC LB286+2
LB286 EQU * ;ENTRY
LDA IRQV+1 ;self-modifying code
LB289 RTS ;ENTRY
;=================================================
; Print EI's Error Messages
;
; (X)-index into message table $9CA0
;
LB28A EQU * ;ENTRY
LDX #$31 ;Unknown cmd
BNE LB290
LB28E EQU * ;ENTRY
LDX #$00 ;cmd syntax
LB290 EQU * ;ENTRY
JSR X9C98 ;Editor's Err Msg Printer
JMP EIMainLoop
;=================================================
LB296 DB $00,$00,$7F,$81 ;mem bits
LB29A DW EIWrmStrt ;RESET vector
DB $14 ;poweredup byte
;=================================================
LB29D EQU *
JSR PrErrMsg2
RTS
;=================================================
; Restore the most recent LIST cmd into InBuf
;
LB2A1 EQU *
LDX #-1
LB2A3 INX
LDA SavCmdB,X
STA InBuf,X
CMP #CR
BNE LB2A3
RTS
;=================================================
; Save List cmd for later use (via ctrl-R)
;
LB2AF EQU *
LDX #0
LB2B1 LDA InBuf,X
STA SavCmdB,X
INX
CMP #CR
BNE LB2B1
RTS
;=================================================
; Get the next cmd. If we are processing a multiple
; cmd line, then get it from the ExecLineB. Else
; read a command from the EXEC (txt) file
;
; Output
; (X)-index eol
;
LB2BD EQU *
BIT MulCmdF ;Multiple cmds?
BMI LB305 ;Yes
BIT ExecMode
BPL LB2F7 ;No
JSR PRODOS8
DB $CA
DW RdExecP
BNE LB2E5 ;(A)=error code
;
LDA #'+' ;Show we have just read a cmd
JSR PrChar ; line fr the EXEC file
LDY #0
LB2D4 LDA InBuf,Y
JSR PrChar
INY
CPY LBA9E
BCC LB2D4
;
LDX LBA9E ;Empty Line?
BNE LB2FA ;No
LB2E5 ASL ExecMode ;msb off
LDX RdExeRN
STX CloseRN
JSR ClsFile2
CMP #$4C ;EOF?
BEQ LB2F7 ;yep
JMP PrErrMsg
;
LB2F7 JSR XA70B ;Get user's cmd
LB2FA LDA InBuf,X
STA ExecLineB,X
DEX
BNE LB2FA
BEQ LB318 ;always
;
; Move next cmd forward and copy it to InBuf as well
;
LB305 LDX BufIndex
LDY #0
LB309 LDA ExecLineB,X
STA ExecLineB,Y
STA InBuf,Y
INY
INX
CMP #CR
BNE LB309
;
LB318 LDX #0
LB31A LDA InBuf,X
CMP CmdDelim ;Is it the cmd delimiter?
BEQ LB32B ;Yes
CMP #CR
BEQ LB328
INX
BNE LB31A
LB328 STA MulCmdF ;Flag there are no more multiple cmds
RTS
;
LB32B LDA #$80
STA MulCmdF ;Flag we have a multiple cmd line
LDA #CR
STA InBuf,X ;Terminate the cmd
INX
STX BufIndex ;Save index to 1st char of next cmd
DEX
RTS
;=================================================
; $B339
;
PrtCR EQU * ;ENTRY
LDA #CR
BNE PrChar
RingBell EQU * ;ENTRY
LDA #BEL
BNE PrChar
ClearScr EQU *
LDA #FF ;Form Feed
PrChar EQU * ;ENTRY
ORA #$80
CMP #BS+$80
BNE LB34F
DEC PrColumn
BPL LB34F
INC PrColumn ;Reset to 0
LB34F CMP #SPACE+$80 ;ctrl-chars?
BCC LB355 ;Yes, non-printable
INC PrColumn
LB355 CMP #CR+$80
BNE LB35F
PHA
LDA #0
STA PrColumn
PLA
;
LB35F BIT RDROM2
JSR COUT
BIT RDBANK2
AND #$7F
RTS
;=================================================
; Monitor rtns
;
LB36B EQU * ;ENTRY
BIT RDROM2
JSR VTABZ
BIT RDBANK2
RTS
;
LB375 EQU * ;ENTRY
BIT RDROM2
JSR BELL1
BIT RDBANK2
RTS
;
LB37F EQU * ;ENTRY
BIT RDROM2
JSR PRBLNK
BIT RDBANK2
RTS
;
LB389 EQU * ;ENTRY
BIT RDROM2
JSR PRNTAX
BIT RDBANK2
RTS
;
LB393 EQU * ;ENTRY
BNE LB39E
BIT RDROM2
JSR SETKBD
JSR SETVID
LB39E BIT RDROM2
JMP MONZ
;=================================================
; Perform some checks and inits
;
LB3A4 EQU *
LDA #0
STA MulCmdF
STA PrColumn
LDY #2
LB3AC STA DevCtlS,Y
DEY
BPL LB3AC
;
LDA #$FF
STA TruncF ;trunc flag $FF=OFF, $00=ON
STA CaseMode ;case flag msb=1 - ucase
LDA #':' ;Default cmd delimiter
STA CmdDelim ; for EXEC files
JSR XA75B ;Chk for presence of 80-col card
JSR XA78A ;(X)=$C3/$00-init/Reset I/O hooks
LDA VideoSlt ;=$C3 if 80-col card present in slot 3
AND #%00000011
STA DevCtlS ;=3
RTS
;
ASC '29-MAR-84'
ASC '56:28 '
;=================================================
; EI's CSW entry point
; (A) = char to be printed
;
LB3D9 EQU * ;ENTRY
CMP #'a'-1+$80
BCC LB3E8 ;Is char a-z?
CMP #'z'+1+$80
BCS LB3E8
BIT MACHID ;Is ][?
BMI LB3E8 ;No, //e or //c or /// emulation
AND #$1F ;a-z -> $01-$1A
LB3E8 CMP #$9D ;ctrl-] - clrEOL
BNE LB3F6
TYA
PHA
JSR CLREOL
PLA
TAY
LDA #$9D
RTS
;
LB3F6 CMP #FF+$80 ; ctlr-L - form feed?
BNE LB404
TYA
PHA
JSR HOME
PLA
TAY
LDA #FF+$80
RTS
;
LB404 BIT RDROM2
JMP COUT1 ;Call Monitor's ROM rtn
;=================================================
; Command Interpreter's Error messages
;
LB40A ASC 'PATH/FILENAME MISSING' ;ENTRY
DB CR
LB420 ASC 'SYNTAX' ;ENTRY
DB CR
LB427 ASC 'BAD FORMAT' ;ENTRY
DB CR
LB432 ASC 'MEMORY FULL' ;ENTRY
DB CR
LB43E ASC 'BAD RANGE' ;ENTRY
DB CR
LB448 ASC 'INVALID PARAMETER ' ;ENTRY
DB CR
LB45B ASC 'ALL OR SOME?(A/S)?' ;ENTRY
DB CR
LB46E ASC 'FILE NOT FOUND'
DB CR
LB47D ASC 'FILE TYPE MISMATCH'
DB CR
LB490 ASC 'WRITE PROTECTED'
DB CR
LB4A0 ASC 'FILE LOCKED'
DB CR
LB4AC ASC 'BAD PATH/FILE NAME'
DB CR
LB4BF ASC 'FILE SIZE MISMATCH'
DB CR
LB4D2 ASC 'FILE TOO LARGE'
DB CR
LB4E1 ASC 'DISK FULL'
DB CR
LB4EB ASC 'DISK I/O FAILURE'
DB CR
LB4FC ASC 'PRODOS ERROR=$'
;
HexStr DW $5858
DB CR
LB50D ASC 'DIRECTORY NOT FOUND' ;ENTRY
DB CR
LB521 ASC ' THE FILE IS LOCKED. DESTROY ANYWAY (Y/N)?' ;ENTRY
DB CR
LB54D ASC 'PATH NOT FOUND'
DB CR
LB55C ASC 'DUPLICATE FILE NAME'
DB CR
LB570 ASC 'DIRECTORY FULL'
DB CR
LB57F ASC 'PLEASE RE-MOUNT '
DB $80
LB590 ASC 'PRESS RETURN TO CONTINUE '
DB $80
LB5AA ASC 'ASSEMBLER NOT ONLINE'
DB CR
;=================================================
; ($B5BF) Command interpreter's error message table
; Each entry consists of 3 bytes
;
ErrTable EQU *
DB $10 ;error code
DW LB4D2 ;msg ptr
DB $11
DW LB47D
DB $12
DW LB4BF
DB $27
DW LB4EB
DB $2A
DW LB4EB
DB $2B
DW LB490
DB $48
DW LB4E1
DB $46
DW LB46E
DB $40
DW LB4AC
DB $4B
DW LB4AC
DB $4E
DW LB4A0
DB $44
DW LB54D
DB $45
DW LB50D
DB $47
DW LB55C
DB $49
DW LB570
DB $FC
DW LB5AA
DB $FD
DW LB590
DB $FE
DW LB57F
DB $FF
DW LB4FC
;=================================================
; ($B5F8)
; Input
; (A)=error code
;
FatalErr EQU * ;ENTRY
TAX ;error code
PLA ;dump RTS addr
PLA
TXA
JMP PrErrMsg
;=================================================
;
LB5FF JSR ClsFile2 ;ENTRY
;
; ($B602) Print Error Message and return to CI mainloop
; (A) - error code
;
PrErrMsg EQU * ;ENTRY
JSR PrErrMsg2
JMP EIWrmStrt
;=================================================
; ($B608)
; Input
; (A)=error code
;
PrErrMsg2 LDX #$39
LB60A DEX
DEX
DEX
BMI LB649 ;Not found
CMP ErrTable,X ;Is this the error code?
BNE LB60A ;keep searching
;
INX
LDA ErrTable,X ;msg ptr
STA Z12 ;Reg9
INX
LDA ErrTable,X
STA Z12+1
;
LB620 EQU * ;ENTRY
LDA #'E'
JSR PrChar
LDA #'R'
JSR PrChar
JSR PrChar
JSR RingBell
LDA #':'
JSR PrChar
LDA #SPACE
JSR PrChar
;
LDY #0
LB63C LDA (Z12),Y ;Reg9
BMI LB648
JSR PrChar
INY
CMP #CR
BNE LB63C
LB648 RTS
;
; Error code not in our table
; Just show a generic error message
;
LB649 STA ErrCode ;error code
JSR Cnv2Hex
STA HexStr+1
STX HexStr
LDA #$FF ;Show err msg w/errcode in hex
JMP PrErrMsg2
;=================================================
LB659 EQU * ;ENTRY
LDA #CR
CMP Z12
BEQ LB662
JMP LB28E ;cmd syntax
;
; 3 of the commands get some special treament viz
; ASM, END and LIST
;
LB662 LDA #$00
STA Z00+1
JSR GetToken ;Get token fr Cmd table
STA Z00
BEQ LB6E6 ;ASM cmd
;
CMP #$5C ;END cmd
BEQ LB6A4
CMP #$26 ;LIST cmd?
BNE LB67A
JSR LB2AF ;Yes, make a copy of cmd
LDA Z00
LB67A LDY Z00
CPY #$5D ;']' - sentinel value
BCC LB682
; $D680
LDY #0
LB682 LDA XDFA2,Y
STA Z04 ;Set SW16 R2 w/JMP addr-1
INY
LDA XDFA2,Y
STA Z04+1
STA RDBANK2
BIT PtrMode ;Is Printer on?
BPL LB697 ;No
JSR XD610 ;Init printer
;
; The last instruction of the Sweet16 code below
; will take us to the addr stored in R2 since
; R15 is SW16's PC
;
LB697 JSR NEWSW16
SET R0,CR
DCR R5
STI R5
LD R2
SET R12,XBD00
ST R15
;=================================================
; END cmd
;
LB6A4 EQU *
LDA SwapMode ;Do we have a split txt buf?
BNE LB6EA ;Yes, so can't quit
JSR XA872 ;Load Quit Code
LDX #$00 ;Slot #
JSR XA78A ;Init I/O Hooks
;
LDA ROMIN2
LDA ROMIN2
LDA #$60 ;RTS
STA USRADR
LDA #>BASCLD
STA SOFTEV
LDA #<BASCLD ;Vector @ $E000 -> $F128
STA SOFTEV+1
LDA #$45
STA PWREDUP
JSR SETKBD
JSR SETVID
JSR HOME
JSR PRODOS8
DB $65
DW QuitP
;
LB6D9 EQU *
STA InBuf+$FF
JMP BASCLD ;Do a Monitor cold Start
;
QuitP DB $04
DB $00 ;If quit type $EE,
DW $0000 ; addr of launch pathname
DB $00 ; reserved
DW $0000
;=================================================
; Prepare for Assembly
;
LB6E6 EQU *
LDA SwapMode ;Do we have a split txt buf?
BEQ LB6EF ;No
LB6EA EQU * ;ENTRY
LDX #$41 ;Multi-buffer
JMP LB290
;
LB6EF LDA TxtEnd+1 ;Is edit buffer empty?
CMP TxtBgn+1
BNE LB6FB
LDA TxtEnd
CMP TxtBgn
BEQ LB700 ;Yes
LB6FB LDX #$47 ;'Buffer'
JMP LB290
;
LB700 LDA #SPACE
LDX #16
LB704 STA DateTime,X ;Prepare data area
DEX
BPL LB704
;
JSR PRODOS8
DB $82 ;Get time
DW *
JSR X9E55 ;Date/Time Conversion
;
; The assembler uses the Editor's first 3 tabs
; if the 1st tab col of user-defined tab
; table is < 12. Otherwise, a modified tab
; table is passed to the assembler
;
LDY #2
LB715 LDX UserTabT ;Get 1st tab col
CPX #12
BCC LB729
LDA UserTabT,Y
; DB $B9,$68,$00
CLC
ADC #17
LB721 STA TabTable,Y ;Tabs table passed to the assembler
DEY
BPL LB715
BMI DoAsmbly ;always
;
LB729 LDA X9D11,Y ;Editor's default tab table
BNE LB721 ;always
;
DoAsmbly LDA #$00
STA PtrMode ;Disable Printer
JSR LoadAsm
LDA RDBANK2
JSR X7800 ;xfer control to Assembler
JSR LB741 ;Re-load EdAsm.Ed
JMP EIMainLoop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Set prefix to EdAsm's Launch dir
; Load the Editor's modules into mem
; Relocator module loaded @ $8900-$98FF to
; $D000 LC Bank2
; Return to caller if successful else crash into Monitor
;
LB741 EQU *
JSR LB836 ;Set prefix to EdAsm's Dir
BCC LoadDEd
LDA #$FE ;Re-mount...
JSR PrErrMsg2
;
; Print EDASM's launch dir. This directory contains
; the files EDASM.SYSTEM, EDASM.ED and EDASM.ASM
; $BE79-BA(65 bytes incl leading and trailing /'s)
;
LDY #0
LDX EdAsmDir ;len byte
LB750 LDA EdAsmDir+1,Y
JSR PrChar
INY
DEX
BNE LB750
;
JSR PrtCR
LDA #$FD ;Press return...
JSR PrErrMsg2
;
WaitK1 LDA KBD
BPL WaitK1
BIT KBDSTROBE
CMP #CR+$80
BNE WaitK1
JSR PrtCR
JMP LB741 ;try again
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Load the file EDASM.ED
;
; $9900-$A8FF - Editor overlay
; $D000-$DFFF - Editor code
;
LoadDEd LDA #>LoadAdrEd
STA ReadDBuf
LDA #<LoadAdrEd
STA ReadDBuf+1
LDA #$00
STA ReadLen ;$2000
LDA #$20
STA ReadLen+1
LDX #>EdStr
LDY #<EdStr
JSR LoadMod
BCS LB7BF
;
LDA #>LoadAdrEd
STA A1 ;start addr
LDA #<LoadAdrEd
STA A1+1
LDA #>LoadAdrEd+$1000-1
STA A2 ;end addr
LDA #<LoadAdrEd+$1000-1
STA A2+1
LDA #$FF
STA BitMap+20 ;Reserve pages $A0-$A7
LDA #%00011111 ;Mark pages $98-$9A
STA BitMap+19 ; as free
;
; ($B7AB) Move code btwn $8900-$98FF to the LC Bank2
; Also referenced by Editor to move Quit Code
; back to LC Bank2
;
Mv2LCB2 EQU * ;ENTRY
LDA #>XD000 ;dest addr
STA A4
LDA #<XD000
STA A4+1
LDA ROMIN2
LDA ROMIN2
LDY #$00
JSR MOVE ;Monitor rtn
RTS
;
; Error loading Editor's Modules
;
LB7BF STA ErrCode ;A=err code
TSX
STX StackP2
LDX #$80
TXS
LDA RDROM2
JSR SETKBD
JSR SETVID
JSR HOME
JSR PRERR
JMP MON ;Crash!
;=================================================
; Load the file EDASM.ASM
; $7800-$9EFF - Assembler overlay
; $D000-$DFFF (bank2) - Assembler tables,
; Sorting,print symbol tables
;=================================================
LoadAsm EQU *
JSR LB836 ;Set prefix to EdAsm's Boot Dir
BCC LB7E6
JSR LB83D ;Set to user's prefix
LDA #$FC ;err code
JMP PrErrMsg
;
LB7E6 LDA #$00 ;Setup the bit map
STA BitMap+20 ;Mark pages $98-$A7
STA BitMap+19 ; as free
;
LDA #$00
STA ReadLen ;=$4000
LDA #$40
STA ReadLen+1
LDA #>LoadAdrAsm
STA ReadDBuf
LDA #<LoadAdrAsm
STA ReadDBuf+1
LDX #>AsmStr
LDY #<AsmStr
JSR LoadMod
BCC LB822
;
CMP #$45 ;vol not mounted
BEQ LB817
CMP #$46 ;file not found
BEQ LB817
CMP #$44 ;non-existent file
BNE LB819
;
LB817 LDA #$FC
LB819 JSR PrErrMsg2
JSR LB741 ;Load Editor's Modules
JMP EIWrmStrt
;
; Assembler's modules successfully loaded
;
LB822 LDA #>LoadAdrAsm
STA A1 ;start addr
LDA #<LoadAdrAsm
STA A1+1
LDA #>LoadAdrAsm+$1000-1
STA A2
LDA #<LoadAdrAsm+$1000-1
STA A2+1 ;end addr
JSR Mv2LCB2 ;Set dest addr and do move
RTS
;=================================================
; Set prefix to EdAsm's Boot Dir
;
LB836 EQU * ;ENTRY
JSR PRODOS8
DB $C6
DW SPfxEdAsm
RTS
;
; Set prefix to user's prefix
;
LB83D JSR PRODOS8
DB $C6
DW SPfx1P
RTS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ($B844) Load EdAsm's modules
; EdAsm.Ed or EdAsm.Asm are loaded into memory
; Input
; (X,Y) - ptr to filename
;
LoadMod EQU * ;ENTRY
LDA #$FF
STA ExitFlag
STX Reg4 ;ptr to file name
STY Reg4+1
LDA #BINtype
JSR OpenNRd
PHP ;Save error status
LSR ExitFlag ;Set/reset msb with the Carry-bit
PHA
JSR LB83D ;Set to user's prefix
PLA
PLP
RTS
;=================================================
; Effectively "emptying" the textedit buffer
;
LB85D LDA TxtBgn
STA TxtEnd
LDA TxtBgn+1
STA TxtEnd+1
RTS
;=================================================
; Set default prefix to the user's prefix
;
LB866 JSR PRODOS8
DB $C6
DW SPfx1P
BNE LB86F
RTS
;
LB86F EQU * ;ENTRY
CMP #$40 ;Invalid pathname
BEQ LB876
JMP ErrHndlr
;
LB876 JMP PrErrMsg
;=================================================
; EI's error handler
; Input
; ExitFlag - $00,$FF,$8x
;
ErrHndlr EQU *
BIT ExitFlag
BPL LB880
SEC
RTS
;
LB880 JMP FatalErr
;=================================================
; ($B883) Check attributes of file (if it exists)
; Input
; (A)-filetype
; Output
; (A) - error code if not found/wrong filetype
; C=1 - Not found
; C=0, Z=0 - Found but wrong filetype
; C=0, Z=1 - Found
;
CkAttrF EQU * ;ENTRY
STA FileType ;ftype
JSR SetupFN
LDA #>FileNameB
STA GFIPath
STA PathNameP
LDA #<FileNameB
STA GFIPath+1
STA PathNameP+1
JSR PRODOS8
DB $C4
DW GFInfoP
BEQ LB8A7
;
CMP #$46 ;file not found
BEQ LB8B1 ;C=1, (A)=$46 Z=1
JMP ErrHndlr
;
LB8A7 LDA GFIftype
CMP FileType
BEQ LB8B0 ;C=0, Z=1
LDA #$11 ;File type mismatch (C=0,Z=0, (A)=$11)
LB8B0 CLC
LB8B1 RTS
;=================================================
; ($B8B2) Setup file name
; Input
; (Reg4)=ptr to the filename
;
SetupFN EQU * ;ENTRY
LDY #0
LB8B4 LDA (Reg4),Y
BEQ LB8C7 ;null-terminated
AND #$7F
CMP #SPACE
BEQ LB8C7 ;Ignore rest of text
STA FileNameB+1,Y
STA TxBuf2+1,Y
INY
BPL LB8B4
LB8C7 STY FileNameB ;len byte of filename
STY TxBuf2
RTS
;=================================================
; ($B8CE) Open the file for reading. All files BIN/TXT files
; are opened for reading and writing using this rtn
; Input
; (X,Y)- ptr to 1024-byte buffer of PRODOS to use
; PathNameP - Pathname of file to be opened
;
OpenDFile EQU * ;ENTRY
STX IOBufP
STY IOBufP+1
JSR PRODOS8
DB $C8
DW OpenPB
BCC LB8DF
JMP ErrHndlr
;
LB8DF LDA OpenRN
STA ReadRN
STA WriteRN
STA GeofRN
STA CloseRN
RTS
;=================================================
; ($B8EF)
;
ClsFile EQU * ;ENTRY
JSR PRODOS8
DB $CC
DW CloseP
BEQ LB8FA
JMP ErrHndlr
;
LB8FA STA CloseRN ;zero ref #
RTS
;=================================================
; ($B8FE)
; (A)-error code
; Preserved (A)
;
ClsFile2 EQU * ;ENTRY
PHA
JSR ClsFile
PLA
RTS
;=================================================
LB904 EQU * ;ENTRY
JSR PRODOS8
DB $C3
DW SFInfoP
RTS
;
LB90B EQU * ;ENTRY
JSR PRODOS8
DB $C1
DW DestroyP
RTS
;
LB912 EQU * ;ENTRY
JSR PRODOS8
DB $C2
DW RenameP
RTS
;
LB919 EQU * ;ENTRY
JSR PRODOS8
DB $C0
DW CreateP
RTS
;
LB920 EQU * ;ENTRY
JSR PRODOS8
DB $CB
DW WritePB
RTS
;
LB927 EQU * ;ENTRY
JSR PRODOS8
DB $D0
DW SeofP
RTS
;=================================================
; Used by EXIT cmd to transfer control
; to a SYSTEM program
;
LB92E EQU * ;ENTRY
LDA ROMIN2
LDA ROMIN2
JMP L2000
;=================================================
; ($B937) Open and read the entire file (modules)
; into memory. We must check the file size
; Input
; (A)-filetype
; (Reg4) - ptr to filename
; ReadDBuf - Mem location to read into
;
; Output
; C=1 - error
; (A) - error code
; C=0 - file loaded successfully
;
OpenNRd EQU * ;ENTRY
JSR CkAttrF ;Check file's attributes
BCS LB965 ;Not found
BNE LB964 ;Found but wrong type
;
LDX #>XA900 ;1024-byte I/O buffer
LDY #<XA900
JSR OpenDFile
JSR CkSizeF
BCS LB961 ;too big
;
LDA fileEOF
STA ReadLen
LDA fileEOF+1
STA ReadLen+1
JSR PRODOS8
DB $CA
DW ReadPB
BCS LB961
JMP ClsFile ;C=0, (A)=0
;
LB961 JSR ClsFile2 ;(A)=errcode
LB964 SEC
LB965 RTS
;=================================================
; ($B966) Check size of file to be read
; Output
; (A)=error code
; C=1 - file too large
;
CkSizeF EQU * ;ENTRY
JSR PRODOS8
DB $D1
DW GeofP
BCS LB99A
;
LDA fileEOF+2 ;More than 64K
BNE LB997 ;File is too large
INC ReadLen
BNE LB97B
INC ReadLen+1
;
LB97B LDA fileEOF ;Is file's EOF>=ReadLen?
CMP ReadLen
LDA fileEOF+1
SBC ReadLen+1
PHP
LDA ReadLen
BNE LB990
DEC ReadLen+1
LB990 DEC ReadLen
PLP
BCS LB997 ;yes
RTS
LB997 LDA #$10 ;err code
SEC
LB99A RTS
;=================================================
; ($B99B)
; Input
; (A) - byte value to be converted
; Output
; (X,A) - Hex Digits
;
Cnv2Hex EQU * ;ENTRY
PHA ;Convert to 2 HEX digits
LSR ;Shift upper nybble
LSR
LSR
LSR
JSR LB9A5
TAX ;Save in X
PLA
LB9A5 AND #$0F
ORA #'0'
CMP #'9'+1
BCC LB9AF
ADC #$06
LB9AF RTS
;=================================================
; EXEC command
; Ref pg 62 for lots of info on use of EXEC files
;
LB9B0 EQU * ;ENTRY
SET R4,XBD80
RTN
;
LB9B4 EQU *
BIT ExecMode ;exec mode?
BPL LB9C3 ;No
ASL ExecMode
LDA RdExeRN ;Close the old EXEC file first
STA CloseRN
JSR ClsFile
LB9C3 LDA #TXTtype
JSR CkAttrF
BCC LB9CD ;Found
;
LB9CA JMP PrErrMsg ;Not Found
;
LB9CD BNE LB9CA ;Wrong type
;
LDX #>XAD00 ;1024-byte I/O buf for ProDOS8
LDY #<XAD00
JSR OpenDFile
;
; Set to read file in new line mode
;
LB9D6 EQU *
LDA OpenRN
STA NewLineRN
STA RdExeRN
JSR PRODOS8
DB $C9
DW NewLinePB
BCS LB9CA
LDA #$80 ;Flag we are in exec mode
STA ExecMode
JMP LB1CB
;=================================================
; Used by the SWAP command
;
LB9EE DS 4,0 ;TxtBgn,TxtEnd for file1 ;ENTRY
LB9F2 DS 65,SPACE ;Pathname buf for file1
LBA33 DS 4,0 ;TxtBgn,TxtEnd for file2 ;ENTRY
LBA37 DS 65,SPACE ;Pathname buf for file2
;
LBA78 DS 8,0 ;SW16 subrtn ret addr stack ;ENTRY
;
FreeMem DW $0000 ;# of free mem pages ;ENTRY
;
; ($BA82) Open Parameter Block. Use to open all files.
; The ptr to the pathname and file I/O buffer must be set
;
OpenPB DB $03
PathNameP DW $0000
IOBufP DW $0000 ;1024-byte buffer
OpenRN DB $A0 ;ENTRY
;
; $BA88
;
ReadPB DB $04
ReadRN DB $B0
ReadDBuf DW $A0A0 ;Data Buffer ;ENTRY
ReadLen DW $A0A0 ;ENTRY
LBA8E DW $A0A0 ;ENTRY
;
; $BA90
;
WritePB DB $04
WriteRN DB $B2 ;ENTRY
DW $D5C9 ;ENTRY
DW $D0A0 ;ENTRY
DW $A0A0
;
; Used by EXEC file
;
RdExecP DB $04
RdExeRN DB $A0
DW InBuf
DW 255
LBA9E DW $A0C0 ;# of chars actually read
;
NewLinePB DB $03 ;ENTRY
NewLineRN DB $A0 ;ENTRY
DB $7F ;ignore msb
DB CR ;newline char
;
; Use by the CATALOG/CAT cmd
;
LBAA4 DB $04 ;ENTRY
DB $00 ;ENTRY
DW XA8D1
DW $0000 ;ENTRY
DW $0000
;
; Use to skip last 5 bytes of a dir block
;
LBAAC DB $04 ;ENTRY
DB $00 ;ENTRY
DW XA8D1+$20
DW $0005 ;# of bytes
DW $0000
;
SeofP DB $02
LBAB5 DB $C0 ;ENTRY
LBAB6 DS 3,0 ;ENTRY
;
SPfx1P DB $01
DW CurrPfxB
;
;
LBABC DB $01 ;ENTRY
DW CurrPfxB
;
; Set prefix to dir from which EdAsm.System was launched
;
SPfxEdAsm DB $01
DW EdAsmDir
;
GeofP DB $02
GeofRN DB $A0
fileEOF DS 3,$A0
;
GFInfoP DB 10
GFIPath DW $A0A0 ;ENTRY
LBACA DB $A0 ;ENTRY
GFIftype DB $D6 ;ENTRY
LBACC DW $D5C9 ;ENTRY
LBACE DB $A0 ;ENTRY
LBACF DW $A0A0 ;ENTRY
LBAD1 DW $A0A0 ;ENTRY
DW $CFA0
DW $A0FF
DW $A0A0
; $DAD9
SFInfoP DB $07
LBADA DW $A0A0 ;ENTRY
LBADC DB $A0 ;ENTRY
LBADD DB $A0 ;ENTRY
LBADE DW $A0C5 ;ENTRY
DB $A0
DW $A0A0
LBAE3 DW $0000 ;ENTRY
DW $0000
;
CreateP DB $07
LBAE8 DW $A0A0 ;ENTRY
LBAEA DB $C3 ;ENTRY
LBAEB DB $04 ;ENTRY
LBAEC DW $0000 ;ENTRY
LBAEE DB $01 ;ENTRY
DW $0000
DW $0000
;
DestroyP DB $01
LBAF4 DW $C5A0 ;ENTRY
;
CloseP DB $01
CloseRN DB $A0 ;ENTRY
;
RenameP DB $02
DW FileNameB
LBAFB DW $0000 ;ENTRY
;
; Online
;
LBAFD DB $02 ;ENTRY
LBAFE DB $00 ;ENTRY
DW XA900
;
LBB01 DB $02
DW $A0AA
DW $A0A0
;
ExitFlag DB $00 ;Used by the Error Handler
;
EdStr ASC 'EDASM.ED'
DB $00
AsmStr ASC 'EDASM.ASM'
DB $00
BIStr EQU * ;ENTRY
ASC 'BASIC.SYSTEM'
DB $00
;
; The random bytes below are generated by DS statement
;
LBB27 EQU * ;ENTRY
DB $D1,$A0,$35,$3E,$CF,$D5,$D4,$CE
DB $C1,$CD,$45,$21,$51,$A2,$23,$3F
DB $CF,$D5,$D4,$D4,$C9,$D4,$CC,$45
DB $21
;
; $BB40
;
FileNameB EQU *
DB $32,$A2,$5A,$3E,$C3,$C1,$D4,$CC
DB $CF,$CF,$50,$20,$EF,$A0,$6D,$3F
DB $CE,$C5,$D8,$D4,$C3,$C1,$54,$21
DB $6D,$A2,$67,$3E,$C3,$C1,$D4,$C5
DB $CE,$C4,$C5,$44,$21,$0D,$A1,$72
DB $3E,$C3,$C1,$D4,$C1,$D3,$43,$21
DB $96,$A3,$88,$3E,$C3,$C1,$D4,$CF
DB $D5,$54,$21,$16,$A1,$C4,$42,$D4
;
; $BB80
;
CurrPfxB EQU * ;ENTRY
DB $D3,$D4,$CB,$C5,$59,$21,$11,$DD
DB $94,$3E,$C3,$C1,$D4,$C6,$CF,$CF
DB $54,$21,$2A,$A1,$A0,$3E,$C3,$C1
DB $D4,$CF,$D5,$D4,$31,$20,$1E,$A1
DB $CF,$3E,$C3,$C1,$D4,$C6,$D8,$C9
DB $54,$21,$9E,$A1,$28,$46,$D3,$D0
DB $C1,$C3,$C1,$54,$21,$54,$A5,$76
DB $45,$C6,$CF,$CF,$D4,$CC,$C7,$48
DB $01,$3E,$00,$2A,$41,$CD,$CF,$D6
DB $C6,$CF,$CF,$54,$20,$5E,$A1,$17
DB $3F,$C3,$C1,$D4,$C6,$CF,$CF,$D4
DB $52,$21,$F4,$A1,$4C,$41,$C1,$C3
DB $C3,$48,$21,$AE,$A5,$BC,$3F,$D4
DB $CF,$D4,$CC,$C2,$CC,$CB,$53,$21
DB $2D,$A2,$8C,$40,$C8,$C5,$D8,$C4
DB $C5,$43,$21,$0F,$A5,$22,$42,$D5
;
; $BC00 - Buf to save the most recent List cmd
;
SavCmdB EQU *
DB $D3,$C5,$C4,$C2,$CC,$CB,$53,$21
DB $16,$A2,$00,$00,$C6,$D2,$C5,$C5
DB $C2,$CC,$CB,$53,$21,$00,$A2,$5F
DB $40,$C3,$C1,$D4,$C9,$D4,$CC,$31
DB $20,$A3,$A1,$31,$3F,$CF,$D5,$D4
DB $C9,$D4,$CC,$C5,$CC,$50,$20,$34
DB $A2,$3D,$3F,$CF,$D5,$D4,$C9,$D4
DB $CC,$32,$21,$3F,$A2,$49,$3F,$CF
DB $D5,$D4,$C9,$D4,$CC,$33,$21,$50
DB $A2,$57,$3F,$CF,$D5,$D4,$C9,$D4
DB $CC,$C5,$CC,$51,$20,$45,$A2,$5A
DB $42,$CF,$D5,$D4,$CE,$CC,$50,$20
DB $5C,$A2,$79,$3F,$C3,$D2,$C5,$C1
DB $C4,$31,$21,$7E,$A2,$84,$3F,$CE
DB $C5,$D8,$D4,$CF,$C6,$46,$20,$7C
DB $A2,$00,$00,$C3,$D2,$C5,$C1,$C4
;
; $BC80
;
ExecLineB EQU *
DB $32,$21,$90,$A2,$57,$4B,$CE,$C5
DB $D8,$D4,$C3,$58,$21,$9C,$A2,$9A
DB $3F,$D0,$D2,$C5,$C6,$C9,$58,$20
DB $9E,$A2,$A5,$3F,$D0,$D2,$C5,$C7
DB $C5,$54,$21,$E1,$A2,$B0,$3F,$D0
DB $D2,$C5,$D3,$C5,$54,$21,$BD,$A2
DB $D3,$3F,$D0,$D2,$C5,$D3,$C5,$D4
DB $31,$21,$BE,$A2,$C8,$3F,$D0,$C6
DB $D8,$CE,$D5,$CC,$4C,$60,$AF,$A2
DB $D5,$40,$D0,$C6,$D8,$D8,$C9,$54
DB $60,$BA,$A2,$DF,$3F,$D0,$D2,$C5
DB $CD,$CF,$D6,$45,$20,$C2,$A2,$F9
DB $3F,$D0,$D2,$C5,$C6,$C5,$CE,$44
DB $21,$D3,$A2,$4E,$42,$D3,$D4,$D2
DB $D3,$C5,$D4,$D0,$C6,$58,$21,$EF
DB $A2,$05,$40,$D0,$D2,$C5,$D3
CIEnd EQU *