home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CBM Funet Archive
/
cbm-funet-archive-2003.iso
/
cbm
/
csbruce
/
ace-r9-src.kar
< prev
next >
Wrap
Text File
|
1993-12-24
|
309KB
|
20,374 lines
37
ACE.S
1383
;ace-128/64 KERNEL BY cRAIG bRUCE, STARTED 04-mAR-1992.
;* SYSTEM ZERO-PAGE MEMORY USAGE:
;* $02-$7F = APPLICATION WORK AREA
;* $80-$8F = SYSTEM WORK AREA
;* $FA-$FF = SYSTEM PARAMETER AREA
;* INITIAL ace ram0 ORGANIZATION
;* $0000-$0EFF = SYSTEM STORAGE
;* $0F00-$0FFF = KERNEL INTERFACE VARIABLES
;* $1000-$12FF = SYSTEM STORAGE
;* $1300-$1FFF = sHELL PROGRAM (3.25k)
;* $2000-$27FF = CHARACTER SET (2k)
;* $2800-$5FFF = ace KERNEL AND DEVICE DRIVERS (14k)
;* $6000-$BFFF = APPLICATION AREA & STACK (24k)
;* $C000-$FFFF = rom AND i/o, ram (16k)
;* FAR MEMORY TYPES
;* $00=NULL, $01=REU, $02=INTERNAL-512k, $06=RL-REU, $07=RL-RAM
COMPUTER = 128
.SEQ ACEHEAD.S
.ORG $2800
.IF COMPUTER-64
.OBJ "@0:ACE128"
.ELSE
.OBJ "@0:ACE64"
.IFE
;***JUMP TABLE
JMP ENTRYpOINT
JMP ACEoPEN
JMP ACEcLOSE
JMP ACErEAD
JMP ACEwRITE
JMP ACEiSDIR
JMP ACEbLOAD
JMP ACEcMDoPEN
JMP ACEcMDcLOSE
JMP ACEcMDsEND
JMP ACEcMDsTATUS
JMP ACEdIRoPEN
JMP ACEcLOSE
JMP ACEdIRrEAD
JMP ACEfCBsWAP
JMP ACErEMOVE
JMP ACErENAME
JMP ACEcHdIR
JMP ACEzPlOAD
JMP ACEzPsTORE
JMP ACEfETCH
JMP ACEsTASH
JMP ACEpAGEaLLOC
JMP ACEpAGEfREE
JMP ACEeXIT
JMP ACEdEViNFO
JMP ACEsTOPkEY
JMP ACEuTOA
JMP ACEgETdATE
JMP ACEsETdATE
JMP ACEeXEC
JMP ACEcDhOME
JMP ACEwINMAX
JMP ACEwINCLS
JMP ACEwINSET
JMP ACEwINSIZE
JMP ACEwINLOAD
JMP ACEwINSAVE
JMP ACEwINPUT
JMP ACEwINCOLOR
JMP ACEwINPOS
JMP ACEwINCURSOR
JMP ACEwINSCROLL
JMP CONgETKEY
JMP CONcOLOR
JMP CONpALETTE
JMP CONsCREEN
;***GLOBAL DECLARATIONS
MAXzPuSE = $90
CONFIGbUF = $800
BASICzPsAVE = $900
KEYLINE = $B00
CDbUFFER = $C00
RAM0fREEmAP = $D00
FREEMAP = $E00
.IF COMPUTER-64
MAXpAGE = $C0
BKace = $0E
BKkERNEL = $00
BKcHARSET = $0F
BKsELECT = $FF00
KERNELiRQhANDLER = $FA65
KERNELbRKhANDLER = $B003
KERNELnMIhANDLER = $FA40
.ELSE
STRINGbUFFER = $A00
MAXpAGE = $D0
BKsELECT = $01
BKace = $76
BKkERNEL = $77
KERNELiRQhANDLER = $EA31
KERNELbRKhANDLER = $FE66
KERNELnMIhANDLER = $FE47
.IFE
CIA1 = $DC00
CHRcr = $0D
ST = $90
TRUE = $FF
FALSE = $00
FCBcOUNT = 16
LFTABLE .BUF FCBcOUNT
DEVTABLE .BUF FCBcOUNT
SATABLE .BUF FCBcOUNT
EOFTABLE .BUF FCBcOUNT
PIDTABLE .BUF FCBcOUNT
LFNULL = $FF
FCBnULL = $FF
MINdISK = 8
REGSAVE .BUF 3
NEWLF .BUF 1
KERNELcLALL = $FFE7
KERNELsETBNK = $FF68
KERNELsETMSG = $FF90
KERNELrEADST = $FFB7
KERNELsETLFS = $FFBA
KERNELsETNAM = $FFBD
KERNELoPEN = $FFC0
.IF COMPUTER-64
KERNELcLOSE = $FFC3
.IFE
KERNELcHKIN = $FFC6
KERNELcHKOUT = $FFC9
KERNELcLRCHN = $FFCC
KERNELcHRIN = $FFCF
KERNELcHROUT = $FFD2
KERNELlOAD = $FFD5
KERNELsTOP = $FFE1
KERNELgETIN = $FFE4
KERNELsCRORG = $FFED
.IF COMPUTER-64
;128 NOTHING HERE
.ELSE
;*** KERNEL CLOSE WITH PSEUDO-CLOSE FOR DISK COMMAND CHANNEL FOR THE 64
KERNELcLOSE = *
BCS +
JMP $FFC3
+ LDX $98
- DEX
BMI KERNELcLOSEeXIT
CMP $259,X
BNE -
BEQ +
BRK
;** FOUND ENTRY; COPY LAST ENTRY ON TOP IF IT
+ LDY $98
DEY
LDA $259,Y ;MOVE LFN
STA $259,X
LDA $263,Y ;MOVE DEV NUM
STA $263,X
LDA $26D,Y ;MOVE SEC ADDR
STA $26D,X
DEC $98
KERNELcLOSEeXIT = *
CLC
RTS
.IFE
;*** ENTRYPOINT()
ENTRYpOINT = *
LDA #0
PHA
PLP
LDA #BKace
STA BKsELECT
JMP MAIN
;*** STARTUP()
ACEbOOTSTRAP = *
PHP
SEI
LDX #2
- LDA $00,X
STA BASICzPsAVE,X
LDA #0
STA $00,X
INX
CPX #MAXzPuSE
BCC -
LDA #<IRQiNIThANDLER
LDY #>IRQiNIThANDLER
STA $314
STY $315
LDA #<BRKhANDLER
LDY #>BRKhANDLER
STA $316
STY $317
LDA #<NMIhANDLER
LDY #>NMIhANDLER
STA $318
STY $319
LDX #127
LDA #0
- STA ERRNO,X
DEX
BPL -
LDA 186 ;LAST ACCESSED cOMMODORE DEVICE
CMP #8
BCS +
LDA #$04
+ STA ACEcURRENTdEVICE
LDA #0
JSR KERNELsETMSG
.IF COMPUTER-64
LDA #0
LDX #0
JSR KERNELsETBNK
.IFE
JSR KERNELcLALL
PLP
RTS
ACEcONFIG = *
LDA #0
LDX BOOTdEVICE
LDY #0
JSR KERNELsETLFS
LDA #6
LDX #<ACEcONFIGnAME
LDY #>ACEcONFIGnAME
JSR KERNELsETNAM
LDA #0
LDX #<ACEaPPaDDRESS
LDY #>ACEaPPaDDRESS
JSR KERNELlOAD
BCC +
RTS
+ LDA #<CONFIGbUF
LDY #>CONFIGbUF
STA 2
STY 3
LDA #<ACEsTARTUPmSG
LDY #>ACEsTARTUPmSG
STA 4
STY 5
LDA #<RAM0fREEmAP
LDY #>RAM0fREEmAP
STA 6
STY 7
LDX #>ACEbSSeND
LDA #<ACEbSSeND
BEQ +
INX
+ STX 8
.IF COMPUTER-64
LDA #128
.ELSE
LDA #64
.IFE
STA 9
JSR ACEaPPaDDRESS
RTS
ACEcONFIGnAME = *
.ASC "CONFIG"
ACEsTARTUP = *
LDX #FCBcOUNT-1
LDA #LFNULL
- STA LFTABLE,X
DEX
BPL -
LDA #0
STA NEWLF
LDA ACEcURRENTdEVICE
LSR
LSR
ORA #$40
STA CDbUFFER
LDA #":"
STA CDbUFFER+1
LDA #0
STA CDbUFFER+2
LDA #<CDbUFFER
LDY #>CDbUFFER
STA ACEcURdIRnAME+0
STY ACEcURdIRnAME+1
JSR INITsTACK
LDA #<SHELLpATHbUF
LDY #>SHELLpATHbUF
STA ACEsHELLpATH+0
STY ACEsHELLpATH+1
LDX #31
- LDA CONFIGbUF+$E0,X
STA SHELLpATHbUF,X
DEX
BPL -
LDA #<SHELLaLIASbUF
LDY #>SHELLaLIASbUF
STA ACEsHELLaLIAS+0
STY ACEsHELLaLIAS+1
LDA #0
STA SHELLaLIASbUF
LDA #1
STA ACEpROCESSid
;JSR ACEiRQiNIT
RTS
INITsTACK = *
LDA #$AC
STA ACEid
LDA #$E1
STA ACEid+1
LDA #0
.IF COMPUTER-64
LDY CONFIGbUF+$A8
.ELSE
LDY CONFIGbUF+$C6
.IFE
CPY #MAXpAGE
BCC +
LDY #MAXpAGE
+ STA ACEsTACKtOP+0
STY ACEsTACKtOP+1
STA ACEsTACKpTR+0
STY ACEsTACKpTR+1
LDA #0 ;PUSH THE zero TRAILER ARGV
LDY #0
JSR PUSHay
LDA #0 ;PUSH ARGC
LDY #0
JSR PUSHay
LDA #$FF ;PUSH FLAGS, RESTORE STDERR
LDY #$00
JSR PUSHay
LDA #$FF ;PUSH RESTORE STDOUT, RESTORE STDIN
LDY #$FF
JSR PUSHay
LDA #$FF ;PUSH PREVIOUS FRAME POINTER
LDY #$FF
JSR PUSHay
LDA ACEsTACKpTR
LDY ACEsTACKpTR+1
STA ACEfRAMEpTR
STY ACEfRAMEpTR+1
RTS
ZSP = $60
PUSHay = *
TAX
SEC
LDA ACEsTACKpTR
SBC #2
STA ACEsTACKpTR
STA ZSP
LDA ACEsTACKpTR+1
SBC #0
STA ACEsTACKpTR+1
STA ZSP+1
TYA
LDY #1
STA (ZSP),Y
DEY
TXA
STA (ZSP),Y
RTS
;*** SHUTDOWN()
ACEsHUTDOWN = *
LDX #2
- LDA BASICzPsAVE,X
STA $00,X
INX
CPX #MAXzPuSE
BCC -
LDA #BKkERNEL
STA BKsELECT
PHP
SEI
LDA #<KERNELiRQhANDLER
LDY #>KERNELiRQhANDLER
STA $314
STY $315
LDA #<KERNELbRKhANDLER
LDY #>KERNELbRKhANDLER
STA $316
STY $317
LDA #<KERNELnMIhANDLER
LDY #>KERNELnMIhANDLER
STA $318
STY $319
.IF COMPUTER-64
.ELSE
LDA #%10000001
STA $DC0D
LDA #%01111111
STA $DD0D
BIT $DC0D
BIT $DD0D
LDA #%00000000
STA VIC+$1A
.IFE
PLP
RTS
LDA #0
PHA
PLP
RTS
ACEsHUTDOWNbASIC = *
.IF COMPUTER-64
JSR VDCsHUTDOWN
JSR VICsHUTDOWN
.ELSE
JSR VICsHUTDOWN
.IFE
JSR ACEsHUTDOWN
.IF COMPUTER-64
LDA #$16
STA 2604
STA $D018
LDA #0
STA $1C00
JSR $51D6
JMP $4DB7
.ELSE
LDA #$16
STA $D018
LDA #0
STA $800
JSR $A642
JMP $A474
.IFE
BRK
NMIhANDLER = *
.IF COMPUTER-64
CLD
LDA #$7F
STA $DD0D
LDY $DD0D
BMI +
JSR $F63D
JSR $FFE1
BNE +
JSR ACEsHUTDOWN
JSR $E056
JSR $E109
JSR $C000
LDA #0
STA $1C00
JSR $51D6
JMP ($0A00)
+ JMP $FF33
.ELSE
CLD
PHA
TXA
PHA
TYA
PHA
LDA #$7F
STA $DD0D
LDY $DD0D
BMI +
JSR $F6BC
JSR $FFE1
BNE +
JSR ACEsHUTDOWN
JSR $FD15
JSR $FDA3
JSR $E518
LDA #0
STA $800
JSR $A642
JMP ($A002)
+ PLA
TAY
PLA
TAX
PLA
RTI
.IFE
IRQiNIThANDLER = *
CLD
JMP KERNELiRQhANDLER
ACEiRQiNIT = *
PHP
SEI
LDA #<IRQhANDLER
LDY #>IRQhANDLER
STA $314
STY $315
LDA #%01111111
STA $DC0D
STA $DD0D
BIT $DC0D
BIT $DD0D
LDA VIC+$11
AND #%01111111
ORA #%00000000
STA VIC+$11
LDA #252
STA VIC+$12
LDA #%00000001
STA VIC+$1A
PLP
RTS
IRQhANDLER = * ;(.axy ALREADY SAVED, 128 BANK)
CLD
.IF COMPUTER-64
.ELSE
LDA BKsELECT
PHA
.IFE
LDA VIC+$19
BPL +
AND #1
BNE SIXTY
+ LDA $DC0D
JMP IRQeXIT
;%%%
SIXTY = *
STA VIC+$19
LDA #BKace
STA BKsELECT
JSR CONsCREENsAVE
JSR VICiRQcURSOR
JSR CONiRQkEYSCAN
JMP IRQeXIT
.IF COMPUTER-64
IRQeXIT = $FF33
.ELSE
IRQeXIT = *
PLA
STA BKsELECT
PLA
TAY
PLA
TAX
PLA
RTI
.IFE
BRKhANDLER = *
CLD
LDX #0
- LDA $00,X
STA $0400,X
DEX
BNE -
JSR ACEsHUTDOWN
.IF COMPUTER-64
LDA #0
STA $1C00
;JSR $51D6
.ELSE
LDA #0
STA $800
JSR $A642
.IFE
JMP KERNELbRKhANDLER
;*** GETdEVICE( ZP=FILENAMEz ) : .a=DEVICE, .y=SCANpOS
GETdEVICE = *
LDY #0
LDA (ZP),Y
BEQ USEdEFAULT
LDY #1
LDA (ZP),Y
CMP #":"
BNE USEdEFAULT
LDY #0
LDA (ZP),Y
LDY #2
CMP #"."
BNE +
LDA ACEcURRENTdEVICE
JMP GOTdEV
+ AND #$1F
ASL
ASL
JMP GOTdEV
USEdEFAULT = *
LDA ACEcURRENTdEVICE
LDY #0
GOTdEV = *
RTS
GETlFaNDfCB = * ;() : .x=FCB, .a=LF
OPENlFsEARCH = *
INC NEWLF
LDA NEWLF
AND #$7F
LDX #FCBcOUNT-1
- CMP LFTABLE,X
BEQ OPENlFsEARCH
DEX
BPL -
TAY
LDX #0
- LDA LFTABLE,X
BMI +
INX
CPX #FCBcOUNT
BCC -
LDA #ACEeRRnOfREEfCBS
SEC
RTS
+ LDA ACEpROCESSid
STA PIDTABLE,X
TYA
CLC
RTS
;*** ISDIR( (ZP)=fILENAMEz ) : .a=dEV, .x=ISdISK, .y=ISdIR
ACEiSDIR = *
JSR GETdEVICE
PHA
TAX
LDA CONFIGbUF+0,X
CMP #1
BEQ +
CMP #4
BEQ +
LDX #FALSE
LDY #FALSE
JMP ISdIReXIT
LDX #TRUE
+ LDY #255
- INY
LDA (ZP),Y
BNE -
DEY
LDA (ZP),Y
LDY #TRUE
CMP #":"
BEQ ISdIReXIT
LDY #FALSE
ISdIReXIT = *
PLA
RTS
;*** OPEN( ZP=FILENAMEz, .a=MODE["R","W","A"] ) : .a=FCB
OPENfCB = SYSWORK+0
OPENnAMEsCAN = SYSWORK+1
OPENmODE = SYSWORK+2
OPENnAMElENGTH = SYSWORK+3
OPENdEVICE = SYSWORK+4
CHECKsTAT .BUF 1
ACEoPEN = *
STA OPENmODE
LDA #TRUE
STA CHECKsTAT
JSR GETlFaNDfCB
BCC +
RTS
+ STA LFTABLE,X
LDA #$00
STA EOFTABLE,X
STX OPENfCB
JSR GETdEVICE
STY OPENnAMEsCAN
LDX OPENfCB
STA DEVTABLE,X
STA OPENdEVICE
TAX
;GET SA HERE
LDA CONFIGbUF+0,X
CMP #0
BNE +
LDY CONFIGbUF+2,X
JMP NONdISKsA
+ LDY #0
CMP #1
BNE NONdISKsA
LDY #2
DISKsAsEARCH = *
LDX #FCBcOUNT-1
- LDA LFTABLE,X
BMI +
LDA DEVTABLE,X
CMP OPENdEVICE
BNE +
TYA
CMP SATABLE,X
BNE +
INY
BNE DISKsAsEARCH
+ DEX
BPL -
NONdISKsA = *
LDX OPENfCB
TYA
STA SATABLE,X
;SET THE NAME
LDX #0
LDY OPENnAMEsCAN
- LDA (ZP),Y
STA STRINGbUFFER,X
BEQ +
INY
INX
BNE -
+ LDY OPENdEVICE
LDA CONFIGbUF+0,Y
CMP #1
BNE NONdISKoPEN
;** STICK THE MODE FOR DISK FILES
CPX #0
BNE +
LDA #ACEeRRoPENdIRECTORY
SEC
RTS
+ LDA #","
STA STRINGbUFFER,X
INX
LDA OPENmODE
STA STRINGbUFFER,X
INX
JMP OPENgOTnAME
;** GET RID OF THE FILENAME FOR NON-DISKS
NONdISKoPEN = *
LDX #0
OPENgOTnAME = *
;** DISPATCH HERE FOR NON-KERNEL DEVICES
TXA
LDX #<STRINGbUFFER
LDY #>STRINGbUFFER
JSR KERNELsETNAM
;SET LFS
LDX OPENfCB
LDA LFTABLE,X
PHA
LDA SATABLE,X
TAY
LDA DEVTABLE,X
TAX
LDA CONFIGbUF+1,X
TAX
PLA
JSR KERNELsETLFS
;DO THE OPEN
JSR KERNELoPEN
BCS OPENeRROR
+ LDX OPENdEVICE
LDA CONFIGbUF+0,X
CMP #1
BNE +
LDA CHECKsTAT
BEQ +
TXA
JSR OPENdISKsTATUS
BCC +
OPENeRROR = *
STA ERRNO
LDX OPENfCB
LDA LFTABLE,X
CLC
JSR KERNELcLOSE
LDX OPENfCB
LDA #LFNULL
STA LFTABLE,X
SEC
LDA #FCBnULL
RTS
+ LDA OPENfCB
CLC
RTS
OPENdISKsTATUS = * ;( .a=DEVICE ) : ERRNO=.a=ERRCODE, .cs=ERRFLAG
JSR CMDCHoPEN
BCS +
JSR CHECKdISKsTATUS
PHP
PHA
JSR CMDCHcLOSE
PLA
PLP
+ RTS
CMDCHoPEN = * ;( .a=DEVICE )
PHA
JSR CMDCHcLOSE
PLA
TAX
LDA CONFIGbUF+1,X
TAX
LDY #15
LDA #LFNULL
JSR KERNELsETLFS
LDA #0
JSR KERNELsETNAM
JSR KERNELoPEN
BCC +
STA ERRNO
+ RTS
CMDCHsEND = * ;( STRINGbUFFER )
LDX #LFNULL
JSR KERNELcHKOUT
BCS CMDCHeRR
LDX #0
- LDA STRINGbUFFER,X
BEQ +
JSR KERNELcHROUT
BCS CMDCHeRR
INX
BNE -
+ JSR KERNELcLRCHN
CLC
RTS
CMDCHeRR = *
STA ERRNO
PHA
JSR KERNELcLRCHN
PLA
SEC
RTS
CHECKdISKsTATUScODE .BUF 1
CHECKdISKsTATUS = *
LDX #LFNULL
JSR KERNELcHKIN
BCS CMDCHeRR
JSR KERNELcHRIN
BCS CMDCHeRR
AND #$0F
STA CHECKdISKsTATUScODE
ASL
ASL
ADC CHECKdISKsTATUScODE
ASL
STA CHECKdISKsTATUScODE
JSR KERNELcHRIN
BCS CMDCHeRR
AND #$0F
CLC
ADC CHECKdISKsTATUScODE
STA CHECKdISKsTATUScODE
- JSR KERNELrEADST
AND #$80
BEQ +
LDA #ACEeRRdEVICEnOTpRESENT
SEC
BCS CMDCHeRR
+ JSR KERNELcHRIN
BCS CMDCHeRR
CMP #CHRcr
BNE -
JSR KERNELcLRCHN
LDA CHECKdISKsTATUScODE
CMP #62
BNE +
LDA #ACEeRRfILEnOTfOUND
STA ERRNO
SEC
RTS
+ CMP #20
BCC +
STA ERRNO
+ RTS
CMDCHcLOSE = *
SEC
LDA #LFNULL
JSR KERNELcLOSE
BCC +
STA ERRNO
+ RTS
;*** CLOSE( .a=FCB )
ACEcLOSE = *
TAX
LDA LFTABLE,X
PHA
LDA #LFNULL
STA LFTABLE,X
PLA
CLC
JMP KERNELcLOSE
;*** READ( .x=FCB, (ZP)=DATA, .ay=MAXlENGTH ) : .ay=LENGTH, .z=EOF
READmAXlEN = SYSWORK+0
READpTR = SYSWORK+2
READlENGTH = SYSWORK+4
READfCB = SYSWORK+6
READdEVICEdISK = SYSWORK+7
ACErEAD = *
STA READmAXlEN+0
STY READmAXlEN+1
STX READfCB
LDA ZP+0
LDY ZP+1
STA READpTR+0
STY READpTR+1
LDA #0
STA READlENGTH+0
STA READlENGTH+1
LDA EOFTABLE,X
BNE READeOFeXIT
LDY #0
LDA DEVTABLE,X
TAX
LDA CONFIGbUF+0,X
CMP #2
BNE +
JMP CONrEAD
+ CMP #1
BNE +
LDY #$FF
+ LDX READfCB
STY READdEVICEdISK
LDA LFTABLE,X
TAX
JSR KERNELcHKIN
BCC READbYTE
RTS
READbYTE = *
LDA READlENGTH+0
CMP READmAXlEN+0
LDA READlENGTH+1
SBC READmAXlEN+1
BCS READeXIT
JSR KERNELcHRIN
LDY #0
STA (READpTR),Y
INC READpTR+0
BNE +
INC READpTR+1
+ INC READlENGTH+0
BNE +
INC READlENGTH+1
+ BIT READdEVICEdISK
BPL READbYTE
LDA ST
AND #$40
BEQ READbYTE
LDX READfCB
STA EOFTABLE,X
READeXIT = *
JSR KERNELcLRCHN
READeXITnOCLR = *
LDA READlENGTH+0
LDY READlENGTH+1
LDX #$FF
CLC
RTS
READeOFeXIT = *
LDA #0
LDY #0
CLC
RTS
;*** WRITE( .x=FCB, (ZP)=DATA, .ay=LENGTH )
WRITElENGTH = SYSWORK+0
WRITEpTR = SYSWORK+2
ACEwRITE = *
STA WRITElENGTH+0
STY WRITElENGTH+1
LDA ZP+0
LDY ZP+1
STA WRITEpTR+0
STY WRITEpTR+1
STX REGSAVE+1
LDA DEVTABLE,X
TAX
LDA CONFIGbUF+0,X
CMP #2
;BEQ WRITEbYTE
BNE +
JMP CONwRITE
+ LDX REGSAVE+1
LDA LFTABLE,X
TAX
JSR KERNELcHKOUT
BCC WRITEbYTE
RTS
WRITEbYTE = *
LDA WRITElENGTH+0
ORA WRITElENGTH+1
BEQ WRITEfINISH
LDY #0
LDA (WRITEpTR),Y
JSR KERNELcHROUT
BCC +
STA ERRNO
JSR KERNELcLRCHN
SEC
RTS
+ INC WRITEpTR+0
BNE +
INC WRITEpTR+1
+ LDA WRITElENGTH+0
BNE +
DEC WRITElENGTH+1
+ DEC WRITElENGTH+0
JMP WRITEbYTE
WRITEfINISH = *
JSR KERNELcLRCHN
CLC
RTS
;*** CMDOPEN( (ZP)=dEVnAME ) : .a=fCB
GETdISKdEVICE = * ;( (ZP)=DEVNAME ) : .a=DEVICE, .z=ISkERNALdISK
JSR GETdEVICE
TAX
LDA CONFIGbUF+0,X
CMP #1
PHP
TXA
PLP
RTS
ACEcMDoPEN = *
JSR GETdISKdEVICE
BEQ +
LDA #ACEeRRdISKoNLYoPERATION
STA ERRNO
SEC
RTS
+ STA OPENdEVICE
JSR GETlFaNDfCB
BCC +
RTS
+ STA LFTABLE,X
STX OPENfCB
LDA OPENdEVICE
STA DEVTABLE,X
LDA #0
STA EOFTABLE,X
LDA #15
STA SATABLE,X
STX OPENfCB
LDA #0
STA STRINGbUFFER
LDA #FALSE
STA CHECKsTAT
LDX #0
JSR OPENgOTnAME
BCC +
RTS
+ LDA ST
AND #$80
BEQ +
LDA #ACEeRRdEVICEnOTpRESENT
STA ERRNO
SEC
RTS
+ LDA OPENfCB
RTS
;*** CMDCLOSE( .a=FCB )
ACEcMDcLOSE = *
TAX
LDA LFTABLE,X
PHA
LDA #LFNULL
STA LFTABLE,X
PLA
SEC
JMP KERNELcLOSE
;*** CMDSEND( .x=fCB, .ay=cMD )
ACEcMDsEND = *
STA SYSWORK+0
STY SYSWORK+1
LDA LFTABLE,X
TAX
JSR KERNELcHKOUT
BCC +
STA ERRNO
RTS
+ LDY #0
- LDA (SYSWORK),Y
BEQ +
JSR KERNELcHROUT
BCS ++
INY
BNE -
+ JSR KERNELcLRCHN
CLC
RTS
+ STA ERRNO
JSR KERNELcLRCHN
SEC
RTS
;*** CMDSTATUS( .x=fCB, .ay=sTATUSbUF ) : sTATUSbUF, .a=STATUScODE
ACEcMDsTATUS = *
STA SYSWORK+0
STY SYSWORK+1
LDA LFTABLE,X
TAX
JSR KERNELcHKIN
BCC +
- STA ERRNO
JSR KERNELcLRCHN
SEC
RTS
+ LDY #0
- JSR KERNELcHRIN
BCS --
CMP #$0D
BEQ +
STA (SYSWORK),Y
INY
JSR KERNELrEADST
AND #$40
BEQ -
+ LDA #0
STA (SYSWORK),Y
JSR KERNELcLRCHN
LDY #0
LDA (SYSWORK),Y
AND #$0F
ASL
ASL
ADC (SYSWORK),Y
ASL
STA SYSWORK+3
INY
LDA (SYSWORK),Y
AND #$0F
ADC SYSWORK+3
CLC
RTS
.SEQ ACECALL.S
.SEQ ACEMEM.S
.SEQ ACECON.S
;*** SCREEN CALLS
TEXTmODE .BUF 1
.IF COMPUTER-64
.SEQ ACEVDC.S
.SEQ ACEVIC.S
.ELSE
.SEQ ACEVIC80.S
.SEQ ACEVIC.S
.IFE
SCREENiNIT = *
.IF COMPUTER-64
JSR VDCiNIT
JSR VICiNIT
LDA #80
BIT $D7
BMI +
LDA #40
+ JSR CONSCREEN
.ELSE
LDA #40
;XX CHECK CONFIG FOR SCREEN
JSR CONSCREEN
.IFE
RTS
ACEwINMAX = *
BIT TEXTmODE
BMI +
JMP VICwINMAX
+ JMP VDCwINMAX
ACEwINCLS = *
BIT TEXTmODE
BMI +
JMP VICwINCLS
+ JMP VDCwINCLS
ACEwINSET = *
BIT TEXTmODE
BMI +
JMP VICwINSET
+ JMP VDCwINSET
ACEwINSIZE = *
BIT TEXTmODE
BMI +
JMP VICwINSIZE
+ JMP VDCwINSIZE
ACEwINLOAD = *
BIT TEXTmODE
BMI +
JMP VICwINLOAD
+ JMP VDCwINLOAD
ACEwINSAVE = *
BIT TEXTmODE
BMI +
JMP VICwINSAVE
+ JMP VDCwINSAVE
ACEwINPUT = *
BIT TEXTmODE
BMI +
JMP VICwINPUT
+ JMP VDCwINPUT
ACEwINCOLOR = *
BIT TEXTmODE
BMI +
JMP VICwINCOLOR
+ JMP VDCwINCOLOR
ACEwINPOS = *
BIT TEXTmODE
BMI +
JMP VICwINPOS
+ JMP VDCwINPOS
ACEwINCURSOR = *
BIT TEXTmODE
BMI +
JMP VICwINCURSOR
+ JMP VDCwINCURSOR
ACEwINSCROLL = *
BIT TEXTmODE
BMI +
JMP VICwINSCROLL
+ JMP VDCwINSCROLL
;*** MAIN()
BOOTdEVICE .BUF 1
TITLEpTR .BUF 2
TITLElEN .BUF 2
MAIN = *
LDA #147
JSR KERNELcHROUT
LDA #14
JSR KERNELcHROUT
LDX #0
- LDA ACEsTARTUPmSG,X
BEQ +
JSR KERNELcHROUT
INX
BNE -
+ SEI
JSR ACEbOOTSTRAP
LDA ACEcURRENTdEVICE
STA BOOTdEVICE
JSR INITmEMORY
JSR ACEcONFIG
BCS MAINeXIT
LDA 2
LDY 3
STA TITLEpTR+0
STY TITLEpTR+1
LDA 4
LDY 5
STA TITLElEN+0
STY TITLElEN+1
JSR ACEsTARTUP
JSR INITmEMORYaLLOC
SEI
JSR SCREENiNIT
JSR CONiNIT
JSR ACEiRQiNIT
CLI
;** OPEN STD FILES
LDA #<CONFIGbUF+$90
LDY #>CONFIGbUF+$91
STA ZP+0
STY ZP+1
JSR CHDIR
LDA #<STDINnAME
LDY #>STDINnAME
STA ZP+0
STY ZP+1
LDA #"R"
JSR OPEN ;FCB=0
LDA #<STDOUTnAME
LDY #>STDOUTnAME
STA ZP
STY ZP+1
LDA #"W"
JSR OPEN ;FCB=1
LDA #"W"
JSR OPEN ;FCB=2
LDA TITLEpTR+0
LDY TITLEpTR+1
STA ZP+0
STY ZP+1
LDA TITLElEN+0
LDY TITLElEN+1
LDX #STDOUT
JSR WRITE
CLI
;** CALL SHELL
LDA #<ACEsHELLaDDRESS
LDY #>ACEsHELLaDDRESS
JSR EXEC
;** EXIT
MAINeXIT = *
LDA #STDIN
JSR CLOSE
LDA #STDOUT
JSR CLOSE
LDA #STDERR
JSR CLOSE
LDA BOOTdEVICE
STA 186
JSR SHUTDOWNmEMORY
LDA #147
JSR KERNELcHROUT
JMP ACEsHUTDOWNbASIC
STDOUTnAME .ASC "S:"
.BYTE 0
STDINnAME .ASC "K:"
.BYTE 0
ACEsTARTUPmSG = *
.IF COMPUTER-64
.ASC "ace-128 "
.ELSE
.ASC "ace-64 "
.IFE
.ASC "kERNEL 0.54.00 - csb 30-nOV-93"
.BYTE CHRcr,CHRcr,0
;*** BSS: C128=768 BYTES, C64=512 BYTES
ACEbSS = *
SHELLaLIASbUF = ACEbSS+0
SHELLpATHbUF = SHELLaLIASbUF+256
.IF COMPUTER-64
STRINGbUFFER = SHELLpATHbUF+256
ACEbSSeND = STRINGbUFFER+256
.ELSE
ACEbSSeND = SHELLpATHbUF+256
.IFE
ACECALL.S
801
;*** DIROPEN( (ZP)=DEVICEnAME ) : .a=FCB
ACEdIRoPEN = *
LDA #TRUE
STA CHECKsTAT
JSR GETdISKdEVICE
BEQ +
LDA #ACEeRRdISKoNLYoPERATION
SEC
RTS
+ STA OPENdEVICE
STY OPENnAMEsCAN
JSR GETlFaNDfCB
BCC +
RTS
+ STA LFTABLE,X
LDA OPENdEVICE
STA DEVTABLE,X
LDA #0
STA EOFTABLE,X
LDA #0
STA SATABLE,X
STX OPENfCB
LDA #"$"
STA STRINGbUFFER
LDA #"0"
STA STRINGbUFFER+1
LDA #0
STA STRINGbUFFER+2
LDX #2
JSR DIRoPENsETnAME
JSR OPENgOTnAME
BCC +
RTS
+ LDX OPENfCB
LDA LFTABLE,X
TAX
JSR KERNELcHKIN
JSR KERNELcHRIN
JSR KERNELcHRIN
JSR KERNELcLRCHN
LDA OPENfCB
CLC
RTS
DIRoPENsETnAME = *
LDY OPENdEVICE
LDA CONFIGbUF+3,Y
BMI DIRnAMEdATE
LDY OPENnAMEsCAN
LDA (ZP),Y
BNE +
RTS
+ LDX #1
DIRnAMEnORMAL = *
- LDA (ZP),Y
STA STRINGbUFFER,X
BEQ +
INY
INX
BNE -
+ DEX
LDA #":"
CMP STRINGbUFFER,X
BEQ +
INX
STA STRINGbUFFER,X
+ INX
LDA #"*"
STA STRINGbUFFER,X
INX
LDA #0
STA STRINGbUFFER,X
RTS
DIRnAMEdATE = *
LDA #"="
STA STRINGbUFFER+1
LDA #"T"
STA STRINGbUFFER+2
LDX #3
LDY OPENnAMEsCAN
JSR DIRnAMEnORMAL
LDA #"="
STA STRINGbUFFER,X
INX
LDA #"L"
STA STRINGbUFFER,X
INX
LDA #0
STA STRINGbUFFER,X
RTS
;*** DIRREAD( .x=FCB ) : .z=EOF, ACEdIRENTbUFFER=DATA
DIRbLOCKS = SYSWORK+0
ACEdIRrEAD = *
LDA LFTABLE,X
TAX
JSR KERNELcHKIN
BCC +
LDA #0
RTS
;** READ THE LINK
+ JSR KERNELcHRIN
STA SYSWORK+4
JSR KERNELrEADST
AND #$40
BNE DIRREADeOFeXIT
JSR KERNELcHRIN
ORA SYSWORK+4
BNE +
DIRREADeOFeXIT = *
JSR KERNELcLRCHN
LDX #0
RTS
;** READ THE BLOCK COUNT
+ JSR KERNELcHRIN
STA DIRbLOCKS
STA ACEdIRENTbYTES+1
JSR KERNELcHRIN
STA DIRbLOCKS+1
STA ACEdIRENTbYTES+2
ASL DIRbLOCKS
ROL DIRbLOCKS+1
LDA #0
ROL
STA DIRbLOCKS+2
SEC
LDA #0
SBC DIRbLOCKS
STA ACEdIRENTbYTES+0
LDA ACEdIRENTbYTES+1
SBC DIRbLOCKS+1
STA ACEdIRENTbYTES+1
LDA ACEdIRENTbYTES+2
SBC DIRbLOCKS+2
STA ACEdIRENTbYTES+2
;** READ THE FILENAME
LDA #0
STA ACEdIRENTnAME
STA ACEdIRENTnAMElEN
- JSR KERNELcHRIN
BCS DIRREADeRReXIT
BIT ST
BVS DIRREADeRReXIT
CMP #" "
BEQ -
CMP #18
BEQ -
CMP #$22
BNE DIRREADeXIT
LDX #0
- JSR KERNELcHRIN
BCS DIRREADeRReXIT
BIT ST
BVS DIRREADeRReXIT
CMP #$22
BEQ +
STA ACEdIRENTnAME,X
INX
BNE -
+ LDA #0
STA ACEdIRENTnAME,X
STX ACEdIRENTnAMElEN
- JSR KERNELcHRIN
CMP #" "
BEQ -
;** READ TYPE AND FLAGS
LDX #%01100000
STX ACEdIRENTfLAGS
CMP #"*"
BNE +
LDA ACEdIRENTfLAGS
ORA #%00001000
STA ACEdIRENTfLAGS
JSR KERNELcHRIN
+ LDX #3
LDY #0
JMP DIRtYPEfIRST
- JSR KERNELcHRIN
DIRtYPEfIRST = *
STA ACEdIRENTtYPE,Y
INY
DEX
BNE -
LDA #0
STA ACEdIRENTtYPE+3
LDA ACEdIRENTtYPE
CMP #"D"
BNE +
LDA ACEdIRENTfLAGS
ORA #%10010000
STA ACEdIRENTfLAGS
JMP DIRREADeXIT
+ CMP #"P"
BNE DIRREADeXIT
LDA ACEdIRENTfLAGS
ORA #%00010000
STA ACEdIRENTfLAGS
JMP DIRREADeXIT
DIRREADeRReXIT = *
STA ERRNO
JSR KERNELcLRCHN
LDX #0
SEC
RTS
DIRREADeXIT = *
JSR KERNELcHRIN
CMP #0
BEQ DIRREADrEALeXIT
CMP #"<"
BNE +
LDA ACEdIRENTfLAGS
AND #%11011111
STA ACEdIRENTfLAGS
+ LDX #7
LDA #0
- STA ACEdIRENTdATE,X
DEX
BPL -
- JSR KERNELcHRIN
CMP #0
BEQ DIRREADrEALeXIT
CMP #"0"
BCC -
CMP #"9"+1
BCS -
DIRREADdATE = *
JSR DIRgETnUMgOT
STA ACEdIRENTdATE+2
JSR DIRgETnUM
STA ACEdIRENTdATE+3
JSR DIRgETnUM
STA ACEdIRENTdATE+1
LDA CONFIGbUF+$86
STA ACEdIRENTdATE+0
JSR DIRgETnUM
STA ACEdIRENTdATE+4
JSR DIRgETnUM
STA ACEdIRENTdATE+5
JSR KERNELcHRIN
JSR KERNELcHRIN
CMP #"A"
BNE DIRREADpm
DIRREADam = *
LDA ACEdIRENTdATE+4
CMP #$12
BNE +
LDA #$00
STA ACEdIRENTdATE+4
JMP +
DIRREADpm = *
LDA ACEdIRENTdATE+4
CMP #$12
BEQ +
CLC
SEI
SED
ADC #$12
CLD
CLI
STA ACEdIRENTdATE+4
/ JSR KERNELcHRIN
CMP #0
BNE -
DIRREADrEALeXIT = *
JSR KERNELcLRCHN
LDX #$FF
CLC
RTS
DIRgETnUM = *
- JSR KERNELcHRIN
DIRgETnUMgOT = *
CMP #0
BEQ +
CMP #"0"
BCC -
CMP #"9"+1
BCS -
ASL
ASL
ASL
ASL
STA SYSWORK+6
JSR KERNELcHRIN
CMP #0
BEQ +
AND #$0F
ORA SYSWORK+6
+ RTS
;*** FCBSWAP( .x=fCB1, .y=fCB2 )
ACEfCBsWAP = *
LDA LFTABLE,X
PHA
LDA LFTABLE,Y
STA LFTABLE,X
PLA
STA LFTABLE,Y
LDA DEVTABLE,X
PHA
LDA DEVTABLE,Y
STA DEVTABLE,X
PLA
STA DEVTABLE,Y
LDA SATABLE,X
PHA
LDA SATABLE,Y
STA SATABLE,X
PLA
STA SATABLE,Y
LDA EOFTABLE,X
PHA
LDA EOFTABLE,Y
STA EOFTABLE,X
PLA
STA EOFTABLE,Y
LDA PIDTABLE,X
PHA
LDA PIDTABLE,Y
STA PIDTABLE,X
PLA
STA PIDTABLE,Y
CLC
RTS
;*** BLOAD( (ZP)=nAME, .ay=aDDRESS ) : .ay=eND+1
BLOADaDDRESS = SYSWORK
BLOADfILENAME = SYSWORK+2
BLOADdEVICE = SYSWORK+4
ACEbLOAD = *
STA BLOADaDDRESS+0
STY BLOADaDDRESS+1
JSR GETdEVICE
STA BLOADdEVICE
TAX
CLC
TYA
ADC ZP+0
STA BLOADfILENAME+0
LDA ZP+1
ADC #0
STA BLOADfILENAME+1
LDA CONFIGbUF+1,X
TAX
LDA #0
LDY #0
JSR KERNELsETLFS
LDY #0
- LDA (BLOADfILENAME),Y
BEQ +
INY
BNE -
+ TYA
LDX BLOADfILENAME+0
LDY BLOADfILENAME+1
JSR KERNELsETNAM
LDA #0
LDX BLOADaDDRESS+0
LDY BLOADaDDRESS+1
JSR KERNELlOAD
STX BLOADaDDRESS+0
STY BLOADaDDRESS+1
BCC BLOADoK
PHA
CMP #ACEeRRdEVICEnOTpRESENT
BEQ +
LDX BLOADdEVICE
LDA CONFIGbUF+0,X
CMP #1
BNE +
TXA
JSR OPENdISKsTATUS
+ PLA
- STA ERRNO
LDA #0
LDA #0
LDY #0
SEC
RTS
BLOADoK = *
LDX BLOADdEVICE
LDA CONFIGbUF+0,X
CMP #1
BNE +
TXA
JSR OPENdISKsTATUS
BCS -
+ LDA BLOADaDDRESS+0
LDY BLOADaDDRESS+1
RTS
;*** REMOVE( (ZP)=nAME )
REMOVEdEVICE = SYSWORK
ACErEMOVE = *
JSR GETdISKdEVICE
STA REMOVEdEVICE
LDA #"S"
STA STRINGbUFFER
LDA #":"
STA STRINGbUFFER+1
LDX #1
LDA (ZP),Y
CMP #"/"
BEQ +
LDX #2
/ LDA (ZP),Y
STA STRINGbUFFER,X
BEQ +
INY
INX
BNE -
+ LDA #0
STA STRINGbUFFER,X
LDA REMOVEdEVICE
JSR CMDCHoPEN
BCS ++
JSR CMDCHsEND
BCS +
JSR CHECKdISKsTATUS
+ PHP
JSR CMDCHcLOSE
PLP
+ RTS
;*** CDHOME( )
ACEcDhOME = *
LDA #<CONFIGbUF+$90
LDY #>CONFIGbUF+$90
STA ZP+0
STY ZP+1
;XX FALL THROUGH
;*** CHDIR( (ZP)=dIRnAME )
CHDIRdEVICE = SYSWORK+0
CHDIRsCAN = SYSWORK+1
CHDIRnAMEsCAN = SYSWORK+2
CHDIRcMDoPEN = SYSWORK+3
ACEcHdIR = *
LDA #0
STA CHDIRcMDoPEN
JSR GETdISKdEVICE
BEQ +
LDA #ACEeRRdISKoNLYoPERATION
STA ERRNO
SEC
RTS
+ STY CHDIRnAMEsCAN
STA CHDIRdEVICE
+ LDA #"C"
STA STRINGbUFFER+0
LDA #"P"
STA STRINGbUFFER+1
LDX #2
- LDA (ZP),Y
CMP #"0"
BCC +
CMP #"9"+1
BCS +
STA STRINGbUFFER,X
INX
INY
BNE -
+ CPX #2
BEQ CHDIRcD
LDA #0
STA STRINGbUFFER,X
STY CHDIRsCAN
LDA CHDIRdEVICE
JSR CMDCHoPEN
BCC +
RTS
+ LDA #$FF
STA CHDIRcMDoPEN
JSR CMDCHsEND
BCS CHDIRaBORT
JSR CHECKdISKsTATUS
BCS CHDIRaBORT
LDY CHDIRsCAN
CHDIRcD = *
LDA #"D"
STA STRINGbUFFER+1
LDX #2
- LDA (ZP),Y
STA STRINGbUFFER,X
BEQ +
CMP #":"
BEQ +
INY
INX
BNE -
+ CPX #2
BEQ CHDIRsETnAME
LDA #0
STA STRINGbUFFER,X
LDA CHDIRcMDoPEN
BMI +
LDA CHDIRdEVICE
JSR CMDCHoPEN
BCC +
RTS
+ JSR CMDCHsEND
BCS CHDIRaBORT
JSR CHECKdISKsTATUS
BCS CHDIRaBORT
JSR CMDCHcLOSE
CHDIRsETnAME = *
LDA CHDIRdEVICE
STA ACEcURRENTdEVICE
LSR
LSR
ORA #$40
STA CDbUFFER
LDA #":"
STA CDbUFFER+1
LDX #2
LDY CHDIRnAMEsCAN
- LDA (ZP),Y
STA CDbUFFER,X
BEQ +
INX
INY
BNE -
+ RTS
CHDIRaBORT = *
JSR CMDCHcLOSE
SEC
RTS
;*** DEVINFO( .x=fCB ) : .a=dEVtYPE(0=CON,1=CHAR,2=DISK), .x=cOLS, .y=rOWS
ACEdEViNFO = *
LDA DEVTABLE,X
TAX
LDA CONFIGbUF+0,X
CMP #2
BNE +
JSR WINSIZE
TAY
LDX SYSWORK+0
LDA #0
RTS
+ LDX #80
LDY #66
CMP #1
BEQ +
CMP #4
BEQ +
LDA #1
RTS
+ LDA #2
RTS
;*** UTOA( $0+x=VALUE32, ($80)=BUF, .a=MINlEN ) : BUF, .a=.y=LEN
UTOAbUF = SYSWORK ;(2)
UTOAbIN = SYSWORK+2 ;(4)
UTOAbCD = SYSWORK+6 ;(5)
UTOAfLAG = SYSWORK+11 ;(1)
UTOAlEN = SYSWORK+12 ;(1)
UTOApOS = SYSWORK+13 ;(1)
ACEuTOA = *
CMP #10
BCC +
LDA #10
+ STA UTOAlEN
SEC
LDA #10
SBC UTOAlEN
STA UTOAlEN
LDY #0
- LDA 0,X
STA UTOAbIN,Y
INX
INY
CPY #4
BCC -
LDX #4
LDA #0
- STA UTOAbCD,X
DEX
BPL -
STA UTOAfLAG
LDY #32
SEI
SED
UTOAnEXTbIT = *
ASL UTOAbIN+0
ROL UTOAbIN+1
ROL UTOAbIN+2
ROL UTOAbIN+3
LDX #4
- LDA UTOAbCD,X
ADC UTOAbCD,X
STA UTOAbCD,X
DEX
BPL -
DEY
BNE UTOAnEXTbIT
CLD
CLI
LDA #10
STA UTOApOS
LDX #0
LDY #0
- LDA UTOAbCD,X
JSR UTOApUThEX
INX
CPX #5
BCC -
LDA #0
STA (UTOAbUF),Y
RTS
UTOApUThEX = *
PHA
LSR
LSR
LSR
LSR
JSR UTOApUTdIGIT
PLA
AND #$0F
UTOApUTdIGIT = *
DEC UTOApOS
BEQ UTOAfORCEdIGIT
CMP UTOAfLAG
BNE UTOAfORCEdIGIT
DEC UTOAlEN
BMI +
RTS
+ LDA #$20
BNE UTOApOKE
UTOAfORCEdIGIT = *
ORA #$30
STA UTOAfLAG
UTOApOKE = *
STA (UTOAbUF),Y
INY
RTS
;*** DATE( (.ay)=DATEsTRING ) FMT:yy:yy:mm:dd:hh:mm:ss:tw
ACEgETdATE = *
STA SYSWORK
STY SYSWORK+1
LDY #3
- LDA ACEdATE,Y
STA (SYSWORK),Y
DEY
BPL -
LDY #4
LDA CIA1+$B
BPL +
AND #$1F
SEI
SED
CLC
ADC #$12
CLD
CLI
+ CMP #$12
BNE +
LDA #$00
+ CMP #$24
BNE +
LDA #$12
+ STA (SYSWORK),Y
INY
LDA CIA1+$A
STA (SYSWORK),Y
INY
LDA CIA1+$9
STA (SYSWORK),Y
INY
LDA CIA1+$8
ASL
ASL
ASL
ASL
ORA ACEdow
STA (SYSWORK),Y
RTS
ACEsETdATE = *
STA SYSWORK
STY SYSWORK+1
LDY #3
- LDA (SYSWORK),Y
STA ACEdATE,Y
DEY
BPL -
LDY #4
LDA (SYSWORK),Y
CMP #$13
BCC +
SEI
SED
SEC
SBC #$12
CLD
CLI
ORA #$80
+ STA CIA1+$B
INY
LDA (SYSWORK),Y
STA CIA1+$A
INY
LDA (SYSWORK),Y
STA CIA1+$9
INY
LDA (SYSWORK),Y
LSR
LSR
LSR
LSR
STA CIA1+$8
LDA (SYSWORK),Y
AND #$07
STA ACEdow
RTS
;*** RENAME( (ZP)=oLDnAME, (ZW)=nEWnAME )
;*** DON'T EVEN THINK ABOUT RENAMING FILES OUTSIDE THE CURRENT DIRECTORY
RENAMEdEVICE = SYSWORK+0
RENAMEsCAN = SYSWORK+1
ACErENAME = *
JSR GETdISKdEVICE
STA RENAMEdEVICE
STY RENAMEsCAN
LDA #"R"
STA STRINGbUFFER+0
LDA #":"
STA STRINGbUFFER+1
;** COPY NEW NAME
LDY #0
LDX #2
- LDA (ZW),Y
STA STRINGbUFFER,X
BEQ +
INY
INX
BNE -
+ LDA #"="
STA STRINGbUFFER,X
INX
;** COPY OLD NAME
LDY RENAMEsCAN
- LDA (ZP),Y
STA STRINGbUFFER,X
BEQ +
INX
INY
BNE -
+ LDA RENAMEdEVICE
JSR CMDCHoPEN
BCS ++
JSR CMDCHsEND
BCS +
JSR CHECKdISKsTATUS
+ PHP
JSR CMDCHcLOSE
PLP
+ RTS
;BLANK LINE
ACECON.S
991
;ace-128/64 KERNEL CONSOLE DRIVER: HIGH LEVEL i/o & KEYBOARD
CONwINsTART .BUF 2
CONwINrOWS .BUF 1
CONwINcOLS .BUF 1
CONrOWiNC .BUF 2
CONlINEaDDR .BUF 2
CONcURrOW .BUF 1
CONcURcOL .BUF 1
CONpUTmASK .BYTE $80 ;.BUF 1
CONcHARcOLOR .BYTE $0E ;.BUF 1
CONcURSORcOLOR .BYTE $07 ;.BUF 1
CHRtAB = $09
KEYLINEpTR .BUF 1
KEYLINEcOUNT .BUF 1
.IF COMPUTER-64
SHIFTvALUE = $D3
.ELSE
SHIFTvALUE = $28D
.IFE
CONiNIT = *
LDA CONFIGbUF+$8E
STA CONsSmAX
STA CONsScOUNTDOWN
LDA #0
STA KEYLINEcOUNT
JSR KEYSCANiNIT
CONwINiNIT = *
JSR WINSIZE
STA CONwINrOWS
LDA SYSWORK+0
STA CONwINcOLS
LDA SYSWORK+2
LDY SYSWORK+3
STA CONwINsTART+0
STY CONwINsTART+1
LDA SYSWORK+4
LDY SYSWORK+5
STA CONrOWiNC+0
STY CONrOWiNC+1
CONcLS = *
LDA #" "
LDY CONcHARcOLOR
LDX #$FF
JSR WINCLS
JSR CONhOME
RTS
CONsHUTDOWN = *
RTS
CONhOME = *
LDA CONwINsTART+0
LDY CONwINsTART+1
STA CONlINEaDDR+0
STY CONlINEaDDR+1
LDA #0
STA CONcURrOW
STA CONcURcOL
RTS
CONpUTsAVE .BUF 1
CONpUTCHAR = * ;( .a=CHAR )
CMP #CHRcr
BEQ CONnEWLINE
CMP #147
BEQ CONcLS
CMP #CHRtAB
BNE +
JMP CONtAB
+ STA CONpUTsAVE
LDA CONcURcOL
CMP CONwINcOLS
BCC +
JSR CONnEWLINE
+ CLC
LDA CONlINEaDDR+0
ADC CONcURcOL
STA SYSWORK+0
LDA CONlINEaDDR+1
ADC #0
STA SYSWORK+1
LDA #<CONpUTsAVE
LDY #>CONpUTsAVE
STA ZW+0
STY ZW+1
LDX #1
STX SYSWORK+5
LDA CONpUTmASK
LDY CONcHARcOLOR
JSR WINPUT
INC CONcURcOL
RTS
CONgETcURSORaDDR = *
CLC
LDA CONlINEaDDR+0
ADC CONcURcOL
STA SYSWORK+0
LDA CONlINEaDDR+1
ADC #0
STA SYSWORK+1
RTS
CONsYNCHcURSOR = *
LDA CONcURcOL
CMP CONwINcOLS
BCC +
JSR CONnEWLINE
+ RTS
CONnEWLINE = *
- LDA SHIFTvALUE
AND #$0F
CMP #$04
BEQ -
LDA SCROLLfREEZE
BNE -
LDA #0
STA CONcURcOL
INC CONcURrOW
LDA CONcURrOW
CMP CONwINrOWS
BCS +
CLC
LDA CONlINEaDDR+0
ADC CONrOWiNC+0
STA CONlINEaDDR+0
LDA CONlINEaDDR+1
ADC CONrOWiNC+1
STA CONlINEaDDR+1
CLC
RTS
+ DEC CONcURrOW
JSR CONsCROLL
CLC
RTS
CONsCROLL = *
LDA #"+"
STA SYSWORK+4
LDA CONpUTmASK
LDX #1
LDY CONcHARcOLOR
JSR WINSCROLL
RTS
CONtAB = *
LDA CONcURcOL
AND #7
STA SYSWORK+0
SEC
LDA #8
SBC SYSWORK+0
CLC
ADC CONcURcOL
CMP CONwINcOLS
BCC +
LDA CONwINcOLS
+ STA CONcURcOL
RTS
;*** CONwRITE( WRITEpTR, WRITElENGTH ) **ZW GETS MODIFIED**
CONwRITEpTR = SYSWORK+8
CONwRITElENGTH = SYSWORK+10
CONwRITE = *
LDA WRITElENGTH+0
LDY WRITElENGTH+1
STA CONwRITElENGTH+0
STY CONwRITElENGTH+1
LDA WRITEpTR+0
LDY WRITEpTR+1
STA CONwRITEpTR+0
STY CONwRITEpTR+1
CONwRITEbYTE = *
LDA CONwRITElENGTH+0
ORA CONwRITElENGTH+1
BEQ CONwRITEfINISH
LDY #0
LDA (CONwRITEpTR),Y
JSR CONpUTCHAR
INC CONwRITEpTR+0
BNE +
INC CONwRITEpTR+1
+ LDA CONwRITElENGTH+0
BNE +
DEC CONwRITElENGTH+1
+ DEC CONwRITElENGTH+0
JMP CONwRITEbYTE
CONwRITEfINISH = *
CLC
RTS
;*** CONrEAD( READpTR, READmAXlEN, READlENGTH ) : .ay=LEN, .z
CONrEAD = *
LDA READlENGTH+0
CMP READmAXlEN+0
LDA READlENGTH+1
SBC READmAXlEN+1
BCS CONrEADeXIT
JSR KEYLINEgET
BCS CONrEADeOFeXIT
LDY #0
STA (READpTR),Y
INC READpTR+0
BNE +
INC READpTR+1
+ INC READlENGTH+0
BNE +
INC READlENGTH+1
+ CMP #$0D
BEQ CONrEADeXIT
JMP CONrEAD
CONrEADeXIT = *
LDA READlENGTH+0
LDY READlENGTH+1
LDX #$FF
CLC
RTS
CONrEADeOFeXIT = *
LDA #0
LDY #0
CLC
RTS
KEYLINEgET = * ;( KEYLINEpTR, KEYLINEcOUNT ) : .a=CHAR, .cs=EOF
LDA KEYLINEcOUNT
BNE +
JSR CONiNPUT
BCS ++
+ LDX KEYLINEpTR
INC KEYLINEpTR
DEC KEYLINEcOUNT
LDA KEYLINE,X
CLC
+ RTS
CONpARMsAVE .BUF 8
CONiNPUT = *
LDX #7
- LDA SYSWORK,X
STA CONpARMsAVE,X
DEX
BPL -
LDX #0
STX KEYLINEpTR
STX KEYLINEcOUNT
CONiNnEXT = *
JSR CONsYNCHcURSOR
JSR CONcURSORoN
JSR CONgETKEY
JSR CONcURSORoFF
CMP #$0D
BEQ CONiNrETURN
CMP #$14
BEQ CONiNbACKSPACE
CMP #$03
BEQ CONiNnEXT
CMP #147
BEQ CONiNcLEAR
CMP #$04
BNE +
JSR CONrESTOREpARMS
SEC
RTS
+ LDX KEYLINEpTR
CPX #254
BCS CONiNnEXT
STA KEYLINE,X
INC KEYLINEpTR
JSR CONpUTCHAR
JMP CONiNnEXT
CONiNrETURN = *
LDX KEYLINEpTR
STA KEYLINE,X
INX
STX KEYLINEcOUNT
LDX #0
STX KEYLINEpTR
JSR CONpUTCHAR
JSR CONrESTOREpARMS
CLC
RTS
CONiNbACKSPACE = *
LDX KEYLINEpTR
BEQ +
DEC KEYLINEpTR
JSR CONbACKSPACE
LDA #" "
JSR CONpUTCHAR
JSR CONbACKSPACE
+ JMP CONiNnEXT
CONiNcLEAR = *
JSR CONpUTCHAR
LDA #0
STA KEYLINEpTR
JMP CONiNnEXT
CONrESTOREpARMS = *
LDX #7
- LDA CONpARMsAVE,X
STA SYSWORK,X
DEX
BPL -
RTS
CONbACKSPACE = *
DEC CONcURcOL
BPL +
LDX CONwINcOLS
DEX
STX CONcURcOL
LDA CONcURrOW
BEQ +
DEC CONcURrOW
SEC
LDA CONlINEaDDR+0
SBC CONrOWiNC+0
STA CONlINEaDDR+0
LDA CONlINEaDDR+1
SBC CONrOWiNC+1
STA CONlINEaDDR+1
+ RTS
CONcURSORoN = * ;( )
JSR CONgETcURSORaDDR
LDY CONcURSORcOLOR
LDA #$FF
JSR WINCURSOR
RTS
CONcURSORoFF = * ;( ) ;.a PRESERVED
PHA
JSR CONgETcURSORaDDR
LDA #0
JSR WINCURSOR
PLA
RTS
CONcOLOR = *
CMP #128
BCC +
STX CONcHARcOLOR
+ AND #64
BEQ +
STY CONcURSORcOLOR
+ LDX CONcHARcOLOR
LDY CONcURSORcOLOR
RTS
CONpALETTE = *
LDY #0
BIT TEXTmODE
BMI +
LDY #8
+ LDX #0
- NOP
.IF COMPUTER-64
LDA CONFIGbUF+$B0,Y
.ELSE
LDA CONFIGbUF+$D0,Y
.IFE
STA SYSWORK+0,X
INY
INX
CPX #8
BCC -
RTS
CONsCREEN = *
LDX #$00
CMP #40+1
BCC +
LDX #$80
+ STX TEXTmODE
.IF COMPUTER-64
;** 128-SET FAST/SLOW
CPX #0
BEQ +
LDA VIC+$11
AND #%11101111
STA VIC+$11
LDA #1
STA VIC+$30
JMP ++
+ LDA #0
STA VIC+$30
LDA VIC+$11
ORA #%00010000
STA VIC+$11
+ NOP
.ELSE
;** 64-INITIALIZE SCREEN HARDWARE
CPX #$00
BNE +
JSR VICiNIT
JMP ++
+ JSR VDCiNIT
+ NOP
.IFE
;** CHANGE COLORS
JSR CONPALETTE
LDX SYSWORK+0
LDY SYSWORK+1
LDA #$FF
JSR CONCOLOR
JSR CONPALETTE
LDX SYSWORK+7
LDY SYSWORK+6
LDA #$FF
JSR WINCOLOR
;** WINDOW PARMS
JSR WINMAX
JSR CONwINiNIT
RTS
;3-kEY rOLLOVER-128 BY cRAIG bRUCE 18-jUN-93 FROM c= hACKING MAGAZINE
.IF COMPUTER-64
SCANROWS = 11
PK = $D02F
NEWPOS = $CC
KEYCODE = $D4
PREVkEYCODE = $D5
XSAVE = $CD
MASK = $CC
CAPSpORT = $0001
KEYMAPpTR = $CC
.ELSE
SCANROWS = 8
PK .BUF 1 ;DUMMY
NEWPOS = $F5
KEYCODE = $CB
PREVkEYCODE = $C5
XSAVE = $F6
MASK = $F5
CAPSpORT .BYTE $40
KEYMAPpTR = $F5
.IFE
STOPkEYrOW .BUF 1
ROLLOVER = 3
NULLkEY = $FF
PA = $DC00
PB = $DC01
CONiRQkEYSCAN = *
LDA #0
STA PA
STA PK
- LDA PB
CMP PB
BNE -
CMP #$FF
BEQ NOkEYpRESSED
JSR CONsCREENuNSAVE
JSR CHECKjOYSTICK
BCC NOkEYpRESSED
JSR KEYSCAN
JSR CHECKjOYSTICK
BCC NOkEYpRESSED
LDA SCANtABLE+7
STA STOPkEYrOW
JSR SELECTmOUSE
JSR SHIFTDECODE
JSR KEYDECODE
JSR KEYORDER
BIT IGNOREkEYS
BMI +
LDA PREVkEYS+0
CMP #NULLkEY
BEQ +
STA KEYCODE
JMP INTERPkEY
NOkEYpRESSED = *
JSR SELECTmOUSE
LDA #NULLkEY
LDX #ROLLOVER-1
- STA PREVkEYS,X
DEX
BPL -
JSR SCANcAPS
LDA #0
STA IGNOREkEYS
STA STOPkEYrOW
+ LDA #NULLkEY
STA KEYCODE
STA PREVkEYCODE
RTS
SELECTmOUSE = *
LDA #$FF
STA PK
LDA #$7F ;SELECTS PADDLE/MOUSE a
STA PA
RTS
KEYSCANiNIT = *
LDA #NULLkEY
LDX #ROLLOVER-1
- STA PREVkEYS,X
DEX
BPL -
LDA #0
STA IGNOREkEYS
RTS
KEYSCAN = *
.IF COMPUTER-64
LDX #$FF
LDY #$FF
LDA #$FE
STA MASK+0
LDA #$FF
STA MASK+1
JMP +
NEXTrOW = *
- LDA PB
CMP PB
BNE -
STY PA
STY PK
EOR #$FF
STA SCANtABLE,X
SEC
ROL MASK+0
ROL MASK+1
+ LDA MASK+0
STA PA
LDA MASK+1
STA PK
INX
CPX #SCANROWS
BCC NEXTrOW
RTS
.ELSE
LDX #$FF
LDY #$FF
LDA #$FE
STA MASK
JMP +
NEXTrOW = *
- LDA PB
CMP PB
BNE -
STY PA
EOR #$FF
STA SCANtABLE,X
SEC
ROL MASK
+ LDA MASK
STA PA
INX
CPX #SCANROWS
BCC NEXTrOW
RTS
.IFE
SHIFTrOWS .BYTE $01,$06,$07,$07,$0A
SHIFTbITS .BYTE $80,$10,$20,$04,$01
SHIFTmASK .BYTE $01,$01,$02,$04,$08
SHIFTDECODE = *
JSR SCANcAPS
.IF COMPUTER-64
LDY #4
.ELSE
LDY #3
.IFE
- LDX SHIFTrOWS,Y
LDA SCANtABLE,X
AND SHIFTbITS,Y
BEQ +
LDA SHIFTmASK,Y
ORA SHIFTvALUE
STA SHIFTvALUE
LDA SHIFTbITS,Y
EOR #$FF
AND SCANtABLE,X
STA SCANtABLE,X
+ DEY
BPL -
RTS
SCANcAPS = *
- LDA CAPSpORT
CMP CAPSpORT
BNE -
EOR #$FF
AND #$40
LSR
LSR
STA SHIFTvALUE
RTS
KEYDECODE = *
LDX #ROLLOVER-1
LDA #$FF
- STA NEWkEYS,X
DEX
BPL -
LDY #0
STY NEWPOS
LDX #0
STX KEYCODE
DECODEnEXTrOW = *
LDA SCANtABLE,X
BEQ DECODEcONTINUE
LDY KEYCODE
- LSR
BCC ++
PHA
STX XSAVE
LDX NEWPOS
CPX #ROLLOVER
BCS +
TYA
STA NEWkEYS,X
INC NEWPOS
+ LDX XSAVE
PLA
+ INY
CMP #$00
BNE -
DECODEcONTINUE = *
CLC
LDA KEYCODE
ADC #8
STA KEYCODE
INX
CPX #SCANROWS
BCC DECODEnEXTrOW
RTS
KEYORDER = *
;** REMOVE OLD KEYS NO LONGER HELD
LDY #0
NEXTrEMOVE = *
LDA PREVkEYS,Y
CMP #$FF
BEQ ++
LDX #ROLLOVER-1
- CMP NEWkEYS,X
BEQ +
DEX
BPL -
TYA
TAX
- LDA PREVkEYS+1,X
STA PREVkEYS+0,X
INX
CPX #ROLLOVER-1
BCC -
LDA #$FF
STA PREVkEYS+ROLLOVER-1
STA IGNOREkEYS
+ INY
CPY #ROLLOVER
BCC NEXTrEMOVE
;** INSERT NEW KEY AT FRONT
+ LDY #0
NEXTiNSERT = *
LDA NEWkEYS,Y
CMP #$FF
BEQ ++
LDX #ROLLOVER-1
- CMP PREVkEYS,X
BEQ +
DEX
BPL -
PHA
LDX #ROLLOVER-2
- LDA PREVkEYS+0,X
STA PREVkEYS+1,X
DEX
BPL -
LDA #0
STA IGNOREkEYS
PLA
STA PREVkEYS+0
LDY #ROLLOVER
+ INY
CPY #ROLLOVER
BCC NEXTiNSERT
+ RTS
CHECKjOYSTICK = *
LDA #$FF
STA PA
STA PK
- LDA PB
CMP PB
BNE -
CMP #$FF
RTS
SCANtABLE .BUF SCANROWS
NEWkEYS .BUF ROLLOVER
IGNOREkEYS .BUF 1
PREVkEYS .BUF ROLLOVER+2
SCROLLfREEZE .BYTE $00
DELAYcOUNTDOWN .BYTE $00
REPEATcOUNTDOWN .BYTE $00
INTERPkEY = * ;( KEYCODE )
LDA KEYCODE
;** NOSCROLL
.IF COMPUTER-64
CMP #87 ;NOSCROLL
BNE INTERPcAPS
.ELSE
CMP #63 ;RUN/STOP
BNE INTERPcAPS
LDA SHIFTvALUE
AND #%1111
CMP #4 ;CONTROL
BNE INTERPcAPS
LDA KEYCODE
.IFE
CMP PREVkEYCODE
BEQ +
STA PREVkEYCODE
LDA SCROLLfREEZE
EOR #$FF
STA SCROLLfREEZE
+ RTS
INTERPcAPS = *
.IF COMPUTER-64
.ELSE
LDA KEYCODE
CMP #63 ;RUN/STOP
BNE INTERPsHIFTS
LDA SHIFTvALUE
AND #%1111
CMP #2 ;COMMODORE
BNE INTERPsHIFTS
LDA KEYCODE
CMP PREVkEYCODE
BEQ +
STA PREVkEYCODE
LDA CAPSpORT
EOR #$40
STA CAPSpORT
+ RTS
.IFE
INTERPsHIFTS = *
LDA SHIFTvALUE
AND #%00011111
CMP #%00010000
BNE +
LDA #5
JMP HANDLEkEY ;CAPS
+ AND #%1111
TAX
LDA SHIFTpRIvEC,X
JMP HANDLEkEY
SHIFTpRIvEC = *
.IF COMPUTER-64
; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
.BYTE $00,$01,$02,$02,$03,$03,$03,$03,$04,$04,$04,$04,$04,$04,$04,$04
.ELSE
.BYTE $00,$01,$02,$02,$03,$03,$04,$04,$04,$04,$04,$04,$04,$04,$04,$04
.IFE
HANDLEkEY = * ;( KEYCODE, .a=SHIFTtABLEnUM )
ASL
TAX
LDA KEYCODE
CMP PREVkEYCODE
BEQ HANDLErEPEAT
JMP HANDLEoRIGkEY
HANDLErEPEAT = *
STX XSAVE
LDA DELAYcOUNTDOWN
BEQ +
DEC DELAYcOUNTDOWN
BEQ ++
RTS
+ DEC REPEATcOUNTDOWN
BEQ +
- RTS
+ LDA #3
STA REPEATcOUNTDOWN
LDA KEYBUFcOUNT
BNE -
LDX XSAVE
JMP +
HANDLEoRIGkEY = * ;( .x=SHIFTtABoFF )
LDA #20
STA DELAYcOUNTDOWN
LDA #0
STA SCROLLfREEZE
+ LDA CONkEYMAPiNDIRECT+0,X
STA KEYMAPpTR+0
LDA CONkEYMAPiNDIRECT+1,X
STA KEYMAPpTR+1
LDY KEYCODE
STY PREVkEYCODE
LDA (KEYMAPpTR),Y
BNE STOREkEY
RTS
KEYBUFhEAD .BYTE 0
KEYBUFtAIL .BYTE 0
KEYBUFcOUNT .BYTE 0
KEYBUFsIZE = 16 ;POWER OF 2
KEYBUFdATA .BUF KEYBUFsIZE
STOREkEY = * ;( .a=CHAR )
LDX KEYBUFcOUNT
CPX #KEYBUFsIZE
BCC +
;XX RING BELL
RTS
+ LDX KEYBUFtAIL
STA KEYBUFdATA,X
INC KEYBUFtAIL
LDA KEYBUFtAIL
AND #KEYBUFsIZE-1
STA KEYBUFtAIL
INC KEYBUFcOUNT
RTS
;*** GETKEY( ) : .a=KEYcHAR
CONgETKEY = *
- LDA KEYBUFcOUNT
BEQ -
SEI
LDX KEYBUFhEAD
DEC KEYBUFcOUNT
INC KEYBUFhEAD
LDA KEYBUFhEAD
AND #KEYBUFsIZE-1
STA KEYBUFhEAD
LDA KEYBUFdATA,X
CLI
RTS
;*** STOPKEY( ) : .cc=NOTpRESSED
ACEsTOPkEY = *
SEI
LDA STOPkEYrOW
CMP #$80
BEQ +
- CLC
CLI
RTS
+ LDA SHIFTvALUE
AND #$0F
BNE -
LDA #0
STA KEYBUFcOUNT
STA KEYBUFhEAD
STA KEYBUFtAIL
STA SCROLLfREEZE
LDA #ACEeRRsTOPPED
STA ERRNO
SEC
CLI
RTS
CONkEYMAPiNDIRECT = *
.WORD CONkEYMAPnORMAL,CONkEYMAPsHIFT,CONkEYMAPcOMMODORE,CONkEYMAPcONTROL
.WORD CONkEYMAPaLTERNATE,CONkEYMAPcAPS
CONkEYMAPnORMAL = *
.BYTE $14,$0D,$1D,$88,$85,$86,$87,$11,$0033,$57,$41,$34,$5A,$53,$45,$01
.BYTE $35,$52,$44,$36,$43,$46,$54,$58,$0037,$59,$47,$38,$42,$48,$55,$56
.BYTE $39,$49,$4A,$30,$4D,$4B,$4F,$4E,$002B,$50,$4C,$2D,$2E,$3A,$40,$2C
.BYTE $5C,$2A,$3B,$13,$01,$3D,$5E,$2F,$0031,$5F,$04,$32,$20,$02,$51,$03
.BYTE $84,$38,$35,$09,$32,$34,$37,$31,$001B,$2B,$2D,$0A,$0D,$36,$39,$33
.BYTE $08,$30,$2E,$91,$11,$9D,$1D,$00
CONkEYMAPsHIFT = *
.BYTE $94,$8D,$9D,$8C,$89,$8A,$8B,$91,$0023,$D7,$C1,$24,$DA,$D3,$C5,$01
.BYTE $25,$D2,$C4,$26,$C3,$C6,$D4,$D8,$0027,$D9,$C7,$28,$C2,$C8,$D5,$D6
.BYTE $29,$C9,$CA,$30,$CD,$CB,$CF,$CE,$00DB,$D0,$CC,$DD,$3E,$5B,$BA,$3C
.BYTE $A9,$C0,$5D,$93,$01,$3D,$DE,$3F,$0021,$5F,$04,$22,$A0,$02,$D1,$83
.BYTE $84,$38,$35,$18,$32,$34,$37,$31,$001B,$2B,$2D,$0A,$8D,$36,$39,$33
.BYTE $08,$30,$2E,$91,$11,$9D,$1D,$00
CONkEYMAPcOMMODORE = *
.BYTE $94,$8D,$9D,$8C,$89,$8A,$8B,$91,$0096,$B3,$B0,$97,$AD,$AE,$B1,$01
.BYTE $98,$B2,$AC,$99,$BC,$BB,$A3,$BD,$009A,$B7,$A5,$9B,$BF,$B4,$B8,$BE
.BYTE $29,$A2,$B5,$30,$A7,$A1,$B9,$AA,$00A6,$AF,$B6,$DC,$3E,$5B,$A4,$3C
.BYTE $A8,$DF,$5D,$93,$01,$3D,$DE,$3F,$0081,$5F,$04,$95,$A0,$02,$AB,$03
.BYTE $84,$38,$35,$18,$32,$34,$37,$31,$001B,$2B,$2D,$0A,$8D,$36,$39,$33
.BYTE $08,$30,$2E,$91,$11,$9D,$1D,$00
CONkEYMAPcONTROL = *
.BYTE $00,$00,$00,$00,$00,$00,$00,$00,$001C,$17,$01,$9F,$1A,$13,$05,$00
.BYTE $9C,$12,$04,$1E,$03,$06,$14,$18,$001F,$19,$07,$9E,$02,$08,$15,$16
.BYTE $12,$09,$0A,$92,$0D,$0B,$0F,$0E,$00FF,$10,$0C,$00,$00,$1B,$00,$00
.BYTE $1C,$00,$1D,$00,$00,$1F,$1E,$00,$0090,$06,$00,$05,$00,$00,$11,$00
.BYTE $84,$38,$35,$18,$32,$34,$37,$31,$001B,$2B,$2D,$0A,$8D,$36,$39,$33
.BYTE $08,$30,$2E,$91,$11,$9D,$1D,$00
CONkEYMAPaLTERNATE = *
.BYTE $14,$0D,$1D,$88,$85,$86,$87,$11,$0033,$57,$41,$34,$5A,$53,$45,$01
.BYTE $35,$E2,$44,$36,$43,$46,$54,$58,$0037,$59,$47,$38,$42,$48,$55,$56
.BYTE $39,$49,$4A,$30,$4D,$4B,$4F,$4E,$002B,$50,$4C,$2D,$2E,$3A,$40,$2C
.BYTE $5C,$2A,$3B,$13,$01,$3D,$5E,$2F,$0031,$5F,$04,$32,$20,$02,$51,$03
.BYTE $84,$38,$35,$09,$32,$34,$37,$31,$001B,$2B,$2D,$0A,$0D,$36,$39,$33
.BYTE $08,$30,$2E,$91,$11,$9D,$1D,$00
CONkEYMAPcAPS = *
.BYTE $14,$0D,$1D,$88,$85,$86,$87,$11,$0033,$D7,$C1,$34,$DA,$D3,$C5,$01
.BYTE $35,$D2,$C4,$36,$C3,$C6,$D4,$D8,$0037,$D9,$C7,$38,$C2,$C8,$D5,$D6
.BYTE $39,$C9,$CA,$30,$CD,$CB,$CF,$CE,$002B,$D0,$CC,$2D,$2E,$3A,$40,$2C
.BYTE $5C,$2A,$3B,$13,$01,$3D,$5E,$2F,$0031,$5F,$04,$32,$20,$02,$D1,$03
.BYTE $84,$38,$35,$09,$32,$34,$37,$31,$001B,$2B,$2D,$0A,$0D,$36,$39,$33
.BYTE $08,$30,$2E,$91,$11,$9D,$1D,$00
CONsScOUNTDOWN .BYTE 1
CONjIFSpERmIN = 3600+255
CONsSmINUTE .WORD CONjIFSpERmIN
CONsSmAX .BYTE 1
CONsSaCTIVE .BYTE $00
CONsCREENsAVE = *
LDA CONsScOUNTDOWN
BNE +
- RTS
+ DEC CONsSmINUTE+0
BNE -
DEC CONsSmINUTE+1
BNE -
LDA #<CONjIFSpERmIN
LDY #>CONjIFSpERmIN
STA CONsSmINUTE+0
STY CONsSmINUTE+1
DEC CONsScOUNTDOWN
BNE -
JSR VDCsCREENsAVE
JSR VICsCREENsAVE
LDA #$FF
STA CONsSaCTIVE
RTS
CONsCREENuNSAVE = *
LDA CONsSmAX
STA CONsScOUNTDOWN
LDA #<CONjIFSpERmIN
LDY #>CONjIFSpERmIN
STA CONsSmINUTE+0
STY CONsSmINUTE+1
LDA CONsSaCTIVE
BNE +
RTS
+ JSR VDCsCREENuNSAVE
JSR VICsCREENuNSAVE
LDA #$00
STA CONsSaCTIVE
RTS
;THE END + BLANK LINE
ACEHEAD.S
139
;===ACE SYSTEM INTERFACE DECLARATIONS===
ZP = $FA ;(4)
ZW = $FE ;(2)
SYSWORK = $80 ;(16)
ACEcALLbASE = $2800
REBOOT = ACEcALLbASE+0 ;( )
OPEN = ACEcALLbASE+3 ;( (ZP)=nAME, .a=mODE ) : .a=fCB
CLOSE = ACEcALLbASE+6 ;( .a=fCB )
READ = ACEcALLbASE+9 ;( .x=fCB, (ZP)=bUF, .ay=lEN ) : .ay=lEN, .z
WRITE = ACEcALLbASE+12 ;( .x=fCB, (ZP)=bUF, .ay=lEN )
ISDIR = ACEcALLbASE+15 ;( (ZP)=nAME ) : .a=dEV, .x=ISdISK, .y=ISdIR
BLOAD = ACEcALLbASE+18 ;( (ZP)=nAME, .ay=aDDRESS ) : .ay=eND+1
CMDOPEN = ACEcALLbASE+21 ;( (ZP)=dEVnAME ) : .a=fCB
CMDCLOSE = ACEcALLbASE+24 ;( .a=fCB )
CMDSEND = ACEcALLbASE+27 ;( .x=fCB, .ay=cMD )
CMDSTATUS = ACEcALLbASE+30 ;( .x=fCB, .ay=sTATbUFpTR ) : sTATbUF, .a=STATUScODE
DIROPEN = ACEcALLbASE+33 ;( (ZP)=dEVnAME ) : .a=fCB
DIRCLOSE = ACEcALLbASE+36 ;( .a=fCB )
DIRREAD = ACEcALLbASE+39 ;( .x=fCB ) : DIRENTbUFFER, .z=EOF
FCBSWAP = ACEcALLbASE+42 ;( .x=fCB1, .y=fCB2 )
REMOVE = ACEcALLbASE+45 ;( (ZP)=nAME )
RENAME = ACEcALLbASE+48 ;( (ZP)=nAME, (ZW)=nEWnAME )
CHDIR = ACEcALLbASE+51 ;( (ZP)=dIRnAME )
ZPLOAD = ACEcALLbASE+54 ;( [ZP]=sOURCE, .x=zPdEST, .y=lENGTH )
ZPSTORE = ACEcALLbASE+57 ;( .x=zPsOURCE, [ZP]=dEST, .y=lENGTH )
FETCH = ACEcALLbASE+60 ;( [ZP]=fARsOURCE, (ZW)=rAM0dEST, .ay=lENGTH )
STASH = ACEcALLbASE+63 ;( (ZW)=rAM0sOURCE, [ZP]=fARdEST, .ay=LENGTH )
PAGEALLOC = ACEcALLbASE+66 ;( .a=pAGEcOUNT ) : [ZP]=fARpOINTER
PAGEFREE = ACEcALLbASE+69 ;( [ZP]=fARpOINTER, .a=pAGEcOUNT )
EXIT = ACEcALLbASE+72 ;( .a=EXITcODE, .x=EXITbUFdATAlEN )
DEVINFO = ACEcALLbASE+75 ;( .x=fCB ) : .a=dEVtYPE, .x=cOLS, .y=rOWS
STOPKEY = ACEcALLbASE+78 ;( ) : .cc=NOTpRESSED
UTOA = ACEcALLbASE+81 ;( $0+x=VALUE32, ($80)=BUF, .a=MINlEN ) :BUF, .y=LEN
GETDATE = ACEcALLbASE+84 ;( (.ay)=DATEsTRING ) : DATEsTRING
SETDATE = ACEcALLbASE+87 ;( (.ay)=DATEsTRING )
EXEC = ACEcALLbASE+90 ;( (.ay)=ADDR ) : .a=EXITcODE
CDHOME = ACEcALLbASE+93 ;( )
WINMAX = ACEcALLbASE+96 ;( )
WINCLS = ACEcALLbASE+99 ;( .a=CHAR, .y=COLOR, .x=CHAR:$80/ATTR:$40 FLAGS )
WINSET = ACEcALLbASE+102 ;( .y=SCRrOW, .x=SCRcOL, .a=ROWS, SYSWORK=COLS )
WINSIZE = ACEcALLbASE+105 ;( ) : ^^^,(SW+2)=ADDR,(SW+4)=ROWINC,(SW+6)=SAVESIZE
WINLOAD = ACEcALLbASE+108 ;( [ZP]=FARaDDR )
WINSAVE = ACEcALLbASE+111 ;( [ZP]=FARaDDR, .a=ATTRfLAG )
WINPUT = ACEcALLbASE+114 ;( (SW+0)=ADDR,(ZW)=CHARpTR,.a=ATTR,.y=COLOR,.x=LEN
; SW+4=FILLcHAR, SW+5=FIELDlEN )
WINCOLOR = ACEcALLbASE+117 ;( .x=SCREEN, .y=BORDER, .a=WHICH ) : .x=SCR, .y=BOR
WINPOS = ACEcALLbASE+120 ;( .a=ROW, .x=COL ) : (SW+0)=ADDR
WINCURSOR = ACEcALLbASE+123 ;( (SW+0)=ADDR, .y=COLOR, .a=$FF:ON/$00:OFF)
WINSCROLL = ACEcALLbASE+126 ;( .a=$80/$40:CHAR/ATTR+$01:UP/DOWN, .x=ROWS,
; SW+4=FILLcHAR, .y=FILLcOLOR )
GETKEY = ACEcALLbASE+129 ;( ) : .a=KEY
CONCOLOR = ACEcALLbASE+132 ;( .a=WHICH, .x=CHAR, .y=CURSOR ) : .x=CHAR,.y=CURSR
CONPALETTE = ACEcALLbASE+135 ;( ) : SW+0...SW+7=PALETTE [8 COLORS]
CONSCREEN = ACEcALLbASE+138 ;( .a=COLS )
CONPOS = ACEcALLbASE+141 ;( .a=ROW, .x=COL ) ;**not implemented
ACEsTATUSbASE = $F00
ERRNO = ACEsTATUSbASE+0 ;(1)
ACEid = ACEsTATUSbASE+2 ;(2)
ACEaRGC = ACEsTATUSbASE+4 ;(2)
ACEaRGV = ACEsTATUSbASE+6 ;(2)
ACEsTACKpTR = ACEsTATUSbASE+8 ;(2)
ACEfRAMEpTR = ACEsTATUSbASE+10 ;(2)
ACEsTACKtOP = ACEsTATUSbASE+12 ;(2)
ACEsHELLpATH = ACEsTATUSbASE+14 ;(2)
ACEsHELLaLIAS = ACEsTATUSbASE+16 ;(2)
ACEcURRENTdEVICE = ACEsTATUSbASE+18 ;(1)
ACEcURdIRnAME = ACEsTATUSbASE+20 ;(2)
ACEdATE = ACEsTATUSbASE+22 ;(4) yyyy:mm:dd
ACEdow = ACEsTATUSbASE+26 ;(1) 1-7,1=sUN
ACEpROCESSid = ACEsTATUSbASE+27 ;(1)
ACEfREEmEMORY = ACEsTATUSbASE+28 ;(4)
ACEtOTALmEMORY = ACEsTATUSbASE+32 ;(4)
ACEiNTERNALbANKS = ACEsTATUSbASE+36 ;(1/2WASTED)
ACEiNTERNALcUR = ACEsTATUSbASE+39 ;(1)
ACErAM0fREEMAP = ACEsTATUSbASE+40 ;(2)
ACErAM1fREEMAP = ACEsTATUSbASE+42 ;(1)
ACErEUsTART = ACEsTATUSbASE+43 ;(1)
ACErEUbANKS = ACEsTATUSbASE+44 ;(1)
ACErEUcUR = ACEsTATUSbASE+45 ;(1)
ACErAMLINKsTART = ACEsTATUSbASE+46 ;(2)
ACErAMLINKbANKS = ACEsTATUSbASE+48 ;(1)
ACErAMLINKcUR = ACEsTATUSbASE+49 ;(1)
ACErAMLINKrEUsTART = ACEsTATUSbASE+50 ;(2)
ACErAMLINKrEUbANKS = ACEsTATUSbASE+52 ;(1)
ACErAMLINKrEUcUR = ACEsTATUSbASE+53 ;(1)
ACEvIRTUALpARTS = ACEsTATUSbASE+54 ;(1)
ACErESTOREsTACK = ACEsTATUSbASE+55 ;(1)
;ACEdIRENTbUFFER = ACEsTATUSbASE+92
ACEjUNK = ACEsTATUSbASE+92
ACEdIRENTbYTES = ACEjUNK+0 ;(4)
ACEdIRENTdATE = ACEjUNK+4 ;(8) = yy:yy:mm:dd:hh:mm:ss:tw
ACEdIRENTtYPE = ACEjUNK+12 ;(4)
ACEdIRENTfLAGS = ACEjUNK+16 ;(1) = DRWX*-MT
ACEdIRENTnAMElEN = ACEjUNK+17 ;(1)
ACEdIRENTnAME = ACEjUNK+18 ;(17)
ACEdIRENTlENGTH = 35
ACEsHELLaDDRESS = $1300
ACEaPPaDDRESS = $6000
ACEid1 = "C"
ACEid2 = "b"
ACEid3 = 9
ACEmEMnULL = $00
ACEmEMreu = $01
ACEmEMiNTERNAL = $02
ACEmEMrlreu = $06
ACEmEMrl = $07
ACEmEMtYPES = 8
ACEeRRsTOPPED = 0
ACEeRRtOOmANYfILES = 1
ACEeRRfILEoPEN = 2
ACEeRRfILEnOToPEN = 3
ACEeRRfILEnOTfOUND = 4
ACEeRRdEVICEnOTpRESENT = 5
ACEeRRfILEnOTiNPUT = 6
ACEeRRfILEnOToUTPUT = 7
ACEeRRmISSINGfILENAME = 8
ACEeRRiLLEGALdEVICE = 9
ACEeRRwRITEpROTECT = 26
ACEeRRfILEeXISTS = 63
ACEeRRfILEtYPEmISMATCH = 64
ACEeRRnOcHANNEL = 70
ACEeRRiNSUFFICIENTmEMORY = 128
ACEeRRoPENdIRECTORY = 129
ACEeRRnOfREEfCBS = 130
ACEeRRdISKoNLYoPERATION = 131
ACEeRRnULLpOINTER = 132
ACEeRRiNVALIDfREEpARMS = 133
ACEeRRfREEnOToWNED = 134
STDIN = 0
STDOUT = 1
STDERR = 2
;===END OF ACE INTERFACE DECLARATIONS===
ACEMEM.S
1053
;ace-128/64 KERNEL dYNAMIC mEMORY ROUTINE BY cRAIG bRUCE.
;*** MEMORY ROUTINES ***
COMcODEbUFFER = $200
TEMP1 = $8F
BKsELECTrAM0 = $FF01
.IF COMPUTER-64
BKrAM0 = $3F
.ELSE
BKrAM0 = $70
.IFE
REU = $DF00
RL = $DE00
RLrEGS = $E0A9
RLeXEC = $FE1E
;***STARTUP
INITmEMORY = *
.IF COMPUTER-64
LDX #0
- LDA COMcODEsTART,X
STA COMcODEbUFFER,X
INX
CPX #COMcODEeND-COMcODEsTART
BCC -
.IFE
RTS
SHUTDOWNmEMORY = *
.IF COMPUTER-64
LDX #0
LDA #0
- STA COMcODEbUFFER,X
INX
CPX #COMcODEeND-COMcODEsTART
BNE -
.IFE
RTS
INTERNbANKcONFIGS = *
.IF COMPUTER-64
.BYTE $3F,$7F,$BF,$FF,$BF,$FF,$BF,$FF,$3F
.ELSE
.BYTE $70,$70
.IFE
INTERNbANKgROUPS = *
.IF COMPUTER-64
.BYTE $04,$04,$04,$04,$14,$14,$24,$24,$04
.IFE
;***COMMON CODE
COMcODEsTART = *
COMzPlOAD = *
STY TEMP1
LDY ZP+2
.IF COMPUTER-64
LDA INTERNbANKgROUPS,Y
STA $D506
.ELSE
PHP
SEI
.IFE
LDA INTERNbANKcONFIGS,Y
STA BKsELECT
LDY #0
- LDA (ZP),Y
STA 0,X
INX
INY
CPY TEMP1
BCC -
LDA #BKace
STA BKsELECT
.IF COMPUTER-64
.ELSE
PLP
.IFE
CLC
RTS
COMzPsTORE = *
STY TEMP1
LDY ZP+2
.IF COMPUTER-64
LDA INTERNbANKgROUPS,Y
STA $D506
.ELSE
PHP
SEI
.IFE
LDA INTERNbANKcONFIGS,Y
STA BKsELECT
LDY #0
- LDA 0,X
STA (ZP),Y
INX
INY
CPY TEMP1
BCC -
LDA #BKace
STA BKsELECT
.IF COMPUTER-64
.ELSE
PLP
.IFE
CLC
RTS
COMcOPYtOrAM0 = *
LDX ZP+2
.IF COMPUTER-64
LDA INTERNbANKgROUPS,X
STA $D506
LDA INTERNbANKcONFIGS,X
TAX
.ELSE
PHP
SEI
LDA INTERNbANKcONFIGS,X
STA BKsELECT
.IFE
DEY
BEQ +
.IF COMPUTER-64
- STX BKsELECT
LDA (ZP),Y
STA BKsELECTrAM0
.ELSE
- LDA (ZP),Y
.IFE
STA (ZW),Y
DEY
BNE -
.IF COMPUTER-64
+ STX BKsELECT
LDA (ZP),Y
STA BKsELECTrAM0
.ELSE
+ LDA (ZP),Y
.IFE
STA (ZW),Y
LDA #BKace
STA BKsELECT
.IF COMPUTER-64
.ELSE
PLP
.IFE
CLC
RTS
COMcOPYfROMrAM0 = *
LDX ZP+2
.IF COMPUTER-64
LDA INTERNbANKgROUPS,X
STA $D506
LDA INTERNbANKcONFIGS,X
TAX
.ELSE
PHP
SEI
LDA INTERNbANKcONFIGS,X
STA BKsELECT
.IFE
DEY
BEQ +
.IF COMPUTER-64
- STA BKsELECTrAM0
LDA (ZW),Y
STX BKsELECT
.ELSE
- LDA (ZW),Y
.IFE
STA (ZP),Y
DEY
BNE -
.IF COMPUTER-64
+ STA BKsELECTrAM0
LDA (ZW),Y
STX BKsELECT
.ELSE
+ LDA (ZW),Y
.IFE
STA (ZP),Y
LDA #BKace
STA BKsELECT
.IF COMPUTER-64
.ELSE
PLP
.IFE
CLC
RTS
COMcODEeND = *
;*** ZPLOAD( [ZP]=sOURCE, .x=zPdEST, .y=lENGTH ) : .cs=ERR, [ZP]PRESERVED
ACEzPlOAD = *
LDA ZP+3
BEQ NULLpTReRROR
CMP #$02
BCC +
BNE ZPlOADrl
.IF COMPUTER-64
JMP COMzPlOAD-COMcODEsTART+COMcODEbUFFER
.ELSE
JMP COMzPlOAD
.IFE
+ STY REU+7
LDY #$91
ZEROpAGErEUoP = *
LDA ZP+2
STA REU+6
STX REU+2
LDA #0
STA REU+3
STA REU+8
LDA ZP
STA REU+4
LDA ZP+1
STA REU+5
.IF COMPUTER-64
LDA VIC+$30
LDX #$00
STX VIC+$30
.IFE
STY REU+1
.IF COMPUTER-64
STA VIC+$30
.IFE
CLC
RTS
NULLpTReRROR = *
LDA #ACEeRRnULLpOINTER
STA ERRNO
SEC
RTS
ZPlOADrl = *
LDA #$91
ZEROpAGErLoP = * ;( .a=OPCODE, .x=ZPADDR, .y=LEN, [ZP]=FARpTR )
STA RAMLINKoPCODE
LDA #0
STY RAMLINKlENGTH
STA RAMLINKlENGTH+1
STX RAMLINKnEARpTR
STA RAMLINKnEARpTR+1
JMP RAMLINKoP
RAMLINKoPCODE .BUF 1
RAMLINKlENGTH .BUF 2
RAMLINKnEARpTR .BUF 2
RAMLINKoP = * ;( [ZP]=FARpTR, RAMLINKnEARpTR, RAMLINKlENGTH, RAMLINKoPCODE )
JSR RLrEGS
LDA RAMLINKoPCODE
STA RL+1
LDA RAMLINKnEARpTR
LDY RAMLINKnEARpTR+1
STA RL+2
STY RL+3
LDX #0
LDA ZP+3
CMP #ACEmEMrl
BEQ +
LDX #4
+ LDA ZP
STA RL+4
CLC
LDA ACErAMLINKsTART,X
ADC ZP+1
STA RL+5
LDA ACErAMLINKsTART+1,X
ADC ZP+2
STA RL+6
LDA RAMLINKlENGTH
LDY RAMLINKlENGTH+1
STA RL+7
STY RL+8
LDA #0
STA RL+10
STA RL+16
JSR RLeXEC
CLC
RTS
;*** ZPSTORE( .x=zPsOURCE, [ZP]=dEST, .y=lENGTH ) : .cs=ERR, [ZP]PRESERVED
ACEzPsTORE = *
LDA ZP+3
BEQ NULLpTReRROR
CMP #$02
BCC +
BNE ZPsTORErl
.IF COMPUTER-64
JMP COMzPsTORE-COMcODEsTART+COMcODEbUFFER
.ELSE
JMP COMzPsTORE
.IFE
+ STY REU+7
LDY #$90
JMP ZEROpAGErEUoP
ZPsTORErl = *
LDA #$90
JMP ZEROpAGErLoP
;*** FETCH( [ZP]=fARsOURCE, (ZW)=rAM0dEST, .ay=lENGTH )
FETCHlENGTH .BUF 2
FETCHsAVEsOURCE .BUF 1
FETCHsAVEdEST .BUF 1
ACEfETCH = *
LDX ZP+3
BEQ FETCHnULLpTReRROR
CPX #ACEmEMiNTERNAL
BCS +
LDX #$91
JMP DOrEU
+ BNE FETCHrl
CPY #0
BNE FETCHlONG
TAY
BNE FETCHpAGE
CLC
RTS
FETCHnULLpTReRROR = *
JMP NULLpTReRROR
FETCHpAGE = * ;( [ZP]=FROM, (ZW)=TO, .y=LEN(0=256) )
LDX ZP+2
CPX #0
BEQ +
JMP COMcOPYtOrAM0-COMcODEsTART+COMcODEbUFFER
.IF COMPUTER-64
+ STX BKsELECTrAM0
.ELSE
+ PHP
SEI
LDX #BKrAM0
STX BKsELECT
.IFE
DEY
BEQ +
- LDA (ZP),Y
STA (ZW),Y
DEY
BNE -
+ LDA (ZP),Y
STA (ZW),Y
LDA #BKace
STA BKsELECT
.IF COMPUTER-64
.ELSE
PLP
.IFE
CLC
RTS
FETCHlONG = *
STA FETCHlENGTH
STY FETCHlENGTH+1
LDA ZP+1
STA FETCHsAVEsOURCE
LDA ZW+1
STA FETCHsAVEdEST
LDA FETCHlENGTH+1
BEQ FETCHlONGeXIT
- LDY #0
JSR FETCHpAGE
INC ZP+1
INC ZW+1
DEC FETCHlENGTH+1
BNE -
FETCHlONGeXIT = *
LDY FETCHlENGTH
BEQ +
JSR FETCHpAGE
+ LDA FETCHsAVEsOURCE
STA ZP+1
LDA FETCHsAVEdEST
STA ZW+1
CLC
RTS
FETCHrl = *
LDX #$91
LARGErLoP = *
STX RAMLINKoPCODE
STA RAMLINKlENGTH
STY RAMLINKlENGTH+1
LDA ZW
LDY ZW+1
STA RAMLINKnEARpTR
STY RAMLINKnEARpTR+1
JMP RAMLINKoP
;*** STASH( (ZW)=rAM0sOURCE, [ZP]=fARdEST, .ay=LENGTH )
STASHlENGTH .BUF 2
STASHsAVEsOURCE .BUF 1
STASHsAVEdEST .BUF 1
ACEsTASH = *
LDX ZP+3
BEQ STASHnULLpTReRROR
CPX #ACEmEMiNTERNAL
BCS +
LDX #$90
JMP DOrEU
+ BNE STASHrl
CPY #0
BNE STASHlONG
TAY
BNE STASHpAGE
CLC
RTS
STASHnULLpTReRROR = *
JMP NULLpTReRROR
STASHpAGE = *
LDX ZP+2
CPX #0
BEQ +
JMP COMcOPYfROMrAM0-COMcODEsTART+COMcODEbUFFER
.IF COMPUTER-64
+ STX BKsELECTrAM0
.ELSE
+ PHP
SEI
LDX #BKrAM0
STX BKsELECT
.IFE
DEY
BEQ +
- LDA (ZW),Y
STA (ZP),Y
DEY
BNE -
+ LDA (ZW),Y
STA (ZP),Y
LDA #BKace
STA BKsELECT
.IF COMPUTER-64
.ELSE
PLP
.IFE
CLC
RTS
STASHlONG = *
STA STASHlENGTH
STY STASHlENGTH+1
LDA ZW+1
STA STASHsAVEsOURCE
LDA ZP+1
STA STASHsAVEdEST
LDA STASHlENGTH+1
BEQ STASHlONGeXIT
- LDY #0
JSR STASHpAGE
INC ZP+1
INC ZW+1
DEC STASHlENGTH+1
BNE -
STASHlONGeXIT = *
LDY STASHlENGTH
BEQ +
LDX ZP+2
JSR STASHpAGE
+ LDA STASHsAVEsOURCE
STA ZW+1
LDA STASHsAVEdEST
STA ZP+1
CLC
RTS
STASHrl = *
LDX #$90
JMP LARGErLoP
;*** RAM0 LOAD/STORE(.x) EXPANSION MEMORY [ZP] <- -> (ZW) FOR .ay BYTES
DOrEU = *
STA REU+7
STY REU+8
LDA ZW
LDY ZW+1
STA REU+2
STY REU+3
LDA ZP
LDY ZP+1
STA REU+4
STY REU+5
LDA ZP+2
STA REU+6
LDY VIC+$30
LDA #0
STA VIC+$30
STX REU+1
STY VIC+$30
CLC
RTS
;*** MEMORY ALLOCATION ROUTINES
FREEMAPbANK .BUF 2
FREEMAPdIRTY .BUF 1
FREEMAPpAGE .BUF 1
SEARCHmINfAIL .BUF 8
INITmEMORYaLLOC = *
LDX #0
LDY #0
STX FREEMAPpAGE
STX FREEMAPdIRTY
- LDA RAM0fREEmAP,X
STA FREEMAP,X
BNE +
INY
+ INX
BNE -
LDA #0
LDY #ACEmEMiNTERNAL
STA FREEMAPbANK+0
STY FREEMAPbANK+1
LDA #$00
LDX #0
- STA SEARCHmINfAIL,X
INX
CPX #8
BCC -
CLC
RTS
FREEMAPbANKsAVE .BUF 2
GETfREEMAP = * ;( .ay=BANK )
CMP FREEMAPbANK+0
BNE +
CPY FREEMAPbANK+1
BNE +
RTS
;** SAVE OLD FREEMAP
+ STA FREEMAPbANKsAVE+0
STY FREEMAPbANKsAVE+1
LDA FREEMAPdIRTY
BEQ +
LDA FREEMAPbANK+0
LDY FREEMAPbANK+1
JSR LOCATEbANKfREEMAP
JSR SETzWfREEMAP
JSR STASH
;** LOAD NEW FREEMAP
+ LDA FREEMAPbANKsAVE+0
LDY FREEMAPbANKsAVE+1
STA FREEMAPbANK+0
STY FREEMAPbANK+1
JSR LOCATEbANKfREEMAP
JSR SETzWfREEMAP
JSR FETCH
LDA #0
STA FREEMAPdIRTY
STA FREEMAPpAGE
RTS
SETzWfREEMAP = * ;() : .ay=#256
LDA #<FREEMAP
LDY #>FREEMAP
STA ZW+0
STY ZW+1
LDA #<256
LDY #>256
RTS
LOCATEbANKfREEMAP = * ;( .ay=BANK ) : [ZP]
STA ZP+2
STY ZP+3
LDA #<$FF00
LDX #>$FF00
STA ZP+0
STX ZP+1
CPY #ACEmEMiNTERNAL
BEQ +
RTS
+ LDA ZP+2
BNE +
;** RAM0
LDA ACErAM0fREEMAP+0
LDY ACErAM0fREEMAP+1
- STA ZP+0
STY ZP+1
RTS
+ CMP #1
BNE +
;** RAM1
LDA #0
LDY ACErAM1fREEMAP
JMP -
;** EXP.INT.RAM
+ LDA #<$0400
LDY #>$0400
JMP -
SEARCHtYPEsTART .BUF 1
SEARCHtYPEsTOP .BUF 1
SEARCHsIZE .BUF 1
SEARCHtYPEjMP = *
.WORD 0,PAGEaLLOCreu,PAGEaLLOCiNTERNAL,0,0,0,PAGEaLLOCrlreu,PAGEaLLOCrl
ACEpAGEaLLOC = * ;( .a=PAGES, .x=STtYPE, .y=ENDtYPE ) : [ZP]=FARpTR
STA SEARCHsIZE
CMP #0
BNE +
JSR PAGEaLLOCfAIL
CLC
RTS
+ CPX #ACEmEMreu
BCS +
LDX #ACEmEMreu
+ CPY #ACEmEMrl
BEQ +
BCC +
LDY #ACEmEMrl
+ STX SEARCHtYPEsTART
STY SEARCHtYPEsTOP
- LDA SEARCHtYPEsTART
CMP SEARCHtYPEsTOP
BEQ +
BCS PAGEaLLOCfAIL
+ LDX SEARCHtYPEsTART
LDA SEARCHmINfAIL,X
BEQ +
CMP SEARCHsIZE
BEQ PAGEaLLOCnEXT
BCC PAGEaLLOCnEXT
+ LDA SEARCHtYPEsTART
ASL
TAX
LDA SEARCHtYPEjMP+0,X
STA ZP+0
LDA SEARCHtYPEjMP+1,X
BEQ PAGEaLLOCnEXT
STA ZP+1
JSR PAGEaLLOCdISPATCH
BCC ++
LDX SEARCHtYPEsTART
LDA SEARCHmINfAIL,X
BEQ +
CMP SEARCHsIZE
BCC PAGEaLLOCnEXT
+ LDA SEARCHsIZE
STA SEARCHmINfAIL,X
PAGEaLLOCnEXT = *
INC SEARCHtYPEsTART
JMP -
+ LDX ZP+3
LDA ZP+2
CMP MINuSEDbANK,X
BCS +
STA MINuSEDbANK,X
+ CMP MAXuSEDbANK,X
BCC +
STA MAXuSEDbANK,X
+ CLC
RTS
PAGEaLLOCdISPATCH = *
JMP (ZP)
PAGEaLLOCfAIL = *
LDA #ACEeRRiNSUFFICIENTmEMORY
STA ERRNO
LDA #$00
STA ZP+0
STA ZP+1
STA ZP+2
STA ZP+3
SEC
RTS
PAGEaLLOCreu = * ;( ) : .x=PAGE, FREEMAPbANK, .cc=OK
LDA #ACEmEMreu
STA ZP+3
LDA ACErEUcUR
LDX ACErEUsTART
LDY ACErEUbANKS
JSR SEARCHtYPE
STA ACErEUcUR
RTS
PAGEaLLOCiNTERNAL = *
LDA #ACEmEMiNTERNAL
STA ZP+3
LDA ACEiNTERNALcUR
LDX #$00
LDY ACEiNTERNALbANKS
JSR SEARCHtYPE
STA ACEiNTERNALcUR
RTS
PAGEaLLOCrlreu = *
LDA #ACEmEMrlreu
STA ZP+3
LDA ACErAMLINKrEUcUR
LDX ACErEUsTART
LDY ACErAMLINKrEUbANKS
JSR SEARCHtYPE
STA ACErAMLINKrEUcUR
RTS
PAGEaLLOCrl = *
LDA #ACEmEMrl
STA ZP+3
LDA ACErAMLINKcUR
LDX #$00
LDY ACErAMLINKbANKS
JSR SEARCHtYPE
STA ACErAMLINKcUR
RTS
SEARCHcURRENT .BUF 1
SEARCHsTART .BUF 1
SEARCHsTOP .BUF 1
SEARCHtYPE = * ;( ZP+3=TYPE, .a=CURRENT, .x=START, .y=STOP ):[ZP],.cc,.a=CUR,.x
STA SEARCHcURRENT
STA ZP+2
STX SEARCHsTART
STY SEARCHsTOP
CPX SEARCHsTOP
BCC +
RTS
/ LDA ZP+2
LDY ZP+3
JSR GETfREEMAP
LDY SEARCHsIZE
JSR SEARCHfREEMAP
BCS +
LDA #0
STA ZP+0
STX ZP+1
LDA ZP+2
CLC
RTS
+ INC ZP+2
LDA ZP+2
CMP SEARCHsTOP
BCC +
LDA SEARCHsTART
STA ZP+2
+ LDA ZP+2
CMP SEARCHcURRENT
BNE -
SEC
RTS
SEARCHpAGES .BUF 1
NEWMAX .BUF 1
SEARCHfREEMAP = * ;( .y=PAGES ) : .cc=FOUND, .x=FIRSTpG
;** FIRST FREE
LDX FREEMAPpAGE
LDA FREEMAP,X
BEQ +
- INX
BEQ FREEMAPfULL
LDA FREEMAP,X
BNE -
STX FREEMAPpAGE
JMP +
FREEMAPfULL = *
SEC
RTS
;** SEARCH
+ STY SEARCHpAGES
CPX #0
BEQ +
DEX
- LDY SEARCHpAGES
- INX
BEQ FREEMAPfULL
+ LDA FREEMAP,X
BNE --
DEY
BNE -
;** ALLOCATE
STX NEWMAX
LDY SEARCHpAGES
LDA ACEpROCESSid
- STA FREEMAP,X
DEX
DEY
BNE -
INX
CPX FREEMAPpAGE
BNE +
LDY NEWMAX
INY
STY FREEMAPpAGE
+ LDA #$FF
STA FREEMAPdIRTY
SEC
LDA ACEfREEmEMORY+1
SBC SEARCHpAGES
STA ACEfREEmEMORY+1
LDA ACEfREEmEMORY+2
SBC #0
STA ACEfREEmEMORY+2
BCS +
DEC ACEfREEmEMORY+3
+ CLC
RTS
FREEpAGE .BUF 1
FREElEN .BUF 1
ACEpAGEfREE = * ;( [ZP]=fARpTR, .a=PAGES )
STA FREElEN
CMP #0
BNE +
JMP PAGEfREEeXIT
+ LDA ZP+3
CMP #ACEmEMnULL
BNE +
LDA #ACEeRRnULLpOINTER
JMP PAGEfREEfAIL
+ LDA #ACEeRRiNVALIDfREEpARMS
LDX ZP+0
BNE PAGEfREEfAIL
LDA ZP+1
STA FREEpAGE
CLC
ADC FREElEN
BCC +
LDA #ACEeRRiNVALIDfREEpARMS
JMP PAGEfREEfAIL
+ LDA ZP+2
LDY ZP+3
JSR GETfREEMAP
LDA ACEpROCESSid
LDX FREEpAGE
LDY FREElEN
- CMP FREEMAP,X
BEQ +
LDA #ACEeRRfREEnOToWNED
JMP PAGEfREEfAIL
+ INX
DEY
BNE -
LDX FREEpAGE
LDY FREElEN
LDA #$00
- STA FREEMAP,X
INX
DEY
BNE -
LDA #$FF
STA FREEMAPdIRTY
LDA FREEpAGE
CMP FREEMAPpAGE
BCS +
STA FREEMAPpAGE
;** ASSUME 2*(MIN-1)+LEN+1 NEW MIN
+ LDX ZP+3
LDA SEARCHmINfAIL,X
BEQ ++
SEC
SBC #1
ASL
BCS +
SEC
ADC FREElEN
BCC ++
+ LDA #0
+ STA SEARCHmINfAIL,X
CLC
LDA ACEfREEmEMORY+1
ADC FREElEN
STA ACEfREEmEMORY+1
BCC PAGEfREEeXIT
INC ACEfREEmEMORY+2
BNE PAGEfREEeXIT
INC ACEfREEmEMORY+3
PAGEfREEeXIT = *
CLC
RTS
PAGEfREEfAIL = *
STA ERRNO
SEC
RTS
RECLAIMmEMtYPE .BUF 1
RECLAIMpROCmEMORY = *
LDX #0
- LDA MINuSEDbANK,X
CMP MAXuSEDbANK,X
BEQ +
BCS ++
+ STX RECLAIMmEMtYPE
LDA MINuSEDbANK,X
LDY MAXuSEDbANK,X
TAX
LDA RECLAIMmEMtYPE
JSR RECLAIMpROCtYPE
LDX RECLAIMmEMtYPE
+ INX
CPX #ACEmEMtYPES
BCC -
RTS
RPbANK .BUF 2
RPeND .BUF 1
RECLAIMpROCtYPE = * ;( .a=TYPE, .x=STARTbANK, .y=ENDbANK )
STX RPbANK+0
STA RPbANK+1
STY RPeND
- LDA RPbANK+0
LDY RPbANK+1
CMP RPeND
BEQ +
BCS ++
+ JSR GETfREEMAP
JSR RECLAIMpROCfREEMAP
INC RPbANK+0
BNE -
+ RTS
RECLAIMpROCfREEMAP = * ;( ) : .y=PAGESrEMOVED
LDY #0
LDX #0
LDA ACEpROCESSid
JMP +
- INX
BEQ ++
+ CMP FREEMAP,X
BNE -
LDA #0
STA FREEMAP,X
INY
LDA ACEpROCESSid
JMP -
+ CPY #0
BEQ +
LDA #0
STA FREEMAPpAGE
LDX FREEMAPbANK+1
STA SEARCHmINfAIL,X
LDA #$FF
STA FREEMAPdIRTY
TYA
CLC
ADC ACEfREEmEMORY+1
STA ACEfREEmEMORY+1
BCC +
INC ACEfREEmEMORY+2
BNE +
INC ACEfREEmEMORY+3
+ CLC
RTS
MINuSEDbANK .BUF ACEmEMtYPES
MAXuSEDbANK .BUF ACEmEMtYPES ;PLUS 1
CLEARmEMORYiNFO = *
LDX #ACEmEMtYPES-1
- LDA #$FF
STA MINuSEDbANK,X
LDA #$00
STA MAXuSEDbANK,X
DEX
BPL -
RTS
;*** PROCESS PRIMITIVES
EXITcODEsAVE .BUF 1
ACEeXEC = *
STA SYSWORK+0
STY SYSWORK+1
;XX PUSH OLD MEMORY INFO
JSR CLEARmEMORYiNFO
LDA ACErESTOREsTACK
PHA
TSX
STX ACErESTOREsTACK
INC ACEpROCESSid
JSR ACEeNTER
LDA #0
ACErEeNTER = *
STA EXITcODEsAVE
PLA
STA ACErESTOREsTACK
JSR RECLAIMoPENfILES
JSR RECLAIMpROCmEMORY
JSR CLEARmEMORYiNFO ;** MAKE RESTORE MEMORY INFO
DEC ACEpROCESSid
LDA EXITcODEsAVE
CLC
RTS
ACEeNTER = *
JMP (SYSWORK)
ACEeXIT = *
LDX ACErESTOREsTACK
TXS
JMP ACErEeNTER
RECLAIMsAVE .BUF 1
RECLAIMoPENfILES = *
JSR KERNELcLRCHN
LDX #0
- LDA LFTABLE,X
CMP #LFNULL
BEQ +
LDA PIDTABLE,X
CMP ACEpROCESSid
BNE +
STX RECLAIMsAVE
TXA
JSR CLOSE
LDX RECLAIMsAVE
+ INX
CPX #FCBcOUNT
BCC -
RTS
ACEVDC.S
578
;ace-128/64 KERNEL vdc 80-COLUMN SCREEN DRIVER CODE
;VDC MEMORY LAYOUT: $0000=CHAR,$1000=COLOR,$2000=CHARSET,$3000=ALTCHARSET
VDCcOLORaDDR = $1000
VDCcHARSETaDDR = $2000
VDCsELECT = $D600
VDCsTATUS = $D600
VDCdATA = $D601
VDCrOWiNC = 80
VDCwINsCRx .BUF 1
VDCwINsCRy .BUF 1
VDCwINrOWS .BUF 1
VDCwINcOLS .BUF 1
VDCwINsTART .BUF 2
VDCwINsAVEsZ .BUF 2
VDCiNIT = *
;** CHARSET
JSR VDCfILLmODE
JSR VDClOADcHARSET
;** INIT SCREEN COLORS
NOP
;** MOVE ATTRIBUTES
LDA #<VDCcOLORaDDR
LDY #>VDCcOLORaDDR
LDX #$14
JSR VDCwRITE16
;** CURSOR HEIGHT
LDA #8
LDX #$0B
JSR VDCwRITE
;** WINDOW PARAMETERS
JSR VDCwINMAX
RTS
VDCsHUTDOWN = *
;** RESTORE CHARSET
LDA #<$D000
LDY #>$D000
STA SYSWORK+0
STY SYSWORK+1
LDA #<$2000
LDY #>$2000
STA SYSWORK+2
STY SYSWORK+3
SEI
LDA #BKcHARSET
STA BKsELECT
LDX #8
LDY #0
- LDA (SYSWORK+0),Y
STA (SYSWORK+2),Y
INY
BNE -
INC SYSWORK+1
INC SYSWORK+3
DEX
BNE -
LDA #BKace
STA BKsELECT
CLI
JSR VDClOADcHARSET
;** RESTORE ATTRIBUTES
LDA #<$800
LDY #>$800
LDX #$14
JSR VDCwRITE16
;** RESTORE CURSOR HEIGHT
LDA #7
LDX #$0B
JSR VDCwRITE
RTS
CHSsOURCE = SYSWORK+0
CHScOUNT = SYSWORK+2
VDClOADcHARSET = *
LDA #<VDCcHARSETaDDR
LDY #>VDCcHARSETaDDR
JSR VDCaDDRwRITE16
LDA #<$2000
LDY #>$2000
STA CHSsOURCE+0
STY CHSsOURCE+1
LDX #0
STX CHScOUNT
CHARlOOP = *
LDA #$1F
STA VDCsELECT
LDY #0
- LDA (CHSsOURCE),Y
- BIT VDCsTATUS
BPL -
STA VDCdATA
INY
CPY #8
BCC --
LDA #$00
JSR VDCrAMwRITE
LDX #$1E
LDA #7
JSR VDCwRITE
CLC
LDA CHSsOURCE+0
ADC #8
STA CHSsOURCE+0
BCC +
INC CHSsOURCE+1
+ INC CHScOUNT
BNE CHARlOOP
RTS
VDCfILLmODE = * ;( )
LDX #$18
JSR VDCrEAD
AND #$7F
JSR VDCwRITE
RTS
VDCcOPYmODE = * ;( )
LDX #$18
JSR VDCrEAD
ORA #$80
JSR VDCwRITE
RTS
VDCrAMwRITE = * ;( .a=VALUE )
LDX #$1F
VDCwRITE = * ;( .x=REGISTER, .a=VALUE )
STX VDCsELECT
- BIT VDCsTATUS
BPL -
STA VDCdATA
RTS
VDCaDDRwRITE16 = * ;( .ay=VALUE )
LDX #$12
VDCwRITE16 = * ;( .x=HIrEGISTER, .ay=VALUE )
STX VDCsELECT
- BIT VDCsTATUS
BPL -
STY VDCdATA
INX
STX VDCsELECT
- BIT VDCsTATUS
BPL -
STA VDCdATA
RTS
VDCrAMrEAD = * ;( ) : .a=VALUE
LDX #$1F
VDCrEAD = * ;( .x=REGISTER ) : .a=VALUE
STX VDCsELECT
- BIT VDCsTATUS
BPL -
LDA VDCdATA
RTS
VDCwINMAX = *
LDA #0
STA VDCwINsCRx
STA VDCwINsCRy
STA VDCwINsTART+0
STA VDCwINsTART+1
LDA #25
LDX #80
STA VDCwINrOWS
STX VDCwINcOLS
LDA #<2000+2000+16
LDY #>2000+2000+16
STA VDCwINsAVEsZ+0
STY VDCwINsAVEsZ+1
CLC
RTS
VDCcLScOLOR .BUF 1
VDCwINCLS = *
STA VDCfILLbYTE
STY VDCcLScOLOR
STX SYSWORK+2
BIT SYSWORK+2
BPL +
JSR VDCwINCLSsETUP
JSR VDCrOWfILL
+ BIT SYSWORK+2
BVC +
JSR VDCwINCLSsETUP
LDA VDCcLScOLOR
STA VDCfILLbYTE
JSR VDCaDDcOLOR
JSR VDCrOWfILL
+ RTS
VDCwINCLSsETUP = *
LDA VDCwINsTART+0
LDY VDCwINsTART+1
STA SYSWORK+0
STY SYSWORK+1
LDA VDCwINrOWS
STA VDCfILLrOWS
RTS
VDCaDDcOLOR = *
CLC
LDA SYSWORK+1
ADC #>VDCcOLORaDDR
STA SYSWORK+1
RTS
VDCfILLbYTE .BUF 1
VDCfILLrOWS .BUF 1
VDCfILLcOLS .BUF 1
VDCrOWfILL = * ;( (SW+0)=ADDR++, VDCfILLbYTE, VDCfILLrOWS-- )
LDA VDCwINcOLS
STA VDCfILLcOLS
LDA VDCfILLrOWS
BNE +
RTS
/ JSR VDCcOLfILL
CLC
LDA SYSWORK+0
ADC #VDCrOWiNC
STA SYSWORK+0
BCC +
INC SYSWORK+1
+ DEC VDCfILLrOWS
BNE -
RTS
VDCcOLfILL = * ;( (SW+0)=ADDR, VDCfILLbYTE, VDCfILLcOLS )
LDA SYSWORK+0
LDY SYSWORK+1
JSR VDCaDDRwRITE16
VDCcOLfILLgOTaDDR = *
LDA VDCfILLcOLS
BEQ +
LDA VDCfILLbYTE
JSR VDCrAMwRITE
LDX VDCfILLcOLS
DEX
BEQ +
TXA
LDX #$1E
JSR VDCwRITE
+ RTS
VDCwINSET = *
RTS
VDCwINSIZE = *
LDA VDCwINcOLS
STA SYSWORK
LDA VDCwINsTART+0
LDY VDCwINsTART+1
STA SYSWORK+2
STY SYSWORK+3
LDA #<VDCrOWiNC
LDY #>VDCrOWiNC
STA SYSWORK+4
STY SYSWORK+5
LDA VDCwINsAVEsZ+0
LDY VDCwINsAVEsZ+1
STA SYSWORK+6
STY SYSWORK+7
LDX VDCwINsCRx
LDY VDCwINsCRy
LDA VDCwINrOWS
CLC
RTS
VDCwINLOAD = *
RTS
VDCwINSAVE = *
RTS
VDCpUTwHICH .BUF 1
VDCpUTcOLOR .BUF 1
VDCpUTlEN .BUF 1
VDCwINPUT = *
STA VDCpUTwHICH
STY VDCfILLbYTE
STX VDCpUTlEN
BIT VDCpUTwHICH
BPL VDCwINPUTcOLOR
LDA SYSWORK+0
LDY SYSWORK+1
JSR VDCaDDRwRITE16
LDY #0
CPY VDCpUTlEN
BEQ +
LDA #$1F
STA VDCsELECT
- LDA (ZW),Y
- BIT VDCsTATUS
BPL -
STA VDCdATA
INY
CPY VDCpUTlEN
BCC --
+ SEC
LDA SYSWORK+5
SBC VDCpUTlEN
BEQ VDCwINPUTcOLOR
TAY
LDA SYSWORK+4
JSR VDCrAMwRITE
DEY
BEQ VDCwINPUTcOLOR
TYA
LDX #$1E
JSR VDCwRITE
VDCwINPUTcOLOR = *
BIT VDCpUTwHICH
BVS +
RTS
+ LDA SYSWORK+1
CLC
ADC #>VDCcOLORaDDR
TAY
LDA SYSWORK+0
JSR VDCaDDRwRITE16
LDA SYSWORK+5
STA VDCfILLcOLS
JSR VDCcOLfILLgOTaDDR
RTS
VDCwINCOLOR = *
PHP
SEI
CMP #128
BCC +
TXA
LDX #$1A
JSR VDCwRITE
+ AND #64
BEQ +
TYA
NOP
+ LDX #$1A
JSR VDCrEAD
AND #$0F
TAX
TAY
PLP
RTS
VDCwINPOScOL .BUF 1
VDCwINPOS = *
STA SYSWORK+0 ;(0 TO 50)
STX VDCwINPOScOL
LDX #0
STX SYSWORK+1
ASL
ASL
ADC SYSWORK+0
ASL
ROL SYSWORK+1
ASL
ROL SYSWORK+1
ASL
ROL SYSWORK+1
ASL
ROL SYSWORK+1
CLC
ADC VDCwINPOScOL
BCC +
INC SYSWORK+1
+ CLC
ADC VDCwINsTART+0
STA SYSWORK+0
LDA SYSWORK+1
ADC VDCwINsTART+1
STA SYSWORK+1
RTS
VDCcURSORsAVE .BUF 1
VDCcURSORcOLOR .BUF 1
VDCwINCURSOR = *
CMP #0
BEQ VDCcURSORoFF
STY VDCcURSORcOLOR
LDA SYSWORK+0
LDY SYSWORK+1
LDX #$0E
JSR VDCwRITE16
LDX #$0A
JSR VDCrEAD
AND #$1F
ORA #$60
JSR VDCwRITE
JSR VDCsETcOLORaDDR
JSR VDCrAMrEAD
STA VDCcURSORsAVE
JSR VDCsETcOLORaDDR
LDA VDCcURSORsAVE
AND #$F0
ORA VDCcURSORcOLOR
JSR VDCrAMwRITE
RTS
VDCcURSORoFF = *
LDX #$0E
JSR VDCwRITE16
LDX #$0A
JSR VDCrEAD
AND #$1F
ORA #$20
JSR VDCwRITE
JSR VDCsETcOLORaDDR
LDA VDCcURSORsAVE
JSR VDCrAMwRITE
RTS
VDCsETcOLORaDDR = * ;( (SW+0)=ADDR )
CLC
LDA SYSWORK+1
ADC #>VDCcOLORaDDR
TAY
LDA SYSWORK+0
JMP VDCaDDRwRITE16
VDCsCROLLdEST = SYSWORK+0
VDCsCROLLsOURCE = SYSWORK+2
VDCsCROLLrOWS .BUF 1
VDCsCROLLeXTRA .BUF 1
VDCwINSCROLL = *
STA SYSWORK+5
STY VDCcLScOLOR
STX VDCsCROLLeXTRA
CPX #0
BNE +
RTS
+ CPX VDCwINrOWS
BCC +
LDA SYSWORK+4
LDX SYSWORK+5
LDY VDCcLScOLOR
JSR VDCwINCLS
RTS
+ BIT SYSWORK+5
BPL +
JSR VDCsCROLLuPsETUP
JSR VDCrOWsCROLLuP
LDA #" "
JSR VDCdOsCROLLeXTRA
+ BIT SYSWORK+5
BVC +
JSR VDCsCROLLuPsETUP
JSR VDCsCROLLaDDcOLOR
JSR VDCrOWsCROLLuP
LDA VDCcLScOLOR
JSR VDCdOsCROLLeXTRA
+ RTS
VDCsCROLLuPsETUP = *
LDA VDCsCROLLeXTRA
LDX #0
JSR VDCwINPOS
LDA SYSWORK+0
LDY SYSWORK+1
STA VDCsCROLLsOURCE+0
STY VDCsCROLLsOURCE+1
LDA VDCwINsTART+0
LDY VDCwINsTART+1
STA VDCsCROLLdEST+0
STY VDCsCROLLdEST+1
SEC
LDA VDCwINrOWS
SBC VDCsCROLLeXTRA
STA VDCsCROLLrOWS
RTS
VDCsCROLLaDDcOLOR = *
CLC
LDA SYSWORK+1
ADC #>VDCcOLORaDDR
STA SYSWORK+1
LDA SYSWORK+3
ADC #>VDCcOLORaDDR
STA SYSWORK+3
RTS
VDCdOsCROLLeXTRA = * ;( .a=FILLbYTE, (SW+0)=ADDR )
STA VDCfILLbYTE
LDA VDCsCROLLeXTRA
STA VDCfILLrOWS
LDA VDCwINcOLS
STA VDCfILLcOLS
JSR VDCrOWfILL
RTS
VDCrOWsCROLLuP = * ;( VDCsCROLLsOURCE++, VDCsCROLLdEST++, VDCsCROLLrOWS-- )
LDA VDCsCROLLrOWS
BNE +
RTS
+ JSR VDCcOPYmODE
- JSR VDCcOLsCROLL
CLC
LDA VDCsCROLLsOURCE+0
ADC #VDCrOWiNC
STA VDCsCROLLsOURCE+0
BCC +
INC VDCsCROLLsOURCE+1
+ CLC
LDA VDCsCROLLdEST+0
ADC #VDCrOWiNC
STA VDCsCROLLdEST+0
BCC +
INC VDCsCROLLdEST+1
+ DEC VDCsCROLLrOWS
BNE -
JSR VDCfILLmODE
RTS
VDCcOLsCROLL = * ;( VDCsCROLLsOURCE, VDCsCROLLdEST, VDCwINcOLS )
LDA VDCsCROLLdEST+0
LDY VDCsCROLLdEST+1
JSR VDCaDDRwRITE16
LDA VDCsCROLLsOURCE+0
LDY VDCsCROLLsOURCE+1
LDX #$20
JSR VDCwRITE16
LDA VDCwINcOLS
LDX #$1E
JSR VDCwRITE
RTS
;*** INTERRUPT SCREEN-SAVER CODE: **POTENTIAL VDC-ACCESS CONFLICTS**
VDCsScOLOR .BUF 1
VDCsSrOWS .BUF 1
VDCsSaCTIVE .BYTE $00
VDCsCREENsAVE = *
RTS
LDX #$06
JSR VDCrEAD
STA VDCsSrOWS
LDX #$1A
JSR VDCrEAD
STA VDCsScOLOR
LDA #$FF
STA VDCsSaCTIVE
LDX #$06
LDA #0
JSR VDCwRITE
LDX #$1A
LDA #$E0
JSR VDCwRITE
RTS
VDCsCREENuNSAVE = *
RTS
LDX #$06
LDA VDCsSrOWS
JSR VDCwRITE
LDX #$1A
LDA VDCsScOLOR
JSR VDCwRITE
LDA #$00
STA VDCsSaCTIVE
RTS
;THE END + BLANK LINE
ACEVIC.S
487
;ace-128/64 KERNEL vic 40-COLUMN SCREEN DRIVER CODE
VICcHARaDDR = $0400
VICcOLORoFF = $D400
VICrOWiNC = 40
VIC = $D000
VICwINsCRx .BUF 1
VICwINsCRy .BUF 1
VICwINrOWS .BUF 1
VICwINcOLS .BUF 1
VICwINsTART .BUF 2
VICwINsAVEsZ .BUF 2
VICiNIT = *
LDA #$18
STA VIC+$18
;** WINDOW PARAMETERS
JSR VICwINMAX
RTS
VICsHUTDOWN = *
RTS
VICwINMAX = *
LDA #0
STA VICwINsCRx
STA VICwINsCRy
LDA #<VICcHARaDDR
LDY #>VICcHARaDDR
STA VICwINsTART+0
STY VICwINsTART+1
LDA #25
LDX #40
STA VICwINrOWS
STX VICwINcOLS
LDA #<1000+1000+16
LDY #>1000+1000+16
STA VICwINsAVEsZ+0
STY VICwINsAVEsZ+1
CLC
RTS
RGBI2VICtAB .BYTE 0,12,6,14,5,13,11,3,2,10,8,4,9,7,15,1
RGBI2VIC = *
AND #$0F
TAX
LDA RGBI2VICtAB,X
RTS
VIC2RGBItAB .BYTE 0,15,8,7,11,4,2,13,10,12,9,6,1,5,3,14
VIC2RGBI = *
AND #$0F
TAX
LDA VIC2RGBItAB,X
RTS
VICcLScOLOR .BUF 1
VICwINCLS = *
STA VICfILLbYTE
STY VICcLScOLOR
STX SYSWORK+2
BIT SYSWORK+2
BPL +
JSR VICwINCLSsETUP
JSR VICrOWfILL
+ BIT SYSWORK+2
BVC +
JSR VICwINCLSsETUP
LDA VICcLScOLOR
JSR RGBI2VIC
STA VICfILLbYTE
JSR VICaDDcOLOR
JSR VICrOWfILL
+ RTS
VICwINCLSsETUP = *
LDA VICwINsTART+0
LDY VICwINsTART+1
STA SYSWORK+0
STY SYSWORK+1
LDA VICwINrOWS
STA VICfILLrOWS
RTS
VICaDDcOLOR = *
CLC
LDA SYSWORK+1
ADC #>VICcOLORoFF
STA SYSWORK+1
RTS
VICfILLbYTE .BUF 1
VICfILLrOWS .BUF 1
VICfILLcOLS .BUF 1
VICrOWfILL = * ;( (SW+0)=ADDR++, VICfILLbYTE, VICfILLrOWS-- )
LDA VICwINcOLS
STA VICfILLcOLS
LDA VICfILLrOWS
BNE +
RTS
/ JSR VICcOLfILL
CLC
LDA SYSWORK+0
ADC #VICrOWiNC
STA SYSWORK+0
BCC +
INC SYSWORK+1
+ DEC VICfILLrOWS
BNE -
RTS
VICcOLfILL = * ;( (SW+0)=ADDR, VICfILLbYTE, VICfILLcOLS )
LDY VICfILLcOLS
BEQ +
DEY
LDA VICfILLbYTE
- STA (SYSWORK),Y
DEY
BPL -
+ RTS
VICwINSET = *
RTS
VICwINSIZE = *
LDA VICwINcOLS
STA SYSWORK
LDA VICwINsTART+0
LDY VICwINsTART+1
STA SYSWORK+2
STY SYSWORK+3
LDA #<VICrOWiNC
LDY #>VICrOWiNC
STA SYSWORK+4
STY SYSWORK+5
LDA VICwINsAVEsZ+0
LDY VICwINsAVEsZ+1
STA SYSWORK+6
STY SYSWORK+7
LDX VICwINsCRx
LDY VICwINsCRy
LDA VICwINrOWS
CLC
RTS
VICwINLOAD = *
RTS
VICwINSAVE = *
RTS
VICpUTwHICH .BUF 1
VICpUTlEN .BUF 1
VICwINPUT = *
STA VICpUTwHICH
STY VICfILLbYTE
STX VICpUTlEN
BIT VICpUTwHICH
BPL VICwINPUTcOLOR
LDY #0
CPY VICpUTlEN
BEQ +
- LDA (ZW),Y
STA (SYSWORK+0),Y
INY
CPY VICpUTlEN
BCC -
+ CPY SYSWORK+5
BEQ VICwINPUTcOLOR
LDA SYSWORK+4
- STA (SYSWORK+0),Y
INY
CPY SYSWORK+5
BCC -
VICwINPUTcOLOR = *
BIT VICpUTwHICH
BVS +
RTS
+ CLC
LDA SYSWORK+1
ADC #>VICcOLORoFF
STA SYSWORK+1
LDA VICfILLbYTE
JSR RGBI2VIC
LDY SYSWORK+5
DEY
BMI +
- STA (SYSWORK),Y
DEY
BPL -
+ SEC
LDA SYSWORK+1
SBC #>VICcOLORoFF
STA SYSWORK+1
RTS
VICwINCOLOR = *
PHP
SEI
CMP #128
BCC +
PHA
TXA
JSR RGBI2VIC
STA VIC+$21
PLA
+ AND #64
BEQ VICwINCOLOReXIT
TYA
JSR RGBI2VIC
BIT VICsSaCTIVE
BMI +
STA VIC+$20
JMP VICwINCOLOReXIT
+ STA VICsScOLOR
VICwINCOLOReXIT = *
BIT VICsSaCTIVE
BMI +
LDA VIC+$20
JMP ++
+ LDA VICsScOLOR
+ JSR VIC2RGBI
TAY
LDA VIC+$21
JSR VIC2RGBI
TAX
PLP
RTS
VICwINPOScOL .BUF 1
VICwINPOS = *
STA SYSWORK+0 ;(0 TO 24)
STX VICwINPOScOL
LDX #0
STX SYSWORK+1
ASL
ASL
ADC SYSWORK+0
ASL
ROL SYSWORK+1
ASL
ROL SYSWORK+1
ASL
ROL SYSWORK+1
CLC
ADC VICwINPOScOL
BCC +
INC SYSWORK+1
+ CLC
ADC VICwINsTART+0
STA SYSWORK+0
LDA SYSWORK+1
ADC VICwINsTART+1
STA SYSWORK+1
RTS
VICcURSORcHAR .BUF 1
VICcURSORcOLOR .BUF 1
VICcURSORfLASH .BYTE $00 ;$00=INACTIVE, $FF=ACTIVE
VICcURSORcOUNTDOWN .BUF 1
VICcURSORaDDR .BUF 2
VICwINCURSOR = *
CMP #0
BEQ VICcURSORoFF
TYA
JSR RGBI2VIC
STA VICcURSORcOLOR
LDA SYSWORK+0
LDY SYSWORK+1
STA VICcURSORaDDR+0
STY VICcURSORaDDR+1
LDY #0
LDA (SYSWORK+0),Y
STA VICcURSORcHAR
JSR VICsETcOLORaDDR
LDY #0
LDA (SYSWORK+0),Y
TAX
LDA VICcURSORcOLOR
STA (SYSWORK+0),Y
STX VICcURSORcOLOR
JSR VICuNSETcOLORaDDR
LDA #1
STA VICcURSORcOUNTDOWN
JSR VICiRQcURSOR
LDA #$FF
STA VICcURSORfLASH
RTS
VICcURSORoFF = *
LDA #$00
STA VICcURSORfLASH
LDY #0
LDA VICcURSORcHAR
STA (SYSWORK+0),Y
JSR VICsETcOLORaDDR
LDA VICcURSORcOLOR
STA (SYSWORK+0),Y
JSR VICuNSETcOLORaDDR
RTS
VICiRQwORK = $A0
VICiRQcURSOR = *
BIT VICcURSORfLASH
BMI +
- RTS
+ DEC VICcURSORcOUNTDOWN
BNE -
LDA #20
STA VICcURSORcOUNTDOWN
LDA VICcURSORaDDR+0
LDY VICcURSORaDDR+1
STA VICiRQwORK+0
STY VICiRQwORK+1
LDY #0
LDA (VICiRQwORK),Y
PHA
SEC
SBC #32
AND #%01000000
BNE +
PLA
SEC
SBC #64
JMP ++
+ PLA
CLC
ADC #64
+ STA (VICiRQwORK),Y
RTS
VICsETcOLORaDDR = * ;( (SW+0)=ADDR ) : (SW+0)=COLORaDDR
CLC
LDA SYSWORK+1
ADC #>VICcOLORoFF
STA SYSWORK+1
RTS
VICuNSETcOLORaDDR = * ;( (SW+0)=COLORaDDR ) : (SW+0)=ADDR
SEC
LDA SYSWORK+1
SBC #>VICcOLORoFF
STA SYSWORK+1
RTS
VICsCROLLdEST = SYSWORK+0
VICsCROLLsOURCE = SYSWORK+2
VICsCROLLrOWS .BUF 1
VICsCROLLeXTRA .BUF 1
VICwINSCROLL = *
STA SYSWORK+5
STY VICcLScOLOR
STX VICsCROLLeXTRA
CPX #0
BNE +
RTS
+ CPX VICwINrOWS
BCC +
LDA SYSWORK+4
LDX SYSWORK+5
LDY VICcLScOLOR
JSR VICwINCLS
RTS
+ BIT SYSWORK+5
BPL +
JSR VICsCROLLuPsETUP
JSR VICrOWsCROLLuP
LDA #" "
JSR VICdOsCROLLeXTRA
+ BIT SYSWORK+5
BVC +
JSR VICsCROLLuPsETUP
JSR VICsCROLLaDDcOLOR
JSR VICrOWsCROLLuP
LDA VICcLScOLOR
JSR VICdOsCROLLeXTRA
+ RTS
VICsCROLLuPsETUP = *
LDA VICsCROLLeXTRA
LDX #0
JSR VICwINPOS
LDA SYSWORK+0
LDY SYSWORK+1
STA VICsCROLLsOURCE+0
STY VICsCROLLsOURCE+1
LDA VICwINsTART+0
LDY VICwINsTART+1
STA VICsCROLLdEST+0
STY VICsCROLLdEST+1
SEC
LDA VICwINrOWS
SBC VICsCROLLeXTRA
STA VICsCROLLrOWS
RTS
VICsCROLLaDDcOLOR = *
CLC
LDA SYSWORK+1
ADC #>VICcOLORoFF
STA SYSWORK+1
LDA SYSWORK+3
ADC #>VICcOLORoFF
STA SYSWORK+3
RTS
VICdOsCROLLeXTRA = * ;( .a=FILLbYTE, (SW+0)=ADDR )
STA VICfILLbYTE
LDA VICsCROLLeXTRA
STA VICfILLrOWS
LDA VICwINcOLS
STA VICfILLcOLS
JSR VICrOWfILL
RTS
VICrOWsCROLLuP = * ;( VICsCROLLsOURCE++, VICsCROLLdEST++, VICsCROLLrOWS-- )
LDA VICsCROLLrOWS
BNE +
RTS
+ NOP
- JSR VICcOLsCROLL
CLC
LDA VICsCROLLsOURCE+0
ADC #VICrOWiNC
STA VICsCROLLsOURCE+0
BCC +
INC VICsCROLLsOURCE+1
+ CLC
LDA VICsCROLLdEST+0
ADC #VICrOWiNC
STA VICsCROLLdEST+0
BCC +
INC VICsCROLLdEST+1
+ DEC VICsCROLLrOWS
BNE -
RTS
VICcOLsCROLL = * ;( VICsCROLLsOURCE, VICsCROLLdEST, VICwINcOLS )
LDY VICwINcOLS
DEY
- LDA (VICsCROLLsOURCE),Y
STA (VICsCROLLdEST),Y
DEY
BPL -
RTS
;*** INTERRUPT SCREEN-SAVE STUFF
VICsScOLOR .BUF 1
VICsSrOWS .BUF 1
VICsSaCTIVE .BYTE $00
VICsCREENsAVE = *
LDA VIC+$11
STA VICsSrOWS
LDA VIC+$20
STA VICsScOLOR
LDA #$FF
STA VICsSaCTIVE
LDA #$00
STA VIC+$11
LDA #$00
STA VIC+$20
RTS
VICsCREENuNSAVE = *
LDA VICsSrOWS
STA VIC+$11
LDA VICsScOLOR
STA VIC+$20
LDA #$00
STA VICsSaCTIVE
RTS
;THE END + BLANK LINE
ACEVIC80.S
37
;ace-64 KERNEL vic BITMAPPED 80-COLUMN SCREEN DRIVER CODE
VDCiNIT = *
RTS
VDCsHUTDOWN = *
RTS
VDCwINMAX = *
RTS
VDCwINCLS = *
RTS
VDCwINSET = *
RTS
VDCwINSIZE = *
RTS
VDCwINLOAD = *
RTS
VDCwINSAVE = *
RTS
VDCwINPUT = *
RTS
VDCwINCOLOR = *
RTS
VDCwINPOS = *
RTS
VDCwINCURSOR = *
RTS
VDCwINSCROLL = *
RTS
VDCsCREENsAVE = *
RTS
VDCsCREENuNSAVE = *
RTS
;THE END + BLANK LINE
AS.S
630
;*** AS PROGRAM
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:AS"
JMP ASMAIN
.ASC "Cb"
;*** GLOBAL DECLARATIONS
LIBWORK = $60
CHRcr = $0D
CHRqUOTE = $22
CHRtAB = $09
CHReof = $00
;******** STANDARD LIBRARY ********
PUTS = *
LDX #STDOUT
FPUTS = *
STA ZP
STY ZP+1
LDY #$FF
- INY
LDA (ZP),Y
BNE -
TYA
LDY #0
JMP WRITE
PUTCHAR = *
LDX #STDOUT
PUTC = *
STA PUTCbUFFER
LDA #<PUTCbUFFER
LDY #>PUTCbUFFER
STA ZP
STY ZP+1
LDA #1
LDY #0
JMP WRITE
PUTCbUFFER .BUF 1
GETCHAR = *
LDX #STDIN
GETC = *
LDA #<GETCbUFFER
LDY #>GETCbUFFER
STA ZP
STY ZP+1
LDA #1
LDY #0
JSR READ
BEQ +
LDA GETCbUFFER
RTS
+ SEC
RTS
GETCbUFFER .BUF 1
GETARG = *
STY ZP+1
ASL
STA ZP
ROL ZP+1
CLC
LDA ACEaRGV
ADC ZP
STA ZP
LDA ACEaRGV+1
ADC ZP+1
STA ZP+1
LDY #0
LDA (ZP),Y
TAX
INY
LDA (ZP),Y
STX ZP
STA ZP+1
RTS
SOURCEfCB = 2 ;(1)
BUFPTR = 3 ;(1)
SOURCElINE = 4 ;(4)
NUMBER = 8 ;(4)
STRINGlEN = 12 ;(1)
PREVcHAR = 13 ;(1)
TOKENiDENTIFIER = 0
TOKENnUMBER = 1
TOKENsTRING = 2
TOKENsPECIAL = 3
CHReRRiDENTtOOlONG = $F0
CHReRRsTRINGtOOlONG = $F1
CHReRRnOcLOSEqUOTE = $F2
CHReRRbADnUMBER = $F3
CHReRRnUMoVERFLOW = $F4
ASMAIN = *
LDA ACEaRGC+1
BEQ +
;** USAGE ERROR!
- RTS
+ LDA ACEaRGC
CMP #2
BNE -
LDA #1
LDY #0
JSR GETARG
LDA #"R"
JSR OPEN
BCC +
;** SOURCE OPEN ERROR!
RTS
+ STA SOURCEfCB
LDA #1
STA SOURCElINE
LDA #0
STA SOURCElINE+1
STA SOURCElINE+2
STA SOURCElINE+3
LDA #255
STA BUFPTR
JSR ASdRIVER
LDA SOURCEfCB
JSR CLOSE
RTS
;=FILL ENTIRE BUFFER, PAD WITH SPACES; .cs=EOF
FILLBUF = *
LDA #<SOURCEbUF
LDY #>SOURCEbUF
STA ZP
STY ZP+1
LDA #0
LDY #1
STA BUFPTR
LDX SOURCEfCB
JSR READ
BNE +
SEC
RTS
+ CPY #1
BCC +
CLC
RTS
+ TAY
LDA #" "
- STA SOURCEbUF,Y
INY
BNE -
CLC
RTS
GETnEXTcHAR = *
INC BUFPTR
BEQ +
- LDY BUFPTR
LDA SOURCEbUF,Y
RTS
+ JSR FILLBUF
BCC -
LDA #CHReof
RTS
EATwHITESPACE = * ;() : .a=nEXTcHAR
LDA PREVcHAR
CMP #" "
BEQ +
CMP #CHRtAB
BEQ +
RTS
+ LDY BUFPTR
- INY
BEQ +
EATwHcONT = *
LDA SOURCEbUF,Y
CMP #" "
BEQ -
CMP #CHRtAB
BEQ -
STY BUFPTR
RTS
+ JSR FILLBUF
BCS +
LDY #0
JMP EATwHcONT
+ LDA #CHReof
RTS
;===TOKEN DISPATCH===
;RET: .x=TOKENiDENTIFIER, .a=NEXTcHAR, .y=STRLEN, STRINGlEN, STRINGbUF
; .x=TOKENnUMBER, .y=NUMLEN, NUMBER
; .x=TOKENsTRING, .a=FIRSTcHAR,.y=STRLEN, STRINGlEN, STRINGbUF
; .x=TOKENsPECIAL, .a=CHAR
GETtOKEN = *
LDA PREVcHAR
CMP #" "
BNE +
- JSR EATwHITESPACE
+ CMP #CHRtAB
BEQ -
CMP #"@"
BCC +
JMP GETiDENTIFIER
+ CMP #"'"
BCC CMPmORE1
BNE +
JMP GETsTRING
+ CMP #"0"
BCC TOKsPECIAL
CMP #":"
BCS +
TOKnUM = *
JMP GETnUMBER
+ CMP #";"
BNE +
JMP EATcOMMENT
TOKsPECIAL = *
JMP GETsPECIALtOKEN
CMPmORE1 = *
CMP #"$"
BCC +
BEQ TOKnUM
CMP #"%"
BEQ TOKnUM
JMP GETsPECIALtOKEN
+ CMP #CHRqUOTE
BNE TOKsPECIAL
JMP GETsTRING
;===COMMENT===
EATcOMMENT = *
LDY BUFPTR
- INY
BEQ +
COMMENTcHAR = *
LDA SOURCEbUF,Y
CMP #CHRcr
BNE -
STY BUFPTR
JMP GETsPECIALtOKEN
+ JSR FILLBUF
BCS +
LDY #0
BEQ COMMENTcHAR
+ LDA #CHReof
JMP GETsPECIALtOKEN
;===SPECIAL===
GETsPECIALtOKEN = *
PHA
CMP #CHRcr
BNE +
INC SOURCElINE
BNE +
INC SOURCElINE+1
BNE +
INC SOURCElINE+2
BNE +
INC SOURCElINE+3
+ CMP #CHReof
BEQ +
JSR GETnEXTcHAR
+ STA PREVcHAR
PLA
LDX #TOKENsPECIAL
RTS
;===IDENTIFIER===
GETiDENTIFIER = *
STA STRINGbUF
LDY #1
STY STRINGlEN
- JSR GETnEXTcHAR
CMP #"@"
BCC IDENTeXIT
IDENTgOODcHAR = *
LDY STRINGlEN
STA STRINGbUF,Y
INC STRINGlEN
BNE -
STA PREVcHAR
LDX #TOKENsPECIAL
LDA #CHReRRiDENTtOOlONG
RTS
IDENTeXIT = *
CMP #"."
BEQ IDENTgOODcHAR
CMP #"_"
BEQ IDENTgOODcHAR
CMP #"0"
BCC +
CMP #":"
BCC IDENTgOODcHAR
+ CMP #" "
BNE +
- STA PREVcHAR
JSR EATwHITESPACE
+ CMP #CHRtAB
BEQ -
STA PREVcHAR
LDA #0
LDY STRINGlEN
STA STRINGbUF,Y
LDA PREVcHAR
LDY STRINGlEN
LDX #TOKENiDENTIFIER
RTS
;===STRING===
STRdELIMIT = 20
GETsTRING = *
STA STRdELIMIT
LDA #0
STA STRINGlEN
- JSR GETnEXTcHAR
STA PREVcHAR
CMP #CHReof
BEQ STReOF
CMP STRdELIMIT
BEQ STReXIT
CMP #CHRcr
BEQ STReOF
CMP #"\"
BEQ STReSC
GETsTRpUT = *
LDY STRINGlEN
STA STRINGbUF,Y
INC STRINGlEN
BNE -
STA PREVcHAR
LDA #CHReRRsTRINGtOOlONG
LDX #TOKENsPECIAL
RTS
STReSC = *
JSR GETnEXTcHAR
CMP #CHRcr
BEQ STReOF
CMP #CHReof
BEQ STReOF
LDX #STReSCcHAReND-STReSCcHAR-1
- CMP STReSCcHAR,X
BEQ +
DEX
BPL -
JMP GETsTRpUT
+ LDA STReSCtRANS,X
JMP GETsTRpUT
STReSCcHAR = *
.ASC "\NBTRAZ'E0"
.BYTE CHRqUOTE
STReSCcHAReND = *
STReSCtRANS = *
.BYTE 92,13,157,9,13,7,0,39,27,0,34
STReOF = *
LDA #CHReRRnOcLOSEqUOTE
LDX #TOKENsPECIAL
RTS
STReXIT = *
JSR GETnEXTcHAR
STA PREVcHAR
LDA #0 ;BUT MAY CONTAIN \0
LDY STRINGlEN
STA STRINGbUF,Y
LDA STRINGbUF
LDX #TOKENsTRING
RTS
NUMbASE = 20 ;(1)
NUMsAVE = 21 ;(4)
GETnUMBER = *
PHA
LDX #3
LDA #0
- STA NUMBER,X
DEX
BPL -
PLA
LDX #16
CMP #"$"
BEQ +
LDX #2
CMP #"%"
BEQ +
LDX #10
STX NUMbASE
BNE GOTnEXTdIGIT
+ STX NUMbASE
JSR GETnEXTcHAR
STA PREVcHAR
JSR CHECKdIGIT
BCC +
LDA #CHReRRbADnUMBER
LDX #TOKENsPECIAL
RTS
+ TXA
JMP GOTnEXTdIGIT
NEXTdIGIT = *
JSR GETnEXTcHAR
STA PREVcHAR
CMP #"_"
BEQ NEXTdIGIT
GOTnEXTdIGIT = *
JSR CHECKdIGIT
BCS GETnUMeXIT
PHA
JSR SHIFTnUMBER
BCS OVERFLOWeXITpLA
PLA
CLC
ADC NUMBER
STA NUMBER
BCC +
INC NUMBER+1
BNE +
INC NUMBER+2
BNE +
INC NUMBER+3
BEQ OVERFLOWeXIT
+ JMP NEXTdIGIT
OVERFLOWeXITpLA = *
PLA
OVERFLOWeXIT = *
LDX #TOKENsPECIAL
LDA #CHReRRnUMoVERFLOW
RTS
GETnUMeXIT = *
LDX #TOKENnUMBER
LDY #3
- LDA NUMBER,Y
BEQ +
DEY
BPL -
+ INY
RTS
CHECKdIGIT = * ;( .a=ASCIIdIGIT ) : .a=BINdIGIT, .x=ASCIIdIGIT, .cc=OK
TAX
CMP #"0"
BCC CHECKbAD
CMP #"9"+1
BCC CHECKaND
CMP #"A"
BCC CHECKbAD
CMP #"F"+1
BCC +
CMP #"a"
BCC CHECKbAD
CMP #"f"+1
BCS CHECKbAD
+ SEC
SBC #7
CHECKaND = *
AND #$0F
CMP NUMbASE
RTS
CHECKbAD = *
SEC
RTS
SHIFTnUMBER = *
LDA NUMbASE
CMP #10
BNE +
LDX #3
- LDA NUMBER,X
STA NUMsAVE,X
DEX
BPL -
LDX #2
JSR ROLLnUMBER
JSR ADDnUMBER
LDX #1
JSR ROLLnUMBER
RTS
+ LDX #1
CMP #16
BNE +
LDX #4
+ JSR ROLLnUMBER
RTS
ROLLnUMBER = * ;( .x=TIMES )
ASL NUMBER
ROL NUMBER+1
ROL NUMBER+2
ROL NUMBER+3
BCS +
DEX
BNE ROLLnUMBER
RTS
+ PLA
PLA
SEC
RTS
ADDnUMBER = *
LDX #0
CLC
- LDA NUMBER,X
ADC NUMsAVE,X
STA NUMBER,X
INX
TXA
AND #$03
BNE -
BCS +
RTS
+ PLA
PLA
SEC
RTS
ASdRIVER = *
LDA #$FF
STA BUFPTR
LDA #" "
STA PREVcHAR
NEXTtOKEN = *
JSR STOPKEY
BCC +
LDA #1
JMP EXIT
+ JSR GETtOKEN
CPX #TOKENiDENTIFIER
BEQ DISPiDENTIFIER
CPX #TOKENsTRING
BEQ DISPsTRING
CPX #TOKENsPECIAL
BEQ DISPsPECIAL
CPX #TOKENnUMBER
BEQ DISPnUMBER
JMP NEXTtOKEN
DISPiDENTIFIER = *
PHA
LDA #"I"
JSR PUTCHAR
LDA #":"
JSR PUTCHAR
JSR SHOWsTR
LDA #","
JSR PUTCHAR
PLA
SHOWcHAR = *
CMP #CHRcr
BNE +
LDA #"_"
+ JSR PUTCHAR
SHOWcr = *
LDA #CHRcr
JSR PUTCHAR
JMP NEXTtOKEN
DISPsTRING = *
LDA #"S"
JSR PUTCHAR
LDA #":"
JSR PUTCHAR
JSR SHOWsTR
JMP SHOWcr
SHOWsTR = *
LDA #<STRINGbUF
LDY #>STRINGbUF
STA ZP
STY ZP+1
LDA STRINGlEN
LDY #0
LDX #STDOUT
JSR WRITE
RTS
DISPsPECIAL = *
CMP #CHReof
BNE +
RTS
+ PHA
LDA #"C"
JSR PUTCHAR
LDA #":"
JSR PUTCHAR
PLA
JMP SHOWcHAR
DISPnUMBER = *
LDA #"N"
JSR PUTCHAR
LDA #":"
JSR PUTCHAR
LDA #<STRINGbUF
LDY #>STRINGbUF
STA $80
STY $81
LDX #NUMBER
LDA #1
JSR UTOA
STY STRINGlEN
JSR SHOWsTR
JMP SHOWcr
SOURCEbUF = *
STRINGbUF = SOURCEbUF+256
ASeND = STRINGbUF+256
BCODE.S
1150
;*** bcode: BCODE ENCODER VERSION 1.00 - BY cRAIG bRUCE - 17-nOV-93
;BCODE [-HELP] [-V] [-U] [-M] [-L MAX_LINE_COUNT] FILENAME ...
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:BCODE"
JMP MAIN
.BYTE ACEid1,ACEid2,ACEid3
;*** GLOBAL DECLARATIONS
CHRcr = $0D
CHRlf = $0A
CHRqUOTE = $22
TRUE = $FF
FALSE = $00
MAXcHUNK = 54
MAXlINE = 80
TRpETSCII = 0
TRaSCIIcRlF = 1
TRaSCIIlF = 2
ARG = 2 ;(2) ;CURRENT ARGUMENT NUMBER
NAME = 4 ;(2) ;NAME OF FILE BEING BCODED
STRING = 8 ;(2) ;TEMP STRING
MAXLINES = 10 ;(4) ;MAX NUMBER OF LINES PER SEGMENT
LINELIMIT = 14 ;(1) ;WHETHER THERE IS A RESTRICTION ON LINES/SEG
ALIAS = 16 ;(2) ;CURRENT ALIAS NAME TO USE
TRANStO = 18 ;(1) ;OUTPUT FILE TRANSLATION: PETSCII, ASC-CRLF, ASC-LF
PROGNAME = 19 ;(2) ;POINTER TO ARGV[0]
VERBOSE = 21 ;(1) ;FLAG FOR GIVING VERBOSE INFORMATION
FILENAMEuSED = 22;(1) ;FLAG: IF A FILENAME HAS BEEN ENCOUNTERED ON THE CMD LINE
BUFpTR = 23 ;(2) ;POINTER TO NEXT CHAR IN INPUT BUFFER
BUFcOUNT = 25 ;(2) ;NUMBER OF BYTES LEFT IN INPUT BUFFER
INbUFsIZE = 27 ;(2) ;MAXIMUM SIZE OF INPUT BUFFER
INFILE = 29 ;(1) ;FD OF INPUT BINARY FILE
OUTFILE = 30 ;(1) ;FD TO OUTPUT BCODED DATA TO
CHUNKlEN = 31 ;(1) ;LENGTH OF CHUNK FOR ENCODING
CHUNKpOS = 32 ;(1) ;SCANNING POSITION IN CHUNK DURING ENCODING
BCTEMP = 33 ;(1) ;TEMPORARY FOR CONVERSION FROM 8 TO 6 BITS
TRpUTpTR = 34 ;(2) ;POINTER TO TRANSLATED-PUTS STRING
TRpUTiNDEX = 36 ;(1) ;INDEX INTO TRANSLATED-PUTS STRING
CRC = 37 ;(4) ;CUMULATIVE CRC-32 OF SEGMENT
BYTES = 41 ;(4) ;CUMULATIVE BYTES IN SEGMENT
SEGNUM = 45 ;(4) ;CURRENT SEGMENT NUMBER
STOPcOUNTDN = 49 ;(1) ;COUNTDOWN TO CHECK STOP KEY
SCANvAL = 50 ;(4) ;RESULT OF CONVERTING STRING TO 32-BIT NUMBER
LINENUM = 54 ;(4) ;CURRENT LINE NUMBER BEING ENCODED
ISlASTsEG = 58 ;(1) ;WHETHER WE HAVE JUST ENCODED THE LAST SEGMENT
WORK = 112;(16) ;MISC WORK AREA
;===MAIN===
MAIN = *
;** CHECK FOR LARGE ENOUGH tpa
SEC
LDA #<BSSeND
CMP ACEsTACKpTR+0
LDA #>BSSeND
SBC ACEsTACKpTR+1
BCS +
JMP MAINiNIT
+ LDA #<TPAmSG
LDY #>TPAmSG
JSR EPUTS
DIE = *
LDA #1
LDX #0
JMP EXIT
TPAmSG = *
.ASC "iNSUFFICIENT PROGRAM SPACE TO RUN BCODE"
.BYTE CHRcr,0
USAGE = *
LDA #<USAGEmSG
LDY #>USAGEmSG
JSR EPUTS
JMP DIE
USAGEmSG = *
.ASC "USAGE: BCODE [-HELP] [-V] [-U] [-M] [-L MAX_LINE_COUNT] FILENAME ..."
.BYTE CHRcr
.ASC "FLAGS: -V:VERBOSE, -U:UNIX-ASCII, -M:MS-DOS-ASCII"
.BYTE CHRcr,0
DEFAULTaLIAS = *
.ASC "STDIN"
.BYTE 0
MAINiNIT = *
;** SET GLOBALS
LDA #TRUE
STA VERBOSE
LDA #0
LDY #0
JSR GETARG
LDA ZP+0
LDY ZP+1
STA PROGNAME+0
STY PROGNAME+1
LDA #FALSE
STA FILENAMEuSED
LDA #0
STA ARG+0
STA ARG+1
LDA #<DEFAULTaLIAS
LDY #>DEFAULTaLIAS
STA ALIAS+0
STY ALIAS+1
LDA #FALSE
STA LINELIMIT
LDA #TRpETSCII
STA TRANStO
;** GET INPUT BUFFER LENGTH
SEC
LDA ACEsTACKpTR+0
SBC #<INbUF
STA INbUFsIZE+0
LDA ACEsTACKpTR+1
SBC #>INbUF
STA INbUFsIZE+1
MAINnEXT = *
JSR CHECKsTOP
INC ARG+0
BNE +
INC ARG+1
+ LDA ARG+0
LDY ARG+1
JSR GETARG
LDA ZP+0
ORA ZP+1
BEQ MAINeXIT
LDA ZP+0
LDY ZP+1
STA NAME+0
STY NAME+1
LDY #0
LDA (ZP),Y
CMP #"-"
BNE +
JMP HANDLEfLAGS
+ JSR ECHO
JSR BCODE
JMP MAINnEXT
MAINeXIT = *
BIT FILENAMEuSED
BMI +
;XX SHOULD READ FROM STDIN IF NO FILES
NOP
+ RTS
HANDLEfLAGS = *
INY
LDA (ZP),Y
BNE +
JMP MAINnEXT
+ CMP #"V"
BEQ FLAGv
CMP #"M"
BEQ FLAGm
CMP #"A"
BEQ FLAGm
CMP #"U"
BEQ FLAGu
CMP #"L"
BEQ FLAGl
CMP #"H"
BNE +
JMP USAGE
+ NOP
;XX UNRECOGNIZED OPTION
JMP HANDLEfLAGS
FLAGv = *
LDA #TRUE
STA VERBOSE
JMP HANDLEfLAGS
FLAGm = *
LDA #TRaSCIIcRlF
STA TRANStO
JMP HANDLEfLAGS
FLAGu = *
LDA #TRaSCIIlF
STA TRANStO
JMP HANDLEfLAGS
FLAGl = *
INC ARG+0
BNE +
INC ARG+1
+ LDA ARG+0
LDY ARG+1
JSR GETARG
LDA ZP+0
ORA ZP+1
BEQ FLAGlERROR
LDY #0
JSR SCANnUM
BCS FLAGlERROR
LDX #3
- LDA SCANvAL,X
STA MAXLINES,X
DEX
BPL -
LDA MAXLINES+0
ORA MAXLINES+1
ORA MAXLINES+2
ORA MAXLINES+3
BEQ FLAGlERROR
LDA #TRUE
STA LINELIMIT
JMP MAINnEXT
FLAGlERROR = *
LDA #<FLAGlERRORmSG
LDY #>FLAGlERRORmSG
JSR EPUTS
JMP DIE
FLAGlERRORmSG = *
.ASC "error: INVALID MAXIMUM LINE LIMIT GIVEN WITH -L OPTION"
.BYTE CHRcr,0
ECHO = *
LDA #<ECHOmSG1
LDY #>ECHOmSG1
JSR EPUTS
LDA NAME+0
LDY NAME+1
JSR EPUTS
LDA #<ECHOmSG2
LDY #>ECHOmSG2
JSR EPUTS
RTS
ECHOmSG1 = *
.ASC "BCODING FILE "
.BYTE CHRqUOTE,0
ECHOmSG2 = *
.BYTE CHRqUOTE
.ASC "..."
.BYTE CHRcr,0
CHECKsTOP = *
JSR STOPKEY
BCS +
RTS
+ LDA #<STOPPEDmSG
LDY #>STOPPEDmSG
JSR EPUTS
JMP DIE
STOPPEDmSG = *
.ASC "<sTOPPED>"
.BYTE CHRcr,0
BCODE = *
LDA #TRUE
STA FILENAMEuSED
LDA NAME+0
LDY NAME+1
STA ZP+0
STY ZP+1
LDA #"R"
JSR OPEN
BCS OPENeRROR
STA INFILE
LDA #0
STA BUFcOUNT+0
STA BUFcOUNT+1
JSR SETbASE64tABLE
LDA #1
LDY #0
STA SEGNUM+0
STY SEGNUM+1
STY SEGNUM+2
STY SEGNUM+3
BCODEnEXTsEGMENT = *
LDA #STDOUT
STA OUTFILE
BIT LINELIMIT
BPL +
JSR GEToUTFILE
+ JSR BCODEsEGMENT
LDA OUTFILE
CMP #STDOUT
BEQ +
JSR CLOSE
+ BIT ISlASTsEG
BPL +
LDA INFILE
JSR CLOSE
RTS
+ INC SEGNUM+0
BNE +
INC SEGNUM+1
BNE +
INC SEGNUM+2
BNE +
INC SEGNUM+3
+ JMP BCODEnEXTsEGMENT
OPENeRROR = *
LDA #<OPENeRRORmSG1
LDY #>OPENeRRORmSG1
JSR EPUTS
LDA NAME+0
LDY NAME+1
JSR EPUTS
LDA #<OPENeRRORmSG2
LDY #>OPENeRRORmSG2
JSR EPUTS
RTS
OPENeRRORmSG1 = *
.ASC "error: CANNOT OPEN "
.BYTE CHRqUOTE,0
OPENeRRORmSG2 = *
.BYTE CHRqUOTE,CHRcr,0
OUTFILEfILElEN = WORK+0
OUTFILEeXTlEN = WORK+1
OUTFILEtEMP = WORK+2
GEToUTFILE = *
;** GET FILENAME
LDA NAME+0
LDY NAME+1
STA ZP+0
STY ZP+1
JSR BASENAME
STX OUTFILEfILElEN
;** GET SEG NUMBER, 2+ DIGITS
LDA #<NUMBUF
LDY #>NUMBUF
STA SYSWORK+0
STY SYSWORK+1
LDA #1
LDX #SEGNUM
JSR UTOA
CPY #1
BNE +
LDA NUMBUF+0
STA NUMBUF+1
LDA #"0"
STA NUMBUF+0
LDA #0
STA NUMBUF+2
INY
+ TYA
CLC
ADC #2
STA OUTFILEeXTlEN
CLC
LDA OUTFILEfILElEN
ADC OUTFILEeXTlEN
LDY OUTFILEfILElEN
CMP #17
BCC +
SEC
LDA #16
SBC OUTFILEeXTlEN ;GIVES ALLOWED FILENAME LEN
TAY
+ LDA #"."
STA OUTbUF,Y
INY
LDA #"B"
STA OUTbUF,Y
INY
LDX #0
- LDA NUMBUF,X
STA OUTbUF,Y
BEQ +
INX
INY
BNE -
;** OPEN THE FILE
+ LDA #<OUTbUF
LDY #>OUTbUF
STA ZP+0
STY ZP+1
LDA #"W"
JSR OPENoVERWRITE
STA OUTFILE
BCC +
LDA #<OUTFILEeRRmSG1
LDY #>OUTFILEeRRmSG1
JSR EPUTS
LDA #<OUTbUF
LDY #>OUTbUF
JSR EPUTS
LDA #<OUTFILEeRRmSG2
LDY #>OUTFILEeRRmSG2
JSR EPUTS
JMP DIE
;** ECHO OPENING
+ LDA #<OUTFILEmSG
LDY #>OUTFILEmSG
JSR EPUTS
LDA #<OUTbUF
LDY #>OUTbUF
JSR EPUTS
LDA #CHRqUOTE
JSR EPUTCHAR
LDA #CHRcr
JMP EPUTCHAR
OUTFILEmSG = *
.ASC "OUTPUTTING TO FILE "
.BYTE CHRqUOTE,0
OUTFILEeRRmSG1 = *
.ASC "error: CANNOT OPEN "
.BYTE CHRqUOTE,0
OUTFILEeRRmSG2 = *
.BYTE CHRqUOTE
.ASC ", ABORTING!"
.BYTE CHRcr,0
BCODEsEGMENT = * ;( ) : ISlASTsEG
;** HEADER LINE
LDA #<BCODEhEADERmSG
LDY #>BCODEhEADERmSG
JSR TRpUTS
LDX #SEGNUM
JSR TRpUTNUM
LDA #" "
JSR TRpUTCHAR
LDA NAME+0
LDY NAME+1
STA ZP+0
STY ZP+1
JSR BASENAME
LDA #<OUTbUF
LDY #>OUTbUF
JSR TRpUTS
LDA #CHRcr
JSR TRpUTCHAR
JSR CRCiNIT
LDA #0
STA LINENUM+0
STA LINENUM+1
STA LINENUM+2
STA LINENUM+3
;** LOOP
ENCODEnEXT = *
JSR ENCODElINE
BCC +
LDA #TRUE
STA ISlASTsEG
JMP ENCODEsEGfINISH
+ BIT LINELIMIT
BPL ENCODEnEXT
INC LINENUM+0
BNE +
INC LINENUM+1
BNE +
INC LINENUM+2
BNE +
INC LINENUM+3
+ SEC
LDY #4
LDX #0
- LDA LINENUM,X
SBC MAXLINES,X
INX
DEY
BNE -
BCC ENCODEnEXT
LDA #FALSE
STA ISlASTsEG
;** END LINE
ENCODEsEGfINISH = *
JSR CRCfINISH
BIT ISlASTsEG
BPL +
LDA #<BCODEeNDmSG
LDY #>BCODEeNDmSG
JMP ++
+ LDA #<BCODEcONTINUEDmSG
LDY #>BCODEcONTINUEDmSG
+ JSR TRpUTS
LDX #SEGNUM
JSR TRpUTNUM
LDA #" "
JSR TRpUTCHAR
LDX #BYTES
JSR TRpUTNUM
LDA #" "
JSR TRpUTCHAR
LDX #CRC
JSR TRpUTHEX
LDA #CHRcr
JSR TRpUTCHAR
RTS
BCODEhEADERmSG = *
.ASC "--BCODE-BEGIN "
.BYTE 0
BCODEeNDmSG = *
.ASC "--BCODE-END "
.BYTE 0
BCODEcONTINUEDmSG = *
.ASC "--BCODE-CONTINUED "
.BYTE 0
BASENAMEsTART .BUF 1
BASENAME = * ;( (ZP)=INNAME ) : OUTbUF=OUTNAME, .x=BASENAMElEN
LDY #255
STY BASENAMEsTART
- INY
LDA (ZP),Y
BEQ BASENAMEdONE
CMP #":"
BEQ +
CMP #"/"
BNE -
+ STY BASENAMEsTART
JMP -
BASENAMEdONE = *
LDY BASENAMEsTART
LDX #255
- INY
INX
LDA (ZP),Y
STA OUTbUF,X
BNE -
CPX #2
BCC +
LDA OUTbUF-2,X
CMP #","
BNE +
LDA #0
STA OUTbUF-2,X
DEX
DEX
+ RTS
ENCODElINE = *
INC STOPcOUNTDN
LDA STOPcOUNTDN
AND #7
BNE +
JSR CHECKsTOP
;** GET THE CHUNK
+ JSR READcHUNK
BCC +
RTS
+ STX CHUNKlEN
LDA #0
STA INcHUNK+0,X
STA INcHUNK+1,X
JSR CRCcHUNK
;** ENCODE THE CHUNK
LDX #0 ;CHUNKPOS
LDY #0 ;LINEPOS
- JSR ENCODEfOURcHARS
CPX CHUNKlEN
BCC -
;** FIX NON-INTEGRAL-LENGTH (LAST) LINE
BEQ +
LDA #"="
STA OUTbUF-1,Y
DEX
CPX CHUNKlEN
BEQ +
STA OUTbUF-2,Y
;** OUTPUT THE LINE
+ LDA #CHRcr
STA OUTbUF,Y
LDX TRANStO
CPX #TRpETSCII
BEQ +
INY
LDA #CHRlf
STA OUTbUF,Y
CPX #TRaSCIIcRlF
BEQ +
DEY
STA OUTbUF,Y
+ INY
TYA
LDA #<OUTbUF
LDX #>OUTbUF
STA ZP+0
STX ZP+1
TYA
LDY #0
LDX OUTFILE
JSR WRITE
RTS
ENCODEfOURcHARS = * ;( .x++=CHUNKPOS, .y++=LINEPOS )
STX CHUNKpOS
;** PUT BYTES INTO OUTPUT LINE
;POS 76543210 76543210 76543210 76543210
;BYT XX111111 XX112222 XX222233 XX333333
;BIT 765432 107654 321076 543210
;** FIRST BYTE
LDA INcHUNK+0,X
LSR
LSR
TAX
LDA BASE64cHAR,X
STA OUTbUF,Y
INY
;** SECOND BYTE
LDX CHUNKpOS
LDA INcHUNK+0,X
ASL
ASL
ASL
ASL
STA BCTEMP
LDA INcHUNK+1,X
LSR
LSR
LSR
LSR
ORA BCTEMP
AND #%00111111
TAX
LDA BASE64cHAR,X
STA OUTbUF,Y
INY
;** THIRD BYTE
LDX CHUNKpOS
LDA INcHUNK+1,X
ASL
ASL
STA BCTEMP
LDA INcHUNK+2,X
ASL
ROL
ROL
AND #%00000011
ORA BCTEMP
AND #%00111111
TAX
LDA BASE64cHAR,X
STA OUTbUF,Y
INY
;** FOURTH BYTE
LDX CHUNKpOS
LDA INcHUNK+2,X
AND #%00111111
TAX
LDA BASE64cHAR,X
STA OUTbUF,Y
INY
LDX CHUNKpOS
INX
INX
INX
RTS
BASE64iNDEX .BUF 1
SETbASE64tABLE = *
LDY #0
LDX #0
LDA TRANStO
CMP #TRpETSCII
BEQ +
LDX #BASE64dESCaSC-BASE64dESCpET
+ STX BASE64iNDEX
- LDX BASE64iNDEX
LDA BASE64dESCpET+0,X
BEQ +
PHA
LDA BASE64dESCpET+1,X
TAX
PLA
- STA BASE64cHAR,Y
CLC
ADC #1
INY
DEX
BNE -
INC BASE64iNDEX
INC BASE64iNDEX
BNE --
+ RTS
BASE64dESCpET = *
.BYTE "a",26,"A",26,"0",10,"+",1,"/",1,$00
BASE64dESCaSC = *
.BYTE $41,26,$61,26,"0",10,"+",1,"/",1,$00
READcHUNK = * ;( ) : .x=LEN
LDX #0
- STX CHUNKlEN
JSR GETbYTE
LDX CHUNKlEN
BCS +
STA INcHUNK,X
INX
CPX #MAXcHUNK
BCC -
- CLC
RTS
+ CPX #0
BNE -
SEC
RTS
GETbYTE = *
LDA BUFcOUNT+0
ORA BUFcOUNT+1
BEQ GETbYTEfILLbUF
LDY #0
LDA (BUFpTR),Y
INC BUFpTR+0
BNE +
INC BUFpTR+1
+ LDX BUFcOUNT+0
BNE +
DEC BUFcOUNT+1
+ DEC BUFcOUNT+0
CLC
RTS
GETbYTEfILLbUF = *
JSR CHECKsTOP
LDA #<INbUF
LDY #>INbUF
STA ZP+0
STY ZP+1
STA BUFpTR+0
STY BUFpTR+1
LDA INbUFsIZE+0
LDY INbUFsIZE+1
LDX INFILE
JSR READ
BEQ +
BCS +
STA BUFcOUNT+0
STY BUFcOUNT+1
JMP GETbYTE
+ SEC
RTS
CRCtABLE0 = *
.BYTE $00,$96,$2C,$BA,$19,$8F,$35,$A3,$32,$A4,$1E,$88,$2B,$BD,$07,$91
.BYTE $64,$F2,$48,$DE,$7D,$EB,$51,$C7,$56,$C0,$7A,$EC,$4F,$D9,$63,$F5
.BYTE $C8,$5E,$E4,$72,$D1,$47,$FD,$6B,$FA,$6C,$D6,$40,$E3,$75,$CF,$59
.BYTE $AC,$3A,$80,$16,$B5,$23,$99,$0F,$9E,$08,$B2,$24,$87,$11,$AB,$3D
.BYTE $90,$06,$BC,$2A,$89,$1F,$A5,$33,$A2,$34,$8E,$18,$BB,$2D,$97,$01
.BYTE $F4,$62,$D8,$4E,$ED,$7B,$C1,$57,$C6,$50,$EA,$7C,$DF,$49,$F3,$65
.BYTE $58,$CE,$74,$E2,$41,$D7,$6D,$FB,$6A,$FC,$46,$D0,$73,$E5,$5F,$C9
.BYTE $3C,$AA,$10,$86,$25,$B3,$09,$9F,$0E,$98,$22,$B4,$17,$81,$3B,$AD
.BYTE $20,$B6,$0C,$9A,$39,$AF,$15,$83,$12,$84,$3E,$A8,$0B,$9D,$27,$B1
.BYTE $44,$D2,$68,$FE,$5D,$CB,$71,$E7,$76,$E0,$5A,$CC,$6F,$F9,$43,$D5
.BYTE $E8,$7E,$C4,$52,$F1,$67,$DD,$4B,$DA,$4C,$F6,$60,$C3,$55,$EF,$79
.BYTE $8C,$1A,$A0,$36,$95,$03,$B9,$2F,$BE,$28,$92,$04,$A7,$31,$8B,$1D
.BYTE $B0,$26,$9C,$0A,$A9,$3F,$85,$13,$82,$14,$AE,$38,$9B,$0D,$B7,$21
.BYTE $D4,$42,$F8,$6E,$CD,$5B,$E1,$77,$E6,$70,$CA,$5C,$FF,$69,$D3,$45
.BYTE $78,$EE,$54,$C2,$61,$F7,$4D,$DB,$4A,$DC,$66,$F0,$53,$C5,$7F,$E9
.BYTE $1C,$8A,$30,$A6,$05,$93,$29,$BF,$2E,$B8,$02,$94,$37,$A1,$1B,$8D
CRCtABLE1 = *
.BYTE $00,$30,$61,$51,$C4,$F4,$A5,$95,$88,$B8,$E9,$D9,$4C,$7C,$2D,$1D
.BYTE $10,$20,$71,$41,$D4,$E4,$B5,$85,$98,$A8,$F9,$C9,$5C,$6C,$3D,$0D
.BYTE $20,$10,$41,$71,$E4,$D4,$85,$B5,$A8,$98,$C9,$F9,$6C,$5C,$0D,$3D
.BYTE $30,$00,$51,$61,$F4,$C4,$95,$A5,$B8,$88,$D9,$E9,$7C,$4C,$1D,$2D
.BYTE $41,$71,$20,$10,$85,$B5,$E4,$D4,$C9,$F9,$A8,$98,$0D,$3D,$6C,$5C
.BYTE $51,$61,$30,$00,$95,$A5,$F4,$C4,$D9,$E9,$B8,$88,$1D,$2D,$7C,$4C
.BYTE $61,$51,$00,$30,$A5,$95,$C4,$F4,$E9,$D9,$88,$B8,$2D,$1D,$4C,$7C
.BYTE $71,$41,$10,$20,$B5,$85,$D4,$E4,$F9,$C9,$98,$A8,$3D,$0D,$5C,$6C
.BYTE $83,$B3,$E2,$D2,$47,$77,$26,$16,$0B,$3B,$6A,$5A,$CF,$FF,$AE,$9E
.BYTE $93,$A3,$F2,$C2,$57,$67,$36,$06,$1B,$2B,$7A,$4A,$DF,$EF,$BE,$8E
.BYTE $A3,$93,$C2,$F2,$67,$57,$06,$36,$2B,$1B,$4A,$7A,$EF,$DF,$8E,$BE
.BYTE $B3,$83,$D2,$E2,$77,$47,$16,$26,$3B,$0B,$5A,$6A,$FF,$CF,$9E,$AE
.BYTE $C2,$F2,$A3,$93,$06,$36,$67,$57,$4A,$7A,$2B,$1B,$8E,$BE,$EF,$DF
.BYTE $D2,$E2,$B3,$83,$16,$26,$77,$47,$5A,$6A,$3B,$0B,$9E,$AE,$FF,$CF
.BYTE $E2,$D2,$83,$B3,$26,$16,$47,$77,$6A,$5A,$0B,$3B,$AE,$9E,$CF,$FF
.BYTE $F2,$C2,$93,$A3,$36,$06,$57,$67,$7A,$4A,$1B,$2B,$BE,$8E,$DF,$EF
CRCtABLE2 = *
.BYTE $00,$07,$0E,$09,$6D,$6A,$63,$64,$DB,$DC,$D5,$D2,$B6,$B1,$B8,$BF
.BYTE $B7,$B0,$B9,$BE,$DA,$DD,$D4,$D3,$6C,$6B,$62,$65,$01,$06,$0F,$08
.BYTE $6E,$69,$60,$67,$03,$04,$0D,$0A,$B5,$B2,$BB,$BC,$D8,$DF,$D6,$D1
.BYTE $D9,$DE,$D7,$D0,$B4,$B3,$BA,$BD,$02,$05,$0C,$0B,$6F,$68,$61,$66
.BYTE $DC,$DB,$D2,$D5,$B1,$B6,$BF,$B8,$07,$00,$09,$0E,$6A,$6D,$64,$63
.BYTE $6B,$6C,$65,$62,$06,$01,$08,$0F,$B0,$B7,$BE,$B9,$DD,$DA,$D3,$D4
.BYTE $B2,$B5,$BC,$BB,$DF,$D8,$D1,$D6,$69,$6E,$67,$60,$04,$03,$0A,$0D
.BYTE $05,$02,$0B,$0C,$68,$6F,$66,$61,$DE,$D9,$D0,$D7,$B3,$B4,$BD,$BA
.BYTE $B8,$BF,$B6,$B1,$D5,$D2,$DB,$DC,$63,$64,$6D,$6A,$0E,$09,$00,$07
.BYTE $0F,$08,$01,$06,$62,$65,$6C,$6B,$D4,$D3,$DA,$DD,$B9,$BE,$B7,$B0
.BYTE $D6,$D1,$D8,$DF,$BB,$BC,$B5,$B2,$0D,$0A,$03,$04,$60,$67,$6E,$69
.BYTE $61,$66,$6F,$68,$0C,$0B,$02,$05,$BA,$BD,$B4,$B3,$D7,$D0,$D9,$DE
.BYTE $64,$63,$6A,$6D,$09,$0E,$07,$00,$BF,$B8,$B1,$B6,$D2,$D5,$DC,$DB
.BYTE $D3,$D4,$DD,$DA,$BE,$B9,$B0,$B7,$08,$0F,$06,$01,$65,$62,$6B,$6C
.BYTE $0A,$0D,$04,$03,$67,$60,$69,$6E,$D1,$D6,$DF,$D8,$BC,$BB,$B2,$B5
.BYTE $BD,$BA,$B3,$B4,$D0,$D7,$DE,$D9,$66,$61,$68,$6F,$0B,$0C,$05,$02
CRCtABLE3 = *
.BYTE $00,$77,$EE,$99,$07,$70,$E9,$9E,$0E,$79,$E0,$97,$09,$7E,$E7,$90
.BYTE $1D,$6A,$F3,$84,$1A,$6D,$F4,$83,$13,$64,$FD,$8A,$14,$63,$FA,$8D
.BYTE $3B,$4C,$D5,$A2,$3C,$4B,$D2,$A5,$35,$42,$DB,$AC,$32,$45,$DC,$AB
.BYTE $26,$51,$C8,$BF,$21,$56,$CF,$B8,$28,$5F,$C6,$B1,$2F,$58,$C1,$B6
.BYTE $76,$01,$98,$EF,$71,$06,$9F,$E8,$78,$0F,$96,$E1,$7F,$08,$91,$E6
.BYTE $6B,$1C,$85,$F2,$6C,$1B,$82,$F5,$65,$12,$8B,$FC,$62,$15,$8C,$FB
.BYTE $4D,$3A,$A3,$D4,$4A,$3D,$A4,$D3,$43,$34,$AD,$DA,$44,$33,$AA,$DD
.BYTE $50,$27,$BE,$C9,$57,$20,$B9,$CE,$5E,$29,$B0,$C7,$59,$2E,$B7,$C0
.BYTE $ED,$9A,$03,$74,$EA,$9D,$04,$73,$E3,$94,$0D,$7A,$E4,$93,$0A,$7D
.BYTE $F0,$87,$1E,$69,$F7,$80,$19,$6E,$FE,$89,$10,$67,$F9,$8E,$17,$60
.BYTE $D6,$A1,$38,$4F,$D1,$A6,$3F,$48,$D8,$AF,$36,$41,$DF,$A8,$31,$46
.BYTE $CB,$BC,$25,$52,$CC,$BB,$22,$55,$C5,$B2,$2B,$5C,$C2,$B5,$2C,$5B
.BYTE $9B,$EC,$75,$02,$9C,$EB,$72,$05,$95,$E2,$7B,$0C,$92,$E5,$7C,$0B
.BYTE $86,$F1,$68,$1F,$81,$F6,$6F,$18,$88,$FF,$66,$11,$8F,$F8,$61,$16
.BYTE $A0,$D7,$4E,$39,$A7,$D0,$49,$3E,$AE,$D9,$40,$37,$A9,$DE,$47,$30
.BYTE $BD,$CA,$53,$24,$BA,$CD,$54,$23,$B3,$C4,$5D,$2A,$B4,$C3,$5A,$2D
;** CRC = 0Xffffffff;
;** WHILE( (C=GETC(FP)) != eof ) {$7b}
;** CRC = (CRC>>8) & 0X00ffffff ^ CRCtABLE[ (CRC^C) & 0Xff ];
;** {$7d}
;** RETURN( CRC^0Xffffffff );
CRCiNIT = *
LDX #3
- LDA #$FF
STA CRC,X
LDA #0
STA BYTES,X
DEX
BPL -
RTS
CRCcHUNK = *
LDY #0
CPY CHUNKlEN
BCS +
- LDA INcHUNK,Y ;.x = (CRC^C) & 0Xff
EOR CRC+0
TAX
LDA CRC+1 ;CRC = (CRC>>8) & 0X00ffffff ^ CRCtABLE[ .x ]
EOR CRCtABLE0,X
STA CRC+0
LDA CRC+2
EOR CRCtABLE1,X
STA CRC+1
LDA CRC+3
EOR CRCtABLE2,X
STA CRC+2
LDA CRCtABLE3,X
STA CRC+3
INY
CPY CHUNKlEN
BCC -
+ CLC
LDA BYTES+0
ADC CHUNKlEN
STA BYTES+0
BCC +
INC BYTES+1
BNE +
INC BYTES+2
BNE +
INC BYTES+3
+ RTS
CRCfINISH = *
LDX #3
- LDA CRC,X
EOR #$FF
STA CRC,X
DEX
BPL -
RTS
TRpUTS = *
STA TRpUTpTR+0
STY TRpUTpTR+1
LDY #0
STY TRpUTiNDEX
- LDY TRpUTiNDEX
LDA (TRpUTpTR),Y
BEQ +
JSR TRpUTCHAR
INC TRpUTiNDEX
BNE -
+ RTS
TRpUTCHAR = *
LDX TRANStO
CPX #TRpETSCII
BEQ +
CMP #CHRcr
BEQ ++
JSR CONVpET2aSC
+ LDX OUTFILE
JMP PUTC
+ LDX TRANStO
CPX #TRaSCIIlF
BEQ +
LDA #CHRcr
LDX OUTFILE
JSR PUTC
+ LDA #CHRlf
LDX OUTFILE
JMP PUTC
CONVpET2aSC = *
CMP #"A"
BCS +
RTS
+ TAX
BPL +
SBC #$C0-$60
TAX
+ AND #$1F
BNE +
- TXA
RTS
+ CMP #$1B
BCS -
TXA
EOR #$20
RTS
TRpUTNUM = * ;( .x=NUMBER32 )
LDA #<NUMBUF
LDY #>NUMBUF
STA SYSWORK+0
STY SYSWORK+1
LDA #1
JSR UTOA
TRpUTNUMdUMP = *
LDA #<NUMBUF
LDY #>NUMBUF
JSR TRpUTS
RTS
TRpUTHEX = * ;( .x=NUMBER32 )
LDA #4
STA WORK
LDY #0
INX
INX
INX
- LDA 0,X
PHA
LSR
LSR
LSR
LSR
JSR TRpUTHEXdIGIT
PLA
JSR TRpUTHEXdIGIT
DEX
DEC WORK
BNE -
LDA #0
STA NUMBUF,Y
JMP TRpUTNUMdUMP
TRpUTHEXdIGIT = * ;( .a=DIGIT, .y=NUMBUFiNDEX )
AND #$0F
ORA #$30
CMP #$3A
BCC +
ADC #6
+ STA NUMBUF,Y
INY
RTS
;=== STANDARD LIBRARY ===
PUTS = *
LDX #STDOUT
FPUTS = *
STA ZP+0
STY ZP+1
LDY #$FF
- INY
LDA (ZP),Y
BNE -
TYA
LDY #0
JMP WRITE
EPUTS = *
LDX #STDERR
JMP FPUTS
EPUTCHAR = *
LDX #STDERR
JMP PUTC
PUTCHAR = *
LDX #STDOUT
PUTC = *
STA PUTCbUFFER
LDA #<PUTCbUFFER
LDY #>PUTCbUFFER
STA ZP+0
STY ZP+1
LDA #1
LDY #0
JMP WRITE
PUTCbUFFER .BUF 1
GETARG = *
STY ZP+1
ASL
STA ZP+0
ROL ZP+1
CLC
LDA ACEaRGV+0
ADC ZP+0
STA ZP+0
LDA ACEaRGV+1
ADC ZP+1
STA ZP+1
LDY #0
LDA (ZP),Y
TAX
INY
LDA (ZP),Y
STX ZP+0
STA ZP+1
RTS
SCANdIGIT .BUF 1
SCANsAVE .BUF 4
SCANtEMP .BUF 1
SCANiNDEX .BUF 1
SCANaNYTHING .BUF 1
SCANnUM = * ;( (ZP)=NUMsTR, .y=NUMiNDEX ) : .y=SCAN, [SCANvAL]=NUM, .cs=ERR
LDX #3
LDA #0
- STA SCANvAL,X
DEX
BPL -
LDA #0
STA SCANaNYTHING
- LDA (ZP),Y
CMP #" "
BNE SCANnUMnEXT
INY
BNE -
SEC
RTS
SCANnUMnEXT = *
LDA (ZP),Y
CMP #"0"
BCC +
CMP #"9"+1
BCC ++
+ LDA SCANaNYTHING
BEQ SCANeRROR
CLC
RTS
+ AND #$0F
STA SCANdIGIT
LDA #$FF
STA SCANaNYTHING
;** TIMES TEN
STY SCANtEMP
LDX #3
- LDA SCANvAL,X
STA SCANsAVE,X
DEX
BPL -
LDA #2
STA SCANiNDEX
- CLC
LDY #4
LDX #0
- ROL SCANvAL,X
INX
DEY
BNE -
BCS SCANeRROR
DEC SCANiNDEX
BNE --
CLC
LDY #4
LDX #0
- LDA SCANvAL,X
ADC SCANsAVE,X
STA SCANvAL,X
INX
DEY
BNE -
BCS SCANeRROR
CLC
LDY #4
LDX #0
- ROL SCANvAL,X
INX
DEY
BNE -
BCS SCANeRROR
CLC
LDY #4
LDX #0
LDA SCANdIGIT
- ADC SCANvAL,X
STA SCANvAL,X
LDA #0
INX
DEY
BNE -
BCS SCANeRROR
LDY SCANtEMP
INY
BEQ SCANeRROR
JMP SCANnUMnEXT
SCANeRROR = *
SEC
RTS
OPENoVmODE .BUF 1
OPENoVERWRITE = * ;( (ZP)=NAME, .a=MODE ) : .a=fCB, .cs=ERR
STA OPENoVmODE
JSR OPEN
BCS +
RTS
+ LDA ERRNO
CMP #ACEeRRfILEeXISTS
BEQ +
- SEC
RTS
+ JSR REMOVE
LDA OPENoVmODE
JSR OPEN
BCS -
RTS
;===BSS===
BSS = *
OUTbUF = BSS
INcHUNK = OUTbUF+MAXlINE+1
BASE64cHAR = INcHUNK+MAXcHUNK+5
NUMBUF = BASE64cHAR+64
INbUF = NUMBUF+12
BSSeND = INbUF+64
BRK.S
9
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:BRK"
JMP MAIN
.ASC "Cb"
MAIN = *
BRK
CONFIG.S
1172
;*** cONFIGURATION pROGRAM ***
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:CONFIG"
JMP MAIN
.ASC "Cf"
KERNELsETLFS = $FFBA
KERNELsETNAM = $FFBD
KERNELoPEN = $FFC0
KERNELcLOSE = $FFC3
KERNELcHKIN = $FFC6
KERNELcHKOUT = $FFC9
KERNELcLRCHN = $FFCC
KERNELcHRIN = $FFCF
KERNELlOAD = $FFD5
KERNELsWAPPER = $FF5F
ST = $90
TOTALbANKS = ACEtOTALmEMORY+2
CHRcr = 13
CHRqUOTE = 34
CONFIGbUF = 2 ;(2)
SYSnAME = 4 ;(2)
RAM0fREEmAP = 6 ;(2)
ACEeNDpAGE = 8 ;(1)
SYStYPE = 9 ;(1)
MEMrEAD = 12 ;(2)
MEMwRITE = 14 ;(2)
BANKS = 16 ;(1)
BANKlIMIT = 17 ;(1)
SAVE0 = 18 ;(2)
SAVE2 = 20 ;(2)
SAVEn = 22 ;(2)
TITLEpTR = $70 ;(2)
MAIN = *
LDA #<TITLE
LDY #>TITLE
STA TITLEpTR+0
STY TITLEpTR+1
JSR LOADcONFIG
BCS +
JSR LOADcHARSET
BCS +
JSR LOADsHELL
BCS +
JSR SCREENiNIT
JSR SETdATE
JSR DISPLAYdATE
JSR GETrAMLINKpARMS
JSR INTERNALmEMORY
JSR REUmEMORY
JSR RLREUmEMORY
JSR RLmEMORY
JSR TOTALmEMORY
CLC
LDA #<TITLE
LDY #>TITLE
STA 2
STY 3
SEC
LDA TITLEpTR+0
SBC #<TITLE
STA 4
LDA TITLEpTR+1
SBC #>TITLE
STA 5
CLC
+ RTS
TESTmEMORYtYPE = * ;( .a=TYPE, .x=BANKlIMIT ) : .a=BANKcOUNT
STA ZP+3
STX BANKlIMIT
LDA #$00
LDY #$80
LDX #$00
STA ZP
STY ZP+1
STX ZP+2
LDA #0
STA BANKS
NEXTbANK = *
LDA BANKS
STA ZP+2
JSR SAVEbANK
LDA #$FF-$CB
STA MEMwRITE
LDA ZP+2
STA MEMwRITE+1
LDX #MEMwRITE
LDY #2
JSR ZPSTORE
LDA #$FF-$CB
LDX ZP+2
JSR TESTbANK
BCS BANKfAIL
LDA #$CB
STA MEMwRITE
LDX #MEMwRITE
LDY #2
JSR ZPSTORE
LDA #$CB
LDX ZP+2
JSR TESTbANK
BCS BANKfAIL
LDA #$CB
LDX #0
JSR TESTbANK
BCS BANKfAIL
LDA ZP+2
CMP #2
BCC +
LDA #$CB
LDX #2
JSR TESTbANK
BCS BANKfAIL
+ JSR RESTOREbANK
INC BANKS
LDA BANKS
CMP BANKlIMIT
BCC NEXTbANK
BANKfAIL = *
JSR RESTOREwRAPbANKS
LDA BANKS
RTS
SAVEbANK = * ;()
LDX #SAVEn
LDY #2
LDA ZP+2
CMP #0
BNE +
LDX #SAVE0
+ CMP #2
BNE +
LDX #SAVE2
+ JSR ZPLOAD
RTS
RESTOREbANK = * ;()
LDA ZP+2
CMP #0
BEQ +
CMP #2
BEQ +
LDX #SAVEn
LDY #2
JSR ZPSTORE
+ RTS
RESTOREwRAPbANKS = * ;()
LDA BANKS
CMP #3
BCC +
+ LDA #2
STA ZP+2
LDX #SAVE2
LDY #2
JSR ZPSTORE
LDA BANKS
CMP #1
BCC +
LDA #0
STA ZP+2
LDX #SAVE0
LDY #2
JSR ZPSTORE
+ RTS
RDvAL = 10 ;(1)
RDbANK = 11 ;(1)
TESTbANK = * ;( .a=DATA, .x=BANK ) : .cs=ERR
STA RDvAL
LDA ZP+2
STA RDbANK
STX ZP+2
LDA #$FF
STA MEMrEAD
STA MEMrEAD+1
LDX #MEMrEAD
LDY #2
JSR ZPLOAD
LDA MEMrEAD
CMP RDvAL
BNE +
LDA MEMrEAD+1
CMP ZP+2
BNE +
LDA RDbANK
STA ZP+2
CLC
RTS
+ LDA RDbANK
STA ZP+2
SEC
RTS
PUTS = *
STA $40
STY $41
LDY #0
- LDA ($40),Y
BEQ +
JSR CHROUT
INY
BNE -
INC $41
BNE -
+ RTS
LOADcONFIG = *
LDA #0
LDX 186
LDY #0
JSR KERNELsETLFS
LDA #10
LDX #<LOADcONFIGnAME
LDY #>LOADcONFIGnAME
JSR KERNELsETNAM
LDA #0
LDX CONFIGbUF
LDY CONFIGbUF+1
JSR KERNELlOAD
BCS +
CLC
RTS
+ LDA #<BADcONFIG
LDY #>BADcONFIG
JSR PUTS
SEC
RTS
LOADcONFIGnAME = *
.ASC "CONFIG.SYS"
BADcONFIG = *
.ASC "eRROR ATTEMPTING TO B-LOAD "
.BYTE CHRqUOTE
.ASC "CONFIG.SYS"
.BYTE CHRqUOTE
.ASC ", ABORTING."
.BYTE CHRcr,0
LOADcHARSET = *
LDA #0
LDX 186
LDY #0
JSR KERNELsETLFS
LDA #11
LDX #<LOADcHARSETnAME
LDY #>LOADcHARSETnAME
JSR KERNELsETNAM
LDA #0
LDX #<$2000
LDY #>$2000
JSR KERNELlOAD
BCS +
CLC
RTS
+ LDA #<BADcHARSET
LDY #>BADcHARSET
JSR PUTS
SEC
RTS
LOADcHARSETnAME = *
.ASC "ACE-CHARSET"
BADcHARSET = *
.ASC "eRROR ATTEMPTING TO B-LOAD "
.BYTE CHRqUOTE
.ASC "ACE-CHARSET"
.BYTE CHRqUOTE
.ASC ", ABORTING."
.BYTE CHRcr,0
LOADsHELL = *
LDA #0
LDX 186
LDY #0
JSR KERNELsETLFS
LDA #2
LDX #<LOADsHELLnAME
LDY #>LOADsHELLnAME
JSR KERNELsETNAM
LDA #0
LDX #<ACEsHELLaDDRESS
LDY #>ACEsHELLaDDRESS
JSR KERNELlOAD
BCS +
CLC
RTS
+ LDA #<BADsHELL
LDY #>BADsHELL
JSR PUTS
SEC
RTS
LOADsHELLnAME = *
.ASC "SH"
BADsHELL = *
.ASC "eRROR ATTEMPTING TO B-LOAD "
.BYTE CHRqUOTE
.ASC "SH"
.BYTE CHRqUOTE
.ASC ", ABORTING."
.BYTE CHRcr,0
SCREENiNIT = *
LDA #147
JSR $FFD2
LDA SYSnAME+0
LDY SYSnAME+1
JSR PUTS
RTS
DISPLAYdATE = *
LDA #<DATEbUF
LDY #>DATEbUF
JSR GETDATE
;** YEAR
LDA DATEbUF+0
LDX #11
JSR PUTdIGITS
LDA DATEbUF+1
LDX #13
JSR PUTdIGITS
;** MONTH
LDA DATEbUF+2
CMP #$10
BCC +
SEC
SBC #$10-10
+ TAX
LDA MONTHsTR+0,X
STA DATEsTR+7
LDA MONTHsTR+13,X
STA DATEsTR+8
LDA MONTHsTR+26,X
STA DATEsTR+9
;** DAY
LDA DATEbUF+3
LDX #4
JSR PUTdIGITS
;** HOUR
LDA DATEbUF+4
LDX #"A"
CMP #$00
BNE +
LDA #$12
JMP PUThOUR
+ CMP #$12
BCC PUThOUR
LDX #"P"
CMP #$12
BEQ PUThOUR
SEI
SED
SEC
SBC #$12
CLD
CLI
PUThOUR = *
STX DATEsTR+26
LDX #17
JSR PUTdIGITS
;** MINUTE
LDA DATEbUF+5
LDX #20
JSR PUTdIGITS
;** SECOND
LDA DATEbUF+6
LDX #23
JSR PUTdIGITS
;** DAY OF WEEK
LDA DATEbUF+7
AND #$07
TAX
LDA DOWsTR+0,X
STA DATEsTR+0
LDA DOWsTR+8,X
STA DATEsTR+1
LDA DOWsTR+16,X
STA DATEsTR+2
LDA #<DATEsTR
LDY #>DATEsTR
JSR PUTS
RTS
PUTdIGITS = * ;( .a=NUM, .x=OFFSET )
PHA
LSR
LSR
LSR
LSR
ORA #$30
STA DATEsTR,X
PLA
AND #$0F
ORA #$30
STA DATEsTR+1,X
RTS
DATEsTR = *
;0123456789012345678901234567
.ASC "tUE-05-mAY-1993 11:34:12 PM"
.BYTE 13,13,0
DATEbUF .BUF 10
DOWsTR = *
.ASC "*smtwtfs"
.ASC "*UOUEHRA"
.ASC "*NNEDUIT"
MONTHsTR = *
.ASC "*jfmamjjasond"
.ASC "*AEAPAUUUECOE"
.ASC "*NBRRYNLGPTVC"
TRYdATE = 10
SETdATE = *
LDY #$82
- STY TRYdATE
LDA (CONFIGbUF),Y
CMP #$FF
BEQ +
JSR CMDoPEN
BCS +
LDA #<QUERYdATEsTR
LDY #>QUERYdATEsTR
JSR CMDsEND
BCS QUERYeRROR
LDA #<DATEbUF
LDY #>DATEbUF
LDX #9
JSR CMDdATA
BCS QUERYeRROR
JSR CMDcLOSE
JMP CONVERTcMDdATE
QUERYeRROR = *
JSR CMDcLOSE
+ INC TRYdATE
LDY TRYdATE
CPY #$86
BCC -
SETdEFAULTdATE = *
LDA CONFIGbUF
LDY CONFIGbUF+1
CLC
ADC #$86
BCC +
INY
+ JMP SETDATE
QUERYdATEsTR = *
.ASC "T-RB"
.BYTE 13,0
CONVERTcMDdATE = *
LDA DATEbUF+4
LDX DATEbUF+7
BEQ +
SEI
SED
CLC
ADC #$12
CLD
CLI
+ CMP #$12
BNE +
LDA #$00
+ CMP #$24
BNE +
LDA #$12
+ STA DATEbUF+4
CLC
LDA DATEbUF+0
ADC #$51
STA DATEbUF+7
LDX #$19
LDA DATEbUF+1
CMP #$70
BCS +
LDX #$20
+ STX DATEbUF+0
LDA #<DATEbUF
LDY #>DATEbUF
JSR SETDATE
RTS
CMDoPEN = * ;( .a=DEVICE ) : .cs=ERR
TAX
LDA #6
LDY #15
JSR KERNELsETLFS
LDA #0
JSR KERNELsETNAM
JSR KERNELoPEN
RTS
CMDcLOSE = * ;()
CLC
LDA #6
JSR KERNELcLOSE
RTS
CMDsEND = * ;( (.ay)=CMDsTRz ) : .cs=ERR
STA $40
STY $41
LDX #6
JSR KERNELcHKOUT
BCC +
RTS
+ LDY #0
- LDA ($40),Y
BEQ +
JSR $FFD2
INY
BNE -
+ JSR KERNELcLRCHN
CLC
RTS
CMDdATA = * ;( (.ay)=CMDbUF, .x=LEN ) : .cs=ERR
STA $40
STY $41
STX $42
LDX #6
JSR KERNELcHKIN
BCC +
RTS
+ LDX #0
JSR KERNELcHRIN
CMP #"0"
BCC ++
CMP #"9"+1
BCS ++
BADdATA = *
- JSR KERNELcHRIN
BCS +
BIT ST
BVS +
CMP #13
BNE -
+ JSR KERNELcLRCHN
SEC
RTS
+ LDY #0
STA ($40),Y
INY
- JSR KERNELcHRIN
STA ($40),Y
INY
CPY $42
BCC -
CMP #13
BNE BADdATA
JSR KERNELcLRCHN
CLC
RTS
GETrAMLINKpARMS = *
LDY #$80
LDA (CONFIGbUF),Y
JSR CMDoPEN
BCS RLpARMSeRROR
;** RAMLINK RAM ACCESS
LDA #<PARTrLcMD
LDY #>PARTrLcMD
JSR CMDsEND
BCS RLpARMSeRROR
LDA #<RLiDENT
LDY #>RLiDENT
JSR CHECKpARTITION
BCS +
STA ACErAMLINKsTART
STY ACErAMLINKsTART+1
STX ACErAMLINKbANKS
;** INDIRECT REU ACCESS
+ LDA #<PARTrLREUcMD
LDY #>PARTrLREUcMD
JSR CMDsEND
BCS RLpARMSeRROR
LDA #<RLREUiDENT
LDY #>RLREUiDENT
JSR CHECKpARTITION
BCS RLpARMSeRROR
STA ACErAMLINKrEUsTART
STY ACErAMLINKrEUsTART+1
STX ACErAMLINKrEUbANKS
RLpARMSeRROR = *
JSR CMDcLOSE
RTS
CHECKpARTITION = * ;( (.ay)=NAME ) : .cs=ERR, .ay=START, .x=BANKS
STA $44
STY $45
LDA #<PARTITIONbUF
LDY #>PARTITIONbUF
LDX #31
JSR CMDdATA
BCS CHECKeRReXIT
LDA PARTITIONbUF+0
CMP #7
BNE CHECKeRReXIT
LDY #0
- LDA ($44),Y
BEQ +
CMP PARTITIONbUF+3,Y
BNE CHECKeRReXIT
INY
BNE -
+ LDA PARTITIONbUF+21
LDY PARTITIONbUF+20
LDX PARTITIONbUF+28
CLC
RTS
CHECKeRReXIT = *
SEC
RTS
PARTrLcMD = *
.ASC "G-P"
.BYTE 31,0
RLiDENT = *
.ASC "RL-RAM"
.BYTE $A0,0
PARTrLREUcMD = *
.ASC "G-P"
.BYTE 30,0
RLREUiDENT = *
.ASC "INDIRECT-REU"
.BYTE $A0,0
PARTITIONbUF .BUF 35
PUTNUM = * ;( [$44]=NUM, .a=WIDTH )
PHA
LDA #<OUTCHAR
LDY #>OUTCHAR
STA $80
STY $81
LDX #$44
PLA
JSR UTOA
JSR PUTCOMMA
LDX #0
- LDA OUTCHAR,X
BEQ +
JSR CHROUT
INX
BNE -
+ RTS
OUTCHAR .BUF 11
PUTCOMMA = * ;( OUTCHAR )
LDX #$FF
- INX
LDA OUTCHAR,X
BNE -
- DEX
DEX
DEX
DEX
CPX #$80
BCC +
RTS
+ CPX #0
BCS +
RTS
+ LDA OUTCHAR,X
CMP #" "
BNE +
RTS
+ STX $44
LDY #0
- LDA OUTCHAR+1,Y
STA OUTCHAR,Y
INY
CPY $44
BCC -
LDA #","
STA OUTCHAR,Y
JMP --
RTS
DISPLAYaVAIL = * ;( (.ay)=NAME, (.x,$45)=BANKS )
STA $40
STY $41
STX $44
LDY #0
- LDA ($40),Y
JSR CHROUT
INY
CPY #6
BCC -
LDA #":"
JSR CHROUT
TXA
CLC
ADC TOTALbANKS
STA TOTALbANKS
LDA $45
ADC TOTALbANKS+1
STA TOTALbANKS+1
LDA #0
STA $46
STA $47
LDX #6
- ASL $44
ROL $45
ROL $46
ROL $47
DEX
BNE -
LDA #6
JSR PUTNUM
LDA #"k"
JSR CHROUT
RTS
ADDtOfREE = * ;( [$44]=BYTES )
CLC
LDA $44
ADC ACEfREEmEMORY+0
STA ACEfREEmEMORY+0
LDA $45
ADC ACEfREEmEMORY+1
STA ACEfREEmEMORY+1
LDA $46
ADC ACEfREEmEMORY+2
STA ACEfREEmEMORY+2
BCC +
INC ACEfREEmEMORY+3
+ RTS
DISPLAYfREE = * ;( [$44]=BYTES )
LDA #<FREEmSG
LDY #>FREEmSG
JSR PUTS
LDA #10
JSR PUTNUM
LDA #13
JSR CHROUT
RTS
FREEmSG = *
.ASC " FREE:"
.BYTE 0
RESETfREE = *
LDA #0
LDX #3
- STA $44,X
DEX
BPL -
RTS
INTERNALmEMORY = *
LDA #ACEmEMiNTERNAL
LDX #255
SEI
JSR TESTmEMORYtYPE
CLI
STA ACEiNTERNALbANKS
PHA
JSR INSTALLiNTERNvECTORS
PLA
TAX
LDA #0
STA $45
LDA #<INTERNALnAME
LDY #>INTERNALnAME
JSR DISPLAYaVAIL
JSR RESETfREE
;** RAM0
LDA #ACEmEMiNTERNAL
STA ZP+3
LDA #0
STA ACEiNTERNALcUR
LDA RAM0fREEmAP+0
LDY RAM0fREEmAP+1
STA ACErAM0fREEMAP+0
STY ACErAM0fREEMAP+1
LDX #0
STA ZP+0
STY ZP+1
STX ZP+2
LDY #$A3
BIT SYStYPE
BMI +
LDY #$C1
+ LDA (CONFIGbUF),Y
TAY
LDA #1
LDX #>ACEaPPaDDRESS
JSR INITbANKS
JSR FREErAM0aFTERkERNEL
;** RAM1
BIT SYStYPE
BPL EXPiNTERNAL64
LDA #$00
STA ZP+0
LDY #$A0
LDA (CONFIGbUF),Y
STA ZP+1
STA ACErAM1fREEMAP
LDA #1
STA ZP+2
LDY #$A1
LDA (CONFIGbUF),Y
TAY
LDA #2
LDX ZP+1
INX
JSR INITbANKS
;** RAM2-7 C128
EXPiNTERNAL128 = *
LDA #2
STA ZP+2
LDA #$00
LDY #$04
STA ZP+0
STY ZP+1
LDY #$A5
LDA (CONFIGbUF),Y
LDX ACEiNTERNALbANKS
JSR MIN
STA ACEiNTERNALbANKS
LDX #$05
LDY #$FF
JSR INITbANKS
JSR ADDtOfREE
JSR DISPLAYfREE
RTS
;** RAM1-3 C64
EXPiNTERNAL64 = *
LDA #1
STA ACEiNTERNALbANKS
JSR ADDtOfREE
JSR DISPLAYfREE
RTS
INTERNALnAME = *
.ASC "INTERN"
RESERVEtpa = *
LDY #$A8
BIT SYStYPE
BMI +
LDY #$C6
+ LDA (CONFIGbUF),Y
STA $40
LDY #>ACEaPPaDDRESS
LDA #$FE
CPY $40
BCS +
- STA (RAM0fREEmAP),Y
INY
CPY $40
BCC -
+ SEC
LDA $40
SBC #>ACEaPPaDDRESS
STA $40
SEC
LDA ACEfREEmEMORY+1
SBC $40
STA ACEfREEmEMORY+1
LDA ACEfREEmEMORY+2
SBC #0
STA ACEfREEmEMORY+2
LDA ACEfREEmEMORY+3
SBC #0
STA ACEfREEmEMORY+3
RTS
FREErAM0aFTERkERNEL = *
;** FREE END.KERNEL->ST.SHELL
LDY ACEeNDpAGE
CPY #>ACEaPPaDDRESS
BCS +
LDA #$00
- STA (RAM0fREEmAP),Y
INY
CPY #>ACEaPPaDDRESS
BCC -
+ SEC
LDA #>ACEaPPaDDRESS
SBC ACEeNDpAGE
STA $40
CLC
LDA $45
ADC $40
STA $45
BCC +
INC $46
BNE +
INC $47
+ RTS
INSTALLiNTERNvECTORS = *
BIT SYStYPE
BPL INSTALLvECTORS64
LDA ACEiNTERNALbANKS
CMP #2
BCS +
RTS
+ SEI
LDA #2
LDY #ACEmEMiNTERNAL
STA ZP+2
STY ZP+3
- LDA #$05
LDY #$FF
STA ZP+0
STY ZP+1
STA ZW+0
STY ZW+1
LDA #<251
LDY #>251
JSR STASH
INC ZP+2
LDA ZP+2
CMP ACEiNTERNALbANKS
BCC -
CLI
RTS
INSTALLvECTORS64 = *
LDX #$3F
- LDA VECTORcODE64,X
STA $FFC0,X
DEX
BPL -
;XX COPY TO EXP BANKS
RTS
VECTORcODE64 = *
.BYTE $00
;XX VECTOR DISPATCH CODE HERE
REUmEMORY = *
LDA #ACEmEMreu
LDX #255
JSR TESTmEMORYtYPE
STA ACErEUbANKS
TAX
BNE +
LDA ACErAMLINKrEUbANKS
BEQ +
RTS
+ LDA #0
STA $45
LDA #<REUnAME
LDY #>REUnAME
JSR DISPLAYaVAIL
JSR RESETfREE
LDA #ACEmEMreu
STA ZP+3
LDY #$A6
BIT SYStYPE
BMI +
LDY #$C2
+ LDA (CONFIGbUF),Y
STA ACErEUsTART
STA ACErEUcUR
LDY #$A7
BIT SYStYPE
BMI +
LDY #$C3
+ LDA (CONFIGbUF),Y
LDX ACErEUbANKS
JSR MIN
STA ACErEUbANKS
LDA #$00
LDY #$FF
LDX ACErEUsTART
STA ZP+0
STY ZP+1
STX ZP+2
LDA ACErEUbANKS
LDX #$00
LDY #$FF
JSR INITbANKS
JSR ADDtOfREE
JSR DISPLAYfREE
RTS
REUnAME = *
.ASC "REU "
RLREUmEMORY = *
LDA ACErEUbANKS
BEQ +
LDA #0
STA ACErAMLINKrEUbANKS
- RTS
+ LDX ACErAMLINKrEUbANKS
BEQ -
LDA #0
STA $45
LDA #<RLREUnAME
LDY #>RLREUnAME
JSR DISPLAYaVAIL
JSR RESETfREE
LDA #ACEmEMrlreu
STA ZP+3
LDY #$A6
BIT SYStYPE
BMI +
LDY #$C2
+ LDA (CONFIGbUF),Y
STA ACErEUsTART ;**SIC
STA ACErAMLINKrEUcUR
LDY #$A7
BIT SYStYPE
BMI +
LDY #$C3
+ LDA (CONFIGbUF),Y
LDX ACErAMLINKrEUbANKS
JSR MIN
STA ACErAMLINKrEUbANKS
LDA #$00
LDY #$FF
LDX ACErAMLINKrEUsTART
STA ZP+0
STY ZP+1
STX ZP+2
LDA ACErAMLINKrEUbANKS
LDX #$00
LDY #$FF
JSR INITbANKS
JSR ADDtOfREE
JSR DISPLAYfREE
RTS
RLREUnAME = *
.ASC "RL-REU"
RLmEMORY = *
LDX ACErAMLINKbANKS
LDA #0
STA $45
LDA #<RLnAME
LDY #>RLnAME
JSR DISPLAYaVAIL
JSR RESETfREE
LDY #$81
LDA (CONFIGbUF),Y
LDX ACErAMLINKbANKS
JSR MIN
STA ACErAMLINKbANKS
LDA #ACEmEMrl
STA ZP+3
LDA #$00
LDY #$FF
LDX #0
STX ACErAMLINKcUR
STA ZP+0
STY ZP+1
STX ZP+2
LDA ACErAMLINKbANKS
LDX #$00
LDY #$FF
JSR INITbANKS
JSR ADDtOfREE
JSR DISPLAYfREE
RTS
RLnAME = *
.ASC "RL-RAM"
TOTALmEMORY = *
LDX TOTALbANKS
LDA TOTALbANKS+1
STA $45
LDA #<TOTALnAME
LDY #>TOTALnAME
JSR DISPLAYaVAIL
LDX #3
- LDA ACEfREEmEMORY,X
STA $44,X
DEX
BPL -
JSR DISPLAYfREE
LDA #13
JSR CHROUT
JSR RESERVEtpa
RTS
TOTALnAME = *
.ASC "TOTAL "
RTS
ENDbANK = 10 ;(1)
STARTfREE = 11 ;(1)
ENDfREE = 12 ;(1)
INITbANKS = * ;( [ZP]=FIRSTfREEMAP, .a=ENDbANK+1, .x=STARTfREE, .y=ENDfREE+1 )
STA ENDbANK
STX STARTfREE
STY ENDfREE
LDA #<FREEMAP
LDY #>FREEMAP
STA ZW
STY ZW+1
LDX #0
LDA #$FF
- STA FREEMAP,X
INX
BNE -
LDX STARTfREE
CPX ENDfREE
BCS FREEnEXTbANK
LDA #$00
- STA FREEMAP,X
INX
CPX ENDfREE
BCC -
FREEnEXTbANK = *
LDA ZP+2
CMP ENDbANK
BCS +
LDA #<256
LDY #>256
JSR STASH
INC ZP+2
SEC
LDA ENDfREE
SBC STARTfREE
CLC
ADC $45
STA $45
BCC FREEnEXTbANK
INC $46
BNE FREEnEXTbANK
INC $47
JMP FREEnEXTbANK
+ RTS
MIN = * ;( .a=NUM1, .x=NUM2 ) : .a=MIN
STX $40
CMP $40
BCC +
LDA $40
+ RTS
CHROUTsAVE .BUF 1
CHROUT = *
JSR $FFD2
STY CHROUTsAVE
LDY #0
STA (TITLEpTR),Y
INC TITLEpTR+0
BNE +
INC TITLEpTR+1
+ LDY CHROUTsAVE
CLC
RTS
FREEMAP = *
TITLE = FREEMAP+256
CP.S
458
;*** CP PROGRAM ***
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:CP"
JMP COPYMAIN
.ASC "Cb"
;*** GLOBAL DECLARATIONS
LIBWORK = $60
CHRcr = $0D
CHRqUOTE = $22
OVERWRITEaLLfLAG .BUF 1
ABORTfLAG .BUF 1
;******** STANDARD LIBRARY ********
EPUTS = *
LDX #STDERR
JMP FPUTS
PUTS = *
LDX #STDOUT
FPUTS = *
STA ZP
STY ZP+1
LDY #$FF
- INY
LDA (ZP),Y
BNE -
TYA
LDY #0
JMP WRITE
PUTCHAR = *
LDX #STDOUT
PUTC = *
STA PUTCbUFFER
LDA #<PUTCbUFFER
LDY #>PUTCbUFFER
STA ZP
STY ZP+1
LDA #1
LDY #0
JMP WRITE
PUTCbUFFER .BUF 1
GETCHAR = *
LDX #STDIN
GETC = *
LDA #<GETCbUFFER
LDY #>GETCbUFFER
STA ZP
STY ZP+1
LDA #1
LDY #0
JSR READ
BEQ +
LDA GETCbUFFER
RTS
+ SEC
RTS
GETCbUFFER .BUF 1
;===COPY LIBRARY===
COPYbUFFERpTR = 2
COPYbUFFERlENGTH = 4
GETbUFFERpARMS = *
LDA #<CPeND
LDY #>CPeND
STA COPYbUFFERpTR
STY COPYbUFFERpTR+1
SEC
LDA ACEsTACKpTR
SBC COPYbUFFERpTR
STA COPYbUFFERlENGTH
LDA ACEsTACKpTR+1
SBC COPYbUFFERpTR+1
STA COPYbUFFERlENGTH+1
RTS
GETARG = *
STY ZP+1
ASL
STA ZP
ROL ZP+1
CLC
LDA ACEaRGV
ADC ZP
STA ZP
LDA ACEaRGV+1
ADC ZP+1
STA ZP+1
LDY #0
LDA (ZP),Y
TAX
INY
LDA (ZP),Y
STX ZP
STA ZP+1
RTS
GETlASTaRG = *
LDA ACEaRGC
LDY ACEaRGC+1
SEC
SBC #1
BCS +
DEY
+ JMP GETARG
;===COPY===
COPYiNfILE = 6
COPYoUTfILE = 7
COPYiNnAME = 8
COPYoUTnAME = 10
COPYMAIN = *
LDA #0
STA OVERWRITEaLLfLAG
STA ABORTfLAG
JSR GETbUFFERpARMS
;** CHECK FOR AT LEAST THREE ARGUMENTS
LDA ACEaRGC+1
BNE +
LDA ACEaRGC
CMP #3
BCC COPYuSAGEeRROR
;** CHECK IF DESTINATION IS A DIRECTORY
+ JSR GETlASTaRG
JSR ISDIR
CPY #0
BEQ +
JMP COPYtOdIR
;** CHECK FOR EXACTLY THREE PARAMETERS
+ LDA ACEaRGC+1
BNE COPYuSAGEeRROR
LDA ACEaRGC
CMP #3
BNE COPYuSAGEeRROR
;** GET BUFFER PARAMETERS
LDA #1
LDY #0
JSR GETARG
LDA ZP
LDY ZP+1
STA COPYiNnAME
STY COPYiNnAME+1
LDA #2
LDY #0
JSR GETARG
LDA ZP
LDY ZP+1
STA COPYoUTnAME
STY COPYoUTnAME+1
JSR COPYFILE
RTS
COPYuSAGEeRROR = *
LDA #<COPYuSAGEeRRORmSG
LDY #>COPYuSAGEeRRORmSG
LDX #STDERR
JSR FPUTS
RTS
COPYuSAGEeRRORmSG = *
.ASC "USAGE: CP FROMFILE TOFILE"
.BYTE CHRcr
.ASC " CP FROMFILE1 FROM2 ...FROMn TODIR"
.BYTE CHRcr,0
COPYFILE = *
;** OPEN FILES
LDA COPYiNnAME
LDY COPYiNnAME+1
STA ZP
STY ZP+1
LDA #"R"
JSR OPEN
BCC +
LDA COPYiNnAME
LDY COPYiNnAME+1
JMP COPYoPENeRROR
+ STA COPYiNfILE
COPYFILEoUTPUT = *
LDA COPYoUTnAME
LDY COPYoUTnAME+1
STA ZP
STY ZP+1
LDA #"W"
JSR OPEN
BCC COPYwRITEoK
LDA ERRNO
CMP #ACEeRRfILEeXISTS
BEQ +
- LDA COPYiNfILE
JSR CLOSE
LDA COPYoUTnAME
LDY COPYoUTnAME+1
JMP COPYoPENeRROR
+ JSR COPYaSKoVERWRITE
BEQ +
LDA COPYiNfILE
JSR CLOSE
SEC
RTS
+ JSR COPYrEMOVEoUTFILE
JMP COPYFILEoUTPUT
COPYwRITEoK = *
STA COPYoUTfILE
JSR COPYfILEcONTENTS
LDA COPYoUTfILE
JSR CLOSE
LDA COPYiNfILE
JSR CLOSE
RTS
COPYaSKoVERWRITE = * ;() : .cs=QUIT, .eq=YES, .ne=NO
LDA OVERWRITEaLLfLAG
BEQ +
LDA #0
RTS
/ LDA #<COPYaSKoVERWRITEmSG
LDY #>COPYaSKoVERWRITEmSG
JSR PUTS
LDA COPYoUTnAME
LDY COPYoUTnAME+1
JSR PUTS
LDA #<COPYaSKoVERWRITEmSG2
LDY #>COPYaSKoVERWRITEmSG2
JSR PUTS
JSR GETCHAR
CMP #CHRcr
BEQ -
PHA
- JSR GETCHAR
CMP #CHRcr
BNE -
PLA
CMP #"Q"
BNE +
- LDA #$FF
STA ABORTfLAG
SEC
RTS
+ CMP #"q"
BEQ -
CMP #"A"
BNE +
- LDA #$FF
STA OVERWRITEaLLfLAG
LDA #"Y"
+ CMP #"a"
BEQ -
CMP #"Y"
BEQ +
CMP #"y"
+ CLC
RTS
COPYaSKoVERWRITEmSG = *
.ASC "oVERWRITE "
.BYTE CHRqUOTE,0
COPYaSKoVERWRITEmSG2 = *
.BYTE CHRqUOTE
.ASC " (Y/N/A/Q)? "
.BYTE 0
COPYrEMOVEoUTFILE = *
LDA COPYoUTnAME
LDY COPYoUTnAME+1
STA ZP
STY ZP+1
JSR REMOVE
RTS
COPYfILEcONTENTS = *
;** COPY FILE CONTENTS
LDA COPYbUFFERpTR
LDY COPYbUFFERpTR+1
STA ZP
STY ZP+1
- LDA COPYbUFFERlENGTH
LDY COPYbUFFERlENGTH+1
LDX COPYiNfILE
JSR READ
BCS COPYfILEeRROR
BEQ +
LDX COPYoUTfILE
JSR WRITE
BCC -
BCS COPYfILEeRROR
+ RTS
COPYoPENnAME = 14
COPYoPENeRROR = *
STA COPYoPENnAME
STY COPYoPENnAME+1
LDA #<COPYoPENeRRORmSG1
LDY #>COPYoPENeRRORmSG1
LDX #STDERR
JSR FPUTS
LDA COPYoPENnAME
LDY COPYoPENnAME+1
LDX #STDERR
JSR FPUTS
LDA #<COPYoPENeRRORmSG2
LDY #>COPYoPENeRRORmSG2
LDX #STDERR
JSR FPUTS
RTS
COPYoPENeRRORmSG1 = *
.ASC "eRROR OPENING FILE "
.BYTE CHRqUOTE
.BYTE 0
COPYoPENeRRORmSG2 = *
.BYTE CHRqUOTE
.BYTE CHRcr
.BYTE 0
COPYfILEeRROR = *
LDA #<COPYfILEeRRORmSG
LDY #>COPYfILEeRRORmSG
LDX #STDERR
JMP FPUTS
COPYfILEeRRORmSG = *
.ASC "fILE DATA ERROR!"
.BYTE CHRcr
.BYTE 0
COPYaRG = 12
LASTaRG = 14
COPYtOdIR = *
LDA #1
LDY #0
STA COPYaRG
STY COPYaRG+1
- LDA ACEaRGC
LDY ACEaRGC+1
SEC
SBC #1
BCS +
DEY
+ CMP COPYaRG
BNE +
CPY COPYaRG+1
BEQ COPYtOdIReXIT
+ JSR STOPKEY
BCS COPYtOdIRsTOPPED
LDA COPYaRG
LDY COPYaRG+1
JSR GETARG
LDA ZP
LDY ZP+1
STA COPYiNnAME
STY COPYiNnAME+1
JSR COPYfILEtOdIR
LDA ABORTfLAG
BNE COPYtOdIRsTOPPED
INC COPYaRG
BNE +
INC COPYaRG+1
+ JMP -
COPYtOdIReXIT = *
RTS
COPYtOdIRsTOPPED = *
LDA #<STOPPEDmSG
LDY #>STOPPEDmSG
JSR EPUTS
RTS
STOPPEDmSG = *
.ASC "<sTOPPED>"
.BYTE CHRcr,0
SCANpOS = 6
COPYfILEtOdIR = *
;** GENERATE OUTPUT FILE NAME
JSR GETlASTaRG
LDY #0
- LDA (ZP),Y
BEQ +
STA COPYnAMEbUF,Y
INY
BNE -
+ TYA
TAX
;** EXTRACT BASENAME
LDY #0
STY SCANpOS
- LDA (COPYiNnAME),Y
BEQ +
CMP #":"
BNE BASENAMEnEXT
INY
STY SCANpOS
DEY
BASENAMEnEXT = *
INY
BNE -
+ LDY SCANpOS
- LDA (COPYiNnAME),Y
STA COPYnAMEbUF,X
BEQ +
INX
INY
BNE -
;** COPY FILE
+ LDA #<COPYnAMEbUF
LDY #>COPYnAMEbUF
STA COPYoUTnAME
STY COPYoUTnAME+1
JSR COPYtOdIRsTATUS
JSR COPYFILE
RTS
NAMEsPACE .BUF 1
COPYtOdIRsTATUS = *
LDA COPYiNnAME
LDY COPYiNnAME+1
JSR PUTS
LDY #255
- INY
LDA (COPYiNnAME),Y
BNE -
TYA
- SEC
SBC #10
BCS -
ADC #10
STA NAMEsPACE
STA NAMEsPACE
SEC
LDA #10
SBC NAMEsPACE
STA NAMEsPACE
- LDA #" "
JSR PUTCHAR
DEC NAMEsPACE
BNE -
LDA COPYoUTnAME
LDY COPYoUTnAME+1
JSR PUTS
LDA #CHRcr
JSR PUTCHAR
RTS
;===THE END===
CPbSS = *
COPYnAMEbUF = CPbSS+0
CPeND = CPbSS+256
CRC32.S
394
;*** CRC32B PROGRAM - BY cRAIG bRUCE - 14-oCT-93
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:CRC32B"
JMP CRCmAIN
.BYTE ACEid1,ACEid2,ACEid3
;*** GLOBAL DECLARATIONS
LIBWORK = $40
CHRcr = $0D
CHRqUOTE = $22
CRCtABLE0 = *
.BYTE $00,$96,$2C,$BA,$19,$8F,$35,$A3,$32,$A4,$1E,$88,$2B,$BD,$07,$91
.BYTE $64,$F2,$48,$DE,$7D,$EB,$51,$C7,$56,$C0,$7A,$EC,$4F,$D9,$63,$F5
.BYTE $C8,$5E,$E4,$72,$D1,$47,$FD,$6B,$FA,$6C,$D6,$40,$E3,$75,$CF,$59
.BYTE $AC,$3A,$80,$16,$B5,$23,$99,$0F,$9E,$08,$B2,$24,$87,$11,$AB,$3D
.BYTE $90,$06,$BC,$2A,$89,$1F,$A5,$33,$A2,$34,$8E,$18,$BB,$2D,$97,$01
.BYTE $F4,$62,$D8,$4E,$ED,$7B,$C1,$57,$C6,$50,$EA,$7C,$DF,$49,$F3,$65
.BYTE $58,$CE,$74,$E2,$41,$D7,$6D,$FB,$6A,$FC,$46,$D0,$73,$E5,$5F,$C9
.BYTE $3C,$AA,$10,$86,$25,$B3,$09,$9F,$0E,$98,$22,$B4,$17,$81,$3B,$AD
.BYTE $20,$B6,$0C,$9A,$39,$AF,$15,$83,$12,$84,$3E,$A8,$0B,$9D,$27,$B1
.BYTE $44,$D2,$68,$FE,$5D,$CB,$71,$E7,$76,$E0,$5A,$CC,$6F,$F9,$43,$D5
.BYTE $E8,$7E,$C4,$52,$F1,$67,$DD,$4B,$DA,$4C,$F6,$60,$C3,$55,$EF,$79
.BYTE $8C,$1A,$A0,$36,$95,$03,$B9,$2F,$BE,$28,$92,$04,$A7,$31,$8B,$1D
.BYTE $B0,$26,$9C,$0A,$A9,$3F,$85,$13,$82,$14,$AE,$38,$9B,$0D,$B7,$21
.BYTE $D4,$42,$F8,$6E,$CD,$5B,$E1,$77,$E6,$70,$CA,$5C,$FF,$69,$D3,$45
.BYTE $78,$EE,$54,$C2,$61,$F7,$4D,$DB,$4A,$DC,$66,$F0,$53,$C5,$7F,$E9
.BYTE $1C,$8A,$30,$A6,$05,$93,$29,$BF,$2E,$B8,$02,$94,$37,$A1,$1B,$8D
CRCtABLE1 = *
.BYTE $00,$30,$61,$51,$C4,$F4,$A5,$95,$88,$B8,$E9,$D9,$4C,$7C,$2D,$1D
.BYTE $10,$20,$71,$41,$D4,$E4,$B5,$85,$98,$A8,$F9,$C9,$5C,$6C,$3D,$0D
.BYTE $20,$10,$41,$71,$E4,$D4,$85,$B5,$A8,$98,$C9,$F9,$6C,$5C,$0D,$3D
.BYTE $30,$00,$51,$61,$F4,$C4,$95,$A5,$B8,$88,$D9,$E9,$7C,$4C,$1D,$2D
.BYTE $41,$71,$20,$10,$85,$B5,$E4,$D4,$C9,$F9,$A8,$98,$0D,$3D,$6C,$5C
.BYTE $51,$61,$30,$00,$95,$A5,$F4,$C4,$D9,$E9,$B8,$88,$1D,$2D,$7C,$4C
.BYTE $61,$51,$00,$30,$A5,$95,$C4,$F4,$E9,$D9,$88,$B8,$2D,$1D,$4C,$7C
.BYTE $71,$41,$10,$20,$B5,$85,$D4,$E4,$F9,$C9,$98,$A8,$3D,$0D,$5C,$6C
.BYTE $83,$B3,$E2,$D2,$47,$77,$26,$16,$0B,$3B,$6A,$5A,$CF,$FF,$AE,$9E
.BYTE $93,$A3,$F2,$C2,$57,$67,$36,$06,$1B,$2B,$7A,$4A,$DF,$EF,$BE,$8E
.BYTE $A3,$93,$C2,$F2,$67,$57,$06,$36,$2B,$1B,$4A,$7A,$EF,$DF,$8E,$BE
.BYTE $B3,$83,$D2,$E2,$77,$47,$16,$26,$3B,$0B,$5A,$6A,$FF,$CF,$9E,$AE
.BYTE $C2,$F2,$A3,$93,$06,$36,$67,$57,$4A,$7A,$2B,$1B,$8E,$BE,$EF,$DF
.BYTE $D2,$E2,$B3,$83,$16,$26,$77,$47,$5A,$6A,$3B,$0B,$9E,$AE,$FF,$CF
.BYTE $E2,$D2,$83,$B3,$26,$16,$47,$77,$6A,$5A,$0B,$3B,$AE,$9E,$CF,$FF
.BYTE $F2,$C2,$93,$A3,$36,$06,$57,$67,$7A,$4A,$1B,$2B,$BE,$8E,$DF,$EF
CRCtABLE2 = *
.BYTE $00,$07,$0E,$09,$6D,$6A,$63,$64,$DB,$DC,$D5,$D2,$B6,$B1,$B8,$BF
.BYTE $B7,$B0,$B9,$BE,$DA,$DD,$D4,$D3,$6C,$6B,$62,$65,$01,$06,$0F,$08
.BYTE $6E,$69,$60,$67,$03,$04,$0D,$0A,$B5,$B2,$BB,$BC,$D8,$DF,$D6,$D1
.BYTE $D9,$DE,$D7,$D0,$B4,$B3,$BA,$BD,$02,$05,$0C,$0B,$6F,$68,$61,$66
.BYTE $DC,$DB,$D2,$D5,$B1,$B6,$BF,$B8,$07,$00,$09,$0E,$6A,$6D,$64,$63
.BYTE $6B,$6C,$65,$62,$06,$01,$08,$0F,$B0,$B7,$BE,$B9,$DD,$DA,$D3,$D4
.BYTE $B2,$B5,$BC,$BB,$DF,$D8,$D1,$D6,$69,$6E,$67,$60,$04,$03,$0A,$0D
.BYTE $05,$02,$0B,$0C,$68,$6F,$66,$61,$DE,$D9,$D0,$D7,$B3,$B4,$BD,$BA
.BYTE $B8,$BF,$B6,$B1,$D5,$D2,$DB,$DC,$63,$64,$6D,$6A,$0E,$09,$00,$07
.BYTE $0F,$08,$01,$06,$62,$65,$6C,$6B,$D4,$D3,$DA,$DD,$B9,$BE,$B7,$B0
.BYTE $D6,$D1,$D8,$DF,$BB,$BC,$B5,$B2,$0D,$0A,$03,$04,$60,$67,$6E,$69
.BYTE $61,$66,$6F,$68,$0C,$0B,$02,$05,$BA,$BD,$B4,$B3,$D7,$D0,$D9,$DE
.BYTE $64,$63,$6A,$6D,$09,$0E,$07,$00,$BF,$B8,$B1,$B6,$D2,$D5,$DC,$DB
.BYTE $D3,$D4,$DD,$DA,$BE,$B9,$B0,$B7,$08,$0F,$06,$01,$65,$62,$6B,$6C
.BYTE $0A,$0D,$04,$03,$67,$60,$69,$6E,$D1,$D6,$DF,$D8,$BC,$BB,$B2,$B5
.BYTE $BD,$BA,$B3,$B4,$D0,$D7,$DE,$D9,$66,$61,$68,$6F,$0B,$0C,$05,$02
CRCtABLE3 = *
.BYTE $00,$77,$EE,$99,$07,$70,$E9,$9E,$0E,$79,$E0,$97,$09,$7E,$E7,$90
.BYTE $1D,$6A,$F3,$84,$1A,$6D,$F4,$83,$13,$64,$FD,$8A,$14,$63,$FA,$8D
.BYTE $3B,$4C,$D5,$A2,$3C,$4B,$D2,$A5,$35,$42,$DB,$AC,$32,$45,$DC,$AB
.BYTE $26,$51,$C8,$BF,$21,$56,$CF,$B8,$28,$5F,$C6,$B1,$2F,$58,$C1,$B6
.BYTE $76,$01,$98,$EF,$71,$06,$9F,$E8,$78,$0F,$96,$E1,$7F,$08,$91,$E6
.BYTE $6B,$1C,$85,$F2,$6C,$1B,$82,$F5,$65,$12,$8B,$FC,$62,$15,$8C,$FB
.BYTE $4D,$3A,$A3,$D4,$4A,$3D,$A4,$D3,$43,$34,$AD,$DA,$44,$33,$AA,$DD
.BYTE $50,$27,$BE,$C9,$57,$20,$B9,$CE,$5E,$29,$B0,$C7,$59,$2E,$B7,$C0
.BYTE $ED,$9A,$03,$74,$EA,$9D,$04,$73,$E3,$94,$0D,$7A,$E4,$93,$0A,$7D
.BYTE $F0,$87,$1E,$69,$F7,$80,$19,$6E,$FE,$89,$10,$67,$F9,$8E,$17,$60
.BYTE $D6,$A1,$38,$4F,$D1,$A6,$3F,$48,$D8,$AF,$36,$41,$DF,$A8,$31,$46
.BYTE $CB,$BC,$25,$52,$CC,$BB,$22,$55,$C5,$B2,$2B,$5C,$C2,$B5,$2C,$5B
.BYTE $9B,$EC,$75,$02,$9C,$EB,$72,$05,$95,$E2,$7B,$0C,$92,$E5,$7C,$0B
.BYTE $86,$F1,$68,$1F,$81,$F6,$6F,$18,$88,$FF,$66,$11,$8F,$F8,$61,$16
.BYTE $A0,$D7,$4E,$39,$A7,$D0,$49,$3E,$AE,$D9,$40,$37,$A9,$DE,$47,$30
.BYTE $BD,$CA,$53,$24,$BA,$CD,$54,$23,$B3,$C4,$5D,$2A,$B4,$C3,$5A,$2D
;******** STANDARD LIBRARY ********
PUTS = *
LDX #STDOUT
FPUTS = *
STA ZP+0
STY ZP+1
LDY #$FF
- INY
LDA (ZP),Y
BNE -
TYA
LDY #0
JMP WRITE
EPUTS = *
LDX #STDERR
JMP FPUTS
PUTCHAR = *
LDX #STDOUT
PUTC = *
STA PUTCbUFFER
LDA #<PUTCbUFFER
LDY #>PUTCbUFFER
STA ZP+0
STY ZP+1
LDA #1
LDY #0
JMP WRITE
PUTCbUFFER .BUF 1
GETCHAR = *
LDX #STDIN
GETC = *
LDA #<GETCbUFFER
LDY #>GETCbUFFER
STA ZP+0
STY ZP+1
LDA #1
LDY #0
JSR READ
BEQ +
LDA GETCbUFFER
RTS
+ SEC
RTS
GETCbUFFER .BUF 1
GETARG = *
STY ZP+1
ASL
STA ZP+0
ROL ZP+1
CLC
LDA ACEaRGV
ADC ZP+0
STA ZP+0
LDA ACEaRGV+1
ADC ZP+1
STA ZP+1
LDY #0
LDA (ZP),Y
TAX
INY
LDA (ZP),Y
STX ZP+0
STA ZP+1
RTS
;===CRC32===
CRCaRG = 2
CRCnAME = 4
INbUFlEN = 6
CRCmAIN = *
;** CHECK ARGUMENT COUNT
LDA ACEaRGC+1
BNE CRCeNOUGHaRGS
LDA ACEaRGC+0
CMP #2
BCS CRCeNOUGHaRGS
CRCuSAGE = *
LDA #<CRCuSAGEmSG
LDY #>CRCuSAGEmSG
JMP EPUTS
CRCuSAGEmSG = *
.ASC "uSAGE: CRC32B FILE1 FILE2 ... FILEn"
.BYTE CHRcr
.BYTE 0
CRCeNOUGHaRGS = *
;** GET INPUT BUFFER LENGTH
SEC
LDA ACEsTACKpTR+0
SBC #<CRCiNbUF
STA INbUFlEN+0
LDA ACEsTACKpTR+1
SBC #>CRCiNbUF
STA INbUFlEN+1
;** MAIN LOOP
LDA #1
LDY #0
STA CRCaRG+0
STY CRCaRG+1
- JSR STOPKEY
BCS CRCsTOPPED
LDA CRCaRG+0
LDY CRCaRG+1
JSR GETARG
LDA ZP+0
LDY ZP+1
STA CRCnAME
STY CRCnAME+1
ORA ZP+1
BEQ CRCeXIT
JSR CRC32
BCC +
JSR CRCeRROR
+ INC CRCaRG+0
BNE +
INC CRCaRG+1
+ JMP -
CRCeXIT = *
RTS
CRCsTOPPED = *
LDA #<STOPPEDmSG
LDY #>STOPPEDmSG
JSR EPUTS
RTS
STOPPEDmSG = *
.ASC "<sTOPPED>"
.BYTE CHRcr,0
CRCeRROR = *
LDA #<CRCeRRORmSG1
LDY #>CRCeRRORmSG1
JSR EPUTS
LDA CRCnAME+0
LDY CRCnAME+1
JSR EPUTS
LDA #<CRCeRRORmSG2
LDY #>CRCeRRORmSG2
JMP EPUTS
CRCeRRORmSG1 = *
.ASC "eRROR READING FILE "
.BYTE CHRqUOTE,0
CRCeRRORmSG2 = *
.BYTE CHRqUOTE,CHRcr,0
BUFpTR = 8
BUFcOUNT = 10
INFILE = 12
CRC32 = *
;** OPEN FILE
LDA CRCnAME+0
LDY CRCnAME+1
STA ZP+0
STY ZP+1
LDA #"R"
JSR OPEN
BCC +
RTS
+ STA INFILE
;** ENCODE FILE
JSR CRCbODY
;** CLOSE FILE
LDA INFILE
JSR CLOSE
RTS
CH = 13 ;(1)
CRCaCCUM = 34 ;(4)
CRCtEMP = 38 ;(4)
CRCbODY = *
LDX #3
LDA #$FF
- STA CRCaCCUM,X
DEX
BPL -
LDA #0
STA BUFcOUNT+0
STA BUFcOUNT+1
;***SCAN FILE
NEXTcHAR = *
JSR GETbYTE
BCS CRCpRINT
STA CH
;** CRC = 0Xffffffff;
;** WHILE( (C=GETC(FP)) != eof ) {$7b}
;** CRC = (CRC>>8) & 0X00ffffff ^ CRCtABLE[ (CRC^C) & 0Xff ];
;** {$7d}
;** RETURN( CRC^0Xffffffff );
LDA CRCaCCUM+0 ;.x = (CRC^C) & 0Xff
EOR CH
TAX
LDA CRCaCCUM+1 ;CRC = (CRC>>8) & 0X00ffffff ^ CRCtABLE[ .x ]
EOR CRCtABLE0,X
STA CRCaCCUM+0
LDA CRCaCCUM+2
EOR CRCtABLE1,X
STA CRCaCCUM+1
LDA CRCaCCUM+3
EOR CRCtABLE2,X
STA CRCaCCUM+2
LDA CRCtABLE3,X
STA CRCaCCUM+3
JMP NEXTcHAR
CRCpRINT = *
LDA #<RESmSG1+8
LDY #>RESmSG1+8
STA SYSWORK+0
STY SYSWORK+1
LDY #9
LDX #3
- LDA CRCaCCUM,X
EOR #$FF
PHA
LSR
LSR
LSR
LSR
JSR PUThEX
PLA
JSR PUThEX
DEX
BPL -
LDA #<RESmSG1
LDY #>RESmSG1
JSR PUTS
LDA CRCnAME+0
LDY CRCnAME+1
JSR PUTS
LDA #<RESmSG2
LDY #>RESmSG2
JSR PUTS
CLC
RTS
PUThEX = *
AND #$0F
ORA #$30
CMP #$3A
BCC +
ADC #6
+ STA RESmSG1,Y
INY
RTS
RESmSG1 = *
.ASC "CRC32B = 12345678 FOR "
.BYTE CHRqUOTE,0
RESmSG2 = *
.BYTE CHRqUOTE,CHRcr,0
GETbYTE = *
LDA BUFcOUNT+0
ORA BUFcOUNT+1
BEQ GETbYTEfILLbUF
LDY #0
LDA (BUFpTR),Y
INC BUFpTR
BNE +
INC BUFpTR+1
+ LDX BUFcOUNT+0
BNE +
DEC BUFcOUNT+1
+ DEC BUFcOUNT+0
CLC
RTS
GETbYTEfILLbUF = *
LDA #<CRCiNbUF
LDY #>CRCiNbUF
STA ZP+0
STY ZP+1
STA BUFpTR+0
STY BUFpTR+1
LDA INbUFlEN+0
LDY INbUFlEN+1
LDX INFILE
JSR READ
BEQ +
BCS +
STA BUFcOUNT+0
STY BUFcOUNT+1
JMP GETbYTE
+ SEC
RTS
;===THE END===
CRCbSS = *
CRCiNbUF = CRCbSS
CRC32A.S
308
;*** CRC32A PROGRAM - BY cRAIG bRUCE
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:CRC32A"
JMP CRCmAIN
.ASC "Cb"
;*** GLOBAL DECLARATIONS
LIBWORK = $40
CHRcr = $0D
CHRqUOTE = $22
;******** STANDARD LIBRARY ********
PUTS = *
LDX #STDOUT
FPUTS = *
STA ZP
STY ZP+1
LDY #$FF
- INY
LDA (ZP),Y
BNE -
TYA
LDY #0
JMP WRITE
EPUTS = *
LDX #STDERR
JMP FPUTS
PUTCHAR = *
LDX #STDOUT
PUTC = *
STA PUTCbUFFER
LDA #<PUTCbUFFER
LDY #>PUTCbUFFER
STA ZP
STY ZP+1
LDA #1
LDY #0
JMP WRITE
PUTCbUFFER .BUF 1
GETCHAR = *
LDX #STDIN
GETC = *
LDA #<GETCbUFFER
LDY #>GETCbUFFER
STA ZP
STY ZP+1
LDA #1
LDY #0
JSR READ
BEQ +
LDA GETCbUFFER
RTS
+ SEC
RTS
GETCbUFFER .BUF 1
GETARG = *
STY ZP+1
ASL
STA ZP
ROL ZP+1
CLC
LDA ACEaRGV
ADC ZP
STA ZP
LDA ACEaRGV+1
ADC ZP+1
STA ZP+1
LDY #0
LDA (ZP),Y
TAX
INY
LDA (ZP),Y
STX ZP
STA ZP+1
RTS
;===CRC32===
CRCaRG = 2
CRCnAME = 4
INbUFlEN = 6
CRCmAIN = *
;** CHECK ARGUMENT COUNT
LDA ACEaRGC+1
BNE CRCeNOUGHaRGS
LDA ACEaRGC
CMP #2
BCS CRCeNOUGHaRGS
CRCuSAGE = *
LDA #<CRCuSAGEmSG
LDY #>CRCuSAGEmSG
JMP EPUTS
CRCuSAGEmSG = *
.ASC "uSAGE: CRC32 FILE1 FILE2 ... FILEn"
.BYTE CHRcr
.BYTE 0
CRCeNOUGHaRGS = *
;** GET INPUT BUFFER LENGTH
SEC
LDA ACEsTACKpTR
SBC #<CRCiNbUF
STA INbUFlEN
LDA ACEsTACKpTR+1
SBC #>CRCiNbUF
STA INbUFlEN+1
;** MAIN LOOP
LDA #1
LDY #0
STA CRCaRG
STY CRCaRG+1
- JSR STOPKEY
BCS CRCsTOPPED
LDA CRCaRG
LDY CRCaRG+1
JSR GETARG
LDA ZP
LDY ZP+1
STA CRCnAME
STY CRCnAME+1
ORA ZP+1
BEQ CRCeXIT
JSR CRC32
BCC +
JSR CRCeRROR
+ INC CRCaRG
BNE +
INC CRCaRG+1
+ JMP -
CRCeXIT = *
RTS
CRCsTOPPED = *
LDA #<STOPPEDmSG
LDY #>STOPPEDmSG
JSR EPUTS
RTS
STOPPEDmSG = *
.ASC "<sTOPPED>"
.BYTE CHRcr,0
CRCeRROR = *
LDA #<CRCeRRORmSG1
LDY #>CRCeRRORmSG1
JSR EPUTS
LDA CRCnAME
LDY CRCnAME+1
JSR EPUTS
LDA #<CRCeRRORmSG2
LDY #>CRCeRRORmSG2
JMP EPUTS
CRCeRRORmSG1 = *
.ASC "eRROR READING FILE "
.BYTE CHRqUOTE,0
CRCeRRORmSG2 = *
.BYTE CHRqUOTE,CHRcr,0
BUFpTR = 8
BUFcOUNT = 10
INFILE = 12
CRC32 = *
;** OPEN FILE
LDA CRCnAME
LDY CRCnAME+1
STA ZP
STY ZP+1
LDA #"R"
JSR OPEN
BCC +
RTS
+ STA INFILE
;** ENCODE FILE
JSR CRCbODY
;** CLOSE FILE
LDA INFILE
JSR CLOSE
RTS
;CRC32 VERSION 1.0 FOR THE c-128 AND c-64 BY cRAIG bRUCE 23-mAY-92
CH = 13 ;(1)
CRCaCCUM = 34 ;(4)
CRClOW = $B7
CRCmID1 = $1D
CRCmID2 = $C1
CRChIGH = $04
CRCbODY = *
LDX #3
LDA #0
- STA CRCaCCUM,X
DEX
BPL -
STA BUFcOUNT
STA BUFcOUNT+1
;***SCAN FILE
NEXTcHAR = *
JSR GETbYTE
BCS CRCpRINT
STA CH
LDX #8
NEXTbIT = *
ASL CH
ROL CRCaCCUM+0
ROL CRCaCCUM+1
ROL CRCaCCUM+2
ROL CRCaCCUM+3
BCC +
LDA CRCaCCUM+0
EOR #CRClOW
STA CRCaCCUM+0
LDA CRCaCCUM+1
EOR #CRCmID1
STA CRCaCCUM+1
LDA CRCaCCUM+2
EOR #CRCmID2
STA CRCaCCUM+2
LDA CRCaCCUM+3
EOR #CRChIGH
STA CRCaCCUM+3
+ DEX
BNE NEXTbIT
JMP NEXTcHAR
CRCpRINT = *
LDA #<RESmSG1+9
LDY #>RESmSG1+9
STA SYSWORK+0
STY SYSWORK+1
LDX #CRCaCCUM
LDA #10
JSR UTOA
LDA #" "
STA RESmSG1+19
LDA #<RESmSG1
LDY #>RESmSG1
JSR PUTS
LDA CRCnAME
LDY CRCnAME+1
JSR PUTS
LDA #<RESmSG2
LDY #>RESmSG2
JSR PUTS
CLC
RTS
RESmSG1 = *
.ASC "CRC32A = 1234567890 FOR "
.BYTE CHRqUOTE,0
RESmSG2 = *
.BYTE CHRqUOTE,CHRcr,0
GETbYTE = *
LDA BUFcOUNT
ORA BUFcOUNT+1
BEQ GETbYTEfILLbUF
LDY #0
LDA (BUFpTR),Y
INC BUFpTR
BNE +
INC BUFpTR+1
+ LDX BUFcOUNT
BNE +
DEC BUFcOUNT+1
+ DEC BUFcOUNT
CLC
RTS
GETbYTEfILLbUF = *
LDA #<CRCiNbUF
LDY #>CRCiNbUF
STA ZP
STY ZP+1
STA BUFpTR
STY BUFpTR+1
LDA INbUFlEN
LDY INbUFlEN+1
LDX INFILE
JSR READ
BEQ +
BCS +
STA BUFcOUNT
STY BUFcOUNT+1
JMP GETbYTE
+ SEC
RTS
;===THE END===
CRCbSS = *
CRCiNbUF = CRCbSS
DATE.S
58
;DATE PROGRAM
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@:DATE"
JMP MAIN
.ASC "Cb"
MAIN = *
LDA #<DATEbUF
LDY #>DATEbUF
JSR GETDATE
LDY #7
- LDA DATEbUF,Y
JSR GETASC
PHA
TXA
LDX DATEnUMfIELDS,Y
STA DATEnUM+1,X
PLA
STA DATEnUM,X
DEY
BPL -
LDA #13
STA DATEnUM+21
LDA #<DATEnUM
LDY #>DATEnUM
STA ZP
STY ZP+1
LDA #22
LDY #0
LDX #STDOUT
JMP WRITE
GETASC = * ;( .a=BCD ) : .a=ASCHI, .x=ASCLO
PHA
AND #$0F
ORA #$30
TAX
PLA
LSR
LSR
LSR
LSR
ORA #$30
RTS
DATEnUM = *
;0123456789012345678901
.ASC "1993/05/16-18:04:50.3Z"
DATEnUMfIELDS = *
.BYTE 0,2,5,8,11,14,17,20
DATEsTR = *
;0123456789012345678901234567
.ASC "sUN-16-mAY-1993 06:03:50 PM"
.BYTE 0
DATEbUF = *
EIGHTY.S
10
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:EIGHTY"
JMP MAIN
.ASC "Cb"
MAIN = *
LDA #80
JMP CONSCREEN
FAST.S
14
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:FAST"
JMP MAIN
.ASC "Cb"
MAIN = *
LDA $D011
AND #%11101111
STA $D011
LDA #$01
STA $D030
RTS
FORTY.S
10
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:FORTY"
JMP MAIN
.ASC "Cb"
MAIN = *
LDA #40
JMP CONSCREEN
GREP.S
507
;*** GREP PROGRAM
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:GREP"
JMP GREPmAIN
.ASC "Cb"
;*** GLOBAL DECLARATIONS
LIBWORK = $40
CHRcr = $0D
CHRqUOTE = $22
MAXlINElEN = 2049
INVERSEfLAG .BUF 1
IGNOREcASEfLAG .BUF 1
DISPLAYfILENAMEfLAG .BUF 1
ANCHORlEFTfLAG .BUF 1
ANCHORrIGHTfLAG .BUF 1
STRINGlEN .BUF 1
;******** STANDARD LIBRARY ********
PUTS = *
LDX #STDOUT
FPUTS = *
STA ZP
STY ZP+1
LDY #$FF
- INY
LDA (ZP),Y
BNE -
TYA
LDY #0
JMP WRITE
EPUTS = *
LDX #STDERR
JMP FPUTS
PUTCHAR = *
LDX #STDOUT
PUTC = *
STA PUTCbUFFER
LDA #<PUTCbUFFER
LDY #>PUTCbUFFER
STA ZP
STY ZP+1
LDA #1
LDY #0
JMP WRITE
PUTCbUFFER .BUF 1
GETCHAR = *
LDX #STDIN
GETC = *
LDA #<GETCbUFFER
LDY #>GETCbUFFER
STA ZP
STY ZP+1
LDA #1
LDY #0
JSR READ
BEQ +
LDA GETCbUFFER
RTS
+ SEC
RTS
GETCbUFFER .BUF 1
GETARG = *
STY ZP+1
ASL
STA ZP
ROL ZP+1
CLC
LDA ACEaRGV
ADC ZP
STA ZP
LDA ACEaRGV+1
ADC ZP+1
STA ZP+1
LDY #0
LDA (ZP),Y
TAX
INY
LDA (ZP),Y
STX ZP
STA ZP+1
RTS
;===GREP===
GREPaRG = 2
GREPnAME = 4
INbUFlEN = 6
GREPsTRING = 8
GREPmAIN = *
;** CHECK ARGUMENT COUNT
LDA #0
STA INVERSEfLAG
STA IGNOREcASEfLAG
STA DISPLAYfILENAMEfLAG
STA ANCHORlEFTfLAG
STA ANCHORrIGHTfLAG
LDA ACEaRGC+1
BNE GREPeNOUGHaRGS
LDA ACEaRGC
CMP #3
BCS GREPeNOUGHaRGS
GREPuSAGE = *
LDA #<GREPuSAGEmSG
LDY #>GREPuSAGEmSG
JMP EPUTS
GREPuSAGEmSG = *
.ASC "USAGE: GREP [-[I][V]] [^]SUBSTR[$] FILES"
.BYTE CHRcr,0
GREPeNOUGHaRGS = *
;** GET INPUT BUFFER LENGTH
SEC
LDA ACEsTACKpTR
SBC #<GREPiNbUF
STA INbUFlEN
LDA ACEsTACKpTR+1
SBC #>GREPiNbUF
STA INbUFlEN+1
;** MAIN LOOP
LDA #1
LDY #0
STA GREPaRG
STY GREPaRG+1
JSR GETARG
LDY #0
LDA (ZP),Y
CMP #"-"
BNE SUBSTRaRG
INC GREPaRG
- INY
LDA (ZP),Y
BEQ SUBSTRaRG
CMP #"I"
BNE +
LDA #$FF
STA IGNOREcASEfLAG
+ CMP #"V"
BNE +
LDA #$FF
STA INVERSEfLAG
+ JMP -
SUBSTRaRG = *
LDA GREPaRG
LDY #0
JSR GETARG
LDA ZP
LDY ZP+1
STA GREPsTRING
STY GREPsTRING+1
BIT IGNOREcASEfLAG
BPL +
JSR FOLDsTRING
+ JSR CHECKaNCHORS
INC GREPaRG
FIRSTaRG = *
LDA GREPaRG
LDY #0
JSR GETARG
LDA ZP
ORA ZP+1
BNE +
JMP GREPuSAGE
+ CLC
LDA GREPaRG
ADC #1
LDY #0
JSR GETARG
LDA ZP
ORA ZP+1
BEQ NEXTaRG
LDA #$FF
STA DISPLAYfILENAMEfLAG
NEXTaRG = *
JSR STOPKEY
BCS GREPsTOPPED
LDA GREPaRG
LDY GREPaRG+1
JSR GETARG
LDA ZP
LDY ZP+1
STA GREPnAME
STY GREPnAME+1
ORA ZP+1
BEQ GREPeXIT
JSR GREP
BCC +
JSR GREPeRROR
+ INC GREPaRG
BNE +
INC GREPaRG+1
+ JMP NEXTaRG
GREPeXIT = *
RTS
FOLDsTRING = *
LDY #0
- LDA (GREPsTRING),Y
BNE +
RTS
+ CMP #"a"
BCC +
CMP #"z"+1
BCS +
SEC
SBC #"a"-"A"
STA (GREPsTRING),Y
+ INY
BNE -
RTS
CHECKaNCHORS = *
LDY #0
LDA (GREPsTRING),Y
CMP #"^"
BNE +
LDA #$FF
STA ANCHORlEFTfLAG
INC GREPsTRING
BNE +
INC GREPsTRING+1
+ LDY #255
- INY
LDA (GREPsTRING),Y
BNE -
STY STRINGlEN
DEY
CPY #255
BEQ +
LDA (GREPsTRING),Y
CMP #"$"
BNE +
LDA #$FF
STA ANCHORrIGHTfLAG
LDA #0
STA (GREPsTRING),Y
STY STRINGlEN
+ RTS
GREPsTOPPED = *
LDA #<STOPPEDmSG
LDY #>STOPPEDmSG
JSR EPUTS
RTS
STOPPEDmSG = *
.ASC "<sTOPPED>"
.BYTE CHRcr,0
GREPeRROR = *
LDA #<GREPeRRORmSG1
LDY #>GREPeRRORmSG1
JSR EPUTS
LDA GREPnAME
LDY GREPnAME+1
JSR EPUTS
LDA #<GREPeRRORmSG2
LDY #>GREPeRRORmSG2
JMP EPUTS
GREPeRRORmSG1 = *
.ASC "eRROR READING FILE "
.BYTE CHRqUOTE,0
GREPeRRORmSG2 = *
.BYTE CHRqUOTE,CHRcr,0
BUFpTR = 10
BUFcOUNT = 12
INFILE = 14
GREP = *
;** OPEN FILE
LDA GREPnAME
LDY GREPnAME+1
STA ZP
STY ZP+1
LDA #"R"
JSR OPEN
BCC +
RTS
+ STA INFILE
;** ENCODE FILE
JSR GREPbODY
;** CLOSE FILE
LDA INFILE
JSR CLOSE
RTS
LINElEN = $40 ;(2)
LINEpTR = $42 ;(2)
GREPbODY = *
LDA #0
STA BUFcOUNT
STA BUFcOUNT+1
- JSR GETLINE
BCC +
RTS
+ JSR CHECKlINE
BIT INVERSEfLAG
BMI +
BCC -
JSR WRITElINE
JMP -
+ BCS -
JSR WRITElINE
JMP -
LINErESET = $44 ;(2)
STRINGpOS = $46 ;(1)
CHECKlINE = * ;() : .cc=NO_MATCH, .cs=MATCH
BIT ANCHORrIGHTfLAG
BPL CHECKsUBSTR
CLC
LDA LINEpTR
ADC LINElEN
STA LINEpTR
LDA LINEpTR+1
ADC LINElEN+1
STA LINEpTR+1
SEC
LDA LINEpTR
SBC STRINGlEN
STA LINEpTR
LDA LINEpTR+1
SBC #0
STA LINEpTR+1
CHECKsUBSTR = *
LDA LINEpTR
LDY LINEpTR+1
STA LINErESET
STY LINErESET+1
INC LINErESET
BNE +
INC LINErESET+1
+ LDY #0
STY STRINGpOS
CHECKcHAR = *
+ LDY STRINGpOS
LDA (GREPsTRING),Y
BEQ ENDoFsTRING
LDY #0
CMP (LINEpTR),Y
BNE MISMATCH
- INC STRINGpOS
INC LINEpTR
BNE +
INC LINEpTR+1
+ JMP CHECKcHAR
MISMATCH = *
LDY #0
LDA (LINEpTR),Y
BEQ ENDoFlINE
BIT IGNOREcASEfLAG
BPL +
CMP #"a"
BCC +
CMP #"z"+1
BCS +
SEC
SBC #"a"-"A"
LDY STRINGpOS
CMP (GREPsTRING),Y
BEQ -
+ LDA LINErESET
LDY LINErESET+1
STA LINEpTR
STY LINEpTR+1
JMP CHECKsUBSTR
ENDoFlINE = *
CLC
RTS
ENDoFsTRING = *
BIT ANCHORlEFTfLAG
BMI +
SEC
RTS
+ LDA LINErESET
BNE +
DEC LINErESET+1
+ DEC LINErESET
LDA LINErESET
CMP #<GREPlINE
BNE ENDoFlINE
LDA LINErESET+1
CMP #>GREPlINE
BNE ENDoFlINE
SEC
RTS
WRITElINE = *
LDA DISPLAYfILENAMEfLAG
BEQ +
LDA GREPnAME
LDY GREPnAME+1
JSR PUTS
LDA #":"
JSR PUTCHAR
+ LDA #<GREPlINE
LDY #>GREPlINE
STA ZP
STY ZP+1
LDA LINElEN
LDY LINElEN+1
LDX #STDOUT
JSR WRITE
LDA #CHRcr
JSR PUTCHAR
RTS
GETLINE = * ;() : LINElEN, LINEpTR
;** IGNORES CHARS BEYOND MAX LINE LEN, IGNORES LAST LINE NOT ENDING IN cr,
;** LINE ENDS WITH \0
LDA #0
STA LINElEN
STA LINElEN+1
LDA #<GREPlINE
LDY #>GREPlINE
STA LINEpTR
STY LINEpTR+1
- JSR GETbYTE
BCC +
RTS
+ CMP #CHRcr
BNE +
LDA #0
LDY #0
STA (LINEpTR),Y
LDA #<GREPlINE
LDY #>GREPlINE
STA LINEpTR
STY LINEpTR+1
CLC
RTS
+ LDX LINElEN+1
CPX #>MAXlINElEN
BCS -
LDY #0
STA (LINEpTR),Y
INC LINEpTR
BNE +
INC LINEpTR+1
+ INC LINElEN
BNE +
INC LINElEN+1
+ JMP -
GETbYTE = *
LDA BUFcOUNT
ORA BUFcOUNT+1
BEQ GETbYTEfILLbUF
LDY #0
LDA (BUFpTR),Y
INC BUFpTR
BNE +
INC BUFpTR+1
+ LDX BUFcOUNT
BNE +
DEC BUFcOUNT+1
+ DEC BUFcOUNT
CLC
RTS
GETbYTEfILLbUF = *
LDA #<GREPiNbUF
LDY #>GREPiNbUF
STA ZP
STY ZP+1
STA BUFpTR
STY BUFpTR+1
LDA INbUFlEN
LDY INbUFlEN+1
LDX INFILE
JSR READ
BEQ +
BCS +
STA BUFcOUNT
STY BUFcOUNT+1
JMP GETbYTE
+ SEC
RTS
;===THE END===
GREPbSS = *
GREPlINE = GREPbSS
GREPiNbUF = GREPlINE+MAXlINElEN
INC.S
20
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:INC"
JMP MAIN
.ASC "Cb"
MAIN = *
LDA #15
LDX #255
LDY #0
- INC $D020
INY
BNE -
DEX
BNE -
SEC
SBC #1
BCS -
RTS
MEM.S
190
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@:MEM"
JMP MAIN
.ASC "Cb"
REP = 4
MAIN = *
LDA #<PROCESSmSG
LDY #>PROCESSmSG
JSR PUTS
LDA ACEpROCESSid
ORA #$30
JSR CHROUT
LDA #13
JSR CHROUT
JSR PRINTfREEMAP
JSR DISPLAYfREE
JSR DISPLAYtpa
RTS
PROCESSmSG = *
.ASC "pROCESSid="
.BYTE 0
DISPLAYfREE = *
LDA #<FREEmSG
LDY #>FREEmSG
JSR PUTS
LDA #<NUMBUF
LDY #>NUMBUF
STA SYSWORK+0
STY SYSWORK+1
LDA #10
LDX #$40
JSR UTOA
LDX #0
- LDA NUMBUF,X
BEQ +
JSR CHROUT
INX
BNE -
+ LDA #13
JSR CHROUT
RTS
FREEmSG = *
.ASC "dYNAMIC fREE ="
.BYTE 0
NUMBUF .BUF 12
DISPLAYtpa = *
LDA #<TPAfREE
LDY #>TPAfREE
JSR PUTS
LDA #<NUMBUF
LDY #>NUMBUF
STA SYSWORK+0
STY SYSWORK+1
LDA #0
STA 6
STA 7
SEC
LDA ACEsTACKpTR+0
SBC #<ACEaPPaDDRESS
STA 4
LDA ACEsTACKpTR+1
SBC #>ACEaPPaDDRESS
STA 5
LDA #10
LDX #4
JSR UTOA
LDX #0
- LDA NUMBUF,X
BEQ +
JSR CHROUT
INX
BNE -
+ LDA #13
JSR CHROUT
RTS
TPAfREE = *
.ASC "pROGRAM fREE ="
.BYTE 0
FREEMAP = 2
PRINTfREEMAP = *
LDA ACErAM0fREEMAP+0
LDY ACErAM0fREEMAP+1
INY ;FREEMAP
STA FREEMAP+0
STY FREEMAP+1
LDY #0
- LDX #"."
LDA (FREEMAP),Y
BEQ +
LDX #"*"
CMP #$FF
BEQ +
LDX #"#"
CMP #$FE
BEQ +
LDX #"+"
+ TXA
JSR CHROUT
INY
BNE -
LDA #13
JSR CHROUT
LDX #3
- LDA ACEfREEmEMORY,X
STA $40,X
DEX
BPL -
RTS
PRINTzP = *
LDX #3
- LDA ZP,X
JSR PRINThEX
DEX
BPL -
LDA #13
JSR CHROUT
RTS
PRINThEX = *
PHA
LSR
LSR
LSR
LSR
JSR PRINThEXIT
PLA
AND #$0F
PRINThEXIT = *
ORA #$30
CMP #$3A
BCC +
ADC #6
+ JSR CHROUT
RTS
CHROUT = *
STX SAVER+0
STY SAVER+1
STA CHAR
LDA ZP
PHA
LDA ZP+1
PHA
LDA #<CHAR
LDY #>CHAR
STA ZP
STY ZP+1
LDA #1
LDY #0
LDX #1
JSR WRITE
PLA
STA ZP+1
PLA
STA ZP
LDA CHAR
LDX SAVER+0
LDY SAVER+1
RTS
CHAR .BUF 1
SAVER .BUF 2
PUTS = *
LDX #STDOUT
FPUTS = *
STA ZP
STY ZP+1
LDY #$FF
- INY
LDA (ZP),Y
BNE -
TYA
LDY #0
JMP WRITE
EPUTS = *
LDX #STDERR
JMP FPUTS
MV.S
223
;*** MV (RENAME) PROGRAM
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:MV"
JMP MAIN
.BYTE ACEid1,ACEid2,ACEid3
;*** GLOBAL DECLARATIONS
CHRcr = $0D
CHRqUOTE = $22
;******** STANDARD LIBRARY ********
PUTS = *
LDX #STDOUT
FPUTS = *
STA ZP+0
STY ZP+1
LDY #$FF
- INY
LDA (ZP),Y
BNE -
TYA
LDY #0
JMP WRITE
EPUTS = *
LDX #STDERR
JMP FPUTS
PUTCHAR = *
LDX #STDOUT
PUTC = *
STA PUTCbUFFER
LDA #<PUTCbUFFER
LDY #>PUTCbUFFER
STA ZP+0
STY ZP+1
LDA #1
LDY #0
JMP WRITE
PUTCbUFFER .BUF 1
GETCHAR = *
LDX #STDIN
GETC = *
LDA #<GETCbUFFER
LDY #>GETCbUFFER
STA ZP+0
STY ZP+1
LDA #1
LDY #0
JSR READ
BEQ +
LDA GETCbUFFER
RTS
+ SEC
RTS
GETCbUFFER .BUF 1
GETARG = *
STY ZP+1
ASL
STA ZP+0
ROL ZP+1
CLC
LDA ACEaRGV
ADC ZP+0
STA ZP+0
LDA ACEaRGV+1
ADC ZP+1
STA ZP+1
LDY #0
LDA (ZP),Y
TAX
INY
LDA (ZP),Y
STX ZP+0
STA ZP+1
RTS
;===RENAME===
ARG = 2
OLDNAME = 4
NEWNAME = 6
MAIN = *
;** CHECK ARGUMENT COUNT
LDA ACEaRGC+1
BNE ENOUGHaRGS
LDA ACEaRGC+0
CMP #3
BCS ENOUGHaRGS
USAGE = *
LDA #<USAGEmSG
LDY #>USAGEmSG
JMP PUTS
USAGEmSG = *
.ASC "uSAGE: MV OLDNAME NEWNAME ..."
.BYTE CHRcr
.ASC " WHERE ... MEANS REPEAT NAMES IN OLD/NEW PAIRS"
.BYTE CHRcr,0
ENOUGHaRGS = *
LDA #1
LDY #0
STA ARG+0
STY ARG+1
MAINnEXT = *
LDA ARG+0
LDY ARG+1
JSR GETARG
LDA ZP+0
LDY ZP+1
STA OLDNAME+0
STY OLDNAME+1
ORA ZP+1
BEQ MAINeXIT
INC ARG+0
BNE +
INC ARG+1
+ LDA ARG+0
LDY ARG+1
JSR GETARG
LDA ZP+0
LDY ZP+1
STA NEWNAME+0
STY NEWNAME+1
ORA ZP+1
BEQ MAINeXIT
JSR CHECKSTOP
JSR ECHO
LDA OLDNAME+0
LDY OLDNAME+1
STA ZP+0
STY ZP+1
LDA NEWNAME+0
LDY NEWNAME+1
STA ZW+0
STY ZW+1
JSR RENAME
BCC +
JSR ERROR
+ INC ARG+0
BNE +
INC ARG+1
+ JMP MAINnEXT
MAINeXIT = *
RTS
CHECKSTOP = *
JSR STOPKEY
BCS +
RTS
+ LDA #<STOPPEDmSG
LDY #>STOPPEDmSG
JSR EPUTS
LDA #1
LDX #0
JMP EXIT
STOPPEDmSG = *
.ASC "<STOPPED>"
.BYTE CHRcr,0
ERROR = *
LDA #<ERRORmSG1
LDY #>ERRORmSG1
JSR EPUTS
LDA OLDNAME+0
LDY OLDNAME+1
JSR EPUTS
LDA #<ERRORmSG2
LDY #>ERRORmSG2
JMP EPUTS
ERRORmSG1 = *
.ASC "eRROR ATTEMPTING TO RENAME "
.BYTE CHRqUOTE,0
ERRORmSG2 = *
.BYTE CHRqUOTE,CHRcr,0
ECHO = *
LDA #<ECHOmSG1
LDY #>ECHOmSG1
JSR EPUTS
LDA OLDNAME+0
LDY OLDNAME+1
JSR EPUTS
LDA #<ECHOmSG2
LDY #>ECHOmSG2
JSR EPUTS
LDA NEWNAME+0
LDY NEWNAME+1
JSR EPUTS
LDA #<ECHOmSG3
LDY #>ECHOmSG3
JSR EPUTS
RTS
ECHOmSG1 = *
.ASC "rENAMING FILE "
.BYTE CHRqUOTE,0
ECHOmSG2 = *
.BYTE CHRqUOTE
.ASC " TO "
.BYTE CHRqUOTE,0
ECHOmSG3 = *
.BYTE CHRqUOTE,CHRcr,0
;===THE END===
BSS = *
BSSeND = BSS+0
READ.S
282
;*** FILE READER PROGRAM
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@:READ"
JMP CRCmAIN
.ASC "Cb"
;*** GLOBAL DECLARATIONS
LIBWORK = $40
CHRcr = $0D
CHRqUOTE = $22
;******** STANDARD LIBRARY ********
PUTS = *
LDX #STDOUT
FPUTS = *
STA ZP
STY ZP+1
LDY #$FF
- INY
LDA (ZP),Y
BNE -
TYA
LDY #0
JMP WRITE
EPUTS = *
LDX #STDERR
JMP FPUTS
PUTCHAR = *
LDX #STDOUT
PUTC = *
STA PUTCbUFFER
LDA #<PUTCbUFFER
LDY #>PUTCbUFFER
STA ZP
STY ZP+1
LDA #1
LDY #0
JMP WRITE
PUTCbUFFER .BUF 1
GETCHAR = *
LDX #STDIN
GETC = *
LDA #<GETCbUFFER
LDY #>GETCbUFFER
STA ZP
STY ZP+1
LDA #1
LDY #0
JSR READ
BEQ +
LDA GETCbUFFER
RTS
+ SEC
RTS
GETCbUFFER .BUF 1
GETARG = *
STY ZP+1
ASL
STA ZP
ROL ZP+1
CLC
LDA ACEaRGV
ADC ZP
STA ZP
LDA ACEaRGV+1
ADC ZP+1
STA ZP+1
LDY #0
LDA (ZP),Y
TAX
INY
LDA (ZP),Y
STX ZP
STA ZP+1
RTS
ITOAbIN = LIBWORK ;(4)
ITOAbCD = LIBWORK+4 ;(5)
ITOAfLAG = LIBWORK+9 ;(1)
ITOAnUMBER .BUF 11
ITOA = * ;( .x=NUMzPADDR ) : ITOAnUMBER
LDY #0
- LDA 0,X
STA ITOAbIN,Y
INX
INY
CPY #4
BCC -
LDX #5
LDA #0
- STA ITOAbCD,X ;ZEROS "ITOAfLAG" TOO
DEX
BPL -
LDY #32
SEI
SED
ITOAnEXTbIT = *
ASL ITOAbIN+0
ROL ITOAbIN+1
ROL ITOAbIN+2
ROL ITOAbIN+3
LDX #4
- LDA ITOAbCD,X
ADC ITOAbCD,X
STA ITOAbCD,X
DEX
BPL -
DEY
BNE ITOAnEXTbIT
CLD
CLI
LDX #0
LDY #0
- LDA ITOAbCD,X
JSR ITOApUThEX
INX
CPX #5
BCC -
LDA #0
STA ITOAnUMBER,Y
RTS
ITOApUThEX = *
PHA
LSR
LSR
LSR
LSR
JSR ITOApUTdIGIT
PLA
AND #$0F
ITOApUTdIGIT = *
CMP ITOAfLAG
BNE +
CPY #7
BCS +
LDA #$20
BNE ITOApOKE
+ ORA #$30
STA ITOAfLAG
ITOApOKE = *
STA ITOAnUMBER,Y
INY
RTS
;===CRC32===
CRCaRG = 2
CRCnAME = 4
INbUFlEN = 6
CRCmAIN = *
;** CHECK ARGUMENT COUNT
LDA ACEaRGC+1
BNE CRCeNOUGHaRGS
LDA ACEaRGC
CMP #2
BCS CRCeNOUGHaRGS
CRCuSAGE = *
LDA #<CRCuSAGEmSG
LDY #>CRCuSAGEmSG
JMP EPUTS
CRCuSAGEmSG = *
.ASC "USAGE: READ FILE1 FILE2 ... FILEn"
.BYTE CHRcr
.BYTE 0
CRCeNOUGHaRGS = *
;** GET INPUT BUFFER LENGTH
SEC
LDA ACEsTACKpTR
SBC #<CRCiNbUF
STA INbUFlEN
LDA ACEsTACKpTR+1
SBC #>CRCiNbUF
STA INbUFlEN+1
;** MAIN LOOP
LDA #1
LDY #0
STA CRCaRG
STY CRCaRG+1
- JSR STOPKEY
BCS CRCsTOPPED
LDA CRCaRG
LDY CRCaRG+1
JSR GETARG
LDA ZP
LDY ZP+1
STA CRCnAME
STY CRCnAME+1
ORA ZP+1
BEQ CRCeXIT
JSR DOrEAD
BCC +
JSR CRCeRROR
+ INC CRCaRG
BNE +
INC CRCaRG+1
+ JMP -
CRCeXIT = *
RTS
CRCsTOPPED = *
LDA #<STOPPEDmSG
LDY #>STOPPEDmSG
JSR EPUTS
RTS
STOPPEDmSG = *
.ASC "<sTOPPED>"
.BYTE CHRcr,0
CRCeRROR = *
LDA #<CRCeRRORmSG1
LDY #>CRCeRRORmSG1
JSR EPUTS
LDA CRCnAME
LDY CRCnAME+1
JSR EPUTS
LDA #<CRCeRRORmSG2
LDY #>CRCeRRORmSG2
JMP EPUTS
CRCeRRORmSG1 = *
.ASC "eRROR READING FILE "
.BYTE CHRqUOTE,0
CRCeRRORmSG2 = *
.BYTE CHRqUOTE,CHRcr,0
BUFpTR = 8
BUFcOUNT = 10
INFILE = 12
DOrEAD = *
;** OPEN FILE
LDA CRCnAME
LDY CRCnAME+1
STA ZP
STY ZP+1
LDA #"R"
JSR OPEN
BCC +
RTS
+ STA INFILE
;** READ FILE
JSR READbODY
;** CLOSE FILE
LDA INFILE
JSR CLOSE
RTS
READbODY = *
LDA #<CRCiNbUF
LDY #>CRCiNbUF
STA ZP
STY ZP+1
LDA INbUFlEN+0
LDY INbUFlEN+1
LDX INFILE
JSR READ
BEQ +
BCS +
JMP READbODY
+ SEC
RTS
;===THE END===
CRCbSS = *
CRCiNbUF = CRCbSS
RM.S
190
;*** RM PROGRAM
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:RM"
JMP REMOVEmAIN
.ASC "Cb"
;*** GLOBAL DECLARATIONS
LIBWORK = $60
CHRcr = $0D
CHRqUOTE = $22
;******** STANDARD LIBRARY ********
PUTS = *
LDX #STDOUT
FPUTS = *
STA ZP
STY ZP+1
LDY #$FF
- INY
LDA (ZP),Y
BNE -
TYA
LDY #0
JMP WRITE
EPUTS = *
LDX #STDERR
JMP FPUTS
PUTCHAR = *
LDX #STDOUT
PUTC = *
STA PUTCbUFFER
LDA #<PUTCbUFFER
LDY #>PUTCbUFFER
STA ZP
STY ZP+1
LDA #1
LDY #0
JMP WRITE
PUTCbUFFER .BUF 1
GETCHAR = *
LDX #STDIN
GETC = *
LDA #<GETCbUFFER
LDY #>GETCbUFFER
STA ZP
STY ZP+1
LDA #1
LDY #0
JSR READ
BEQ +
LDA GETCbUFFER
RTS
+ SEC
RTS
GETCbUFFER .BUF 1
;===REMOVE LIBRARY===
GETARG = *
STY ZP+1
ASL
STA ZP
ROL ZP+1
CLC
LDA ACEaRGV
ADC ZP
STA ZP
LDA ACEaRGV+1
ADC ZP+1
STA ZP+1
LDY #0
LDA (ZP),Y
TAX
INY
LDA (ZP),Y
STX ZP
STA ZP+1
RTS
;===REMOVE===
RMaRG = 2
RMnAME = 4
REMOVEmAIN = *
;** CHECK ARGUMENT COUNT
LDA ACEaRGC+1
BNE RMeNOUGHaRGS
LDA ACEaRGC
CMP #2
BCS RMeNOUGHaRGS
RMuSAGE = *
LDA #<RMuSAGEmSG
LDY #>RMuSAGEmSG
JMP PUTS
RMuSAGEmSG = *
.ASC "uSAGE: RM FILE1 FILE2 ... FILEn"
.BYTE CHRcr
.BYTE 0
RMeNOUGHaRGS = *
LDA #1
LDY #0
STA RMaRG
STY RMaRG+1
- LDA RMaRG
LDY RMaRG+1
JSR GETARG
LDA ZP
LDY ZP+1
STA RMnAME
STY RMnAME+1
ORA ZP+1
BEQ RMeXIT
JSR STOPKEY
BCS STOPPED
JSR RMeCHO
LDA RMnAME
LDY RMnAME+1
STA ZP
STY ZP+1
JSR REMOVE
BCC +
JSR RMeRROR
+ INC RMaRG
BNE +
INC RMaRG+1
+ JMP -
RMeXIT = *
RTS
STOPPED = *
LDA #<STOPPEDmSG
LDY #>STOPPEDmSG
JMP EPUTS
STOPPEDmSG = *
.ASC "<STOPPED>"
.BYTE CHRcr,0
RMeRROR = *
LDA #<RMeRRORmSG1
LDY #>RMeRRORmSG1
JSR EPUTS
LDA RMnAME
LDY RMnAME+1
JSR EPUTS
LDA #<RMeRRORmSG2
LDY #>RMeRRORmSG2
JMP EPUTS
RMeRRORmSG1 = *
.ASC "eRROR ATTEMPTING TO REMOVE "
.BYTE CHRqUOTE
.BYTE 0
RMeRRORmSG2 = *
.BYTE CHRqUOTE
.BYTE CHRcr
.BYTE 0
RMeCHO = *
LDA #<RMeCHOmSG1
LDY #>RMeCHOmSG1
JSR EPUTS
LDA RMnAME
LDY RMnAME+1
JSR EPUTS
LDA #<RMeCHOmSG2
LDY #>RMeCHOmSG2
JMP EPUTS
RMeCHOmSG1 = *
.ASC "rEMOVING FILE "
.BYTE CHRqUOTE,0
RMeCHOmSG2 = *
.BYTE CHRqUOTE
.ASC "..."
.BYTE CHRcr,0
;===THE END===
RMeND = *
SH.S
1674
;ace COMMAND SHELL BY cRAIG bRUCE
.SEQ ACEHEAD.S
.ORG ACEsHELLaDDRESS
.OBJ "@0:SH"
JMP MAIN
.BYTE "S","h",ACEid3
LIBWORK = $60
CHRcr = 13
CHRqUOTE = 34
CHRtAB = 9
SHELLrEDIRECTsTDIN .BUF 1
SHELLrEDIRECTsTDOUT .BUF 1
SHELLrEDIRECTsTDERR .BUF 1
PARSEaRGC .BUF 2
SHELLeXITfLAG .BUF 1
SHELLpROMPTfLAG .BUF 1
CHECKpROMPTfLAG .BUF 1
SUPPRESSpROMPTfLAG .BUF 1
ABORTcOMMANDfLAG .BUF 1
REGSAVE .BUF 3
;******** STANDARD LIBRARY ********
EPUTS = *
LDX #STDERR
JMP FPUTS
PUTS = *
LDX #STDOUT
FPUTS = *
STA ZP+0
STY ZP+1
LDY #$FF
- INY
LDA (ZP),Y
BNE -
TYA
LDY #0
JMP WRITE
PUTCHAR = *
LDX #STDOUT
PUTC = *
STA PUTCbUFFER
LDA #<PUTCbUFFER
LDY #>PUTCbUFFER
STA ZP+0
STY ZP+1
LDA #1
LDY #0
JMP WRITE
PUTCbUFFER .BUF 1
GETCHAR = *
LDX #STDIN
GETC = *
LDA #<GETCbUFFER
LDY #>GETCbUFFER
STA ZP+0
STY ZP+1
LDA #1
LDY #0
JSR READ
BEQ +
LDA GETCbUFFER
RTS
+ SEC
RTS
GETCbUFFER .BUF 1
CLS = *
LDA #147
JMP PUTCHAR
ITOAbIN = LIBWORK
ITOAnUMBER .BUF 11
ITOA = *
JSR ITOApREPARE
JMP UTOA
ITOAsTRIP = *
JSR ITOApREPARE
LDA #1
JMP UTOA
ITOApREPARE = *
STA ITOAbIN+0
STY ITOAbIN+1
STX ITOAbIN+2
LDA #0
STA ITOAbIN+3
LDA #<ITOAnUMBER
LDY #>ITOAnUMBER
STA SYSWORK+0
STY SYSWORK+1
LDA #8
LDX #ITOAbIN
RTS
ZSP = LIBWORK
PUSHay = *
TAX
SEC
LDA ACEsTACKpTR+0
SBC #2
STA ACEsTACKpTR+0
STA ZSP
LDA ACEsTACKpTR+1
SBC #0
STA ACEsTACKpTR+1
STA ZSP+1
TYA
LDY #1
STA (ZSP),Y
DEY
TXA
STA (ZSP),Y
RTS
;******** SHELL ********
;cOMsHELL
MAIN = *
LDA #<SHELLtITLE
LDY #>SHELLtITLE
JSR PUTS
JMP SHELL
SHELLtITLE .ASC "ace sHELL VERS 0.54.00 - csb 25-nOV-93"
.BYTE CHRcr,CHRcr
.BYTE 0
SHELL = *
LDA #$FF
STA CHECKpROMPTfLAG
STA SHELLrEDIRECTsTDIN
STA SHELLrEDIRECTsTDOUT
STA SHELLrEDIRECTsTDERR
LDA #0
STA SUPPRESSpROMPTfLAG
GETcOMMAND = *
LDA #0
STA ABORTcOMMANDfLAG
LDA CHECKpROMPTfLAG
BEQ +
JSR SHELLcHECKpROMPTABILITY
+ LDA SHELLpROMPTfLAG
BEQ +
LDA SUPPRESSpROMPTfLAG
BNE +
LDA #"["
LDX #STDERR
JSR PUTC
LDA ACEcURdIRnAME+0
LDY ACEcURdIRnAME+1
JSR EPUTS
LDA #<SHELLrEADY2
LDY #>SHELLrEADY2
JSR EPUTS
+ LDA #0
STA SUPPRESSpROMPTfLAG
STA SHELLeXITfLAG
JSR SHELLgETaRGS
BCS SHELLfINISH
LDA PARSEaRGC+0
ORA PARSEaRGC+1
BEQ +
LDA ABORTcOMMANDfLAG
BNE +
JSR SETUPrEDIRECTS
JSR SHELLcONSTRUCTfRAME
JSR SHELLeXECcOMMAND
JSR SHELLrEMOVEfRAME
JSR UNSETrEDIRECTS
+ JSR CLOSErEDIRECTS
BIT SHELLeXITfLAG
BMI SHELLfINISH
JMP GETcOMMAND
SHELLfINISH = *
RTS
SHELLrEADY2 .ASC "] "
.BYTE 0
SHELLcHECKpROMPTABILITY = *
LDX #0
JSR DEVINFO
LDX #$FF
CMP #0
BEQ +
LDX #0
+ STX SHELLpROMPTfLAG
LDA #0
STA CHECKpROMPTfLAG
RTS
;=== COMMAND PARSING ===
ARGpTR = $02
ARGqUOTE = $03
ARGwASqUOTED = $04
SHELLgETaRGS = *
LDA #0
STA PARSEaRGC+0
STA PARSEaRGC+1
NEWARG = *
JSR GETCHAR
BCC +
JMP ARGeOF
+ CMP #" "
BEQ NEWARG
CMP #CHRtAB
BEQ NEWARG
CMP #CHRcr
BNE +
JMP ARGeNDoFlINE
+ CMP #";"
BNE +
LDA #$FF
STA SUPPRESSpROMPTfLAG
JMP ARGeNDoFlINE
+ LDX #0
STX ARGpTR
STX ARGwASqUOTED
ARGnEWqUOTE = *
LDX #0
STX ARGqUOTE
CMP #$22
BEQ ARGsTARTqUOTE
CMP #"'"
BNE +
ARGsTARTqUOTE = *
STA ARGqUOTE
STA ARGwASqUOTED
JMP ARGnEXTcHAR
+ LDX ARGpTR
STA ARGbUFFER,X
INC ARGpTR
ARGnEXTcHAR = *
JSR GETCHAR
BCS ARGeOF
LDX ARGqUOTE
BNE ARGqUOTEmODE
CMP #" "
BEQ ARGpROCESS
CMP #CHRtAB
BEQ ARGpROCESS
- CMP #";"
BNE +
LDX ARGwASqUOTED
BNE +
LDA #$FF
STA SUPPRESSpROMPTfLAG
LDA #CHRcr
+ CMP #CHRcr
BEQ ARGpROCESS
LDX ARGpTR
STA ARGbUFFER,X
INC ARGpTR
JMP ARGnEXTcHAR
ARGqUOTEmODE = *
CMP #0
BEQ -
CMP ARGqUOTE
BNE -
JSR GETCHAR
BCS ARGeOF
CMP #" "
BEQ ARGpROCESS
CMP #CHRtAB
BEQ ARGpROCESS
CMP #CHRcr
BEQ ARGpROCESS
JMP ARGnEWqUOTE
ARGpROCESS = *
PHA
LDX ARGpTR
LDA #0
STA ARGbUFFER,X
JSR SHELLhANDLEaRG
PLA
CMP #CHRcr
BEQ ARGeNDoFlINE
JMP NEWARG
ARGeNDoFlINE = *
CLC
ARGeOF = *
RTS
SHELLhANDLEaRG = *
LDA ABORTcOMMANDfLAG
BEQ +
RTS
+ LDA ARGwASqUOTED
BNE +
LDX #STDIN
LDY #"R"
LDA ARGbUFFER
CMP #"<"
BEQ SHELLhANDLErEDIRECT
LDX #STDOUT
LDY #"W"
CMP #">"
BEQ SHELLhANDLErEDIRECT
JSR CHECKwILDCARDS
BCC +
RTS
+ JSR SHELLsTOREaRG
RTS
SHELLsTOREaRG = *
LDA ACEsTACKpTR+0
LDY ACEsTACKpTR+1
CLC
SBC ARGpTR
BCS +
DEY
+ STA ACEsTACKpTR+0
STY ACEsTACKpTR+1
STA ZP+0
STY ZP+1
LDY #0
- LDA ARGbUFFER,Y
STA (ZP),Y
BEQ +
INY
BNE -
+ LDA PARSEaRGC+1
STA ZP+1
LDA PARSEaRGC+0
ASL
ROL ZP+1
CLC
ADC #<ARGaRGVbUFFER
STA ZP+0
LDA ZP+1
ADC #>ARGaRGVbUFFER
STA ZP+1
LDY #0
LDA ACEsTACKpTR+0
STA (ZP),Y
INY
LDA ACEsTACKpTR+1
STA (ZP),Y
INC PARSEaRGC+0
BNE +
INC PARSEaRGC+1
+ RTS
SHELLhANDLErEDIRECT = * ;( .x=FD, .y=MODE )
LDA #<ARGbUFFER+1
STA ZP
LDA #>ARGbUFFER+1
STA ZP+1
LDA ARGbUFFER+1
CMP #">"
BNE +
JSR SHELLrEDIRiNC
LDY #"A"
LDA ARGbUFFER+2
+ CMP #"!"
BNE +
- LDX #STDERR
JSR SHELLrEDIRiNC
LDA #0
+ CMP #"&"
BEQ -
LDA SHELLrEDIRECTsTDIN,X
CMP #255
BNE REDIRECTmULTIeRROR
TYA
STX CMDbUFFER
STA REGSAVE
- JSR OPEN
BCC ++
LDA ERRNO
CMP #ACEeRRfILEeXISTS
BNE +
JSR REMOVE
BCS REDIRECTeRROR
LDA REGSAVE
JMP -
+ CMP #ACEeRRfILEnOTfOUND
BNE REDIRECTeRROR
LDA REGSAVE
CMP #"A"
BNE REDIRECTeRROR
LDA #"W"
STA REGSAVE
JMP -
+ LDX CMDbUFFER
STA SHELLrEDIRECTsTDIN,X
RTS
REDIRECTeRROR = *
LDA #<REDIRECTeRRORmSG
LDY #>REDIRECTeRRORmSG
REDIRECTeRRORwMSG = *
PHA
TYA
PHA
LDA #$FF
STA ABORTcOMMANDfLAG
LDA ZP+0
LDY ZP+1
JSR EPUTS
PLA
TAY
PLA
JSR EPUTS
RTS
REDIRECTeRRORmSG = *
.ASC ": eRROR OPENING REDIRECTION FILE."
.BYTE CHRcr,0
REDIRECTmULTIeRROR = *
LDA #<REDIRECTmULTIeRRORmSG
LDY #>REDIRECTmULTIeRRORmSG
JMP REDIRECTeRRORwMSG
REDIRECTmULTIeRRORmSG = *
.ASC ": eRROR - mULTIPLE REDIRECTIONS OF SAME STREAM."
.BYTE CHRcr,0
SHELLrEDIRiNC = *
INC ZP+0
BNE +
INC ZP+1
+ RTS
SHELLsETUPrED = 2
SETUPrEDIRECTS = *
UNSETrEDIRECTS = *
LDX #0
STX SHELLsETUPrED
- LDA SHELLrEDIRECTsTDIN,X
CMP #255
BEQ +
TAY
JSR FCBSWAP
+ INC SHELLsETUPrED
LDX SHELLsETUPrED
CPX #3
BCC -
RTS
SHELLcLOSErED = 2
CLOSErEDIRECTS = *
LDX #0
STX SHELLcLOSErED
- LDA SHELLrEDIRECTsTDIN,X
CMP #$FF
BEQ +
JSR CLOSE
LDX SHELLcLOSErED
LDA #$FF
STA SHELLrEDIRECTsTDIN,X
+ INC SHELLcLOSErED
LDX SHELLcLOSErED
CPX #3
BCC -
RTS
WILDpREFIX = 10
WILDsUFFIX = 11
CHECKwILDCARDS = *
LDA #255
STA WILDpREFIX
STA WILDsUFFIX
LDX ARGpTR
- DEX
CPX #255
BEQ +
LDA ARGbUFFER,X
CMP #":"
BEQ +
CMP #"*"
BNE -
LDY WILDsUFFIX
CPY #255
BNE -
STX WILDsUFFIX
INC WILDsUFFIX
JMP -
+ INX
STX WILDpREFIX
LDA WILDsUFFIX
CMP #255
BNE +
CLC
RTS
+ JSR HANDLEwILDCARDS
SEC
RTS
WILDlENGTH = 12
WILDsUFFIXlENGTH = 13
WILDfCB = 14
WILDmATCH = 15
HANDLEwILDCARDS = *
LDA #0
STA WILDmATCH
LDX ARGpTR
INX
- DEX
LDA ARGbUFFER,X
STA CMDbUFFER+1,X
CPX WILDpREFIX
BNE -
LDA #0
STA CMDbUFFER,X
STA ARGbUFFER,X
LDX WILDsUFFIX
STA CMDbUFFER,X
INC WILDpREFIX
INC WILDsUFFIX
LDX #0
- LDA ARGbUFFER,X
BEQ +
STA CMDbUFFER,X
INX
BNE -
+ SEC
LDA ARGpTR
SBC WILDsUFFIX
STA WILDsUFFIXlENGTH
INC WILDsUFFIXlENGTH
SEC
LDA ARGpTR
SBC WILDpREFIX
STA WILDlENGTH
LDA #<CMDbUFFER
LDY #>CMDbUFFER
STA ZP+0
STY ZP+1
JSR DIROPEN
BCS NOmATCH
STA WILDfCB
JSR DIRREAD
BCS +
BEQ +
JSR SCANwILDCARD
+ LDA WILDfCB
JSR DIRCLOSE
LDA WILDmATCH
BNE +
NOmATCH = *
LDA #$FF
STA ABORTcOMMANDfLAG
LDA #<NOmATCHmSG
LDY #>NOmATCHmSG
JSR EPUTS
+ RTS
NOmATCHmSG = *
.ASC "nO MATCH FOR WILDCARD"
.BYTES CHRcr,0
SCANwILDCARD = *
LDX WILDfCB
JSR DIRREAD
BCS +
BNE ++
+ RTS
+ LDA ACEdIRENTnAME
BNE +
RTS
+ LDA ACEdIRENTnAMElEN
CMP WILDlENGTH
BCC SCANwILDCARD
LDX WILDpREFIX
LDY #0
JSR SUBSTRcMP
BCS SCANwILDCARD
LDX WILDsUFFIX
SEC
LDA ACEdIRENTnAMElEN
SBC WILDsUFFIXlENGTH
TAY
JSR SUBSTRcMP
BCS SCANwILDCARD
LDX #0
- LDA CMDbUFFER,X
BEQ +
STA ARGbUFFER,X
INX
BNE -
+ LDY #0
- LDA ACEdIRENTnAME,Y
STA ARGbUFFER,X
BEQ +
INX
INY
BNE -
+ LDA ACEdIRENTtYPE
CMP #"S"
BEQ +
STA ARGbUFFER+1,X
LDA #","
STA ARGbUFFER,X
INX
INX
LDA #0
STA ARGbUFFER,X
+ STX ARGpTR
JSR SHELLsTOREaRG
LDA #$FF
STA WILDmATCH
JMP SCANwILDCARD
SUBSTRcMP = * ;( .x=CMDBUFoFF, .y=DIRENTnAMEoFF ) : .cc=MATCH
- LDA CMDbUFFER,X
BNE +
CLC
RTS
+ CMP ACEdIRENTnAME,Y
BNE +
INY
INX
BNE -
+ SEC
RTS
;=== STACK MANAGEMENT ===
FRAMEaRGVsOURCE = $02
FRAMEaRGVdEST = $04
FRAMEaRGVbYTES = $06
SHELLcONSTRUCTfRAME = *
;** PUSH THE zero TRAILER ARGV
LDA #0
LDY #0
JSR PUSHay
;** PUSH ARGV[] HERE
LDA PARSEaRGC
LDY PARSEaRGC+1
STY FRAMEaRGVbYTES+1
ASL
STA FRAMEaRGVbYTES
ROL FRAMEaRGVbYTES+1
SEC
LDA ACEsTACKpTR
SBC FRAMEaRGVbYTES
STA ACEsTACKpTR
STA FRAMEaRGVdEST
LDA ACEsTACKpTR+1
SBC FRAMEaRGVbYTES+1
STA ACEsTACKpTR+1
STA FRAMEaRGVdEST+1
LDA #<ARGaRGVbUFFER
LDY #>ARGaRGVbUFFER
STA FRAMEaRGVsOURCE
STY FRAMEaRGVsOURCE+1
- LDA FRAMEaRGVbYTES
ORA FRAMEaRGVbYTES+1
BEQ FRAMEsETaRGVpTR
LDY #0
LDA (FRAMEaRGVsOURCE),Y
STA (FRAMEaRGVdEST),Y
INC FRAMEaRGVsOURCE
BNE +
INC FRAMEaRGVsOURCE+1
+ INC FRAMEaRGVdEST
BNE +
INC FRAMEaRGVdEST+1
+ LDA FRAMEaRGVbYTES
BNE +
DEC FRAMEaRGVbYTES+1
+ DEC FRAMEaRGVbYTES
JMP -
;** SET ARGV POINTER
FRAMEsETaRGVpTR = *
LDA ACEsTACKpTR
LDY ACEsTACKpTR+1
STA ACEaRGV
STY ACEaRGV+1
;** SET AND PUSH ARGC
LDA PARSEaRGC
LDY PARSEaRGC+1
STA ACEaRGC
STY ACEaRGC+1
JSR PUSHay
;** PUSH UN-REDIRECTION INFO HERE
LDA SHELLrEDIRECTsTDERR
LDY #$FF
JSR PUSHay
LDA SHELLrEDIRECTsTDIN
LDY SHELLrEDIRECTsTDOUT
JSR PUSHay
;** PUSH AND SET FRAME POINTER
LDA ACEfRAMEpTR
LDY ACEfRAMEpTR+1
JSR PUSHay
LDA ACEsTACKpTR
LDY ACEsTACKpTR+1
STA ACEfRAMEpTR
STY ACEfRAMEpTR+1
RTS
FRAMEfp = $02
FRAMEnEWfp = $04
SHELLrEMOVEfRAME = *
;** GET FRAME POINTER
LDA ACEfRAMEpTR
LDY ACEfRAMEpTR+1
STA FRAMEfp
STY FRAMEfp+1
;** RESTORE THE STD FILES
LDY #2
- LDA (FRAMEfp),Y
STA SHELLrEDIRECTsTDIN-2,Y
INY
CPY #5
BCC -
;** BACK UP FRAME POINTER
LDY #1
- LDA (FRAMEfp),Y
STA ACEfRAMEpTR,Y
STA ACEsTACKpTR,Y
STA FRAMEnEWfp,Y
STA ACEaRGV,Y
DEY
BPL -
;** RESTORE THE ARGC, ARGV VALUES
LDY #6
LDA (FRAMEnEWfp),Y
STA ACEaRGC
INY
LDA (FRAMEnEWfp),Y
STA ACEaRGC+1
CLC
LDA ACEaRGV
ADC #8
STA ACEaRGV
BCC +
INC ACEaRGV+1
+ RTS
;=== DISPATCH ===
DISPaRGV = $02
DISPaRGpTR = $04
DISPvECTOR = $02
SHELLeXECcOMMAND = *
;** FETCH THE COMMAND NAME
LDA ACEaRGV
LDY ACEaRGV+1
STA DISPaRGV
STY DISPaRGV+1
LDY #1
- LDA (DISPaRGV),Y
STA DISPaRGpTR,Y
DEY
BPL -
LDY #0
- LDA (DISPaRGpTR),Y
STA ARGbUFFER,Y
BEQ +
INY
BNE -
;** SEARCH INTERNAL DISPATCH TABLE FOR NAME
+ LDY #0
DISPcMPcOMMAND = *
LDA DISPtABLE,Y
BEQ SHELLlOADeXTERNAL
LDX #0
- LDA ARGbUFFER,X
CMP DISPtABLE,Y
BNE +
CMP #0
BEQ DISPmATCH
INX
INY
BNE -
BRK
+ DEY
- INY
LDA DISPtABLE,Y
BNE -
INY
INY
INY
JMP DISPcMPcOMMAND
DISPmATCH = *
LDA DISPtABLE+1,Y
STA DISPvECTOR
LDA DISPtABLE+2,Y
STA DISPvECTOR+1
JMP (DISPvECTOR)
;** LOAD EXTERNAL FILE INTO TRANSIENT PROGRAM AREA
LOADpATH = 2
LOADpATHpOS = 4
LOADgIVEuP = 7
SHELLlOADeXTERNAL = *
LDA #0
STA ACEaPPaDDRESS+3
LDA #0
STA LOADpATHpOS
STA LOADgIVEuP
LDA ACEsHELLpATH
LDY ACEsHELLpATH+1
STA LOADpATH
STY LOADpATH+1
SHELLtRYlOADaGAIN = *
LDY LOADpATHpOS
LDA (LOADpATH),Y
BEQ DISPcMDnOTfOUND
LDA LOADgIVEuP
BNE DISPcMDnOTfOUND
LDA #0
LDY #0
JSR GETARG
JSR GETlOADpATHNAME
LDA #<ACEaPPaDDRESS
LDY #>ACEaPPaDDRESS
JSR BLOAD
BCS DISPlOADeRROR
LDA ACEaPPaDDRESS+3
CMP #"C"
BNE DISPbADpROG
LDA ACEaPPaDDRESS+4
CMP #"b"
BNE DISPbADpROG
LDA #<ACEaPPaDDRESS
LDY #>ACEaPPaDDRESS
JMP EXEC
DISPbADpROG = *
LDA #<DISPbADpROGmSG
LDY #>DISPbADpROGmSG
JSR EPUTS
RTS
DISPbADpROGmSG = *
.ASC "bAD EXTERNAL PROGRAM FORMAT"
.BYTE CHRcr,0
DISPlOADeRROR = *
LDA ERRNO
CMP #ACEeRRfILEnOTfOUND
BEQ SHELLtRYlOADaGAIN
CMP #ACEeRRdEVICEnOTpRESENT
BEQ SHELLtRYlOADaGAIN
LDA #<DISPlOADeRRORmSG1
LDY #>DISPlOADeRRORmSG1
JMP EPUTS
DISPcMDnOTfOUND = *
LDA #<DISPlOADeRRORmSG2
LDY #>DISPlOADeRRORmSG2
JMP EPUTS
DISPlOADeRRORmSG1 = *
.ASC "eXTERNAL PROGRAM LOAD ERROR"
.BYTE CHRcr,0
DISPlOADeRRORmSG2 = *
.ASC "cOMMAND NOT FOUND"
.BYTE CHRcr
.BYTE 0
GETlOADpATHNAME = *
LDY LOADpATHpOS
LDX #0
- LDA (LOADpATH),Y
BEQ +
STA CMDbUFFER,X
INY
INX
BNE -
+ INY
STY LOADpATHpOS
LDY #1
LDA (ZP),Y
CMP #":"
BEQ +
DEY
LDA (ZP),Y
CMP #"/"
BNE GETpATHrEALLY
+ STA LOADgIVEuP
LDX #0
GETpATHrEALLY = *
LDY #0
- LDA (ZP),Y
STA CMDbUFFER,X
BEQ +
INX
INY
BNE -
+ LDA #<CMDbUFFER
LDY #>CMDbUFFER
STA ZP
STY ZP+1
RTS
;===INTERNAL COMMAND NAME AND DISPATCH TABLE===
DISPtABLE = *
.ASC "ECHO"
.BYTE 0
.WORD ECHO
.ASC "SH"
.BYTE 0
.WORD SHELLcMD
.ASC "DIRECTORY"
.BYTE 0
.WORD DIRwITHcLS
.ASC "DIR"
.BYTE 0
.WORD DIRwITHcLS
.ASC "D"
.BYTE 0
.WORD DIR
.ASC "LS"
.BYTE 0
.WORD LS
.ASC "CD"
.BYTE 0
.WORD CD
.ASC "G"
.BYTE 0
.WORD CD
.ASC "CAT"
.BYTE 0
.WORD CAT
.ASC "TYPE"
.BYTE 0
.WORD CAT
.ASC "T"
.BYTE 0
.WORD CAT
.ASC "CLS"
.BYTE 0
.WORD CLS
.ASC "CLEAR"
.BYTE 0
.WORD CLS
.ASC "EXIT"
.BYTE 0
.WORD SHELLeXIT
.ASC "X"
.BYTE 0
.WORD SHELLeXIT
.ASC "CLSL"
.BYTE 0
.WORD LSwITHcLS
.ASC "@"
.BYTE 0
.WORD DOS
.ASC "DOS"
.BYTE 0
.WORD DOS
.ASC "PATH"
.BYTE 0
.WORD PATH
.BYTE 0
;===ECHO===
ECHOaRGV = $02
ECHOsPACE = $04
ECHOtEMP = $06
ECHO = *
LDA #0
STA ECHOsPACE
LDA ACEaRGV
LDY ACEaRGV+1
ECHOnEWaRG = *
CLC
ADC #2
BCC +
INY
+ STA ECHOaRGV
STY ECHOaRGV+1
LDA #" "
CMP ECHOsPACE
BNE +
JSR PUTCHAR
+ LDA #" "
STA ECHOsPACE
LDY #0
LDA (ECHOaRGV),Y
STA ECHOtEMP
INY
LDA (ECHOaRGV),Y
TAY
ORA ECHOtEMP
BEQ ECHOeXIT
LDA ECHOtEMP
JSR PUTS
LDA ECHOaRGV
LDY ECHOaRGV+1
JMP ECHOnEWaRG
ECHOeXIT = *
LDA #CHRcr
JSR PUTCHAR
RTS
;===COPY PARAMETERS===
COPYbUFFERpTR = $02
COPYbUFFERlENGTH = $04
GETbUFFERpARMS = *
LDA #<COPYbUFFER
LDY #>COPYbUFFER
STA COPYbUFFERpTR
STY COPYbUFFERpTR+1
SEC
LDA ACEsTACKpTR
SBC COPYbUFFERpTR
STA COPYbUFFERlENGTH
LDA ACEsTACKpTR+1
SBC COPYbUFFERpTR+1
STA COPYbUFFERlENGTH+1
RTS
GETARG = *
STY ZP+1
ASL
STA ZP
ROL ZP+1
CLC
LDA ACEaRGV
ADC ZP
STA ZP
LDA ACEaRGV+1
ADC ZP+1
STA ZP+1
LDY #0
LDA (ZP),Y
TAX
INY
LDA (ZP),Y
STX ZP
STA ZP+1
RTS
;===DIR===
DIRfCB = $02
DIRcOLUMNS = $03
DIRcURcOL = $04
DIRlONG = $05
DIRsPACES = $06
DIRLINElEN = $07
DIRcHcOLS = $08
DIRwITHcLS = *
JSR CLS
JMP DIR
LSwITHcLS = *
JSR CLS
JMP LS
LS = *
LDX #1
JSR DEVINFO
STX DIRcHcOLS
CMP #0
BNE +
TXA
LDX #$FF
- INX
SBC #20
BCS -
TXA
BNE LSsETcOLS
+ LDA #1
LSsETcOLS = *
STA DIRcOLUMNS
LDA #0
STA DIRlONG
JMP DIRcOMMON
DIR = *
LDX #1
JSR DEVINFO
STX DIRcHcOLS
LDA #1
STA DIRcOLUMNS
LDA #$FF
STA DIRlONG
DIRcOMMON = *
LDA #0
STA DIRcURcOL
LDA #<DIRdEFAULTdIRECTORY
LDY #>DIRdEFAULTdIRECTORY
STA ZP
STY ZP+1
LDA ACEaRGC+1
BNE +
LDA ACEaRGC
CMP #2
BCC DIRgOTnAME
+ LDA #1
LDY #0
JSR GETARG
DIRgOTnAME = *
JSR DIROPEN
BCC +
RTS
+ STA DIRfCB
LDX DIRfCB
JSR DIRREAD
BCS DIReXIT
BEQ DIReXIT
JSR STOPKEY
BCS DIReXIT
LDA DIRlONG
BPL +
JSR DIRdISPLAYhEADING
/ LDX DIRfCB
JSR DIRREAD
BCS DIReXIT
BEQ DIReXIT
JSR STOPKEY
BCS DIReXIT
LDA ACEdIRENTnAME
BEQ DIRtRAILEReXIT
JSR DIRdISPLAY
JMP -
DIRtRAILEReXIT = *
LDA DIRlONG
BPL DIReXIT
JSR DIRdISPLAYtRAILER
DIReXIT = *
LDA DIRcURcOL
BEQ +
LDA #CHRcr
JSR PUTCHAR
+ LDA DIRfCB
JMP CLOSE
DIRdEFAULTdIRECTORY = *
.ASC ".:"
.BYTE 0
DIRdISPLAY = *
BIT DIRlONG
BMI +
JMP DIRdISPLAYsHORT
+ JSR DIRsETUPdIRLINE
LDA #<DIRLINE
LDY #>DIRLINE
STA ZP
STY ZP+1
LDA DIRLINElEN
LDY #0
LDX #STDOUT
JMP WRITE
;* 0000000000111111111122222222223333333333444444444455555555556666
;* POS: 0123456789012345678901234567890123456789012345678901234567890123
DIRLINE .ASC "DRWX*-MT 00-xXX-00 12:00A 12345678 *seq 1234567890123456"
.BYTE CHRcr,0
DIRfLAGnAMES .ASC "DRWX*-MT"
DIRdATEsTR .ASC " 00-xXX-00 12:00A "
DIRdATEeND = *
DIRsETUPdIRLINE = *
;** FLAGS
LDX #0
LDA ACEdIRENTfLAGS
- ASL
PHA
LDA #"-"
BCC +
LDA DIRfLAGnAMES,X
+ STA DIRLINE+0,X
PLA
INX
CPX #8
BCC -
;** DATE
LDX #DIRdATEeND-DIRdATEsTR-1
- LDA DIRdATEsTR,X
STA DIRLINE+8,X
DEX
BPL -
;** BYTES
LDA ACEdIRENTbYTES+0
LDY ACEdIRENTbYTES+1
LDX ACEdIRENTbYTES+2
JSR ITOA
LDY #28
LDA DIRcHcOLS
CMP #59
BCS +
LDY #8
+ LDX #0
- LDA ITOAnUMBER,X
STA DIRLINE,Y
INY
INX
CPX #8
BCC -
LDA #" "
STA DIRLINE,Y
INY
;** UNCLOSED FLAG
LDA DIRLINE+4
CMP #"-"
BNE +
LDA #" "
+ STA DIRLINE,Y
INY
;** FILETYPE
LDX #0
- LDA ACEdIRENTtYPE,X
ORA #$80
STA DIRLINE,Y
INY
INX
CPX #3
BCC -
LDA #" "
STA DIRLINE,Y
INY
STA DIRLINE,Y
INY
;** FILENAME
LDX #0
- LDA ACEdIRENTnAME,X
BEQ +
STA DIRLINE,Y
INY
INX
BNE -
+ LDA #CHRcr
STA DIRLINE,Y
INY
LDA #0
STA DIRLINE,Y
STY DIRLINElEN
RTS
DIRdISPLAYsHORT = *
LDA #<ACEdIRENTnAME
LDY #>ACEdIRENTnAME
JSR PUTS
INC DIRcURcOL
LDA DIRcURcOL
CMP DIRcOLUMNS
BCC +
LDA #0
STA DIRcURcOL
LDA #CHRcr
JMP PUTCHAR
+ LDY #$FF
- INY
LDA ACEdIRENTnAME,Y
BNE -
STY DIRsPACES
LDA #20
SBC DIRsPACES
STA DIRsPACES
- LDA #" "
JSR PUTCHAR
DEC DIRsPACES
BNE -
RTS
DIRdISPLAYhEADING = *
LDA #<DIRhEADINGmSG
LDY #>DIRhEADINGmSG
JSR PUTS
LDA #<ACEdIRENTnAME
LDY #>ACEdIRENTnAME
JSR PUTS
LDA #CHRcr
JSR PUTCHAR
RTS
DIRhEADINGmSG = *
.ASC "dIR: "
.BYTE 0
DIRdISPLAYtRAILER = *
LDA ACEdIRENTbYTES+0
LDY ACEdIRENTbYTES+1
LDX ACEdIRENTbYTES+2
JSR ITOAsTRIP
LDA #<ITOAnUMBER
LDY #>ITOAnUMBER
JSR PUTS
LDA #<DIRtRAILINGmSG
LDY #>DIRtRAILINGmSG
JSR PUTS
RTS
DIRtRAILINGmSG = *
.ASC " BYTES FREE"
.BYTE CHRcr
.BYTE 0
;===CD===
CD = *
LDA ACEaRGC+0
CMP #2
LDA ACEaRGC+1
SBC #0
BCS +
JSR CDHOME
RTS
+ LDA #1
LDY #0
JSR GETARG
CDsETdEVICE = *
LDX #2
LDY #0
LDA (ZP),Y
STA ARGbUFFER+0
INY
LDA (ZP),Y
STA ARGbUFFER+1
INY
CMP ":"
BEQ CDcHECKpATH
LDX #0
LDY #0
CDcHECKpATH = *
LDA (ZP),Y
STA ARGbUFFER,X
CMP #0
BEQ CDoKAY
CMP #"/"
BEQ CDpATHoKAY
CMP #"0"
BCC +
CMP #"9"+1
BCC CDpATHoKAY
+ LDA #"/"
STA ARGbUFFER,X
INX
CDpATHoKAY = *
- LDA (ZP),Y
STA ARGbUFFER,X
BEQ CDcHECKeND
INX
INY
BNE -
CDcHECKeND = *
DEX
LDA ARGbUFFER,X
CMP #":"
BEQ +
INX
LDA #":"
STA ARGbUFFER,X
LDA #0
STA ARGbUFFER+1,X
+ DEX
LDA ARGbUFFER,X
CMP #"/"
BEQ CDoKAY
LDA #"/"
STA ARGbUFFER+1,X
LDA #":"
STA ARGbUFFER+2,X
LDA #0
STA ARGbUFFER+3,X
CDoKAY = *
LDA #<ARGbUFFER
LDY #>ARGbUFFER
STA ZP+0
STY ZP+1
JSR CHDIR
BCS +
RTS
+ LDA #<CDeRRmSG
LDY #>CDeRRmSG
JMP EPUTS
CDdEFAULT = *
.ASC "A:"
.BYTE 0
CDeRRmSG = *
.ASC "eRROR CHANGING DIRECTORY"
.BYTE CHRcr,0
;===CAT===
CATbUFFERpTR = $02
CATbUFFERlENGTH = $04
CATaRG = $06
CATfCB = $08
CATaBORT = 10
CAT = *
LDA #0
STA CATaBORT
JSR GETbUFFERpARMS
LDX #STDOUT
JSR DEVINFO
CMP #0
BNE +
LDA CATbUFFERlENGTH+1
BEQ +
LDA #<254
LDY #>254
STA CATbUFFERlENGTH+0
STY CATbUFFERlENGTH+1
+ LDA #1
LDY #0
STA CATaRG+0
STY CATaRG+1
LDA ACEaRGC+0
CMP #2
LDA ACEaRGC+1
SBC #0
BCS CATfILES
LDA #0
STA CATfCB
JMP CATfILE
CATfILES = *
LDA CATaRG+0
LDY CATaRG+1
JSR GETARG
LDA #"R"
JSR OPEN
BCC +
LDA ZP+0
LDY ZP+1
JSR EPUTS
LDA #<CATeRRmSG
LDY #>CATeRRmSG
JSR EPUTS
JMP ++
+ STA CATfCB
JSR CATfILE
LDA CATfCB
JSR CLOSE
+ INC CATaRG
BNE +
INC CATaRG+1
+ LDA CATaBORT
BNE +
LDA CATaRG
CMP ACEaRGC
LDA CATaRG+1
SBC ACEaRGC+1
BCC CATfILES
+ RTS
CATeRRmSG = *
.ASC ": CANNOT OPEN"
.BYTE CHRcr,0
CATfILE = *
LDA CATbUFFERpTR
LDY CATbUFFERpTR+1
STA ZP
STY ZP+1
- LDA CATbUFFERlENGTH
LDY CATbUFFERlENGTH+1
LDX CATfCB
JSR READ
BEQ +
BCS +
LDX #1
JSR WRITE
BCS +
JSR STOPKEY
BCS PRINTsTOPPEDmSG
JMP -
+ RTS
PRINTsTOPPEDmSG = *
LDA #$FF
STA CATaBORT
LDA #<STOPPEDmSG
LDY #>STOPPEDmSG
JMP EPUTS
STOPPEDmSG = *
.ASC "<sTOPPED>"
.BYTE CHRcr,0
;===EXIT===
SHELLeXIT = *
LDA #$FF
STA SHELLeXITfLAG
RTS
;===DOS===
DOSfCB = $02
DOS = *
;** OPEN COMMAND CHANNEL
LDA #<DOScURdEVICE
LDY #>DOScURdEVICE
STA ZP
STY ZP+1
JSR CMDOPEN
BCC +
RTS
+ STA DOSfCB
;** SEND COMMAND
LDA #1
LDY #0
JSR GETARG
LDA ZP
ORA ZP+1
BEQ DOSsTATUSoNLY
LDA ZP
LDY ZP+1
LDX DOSfCB
JSR CMDSEND
BCS +
;** READ STATUS
DOSsTATUSoNLY = *
LDA #<CMDbUFFER
LDY #>CMDbUFFER
LDX DOSfCB
JSR CMDSTATUS
BCS +
LDA #<CMDbUFFER
LDY #>CMDbUFFER
JSR PUTS
LDA #CHRcr
JSR PUTCHAR
;** CLOSE COMMAND CHANNEL
+ LDA DOSfCB
JMP CMDCLOSE
DOScURdEVICE .ASC ".:"
.BYTE 0
;===SHELL===
SHELLcMD = *
JSR SHELL
LDA #0
STA SHELLeXITfLAG
LDA #255
STA CHECKpROMPTfLAG
RTS
;===PATH===
PATHpTR = 2
PATHpOS = 4
PATHaRG = 6
PATHsOURCEpOS = 7
PATH = *
LDA ACEsHELLpATH
LDY ACEsHELLpATH+1
STA PATHpTR
STY PATHpTR+1
LDA #0
STA PATHpOS
LDA ACEaRGC+1
BEQ +
RTS
+ LDA ACEaRGC
CMP #2
BCS PATHsET
LDA #<PATHmSG
LDY #>PATHmSG
JSR PUTS
DISPLAYpATH = *
LDY PATHpOS
LDA (PATHpTR),Y
BNE +
LDA #CHRcr
JSR PUTCHAR
RTS
+ LDA #CHRqUOTE
STA CMDbUFFER
LDX #1
- LDA (PATHpTR),Y
STA CMDbUFFER,X
BEQ +
INY
INX
BNE -
+ INY
STY PATHpOS
LDA #CHRqUOTE
STA CMDbUFFER,X
INX
LDA #" "
STA CMDbUFFER,X
INX
LDA #<CMDbUFFER
LDY #>CMDbUFFER
STA ZP
STY ZP+1
TXA
LDY #0
LDX #1
JSR WRITE
JMP DISPLAYpATH
PATHmSG = *
.ASC "PATH "
.BYTE 0
PATHsET = *
LDY #0
STY PATHpOS
LDA #1
STA PATHaRG
PATHnEXTaRG = *
LDA PATHaRG
LDY #0
JSR GETARG
LDA ZP
ORA ZP+1
BNE +
LDA #0
LDY PATHpOS
STA (PATHpTR),Y
RTS
+ LDY #0
STY PATHsOURCEpOS
- LDY PATHsOURCEpOS
INC PATHsOURCEpOS
LDA (ZP),Y
LDY PATHpOS
INC PATHpOS
STA (PATHpTR),Y
CMP #0
BNE -
INC PATHaRG
JMP PATHnEXTaRG
BSS = ACEaPPaDDRESS
CMDbUFFER = BSS+0
ARGbUFFER = CMDbUFFER+256
ARGaRGVbUFFER = ARGbUFFER+256
COPYbUFFER = ARGaRGVbUFFER
SLOW.S
14
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:SLOW"
JMP MAIN
.ASC "Cb"
MAIN = *
LDA $D011
ORA #%00010000
STA $D011
LDA #$00
STA $D030
RTS
SORT.S
1079
;*** SORT PROGRAM - BY cRAIG bRUCE, STARTED 13-jUN-93
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:SORT"
JMP MAIN
.ASC "Cb"
.BYTE $06
;*** GLOBAL DECLARATIONS
LIBWORK = $40
CHRcr = $0D
CHRqUOTE = $22
MAXlINElEN = 2049
TRUE = $FF
FALSE = $00
REVERSEfLAG .BUF 1
IGNOREcASEfLAG .BUF 1
KEYpOSITION .BUF 1
;******** STANDARD LIBRARY ********
PUTS = *
LDX #STDOUT
FPUTS = *
STA ZP
STY ZP+1
LDY #$FF
- INY
LDA (ZP),Y
BNE -
TYA
LDY #0
JMP WRITE
EPUTS = *
LDX #STDERR
JMP FPUTS
PUTCHAR = *
LDX #STDOUT
PUTC = *
STA PUTCbUFFER
LDA #<PUTCbUFFER
LDY #>PUTCbUFFER
STA ZP
STY ZP+1
LDA #1
LDY #0
JMP WRITE
PUTCbUFFER .BUF 1
GETARG = *
STY ZP+1
ASL
STA ZP
ROL ZP+1
CLC
LDA ACEaRGV
ADC ZP
STA ZP
LDA ACEaRGV+1
ADC ZP+1
STA ZP+1
LDY #0
LDA (ZP),Y
TAX
INY
LDA (ZP),Y
STX ZP
STA ZP+1
RTS
;===MAIN===
ARG = 2
NAME = 4
STRING = 8
MAIN = *
;** CHECK ARGUMENT COUNT
LDA #0
STA REVERSEfLAG
STA IGNOREcASEfLAG
LDA #1
STA KEYpOSITION
LDA ACEaRGC+1
BNE ENOUGHaRGS
LDA ACEaRGC
CMP #2
BCS ENOUGHaRGS
USAGE = *
LDA #<USAGEmSG
LDY #>USAGEmSG
JMP EPUTS
USAGEmSG = *
.ASC "USAGE: SORT [-[I][V]] [+COLUMN] FILE ..."
.BYTE CHRcr,0
ENOUGHaRGS = *
;** MAIN LOOP
LDA #1
LDY #0
STA ARG+0
STY ARG+1
JSR GETARG
LDY #0
LDA (ZP),Y
CMP #"-"
BNE KEYaRG
INC ARG
- INY
LDA (ZP),Y
BEQ KEYaRG
CMP #"I"
BNE +
LDA #TRUE
STA IGNOREcASEfLAG
+ CMP #"V"
BNE +
LDA #TRUE
STA REVERSEfLAG
+ JMP -
KEYaRG = *
LDA ARG
LDY #0
JSR GETARG
LDY #0
LDA (ZP),Y
CMP #"+"
BNE FILEaRG
JSR GETkEYpOSITION
INC ARG
FILEaRG = *
JSR SORTiNIT
- JSR STOPKEY
BCS STOPPED
LDA ARG+0
LDY ARG+1
JSR GETARG
LDA ZP+0
LDY ZP+1
STA NAME+0
STY NAME+1
ORA ZP+1
BEQ MAINeXIT
JSR SORTrEAD
BCC +
JSR ERROR
+ INC ARG+0
BNE +
INC ARG+1
+ JMP -
MAINeXIT = *
JSR SORTrEAL
JSR SORTpRINT
JSR SORTcLEAN
RTS
KEYdIGIT = $71
GETkEYpOSITION = *
LDA #0
STA KEYpOSITION
INY
- LDA (ZP),Y
CMP #"0"
BCC +
CMP #"9"+1
BCS +
AND #$0F
STA KEYdIGIT
LDA KEYpOSITION
ASL
ASL
CLC
ADC KEYpOSITION
ASL
CLC
ADC KEYdIGIT
STA KEYpOSITION
INY
BNE -
+ RTS
STOPPED = *
LDA #<STOPPEDmSG
LDY #>STOPPEDmSG
JSR EPUTS
LDA #1
JMP EXIT
STOPPEDmSG = *
.ASC "<sTOPPED>"
.BYTE CHRcr,0
ERROR = *
LDA #<ERRORmSG1
LDY #>ERRORmSG1
JSR EPUTS
LDA NAME+0
LDY NAME+1
JSR EPUTS
LDA #<ERRORmSG2
LDY #>ERRORmSG2
JMP EPUTS
ERRORmSG1 = *
.ASC "eRROR READING FILE "
.BYTE CHRqUOTE,0
ERRORmSG2 = *
.BYTE CHRqUOTE,CHRcr,0
BUFpTR = 10 ;(1)
BUFcOUNT = 12 ;(1)
INFILE = 14 ;(1)
SORTrEAD = *
;** OPEN FILE
LDA NAME+0
LDY NAME+1
STA ZP+0
STY ZP+1
LDA #"R"
JSR OPEN
BCC +
RTS
+ STA INFILE
JSR READbODY
LDA INFILE
JSR CLOSE
RTS
;===SORT ROUTINES===
SORTHEAD = 30 ;(4)
SORTp = 34 ;(4)
SORTq = 38 ;(4)
HEADER = 42 ;(5)
SORTiNIT = *
LDA #"S"
JSR ECHOsTATUS
JSR MALLOCiNIT
LDA KEYpOSITION
CMP #1
BCC +
SBC #1
+ STA KEYpOSITION
LDX #3
LDA #ACEmEMnULL
- STA SORTHEAD,X
DEX
BPL -
RTS
READbODY = *
LDA #"R"
JSR ECHOsTATUS
LDA #0
STA BUFcOUNT
- JSR GETLINE
BCS +
JSR POSITIONlINE
JSR STORELINE
BCS +
LDA #"."
JSR ECHOsTATUS
JMP -
+ RTS
SORTrEAL = *
LDA REVERSEfLAG
BMI +
LDA #"V"
JSR ECHOsTATUS
JSR REVERSEfILE
+ RTS
SORTpRINT = *
LDA #"W"
JSR ECHOsTATUS
LDA #13
JSR ECHOsTATUS
JSR WRITEFILE
RTS
SORTcLEAN = *
;LDA #"F"
;JSR ECHOsTATUS
;JSR FREEFILE
;LDA #13
;JSR ECHOsTATUS
RTS
;*** FETCHLINE( SORTp=lINEpTR, .ay=rAM0BUF )
FETCHLINE = *
STA ZW
STY ZW+1
LDX #3
- LDA SORTp,X
STA ZP,X
DEX
BPL -
LDX #HEADER
LDY #5
JSR ZPLOAD
LDA HEADER+4
LDY #0
JMP FETCH
;*** SORTgtCMP( SORTLINE, CMPLINE ) : .c={$7b}SORTLINE >= CMPLINE{$7d}
SORTgtCMP = *
LDX #0
CLC
LDA KEYpOSITION
ADC #6
CMP SORTBUFLEN
BCC +
INX
+ CMP CMPBUFLEN
BCC +
INX
INX
+ TXA
BEQ DOcOMPARE
CMP #2
RTS
DOcOMPARE = *
BIT IGNOREcASEfLAG
BMI DOcASELESScOMPARE
LDY KEYpOSITION
- LDA SORTLINE,Y
CMP CMPLINE,Y
BNE +
CMP #0
BEQ +
INY
BNE -
+ RTS
CASELESScHAR = $72
DOcASELESScOMPARE = *
LDY KEYpOSITION
- LDA SORTLINE,Y
JSR LOWCASE
PHA
LDA CMPLINE,Y
JSR LOWCASE
STA CASELESScHAR
PLA
CMP CASELESScHAR
BNE +
CMP #0
BEQ +
INY
BNE -
+ RTS
LOWCASE = *
CMP #"a"
BCC +
CMP #"z"+1
BCS +
AND #$7F
+ RTS
;*** POSITIONlINE( SORTLINE ) : SORTq=PREV, SORTp=NEXT
POSITIONlINE = *
LDX #3
- LDA #ACEmEMnULL
STA SORTq,X
LDA SORTHEAD,X
STA SORTp,X
DEX
BPL -
POSITIONsEARCH = *
LDA SORTp+3
CMP #ACEmEMnULL
BEQ POSITIONeXIT
LDA #<CMPBUF
LDY #>CMPBUF
JSR FETCHLINE
JSR SORTgtCMP
BCS POSITIONeXIT ;** CONTROLS SORT ORDER
LDX #3
- LDA SORTp,X
STA SORTq,X
LDA CMPBUF,X
STA SORTp,X
DEX
BPL -
BMI POSITIONsEARCH
POSITIONeXIT = *
RTS
;*** STORELINE( SORTLINE ) {$7b}BETWEEN SORTq AND SORTp{$7d}
STORELINE = *
LDA SORTBUFLEN
LDY #0
JSR MALLOC
BCC +
RTS
+ LDX #3
- LDA SORTp,X
STA SORTBUF,X
DEX
BPL -
LDA #<SORTBUF
LDY #>SORTBUF
STA ZW+0
STY ZW+1
LDA SORTBUFLEN
LDY #0
JSR STASH
LDA SORTq+3
CMP #ACEmEMnULL
BEQ STORELINEfIRST
LDX #3
- LDA ZP,X
LDY SORTq,X
STA SORTq,X
STY ZP,X
DEX
BPL -
LDX #SORTq
LDY #4
JSR ZPSTORE
CLC
RTS
STORELINEfIRST = *
LDX #3
- LDA ZP,X
STA SORTHEAD,X
DEX
BPL -
CLC
RTS
;*** WRITEFILE()
WRITEFILE = *
LDX #3
- LDA SORTHEAD,X
STA SORTp,X
DEX
BPL -
WRITElINE = *
LDA SORTp+3
CMP #ACEmEMnULL
BEQ WRITEeXIT
LDA #<SORTBUF
LDY #>SORTBUF
JSR FETCHLINE
JSR PUTLINE
LDX #3
- LDA SORTBUF,X
STA SORTp,X
DEX
BPL -
JMP WRITElINE
WRITEeXIT = *
RTS
;*** REVERSElIST()
REVERSEfILE = *
LDX #3
- LDA SORTHEAD,X
STA ZP,X
LDA #ACEmEMnULL
STA SORTHEAD,X
DEX
BPL -
REVERSElINE = *
LDA ZP+3
CMP #ACEmEMnULL
BEQ REVERSEeXIT
LDX #SORTp
LDY #4
JSR ZPLOAD
LDX #SORTHEAD
LDY #4
JSR ZPSTORE
LDX #3
- LDA ZP,X
STA SORTHEAD,X
LDA SORTp,X
STA ZP,X
DEX
BPL -
BMI REVERSElINE
REVERSEeXIT = *
RTS
;*** FREEFILE()
FREEFILE = *
LDX #3
- LDA SORTHEAD,X
STA ZP,X
DEX
BPL -
FREElINE = *
LDA ZP+3
CMP #ACEmEMnULL
BNE +
RTS
+ LDX #HEADER
LDY #5
JSR ZPLOAD
LDA HEADER+4
LDY #0
JSR FREE
LDX #3
- LDA HEADER,X
STA ZP,X
DEX
BPL -
JMP FREElINE
ECHOsTATUS = *
LDX #STDERR
JMP PUTC
;===DYNAMIC MEMORY ROUTINES===
MALLOCwORK = $60
MALLOChEAD .BUF 4
TPAfREEfIRST .BUF 1
TPAfREEmIN .BUF 1
TPAfREEpAGES .BUF 1
TPAaREAsTART .BUF 1
TPAaREAeND .BUF 1
;*** MALLOCiNIT()
MALLOCiNIT = *
LDA #ACEmEMnULL
STA MALLOChEAD+3
LDX #0
LDA #$FF
- STA TPAfREEMAP,X
INX
BNE -
LDX #>BSSeND
LDA #<BSSeND
BEQ +
INX
+ STX TPAfREEfIRST
STX TPAaREAsTART
LDX ACEsTACKpTR+1
STX MALLOCwORK
STX TPAaREAeND
TXA
SEC
SBC TPAfREEfIRST
BCS +
LDA #0
+ STA TPAfREEpAGES
CLC
ADC #1
STA TPAfREEmIN
LDX TPAfREEfIRST
CPX MALLOCwORK
BCS +
LDA #$00
- STA TPAfREEMAP,X
INX
CPX MALLOCwORK
BCC -
+ RTS
LIBpAGES .BUF 1
LIBpAGEaLLOC = * ;( .a=PAGES ) : [ZP]
STA LIBpAGES
LDX #$00
LDY #ACEmEMiNTERNAL-1
JSR PAGEALLOC
BCS +
RTS
+ JSR TPApAGEaLLOC
BCS +
RTS
+ LDA LIBpAGES
LDX #ACEmEMiNTERNAL
LDY #$FF
JSR PAGEALLOC
BCS +
RTS
+ LDA #<NOMEMmSG
LDY #>NOMEMmSG
JSR EPUTS
LDA #1
JMP EXIT
NOMEMmSG = *
.BYTE CHRcr
.ASC "iNSUFFICIENT MEMORY, ABORTING."
.BYTE CHRcr,0
NEWMAX .BUF 1
TPApAGEaLLOC = * ;( LIBpAGES ) : [ZP]
LDA LIBpAGES
CMP TPAfREEmIN
BCS TPAfREEMAPfULL
;** FIRST FREE
LDX TPAfREEfIRST
LDA TPAfREEMAP,X
BEQ ++
- INX
BEQ TPAfREEMAPfULL
LDA TPAfREEMAP,X
BNE -
STX TPAfREEfIRST
JMP ++
TPAfREEMAPfULL = *
LDA LIBpAGES
CMP TPAfREEmIN
BCS +
STA TPAfREEmIN
+ SEC
RTS
;** SEARCH
+ DEX
- LDY LIBpAGES
- INX
BEQ TPAfREEMAPfULL
LDA TPAfREEMAP,X
BNE --
DEY
BNE -
;** ALLOCATE
STX NEWMAX
LDY LIBpAGES
LDA #$41
- STA TPAfREEMAP,X
DEX
DEY
BNE -
INX
CPX TPAfREEfIRST
BNE +
LDY NEWMAX
INY
STY TPAfREEfIRST
+ SEC
LDA TPAfREEpAGES
SBC LIBpAGES
STA TPAfREEpAGES
LDA #0
LDY #ACEmEMiNTERNAL
STA ZP+0
STX ZP+1
STA ZP+2
STY ZP+3
CLC
RTS
MALLOClENsAVE .BUF 3
MALLOC = *
STA MALLOClENsAVE+0
STY MALLOClENsAVE+1
JSR LIBmALLOC
BCS +
RTS
+ LDX MALLOClENsAVE+1
LDA MALLOClENsAVE+0
BEQ +
INX
+ TXA
CPX #>1024
BCS +
LDX #>1024
+ TXA
STA MALLOClENsAVE+2
JSR LIBpAGEaLLOC
BCC +
RTS
+ LDA #0
LDY MALLOClENsAVE+2
JSR FREE
LDA MALLOClENsAVE+0
LDY MALLOClENsAVE+1
JMP MALLOC
;*** MALLOC( .ay=bYTES ) : [ZP]=fARpOINTER
MALLOCmEMnEXTpTR = MALLOCwORK+0 ;(4)
MALLOCmEMlENGTH = MALLOCwORK+4 ;(2)
MALLOClENGTH = MALLOCwORK+6 ;(2)
MALLOCq = MALLOCwORK+8 ;(4)
LIBmALLOC = *
CLC
ADC #7
BCC +
INY
+ AND #$F8
STA MALLOClENGTH
STY MALLOClENGTH+1
LDX #3
- LDA MALLOChEAD,X
STA ZP,X
LDA #ACEmEMnULL
STA MALLOCq,X
DEX
BPL -
MALLOClOOK = *
LDA ZP+3
CMP #ACEmEMnULL
BNE +
MALLOCeRROReXIT = *
LDA #ACEmEMnULL
STA ZP+3
LDA #ACEeRRiNSUFFICIENTmEMORY
STA ERRNO
SEC
RTS
+ LDX #MALLOCmEMnEXTpTR
LDY #6
JSR ZPLOAD
LDA MALLOCmEMlENGTH
CMP MALLOClENGTH
LDA MALLOCmEMlENGTH+1
SBC MALLOClENGTH+1
BCS MALLOCgOTbLOCK
LDX #3
- LDA ZP,X
STA MALLOCq,X
LDA MALLOCmEMnEXTpTR,X
STA ZP,X
DEX
BPL -
JMP MALLOClOOK
MALLOCgOTbLOCK = *
LDA MALLOCmEMlENGTH
CMP MALLOClENGTH
BNE +
LDA MALLOCmEMlENGTH+1
SBC MALLOClENGTH+1
BEQ MALLOCtAKEwHOLEbLOCK
+ SEC
LDA MALLOCmEMlENGTH
SBC MALLOClENGTH
STA MALLOCmEMlENGTH
LDA MALLOCmEMlENGTH+1
SBC MALLOClENGTH+1
STA MALLOCmEMlENGTH+1
LDX #MALLOCmEMnEXTpTR
LDY #6
JSR ZPSTORE
CLC
LDA ZP+0
ADC MALLOCmEMlENGTH
STA ZP+0
LDA ZP+1
ADC MALLOCmEMlENGTH+1
STA ZP+1
CLC
RTS
MALLOCtAKEwHOLEbLOCK = *
LDA MALLOCq+3
CMP #ACEmEMnULL
BNE +
LDX #3
- LDA MALLOCmEMnEXTpTR,X
STA MALLOChEAD,X
DEX
BPL -
CLC
RTS
+ LDX #3
- LDA ZP,X
LDY MALLOCq,X
STA MALLOCq,X
STY ZP,X
DEX
BPL -
LDX #MALLOCmEMnEXTpTR
LDY #4
JSR ZPSTORE
LDX #3
- LDA MALLOCq,X
STA ZP,X
DEX
BPL -
CLC
RTS
;*** FREE( [ZP]=fARpOINTER, .ay=lENGTH ) {$7b}ALTERS [ZP]{$7d}
FREEmEMnEXTpTR = MALLOCwORK+0 ;(4)
FREEmEMlENGTH = MALLOCwORK+4 ;(2)
FREElENGTH = MALLOCwORK+6 ;(2)
FREEnEWpTR = MALLOCwORK+8 ;(4)
FREEq = MALLOCwORK+12 ;(4)
FREE = *
CLC
ADC #7
BCC +
INY
+ AND #$F8
STA FREElENGTH+0
STY FREElENGTH+1
LDX #3
- LDA ZP,X
STA FREEnEWpTR,X
LDA MALLOChEAD,X
STA ZP,X
LDA #ACEmEMnULL
STA FREEq,X
DEX
BPL -
FREEsEARCHlOOP = *
LDA ZP+3
CMP #ACEmEMnULL
BEQ FREEcOALESCEqANDnEW
LDA ZP+0
CMP FREEnEWpTR+0
LDA ZP+1
SBC FREEnEWpTR+1
LDA ZP+2
SBC FREEnEWpTR+2
LDA ZP+3
SBC FREEnEWpTR+3
BCS FREEcOALESCEqANDnEW
+ LDX #FREEmEMnEXTpTR
LDY #4
JSR ZPLOAD
LDX #3
- LDA ZP,X
STA FREEq,X
LDA FREEmEMnEXTpTR,X
STA ZP,X
DEX
BPL -
BMI FREEsEARCHlOOP
FREEcOALESCEqANDnEW = *
LDX #3
- LDA FREEq,X
STA ZP,X
DEX
BPL -
LDA ZP+3
CMP #ACEmEMnULL
BNE +
;** PREV IS HEAD
LDX #3
- LDA MALLOChEAD,X
STA FREEmEMnEXTpTR,X
LDA FREEnEWpTR,X
STA MALLOChEAD,X
DEX
BPL -
LDA FREElENGTH+0
LDY FREElENGTH+1
STA FREEmEMlENGTH+0
STY FREEmEMlENGTH+1
JMP FREEcOALESCEnEWaNDp
;** PREV IS REAL
+ LDX #FREEmEMnEXTpTR
LDY #6
JSR ZPLOAD
LDA ZP+3
CMP FREEnEWpTR+3
BNE +
LDA ZP+2
CMP FREEnEWpTR+2
BNE +
CLC
LDA ZP
ADC FREEmEMlENGTH
TAX
LDA ZP+1
ADC FREEmEMlENGTH+1
CMP FREEnEWpTR+1
BNE +
CPX FREEnEWpTR
BNE +
;** PREV DOES COALESCE
CLC
LDA FREEmEMlENGTH
ADC FREElENGTH
STA FREEmEMlENGTH
LDA FREEmEMlENGTH+1
ADC FREElENGTH+1
STA FREEmEMlENGTH+1
LDX #3
- LDA FREEq,X
STA FREEnEWpTR,X
DEX
BPL -
BMI FREEcOALESCEnEWaNDp
;** PREV DOES NOT COALESCE
+ LDX #FREEnEWpTR
LDY #4
JSR ZPSTORE
LDA FREElENGTH+0
LDY FREElENGTH+1
STA FREEmEMlENGTH+0
STY FREEmEMlENGTH+1
FREEcOALESCEnEWaNDp = *
LDA FREEnEWpTR+3
CMP FREEmEMnEXTpTR+3
BNE +
LDA FREEnEWpTR+2
CMP FREEmEMnEXTpTR+2
BNE +
CLC
LDA FREEnEWpTR
ADC FREEmEMlENGTH
TAX
LDA FREEnEWpTR+1
ADC FREEmEMlENGTH+1
CMP FREEmEMnEXTpTR+1
BNE +
CPX FREEmEMnEXTpTR
BNE +
;** NEW AND NEXT COALESCE
LDX #3
- LDA FREEmEMnEXTpTR,X
STA ZP,X
DEX
BPL -
LDA FREEmEMlENGTH+1
PHA
LDA FREEmEMlENGTH+0
PHA
LDX #FREEmEMnEXTpTR
LDY #6
JSR ZPLOAD
CLC
PLA
ADC FREEmEMlENGTH+0
STA FREEmEMlENGTH+0
PLA
ADC FREEmEMlENGTH+1
STA FREEmEMlENGTH+1
+ LDX #3
- LDA FREEnEWpTR,X
STA ZP,X
DEX
BPL -
LDX #FREEmEMnEXTpTR
LDY #6
JSR ZPSTORE
CLC
RTS
;=== LINE i/o ROUTINES ===
YSAVE = $70
GETLINE = * ;( INFILE ) : SORTLINE, .cs=EOF
LDY #0
- STY YSAVE
JSR GETbYTE
LDY YSAVE
BCS +
STA SORTLINE,Y
INY
CPY #240
BCS GETLINEeXIT
CMP #13
BNE -
DEY
GETLINEeXIT = *
LDA #0
STA SORTLINE,Y
CLC
TYA
ADC #6
STA SORTBUFLEN
CLC
+ RTS
PUTLINE = * ;( SORTBUF )
JSR STOPKEY
BCC +
JSR STOPPED
+ LDY SORTBUFLEN
LDA #13
STA SORTBUF-1,Y
LDA #<SORTLINE
LDY #>SORTLINE
STA ZP+0
STY ZP+1
SEC
LDA SORTBUFLEN
SBC #5
LDY #0
LDX #STDOUT
JSR WRITE
LDY SORTBUFLEN
LDA #0
STA SORTBUF-1,Y
RTS
GETbYTE = *
LDA BUFcOUNT
BEQ GETbYTEfILLbUF
LDY BUFpTR
LDA INbUF,Y
INC BUFpTR
DEC BUFcOUNT
CLC
RTS
GETbYTEfILLbUF = *
JSR STOPKEY
BCC +
JSR STOPPED
+ LDA #<INbUF
LDY #>INbUF
STA ZP+0
STY ZP+1
LDA #254
LDY #0
STY BUFpTR
LDX INFILE
JSR READ
BEQ +
BCS +
STA BUFcOUNT
JMP GETbYTE
+ SEC
RTS
;===BSS===
BSS = *
SORTBUF = BSS+0
SORTBUFLEN = SORTBUF+4
SORTLINE = SORTBUF+5
CMPBUF = SORTBUF+256
CMPBUFLEN = CMPBUF+4
CMPLINE = CMPBUF+5
INbUF = CMPBUF+256
TPAfREEMAP = INbUF+256
BSSeND = TPAfREEMAP+256
TR.S
476
;*** TRANSLATION PROGRAM - BY cRAIG bRUCE, STARTED 10-jUL-93
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:TR"
JMP MAIN
.ASC "Cb"
.BYTE $06
;*** GLOBAL DECLARATIONS
LIBWORK = $40
CHRcr = $0D
CHRqUOTE = $22
MAXlINElEN = 2049
TRUE = $FF
FALSE = $00
TRpETSCII = 0
TRaSCIIcRlF = 1
TRaSCIIlF = 2
TRaSCIIcR = 3
TRsPEEDSCRIPT = 4
TRfROM .BUF 1
TRtO .BUF 1
;******** STANDARD LIBRARY ********
PUTS = *
LDX #STDOUT
FPUTS = *
STA ZP
STY ZP+1
LDY #$FF
- INY
LDA (ZP),Y
BNE -
TYA
LDY #0
JMP WRITE
EPUTS = *
LDX #STDERR
JMP FPUTS
PUTCHAR = *
LDX #STDOUT
PUTC = *
STA PUTCbUFFER
LDA #<PUTCbUFFER
LDY #>PUTCbUFFER
STA ZP
STY ZP+1
LDA #1
LDY #0
JMP WRITE
PUTCbUFFER .BUF 1
GETARG = *
STY ZP+1
ASL
STA ZP
ROL ZP+1
CLC
LDA ACEaRGV
ADC ZP
STA ZP
LDA ACEaRGV+1
ADC ZP+1
STA ZP+1
LDY #0
LDA (ZP),Y
TAX
INY
LDA (ZP),Y
STX ZP
STA ZP+1
RTS
;===MAIN===
ARG = 2
NAME = 4
STRING = 8
MAIN = *
LDA #TRaSCIIcRlF
STA TRfROM
LDA #TRpETSCII
STA TRtO
;** CHECK ARGUMENT COUNT
LDA ACEaRGC+1
BNE ENOUGHaRGS
LDA ACEaRGC+0
CMP #2
BCS ENOUGHaRGS
JMP USAGE
ENOUGHaRGS = *
LDA #1
LDY #0
STA ARG+0
STY ARG+1
JSR GETARG
LDY #0
LDA (ZP),Y
CMP #"-"
BNE FILEaRG
INC ARG
INY
JSR GETtRtYPE
STX TRfROM
INY
JSR GETtRtYPE
STX TRtO
FILEaRG = *
JSR INIToUTbUF
- JSR STOPKEY
BCC +
JMP STOPPED
+ LDA ARG+0
LDY ARG+1
JSR GETARG
LDA ZP+0
LDY ZP+1
STA NAME+0
STY NAME+1
ORA ZP+1
BEQ MAINeXIT
JSR TRfILE
BCC +
JSR ERROR
+ INC ARG+0
BNE +
INC ARG+1
+ JMP -
MAINeXIT = *
JSR FLUSHoUTbUF
RTS
GETtRtYPE = * ;( (ZP)+.Y=STR ) : .x=TYPE
LDA (ZP),Y
INY
LDX #TRpETSCII
CMP #"P"
BEQ GETtRrET
LDX #TRsPEEDSCRIPT
CMP #"S"
BEQ GETtRrET
LDX #TRaSCIIlF
CMP #"U"
BEQ GETtRrET
LDX #TRaSCIIcRlF
CMP #"M"
BEQ GETtRrET
LDX #TRpETSCII
CMP #"C"
BEQ GETtRrET
CMP #"A"
BNE USAGE
LDA (ZP),Y
INY
LDX #TRaSCIIlF
CMP #"L"
BEQ GETtRrET
LDX #TRaSCIIcR
CMP #"C"
BEQ GETtRrET
CMP #"R"
BEQ GETtRrET
DEY
LDX #TRaSCIIcRlF
GETtRrET = *
CLC
RTS
USAGE = *
LDA #<USAGEmSG
LDY #>USAGEmSG
JSR EPUTS
LDA #1
JMP EXIT
USAGEmSG = *
.ASC "USAGE: TR [-FROMSET2TOSET] FILE ..."
.BYTE CHRcr
.ASC "WHERE FROMSET/TOSET=P,A,AL,AC,S,C,U,M"
.BYTE CHRcr
.ASC "(PETSCII,ASC-CRLF,ASC-LF,ASC-CR,"
.BYTE CHRcr
.ASC " SPEEDSCRIPT,COMMODORE,UNIX,MS-DOS)"
.BYTE CHRcr,0
STOPPED = *
LDA #<STOPPEDmSG
LDY #>STOPPEDmSG
JSR EPUTS
LDA #1
JMP EXIT
STOPPEDmSG = *
.ASC "<sTOPPED>"
.BYTE CHRcr,0
ERROR = *
LDA #<ERRORmSG1
LDY #>ERRORmSG1
JSR EPUTS
LDA NAME+0
LDY NAME+1
JSR EPUTS
LDA #<ERRORmSG2
LDY #>ERRORmSG2
JMP EPUTS
ERRORmSG1 = *
.ASC "eRROR READING FILE "
.BYTE CHRqUOTE,0
ERRORmSG2 = *
.BYTE CHRqUOTE,CHRcr,0
BUFpTR = 10 ;(2)
BUFcOUNT = 12 ;(2)
INFILE = 14 ;(1)
INbUFlEN = 16 ;(2)
READtRtAB = 18 ;(2)
WRITEtRtAB = 20 ;(2)
OUTbUFcOUNT = 22 ;(1)
TRfILE = *
JSR INITtR
JSR INITiNbUF
LDA NAME+0
LDY NAME+1
STA ZP+0
STY ZP+1
LDA #"R"
JSR OPEN
BCC +
RTS
+ STA INFILE
JSR TRbODY
LDA INFILE
JSR CLOSE
RTS
TRbODY = *
JSR GETbYTE
BCS BODYeXIT
LDX TRfROM
BEQ BODYwRITE
CMP #13
BNE +
CPX #TRaSCIIcRlF
BEQ TRbODY
CPX #TRaSCIIcR
BEQ BODYwRITE
+ TAY
LDA (READtRtAB),Y
BODYwRITE = *
LDX TRtO
BEQ BODYrEP
CMP #13
BNE +
CPX #TRsPEEDSCRIPT
BEQ +
CPX #TRaSCIIcR
BEQ BODYrEP
CPX #TRaSCIIlF
BEQ +
JSR PUTbYTE
LDA #13
+ TAY
LDA (WRITEtRtAB),Y
BODYrEP = *
JSR PUTbYTE
JMP TRbODY
BODYeXIT = *
RTS
GETbYTE = *
LDA BUFcOUNT+0
ORA BUFcOUNT+1
BEQ GETbYTEfILLbUF
LDY #0
LDA (BUFpTR),Y
INC BUFpTR+0
BNE +
INC BUFpTR+1
+ LDX BUFcOUNT+0
BNE +
DEC BUFcOUNT+1
+ DEC BUFcOUNT+0
CLC
RTS
GETbYTEfILLbUF = *
JSR STOPKEY
BCC +
JSR STOPPED
+ LDA #<INbUF
LDY #>INbUF
STA ZP+0
STY ZP+1
STA BUFpTR+0
STY BUFpTR+1
LDA INbUFlEN+0
LDY INbUFlEN+1
LDX INFILE
JSR READ
BEQ +
BCS +
STA BUFcOUNT+0
STY BUFcOUNT+1
JMP GETbYTE
+ SEC
RTS
INITiNbUF = *
SEC
LDA ACEsTACKpTR+0
SBC #<INbUF
STA INbUFlEN+0
LDA ACEsTACKpTR+1
SBC #>INbUF
STA INbUFlEN+1
LDA #0
STA BUFcOUNT+0
STA BUFcOUNT+1
LDX #STDOUT
JSR DEVINFO
CMP #0
BNE +
LDA #<254
LDY #>254
STA INbUFlEN+0
STY INbUFlEN+1
+ RTS
PUTbYTE = *
LDX OUTbUFcOUNT
CPX #254
BCC +
PHA
JSR FLUSHoUTbUF
PLA
LDX OUTbUFcOUNT
+ STA OUTbUF,X
INC OUTbUFcOUNT
RTS
FLUSHoUTbUF = *
JSR STOPKEY
BCC +
JMP STOPPED
+ LDA #<OUTbUF
LDY #>OUTbUF
STA ZP+0
STY ZP+1
LDA OUTbUFcOUNT
LDY #0
LDX #STDOUT
JSR WRITE
LDA #0
STA OUTbUFcOUNT
RTS
INIToUTbUF = *
LDA #0
STA OUTbUFcOUNT
RTS
INITtR = *
LDA TRfROM
ASL
TAX
LDA READtR,X
STA READtRtAB+0
LDA READtR+1,X
STA READtRtAB+1
LDA TRtO
ASL
TAX
LDA WRITEtR,X
STA WRITEtRtAB+0
LDA WRITEtR+1,X
STA WRITEtRtAB+1
RTS
READtR .WORD 0,ASCtOpET,ASCtOpET,ASCtOpET,SPDtOpET
WRITEtR .WORD 0,PETtOaSC,PETtOaSC,PETtOaSC,PETtOsPD
ASCtOpET = *
;0 1 2 3 4 5 6 7 8 9 A B C D E F
.BYTE $00,$01,$02,$03,$04,$05,$06,$07,$9D,$09,$0D,$0B,$93,$0A,$0E,$0F ;0
.BYTE $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1A,$1B,$1C,$1D,$1E,$1F ;1
.BYTE $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F ;2
.BYTE $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F ;3
.BYTE $40,$C1,$C2,$C3,$C4,$C5,$C6,$C7,$C8,$C9,$CA,$CB,$CC,$CD,$CE,$CF ;4
.BYTE $D0,$D1,$D2,$D3,$D4,$D5,$D6,$D7,$D8,$D9,$DA,$5B,$5C,$5D,$5E,$5F ;5
.BYTE $C0,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F ;6
.BYTE $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$DB,$DC,$DD,$DE,$DF ;7
.BYTE $80,$81,$82,$83,$84,$85,$86,$87,$88,$89,$8A,$8B,$8C,$8D,$8E,$8F ;8
.BYTE $90,$91,$92,$0C,$94,$95,$96,$97,$98,$99,$9A,$9B,$9C,$08,$9E,$9F ;9
.BYTE $A0,$A1,$A2,$A3,$A4,$A5,$A6,$A7,$A8,$A9,$AA,$AB,$AC,$AD,$AE,$AF ;A
.BYTE $B0,$B1,$B2,$B3,$B4,$B5,$B6,$B7,$B8,$B9,$BA,$BB,$BC,$BD,$BE,$BF ;B
.BYTE $60,$61,$62,$63,$64,$65,$66,$67,$68,$69,$6A,$6B,$6C,$6D,$6E,$6F ;C
.BYTE $70,$71,$72,$73,$74,$75,$76,$77,$78,$79,$7A,$7B,$7C,$7D,$7E,$7F ;D
.BYTE $E0,$E1,$E2,$E3,$E4,$E5,$E6,$E7,$E8,$E9,$EA,$EB,$EC,$ED,$EE,$EF ;E
.BYTE $F0,$F1,$F2,$F3,$F4,$F5,$F6,$F7,$F8,$F9,$FA,$FB,$FC,$FD,$FE,$FF ;F
SPDtOpET = *
;0 1 2 3 4 5 6 7 8 9 A B C D E F
.BYTE $40,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F ;0
.BYTE $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$5B,$5C,$5D,$5E,$0D ;1
.BYTE $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F ;2
.BYTE $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F ;3
.BYTE $C0,$C1,$C2,$C3,$C4,$C5,$C6,$C7,$C8,$C9,$CA,$CB,$CC,$CD,$CE,$CF ;4
.BYTE $D0,$D1,$D2,$D3,$D4,$D5,$D6,$D7,$D8,$D9,$DA,$DB,$DC,$DD,$DE,$DF ;5
.BYTE $A0,$A1,$A2,$A3,$A4,$A5,$A6,$A7,$A8,$A9,$AA,$AB,$AC,$AD,$AE,$AF ;6
.BYTE $B0,$B1,$B2,$B3,$B4,$B5,$B6,$B7,$B8,$B9,$BA,$BB,$BC,$BD,$BE,$BF ;7
.BYTE $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$0B,$0C,$5F,$0E,$0F ;8
.BYTE $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1A,$1B,$1C,$1D,$1E,$1F ;9
.BYTE $E0,$E1,$E2,$E3,$E4,$E5,$E6,$E7,$E8,$E9,$EA,$EB,$EC,$ED,$EE,$EF ;A
.BYTE $F0,$F1,$F2,$F3,$F4,$F5,$F6,$F7,$F8,$F9,$FA,$FB,$FC,$FD,$FE,$FF ;B
.BYTE $80,$81,$82,$83,$84,$85,$86,$87,$88,$89,$8A,$8B,$8C,$8D,$8E,$8F ;C
.BYTE $90,$91,$92,$93,$94,$95,$96,$97,$98,$99,$9A,$9B,$9C,$9D,$9E,$9F ;D
.BYTE $60,$61,$62,$63,$64,$65,$66,$67,$68,$69,$6A,$6B,$6C,$6D,$6E,$6F ;E
.BYTE $70,$71,$72,$73,$74,$75,$76,$77,$78,$79,$7A,$7B,$7C,$7D,$7E,$7F ;F
PETtOaSC = *
;0 1 2 3 4 5 6 7 8 9 A B C D E F
.BYTE $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0D,$0B,$93,$0A,$0E,$0F ;0
.BYTE $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1A,$1B,$1C,$1D,$1E,$1F ;1
.BYTE $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F ;2
.BYTE $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F ;3
.BYTE $40,$61,$62,$63,$64,$65,$66,$67,$68,$69,$6A,$6B,$6C,$6D,$6E,$6F ;4
.BYTE $70,$71,$72,$73,$74,$75,$76,$77,$78,$79,$7A,$5B,$5C,$5D,$5E,$5F ;5
.BYTE $C0,$C1,$C2,$C3,$C4,$C5,$C6,$C7,$C8,$C9,$CA,$CB,$CC,$CD,$CE,$CF ;6
.BYTE $D0,$D1,$D2,$D3,$D4,$D5,$D6,$D7,$D8,$D9,$DA,$DB,$DC,$DD,$DE,$DF ;7
.BYTE $80,$81,$82,$83,$84,$85,$86,$87,$88,$89,$8A,$8B,$8C,$8D,$8E,$8F ;8
.BYTE $90,$91,$92,$93,$94,$95,$96,$97,$98,$99,$9A,$9B,$9C,$9D,$9E,$9F ;9
.BYTE $A0,$A1,$A2,$A3,$A4,$A5,$A6,$A7,$A8,$A9,$AA,$AB,$AC,$AD,$AE,$AF ;A
.BYTE $B0,$B1,$B2,$B3,$B4,$B5,$B6,$B7,$B8,$B9,$BA,$BB,$BC,$BD,$BE,$BF ;B
.BYTE $60,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F ;C
.BYTE $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$7B,$7C,$7D,$7E,$7F ;D
.BYTE $E0,$E1,$E2,$E3,$E4,$E5,$E6,$E7,$E8,$E9,$EA,$EB,$EC,$ED,$EE,$EF ;E
.BYTE $F0,$F1,$F2,$F3,$F4,$F5,$F6,$F7,$F8,$F9,$FA,$FB,$FC,$FD,$FE,$FF ;F
PETtOsPD = *
;0 1 2 3 4 5 6 7 8 9 A B C D E F
.BYTE $80,$81,$82,$83,$84,$85,$86,$87,$88,$89,$8A,$8B,$8C,$1F,$8E,$8F ;0
.BYTE $90,$91,$92,$93,$94,$95,$96,$97,$98,$99,$9A,$9B,$9C,$9D,$9E,$9F ;1
.BYTE $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F ;2
.BYTE $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F ;3
.BYTE $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$0B,$0C,$0D,$0E,$0F ;4
.BYTE $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1A,$1B,$1C,$1D,$1E,$8D ;5
.BYTE $E0,$E1,$E2,$E3,$E4,$E5,$E6,$E7,$E8,$E9,$EA,$EB,$EC,$ED,$EE,$EF ;6
.BYTE $F0,$F1,$F2,$F3,$F4,$F5,$F6,$F7,$F8,$F9,$FA,$FB,$FC,$FD,$FE,$FF ;7
.BYTE $C0,$C1,$C2,$C3,$C4,$C5,$C6,$C7,$C8,$C9,$CA,$CB,$CC,$CD,$CE,$CF ;8
.BYTE $D0,$D1,$D2,$D3,$D4,$D5,$D6,$D7,$D8,$D9,$DA,$DB,$DC,$DD,$DE,$DF ;9
.BYTE $60,$61,$62,$63,$64,$65,$66,$67,$68,$69,$6A,$6B,$6C,$6D,$6E,$6F ;A
.BYTE $70,$71,$72,$73,$74,$75,$76,$77,$78,$79,$7A,$7B,$7C,$7D,$7E,$7F ;B
.BYTE $40,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F ;C
.BYTE $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$5B,$5C,$5D,$5E,$5F ;D
.BYTE $A0,$A1,$A2,$A3,$A4,$A5,$A6,$A7,$A8,$A9,$AA,$AB,$AC,$AD,$AE,$AF ;E
.BYTE $B0,$B1,$B2,$B3,$B4,$B5,$B6,$B7,$B8,$B9,$BA,$BB,$BC,$BD,$BE,$BF ;F
;===BSS===
BSS = *
OUTbUF = BSS
INbUF = OUTbUF+256
UNBCODE.S
812
;*** unbcode: BCODE DECODER VERSION 1.00 - BY cRAIG bRUCE - 25-nOV-93
;ASSUMES 1-65535 SEGMENTS, 1-65536 TEMP FILES MAX, 0-4 g FILE LENGTH, 64 FRAGS
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:UNBCODE"
JMP MAIN
.ASC "Cb"
;*** GLOBAL DECLARATIONS
CHRlf = $0A
CHRcr = $0D
CHRqUOTE = $22
TRUE = $FF
FALSE = $00
MAXcHUNK = 64
MAXlINE = 85
MAXfILENAME = 85
MAXhAVE = 64
MAXtEMPNAME = 20
COPYbUFsIZE = 4096
VERSION .ASC "1.00"
.BYTE 0
HRfROMsEG = 0 ;(2)
HRtOsEG = 2 ;(2)
HRtEMPfILEnAME = 4 ;(2)
HRvALIDlENGTH = 6 ;(4)
HRiSeND = 10 ;(1)
HRfILENAME = 11 ;(17)
HRsIZE = 32 ;(REALLY 28)
ASCIIfILE .BUF 1
TEMP .BUF 1
PROGnAME .BUF 2
INFORMATIVE .BUF 1
VERBOSE .BUF 1
DEBUG .BUF 1
READfILENAME .BUF 2
READlINEnUM .BUF 4
HAVEcOUNT .BUF 1
STATUSfILEeXISTS .BUF 1
NEXTtEMPnAME .BUF 2
FILENAMEuSED .BUF 1
ARG = 2 ;(2)
NAME = 4 ;(2)
INbUFlEN = 6 ;(2)
BUFpTR = 8 ;(2)
BUFcOUNT = 10 ;(2)
INFILE = 12 ;(1)
OUTFILE = 13 ;(1)
OUTnAME = 14 ;(2)
SEGNUM = 16 ;(4)
CONVERTlEN = 20 ;(1)
GETLINEpOS = 21 ;(1)
SCANvAL = 22 ;(4)
CRC = 26 ;(4)
BYTES = 30 ;(4)
ISeND = 34 ;(1)
CURhAVE = 35 ;(1)
TEMPnAME = 36 ;(4) : REALLY ONLY USES 2
H = 40 ;(2)
NEXTh = 42 ;(2)
HAVErEC = 44 ;(1)
FIN = 45 ;(1)
FOUT = 46 ;(1)
WORK = 112 ;(16)
CRCtABLE0 = *
.BYTE $00,$96,$2C,$BA,$19,$8F,$35,$A3,$32,$A4,$1E,$88,$2B,$BD,$07,$91
.BYTE $64,$F2,$48,$DE,$7D,$EB,$51,$C7,$56,$C0,$7A,$EC,$4F,$D9,$63,$F5
.BYTE $C8,$5E,$E4,$72,$D1,$47,$FD,$6B,$FA,$6C,$D6,$40,$E3,$75,$CF,$59
.BYTE $AC,$3A,$80,$16,$B5,$23,$99,$0F,$9E,$08,$B2,$24,$87,$11,$AB,$3D
.BYTE $90,$06,$BC,$2A,$89,$1F,$A5,$33,$A2,$34,$8E,$18,$BB,$2D,$97,$01
.BYTE $F4,$62,$D8,$4E,$ED,$7B,$C1,$57,$C6,$50,$EA,$7C,$DF,$49,$F3,$65
.BYTE $58,$CE,$74,$E2,$41,$D7,$6D,$FB,$6A,$FC,$46,$D0,$73,$E5,$5F,$C9
.BYTE $3C,$AA,$10,$86,$25,$B3,$09,$9F,$0E,$98,$22,$B4,$17,$81,$3B,$AD
.BYTE $20,$B6,$0C,$9A,$39,$AF,$15,$83,$12,$84,$3E,$A8,$0B,$9D,$27,$B1
.BYTE $44,$D2,$68,$FE,$5D,$CB,$71,$E7,$76,$E0,$5A,$CC,$6F,$F9,$43,$D5
.BYTE $E8,$7E,$C4,$52,$F1,$67,$DD,$4B,$DA,$4C,$F6,$60,$C3,$55,$EF,$79
.BYTE $8C,$1A,$A0,$36,$95,$03,$B9,$2F,$BE,$28,$92,$04,$A7,$31,$8B,$1D
.BYTE $B0,$26,$9C,$0A,$A9,$3F,$85,$13,$82,$14,$AE,$38,$9B,$0D,$B7,$21
.BYTE $D4,$42,$F8,$6E,$CD,$5B,$E1,$77,$E6,$70,$CA,$5C,$FF,$69,$D3,$45
.BYTE $78,$EE,$54,$C2,$61,$F7,$4D,$DB,$4A,$DC,$66,$F0,$53,$C5,$7F,$E9
.BYTE $1C,$8A,$30,$A6,$05,$93,$29,$BF,$2E,$B8,$02,$94,$37,$A1,$1B,$8D
CRCtABLE1 = *
.BYTE $00,$30,$61,$51,$C4,$F4,$A5,$95,$88,$B8,$E9,$D9,$4C,$7C,$2D,$1D
.BYTE $10,$20,$71,$41,$D4,$E4,$B5,$85,$98,$A8,$F9,$C9,$5C,$6C,$3D,$0D
.BYTE $20,$10,$41,$71,$E4,$D4,$85,$B5,$A8,$98,$C9,$F9,$6C,$5C,$0D,$3D
.BYTE $30,$00,$51,$61,$F4,$C4,$95,$A5,$B8,$88,$D9,$E9,$7C,$4C,$1D,$2D
.BYTE $41,$71,$20,$10,$85,$B5,$E4,$D4,$C9,$F9,$A8,$98,$0D,$3D,$6C,$5C
.BYTE $51,$61,$30,$00,$95,$A5,$F4,$C4,$D9,$E9,$B8,$88,$1D,$2D,$7C,$4C
.BYTE $61,$51,$00,$30,$A5,$95,$C4,$F4,$E9,$D9,$88,$B8,$2D,$1D,$4C,$7C
.BYTE $71,$41,$10,$20,$B5,$85,$D4,$E4,$F9,$C9,$98,$A8,$3D,$0D,$5C,$6C
.BYTE $83,$B3,$E2,$D2,$47,$77,$26,$16,$0B,$3B,$6A,$5A,$CF,$FF,$AE,$9E
.BYTE $93,$A3,$F2,$C2,$57,$67,$36,$06,$1B,$2B,$7A,$4A,$DF,$EF,$BE,$8E
.BYTE $A3,$93,$C2,$F2,$67,$57,$06,$36,$2B,$1B,$4A,$7A,$EF,$DF,$8E,$BE
.BYTE $B3,$83,$D2,$E2,$77,$47,$16,$26,$3B,$0B,$5A,$6A,$FF,$CF,$9E,$AE
.BYTE $C2,$F2,$A3,$93,$06,$36,$67,$57,$4A,$7A,$2B,$1B,$8E,$BE,$EF,$DF
.BYTE $D2,$E2,$B3,$83,$16,$26,$77,$47,$5A,$6A,$3B,$0B,$9E,$AE,$FF,$CF
.BYTE $E2,$D2,$83,$B3,$26,$16,$47,$77,$6A,$5A,$0B,$3B,$AE,$9E,$CF,$FF
.BYTE $F2,$C2,$93,$A3,$36,$06,$57,$67,$7A,$4A,$1B,$2B,$BE,$8E,$DF,$EF
CRCtABLE2 = *
.BYTE $00,$07,$0E,$09,$6D,$6A,$63,$64,$DB,$DC,$D5,$D2,$B6,$B1,$B8,$BF
.BYTE $B7,$B0,$B9,$BE,$DA,$DD,$D4,$D3,$6C,$6B,$62,$65,$01,$06,$0F,$08
.BYTE $6E,$69,$60,$67,$03,$04,$0D,$0A,$B5,$B2,$BB,$BC,$D8,$DF,$D6,$D1
.BYTE $D9,$DE,$D7,$D0,$B4,$B3,$BA,$BD,$02,$05,$0C,$0B,$6F,$68,$61,$66
.BYTE $DC,$DB,$D2,$D5,$B1,$B6,$BF,$B8,$07,$00,$09,$0E,$6A,$6D,$64,$63
.BYTE $6B,$6C,$65,$62,$06,$01,$08,$0F,$B0,$B7,$BE,$B9,$DD,$DA,$D3,$D4
.BYTE $B2,$B5,$BC,$BB,$DF,$D8,$D1,$D6,$69,$6E,$67,$60,$04,$03,$0A,$0D
.BYTE $05,$02,$0B,$0C,$68,$6F,$66,$61,$DE,$D9,$D0,$D7,$B3,$B4,$BD,$BA
.BYTE $B8,$BF,$B6,$B1,$D5,$D2,$DB,$DC,$63,$64,$6D,$6A,$0E,$09,$00,$07
.BYTE $0F,$08,$01,$06,$62,$65,$6C,$6B,$D4,$D3,$DA,$DD,$B9,$BE,$B7,$B0
.BYTE $D6,$D1,$D8,$DF,$BB,$BC,$B5,$B2,$0D,$0A,$03,$04,$60,$67,$6E,$69
.BYTE $61,$66,$6F,$68,$0C,$0B,$02,$05,$BA,$BD,$B4,$B3,$D7,$D0,$D9,$DE
.BYTE $64,$63,$6A,$6D,$09,$0E,$07,$00,$BF,$B8,$B1,$B6,$D2,$D5,$DC,$DB
.BYTE $D3,$D4,$DD,$DA,$BE,$B9,$B0,$B7,$08,$0F,$06,$01,$65,$62,$6B,$6C
.BYTE $0A,$0D,$04,$03,$67,$60,$69,$6E,$D1,$D6,$DF,$D8,$BC,$BB,$B2,$B5
.BYTE $BD,$BA,$B3,$B4,$D0,$D7,$DE,$D9,$66,$61,$68,$6F,$0B,$0C,$05,$02
CRCtABLE3 = *
.BYTE $00,$77,$EE,$99,$07,$70,$E9,$9E,$0E,$79,$E0,$97,$09,$7E,$E7,$90
.BYTE $1D,$6A,$F3,$84,$1A,$6D,$F4,$83,$13,$64,$FD,$8A,$14,$63,$FA,$8D
.BYTE $3B,$4C,$D5,$A2,$3C,$4B,$D2,$A5,$35,$42,$DB,$AC,$32,$45,$DC,$AB
.BYTE $26,$51,$C8,$BF,$21,$56,$CF,$B8,$28,$5F,$C6,$B1,$2F,$58,$C1,$B6
.BYTE $76,$01,$98,$EF,$71,$06,$9F,$E8,$78,$0F,$96,$E1,$7F,$08,$91,$E6
.BYTE $6B,$1C,$85,$F2,$6C,$1B,$82,$F5,$65,$12,$8B,$FC,$62,$15,$8C,$FB
.BYTE $4D,$3A,$A3,$D4,$4A,$3D,$A4,$D3,$43,$34,$AD,$DA,$44,$33,$AA,$DD
.BYTE $50,$27,$BE,$C9,$57,$20,$B9,$CE,$5E,$29,$B0,$C7,$59,$2E,$B7,$C0
.BYTE $ED,$9A,$03,$74,$EA,$9D,$04,$73,$E3,$94,$0D,$7A,$E4,$93,$0A,$7D
.BYTE $F0,$87,$1E,$69,$F7,$80,$19,$6E,$FE,$89,$10,$67,$F9,$8E,$17,$60
.BYTE $D6,$A1,$38,$4F,$D1,$A6,$3F,$48,$D8,$AF,$36,$41,$DF,$A8,$31,$46
.BYTE $CB,$BC,$25,$52,$CC,$BB,$22,$55,$C5,$B2,$2B,$5C,$C2,$B5,$2C,$5B
.BYTE $9B,$EC,$75,$02,$9C,$EB,$72,$05,$95,$E2,$7B,$0C,$92,$E5,$7C,$0B
.BYTE $86,$F1,$68,$1F,$81,$F6,$6F,$18,$88,$FF,$66,$11,$8F,$F8,$61,$16
.BYTE $A0,$D7,$4E,$39,$A7,$D0,$49,$3E,$AE,$D9,$40,$37,$A9,$DE,$47,$30
.BYTE $BD,$CA,$53,$24,$BA,$CD,$54,$23,$B3,$C4,$5D,$2A,$B4,$C3,$5A,$2D
;******** STANDARD LIBRARY ********
PUTS = *
LDX #STDOUT
FPUTS = *
STA ZP+0
STY ZP+1
LDY #$FF
- INY
LDA (ZP),Y
BNE -
TYA
LDY #0
JMP WRITE
EPUTS = *
LDX #STDERR
JMP FPUTS
EPUTCHAR = *
LDX #STDERR
JMP PUTC
PUTCHAR = *
LDX #STDOUT
PUTC = *
STA PUTCbUFFER
LDA #<PUTCbUFFER
LDY #>PUTCbUFFER
STA ZP+0
STY ZP+1
LDA #1
LDY #0
JMP WRITE
PUTCbUFFER .BUF 1
GETCHAR = *
LDX #STDIN
GETC = *
LDA #<GETCbUFFER
LDY #>GETCbUFFER
STA ZP+0
STY ZP+1
LDA #1
LDY #0
JSR READ
BEQ +
LDA GETCbUFFER
RTS
+ SEC
RTS
GETCbUFFER .BUF 1
GETARG = *
STY ZP+1
ASL
STA ZP+0
ROL ZP+1
CLC
LDA ACEaRGV
ADC ZP+0
STA ZP+0
LDA ACEaRGV+1
ADC ZP+1
STA ZP+1
LDY #0
LDA (ZP),Y
TAX
INY
LDA (ZP),Y
STX ZP+0
STA ZP+1
RTS
;===UNBCODE===
MAIN = *
;** CHECK FOR LARGE ENOUGH tpa
SEC
LDA #<BSSeND
CMP ACEsTACKpTR+0
LDA #>BSSeND
SBC ACEsTACKpTR+1
BCC TPAoK
LDA #<TPAmSG
LDY #>TPAmSG
JSR EPUTS
DIE = *
LDA #1
LDX #0
JMP EXIT
TPAmSG = *
.ASC "iNSUFFICIENT PROGRAM SPACE TO RUN UNBCODE"
.BYTE CHRcr,0
TPAoK = *
;** CHECK ARGUMENT COUNT
LDA ACEaRGC+1
BEQ +
JMP ENOUGHaRGS
+ LDA ACEaRGC+0
CMP #2
BCC USAGE
JMP ENOUGHaRGS
USAGE = *
LDA #<USAGEmSG
LDY #>USAGEmSG
JSR EPUTS
JMP DIE
USAGEmSG = *
.ASC "USAGE: UNBCODE [-V] [-I] [-D] [-HELP] FILENAME ..."
.BYTE CHRcr
.ASC " [-V]=VERBOSE, [-I]=INFORMATIVE, [-D]=DEBUGGING INFO"
.BYTE CHRcr,0
ENOUGHaRGS = *
;** SET GLOBALS
LDA #TRUE
STA INFORMATIVE
LDA #FALSE
STA VERBOSE
LDA #FALSE
STA DEBUG
LDA #0
LDY #0
JSR GETARG
LDA ZP+0
LDY ZP+1
STA PROGnAME+0
STY PROGnAME+1
LDA #FALSE
STA FILENAMEuSED
LDA #0
STA TEMPpREFIX
STA TEMPnAME+2
STA TEMPnAME+3
JSR LOADsTATUSfILE
;** GET INPUT BUFFER LENGTH
SEC
LDA ACEsTACKpTR+0
SBC #<INbUF
STA INbUFlEN+0
LDA ACEsTACKpTR+1
SBC #>INbUF
STA INbUFlEN+1
LDA #0
STA ARG+0
STA ARG+1
MAINnEXT = *
JSR CHECKsTOP
INC ARG+0
BNE +
INC ARG+1
+ LDA ARG+0
LDY ARG+1
JSR GETARG
LDA ZP+0
ORA ZP+1
BEQ MAINeXIT
LDA ZP+0
LDY ZP+1
STA NAME+0
STY NAME+1
LDY #0
LDA (ZP),Y
CMP #"-"
BNE +
JSR HANDLEfLAGS
JMP MAINnEXT
+ JSR ECHO
JSR UNBCODE
BCC +
JSR ERROR
+ JMP MAINnEXT
MAINeXIT = *
;XX SHOULD READ FROM STDIN IF NO FILES
JSR SAVEsTATUSfILE
RTS
HANDLEfLAGS = *
INY
LDA (ZP),Y
BNE +
RTS
+ CMP #"D"
BEQ FLAGd
CMP #"V"
BEQ FLAGv
CMP #"I"
BEQ FLAGi
CMP #"H"
BNE +
JMP USAGE
+ NOP
;XX UNRECOGNIZED OPTION
JMP HANDLEfLAGS
FLAGd = *
LDA #TRUE
STA DEBUG
STA VERBOSE
STA INFORMATIVE
;XX PRINT STUFF
JMP HANDLEfLAGS
FLAGv = *
LDA #TRUE
STA VERBOSE
STA INFORMATIVE
;XX PRINT VERSION
JMP HANDLEfLAGS
FLAGi = *
LDA #TRUE
STA INFORMATIVE
JMP HANDLEfLAGS
ERROR = *
LDA #<ERRORmSG1
LDY #>ERRORmSG1
JSR EPUTS
LDA NAME+0
LDY NAME+1
JSR EPUTS
LDA #<ERRORmSG2
LDY #>ERRORmSG2
JSR EPUTS
RTS
ERRORmSG1 = *
.ASC "eRROR ATTEMPTING TO UNBCODE FILE "
.BYTE CHRqUOTE,0
ERRORmSG2 = *
.BYTE CHRqUOTE
.ASC ", CONTINUING"
.BYTE CHRcr,0
ECHO = *
LDA #<ECHOmSG1
LDY #>ECHOmSG1
JSR EPUTS
LDA NAME+0
LDY NAME+1
JSR EPUTS
LDA #<ECHOmSG2
LDY #>ECHOmSG2
JMP EPUTS
ECHOmSG1 = *
.ASC "UNBCODING FILE "
.BYTE CHRqUOTE,0
ECHOmSG2 = *
.BYTE CHRqUOTE
.ASC "..."
.BYTE CHRcr,0
CHECKsTOP = *
JSR STOPKEY
BCS +
RTS
+ LDA #<STOPPEDmSG
LDY #>STOPPEDmSG
JSR EPUTS
JMP DIE
STOPPEDmSG = *
.ASC "<sTOPPED>"
.BYTE CHRcr,0
.SEQ UNBCODEHELP.S
STATfCB .BUF 1
STAThr .BUF 1
WRITEsTATUSdATA = * ;( STATfCB )
LDA #255
STA STAThr
WRITEsTATUSnEXT = *
INC STAThr
LDA STAThr
CMP HAVEcOUNT
BCC +
RTS
+ JSR GETh
LDY #10
- LDA (H),Y
STA WORK,Y
DEY
BPL -
;** FROM SEGMENT
LDX #WORK+HRfROMsEG
JSR WRITEnUM5
;** TO SEGMENT
LDX #WORK+HRtOsEG
JSR WRITEnUM5
;** BEG/MID/END
LDX #12
LDA WORK+HRiSeND
BNE +
LDX #6
LDA WORK+HRfROMsEG+0
CMP #1
BNE +
LDA WORK+HRfROMsEG+1
CMP #0
BNE +
LDX #0
+ TXA
LDY #>BEGmIDeNDmSG
CLC
ADC #<BEGmIDeNDmSG
BCC +
INY
+ LDX STATfCB
JSR FPUTS
;** LENGTH
LDX #WORK+HRvALIDlENGTH
JSR WRITEnUM10
;** TEMP NAME
LDA #<TEMPnAMEpREFIX
LDY #>TEMPnAMEpREFIX
LDX STATfCB
JSR FPUTS
LDX #WORK+HRtEMPfILEnAME
JSR WRITEnUM5
;** FILENAME
LDA H+0
LDY H+1
CLC
ADC #HRfILENAME
BCC +
INY
+ LDX STATfCB
JSR FPUTS
LDA #CHRcr
LDX STATfCB
JSR PUTC
JMP WRITEsTATUSnEXT
BEGmIDeNDmSG = *
.BYTE "B","E","G"," "," ",0
.BYTE "M","I","D"," "," ",0
.BYTE "E","N","D"," "," ",0
TEMPnAMEpREFIX = *
.ASC "0bc"
.BYTE 0
SAVEsTATUSfILE = *
BIT VERBOSE
BPL +
LDA #<SAVEsTATmSG
LDY #>SAVEsTATmSG
JSR EPUTS
+ LDA #<STATUSfILENAME
LDY #>STATUSfILENAME
STA ZP+0
STY ZP+1
LDA HAVEcOUNT
BNE ++
LDA STATUSfILEeXISTS
BNE +
RTS
+ JSR REMOVE
RTS
+ LDA #"W"
JSR OPENoVERWRITE
BCC +
LDA #<STATUSwRITEeRRmSG
LDY #>STATUSwRITEeRRmSG
JSR EPUTS
LDA #STDERR
+ STA STATfCB
JSR WRITEsTATUSdATA
LDA STATfCB
CMP #STDERR
BEQ +
JSR CLOSE
+ RTS
SAVEsTATmSG = *
.ASC "SAVING STATUS FILE 0bc-stat"
.BYTE CHRcr,0
STATUSfILENAME = *
.ASC "0bc-stat"
.BYTE 0
STATUSwRITEeRRmSG = *
.ASC "cANNOT OPEN "
.BYTE CHRqUOTE
.ASC "0bc-stat"
.BYTE CHRqUOTE
.ASC ", WRITING STATUS TO STDERR:"
.BYTE CHRcr,0
DISCARDsEGMENT = *
LDA CURhAVE
JSR GETh
LDY #HRfROMsEG
LDA SEGNUM+0
CMP (H),Y
BNE DISCARDaPPENDEDsEG
INY
LDA SEGNUM+1
CMP (H),Y
BNE DISCARDaPPENDEDsEG
;** THIS IS THE ONLY SEGMENT IN THE FRAGMENT, DELETE IT
LDA #<DISCmSG
LDY #>DISCmSG
JSR EPUTS
JSR FETCHtEMPnAME
LDA #TRUE
JSR GETtEMPnAMEsTR
LDA #<TEMPnAMEsTR
LDY #>TEMPnAMEsTR
STA ZP+0
STY ZP+1
JSR REMOVE
LDA CURhAVE
JSR REMOVEhAVErEC
DISCARDsEGeXIT = *
BIT DEBUG
BPL +
LDX #STDERR
STX STATfCB
JSR WRITEsTATUSdATA
+ RTS
DISCmSG = *
.ASC "DISCARDING SEGMENT"
.BYTE CHRcr,0
DISCARDaPPENDEDsEG = *
LDY #HRtOsEG
SEC
LDA SEGNUM+0
SBC #1
STA (H),Y
INY
LDA SEGNUM+1
SBC #0
STA (H),Y
LDA #<DISCaPPmSG
LDY #>DISCaPPmSG
JSR EPUTS
;** GET AND OPEN NEW TEMP FILE
JSR GETtEMPfILEnAMEoNLY
LDA #"W"
STA FILEmODE
JSR OPENtEMPfILE
LDA OUTFILE
STA FOUT
BCS DISCARDsEGeXIT
;** OPEN OLD TEMP FILE
LDA CURhAVE
JSR GETh
LDY #HRtEMPfILEnAME
LDA (H),Y
PHA
LDA TEMPnAME+0
STA (H),Y
PLA
STA TEMPnAME+0
INY
LDA (H),Y
PHA
LDA TEMPnAME+1
STA (H),Y
PLA
STA TEMPnAME+1
LDA #"R"
STA FILEmODE
JSR OPENtEMPfILE
LDA OUTFILE
STA FIN
BCC +
LDA FOUT
JSR CLOSE
JMP DISCARDsEGeXIT
+ STA FIN
;** COPY VALID CONTENTS INTO NEW TEMP FILE
LDX #3
LDY #HRvALIDlENGTH+3
- LDA (H),Y
STA BYTES,X
DEY
DEX
BPL -
JSR COPYfILE
;** REMOVE OLD TEMP FILE
LDA #<TEMPnAMEsTR
LDY #>TEMPnAMEsTR
STA ZP+0
STY ZP+1
JSR REMOVE
JMP DISCARDsEGeXIT
DISCaPPmSG = *
.ASC "DISCARDING APPENDED SEGMENT"
.BYTE CHRcr,0
LOADsTATUSfILE = *
BIT VERBOSE
BPL +
LDA #<LOADsTATmSG
LDY #>LOADsTATmSG
JSR EPUTS
+ LDA #0
STA HAVEcOUNT
LDA #FALSE
STA STATUSfILEeXISTS
LDA #1
LDY #0
STA NEXTtEMPnAME+0
STY NEXTtEMPnAME+1
LDA #<STATUSfILENAME
LDY #>STATUSfILENAME
STA ZP+0
STY ZP+1
LDA #"R"
JSR OPEN
BCS +
STA STATfCB
LDA #TRUE
STA STATUSfILEeXISTS
JSR SCANsTATUSfILE
LDA STATfCB
JSR CLOSE
+ RTS
LOADsTATmSG = *
.ASC "SCANNING STATUS FILE 0bc-stat"
.BYTE CHRcr,0
SSpOS .BUF 1
SCANsTATUSfILE = *
;** READ STATUS LINE
LDX #0
STX SSpOS
- LDX STATfCB
JSR GETC
BCC +
RTS
+ CMP #CHRcr
BEQ +
LDX SSpOS
CPX #MAXlINE-1
BCS -
STA INlINE,X
INC SSpOS
JMP -
+ LDA #0
LDX SSpOS
STA INlINE,X
CPX #42
BCC SCANsTATUSfILE
STA INlINE+52
;** SCAN STATUS LINE
BIT DEBUG
BPL +
LDA #<INlINE
LDY #>INlINE
JSR EPUTS
LDA #CHRcr
JSR EPUTCHAR
+ LDX #HRsIZE-1
LDA #0
- STA TEMPhAVErEC,X
DEX
BPL -
;0----+----1----+----2----+----3----+----4----+----5----+--
;00001 00002 BEG 0000001140 0bc00007 NEW4
;00004 00004 END 0000000189 0bc00004 1234567890123456.
;00002 00003 END 0000000529 0bc00006 NEW5
;** FILENAME
LDX #0
- LDA INlINE+41,X
STA TEMPhAVErEC+HRfILENAME,X
BEQ +
INX
BNE -
;** ISeND
+ LDX #TRUE
LDA INlINE+14
CMP #"E"
BEQ +
LDX #FALSE
+ STX TEMPhAVErEC+HRiSeND
;** FROMsEG
LDY #0
JSR SCANnUM
BCS SCANeRR
LDA SCANvAL+0
LDY SCANvAL+1
STA TEMPhAVErEC+HRfROMsEG+0
STY TEMPhAVErEC+HRfROMsEG+1
;** TOsEG
LDY #7
JSR SCANnUM
BCS SCANeRR
LDA SCANvAL+0
LDY SCANvAL+1
STA TEMPhAVErEC+HRtOsEG+0
STY TEMPhAVErEC+HRtOsEG+1
;** VALIDlENGTH
LDY #19
JSR SCANnUM
BCS SCANeRR
LDA SCANvAL+0
LDY SCANvAL+1
STA TEMPhAVErEC+HRvALIDlENGTH+0
STY TEMPhAVErEC+HRvALIDlENGTH+1
LDA SCANvAL+2
LDY SCANvAL+3
STA TEMPhAVErEC+HRvALIDlENGTH+2
STY TEMPhAVErEC+HRvALIDlENGTH+3
;** TEMPfILEnAME
LDY #34
JSR SCANnUM
BCS SCANeRR
LDA SCANvAL+0
LDY SCANvAL+1
STA TEMPhAVErEC+HRtEMPfILEnAME+0
STY TEMPhAVErEC+HRtEMPfILEnAME+1
;** STORE STATUS INFO
LDA HAVEcOUNT
CMP #MAXhAVE
BCC +
LDA #<SCANtOOmANYfRAGS
LDY #<SCANtOOmANYfRAGS
JSR EPUTS
SCANeRR = *
JMP SCANsTATUSfILE
+ LDA HAVEcOUNT
INC HAVEcOUNT
JSR GETh
LDY #HRsIZE-1
- LDA TEMPhAVErEC,Y
STA (H),Y
DEY
BPL -
JMP SCANsTATUSfILE
SCANtOOmANYfRAGS = *
.ASC "TOO MANY FRAGMENTS IN 0bc-stat, IGNORING FRAGMENT"
.BYTE CHRcr,0
;===BSS===
BSS = *
INlINE = BSS+0
TEMPpREFIX = INlINE+MAXlINE
TEMPnAMEsTR = TEMPpREFIX+20
HAVES = TEMPnAMEsTR+MAXfILENAME
COPYbUF = HRsIZE*MAXhAVE+HAVES
DECODEtABLE = COPYbUF+COPYbUFsIZE
TEMPhAVErEC = DECODEtABLE+256
INbUF = TEMPhAVErEC+HRsIZE
BSSeND = INbUF+64
UNBCODEHELP.S
1598
UNBCODE = *
;** OPEN FILE
LDA NAME+0
LDY NAME+1
STA ZP+0
STY ZP+1
LDA #"R"
JSR OPEN
BCC +
RTS
+ STA INFILE
;** DECODE FILE
JSR UNBCODEbODY
;** CLOSE FILE
LDA INFILE
JSR CLOSE
RTS
UNBCODEbODY = *
LDA #0
STA BUFcOUNT+0
STA BUFcOUNT+1
STA HITlASTlINE
STA LASTlINEtERMINATOR
;** SEARCH FOR "BEGIN" LINE
SEARCHlINE = *
JSR GETLINE
BCC +
CLC
RTS
+ LDA INlINE
CMP #"-"
BNE SEARCHlINE
JSR CHECKsTOP
LDX #0
LDA INlINE+2
CMP #"B"
BEQ +
LDX #ASCIIbEGIN-PETSCIIbEGIN
+ LDY #0
- LDA INlINE,Y
CMP PETSCIIbEGIN,X
BNE SEARCHlINE
INX
INY
CPY #ASCIIbEGIN-PETSCIIbEGIN
BCC -
LDY #0
CPX #ASCIIbEGIN-PETSCIIbEGIN+1
BCC +
LDY #$FF
+ STY ASCIIfILE
JMP PROCESSbEGIN
PETSCIIbEGIN = *
.ASC "--BCODE-BEGIN "
ASCIIbEGIN = *
.BYTE $2D,$2D,$62,$63,$6F,$64,$65,$2D,$62,$65,$67,$69,$6E,$20
;** PROCESS "BEGIN" LINE
PROCESSbEGIN = *
;** EXTRACT THE SEGMENT NUMBER
LDY #14
JSR SCANnUM
BCC +
JMP BEGINeRROR
+ INY
LDA SCANvAL+2
ORA SCANvAL+3
BEQ +
LDA #<SEGtOObIGmSG
LDY #>SEGtOObIGmSG
JSR EPUTS
JMP SEARCHlINE
+ LDA SCANvAL+0
LDX SCANvAL+1
STA SEGNUM+0
STX SEGNUM+1
LDA #0
STA SEGNUM+2
STA SEGNUM+3
LDA SEGNUM+0
ORA SEGNUM+1
BNE +
JMP BEGINeRROR
;** EXTRACT FILENAME, TRUNC TO 16 CHARS
+ CLC
TYA
ADC #<INlINE
STA OUTnAME+0
LDA #>INlINE
ADC #0
STA OUTnAME+1
LDY #16
LDA #0
STA (OUTnAME),Y
JSR MAKEpETSCIInAME
JSR ECHOeXTRACTnAME
;** OPEN OUTPUT FILE
JSR GETtEMPfILE
BCC +
JMP SEARCHlINE
;** READ BCODED DATA
+ JSR BUILDdECODEtABLE
JSR CRCiNIT
- JSR GETLINE
BCS UNEXPECTEDeOF
JSR CONVERTlINE
BCC +
;** CHECK IF SEGMENT-END LINE
LDA INlINE
CMP #"-"
BEQ FINISHfILE
;** REPORT INVALID CHARACTERS
LDA #<BADcHARSmSG
LDY #>BADcHARSmSG
JSR EPUTS
JMP -
+ JSR CRUNCHlINE
JSR CRClINE
JSR WRITElINE
JMP -
;** FINISH WITH FILE
FINISHfILE = *
LDA OUTFILE
JSR CLOSE
JSR CRCfINISH
JSR PROCESSfINISH
;** PROCESS FOR ANOTHER FILE
JMP SEARCHlINE
UNEXPECTEDeOF = *
LDA #<UNEXeOFmSG
LDY #>UNEXeOFmSG
JSR EPUTS
LDA OUTFILE
JSR CLOSE
JSR DISCARDsEGMENT
SEC
RTS
UNEXeOFmSG = *
.ASC "UNEXPECTED eof, IGNORING SEGMENT."
.BYTE CHRcr,0
SEGtOObIGmSG = *
.ASC "SEGMENT NUMBER IS LARGER THAN 65535, IGNORING SEGMENT."
.BYTE CHRcr,0
BADcHARSmSG = *
.ASC "WARNING: BAD CHARACTERS ON LINE, IGNORING LINE."
.BYTE CHRcr,0
MAKEpETSCIInAME = *
BIT ASCIIfILE
BMI +
RTS
+ LDY #0
- LDA (OUTnAME),Y
BEQ +
JSR CONVaSC2pET
STA (OUTnAME),Y
INY
BNE -
+ RTS
CONVaSC2pET = *
AND #$7F
CMP #$60
BCC +
CLC
ADC #$C0-$60
+ TAX
AND #$7F
CMP #"A"
BCS +
- TXA
RTS
+ CMP #"Z"+1
BCS -
TXA
EOR #$80
RTS
ECHOeXTRACTnAME = *
LDA #<ECHOeXTRACTmSG1
LDY #>ECHOeXTRACTmSG1
JSR EPUTS
LDA #<NUMBUF
LDY #>NUMBUF
STA SYSWORK+0
STY SYSWORK+1
LDA #1
LDX #SEGNUM
JSR UTOA
LDA #<NUMBUF
LDY #>NUMBUF
JSR EPUTS
LDA #<ECHOeXTRACTmSG2
LDY #>ECHOeXTRACTmSG2
JSR EPUTS
LDA OUTnAME+0
LDY OUTnAME+1
JSR EPUTS
LDA #<ECHOeXTRACTmSG3
LDY #>ECHOeXTRACTmSG3
JMP EPUTS
ECHOeXTRACTmSG1 = *
.ASC "EXTRACTING SEG "
.BYTE 0
ECHOeXTRACTmSG2 = *
.ASC " OF "
.BYTE CHRqUOTE,0
ECHOeXTRACTmSG3 = *
.BYTE CHRqUOTE,CHRcr,0
NUMBUF .BUF 12
REPORToPENeRROR = *
LDA ZP+0
LDY ZP+1
JSR EPUTS
LDA #<REPORToPENeRRORmSG
LDY #>REPORToPENeRRORmSG
JSR EPUTS
RTS
REPORToPENeRRORmSG = *
.ASC ": CANNOT OPEN, CONTINUING"
.BYTE CHRcr,0
SCANdIGIT .BUF 1
SCANsAVE .BUF 4
SCANtEMP .BUF 1
SCANiNDEX .BUF 1
SCANaNYTHING .BUF 1
SCANnUM = * ;( .y=INlINEiNDEX ) : .y=SCAN, [SCANvAL]=NUM, .cs=ERR
LDX #3
LDA #0
- STA SCANvAL,X
DEX
BPL -
LDA #0
STA SCANaNYTHING
- LDA INlINE,Y
CMP #" "
BNE SCANnUMnEXT
INY
BNE -
SEC
RTS
SCANnUMnEXT = *
LDA INlINE,Y
CMP #"0"
BCC +
CMP #"9"+1
BCC ++
+ LDA SCANaNYTHING
BEQ SCANeRROR
CLC
RTS
+ AND #$0F
STA SCANdIGIT
LDA #$FF
STA SCANaNYTHING
;** TIMES TEN
STY SCANtEMP
LDX #3
- LDA SCANvAL,X
STA SCANsAVE,X
DEX
BPL -
LDA #2
STA SCANiNDEX
- CLC
LDY #4
LDX #0
- ROL SCANvAL,X
INX
DEY
BNE -
BCS SCANeRROR
DEC SCANiNDEX
BNE --
CLC
LDY #4
LDX #0
- LDA SCANvAL,X
ADC SCANsAVE,X
STA SCANvAL,X
INX
DEY
BNE -
BCS SCANeRROR
CLC
LDY #4
LDX #0
- ROL SCANvAL,X
INX
DEY
BNE -
BCS SCANeRROR
CLC
LDY #4
LDX #0
LDA SCANdIGIT
- ADC SCANvAL,X
STA SCANvAL,X
LDA #0
INX
DEY
BNE -
BCS SCANeRROR
LDY SCANtEMP
INY
BEQ SCANeRROR
JMP SCANnUMnEXT
SCANeRROR = *
SEC
RTS
BEGINeRROR = *
LDA #<BEGINeRRORmSG
LDY #>BEGINeRRORmSG
JSR EPUTS
JMP SEARCHlINE
BEGINeRRORmSG = *
.ASC "INVALID --BCODE-BEGIN LINE FORMAT, IGNORING SEGMENT"
.BYTE CHRcr,0
CONVERTpADS .BUF 1
CONVERTcHARS .BUF 1
CONVERTlINE = *
LDX #0
STX CONVERTpADS
- LDA INlINE,X
BNE +
STX CONVERTcHARS
CLC
RTS
+ CMP #"="
BNE +
INC CONVERTpADS
+ TAY
LDA DECODEtABLE,Y
BMI +
STA INlINE,X
INX
BNE -
+ SEC
RTS
CRUNCHbYTES .BUF 1
CRUNCHlINE = *
LDX #0
LDY #0
- JSR CRUNCHqUANTUM
CPX CONVERTcHARS
BCC -
TYA
SEC
SBC CONVERTpADS
STA CRUNCHbYTES
RTS
;POS 76543210 76543210 76543210 76543210
;BYT XX111111 XX112222 XX222233 XX333333
;BIT 765432 107654 321076 543210
CRUNCHqUANTUM = * ;(.x=iN4BYTESoFFSET, .y=oUT3BYTESoFFSET) : .x++, .y++
LDA INlINE,X ;*** OUTPUT BYTE 0
ASL
ASL
STA TEMP
INX
LDA INlINE,X
LSR
LSR
LSR
LSR
AND #%00000011
ORA TEMP
STA INlINE,Y
INY
LDA INlINE,X ;*** OUTPUT BYTE 1
ASL
ASL
ASL
ASL
STA TEMP
INX
LDA INlINE,X
LSR
LSR
AND #%00001111
ORA TEMP
STA INlINE,Y
INY
LDA INlINE,X ;*** OUTPUT BYTE 2
INX
ROR
ROR
ROR
AND #%11000000
STA TEMP
LDA INlINE,X
INX
AND #%00111111
ORA TEMP
STA INlINE,Y
INY
RTS
WRITElINE = *
LDA #<INlINE
LDY #>INlINE
STA ZP+0
STY ZP+1
LDA CRUNCHbYTES
LDY #0
LDX OUTFILE
JSR WRITE
RTS
;** CRC = 0Xffffffff;
;** WHILE( (C=GETC(FP)) != eof ) {$7b}
;** CRC = (CRC>>8) & 0X00ffffff ^ CRCtABLE[ (CRC^C) & 0Xff ];
;** {$7d}
;** RETURN( CRC^0Xffffffff );
CRCiNIT = *
LDX #3
- LDA #$FF
STA CRC,X
LDA #0
STA BYTES,X
DEX
BPL -
RTS
CRClINE = *
LDY #0
CPY CRUNCHbYTES
BCS +
- LDA INlINE,Y ;.x = (CRC^C) & 0Xff
EOR CRC+0
TAX
LDA CRC+1 ;CRC = (CRC>>8) & 0X00ffffff ^ CRCtABLE[ .x ]
EOR CRCtABLE0,X
STA CRC+0
LDA CRC+2
EOR CRCtABLE1,X
STA CRC+1
LDA CRC+3
EOR CRCtABLE2,X
STA CRC+2
LDA CRCtABLE3,X
STA CRC+3
INY
CPY CRUNCHbYTES
BCC -
+ CLC
LDA BYTES+0
ADC CRUNCHbYTES
STA BYTES+0
BCC +
INC BYTES+1
BNE +
INC BYTES+2
BNE +
INC BYTES+3
+ RTS
CRCfINISH = *
LDX #3
- LDA CRC,X
EOR #$FF
STA CRC,X
DEX
BPL -
RTS
HITlASTlINE .BUF 1
LASTlINEtERMINATOR .BUF 1
GETLINE = *
LDA HITlASTlINE
BEQ +
SEC
RTS
+ LDX #0
STX GETLINEpOS
;** TOSS AN lf THAT FOLLOWS A cr
JSR GETbYTE
BCS GETLINEpROCESS
CMP #CHRlf
CLC
BNE GETLINEpROCESS
LDX LASTlINEtERMINATOR
CPX #CHRcr
CLC
BNE GETLINEpROCESS
GETLINEcHAR = *
JSR GETbYTE
GETLINEpROCESS = *
BCC +
LDA #$FF
STA HITlASTlINE
JMP GETLINEfINISH
+ CMP #CHRcr
BEQ GETLINEfINISH
CMP #CHRlf
BEQ GETLINEfINISH
LDX GETLINEpOS
CPX #98
BCS +
STA INlINE,X
INC GETLINEpOS
+ JMP GETLINEcHAR
GETLINEfINISH = *
STA LASTlINEtERMINATOR
LDX GETLINEpOS
LDA #0
STA INlINE,X
CPX #0
BEQ +
CLC
RTS
+ LDA HITlASTlINE
CMP #1
RTS
GETbYTE = *
LDA BUFcOUNT+0
ORA BUFcOUNT+1
BEQ GETbYTEfILLbUF
LDY #0
LDA (BUFpTR),Y
INC BUFpTR+0
BNE +
INC BUFpTR+1
+ LDX BUFcOUNT+0
BNE +
DEC BUFcOUNT+1
+ DEC BUFcOUNT+0
CLC
RTS
GETbYTEfILLbUF = *
JSR CHECKsTOP
LDA #<INbUF
LDY #>INbUF
STA ZP+0
STY ZP+1
STA BUFpTR+0
STY BUFpTR+1
LDA INbUFlEN+0
LDY INbUFlEN+1
LDX INFILE
JSR READ
BEQ +
BCS +
STA BUFcOUNT+0
STY BUFcOUNT+1
JSR CHECKsTOP
JMP GETbYTE
+ SEC
RTS
SETiNDEX .BUF 1
SETcOUNTDOWN .BUF 1
BUILDdECODEtABLE = *
LDX #0
LDA #$FF
- STA DECODEtABLE,X
INX
BNE -
LDY #0
LDX #0
BIT ASCIIfILE
BPL +
LDX #ASCtABLEsET-PETtABLEsET
+ STX SETiNDEX
LDA #5
STA SETcOUNTDOWN
- LDX SETiNDEX
LDA PETtABLEsET+1,X
STA TEMP
LDA PETtABLEsET+0,X
INX
INX
STX SETiNDEX
LDX TEMP
JSR BUILDsET
DEC SETcOUNTDOWN
BNE -
LDA #0
STA DECODEtABLE+$3D
RTS
PETtABLEsET .ASC "azAZ09++//"
ASCtABLEsET .BYTE $41,$5A,$61,$7A,$30,$39,$2B,$2B,$2F,$2F
SETlIMIT .BUF 1
BUILDsET = *
INX
STX SETlIMIT
TAX
- TYA
STA DECODEtABLE,X
INY
INX
CPX SETlIMIT
BCC -
RTS
PROCESSfINISH = * ;PROCESS THE BCODE-END LINE
LDA #TRUE
STA ISeND
LDX #ASCeND-PETeND-1
BIT ASCIIfILE
BPL +
LDX #PETcONT-PETeND-1
+ LDY #ASCeND-PETeND-1
JSR COMPAREfINISH
LDY #ASCeND-PETeND-1
BCC FINcHECKsEGMENT
LDA #FALSE
STA ISeND
LDX #ASCcONT-PETeND-1
BIT ASCIIfILE
BPL +
LDX #ASCcONTeND-PETeND-1
+ LDY #ASCcONT-PETcONT-1
JSR COMPAREfINISH
LDY #ASCcONT-PETcONT
BCC FINcHECKsEGMENT
LDA #0
JMP BADfINISH
FINcHECKsEGMENT = *
JSR SCANnUM
BCC +
- LDA #1
JMP BADfINISH
+ LDX #3
- LDA SCANvAL,X
CMP SEGNUM,X
BNE --
DEX
BPL -
FINcHECKsIZE = *
JSR SCANnUM
BCC +
- LDA #2
JMP BADfINISH
+ LDX #3
- LDA SCANvAL,X
CMP BYTES,X
BNE --
DEX
BPL -
FINcHECKcRC = *
INY
JSR SCANhEX
BCC +
- LDA #3
JMP BADfINISH
+ LDX #3
- LDA SCANvAL,X
CMP CRC,X
BNE --
DEX
BPL -
JSR COMMITsEGMENT
BIT DEBUG
BPL +
LDX #STDERR
STX STATfCB
JSR WRITEsTATUSdATA
+ JSR CHECKsTOP
CLC
RTS
SCANhEX = *
LDX #3
- LDA INlINE,Y
INY
JSR HEXtObIN
BCS +
ASL
ASL
ASL
ASL
STA TEMP
LDA INlINE,Y
INY
JSR HEXtObIN
BCS +
ORA TEMP
STA SCANvAL,X
DEX
BPL -
CLC
+ RTS
HEXtObINxSAVE .BUF 1
HEXtObIN = *
BIT ASCIIfILE
BPL +
STX HEXtObINxSAVE
JSR CONVaSC2pET
LDX HEXtObINxSAVE
+ CMP #"0"
BCS +
- SEC
RTS
+ CMP #"9"+1
BCC +
AND #$7F
CMP #"A"
BCC -
CMP #"F"+1
BCS -
SEC
SBC #"A"-$0A
+ AND #$0F
CLC
RTS
COMPAREfINISH = *
- LDA INlINE,Y
CMP PETeND,X
BNE +
DEX
DEY
BPL -
CLC
RTS
+ SEC
RTS
BADfINISH = * ;.a=ERROR [0=TOKEN,1=SEGMENT,2=SIZE,3=CRC]
PHA
LDA NAME+0
LDY NAME+1
JSR EPUTS
PLA
ASL
TAX
LDA BADfINvEC+1,X
TAY
LDA BADfINvEC+0,X
JSR EPUTS
LDA #<BADfINdISCARD
LDY #>BADfINdISCARD
JSR EPUTS
JSR DISCARDsEGMENT
JSR CHECKsTOP
RTS
BADfINvEC = *
.WORD BADfINtOKEN,BADfINsEGMENT,BADfINsIZE,BADfINcRC
BADfINtOKEN = *
.ASC ": INVALID TOKEN ON FINISH LINE"
.BYTE 0
BADfINsEGMENT = *
.ASC ": SEGMENT NUMBER MISMATCH"
.BYTE 0
BADfINsIZE = *
.ASC ": FILE SIZE MISMATCH"
.BYTE 0
BADfINcRC = *
.ASC ": crc-32 CHECKSUM MISMATCH"
.BYTE 0
BADfINdISCARD = *
.ASC ", IGNORING SEGMENT"
.BYTE CHRcr,0
PETeND .ASC "--BCODE-END "
ASCeND .BYTE $2D,$2D,$62,$63,$6F,$64,$65,$2D,$65,$6E,$64,$20
PETcONT .ASC "--BCODE-CONTINUED "
ASCcONT .BYTE $2D,$2D,$62,$63,$6F,$64,$65,$2D,$63,$6F,$6E,$74,$69,$6E,$75
.BYTE $65,$64,$20
ASCcONTeND = *
GETtEMPnAMEsTR = * ;( TEMPnAME, .a=PUTfILETYPE ) : TEMPnAMEsTR, (ZP)
PHA
LDA #"0"
STA TEMPnAMEsTR+0
LDA #"b"
STA TEMPnAMEsTR+1
LDA #"c"
STA TEMPnAMEsTR+2
LDA #<TEMPnAMEsTR+3
LDY #>TEMPnAMEsTR+3
STA SYSWORK+0
STY SYSWORK+1
STA ZP+0
STY ZP+1
LDX #TEMPnAME
LDA #5
JSR UTOAZ
PLA
CMP #FALSE
BEQ +
LDA #","
STA TEMPnAMEsTR+3,Y
LDA #"P"
STA TEMPnAMEsTR+4,Y
LDA #0
STA TEMPnAMEsTR+5,Y
+ RTS
UTOAZ = * ;( 0+.x=VAR32, .a=WIDTH, (SYSWORK)=STORE )
JSR UTOA
LDY #0
- LDA (SYSWORK),Y
BEQ ++
CMP #" "
BNE +
LDA #"0"
STA (SYSWORK),Y
+ INY
BNE -
+ RTS
FILEmODE .BUF 1
GETtEMPfILE = * ;( OUTnAME, SEGNUM ) : CURhAVE, CURhAVEnUM, OUTFILE, .cs=ERR
;** SEARCH TO APPEND TO EXISTING FILE
LDA #255
STA CURhAVE
CHECKnEXT = *
INC CURhAVE
LDA CURhAVE
CMP HAVEcOUNT
BCC +
JMP CANNOTaPPEND
+ JSR GETh
JSR CMPoUTnAMEh
CMP #0
BNE CHECKnEXT
LDY #HRfROMsEG
LDA SEGNUM+0
CMP (H),Y
LDA SEGNUM+1
INY
SBC (H),Y
BCC +
LDY #HRtOsEG
LDA (H),Y
CMP SEGNUM+0
INY
LDA (H),Y
SBC SEGNUM+1
BCC +
LDA #<IGNOREdUPmSG
LDY #>IGNOREdUPmSG
JSR EPUTS
SEC
RTS
IGNOREdUPmSG = *
.ASC "IGNORING DUPLICATE SEGMENT"
.BYTE CHRcr,0
+ LDY #HRtOsEG
LDA (H),Y
TAX
INY
LDA (H),Y
TAY
INX
BNE +
INY
+ CPX SEGNUM+0
BNE +
CPY SEGNUM+1
BEQ CANaPPEND
+ JMP CHECKnEXT
;** HERE WE KNOW WE CAN APPEND TO AN EXISTING TEMP FILE
CANaPPEND = *
LDA #"A"
STA FILEmODE
LDY #HRtEMPfILEnAME
LDA (H),Y
STA TEMPnAME+0
INY
LDA (H),Y
STA TEMPnAME+1
LDY #HRtOsEG
LDA SEGNUM+0
STA (H),Y
INY
LDA SEGNUM+1
STA (H),Y
LDY #HRiSeND
LDA #FALSE
STA (H),Y
JMP OPENtEMPfILE
;** CANNOT APPEND
CANNOTaPPEND = *
JSR GETtEMPfILEnAMEoNLY
;** CREATE NEW HAVE RECORD
CREATEnEWhAVErEC = *
JSR INSERThAVErEC
BCS +
LDA #"W"
STA FILEmODE
JMP OPENtEMPfILE
+ LDA #<HAVEoVERmSG
LDY #>HAVEoVERmSG
JSR EPUTS
SEC
RTS
HAVEoVERmSG = *
.ASC "FRAGMENT TABLE FULL, IGNORING CURRENT SEGMENT"
.BYTE CHRcr,0
;** OPEN TEMPORARY FILE
OPENtEMPfILE = *
LDA #TRUE
JSR GETtEMPnAMEsTR
LDA #<TEMPnAMEsTR
LDY #>TEMPnAMEsTR
STA ZP+0
STY ZP+1
LDA FILEmODE
JSR OPENoVERWRITE
BCS +
STA OUTFILE
CLC
RTS
+ LDA #<TEMPnAMEsTR
LDY #>TEMPnAMEsTR
JSR EPUTS
LDA #<OPENeRRmSG
LDY #>OPENeRRmSG
JSR EPUTS
SEC
RTS
OPENeRRmSG = *
.ASC ": CANNOT OPEN, IGNORING SEGMENT"
.BYTE CHRcr,0
GETtEMPfILEnAMEoNLY = * ;( NEXTtEMPnAME ) : TEMPnAME
LDA NEXTtEMPnAME+0
LDY NEXTtEMPnAME+1
STA TEMPnAME+0
STY TEMPnAME+1
INC NEXTtEMPnAME+0
BNE +
INC NEXTtEMPnAME+1
+ LDA #0
STA WORK
- CMP HAVEcOUNT
BCC +
RTS
+ LDA WORK
JSR GETh
LDY #HRtEMPfILEnAME
LDA (H),Y
CMP TEMPnAME+0
BNE +
INY
LDA (H),Y
CMP TEMPnAME+1
BNE +
JMP GETtEMPfILEnAMEoNLY
+ INC WORK
LDA WORK
JMP -
GETh = * ;( .a=HAVErECnUM ) : H
LDX #0
STX H+1
LDX #5
- ASL
ROL H+1
DEX
BNE -
CLC
ADC #<HAVES
STA H+0
LDA H+1
ADC #>HAVES
STA H+1
RTS
GETnEXTh = * ;( H ) : NEXTh
CLC
LDA H+0
ADC #HRsIZE
STA NEXTh+0
LDA H+1
ADC #0
STA NEXTh+1
RTS
CMPoUTnAMEh = * ;( (OUTnAME)=STR1, (H)=HREC ) : .a=CMPrESULT[0=eq,1=gt,-1=lt]
LDA H+0
LDY H+1
CLC
ADC #HRfILENAME
BCC +
INY
+ STA WORK+0
STY WORK+1
LDY #255
- INY
LDA (OUTnAME),Y
CMP (WORK),Y
BNE +
CMP #0
BNE -
LDA #0
RTS
+ BCC +
LDA #1
RTS
+ LDA #$FF
RTS
INSERThAVErEC = * ;( SEGNUM, TEMPnAME, OUTnAME ) : CURhAVE
;** ALLOCATE NEW RECORD
LDA HAVEcOUNT
CMP #MAXhAVE
BCC +
RTS
+ STA CURhAVE
INC HAVEcOUNT
;** FIND CORRECT POSITION FOR NEW RECORD
- DEC CURhAVE
LDA CURhAVE
CMP #$FF
BEQ INSERThAVErECiNIT
JSR GETh
JSR CMPoUTnAMEh
CMP #1
BEQ INSERThAVErECiNIT
CMP #0
BNE +
LDY #HRfROMsEG
LDA (H),Y
CMP SEGNUM+0
INY
LDA (H),Y
SBC SEGNUM+1
BCC INSERThAVErECiNIT
+ JSR GETnEXTh
LDY #HRsIZE-1
- LDA (H),Y
STA (NEXTh),Y
DEY
BPL -
JMP --
;** INITIALIZE RECORD
INSERThAVErECiNIT = *
INC CURhAVE
LDX #HRsIZE-1
LDA #0
- STA TEMPhAVErEC,X
DEX
BPL -
LDA SEGNUM+0
LDY SEGNUM+1
STA TEMPhAVErEC+HRfROMsEG+0
STY TEMPhAVErEC+HRfROMsEG+1
STA TEMPhAVErEC+HRtOsEG+0
STY TEMPhAVErEC+HRtOsEG+1
LDA #FALSE
STA TEMPhAVErEC+HRiSeND
LDA TEMPnAME+0
LDY TEMPnAME+1
STA TEMPhAVErEC+HRtEMPfILEnAME+0
STY TEMPhAVErEC+HRtEMPfILEnAME+1
LDY #0
- LDA (OUTnAME),Y
STA TEMPhAVErEC+HRfILENAME,Y
BEQ +
INY
CPY #16
BCC -
+ LDA CURhAVE
JSR GETh
LDY #HRsIZE-1
- LDA TEMPhAVErEC,Y
STA (H),Y
DEY
BPL -
CLC
RTS
WRITEnUM5 = * ;( 0+.x=NUM16 )
LDA 0,X
STA WORK+12
LDA 1,X
STA WORK+13
LDA #0
STA WORK+14
STA WORK+15
LDX #WORK+12
LDA #5
JMP WRITEnUM
WRITEnUM10 = * ;( 0+.x=NUM32 )
LDA #10
WRITEnUM = *
PHA
LDA #<NUMBUF
LDY #>NUMBUF
STA SYSWORK+0
STY SYSWORK+1
PLA
JSR UTOAZ
LDA #<NUMBUF
LDY #>NUMBUF
LDX STATfCB
JSR FPUTS
JSR WRITEsPACES
RTS
WRITEsPACES = *
LDA #<SPACESmSG
LDY #>SPACESmSG
LDX STATfCB
JSR FPUTS
RTS
SPACESmSG = *
.BYTE $20,$20,0
COMMITsEGMENT = *
;** ADD BYTE LENGTH, UPDATE iSeND FLAG IN HAVEREC
LDA CURhAVE
JSR GETh
LDX #4
LDY #HRvALIDlENGTH
CLC
- LDA (H),Y
ADC BYTES-HRvALIDlENGTH,Y
STA (H),Y
INY
DEX
BNE -
LDY #HRiSeND
LDA ISeND
STA (H),Y
JSR CHECKcOALESCE
JSR CHECKcOMPLETE
RTS
CHECKfILENAMEpTR .BUF 2
CHECKcOMPLETE = *
LDA CURhAVE
JSR GETh
LDY #HRiSeND
LDA (H),Y
BNE +
- RTS
+ LDY #HRfROMsEG
LDA (H),Y
CMP #1
BNE -
INY
LDA (H),Y
BNE -
JSR FETCHtEMPnAME
LDA #FALSE
JSR GETtEMPnAMEsTR
LDA #<TEMPnAMEsTR
LDY #>TEMPnAMEsTR
STA ZP+0
STY ZP+1
LDA H+0
LDY H+1
CLC
ADC #HRfILENAME
BCC +
INY
+ STA ZW+0
STY ZW+1
STA CHECKfILENAMEpTR+0
STY CHECKfILENAMEpTR+1
JSR RENAMEoVERWRITE
LDA #<COMPLETEmSG1
LDY #>COMPLETEmSG1
JSR EPUTS
LDA CHECKfILENAMEpTR+0
LDY CHECKfILENAMEpTR+1
JSR EPUTS
LDA #<COMPLETEmSG2
LDY #>COMPLETEmSG2
JSR EPUTS
LDA CURhAVE
JSR REMOVEhAVErEC
RTS
COMPLETEmSG1 = *
.ASC "--rEASSEMBLED "
.BYTE CHRqUOTE,0
COMPLETEmSG2 = *
.BYTE CHRqUOTE,CHRcr,0
REMOVEhAVErEC = * ;( .a=HAVErEC )
DEC HAVEcOUNT
STA HAVErEC
- LDA HAVErEC
CMP HAVEcOUNT
BCC +
RTS
+ LDA HAVErEC
JSR GETh
JSR GETnEXTh
LDY #HRsIZE-1
- LDA (NEXTh),Y
STA (H),Y
DEY
BPL -
INC HAVErEC
JMP --
CHECKfROMpLUS1 .BUF 2
CHECKcOALESCE = * ;( CURhAVE )
LDX CURhAVE
INX
CPX HAVEcOUNT
BCC +
- RTS
+ LDA CURhAVE
JSR GETh
JSR GETnEXTh
CLC
LDA NEXTh+0
ADC #HRfILENAME
STA OUTnAME+0
LDA NEXTh+1
ADC #0
STA OUTnAME+1
JSR CMPoUTnAMEh
CMP #0
BNE -
LDY #HRtOsEG
CLC
LDA (H),Y
ADC #1
STA CHECKfROMpLUS1+0
INY
LDA (H),Y
ADC #0
STA CHECKfROMpLUS1+1
LDY #HRfROMsEG
LDA (NEXTh),Y
CMP CHECKfROMpLUS1+0
BNE -
INY
LDA (NEXTh),Y
CMP CHECKfROMpLUS1+1
BNE -
LDA #<COALESCEmSG1
LDY #>COALESCEmSG1
JSR EPUTS
LDA H+0
LDY H+1
JSR EPUTrANGE
LDA #","
JSR EPUTCHAR
LDA #" "
JSR EPUTCHAR
LDA NEXTh+0
LDY NEXTh+1
JSR EPUTrANGE
LDA #<COALESCEmSG2
LDY #>COALESCEmSG2
JSR EPUTS
CLC
LDA H+0
ADC #HRfILENAME
LDY H+1
BCC +
INY
+ JSR EPUTS
LDA #CHRqUOTE
JSR EPUTCHAR
LDA #CHRcr
JSR EPUTCHAR
LDX CURhAVE
INX
LDA #"R"
JSR OPENtEMP
BCC +
RTS
+ STA FIN
LDX CURhAVE
LDA #"A"
JSR OPENtEMP
BCC +
LDA FIN
JSR CLOSE
+ STA FOUT
LDA CURhAVE
JSR GETh
JSR GETnEXTh
LDY #HRvALIDlENGTH+3
LDX #3
- LDA (NEXTh),Y
STA BYTES,X
DEY
DEX
BPL -
JSR COPYfILE
LDA FOUT
JSR CLOSE
LDA FIN
JSR CLOSE
LDY #HRiSeND
LDA (NEXTh),Y
STA (H),Y
LDY #HRtOsEG
LDA (NEXTh),Y
STA (H),Y
INY
LDA (NEXTh),Y
STA (H),Y
LDX #4
LDY #HRvALIDlENGTH
CLC
- LDA (H),Y
ADC (NEXTh),Y
STA (H),Y
INY
DEX
BNE -
LDA CURhAVE
CLC
ADC #1
JSR GETh
JSR FETCHtEMPnAME
LDA #FALSE
JSR GETtEMPnAMEsTR
LDA #<TEMPnAMEsTR
LDY #>TEMPnAMEsTR
STA ZP+0
STY ZP+1
JSR REMOVE
BCC +
NOP ;XX ERROR MSG
+ LDA CURhAVE
CLC
ADC #1
JSR REMOVEhAVErEC
RTS
COALESCEmSG1 = *
.ASC "COALESCING SEGS "
.BYTE 0
COALESCEmSG2 = *
.ASC " OF "
.BYTE CHRqUOTE,0
EPUTrANGE = *
STA WORK+0
STY WORK+1
LDY #HRfROMsEG
JSR EPUThAVEnUM
LDA #"-"
JSR EPUTCHAR
LDY #HRtOsEG
EPUThAVEnUM = *
LDA (WORK),Y
STA WORK+4
INY
LDA (WORK),Y
STA WORK+5
LDA #0
STA WORK+6
STA WORK+7
LDA #<NUMBUF
LDY #>NUMBUF
STA SYSWORK+0
STY SYSWORK+1
LDA #1
LDX #WORK+4
JSR UTOA
LDA #<NUMBUF
LDY #>NUMBUF
JSR EPUTS
RTS
FETCHtEMPnAME = * ;( H )
LDY #HRtEMPfILEnAME
LDA (H),Y
STA TEMPnAME+0
INY
LDA (H),Y
STA TEMPnAME+1
RTS
OPENtEMP = * ;( .x=HAVErEC, .a=MODE ) : .a=FCB, .cs=ERR
PHA
TXA
JSR GETh
JSR FETCHtEMPnAME
LDA #TRUE
JSR GETtEMPnAMEsTR
LDA #<TEMPnAMEsTR
LDY #>TEMPnAMEsTR
STA ZP+0
STY ZP+1
PLA
JSR OPEN
BCC +
LDA #<TEMPnAMEsTR
LDY #>TEMPnAMEsTR
JSR EPUTS
LDA #<OPENtEMPmSG
LDY #>OPENtEMPmSG
JSR EPUTS
SEC
+ RTS
OPENtEMPmSG = *
.ASC ": CANNOT OPEN, SHOULD BE ABLE TO, CONTINUING"
.BYTE CHRcr,0
COPYsEGlEN .BUF 2
.BYTE $00,$00
COPYfILE = * ;( FIN, FOUT, BYTES-- )
LDA #<COPYbUF
LDY #>COPYbUF
STA ZP+0
STY ZP+1
LDA BYTES+2
ORA BYTES+3
BNE +
LDA BYTES+0
CMP #<COPYbUFsIZE
LDA BYTES+1
SBC #>COPYbUFsIZE
BCS +
LDA BYTES+0
LDY BYTES+1
JMP ++
+ LDA #<COPYbUFsIZE
LDY #>COPYbUFsIZE
+ LDX FIN
JSR READ
BEQ +
STA COPYsEGlEN+0
STY COPYsEGlEN+1
LDX FOUT
JSR WRITE
SEC
LDY #4
LDX #0
- LDA BYTES,X
SBC COPYsEGlEN,X
STA BYTES,X
INX
DEY
BNE -
LDA BYTES+0
ORA BYTES+1
ORA BYTES+2
ORA BYTES+3
BNE COPYfILE
RTS
+ LDA BYTES+0
ORA BYTES+1
ORA BYTES+2
ORA BYTES+3
BNE +
RTS
+ LDA #<COPYlENmSG
LDY #>COPYlENmSG
JSR EPUTS
RTS
COPYlENmSG = *
.ASC "iNSUFFICIENT TEMP DATA COALESCED, SHOULDN'T HAPPEN, CONTINUING"
.BYTE CHRcr,0
OPENoVmODE .BUF 1
OPENoVERWRITE = * ;( (ZP)=NAME, .a=MODE ) : .a=fCB, .cs=ERR
STA OPENoVmODE
JSR OPEN
BCS +
RTS
+ LDA ERRNO
CMP #ACEeRRfILEeXISTS
BEQ +
- JSR REPORToPENeRROR
SEC
RTS
+ JSR REMOVE
LDA OPENoVmODE
JSR OPEN
BCS -
RTS
RENAMEoVnAME .BUF 2
RENAMEoVERWRITE = * ;( (ZP)=NAME, (ZW)=NEWnAME ) : .cs=ERR
JSR RENAME
BCS +
RTS
+ LDA ZP+0
LDY ZP+1
STA RENAMEoVnAME+0
STY RENAMEoVnAME+1
LDA ERRNO
CMP #ACEeRRfILEeXISTS
BEQ +
- JSR REPORTrENAMEeRROR
SEC
RTS
+ LDA ZW+0
LDY ZW+1
STA ZP+0
STY ZP+1
JSR REMOVE
LDA RENAMEoVnAME+0
LDY RENAMEoVnAME+1
STA ZP+0
STY ZP+1
JSR RENAME
BCS -
RTS
RENAMEoVnEWnAME .BUF 2
REPORTrENAMEeRROR = *
LDA ZW+0
LDY ZW+1
STA RENAMEoVnEWnAME+0
STY RENAMEoVnEWnAME+1
LDA #<RENAMEeRRmSG1
LDY #>RENAMEeRRmSG1
JSR EPUTS
LDA RENAMEoVnAME+0
LDY RENAMEoVnAME+1
JSR EPUTS
LDA #<RENAMEeRRmSG2
LDY #>RENAMEeRRmSG2
JSR EPUTS
LDA RENAMEoVnEWnAME+0
LDY RENAMEoVnEWnAME+1
JSR EPUTS
LDA #<RENAMEeRRmSG3
LDY #>RENAMEeRRmSG3
JSR EPUTS
RTS
RENAMEeRRmSG1 = *
.ASC "cANNOT RENAME "
.BYTE CHRqUOTE,0
RENAMEeRRmSG2 = *
.BYTE CHRqUOTE
.ASC " TO "
.BYTE CHRqUOTE,0
RENAMEeRRmSG3 = *
.BYTE CHRqUOTE
.ASC ", CONTINUING."
.BYTE CHRcr,0
UUDECODE.S
660
;*** UUDECODE PROGRAM
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:UUDECODE"
JMP UUDECODEmAIN
.ASC "Cb"
;*** GLOBAL DECLARATIONS
LIBWORK = $60
CHRlf = $0A
CHRcr = $0D
CHRqUOTE = $22
ASCIIfILE .BUF 1
TEMP .BUF 1
;******** STANDARD LIBRARY ********
PUTS = *
LDX #STDOUT
FPUTS = *
STA ZP
STY ZP+1
LDY #$FF
- INY
LDA (ZP),Y
BNE -
TYA
LDY #0
JMP WRITE
EPUTS = *
LDX #STDERR
JMP FPUTS
PUTCHAR = *
LDX #STDOUT
PUTC = *
STA PUTCbUFFER
LDA #<PUTCbUFFER
LDY #>PUTCbUFFER
STA ZP
STY ZP+1
LDA #1
LDY #0
JMP WRITE
PUTCbUFFER .BUF 1
GETCHAR = *
LDX #STDIN
GETC = *
LDA #<GETCbUFFER
LDY #>GETCbUFFER
STA ZP
STY ZP+1
LDA #1
LDY #0
JSR READ
BEQ +
LDA GETCbUFFER
RTS
+ SEC
RTS
GETCbUFFER .BUF 1
GETARG = *
STY ZP+1
ASL
STA ZP
ROL ZP+1
CLC
LDA ACEaRGV
ADC ZP
STA ZP
LDA ACEaRGV+1
ADC ZP+1
STA ZP+1
LDY #0
LDA (ZP),Y
TAX
INY
LDA (ZP),Y
STX ZP
STA ZP+1
RTS
;===UUDECODE===
UUDaRG = 2
UUDnAME = 4
INbUFlEN = 6
UUDECODEmAIN = *
;** CHECK ARGUMENT COUNT
LDA ACEaRGC+1
BNE UUDeNOUGHaRGS
LDA ACEaRGC
CMP #2
BCS UUDeNOUGHaRGS
UUDuSAGE = *
LDA #<UUDuSAGEmSG
LDY #>UUDuSAGEmSG
JMP PUTS
UUDuSAGEmSG = *
.ASC "uSAGE: UUDECODE FILE1 FILE2 ... FILEn"
.BYTE CHRcr,0
UUDeNOUGHaRGS = *
;** GET INPUT BUFFER LENGTH
SEC
LDA ACEsTACKpTR
SBC #<UUDiNbUF
STA INbUFlEN
LDA ACEsTACKpTR+1
SBC #>UUDiNbUF
STA INbUFlEN+1
;** MAIN LOOP
LDA #1
LDY #0
STA UUDaRG
STY UUDaRG+1
- LDA UUDaRG
LDY UUDaRG+1
JSR GETARG
LDA ZP
LDY ZP+1
STA UUDnAME
STY UUDnAME+1
ORA ZP+1
BEQ UUDeXIT
JSR UUDeCHO
JSR UUDECODE
BCC +
JSR UUDeRROR
+ INC UUDaRG
BNE +
INC UUDaRG+1
+ JMP -
UUDeXIT = *
RTS
UUDeRROR = *
LDA #<UUDeRRORmSG1
LDY #>UUDeRRORmSG1
JSR EPUTS
LDA UUDnAME
LDY UUDnAME+1
JSR EPUTS
LDA #<UUDeRRORmSG2
LDY #>UUDeRRORmSG2
JMP EPUTS
UUDeRRORmSG1 = *
.ASC "eRROR ATTEMPTING TO UUDECODE FILE "
.BYTE CHRqUOTE,0
UUDeRRORmSG2 = *
.BYTE CHRqUOTE,CHRcr,0
UUDeCHO = *
LDA #<UUDeCHOmSG1
LDY #>UUDeCHOmSG1
JSR EPUTS
LDA UUDnAME
LDY UUDnAME+1
JSR EPUTS
LDA #<UUDeCHOmSG2
LDY #>UUDeCHOmSG2
JMP EPUTS
UUDeCHOmSG1 = *
.ASC "UUDECODING FILE "
.BYTE CHRqUOTE,0
UUDeCHOmSG2 = *
.BYTE CHRqUOTE
.ASC "..."
.BYTE CHRcr,0
BUFpTR = 8
BUFcOUNT = 10
INFILE = 12
OUTFILE = 13
UUDECODE = *
;** OPEN FILE
LDA UUDnAME
LDY UUDnAME+1
STA ZP
STY ZP+1
LDA #"R"
JSR OPEN
BCC +
RTS
+ STA INFILE
;** DECODE FILE
JSR UUDECODEbODY
;** CLOSE FILE
LDA INFILE
JSR CLOSE
RTS
UUDECODEbODY = *
LDA #0
STA BUFcOUNT
STA BUFcOUNT+1
STA HITlASTlINE
STA LASTlINEtERMINATOR
;** SEARCH FOR "BEGIN" LINE
UUDsEARCHlINE = *
JSR GETLINE
BCC +
RTS
+ LDX #0
LDA UUDiNlINE
CMP #"B"
BEQ +
LDX #ASCIIbEGIN-PETSCIIbEGIN
+ LDY #0
- LDA UUDiNlINE,Y
CMP PETSCIIbEGIN,X
BNE UUDsEARCHlINE
INX
INY
CPY #6
BCC -
LDY #0
CPX #ASCIIbEGIN-PETSCIIbEGIN+1
BCC +
LDY #$FF
+ STY ASCIIfILE
LDA UUDiNlINE+9
CMP #" "
BNE UUDsEARCHlINE
LDX #0
- LDA UUDiNlINE+6,X
CMP #"0"
BCC UUDsEARCHlINE
CMP #"8"
BCS UUDsEARCHlINE
INX
CPX #3
BCC -
JMP PROCESSbEGIN
PETSCIIbEGIN = *
.ASC "BEGIN "
ASCIIbEGIN = *
.BYTE $62,$65,$67,$69,$6E,$20
;** PROCESS "BEGIN" LINE
PROCESSbEGIN = *
LDA ASCIIfILE
BEQ +
;** JSR CONVERT FILENAME
+ JSR MAKEpETSCIInAME
JSR DEFAULTpRGfILE
JSR ECHOeXTRACTnAME
LDA #<UUDiNlINE+10
LDY #>UUDiNlINE+10
STA ZP
STY ZP+1
LDA #"W"
JSR OPEN
BCC OPENoK
LDA ERRNO
CMP #ACEeRRfILEeXISTS
BEQ +
- JSR REPORToPENeRROR
JMP UUDsEARCHlINE
+ JSR SCRATCHfILE
LDA #"W"
JSR OPEN
BCS -
OPENoK = *
STA OUTFILE
;** READ UUENCODED DATA
- JSR GETLINE
BCS UUDfINISHfILE
JSR UUcONVERTlINE
BCC +
;** REPORT INVALID CHARACTERS
LDA #<BADcHARSmSG
LDY #>BADcHARSmSG
JSR EPUTS
JMP -
+ LDA UUDiNlINE
BEQ UUDfINISHfILE
JSR UUcRUNCHlINE
JSR UUwRITElINE
JMP -
;** FINISH WITH FILE
UUDfINISHfILE = *
LDA OUTFILE
JSR CLOSE
;** PROCESS FOR ANOTHER FILE
JMP UUDsEARCHlINE
BADcHARSmSG = *
.ASC "WARNING: BAD CHARACTERS IN LINE; IGNORING LINE."
.BYTE CHRcr,0
;%%%
MAKEpETSCIInAME = *
BIT ASCIIfILE
BMI +
RTS
+ LDX #0
- LDA UUDiNlINE+10,X
BEQ +
JSR CONVaSC2pET
STA UUDiNlINE+10,X
INX
BNE -
+ RTS
CONVaSC2pET = *
AND #$7F
CMP #$60
BCC +
CLC
ADC #$C0-$60
+ TAY
AND #$7F
CMP #"A"
BCS +
- TYA
RTS
+ CMP #"Z"+1
BCS -
TYA
EOR #$80
RTS
DEFAULTpRGfILE = *
LDX #0
- LDA UUDiNlINE+10,X
BEQ +
INX
BNE -
+ LDA UUDiNlINE+8,X
CMP #","
BNE +
RTS
+ LDA #","
STA UUDiNlINE+10,X
LDA #"P"
STA UUDiNlINE+11,X
LDA #0
STA UUDiNlINE+12,X
RTS
ECHOeXTRACTnAME = *
LDA #<ECHOeXTRACTmSG1
LDY #>ECHOeXTRACTmSG1
JSR EPUTS
LDA #<UUDiNlINE+10
LDY #>UUDiNlINE+10
JSR EPUTS
LDA #<ECHOeXTRACTmSG2
LDY #>ECHOeXTRACTmSG2
JMP EPUTS
ECHOeXTRACTmSG1 = *
.ASC "EXTRACTING FILE "
.BYTE CHRqUOTE,0
ECHOeXTRACTmSG2 = *
.BYTE CHRqUOTE
.ASC "..."
.BYTE CHRcr,0
REPORToPENeRROR = *
LDA ZP
LDY ZP+1
JSR EPUTS
LDA #<REPORToPENeRRORmSG
LDY #>REPORToPENeRRORmSG
JSR EPUTS
RTS
REPORToPENeRRORmSG = *
.ASC ": CANNOT OPEN; SKIPPING THIS FILE."
.BYTE CHRcr,0
SCRATCHfILE = *
LDA #<SCRATCHfILEmSG1
LDY #>SCRATCHfILEmSG1
JSR EPUTS
LDA #<UUDiNlINE+10
LDY #>UUDiNlINE+10
JSR EPUTS
LDA #<SCRATCHfILEmSG2
LDY #>SCRATCHfILEmSG2
JSR EPUTS
JSR GETCHAR
PHA
- CMP #CHRcr
BEQ +
JSR GETCHAR
JMP -
+ LDA #<UUDiNlINE+10
LDY #>UUDiNlINE+10
STA ZP
STY ZP+1
PLA
CMP #"Y"
BEQ +
CMP #"y"
BEQ +
RTS
+ JSR REMOVE
RTS
SCRATCHfILEmSG1 = *
.ASC "oVERWRITE EXISTING FILE "
.BYTE CHRqUOTE,0
SCRATCHfILEmSG2 = *
.BYTE CHRqUOTE
.ASC "? "
.BYTE 0
CONVERTfILL .BUF 1
CONVERTlEN = 15
UUcONVERTlINE = *
LDA #0
STA CONVERTfILL
LDA UUDiNlINE
BNE +
CLC
RTS
+ JSR UUcONVERTcHAR
BCC +
RTS
+ STA UUDiNlINE
LDX #60
CMP #46
BCC +
LDX #84
+ STX CONVERTlEN
LDX #0
- CPX CONVERTlEN
BCC +
CLC
RTS
+ BIT CONVERTfILL
BMI DOcONVERTfILL
LDA UUDiNlINE+1,X
BEQ +
JSR UUcONVERTcHAR
BCC CONVERTcONT
RTS
+ LDA #$FF
STA CONVERTfILL
DOcONVERTfILL = *
LDA #0
CONVERTcONT = *
STA UUDiNlINE+1,X
INX
BNE -
RTS
UUcONVERTcHAR = *
CMP #" "
BCS +
SEC
RTS
+ CMP #"_"+1
BCS +
SEC
SBC #" "
CLC
RTS
+ CMP #96
BNE +
- CLC
LDA #0
RTS
+ CMP #"{$60}"
BEQ -
BCS +
SEC
RTS
+ CMP #"z"+1
BCC +
RTS
+ SEC
SBC #"a"-33
CLC
RTS
UUcRUNCHlINE = *
LDX #0
LDY #0
- JSR UUcRUNCHgROUP
CPY UUDiNlINE
BCC -
RTS
;POS 76543210 76543210 76543210 76543210
;BYT XX111111 XX112222 XX222233 XX333333
;BIT 765432 107654 321076 543210
UUcRUNCHgROUP = * ;(.x=iN4BYTESoFFSET, .y=oUT3BYTESoFFSET) : .x++, .y++
LDA UUDiNlINE+1,X ;*** OUTPUT BYTE 0
ASL
ASL
STA TEMP
INX
LDA UUDiNlINE+1,X
LSR
LSR
LSR
LSR
AND #%00000011
ORA TEMP
STA UUDiNlINE+1,Y
INY
LDA UUDiNlINE+1,X ;*** OUTPUT BYTE 1
ASL
ASL
ASL
ASL
STA TEMP
INX
LDA UUDiNlINE+1,X
LSR
LSR
AND #%00001111
ORA TEMP
STA UUDiNlINE+1,Y
INY
LDA UUDiNlINE+1,X ;*** OUTPUT BYTE 2
INX
ROR
ROR
ROR
AND #%11000000
STA TEMP
LDA UUDiNlINE+1,X
INX
AND #%00111111
ORA TEMP
STA UUDiNlINE+1,Y
INY
RTS
UUwRITElINE = *
LDA #<UUDiNlINE+1
LDY #>UUDiNlINE+1
STA ZP
STY ZP+1
LDA UUDiNlINE
LDY #0
LDX OUTFILE
JSR WRITE
RTS
GETLINEpOS = 14
HITlASTlINE .BUF 1
LASTlINEtERMINATOR .BUF 1
GETLINE = *
LDA HITlASTlINE
BEQ +
SEC
RTS
+ LDX #0
STX GETLINEpOS
;** TOSS AN lf THAT FOLLOWS A cr
JSR GETbYTE
BCS GETLINEpROCESS
CMP #CHRlf
CLC
BNE GETLINEpROCESS
LDX LASTlINEtERMINATOR
CPX #CHRcr
CLC
BNE GETLINEpROCESS
GETLINEcHAR = *
JSR GETbYTE
GETLINEpROCESS = *
BCC +
LDA #$FF
STA HITlASTlINE
JMP GETLINEfINISH
+ CMP #CHRcr
BEQ GETLINEfINISH
CMP #CHRlf
BEQ GETLINEfINISH
LDX GETLINEpOS
CPX #98
BCS +
STA UUDiNlINE,X
INC GETLINEpOS
+ JMP GETLINEcHAR
GETLINEfINISH = *
STA LASTlINEtERMINATOR
LDX GETLINEpOS
LDA #0
STA UUDiNlINE,X
CPX #0
BEQ +
CLC
RTS
+ LDA HITlASTlINE
CMP #1
RTS
GETbYTE = *
LDA BUFcOUNT
ORA BUFcOUNT+1
BEQ GETbYTEfILLbUF
LDY #0
LDA (BUFpTR),Y
INC BUFpTR
BNE +
INC BUFpTR+1
+ LDX BUFcOUNT
BNE +
DEC BUFcOUNT+1
+ DEC BUFcOUNT
CLC
RTS
GETbYTEfILLbUF = *
LDA #<UUDiNbUF
LDY #>UUDiNbUF
STA ZP
STY ZP+1
STA BUFpTR
STY BUFpTR+1
LDA INbUFlEN
LDY INbUFlEN+1
LDX INFILE
JSR READ
BEQ +
BCS +
STA BUFcOUNT
STY BUFcOUNT+1
JMP GETbYTE
+ SEC
RTS
;===THE END===
UUDbSS = *
UUDiNlINE = UUDbSS+0
UUDiNbUF = UUDbSS+100
UUENCODE.S
443
;*** UUENCODE PROGRAM
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:UUENCODE"
JMP UUENCODEmAIN
.ASC "Cb"
;*** GLOBAL DECLARATIONS
LIBWORK = $60
CHRcr = $0D
CHRqUOTE = $22
;******** STANDARD LIBRARY ********
PUTS = *
LDX #STDOUT
FPUTS = *
STA ZP
STY ZP+1
LDY #$FF
- INY
LDA (ZP),Y
BNE -
TYA
LDY #0
JMP WRITE
EPUTS = *
LDX #STDERR
JMP FPUTS
PUTCHAR = *
LDX #STDOUT
PUTC = *
STA PUTCbUFFER
LDA #<PUTCbUFFER
LDY #>PUTCbUFFER
STA ZP
STY ZP+1
LDA #1
LDY #0
JMP WRITE
PUTCbUFFER .BUF 1
GETCHAR = *
LDX #STDIN
GETC = *
LDA #<GETCbUFFER
LDY #>GETCbUFFER
STA ZP
STY ZP+1
LDA #1
LDY #0
JSR READ
BEQ +
LDA GETCbUFFER
RTS
+ SEC
RTS
GETCbUFFER .BUF 1
GETARG = *
STY ZP+1
ASL
STA ZP
ROL ZP+1
CLC
LDA ACEaRGV
ADC ZP
STA ZP
LDA ACEaRGV+1
ADC ZP+1
STA ZP+1
LDY #0
LDA (ZP),Y
TAX
INY
LDA (ZP),Y
STX ZP
STA ZP+1
RTS
BASENAMEsTART = LIBWORK
BASENAME = * ;( (ZP)=INNAME ) : UUEoUTbUF=OUTNAME
LDY #255
STY BASENAMEsTART
- INY
LDA (ZP),Y
BEQ BASENAMEdONE
CMP #":"
BEQ +
CMP #"/"
BNE -
+ STY BASENAMEsTART
JMP -
BASENAMEdONE = *
LDY BASENAMEsTART
LDX #255
- INY
INX
LDA (ZP),Y
STA UUEoUTbUF,X
BNE -
CPX #2
BCC +
LDA UUEoUTbUF-2,X
CMP #","
BNE +
LDA #0
STA UUEoUTbUF-2,X
+ RTS
;===UUENCODE===
UUEaRG = 2
UUEnAME = 4
INbUFlEN = 6
UUENCODEmAIN = *
;** CHECK ARGUMENT COUNT
LDA ACEaRGC+1
BNE UUEeNOUGHaRGS
LDA ACEaRGC
CMP #2
BCS UUEeNOUGHaRGS
UUEuSAGE = *
LDA #<UUEuSAGEmSG
LDY #>UUEuSAGEmSG
JMP PUTS
UUEuSAGEmSG = *
.ASC "uSAGE: UUENCODE FILE1 FILE2 ... FILEn"
.BYTE CHRcr
.BYTE 0
UUEeNOUGHaRGS = *
;** GET INPUT BUFFER LENGTH
SEC
LDA ACEsTACKpTR
SBC #<UUEiNbUF
STA INbUFlEN
LDA ACEsTACKpTR+1
SBC #>UUEiNbUF
STA INbUFlEN+1
;** MAIN LOOP
LDA #1
LDY #0
STA UUEaRG
STY UUEaRG+1
- LDA UUEaRG
LDY UUEaRG+1
JSR GETARG
LDA ZP
LDY ZP+1
STA UUEnAME
STY UUEnAME+1
ORA ZP+1
BEQ UUEeXIT
JSR UUEeCHO
JSR UUENCODE
BCC +
JSR UUEeRROR
+ INC UUEaRG
BNE +
INC UUEaRG+1
+ JMP -
UUEeXIT = *
RTS
UUEeRROR = *
LDA #<UUEeRRORmSG1
LDY #>UUEeRRORmSG1
JSR EPUTS
LDA UUEnAME
LDY UUEnAME+1
JSR EPUTS
LDA #<UUEeRRORmSG2
LDY #>UUEeRRORmSG2
JMP EPUTS
UUEeRRORmSG1 = *
.ASC "eRROR ATTEMPTING TO UUENCODE "
.BYTE CHRqUOTE
.BYTE 0
UUEeRRORmSG2 = *
.BYTE CHRqUOTE
.BYTE CHRcr
.BYTE 0
UUEeCHO = *
LDA #<UUEeCHOmSG1
LDY #>UUEeCHOmSG1
JSR EPUTS
LDA UUEnAME
LDY UUEnAME+1
JSR EPUTS
LDA #<UUEeCHOmSG2
LDY #>UUEeCHOmSG2
JMP EPUTS
UUEeCHOmSG1 = *
.ASC "uUENCODING FILE "
.BYTE CHRqUOTE
.BYTE 0
UUEeCHOmSG2 = *
.BYTE CHRqUOTE
.ASC "..."
.BYTE CHRcr
.BYTE 0
BUFpTR = 8
BUFcOUNT = 10
INFILE = 12
UUENCODE = *
;** OPEN FILE
LDA UUEnAME
LDY UUEnAME+1
STA ZP
STY ZP+1
LDA #"R"
JSR OPEN
BCC +
RTS
+ STA INFILE
;** ENCODE FILE
JSR UUENCODEbODY
;** CLOSE FILE
LDA INFILE
JSR CLOSE
RTS
UUENCODEbODY = *
LDA #0
STA BUFcOUNT
STA BUFcOUNT+1
;** HEADER LINE
LDA #<UUEhEADERmSG
LDY #>UUEhEADERmSG
JSR PUTS
LDA UUEnAME
LDY UUEnAME+1
STA ZP
STY ZP+1
JSR BASENAME
LDA #<UUEoUTbUF
LDY #>UUEoUTbUF
JSR PUTS
LDA #CHRcr
JSR PUTCHAR
;** LOOP
- JSR UUlINE
BCC -
;** END LINE
LDA #<UUEeNDmSG
LDY #>UUEeNDmSG
JSR PUTS
;** CRC LINE
RTS
UUEhEADERmSG = *
.ASC "BEGIN 640 "
.BYTE 0
UUEeNDmSG = *
.ASC "{$60}"
.BYTE CHRcr
.ASC "END"
.BYTE CHRcr,0
GETbYTE = *
LDA BUFcOUNT
ORA BUFcOUNT+1
BEQ GETbYTEfILLbUF
LDY #0
LDA (BUFpTR),Y
INC BUFpTR
BNE +
INC BUFpTR+1
+ LDX BUFcOUNT
BNE +
DEC BUFcOUNT+1
+ DEC BUFcOUNT
CLC
RTS
GETbYTEfILLbUF = *
LDA #<UUEiNbUF
LDY #>UUEiNbUF
STA ZP
STY ZP+1
STA BUFpTR
STY BUFpTR+1
LDA INbUFlEN
LDY INbUFlEN+1
LDX INFILE
JSR READ
BEQ +
BCS +
STA BUFcOUNT
STY BUFcOUNT+1
JMP GETbYTE
+ SEC
RTS
DATALEN = 13
OUTLINELEN = 14
UUlINE = *
LDA #0
STA DATALEN
LDA #1
STA OUTLINELEN
;** GET THE LINE
- JSR GETfOURcHARS
BCS +
LDA DATALEN
CMP #45
BCC -
CLC
;** PUT THE LINE
+ PHP
LDY OUTLINELEN
LDA #CHRcr
STA UUEoUTbUF,Y
INC OUTLINELEN
LDA DATALEN
CMP #0
BEQ +
JSR GETuUCHAR
STA UUEoUTbUF
LDA #<UUEoUTbUF
LDY #>UUEoUTbUF
STA ZP
STY ZP+1
LDA OUTLINELEN
LDY #0
LDX #1
JSR WRITE
+ PLP
RTS
UUTEMP = 15
UUBUF .BUF 3
GETfOURcHARS = *
LDX #2
LDA #0
- STA UUBUF,X
DEX
BPL -
;** READ THE BYTES
LDX #0
- STX UUTEMP
JSR GETbYTE
BCS +
LDX UUTEMP
STA UUBUF,X
INC DATALEN
INX
CPX #3
BCC -
CLC
;** PUT BYTES INTO OUTPUT LINE
;POS 76543210 76543210 76543210 76543210
;BYT XX111111 XX112222 XX222233 XX333333
;BIT 765432 107654 321076 543210
+ PHP
LDY OUTLINELEN
;** FIRST BYTE
LDA UUBUF
LSR
LSR
JSR GETuUCHAR
STA UUEoUTbUF,Y
INY
;** SECOND BYTE
LDA UUBUF
ASL
ASL
ASL
ASL
STA UUTEMP
LDA UUBUF+1
LSR
LSR
LSR
LSR
ORA UUTEMP
JSR GETuUCHAR
STA UUEoUTbUF,Y
INY
;** THIRD BYTE
LDA UUBUF+1
ASL
ASL
STA UUTEMP
LDA UUBUF+2
ASL
ROL
ROL
AND #%00000011
ORA UUTEMP
JSR GETuUCHAR
STA UUEoUTbUF,Y
INY
;** FOURTH BYTE
LDA UUBUF+2
JSR GETuUCHAR
STA UUEoUTbUF,Y
INY
STY OUTLINELEN
PLP
RTS
GETuUCHAR = *
AND #%00111111
BNE +
LDA #"{$60}"
RTS
+ CLC
ADC #" "
CMP #"A"
BCS +
RTS
+ CMP #"["
BCS +
ADC #128
+ RTS
;===THE END===
UUEeND = *
UUEoUTbUF = UUEeND
UUEiNbUF = UUEoUTbUF+80
VI.S
1084
;*** ZED TEXT EDITOR PROGRAM
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:VI"
JMP MAIN
.ASC "Cb"
;*** GLOBAL DECLARATIONS
WORK1 = $02 ;(16)
WORK2 = $12 ;(16)
WORK3 = $22 ;(14)
CHRcr = $0D
CHRtAB = $09
CHRqUOTE = $22
;SCREEN
SCRtOPaDDR = $30 ;(2)
SCRlINEaDDR = $32 ;(2)
CURrOW = $34 ;(1)
CURcOL = $35 ;(1)
SCRrOWS = $36 ;(1)
SCRcOLS = $37 ;(1)
SCRrOWiNC = $38 ;(2)
CURlEFTmARGIN = $3A ;(1)
STATUSmARGIN .BUF 1
;DOCUMENT
LINEpTR = $40 ;(4)
LINEnUM = $44 ;(4)
TOSlINEpTR = $48 ;(4)
TOPlINEpTR = $4C ;(4)
BOTlINEpTR = $50 ;(4)
LINEcOUNT = $54 ;(4)
FILElENGTH = $58 ;(4)
TARGETlEN = $5C ;(1)
WRAPfLAG = $5D ;(1) ;128=WRAP,64=SHOWcr
;MANAGEMENT
MODIFIED = $3B ;(1) ;$00=NO, $FF=MODIFIED
MODEfLAGS = $3C ;(1) ;$80=INSERT, $40=INDENT
STATUSuPDATE = $3D ;(1) ;128=LINE,64=COL,32=MOD,16=INS,8=BYT,4=FRE,2=NM,1=MSG
MARKEDlINEpTR .BUF 4 ;(4)
MARKEDlINEnUM .BUF 4 ;(4)
MARKEDcOL .BUF 4 ;(1)
;LINE FORMAT
HEADbUFFER = $70 ;(11)
HEADnEXTpTR = $70 ;(4)
HEADpREVpTR = $74 ;(4)
HEADlINElEN = $78 ;(1)
HEADiNDENT = $79 ;(1)
HEADfLAGS = $7A ;(1) ;$80=CONNECTED, $40=NULLlINE, $3f=INDENT
HEADlENGTH = $0B
;KILL BUFFER
BUFFERtOPpTR .BUF 4 ;(4)
BUFFERbOTpTR .BUF 4 ;(4)
BUFFERlINEcOUNT .BUF 4 ;(4)
;DOCUMENT BUFFERS
;COLORS
CHARcOLOR .BYTE $0C ;$0E
CURSORcOLOR .BYTE $06
STATUScOLOR .BYTE $04
SEPARcOLOR .BYTE $0F ;$03
HILITEcOLOR .BYTE $0D ;$0C
ALERTcOLOR .BYTE $0F
BORDERcOLOR .BYTE $00
BKGNDcOLOR .BYTE $00
;=== NEW ===
SCREENiNIT = *
;** GET SCREEN PARMS
JSR WINSIZE
STA SCRrOWS
LDA SYSWORK+0
STA SCRcOLS
LDA SYSWORK+2
LDY SYSWORK+3
STA SCRtOPaDDR+0
STY SCRtOPaDDR+1
STA $400
STY $401
LDA SYSWORK+4
LDY SYSWORK+5
STA SCRrOWiNC+0
STY SCRrOWiNC+1
;** GET COLOR PALETTE
JSR CONPALETTE
LDX #7
- LDA SYSWORK,X
STA CHARcOLOR,X
DEX
BPL -
;** CLEAR SCREEN
LDA #$A0
LDY CHARcOLOR
LDX #$FF
JSR WINCLS
;** SET STATUS COLOR
LDA SCRtOPaDDR+0
LDY SCRtOPaDDR+1
STA SYSWORK+0
STY SYSWORK+1
LDA SCRcOLS
STA SYSWORK+5
LDA #$40
LDY STATUScOLOR
LDX #0
JSR WINPUT
;** SET SEPARATOR COLOR
JSR SETsEPARaDDR
LDA #$40
LDY SEPARcOLOR
LDX #0
JSR WINPUT
RTS
JSR DISPLAYsEPARATOR
LDA #$FF
STA STATUSuPDATE
JSR UPDATEsTATUS
RTS
SETsEPARaDDR = *
CLC
LDA SCRtOPaDDR+0
ADC SCRrOWiNC+0
STA SYSWORK+0
LDA SCRtOPaDDR+1
ADC SCRrOWiNC+1
STA SYSWORK+1
RTS
DISPLAYsTATUS = *
LDA SCRtOPaDDR+0
LDY SCRtOPaDDR+1
STA SYSWORK+0
STY SYSWORK+1
LDA #<STATUSlINE
LDY #>STATUSlINE
CLC
ADC STATUSmARGIN
BCC +
INY
+ STA ZW+0
STY ZW+1
LDA SCRcOLS
STA SYSWORK+5
LDA #$80
LDX SCRcOLS
JSR WINPUT
RTS
STATUSlINE = *
.ASC "l:12345678c:241 * iNS iND b:12345678 f:12345678 "
; "0----+----1----+----2----+----3----+----4----+----5-"
.ASC "1234567890123456789012345678"
; "---+----6----+----7----+----"
UPDATEsTATUS = *
JSR DISPLAYsTATUS
RTS
DISPLAYsEPARATOR = *
RTS
;=== MAIN ===
MAIN = *
JSR MALLOCiNIT
JSR MAINiNIT
JSR SCREENiNIT
JSR DISPLAYsTATUS
LDA #1
LDY #0
JSR GETARG
JSR LOADfILE
JSR DUMPdOC
RTS
MSG .ASC "zED FOR ace VERSION ace-0.01"
.BYTE CHRcr,0
MAINiNIT = *
LDX #$7F-$02
LDA #0
- STA 2,X
DEX
BPL -
LDA #$80
STA WRAPfLAG
JSR WINSIZE
LDA SYSWORK+0
STA TARGETlEN
RTS
;*** LOAD FILE: USES WORK2 ***
LOADhEAD = WORK2+0
LOADtAIL = WORK2+4
LOADlINES = WORK2+8
LOADbYTES = WORK2+12
LOADfCB = WORK3+0
LOADlINEsCAN = WORK3+1
LOADlINElEN = WORK3+2
LOADbUFcOUNT = WORK3+3
LOADbUFpTR = WORK3+4
LOADfILE = * ;( (ZP)=NAME ) : [W2]=HEAD, [W2]=TAIL, [W2]=LINES, [W2]=BYTES
JSR SAVEwORK3
JSR LOADiNIT
LDA #"R"
JSR OPEN
STA LOADfCB
- JSR LOADlINE
BCS +
JSR LOADlINEwRAP
JSR LOADlINEsTORE
JSR LOADlINEoVERFLOW
JMP -
+ LDA LOADlINElEN
BEQ +
JSR LOADlINEwRAP
LDA #$00
STA HEADfLAGS
JSR LOADlINEsTORE
+ LDA LOADfCB
JSR CLOSE
JSR RESTOREwORK3
RTS
LOADiNIT = *
LDA #0
LDX #16+14-1
- STA LOADhEAD,X
DEX
BPL -
RTS
LOADlINE = * ;( ) : .cs=END
;TAB EXPANSION WILL GO INTO THIS ROUTINE
LDX LOADbUFpTR
LDY LOADlINElEN
LOADnEXTbYTE = *
LDA LOADbUFcOUNT
BNE ++
STY LOADlINElEN
JSR LOADbUF
BCC +
RTS
+ LDY LOADlINElEN
LDX LOADbUFpTR
+ NOP
- LDA FILEBUF,X
STA LINE,Y
INX
INY
CMP #CHRcr
BEQ ++
CPY TARGETlEN
BEQ + ;DETERMINES IF crS WILL GO BEYOND LEN
BCS ++
+ DEC LOADbUFcOUNT
BNE -
BEQ LOADnEXTbYTE
+ DEC LOADbUFcOUNT
STX LOADbUFpTR
STY LOADlINElEN
CLC
RTS
LOADbUF = * ;( ) : .cs=EOF
JSR STOPKEY
BCS +
LDA #<FILEBUF
LDY #>FILEBUF
STA ZP+0
STY ZP+1
LDA #<254
LDY #>254
LDX LOADfCB
JSR READ
BCS +
BEQ +
STA LOADbUFcOUNT
LDA #0
STA LOADbUFpTR
CLC
RTS
+ SEC
RTS
LOADlINEwRAP = *
LDX LOADlINElEN
DEX
LDY #$00
LDA LINE,X
CMP #CHRcr
BEQ +
LDY #$80
+ STY HEADfLAGS
CMP #CHRcr
BNE +
- STX HEADlINElEN
STX LOADlINEsCAN
STX LOADlINElEN
RTS
+ LDX LOADlINElEN
CPX TARGETlEN
BCC -
+ BIT WRAPfLAG
BMI +
- LDA TARGETlEN
STA LOADlINEsCAN
STA HEADlINElEN
RTS
+ LDX TARGETlEN
- DEX
CPX #255
BEQ --
LDA LINE,X
CMP #" "
BNE -
+ INX
STX LOADlINEsCAN
STX HEADlINElEN
RTS
LOADlINEsTORE = *
INC LOADlINES+0
BNE +
INC LOADlINES+1
BNE +
INC LOADlINES+2
BNE +
INC LOADlINES+3
+ SEC
BIT HEADfLAGS
BMI +
CLC
+ LDA LOADbYTES+0
ADC HEADlINElEN
STA LOADbYTES+0
BCC +
INC LOADbYTES+1
BNE +
INC LOADbYTES+2
BNE +
INC LOADbYTES+3
+ LDX #3
- LDA #ACEmEMnULL
STA HEADnEXTpTR,X
LDA LOADtAIL,X
STA HEADpREVpTR,X
DEX
BPL -
JSR STASHlINE
;** FIRST LINE TO BE STORED
LDA LOADhEAD+3
CMP #ACEmEMnULL
BNE +
LDX #3
- LDA ZP,X
STA LOADhEAD,X
STA LOADtAIL,X
DEX
BPL -
RTS
;** ADDITIONAL LINES
+ LDX #3
- LDA ZP,X
LDY LOADtAIL,X
STA LOADtAIL,X
STY ZP,X
DEX
BPL -
JSR FETCHhEAD
LDX #3
- LDA LOADtAIL,X
STA HEADnEXTpTR,X
DEX
BPL -
JSR STASHhEAD
RTS
LOADlINEoVERFLOW = *
LDX LOADlINEsCAN
LDY #0
- CPX LOADlINElEN
BCS +
LDA LINE,X
STA LINE,Y
INX
INY
BNE -
+ STY LOADlINElEN
RTS
;=== MANAGEMENT ROUTINES ===
WORK3sAVE .BUF 14
SAVEwORK3 = *
LDX #13
- LDA WORK3,X
STA WORK3sAVE,X
DEX
BPL -
RTS
RESTOREwORK3 = *
LDX #13
- LDA WORK3sAVE,X
STA WORK3,X
DEX
BPL -
RTS
FETCHlINEeXTRA = 6
FETCHlINE = * ;( [ZP]=FARlINE ) : HEAD*, LINEBUF
LDA #<LINEBUF
LDY #>LINEBUF
STA ZW+0
STY ZW+1
LDA #HEADlENGTH+FETCHlINEeXTRA
LDY #0
JSR FETCH
LDX #HEADlENGTH-1
- LDA LINEBUF,X
STA HEADbUFFER,X
DEX
BPL -
LDA HEADlINElEN
CMP #FETCHlINEeXTRA+1
BCC +
CLC
ADC #HEADlENGTH
LDY #0
JSR FETCH
+ RTS
STASHlINE = * ;( HEAD*, LINEBUF ) : [ZP]=STOREDlINE, .cs=ERR
LDA #0
STA HEADiNDENT
LDX #HEADlENGTH-1
- LDA HEADbUFFER,X
STA LINEBUF,X
DEX
BPL -
CLC
LDA HEADlINElEN
ADC #HEADlENGTH
LDY #0
JSR MALLOC
BCC +
RTS
+ LDA #<LINEBUF
LDY #>LINEBUF
STA ZW+0
STY ZW+1
CLC
LDA HEADlINElEN
ADC #HEADlENGTH
LDY #0
JSR STASH
CLC
RTS
FETCHhEAD = * ;( [ZP]=FARlINEpTR ) : HEADbUFFER
LDX #HEADbUFFER
LDY #HEADlENGTH
JSR ZPLOAD
RTS
STASHhEAD = * ;( [ZP]=FARlINEpTR, HEADbUFFER )
LDX #HEADbUFFER
LDY #HEADlENGTH
JSR ZPSTORE
RTS
;=== DYNAMIC MEMORY ROUTINES ===
MALLOCwORK = WORK1
MALLOChEAD .BUF 4
TPAfREEfIRST .BUF 1
TPAfREEmIN .BUF 1
TPAfREEpAGES .BUF 1
TPAaREAsTART .BUF 1
TPAaREAeND .BUF 1
;*** MALLOCiNIT()
MALLOCiNIT = *
LDA #ACEmEMnULL
STA MALLOChEAD+3
LDX #0
LDA #$FF
- STA TPAfREEMAP,X
INX
BNE -
LDX #>BSSeND
LDA #<BSSeND
BEQ +
INX
+ STX TPAfREEfIRST
STX TPAaREAsTART
LDX ACEsTACKpTR+1
STX MALLOCwORK
STX TPAaREAeND
TXA
SEC
SBC TPAfREEfIRST
BCS +
LDA #0
+ STA TPAfREEpAGES
CLC
ADC #1
STA TPAfREEmIN
LDX TPAfREEfIRST
CPX MALLOCwORK
BCS +
LDA #$00
- STA TPAfREEMAP,X
INX
CPX MALLOCwORK
BCC -
+ RTS
LIBpAGES .BUF 1
LIBpAGEaLLOC = * ;( .a=PAGES ) : [ZP]
STA LIBpAGES
LDX #$00
LDY #ACEmEMiNTERNAL-1
JSR PAGEALLOC
BCS +
RTS
+ JSR TPApAGEaLLOC
BCS +
RTS
+ LDA LIBpAGES
LDX #ACEmEMiNTERNAL
LDY #$FF
JSR PAGEALLOC
BCS +
RTS
+ LDA #<NOMEMmSG
LDY #>NOMEMmSG
JSR EPUTS
LDA #1
JMP EXIT
NOMEMmSG = *
.BYTE CHRcr
.ASC "iNSUFFICIENT MEMORY, ABORTING."
.BYTE CHRcr,0
NEWMAX .BUF 1
TPApAGEaLLOC = * ;( LIBpAGES ) : [ZP]
LDA LIBpAGES
CMP TPAfREEmIN
BCS TPAfREEMAPfULL
;** FIRST FREE
LDX TPAfREEfIRST
LDA TPAfREEMAP,X
BEQ ++
- INX
BEQ TPAfREEMAPfULL
LDA TPAfREEMAP,X
BNE -
STX TPAfREEfIRST
JMP ++
TPAfREEMAPfULL = *
LDA LIBpAGES
CMP TPAfREEmIN
BCS +
STA TPAfREEmIN
+ SEC
RTS
;** SEARCH
+ DEX
- LDY LIBpAGES
- INX
BEQ TPAfREEMAPfULL
LDA TPAfREEMAP,X
BNE --
DEY
BNE -
;** ALLOCATE
STX NEWMAX
LDY LIBpAGES
LDA #$41
- STA TPAfREEMAP,X
DEX
DEY
BNE -
INX
CPX TPAfREEfIRST
BNE +
LDY NEWMAX
INY
STY TPAfREEfIRST
+ SEC
LDA TPAfREEpAGES
SBC LIBpAGES
STA TPAfREEpAGES
LDA #0
LDY #ACEmEMiNTERNAL
STA ZP+0
STX ZP+1
STA ZP+2
STY ZP+3
CLC
RTS
MALLOClENsAVE .BUF 3
MALLOC = *
QUICKmALLOC = *
STA MALLOClENsAVE+0
STY MALLOClENsAVE+1
JSR LIBmALLOC
BCS +
RTS
+ LDX MALLOClENsAVE+1
LDA MALLOClENsAVE+0
BEQ +
INX
+ TXA
CPX #>1024
BCS +
LDX #>1024
+ TXA
STA MALLOClENsAVE+2
JSR LIBpAGEaLLOC
BCC +
RTS
+ LDA #0
LDY MALLOClENsAVE+2
JSR FREE
LDA MALLOClENsAVE+0
LDY MALLOClENsAVE+1
JMP MALLOC
;*** MALLOC( .ay=bYTES ) : [ZP]=fARpOINTER
MALLOCmEMnEXTpTR = MALLOCwORK+0 ;(4)
MALLOCmEMlENGTH = MALLOCwORK+4 ;(2)
MALLOClENGTH = MALLOCwORK+6 ;(2)
MALLOCq = MALLOCwORK+8 ;(4)
LIBmALLOC = *
CLC
ADC #7
BCC +
INY
+ AND #$F8
STA MALLOClENGTH
STY MALLOClENGTH+1
LDX #3
- LDA MALLOChEAD,X
STA ZP,X
LDA #ACEmEMnULL
STA MALLOCq,X
DEX
BPL -
MALLOClOOK = *
LDA ZP+3
CMP #ACEmEMnULL
BNE +
MALLOCeRROReXIT = *
LDA #ACEmEMnULL
STA ZP+3
LDA #ACEeRRiNSUFFICIENTmEMORY
STA ERRNO
SEC
RTS
+ LDX #MALLOCmEMnEXTpTR
LDY #6
JSR ZPLOAD
LDA MALLOCmEMlENGTH
CMP MALLOClENGTH
LDA MALLOCmEMlENGTH+1
SBC MALLOClENGTH+1
BCS MALLOCgOTbLOCK
LDX #3
- LDA ZP,X
STA MALLOCq,X
LDA MALLOCmEMnEXTpTR,X
STA ZP,X
DEX
BPL -
JMP MALLOClOOK
MALLOCgOTbLOCK = *
LDA MALLOCmEMlENGTH
CMP MALLOClENGTH
BNE +
LDA MALLOCmEMlENGTH+1
SBC MALLOClENGTH+1
BEQ MALLOCtAKEwHOLEbLOCK
+ SEC
LDA MALLOCmEMlENGTH
SBC MALLOClENGTH
STA MALLOCmEMlENGTH
LDA MALLOCmEMlENGTH+1
SBC MALLOClENGTH+1
STA MALLOCmEMlENGTH+1
LDX #MALLOCmEMnEXTpTR
LDY #6
JSR ZPSTORE
CLC
LDA ZP+0
ADC MALLOCmEMlENGTH
STA ZP+0
LDA ZP+1
ADC MALLOCmEMlENGTH+1
STA ZP+1
CLC
RTS
MALLOCtAKEwHOLEbLOCK = *
LDA MALLOCq+3
CMP #ACEmEMnULL
BNE +
LDX #3
- LDA MALLOCmEMnEXTpTR,X
STA MALLOChEAD,X
DEX
BPL -
CLC
RTS
+ LDX #3
- LDA ZP,X
LDY MALLOCq,X
STA MALLOCq,X
STY ZP,X
DEX
BPL -
LDX #MALLOCmEMnEXTpTR
LDY #4
JSR ZPSTORE
LDX #3
- LDA MALLOCq,X
STA ZP,X
DEX
BPL -
CLC
RTS
;*** FREE( [ZP]=fARpOINTER, .ay=lENGTH ) {$7b}ALTERS [ZP]{$7d}
FREEmEMnEXTpTR = MALLOCwORK+0 ;(4)
FREEmEMlENGTH = MALLOCwORK+4 ;(2)
FREElENGTH = MALLOCwORK+6 ;(2)
FREEnEWpTR = MALLOCwORK+8 ;(4)
FREEq = MALLOCwORK+12 ;(4)
FREE = *
CLC
ADC #7
BCC +
INY
+ AND #$F8
STA FREElENGTH+0
STY FREElENGTH+1
LDX #3
- LDA ZP,X
STA FREEnEWpTR,X
LDA MALLOChEAD,X
STA ZP,X
LDA #ACEmEMnULL
STA FREEq,X
DEX
BPL -
FREEsEARCHlOOP = *
LDA ZP+3
CMP #ACEmEMnULL
BEQ FREEcOALESCEqANDnEW
LDA ZP+0
CMP FREEnEWpTR+0
LDA ZP+1
SBC FREEnEWpTR+1
LDA ZP+2
SBC FREEnEWpTR+2
LDA ZP+3
SBC FREEnEWpTR+3
BCS FREEcOALESCEqANDnEW
+ LDX #FREEmEMnEXTpTR
LDY #4
JSR ZPLOAD
LDX #3
- LDA ZP,X
STA FREEq,X
LDA FREEmEMnEXTpTR,X
STA ZP,X
DEX
BPL -
BMI FREEsEARCHlOOP
FREEcOALESCEqANDnEW = *
LDX #3
- LDA FREEq,X
STA ZP,X
DEX
BPL -
LDA ZP+3
CMP #ACEmEMnULL
BNE +
;** PREV IS HEAD
LDX #3
- LDA MALLOChEAD,X
STA FREEmEMnEXTpTR,X
LDA FREEnEWpTR,X
STA MALLOChEAD,X
DEX
BPL -
LDA FREElENGTH+0
LDY FREElENGTH+1
STA FREEmEMlENGTH+0
STY FREEmEMlENGTH+1
JMP FREEcOALESCEnEWaNDp
;** PREV IS REAL
+ LDX #FREEmEMnEXTpTR
LDY #6
JSR ZPLOAD
LDA ZP+3
CMP FREEnEWpTR+3
BNE +
LDA ZP+2
CMP FREEnEWpTR+2
BNE +
CLC
LDA ZP
ADC FREEmEMlENGTH
TAX
LDA ZP+1
ADC FREEmEMlENGTH+1
CMP FREEnEWpTR+1
BNE +
CPX FREEnEWpTR
BNE +
;** PREV DOES COALESCE
CLC
LDA FREEmEMlENGTH
ADC FREElENGTH
STA FREEmEMlENGTH
LDA FREEmEMlENGTH+1
ADC FREElENGTH+1
STA FREEmEMlENGTH+1
LDX #3
- LDA FREEq,X
STA FREEnEWpTR,X
DEX
BPL -
BMI FREEcOALESCEnEWaNDp
;** PREV DOES NOT COALESCE
+ LDX #FREEnEWpTR
LDY #4
JSR ZPSTORE
LDA FREElENGTH+0
LDY FREElENGTH+1
STA FREEmEMlENGTH+0
STY FREEmEMlENGTH+1
FREEcOALESCEnEWaNDp = *
LDA FREEnEWpTR+3
CMP FREEmEMnEXTpTR+3
BNE +
LDA FREEnEWpTR+2
CMP FREEmEMnEXTpTR+2
BNE +
CLC
LDA FREEnEWpTR
ADC FREEmEMlENGTH
TAX
LDA FREEnEWpTR+1
ADC FREEmEMlENGTH+1
CMP FREEmEMnEXTpTR+1
BNE +
CPX FREEmEMnEXTpTR
BNE +
;** NEW AND NEXT COALESCE
LDX #3
- LDA FREEmEMnEXTpTR,X
STA ZP,X
DEX
BPL -
LDA FREEmEMlENGTH+1
PHA
LDA FREEmEMlENGTH+0
PHA
LDX #FREEmEMnEXTpTR
LDY #6
JSR ZPLOAD
CLC
PLA
ADC FREEmEMlENGTH+0
STA FREEmEMlENGTH+0
PLA
ADC FREEmEMlENGTH+1
STA FREEmEMlENGTH+1
+ LDX #3
- LDA FREEnEWpTR,X
STA ZP,X
DEX
BPL -
LDX #FREEmEMnEXTpTR
LDY #6
JSR ZPSTORE
CLC
RTS
;=== STANDARD LIBRARY ===
PUTS = *
LDX #STDOUT
FPUTS = *
STA ZP+0
STY ZP+1
LDY #$FF
- INY
LDA (ZP),Y
BNE -
TYA
LDY #0
JMP WRITE
EPUTS = *
LDX #STDERR
JMP FPUTS
PUTCHAR = *
STX XSAVE
STY YSAVE
LDX #STDOUT
JSR PUTC
LDX XSAVE
LDY YSAVE
RTS
XSAVE .BUF 1
YSAVE .BUF 1
PUTC = *
STA PUTCbUFFER
LDA #<PUTCbUFFER
LDY #>PUTCbUFFER
STA ZP+0
STY ZP+1
LDA #1
LDY #0
JMP WRITE
PUTCbUFFER .BUF 1
GETCHAR = *
LDX #STDIN
GETC = *
LDA #<GETCbUFFER
LDY #>GETCbUFFER
STA ZP+0
STY ZP+1
LDA #1
LDY #0
JSR READ
BEQ +
LDA GETCbUFFER
RTS
+ SEC
RTS
GETCbUFFER .BUF 1
GETARG = *
STY ZP+1
ASL
STA ZP+0
ROL ZP+1
CLC
LDA ACEaRGV
ADC ZP+0
STA ZP+0
LDA ACEaRGV+1
ADC ZP+1
STA ZP+1
LDY #0
LDA (ZP),Y
TAX
INY
LDA (ZP),Y
STX ZP+0
STA ZP+1
RTS
;===new functions===
STOPcOUNTDOWN .BYTE 0
DUMPdOC = *
LDY CHARcOLOR
LDX #$40
JSR WINCLS
LDX #3
- LDA LOADhEAD,X
STA ZP,X
DEX
BPL -
- LDA ZP+3
CMP #ACEmEMnULL
BNE +
RTS
+ JSR FETCHlINE
LDA #<LINE
LDY #>LINE
STA ZP+0
STY ZP+1
LDA HEADlINElEN
LDY #0
LDX #STDOUT
JSR WRITE
LDA HEADfLAGS
BPL +
;LDA #"="
;JSR PUTCHAR
+ LDA #CHRcr
JSR PUTCHAR
LDX #3
- LDA HEADnEXTpTR,X
STA ZP,X
DEX
BPL -
INC STOPcOUNTDOWN
LDA STOPcOUNTDOWN
AND #7
BNE +
JSR STOPKEY
BCC +
LDA #1
LDX #0
JMP EXIT
+ JMP --
;===BSS===
BSS = *
LINEBUF = BSS+0 ;(256)
LINE = LINEBUF+HEADlENGTH ;(241)
FILEBUF = LINEBUF+256 ;(256)
TPAfREEMAP = FILEBUF+256 ;(256)
BSSeND = TPAfREEMAP+256
WC.S
392
;*** WORD COUNTER PROGRAM
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:WC"
JMP WCmAIN
.ASC "Cb"
;*** GLOBAL DECLARATIONS
LIBWORK = $60
CHRcr = $0D
CHRqUOTE = $22
;******** STANDARD LIBRARY ********
PUTS = *
LDX #STDOUT
FPUTS = *
STA ZP
STY ZP+1
LDY #$FF
- INY
LDA (ZP),Y
BNE -
TYA
LDY #0
JMP WRITE
EPUTS = *
LDX #STDERR
JMP FPUTS
PUTCHAR = *
STX XSAVE
STY YSAVE
LDX #STDOUT
JSR PUTC
LDX XSAVE
LDY YSAVE
RTS
XSAVE .BUF 1
YSAVE .BUF 1
PUTC = *
STA PUTCbUFFER
LDA #<PUTCbUFFER
LDY #>PUTCbUFFER
STA ZP
STY ZP+1
LDA #1
LDY #0
JMP WRITE
PUTCbUFFER .BUF 1
GETCHAR = *
LDX #STDIN
GETC = *
LDA #<GETCbUFFER
LDY #>GETCbUFFER
STA ZP
STY ZP+1
LDA #1
LDY #0
JSR READ
BEQ +
LDA GETCbUFFER
RTS
+ SEC
RTS
GETCbUFFER .BUF 1
GETARG = *
STY ZP+1
ASL
STA ZP
ROL ZP+1
CLC
LDA ACEaRGV
ADC ZP
STA ZP
LDA ACEaRGV+1
ADC ZP+1
STA ZP+1
LDY #0
LDA (ZP),Y
TAX
INY
LDA (ZP),Y
STX ZP
STA ZP+1
RTS
;===WORD COUNT===
WCaRG = 2
WCnAME = 4
INbUFlEN = 6
FILES = $50
WCmAIN = *
;** CHECK ARGUMENT COUNT
LDA ACEaRGC+1
BNE WCeNOUGHaRGS
LDA ACEaRGC
CMP #2
BCS WCeNOUGHaRGS
WCuSAGE = *
LDA #<WCuSAGEmSG
LDY #>WCuSAGEmSG
JMP EPUTS
WCuSAGEmSG = *
.ASC "uSAGE: WC FILE1 FILE2 ... FILEn"
.BYTE CHRcr,0
WCeNOUGHaRGS = *
;** GET INPUT BUFFER LENGTH
SEC
LDA ACEsTACKpTR
SBC #<WCiNbUF
STA INbUFlEN
LDA ACEsTACKpTR+1
SBC #>WCiNbUF
STA INbUFlEN+1
;** MAIN LOOP
LDA #1
LDY #0
STA WCaRG
STY WCaRG+1
STY FILES
JSR TOTiNIT
- JSR STOPKEY
BCS WCsTOPPED
LDA WCaRG
LDY WCaRG+1
JSR GETARG
LDA ZP
LDY ZP+1
STA WCnAME
STY WCnAME+1
ORA ZP+1
BEQ WCeXIT
JSR WCfILE
BCS +
LDA FILES
BMI +
INC FILES
+ BCC +
JSR WCeRROR
+ INC WCaRG
BNE +
INC WCaRG+1
+ JMP -
WCeXIT = *
LDA FILES
CMP #2
BCC +
JSR REPORTtOTAL
+ RTS
WCsTOPPED = *
LDA #<STOPPEDmSG
LDY #>STOPPEDmSG
JSR EPUTS
RTS
STOPPEDmSG = *
.ASC "<sTOPPED>"
.BYTE CHRcr,0
WCeRROR = *
LDA #<WCeRRORmSG1
LDY #>WCeRRORmSG1
JSR EPUTS
LDA WCnAME
LDY WCnAME+1
JSR EPUTS
LDA #<WCeRRORmSG2
LDY #>WCeRRORmSG2
JMP EPUTS
WCeRRORmSG1 = *
.ASC "eRROR READING FILE "
.BYTE CHRqUOTE,0
WCeRRORmSG2 = *
.BYTE CHRqUOTE,CHRcr,0
BUFcOUNT = 10
INFILE = 12
WCfILE = *
;** OPEN FILE
LDA WCnAME
LDY WCnAME+1
STA ZP
STY ZP+1
LDA #"R"
JSR OPEN
BCC +
RTS
+ STA INFILE
;** COUNT FILE
JSR WCiNIT
JSR WCbODY
;** CLOSE FILE
LDA INFILE
JSR CLOSE
JSR WCrEPORT
JSR ADDtOtOTAL
RTS
WCbODY = *
- LDA #<WCiNbUF
LDY #>WCiNbUF+1
STA ZP
STY ZP+1
LDA #254
LDY #0
LDX INFILE
JSR READ
STA BUFcOUNT
STY BUFcOUNT+1
BEQ +
JSR WCsCANbUFFER
JMP -
+ RTS
WCiNwORD = $4C ;(1)
WClINES = $40 ;(3)
WCwORDS = $44 ;(3)
WCbYTES = $48 ;(3)
TOTlINES = $20 ;(3)
TOTwORDS = $24 ;(3)
TOTbYTES = $28 ;(3)
WCiNIT = *
LDA #0
LDX #11
- STA WClINES,X
DEX
BPL -
STA WCiNwORD
RTS
TOTiNIT = *
LDA #0
LDX #11
- STA TOTlINES,X
DEX
BPL -
RTS
WCsCANbUFFER = *
LDY #0
CPY BUFcOUNT
BNE +
RTS
+ LDX WCiNwORD
- LDA WCiNbUF,Y
CMP #CHRcr
BNE +
INC WClINES
BNE +
INC WClINES+1
BNE +
INC WClINES+2
BNE +
INC WClINES+3
+ CMP #33
BCS ISlETTER
CMP #" "
BEQ ISdELIMITER
CMP #CHRcr
BEQ ISdELIMITER
CMP #9
BEQ ISdELIMITER
ISlETTER = *
CPX #1
BEQ SCANcONT
LDX #1
INC WCwORDS
BNE SCANcONT
INC WCwORDS+1
BNE SCANcONT
INC WCwORDS+2
BNE SCANcONT
INC WCwORDS+3
JMP SCANcONT
ISdELIMITER = *
LDX #0
SCANcONT = *
INY
CPY BUFcOUNT
BCC -
CLC
LDA WCbYTES
ADC BUFcOUNT
STA WCbYTES
BCC +
INC WCbYTES+1
BNE +
INC WCbYTES+2
BNE +
INC WCbYTES+3
+ STX WCiNwORD
RTS
WCrEPORT = *
LDX #WClINES
LDA #6
JSR PUTNUM
LDX #WCwORDS
LDA #6
JSR PUTNUM
LDX #WCbYTES
LDA #7
JSR PUTNUM
LDA WCnAME
LDY WCnAME+1
JSR PUTS
LDA #CHRcr
JSR PUTCHAR
RTS
PUTNUM = *
LDY #<NUMBUF
STY $80
LDY #>NUMBUF
STY $81
JSR UTOA
LDA #<NUMBUF
LDY #>NUMBUF
JSR PUTS
LDA #" "
JSR PUTCHAR
RTS
ADDtOtOTAL = *
CLC
LDX #0
- LDA TOTlINES,X
ADC WClINES,X
STA TOTlINES,X
INX
TXA
AND #$03
BNE -
CLC
LDX #0
- LDA TOTwORDS,X
ADC WCwORDS,X
STA TOTwORDS,X
INX
TXA
AND #$03
BNE -
CLC
LDX #0
- LDA TOTbYTES,X
ADC WCbYTES,X
STA TOTbYTES,X
INX
TXA
AND #$03
BNE -
RTS
REPORTtOTAL = *
LDA #<TOTALmSG
LDY #>TOTALmSG
STA WCnAME
STY WCnAME+1
LDX #11
- LDA TOTlINES,X
STA WClINES,X
DEX
BPL -
JSR WCrEPORT
RTS
TOTALmSG = *
.ASC "<TOTAL>"
.BYTE 0
;===THE END===
WCbSS = *
NUMBUF = WCbSS
WCiNbUF = NUMBUF+12
WRAP.S
361
;*** WRAP PROGRAM
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:WRAP"
JMP MAIN
.ASC "Cb"
;*** GLOBAL DECLARATIONS
WORK1 = $02 ;(16)
WORK2 = $12 ;(16)
WORK3 = $22 ;(14)
CHRcr = $0D
CHRtAB = $09
CHRqUOTE = $22
;SCREEN
SCRtOPaDDR = $30 ;(2)
SCRlINEaDDR = $32 ;(2)
CURrOW = $34 ;(1)
CURcOL = $35 ;(1)
SCRrOWS = $36 ;(1)
SCRcOLS = $37 ;(1)
SCRrOWiNC = $38 ;(2)
CURlEFTmARGIN = $3A ;(1)
;DOCUMENT
LINEpTR = $40 ;(4)
LINEnUM = $44 ;(4)
TOSlINEpTR = $48 ;(4)
TOPlINEpTR = $4C ;(4)
BOTlINEpTR = $50 ;(4)
LINEcOUNT = $54 ;(4)
FILElENGTH = $58 ;(4)
TARGETlEN = $5C ;(1)
WRAPfLAG = $5D ;(1) ;128=WRAP,64=SHOWcr
;MANAGEMENT
MODIFIED = $3B ;(1) ;$00=NO, $FF=MODIFIED
MODEfLAGS = $3C ;(1) ;$80=INSERT, $40=INDENT
STATUSuPDATE = $3D ;(1) ;128=LINE,64=COL,32=MOD,16=INS,8=BYT,4=FRE,2=NM,1=MSG
MARKEDlINEpTR .BUF 4 ;(4)
MARKEDlINEnUM .BUF 4 ;(4)
MARKEDcOL .BUF 4 ;(1)
;LINE FORMAT
HEADnEXTpTR = $70 ;(4)
HEADpREVpTR = $74 ;(4)
HEADlINElEN = $78 ;(1)
HEADiNDENT = $79 ;(1)
HEADfLAGS = $7A ;(1) ;$80=CONNECTED, $40=NULLlINE
HEADlENGTH = $0B
;KILL BUFFER
BUFFERtOPpTR .BUF 4 ;(4)
BUFFERbOTpTR .BUF 4 ;(4)
BUFFERlINEcOUNT .BUF 4 ;(4)
;DOCUMENT BUFFERS
;=== MAIN ===
MAIN = *
JSR MAINiNIT
LDA #1
LDY #0
JSR GETARG
JSR LOADfILE
RTS
MAINiNIT = *
LDA #$80
STA WRAPfLAG
LDA #75
STA TARGETlEN
RTS
;*** LOAD FILE: USES WORK2 ***
LOADhEAD = WORK2+0
LOADtAIL = WORK2+4
LOADlINES = WORK2+8
LOADbYTES = WORK2+12
LOADfCB = WORK3+0
LOADlINEsCAN = WORK3+1
LOADlINElEN = WORK3+2
LOADbUFcOUNT = WORK3+3
LOADbUFpTR = WORK3+4
LOADfILE = * ;( (ZP)=NAME ) : [W2]=HEAD, [W2]=TAIL, [W2]=LINES, [W2]=BYTES
JSR SAVEwORK3
JSR LOADiNIT
LDA #"R"
JSR OPEN
STA LOADfCB
- JSR LOADlINE
BCS +
JSR LOADlINEwRAP
JSR LOADlINEsTORE
JSR LOADlINEoVERFLOW
JMP -
+ LDA LOADlINElEN
BEQ +
JSR LOADlINEwRAP
LDA #$00
STA LINEfLAGS
JSR LOADlINEsTORE
+ LDA LOADfCB
JSR CLOSE
JSR RESTOREwORK3
RTS
LOADiNIT = *
LDA #0
LDX #16+14-1
- STA LOADhEAD,X
DEX
BPL -
RTS
LOADlINE = * ;( ) : .cs=END
;TAB EXPANSION WILL GO INTO THIS ROUTINE
LDX LOADbUFpTR
LDY LOADlINElEN
LOADnEXTbYTE = *
LDA LOADbUFcOUNT
BNE ++
STY LOADlINElEN
JSR LOADbUF
BCC +
RTS
+ LDY LOADlINElEN
LDX LOADbUFpTR
+ NOP
- LDA FILEBUF,X
STA LINE,Y
INX
INY
CMP #CHRcr
BEQ ++
CPY TARGETlEN
BEQ + ;DETERMINES IF crS WILL GO BEYOND LEN
BCS ++
+ DEC LOADbUFcOUNT
BNE -
BEQ LOADnEXTbYTE
+ DEC LOADbUFcOUNT
STX LOADbUFpTR
STY LOADlINElEN
CLC
RTS
LOADbUF = * ;( ) : .cs=EOF
JSR STOPKEY
BCS +
LDA #<FILEBUF
LDY #>FILEBUF
STA ZP+0
STY ZP+1
LDA #<254
LDY #>254
LDX LOADfCB
JSR READ
BCS +
BEQ +
STA LOADbUFcOUNT
LDA #0
STA LOADbUFpTR
CLC
RTS
+ SEC
RTS
LOADlINEwRAP = *
LDX LOADlINElEN
DEX
LDY #$00
LDA LINE,X
CMP #CHRcr
BEQ +
LDY #$80
+ STY LINEfLAGS
CMP #CHRcr
BNE +
- STX LINElINElEN
STX LOADlINEsCAN
STX LOADlINElEN
RTS
+ LDX LOADlINElEN
CPX TARGETlEN
BCC -
+ BIT WRAPfLAG
BMI +
- LDA TARGETlEN
STA LOADlINEsCAN
STA LINElINElEN
RTS
+ LDX TARGETlEN
- DEX
CPX #255
BEQ --
LDA LINE,X
CMP #" "
BNE -
+ INX
STX LOADlINEsCAN
STX LINElINElEN
RTS
LOADlINEsTORE = *
LDA #<LINE
LDY #>LINE
STA ZP+0
STY ZP+1
LDA LINElINElEN
LDY #0
LDX #STDOUT
JSR WRITE
LDA #CHRcr
JSR PUTCHAR
RTS
LOADlINEoVERFLOW = *
LDX LOADlINEsCAN
LDY #0
- CPX LOADlINElEN
BCS +
LDA LINE,X
STA LINE,Y
INX
INY
BNE -
+ STY LOADlINElEN
RTS
;=== MANAGEMENT ROUTINES ===
WORK3sAVE .BUF 14
SAVEwORK3 = *
LDX #13
- LDA WORK3,X
STA WORK3sAVE,X
DEX
BPL -
RTS
RESTOREwORK3 = *
LDX #13
- LDA WORK3sAVE,X
STA WORK3,X
DEX
BPL -
RTS
;=== STANDARD LIBRARY ===
PUTS = *
LDX #STDOUT
FPUTS = *
STA ZP+0
STY ZP+1
LDY #$FF
- INY
LDA (ZP),Y
BNE -
TYA
LDY #0
JMP WRITE
EPUTS = *
LDX #STDERR
JMP FPUTS
PUTCHAR = *
STX XSAVE
STY YSAVE
LDX #STDOUT
JSR PUTC
LDX XSAVE
LDY YSAVE
RTS
XSAVE .BUF 1
YSAVE .BUF 1
PUTC = *
STA PUTCbUFFER
LDA #<PUTCbUFFER
LDY #>PUTCbUFFER
STA ZP+0
STY ZP+1
LDA #1
LDY #0
JMP WRITE
PUTCbUFFER .BUF 1
GETCHAR = *
LDX #STDIN
GETC = *
LDA #<GETCbUFFER
LDY #>GETCbUFFER
STA ZP+0
STY ZP+1
LDA #1
LDY #0
JSR READ
BEQ +
LDA GETCbUFFER
RTS
+ SEC
RTS
GETCbUFFER .BUF 1
GETARG = *
STY ZP+1
ASL
STA ZP+0
ROL ZP+1
CLC
LDA ACEaRGV
ADC ZP+0
STA ZP+0
LDA ACEaRGV+1
ADC ZP+1
STA ZP+1
LDY #0
LDA (ZP),Y
TAX
INY
LDA (ZP),Y
STX ZP+0
STA ZP+1
RTS
;===BSS===
BSS = *
LINEBUF = BSS+0 ;(256)
LINEnEXTpTR = LINEBUF+$0 ;(4)
LINEpREVpTR = LINEBUF+$4 ;(4)
LINElINElEN = LINEBUF+$8 ;(1)
LINEiNDENT = LINEBUF+$9 ;(1)
LINEfLAGS = LINEBUF+$A ;(1) ;$80=CONNECTED, $40=TAILlINE
LINE = LINEBUF+$B ;(241)
FILEBUF = LINEBUF+256 ;(256)
TPAfREEMAP = FILEBUF+256 ;(256)
BSSeND = TPAfREEMAP+256
XLS.S
611
;*** DIRECTORY PROGRAM - BY cRAIG bRUCE
.SEQ ACEHEAD.S
.ORG ACEaPPaDDRESS
.OBJ "@0:XLS"
JMP MAIN
.BYTE ACEid1,ACEid2,ACEid3
;*** GLOBAL DECLARATIONS
LIBWORK = 80
CHRcr = $0D
CHRcLS = 147
CHRqUOTE = $22
TRUE = $FF
FALSE = $00
ARG = 2
NAME = 4
STRING = 8
DIRfCB = 16
DIRcOLUMNS = 17
DIRcURcOL = 18
DIRlONG = 19
DIRsPACES = 20
DIRLINElEN = 21
DIRcHcOLS = 22
DIRpAGED = 23
DIRsHOWN = 24
DIRcLS = 25
DIRfILES = 32
DIRbYTES = 36
DIRfREE = 40
WORK = 64
MAIN = *
LDA #FALSE
STA DIRlONG
STA DIRpAGED
STA DIRsHOWN
STA DIRcLS
LDA #0
LDY #0
STA ARG+0
STY ARG+1
NEXTaRG = *
JSR STOPKEY
BCC +
JMP STOPPED
+ INC ARG+0
BNE +
INC ARG+1
+ LDA ARG+0
LDY ARG+1
JSR GETARG
LDA ZP+0
ORA ZP+1
BEQ MAINeXIT
LDY #0
LDA (ZP),Y
CMP #"-"
BNE NAMEaRG
JSR HANDLEoPTION
JMP NEXTaRG
NAMEaRG = *
LDA ZP+0
LDY ZP+1
STA NAME+0
STY NAME+1
JSR LS
LDA #TRUE
STA DIRsHOWN
JMP NEXTaRG
MAINeXIT = *
LDA DIRsHOWN
BNE +
LDA #<DEFAULTdIR
LDY #>DEFAULTdIR
STA NAME+0
STY NAME+1
JSR LS
+ RTS
DEFAULTdIR = *
.BYTE ".",":",0
HANDLEoPTION = *
LDY #0
STY WORK+2
LDA ZP+0
LDY ZP+1
STA WORK+0
STY WORK+1
NEXToPTION = *
INC WORK+2
LDY WORK+2
LDA (WORK),Y
BNE +
RTS
+ CMP #"?"
BNE +
LDA #<USAGEmSG
LDY #>USAGEmSG
JSR EPUTS
LDA #0
LDX #0
JMP EXIT
+ CMP #"L"
BNE +
LDA #TRUE
STA DIRlONG
JMP NEXToPTION
+ CMP #"C"
BNE +
LDA #TRUE
STA DIRcLS
JMP NEXToPTION
+ JMP NEXToPTION
USAGEmSG = *
.ASC "USAGE: LS [-][L][?][C] [DIRECTORY ...]"
.BYTE CHRcr
.ASC "OPTS: L=LONG FORM, ?=HELP, C=CLEAR SCREEN"
.BYTE CHRcr,0
STOPPED = *
LDA #<STOPPEDmSG
LDY #>STOPPEDmSG
JSR EPUTS
LDA #1
LDX #0
JMP EXIT
STOPPEDmSG = *
.ASC "<sTOPPED>"
.BYTE CHRcr,0
ERROR = *
LDA #<ERRORmSG1
LDY #>ERRORmSG1
JSR EPUTS
LDA NAME+0
LDY NAME+1
JSR EPUTS
LDA #<ERRORmSG2
LDY #>ERRORmSG2
JMP EPUTS
ERRORmSG1 = *
.ASC "eRROR READING DIRECTORY "
.BYTE CHRqUOTE,0
ERRORmSG2 = *
.BYTE CHRqUOTE,CHRcr,0
;===DIR===
LS = *
LDA DIRcLS
BEQ +
LDA #CHRcLS
JSR PUTCHAR
+ LDA DIRlONG
BNE DIR
TRUElS = *
LDX #1
JSR DEVINFO
STX DIRcHcOLS
CMP #0
BNE +
TXA
LDX #$FF
- INX
SBC #20
BCS -
TXA
BNE LSsETcOLS
+ LDA #1
LSsETcOLS = *
STA DIRcOLUMNS
JMP DIRcOMMON
DIR = *
LDX #1
JSR DEVINFO
STX DIRcHcOLS
LDA #1
STA DIRcOLUMNS
DIRcOMMON = *
LDA #0
STA DIRcURcOL
LDX #3
- STA DIRbYTES,X
STA DIRfILES,X
DEX
BPL -
DIRgOTnAME = *
LDA NAME+0
LDY NAME+1
STA ZP+0
STY ZP+1
JSR DIROPEN
BCC +
JMP ERROR
+ STA DIRfCB
LDX DIRfCB
JSR DIRREAD
BCS DIReXIT
BEQ DIReXIT
JSR STOPKEY
BCC +
JMP STOPPED
+ LDA DIRlONG
BPL +
JSR DIRdISPLAYhEADING
/ LDX DIRfCB
JSR DIRREAD
BCS DIReXIT
BEQ DIReXIT
JSR STOPKEY
BCC +
JSR DIReXIT
JMP STOPPED
+ LDA ACEdIRENTnAME
BEQ DIRtRAILEReXIT
JSR DIRdISPLAY
JMP -
DIRtRAILEReXIT = *
LDA DIRlONG
BPL DIReXIT
JSR DIRdISPLAYtRAILER
DIReXIT = *
LDA DIRcURcOL
BEQ +
LDA #CHRcr
JSR PUTCHAR
+ LDA DIRfCB
JMP DIRCLOSE
DIRdISPLAY = *
BIT ACEdIRENTfLAGS
BMI ++
INC DIRfILES+0
BNE +
INC DIRfILES+1
BNE +
INC DIRfILES+2
BNE +
INC DIRfILES+3
+ LDX #0
LDY #4
CLC
- LDA DIRbYTES,X
ADC ACEdIRENTbYTES,X
STA DIRbYTES,X
INX
DEY
BNE -
+ BIT DIRlONG
BMI +
JMP DIRdISPLAYsHORT
+ JSR DIRsETUPdIRLINE
LDA #<DIRLINE
LDY #>DIRLINE
STA ZP+0
STY ZP+1
LDA DIRLINElEN
LDY #0
LDX #STDOUT
JMP WRITE
;* 000000000011111111112222222222333333333344444444445555555555
;* POS: 012345678901234567890123456789012345678901234567890123456789
DIRLINE .ASC "DRWX*-MT 00-xXX-00 12:00A 12345678 *seq 1234567890123456"
.BYTE CHRcr,0
DIRfLAGnAMES .ASC "DRWX*-MT"
DIRdATEsTR .ASC " 00-xXX-00 12:00A "
DIRdATEeND = *
DIRsETUPdIRLINE = *
;** FLAGS
LDX #0
LDA ACEdIRENTfLAGS
- ASL
PHA
LDA #"-"
BCC +
LDA DIRfLAGnAMES,X
+ STA DIRLINE+0,X
PLA
INX
CPX #8
BCC -
;** DATE
JSR PUTiNdATE
LDX #DIRdATEeND-DIRdATEsTR-1
- LDA DIRdATEsTR,X
STA DIRLINE+8,X
DEX
BPL -
;** BYTES
LDX #3
- LDA ACEdIRENTbYTES,X
STA DIRfREE,X
DEX
BPL -
LDA #<UTOAnUMBER
LDY #>UTOAnUMBER
STA SYSWORK+0
STY SYSWORK+1
LDA #8
LDX #DIRfREE
JSR UTOA
LDY #28
LDA DIRcHcOLS
CMP #60
BCS +
LDY #8
+ LDX #0
- LDA UTOAnUMBER,X
STA DIRLINE,Y
INY
INX
CPX #8
BCC -
LDA #" "
STA DIRLINE,Y
INY
;** UNCLOSED FLAG
LDA DIRLINE+4
CMP #"-"
BNE +
LDA #" "
+ STA DIRLINE,Y
INY
;** FILETYPE
LDX #0
- LDA ACEdIRENTtYPE,X
ORA #$80
STA DIRLINE,Y
INY
INX
CPX #3
BCC -
LDA #" "
STA DIRLINE,Y
INY
STA DIRLINE,Y
INY
;** FILENAME
LDX #0
- LDA ACEdIRENTnAME,X
BEQ +
STA DIRLINE,Y
INY
INX
BNE -
+ LDA #CHRcr
STA DIRLINE,Y
INY
LDA #0
STA DIRLINE,Y
STY DIRLINElEN
RTS
DIRdISPLAYsHORT = *
LDA #<ACEdIRENTnAME
LDY #>ACEdIRENTnAME
JSR PUTS
INC DIRcURcOL
LDA DIRcURcOL
CMP DIRcOLUMNS
BCC +
LDA #0
STA DIRcURcOL
LDA #CHRcr
JMP PUTCHAR
+ LDY #$FF
- INY
LDA ACEdIRENTnAME,Y
BNE -
STY DIRsPACES
LDA #20
SBC DIRsPACES
STA DIRsPACES
- LDA #" "
JSR PUTCHAR
DEC DIRsPACES
BNE -
RTS
DIRdISPLAYhEADING = *
LDA #<DIRhEADINGmSG
LDY #>DIRhEADINGmSG
JSR PUTS
LDA #<ACEdIRENTnAME
LDY #>ACEdIRENTnAME
JSR PUTS
LDA #CHRcr
JSR PUTCHAR
RTS
DIRhEADINGmSG = *
.ASC "dIR: "
.BYTE 0
DIRdISPLAYtRAILER = *
LDX #3
- LDA ACEdIRENTbYTES,X
STA DIRfREE,X
DEX
BPL -
LDX #0
LDY #0
- LDA DIRtRAILINGmSG,X
BEQ +
CMP #4
BCC STOREnUM
STA TRAILbUF,Y
INX
INY
BNE -
+ LDA #<TRAILbUF
LDX #>TRAILbUF
STA ZP+0
STX ZP+1
TYA
LDY #0
LDX #STDOUT
JMP WRITE
STOREnUM = *
STX WORK+0
STY WORK+1
SEC
SBC #1
ASL
ASL
ADC #DIRfILES
TAX
LDA #<UTOAnUMBER
LDY #>UTOAnUMBER
STA SYSWORK+0
STY SYSWORK+1
LDA #1
JSR UTOA
LDX #0
LDY WORK+1
- LDA UTOAnUMBER,X
BEQ +
STA TRAILbUF,Y
INX
INY
BNE -
+ LDX WORK+0
INX
JMP --
DIRtRAILINGmSG = *
.ASC "FILES="
.BYTE 1
.ASC " BYTES="
.BYTE 2
.ASC " FREE="
.BYTE 3
.BYTE CHRcr
.BYTE 0
TRAILbUF .BUF 64
PUTiNdATE = *
;** YEAR
LDA ACEdIRENTdATE+1
LDX #9
JSR PUTdIGITS
;** MONTH
LDA ACEdIRENTdATE+2
CMP #$10
BCC +
SEC
SBC #$10-10
+ TAX
LDA MONTHsTR+0,X
STA DIRdATEsTR+5
LDA MONTHsTR+13,X
STA DIRdATEsTR+6
LDA MONTHsTR+26,X
STA DIRdATEsTR+7
;** DAY
LDA ACEdIRENTdATE+3
LDX #2
JSR PUTdIGITS
;** HOUR
LDA ACEdIRENTdATE+4
LDX #"A"
CMP #$00
BNE +
LDA #$12
JMP PUThOUR
+ CMP #$12
BCC PUThOUR
LDX #"P"
CMP #$12
BEQ PUThOUR
SEI
SED
SEC
SBC #$12
CLD
CLI
PUThOUR = *
STX DIRdATEsTR+18
LDX #13
JSR PUTdIGITS
;** MINUTE
LDA ACEdIRENTdATE+5
LDX #16
JSR PUTdIGITS
RTS
PUTdIGITS = * ;( .a=NUM, .x=OFFSET )
PHA
LSR
LSR
LSR
LSR
ORA #$30
STA DIRdATEsTR,X
PLA
AND #$0F
ORA #$30
STA DIRdATEsTR+1,X
RTS
MONTHsTR = *
.ASC "xjfmamjjasond"
.ASC "XAEAPAUUUECOE"
.ASC "XNBRRYNLGPTVC"
;******** STANDARD LIBRARY ********
PUTS = *
LDX #STDOUT
FPUTS = *
STA ZP
STY ZP+1
LDY #$FF
- INY
LDA (ZP),Y
BNE -
TYA
LDY #0
JMP WRITE
EPUTS = *
LDX #STDERR
JMP FPUTS
PUTCHAR = *
LDX #STDOUT
PUTC = *
STA PUTCbUFFER
LDA #<PUTCbUFFER
LDY #>PUTCbUFFER
STA ZP
STY ZP+1
LDA #1
LDY #0
JMP WRITE
PUTCbUFFER .BUF 1
GETARG = *
STY ZP+1
ASL
STA ZP
ROL ZP+1
CLC
LDA ACEaRGV
ADC ZP
STA ZP
LDA ACEaRGV+1
ADC ZP+1
STA ZP+1
LDY #0
LDA (ZP),Y
TAX
INY
LDA (ZP),Y
STX ZP
STA ZP+1
RTS
UTOAnUMBER .BUF 11
;===BSS===
BSS = *