Merge in JGH PRDECIMAL/*FREE updates.

This commit is contained in:
Bobbi Webber-Manners 2021-09-20 17:02:31 -04:00
parent 000a52b19a
commit 190264aed1
4 changed files with 163 additions and 139 deletions

Binary file not shown.

View File

@ -7,6 +7,7 @@
* Set &E0=&FF for testing to report ProDOS errors
* 30-Aug-2021 FSC commands moved to here
* Command line set by *RUN, and read by OSARGS
* 20-Sep-2021 *FREE uses new PRDECIMAL routine
FSXREG EQU $B0
@ -15,6 +16,7 @@ FSAREG EQU $B2
FSCTRL EQU FSXREG
FSPTR1 EQU $B4
FSPTR2 EQU $B6
FSNUM EQU $C8 ; *TEMP*
FSCMDLINE EQU $CE
@ -313,6 +315,9 @@ FSCCOMMAND ASC 'CHDIR'
ASC 'DESTROY'
DB $80
DW FSCDESTROY-1 ; DESTROY <objlist>, LPTR=>params
ASC 'COPY'
DB $C0
DW COPY-1 ; COPY <source> <dest>, XY=>params
*
DB $FF ; Terminator
@ -661,28 +666,74 @@ FREERET
BRK
:NOERR SEC
LDA AUXBLK+2 ; LSB of total blks
SBC AUXBLK ; LSB of blocks used
SBC AUXBLK+0 ; LSB of blocks used
TAX
LDA AUXBLK+3 ; MSB of total blks
SBC AUXBLK+1 ; MSB of blocks used
TAY
JSR PRDECXY ; Print in decimal
LDX #<:FREEM
LDY #>:FREEM
JSR OUTSTR
JSR FORCENL
LDX AUXBLK+0 ; Blocks used
LDA #$00 ; *TO DO* b16-b23 of free
* NEW
JSR :FREEDEC ; Print 'AAYYXX blocks aaayyyxxx bytes '
LDX #<:FREE
LDY #>:FREE
JSR OUTSTR ; Print 'free'<nl>
LDX AUXBLK+0 ; Blocks used
LDY AUXBLK+1
JSR PRDECXY ; Print in decimal
LDX #<:USEDM
LDY #>:USEDM
JSR OUTSTR
JSR FORCENL
RTS
:FREEM ASC ' 512-byte Blocks Free'
DB $00
:USEDM ASC ' 512-byte Blocks Used'
DB $00
LDA #$00 ; *TO DO* b16-b23 of used
JSR :FREEDEC ; Print 'AAYYXX blocks aaayyyxxx bytes '
LDX #<:USED
LDY #>:USED
JMP OUTSTR ; Print 'used'<nl>
* OLD
* JSR PRDECXY ; Print in decimal
* LDX #<:FREEM
* LDY #>:FREEM
* JSR OUTSTR
* JSR FORCENL
* LDX AUXBLK+0 ; Blocks used
* LDY AUXBLK+1
* JSR PRDECXY ; Print in decimal
* LDX #<:USEDM
* LDY #>:USEDM
* JSR OUTSTR
* JSR FORCENL
* RTS
*
* NEW
:FREEDEC STX FSNUM+1
STY FSNUM+2
STA FSNUM+3
* What's the maximum number of blocks?
* JSR PRHEX ; Blocks b16-b23 in hex
JSR PR2HEX ; Blocks b0-b15 in hex
LDX #<:BLOCKS
LDY #>:BLOCKS
JSR OUTSTR ; ' blocks '
STZ FSNUM+0 ; FSNUM=blocks*512
ASL FSNUM+1
ROL FSNUM+2
ROL FSNUM+3
LDX #FSNUM ; X=>number to print
LDY #8 ; Y=pad up to 8 digits
JSR PRINTDEC ; Print it in decimal
LDX #<:BYTES
LDY #>:BYTES
JMP OUTSTR ; ' bytes '
:BLOCKS ASC ' blocks '
DB 0
:BYTES ASC ' bytes '
DB 0
:FREE ASC 'free'
DB 13,0
:USED ASC 'used'
DB 13,0
*
* OLD
*:FREEM ASC ' 512-byte Blocks Free'
* DB $00
*:USEDM ASC ' 512-byte Blocks Used'
* DB $00
ACCESS JSR PARSLPTR ; Copy filename->MOSFILE
CMP #$00 ; Filename length
@ -928,26 +979,3 @@ ERROR5E DW $C000
ERROR2E DW $C800
ASC 'Disk changed' ; $2E - Disk switched
DB $00

View File

@ -4,6 +4,7 @@
* Misc functions and API entry block
* 02-Sep-2021 Written GSINIT/GSREAD
* 11-Sep-2021 PR16DEC uses OS workspace, added rest of default vectors/etc.
* 20-Sep-2021 Updated PRDECIMAL routine, prints up to 32 bits.
* OSBYTE $80 - ADVAL
@ -100,7 +101,7 @@ FORCENL LDA #$86
* Print XY in hex
OUT2HEX TYA
JSR OUTHEX
TAX ; Continue into OUTHEX
TXA ; Continue into OUTHEX
* Print hex byte in A
OUTHEX PHA
@ -123,50 +124,101 @@ PRNIB CMP #$0A
:S1 ADC #'0' ; < $0A
JMP OSWRCH
* TEMP ENTRY *
* Print 16-bit value in XY in decimal
* beebwiki.mdfs.net/Number_output_in_6502_machine_code
OSNUM EQU OSTEXT+0
OSPAD EQU OSTEXT+4
PRDECXY LDA #' '
PRDECPAD STA OSPAD
STX OSNUM+0
PRDECXY
PRDECPAD STX OSNUM+0
STY OSNUM+1
:PRDEC16 LDY #$08 ; Five digits (5-1)*2
:LP1 LDX #$FF
SEC
:LP2 LDA OSNUM+0
SBC :TENS+0,Y
STA OSNUM+0
LDA OSNUM+1
SBC :TENS+1,Y
STA OSNUM+1
INX
BCS :LP2
LDA OSNUM+0
ADC :TENS+0,Y
STA OSNUM+0
LDA OSNUM+1
ADC :TENS+1,Y
STA OSNUM+1
TXA
BNE :DIGIT
LDA OSPAD
BNE :PRINT
BEQ :NEXT
:DIGIT LDX #'0'
STX OSPAD
ORA #'0'
:PRINT JSR OSWRCH
:NEXT DEY
DEY
BPL :LP1
RTS
:TENS DW 1
DW 10
DW 100
DW 1000
DW 10000
STZ OSNUM+2
STZ OSNUM+3
:PRDEC16 LDY #$05 ; 5 digits
LDX #OSNUM ; number stored in OSNUM
* Print up to 32-bit decimal number
* See forum.6502.org/viewtopic.php?f=2&t=4894
* X=>four byte zero page locations
* Y= number of digits, 0 for no padding
*
PRINTDEC sty OSPAD ; Number of padding+digits
ldy #0 ; Digit counter
PRDECDIGIT lda #32 ; 32-bit divide
sta OSTEMP
lda #0 ; Remainder=0
clv ; V=0 means div result = 0
PRDECDIV10 cmp #10/2 ; Calculate OSNUM/10
bcc PRDEC10
sbc #10/2+$80 ; Remove digit & set V=1 to show div result > 0
sec ; Shift 1 into div result
PRDEC10 rol 0,x ; Shift /10 result into OSNUM
rol 1,x
rol 2,x
rol 3,x
rol a ; Shift bits of input into acc (input mod 10)
dec OSTEMP
bne PRDECDIV10 ; Continue 32-bit divide
ora #48
pha ; Push low digit 0-9 to print
iny
bvs PRDECDIGIT ; If V=1, result of /10 was > 0 & do next digit
lda #32
PRDECLP1 cpy OSPAD
bcs PRDECLP2 ; Enough padding pushed
pha ; Push leading space characters
iny
bne PRDECLP1
PRDECLP2 pla ; Pop character left to right
jsr OSWRCH ; Print it
dey
bne PRDECLP2
rts
** Print 16-bit value in XY in decimal
** beebwiki.mdfs.net/Number_output_in_6502_machine_code
*OSNUM EQU OSTEXT+0
*OSPAD EQU OSTEXT+4
*
*PRDECXY LDA #' '
*PRDECPAD STA OSPAD
* STX OSNUM+0
* STY OSNUM+1
*:PRDEC16 LDY #$08 ; Five digits (5-1)*2
*:LP1 LDX #$FF
* SEC
*:LP2 LDA OSNUM+0
* SBC :TENS+0,Y
* STA OSNUM+0
* LDA OSNUM+1
* SBC :TENS+1,Y
* STA OSNUM+1
* INX
* BCS :LP2
* LDA OSNUM+0
* ADC :TENS+0,Y
* STA OSNUM+0
* LDA OSNUM+1
* ADC :TENS+1,Y
* STA OSNUM+1
* TXA
* BNE :DIGIT
* LDA OSPAD
* BNE :PRINT
* BEQ :NEXT
*:DIGIT LDX #'0'
* STX OSPAD
* ORA #'0'
*:PRINT JSR OSWRCH
*:NEXT DEY
* DEY
* BPL :LP1
* RTS
*:TENS DW 1
* DW 10
* DW 100
* DW 1000
* DW 10000
* GSINIT - Initialise for GSTRANS string parsing
@ -436,7 +488,7 @@ OSFFA4 JMP NULLRTS ; FFA4 (DISKACC)
OSFFA7 JMP NULLRTS ; FFA7 (DISKCCP)
PRHEX JMP OUTHEX ; FFAA PRHEX
PR2HEX JMP OUT2HEX ; FFAD PR2HEX
OSFFB0 JMP NULLRTS ; FFB0 (USERINT)
OSFFB0 JMP PRINTDEC ; FFB0 (USERINT)
OSWRRM JMP NULLRTS ; FFB3 OSWRRM
* COMPULSARY ENTRIES
@ -480,25 +532,3 @@ MOSVEND
AUXBLK ASC '**ENDOFCODE**'
DS $200-13

View File

@ -53,9 +53,6 @@ CMDTABLE ASC 'CAT' ; Must be first command so matches '*.'
DB $8B
DW STARBYTE-1 ; OPT -> OSBYTE &8B,X,Y XY=>params
* others
ASC 'COPY'
DB $FF
DW COPY-1 ; COPY -> XY=>params
ASC 'QUIT'
DB $80
DW STARQUIT-1 ; QUIT -> (LPTR)=>params
@ -495,41 +492,10 @@ STARDONE RTS
* *ECHO <GSTRANS string>
************************
ECHO
* PHY
* CLC
* JSR ECHO0
* PLY
SEC
ECHO SEC
ECHO0 JSR GSINIT
* PHP
* PLA
* JSR OUTHEX
ECHOLP1 JSR GSREAD
BCS STARDONE
* BCS ECHO3
* CMP #$20
* BCC ECHO2
* CMP #$7F
* BCS ECHO2
JSR OSWRCH
JMP ECHOLP1
*ECHO2 PHA
* LDA #'<'
* JSR OSWRCH
* PLA
* JSR OUTHEX
* LDA #'>'
* JSR OSWRCH
* JMP ECHOLP1
*ECHO3
* PHP
* PLA
* JSR OUTHEX
* JMP OSNEWL