ProDOS.FX:Added .PM modules support & bugfixes for 40/80 col display

This commit is contained in:
burniouf 2022-02-06 18:14:18 +01:00
parent 0102a1c1e0
commit 6d85a16ad1
9 changed files with 478 additions and 199 deletions

Binary file not shown.

Binary file not shown.

BIN
.Floppies/ProDOSFX.BOOT.po Normal file

Binary file not shown.

View File

@ -3,11 +3,7 @@ NEW
.LIST OFF .LIST OFF
*-------------------------------------- *--------------------------------------
CC.DECL jsr CC.IsLetter CC.DECL jsr CC.IsLetter
bcc .10 bcs .80
* TODO: PREOPS ++ --.....
bcs .90
.10 >LDYA L.CC.SCSPEC .10 >LDYA L.CC.SCSPEC
jsr CC.LookupID jsr CC.LookupID
@ -16,7 +12,7 @@ CC.DECL jsr CC.IsLetter
* TODO: typedef .... * TODO: typedef ....
bcs .90 bcs .90
*--------------------------------------
.20 >LDYA L.CC.TYPEQUAL .20 >LDYA L.CC.TYPEQUAL
jsr CC.LookupID jsr CC.LookupID
bcs .80 bcs .80
@ -36,9 +32,30 @@ CC.DECL jsr CC.IsLetter
.21 jsr CC.SYM.New Y,A=T/Q, add with undef value... .21 jsr CC.SYM.New Y,A=T/Q, add with undef value...
bcs .99 bcs .99
jsr CC.SYM.Store
bcs .99
* TODO: AOPS
cmp #'='
bne .90
jsr CC.GetNextCharNB skip '='
bcs .99
jsr CC.SYM.GetTypeInYA expected T/Q
jsr CC.EXP.Eval
bcs .99
jsr CC.SYM.PopValue Y,A = T/Q, Set value to this var
.29 bcs .99
jsr CC.SYM.FreeBuf
clv
clc
rts
.80 bit #$60 .80 bit #$60
clc clc

View File

@ -2,6 +2,59 @@ NEW
AUTO 3,1 AUTO 3,1
.LIST OFF .LIST OFF
*-------------------------------------- *--------------------------------------
CC.STMT jsr CC.SYM.Lookup var= or func() ?
bcs .80
ldy #SYM.Q
lda (ZPSymBufPtr),y
bit #SYM.Q.FUNC
bne .20
jsr CC.GetCharNB var = ?
bcs .90
* TODO: AOPS
cmp #'='
bne .90
jsr CC.GetNextChar Skip =
bcs .99
jsr CC.SYM.GetTypeInYA
jsr CC.EXP.Eval
bcs .99
jsr CC.SYM.PopValue
bcs .99
jsr CC.SYM.FreeBufPop
clv
clc
rts
.20 ldy #0 func( ... );
lda #0
jsr CC.F.CallNoRetV
bcs .9
jsr CC.SYM.FreeBufPop
clv
clc
rts
.80 bit #$60
clc
rts
.90 lda #E.CSYN
sec
.99 rts
*--------------------------------------
* X = KW.ID * X = KW.ID
*-------------------------------------- *--------------------------------------
CC.STMT.CPStmt lda LocalPtr Locals CC.STMT.CPStmt lda LocalPtr Locals

View File

@ -3,136 +3,87 @@ NEW
*-------------------------------------- *--------------------------------------
ILDR.START jsr MLI check for file 'atinit' ILDR.START jsr MLI check for file 'atinit'
.DA #MLIGETFILEINFO .DA #MLIGETFILEINFO
.DA gfi_list .DA ILDR.GFINFO
bcc gfi_ok branch if 'atinit' file found bcs ILDR.ENUMPM
cmp #MLI.E.FNOTFND lda ILDR.GFINFO+S.FI.T
beq ILDR.SYSTEM if so, continue loading interpreter
ATINIT.KO jmp badatinit
gfi_ok lda gfi_type
cmp #$E2 is 'atinit' correct file type? cmp #$E2 is 'atinit' correct file type?
bne ATINIT.KO error - wrong file type bne ILDR.ENUMPM error - wrong file type
jsr MLI open 'atinit' file ldy #ILDR.ATINIT
.DA #MLIOPEN lda /ILDR.ATINIT
.DA atopen jsr ILDR.LoadFile
bne ATINIT.KO error bcc .1
lda #$9F max size = 39.75k ($2000-$BF00) jmp ILDR.MLIERR
sta rdlen+1
stz rdlen
jsr MLI read 'atinit' file to 'sysentry' .1 lda RROMBNK2 enable ROM
.DA #MLIREAD
.DA rdparm
bne ATINIT.KO error - too big
jsr MLI close 'atinit' file
.DA #MLICLOSE
.DA clparm
bne ATINIT.KO error
lda RROMBNK2 enable ROM
jsr sysentry execute ATinit jsr sysentry execute ATinit
*-------------------------------------- *--------------------------------------
ILDR.SYSTEM lda /dbuf search directory buffer * BOOT block read 4 directory blocks at dbuf=$C00 -> $13FF
sta idxl+1 *--------------------------------------
lda #$04 start 1 entry past header ILDR.ENUMPM .DO PM
bne H2434 always.
H2432 lda idxl calc next entry position jsr ILDR.EnumInit
H2434 clc
adc dbuf+35 inc to next entry address
sta idxl
bcs H2451 branch if page cross.
adc dbuf+35 test for end of block.
bcc H2453 branch if not page cross
lda idxl+1
lsr end of block?
bcc H2453 no.
cmp #$09 end of directory?
bne H244D no.
jmp nointrp no interpreter, go quit.
H244D lda #$04 reset index to 1st entry in next block. .1 ldx #S.FI.T.BIN
sta idxl ldy #ILDR.KMSFX
H2451 inc idxl+1 inc to next page. lda /ILDR.KMSFX
H2453 ldy #$10 check file type. jsr ILDR.EnumNext
lda #$FF must be a prodos sys file bcs .4
eor (idxl),y
bne H2432 if not sys.
tay see if active jsr ILDR.LoadFilePBuf
lda (idxl),y bcs ILDR.MLIERR
beq H2432 if deleted file.
and #$0F strip file 'kind'. ldx #3
sta pbuf save length of name.
cmp #$08 must be at least 'x.system'
bcc H2432 else, ignore it.
tay compare last 7 chars for '.system'
ldx #$06
H246C lda (idxl),y
eor iterp,x
asl ignore bit 7
bne H2432 branch if something else
dey
dex
bpl H246C
ldy #$00
H247A iny
lda (idxl),y
sta pbuf,y
cpy pbuf
bne H247A
jsr MLI open interpreter file
.DA #$C8
.DA opparm
bne badlod
jsr MLI get eof (length of file)
.DA #$D1
.DA efparm
bne badlod
lda eof+2
bne toolong
lda eof+1
cmp #$9F max size = 39.75k ($2000-$BF00)
bcs toolong
sta rdlen+1
lda eof
sta rdlen (read entire file)
jsr MLI read interpreter file
.DA #$CA
.DA rdparm
beq H24C8 go close if successfully read.
cmp #$56 memory conflict?
beq toolong then too large
bne badlod else, unable to load.
H24C8 jsr MLI close interpreter file
.DA #$CC
.DA clparm
bne badlod hopefully never taken
lda RROMBNK2 enable ROM
sta CLR80DISP .2 lda idxl,x
sta CLR80STORE pha
dex
bpl .2
jsr sysentry
bit RROMBNK2 enable ROM
ldx #0
.3 pla
sta idxl,x
inx
cpx #4
bne .3
>DEBUGOA
bra .1
.FIN
*--------------------------------------
.4 jsr ILDR.EnumInit
ldx #S.FI.T.SYS
ldy #ILDR.SYSTEMSFX
lda /ILDR.SYSTEMSFX
jsr ILDR.EnumNext
bcs .9
jsr ILDR.LoadFilePBuf
bcs ILDR.MLIERR
bit RROMBNK2 enable ROM
bit RDIOUDIS
sta SETIOUDIS
sta CLRDHIRES
bmi .5
sta CLRIOUDIS
.5 sta CLR80DISP
sta CLR80STORE
sta SETTEXT
sta CLRMIXED
jsr init jsr init
jsr setvid jsr setvid
jsr setkbd jsr setkbd
@ -140,94 +91,265 @@ H24C8 jsr MLI close interpreter file
jmp sysentry go run interpreter jmp sysentry go run interpreter
nointrp jsr MLI no interpreter found,so quit. .9 jsr MLI no .SYSTEM found, so quit.
.DA #$65 .DA #MLIQUIT
.DA quitparm .DA ILDR.QUIT
*--------------------------------------
badatinit ldy #6 ILDR.MLIERR cmp #MLI.E.BADBUF
.1 lda atinitname,y
sta pbuf,y
dey
bpl .1
badlod ldx #ILDR.MSG.SYSLOADERR-ILDR.MSG
.HS 2C BIT ABS
toolong ldx #ILDR.MSG.SYSTOOLARG-ILDR.MSG
jsr ILDR.PrintX
ldy #0
.1 iny
lda pbuf,y
jsr COUT
cpy pbuf
bne .1 bne .1
bra * ldx #ILDR.MSG.SYSTOOLARG-ILDR.MSG
*--------------------------------------
ILDR.PrintX bit RROMBNK2 .HS 2C BIT ABS
lda INVFLG .1 ldx #ILDR.MSG.SYSLOADERR-ILDR.MSG
pha
bit RROMBNK2
jsr SETINV jsr SETINV
.1 lda ILDR.MSG,x .2 lda ILDR.MSG,x
pha pha
ora #$80 ora #$80
jsr COUT jsr COUT
inx inx
pla pla
bpl .1 bpl .2
lda #$A0 lda #$A0
jsr COUT jsr COUT
pla ldy #0
sta INVFLG
.3 iny
lda pbuf,y
jsr COUT
cpy pbuf
bne .3
bra *
*--------------------------------------
ILDR.EnumInit lda /dbuf search directory buffer
sta idxl+1
lda #dbuf+4 skip Prev/next Block Ptr
sta idxl
lda dbuf+35 EL
sta ILDR.EL
lda dbuf+36 EPB
sta ILDR.EPB
sta ILDR.EITB
lda dbuf+37 FCLO
eor #$ff
sta ILDR.nFC
lda dbuf+38 FCHI
eor #$ff
sta ILDR.nFC+1
ILDR.EnumInit.RTS
rts rts
*-------------------------------------- *--------------------------------------
ILDR.MSG .EQ * * X = expected FileType
* Y,A = expected suffix
*--------------------------------------
ILDR.EnumNext stx ILDR.FT
sty src
sta src+1
.1 inc ILDR.nFC
bne .2
inc ILDR.nFC+1
sec
beq ILDR.EnumInit.RTS
.2 dec ILDR.EITB
beq .3
lda idxl
clc
adc ILDR.EL
sta idxl
bcc .4 same page
inc idxl+1 512b block, 2nd page
bra .4
.3 inc idxl+1
lda idxl+1
cmp #$14 last block read at $0C00-$13FF
bcs ILDR.EnumInit.RTS
lda #4
sta idxl
lda ILDR.EPB
sta ILDR.EITB
.4 lda (idxl)
beq .2 deleted / empty
bmi .1 $D, $E, or $F...
and #$0F
sta pbuf filename Len
tay
.5 lda (idxl),y
sta pbuf,y
dey
bne .5
ldy #16
lda (idxl),y
cmp ILDR.FT expected file type
bne .1
lda (src) expected suffix len
cmp pbuf
bcs .1 filename LE suffix
tay
ldx pbuf
.11 lda pbuf,x
eor (src),y
asl
bne .1
dex
dey
bne .11
ldy #$1D MIN_VERSION
lda (idxl),y
bpl .10 no lowercase information
ldx pbuf
.6 cpx #8 CS if MIN_VERSION to use
bcs .7
ldy #$1D MIN_VERSION
lda (idxl),y
and ILDR.LCBits,x
bne .8
bra .9
.7 ldy #$1C VERSION
lda (idxl),y
and ILDR.LCBits-8,x
beq .9
.8 lda pbuf,x
eor #$20 to lowercase
sta pbuf,x
.9 dex
bne .6
.10 clc
rts
*--------------------------------------
ILDR.LoadFilePBuf
ldy #pbuf
lda /pbuf
ILDR.LoadFile sty ILDR.OPEN+1 Filename
sta ILDR.OPEN+2
jsr MLI
.DA #MLIOPEN
.DA ILDR.OPEN
bcs .9
jsr MLI
.DA #MLIGETEOF
.DA ILDR.GETEOF
bcs .9
lda ILDR.GETEOF+4
bne .99
lda ILDR.GETEOF+3
cmp #$9F
bcc .1
bne .99 more than $9Fxx
lda ILDR.GETEOF+2
bne .99 more than $9F00
.1 jsr MLI
.DA #MLIREAD
.DA ILDR.READ
bcs .9
jsr MLI
.DA #MLICLOSE
.DA ILDR.CLOSE
.9 rts
.99 lda #MLI.E.BADBUF
sec
rts
*--------------------------------------
ILDR.MSG .EQ *
ILDR.MSG.SYSLOADERR .AT "Unable to load" ILDR.MSG.SYSLOADERR .AT "Unable to load"
ILDR.MSG.SYSTOOLARG .AT "Too Large" ILDR.MSG.SYSTOOLARG .AT "Too Large"
ILDR.LCBits .HS 8040201008040201
*-------------------------------------- *--------------------------------------
gfi_list .DA #$0A ILDR.GFINFO .DA #10 PARAM CNT
.DA atinitname .DA ILDR.ATINIT
.HS 00 .BS S.FI-3
gfi_type .HS 00000000
.HS 0000000000000000
.HS 0000
*-------------------------------------- *--------------------------------------
atopen .HS 03 ILDR.OPEN .DA #3 PARAM CNT
.DA atinitname .BS 2 Filename
.DA iobuf i/o buffer .DA iobuf i/o buffer
.HS 01 ref# hard coded since no other files .HS 01 REF
*-------------------------------------- *--------------------------------------
atinitname .DA #06 length of name ILDR.GETEOF .DA #2 PARAM CNT
.AS "ATINIT" name of appletalk config file .DA #01 REF
.HS 000000
*-------------------------------------- *--------------------------------------
opparm .HS 03 ILDR.READ .DA #4 PARAM CNT
.DA pbuf .HS 01 REF
.DA iobuf
.HS 01
efparm .HS 02
.DA #01
eof .HS 000000 length of file.
rdparm .HS 04
.HS 01
.DA sysentry .DA sysentry
rdlen .HS 0000 .DA $9F00 Max file size
.HS 0000 .HS 0000
clparm .HS 01 *--------------------------------------
.HS 00 ILDR.CLOSE .DA #1 PARAM CNT
quitparm .HS 04 .HS 01 REF
*--------------------------------------
ILDR.QUIT .DA #4 PARAM CNT
.HS 00 .HS 00
.HS 0000 .HS 0000
.HS 00 .HS 00
.HS 0000 .HS 0000
iterp .AS ".SYSTEM" interpreter suffix that is required *--------------------------------------
ILDR.ATINIT .DA #6
.AS "ATINIT"
ILDR.KMSFX .DA #3
.AS ".PM"
ILDR.SYSTEMSFX .DA #7
.AS ".SYSTEM"
*-------------------------------------- *--------------------------------------
ILDR.LEN .EQ *-ILDR.START ILDR.LEN .EQ *-ILDR.START
*--------------------------------------
.DUMMY
ILDR.EPB .BS 1
ILDR.EL .BS 1
ILDR.nFC .BS 2
ILDR.FT .BS 1
ILDR.EITB .BS 1
.ED
*--------------------------------------
MAN MAN
SAVE usr/src/prodos.fx/prodos.s.ildr SAVE usr/src/prodos.fx/prodos.s.ildr
LOAD usr/src/prodos.fx/prodos.s LOAD usr/src/prodos.fx/prodos.s

View File

@ -330,7 +330,9 @@ LDR.ReadRoot lda LDR.MLIOL.P+1 place boot devnum in globals
bcc .1 if ok, read next block. bcc .1 if ok, read next block.
.FIN .FIN
.8 jmp $800 jmp to "load interpreter" code .8 jsr CROUT
jmp ILDR.START
.9 ldx #LDR.MSG.ROOTERR .9 ldx #LDR.MSG.ROOTERR
jsr LDR.PrintX jsr LDR.PrintX
@ -987,7 +989,7 @@ LDR.SetDevID ldy #$FE check attributes byte.
sta devid sta devid
rts rts
*-------------------------------------- *--------------------------------------
LDR.Scr80Init phx Save MDR.MSG LDR.Scr80Init phx Save LDR.MSG
jsr LDR.IsIIc jsr LDR.IsIIc
bcs LDR.Scr80Init2 bcs LDR.Scr80Init2
@ -1022,9 +1024,12 @@ LDR.Scr80Init2 lda #$8C Reset 80 col screen ($0C:HOME)
jsr setnorm jsr setnorm
jsr home jsr home
jsr SETINV jsr SETINV
.DO LOGO .DO LOGO
lda #20 lda #20
sta CV sta CV
inc
sta WNDTOP
jsr VTAB jsr VTAB
lda #LOGO.PAKED lda #LOGO.PAKED
@ -1143,13 +1148,14 @@ LDR.Scr80Init2 lda #$8C Reset 80 col screen ($0C:HOME)
bne .1 bne .1
.FIN .FIN
jsr CLREOL jsr CLREOL
jsr setnorm jsr setnorm
ldx #LDR.MSG.PRODOS ldx #LDR.MSG.PRODOS
jsr LDR.PrintX jsr LDR.PrintX
plx MDR.MSG.machine type plx get back LDR.MSG.machine type
*-------------------------------------- *--------------------------------------
LDR.PrintX bit RROMBNK2 LDR.PrintX bit RROMBNK2

View File

@ -10,6 +10,7 @@ ENHFILENAME .EQ 1
LOWERCASE .EQ 1 LOWERCASE .EQ 1
ACL .EQ 1 ACL .EQ 1
LOGO .EQ 1 LOGO .EQ 1
PM .EQ 1
*-------------------------------------- *--------------------------------------
XRWDBG .EQ 0 XRWDBG .EQ 0
*-------------------------------------- *--------------------------------------

View File

@ -4,6 +4,7 @@ NEW
.OP 65C02 .OP 65C02
.OR $2000 .OR $2000
.TF sys/km/km.ramworks .TF sys/km/km.ramworks
* .TF ramworks.pm
*-------------------------------------- *--------------------------------------
.INB inc/macros.i .INB inc/macros.i
.INB inc/io.i .INB inc/io.i
@ -15,10 +16,11 @@ TmpPtr1 .EQ $0
TmpPtr2 .EQ $2 TmpPtr2 .EQ $2
Type .EQ $4 Type .EQ $4
*-------------------------------------- *--------------------------------------
RW.SAVEZP0 .EQ $800 RW.SAVEZP0 .EQ $2800
RW.SAVEZP1 .EQ $900 RW.SAVEZP1 .EQ $2900
*-------------------------------------- *--------------------------------------
RW.BLOCK .EQ $A00 RW.BLOCK .EQ $2A00
RW.ONLINEBUFFER .EQ $2C00
*-------------------------------------- *--------------------------------------
* A2OSX.SYSTEM relocated at $1000 !!! * A2OSX.SYSTEM relocated at $1000 !!!
*-------------------------------------- *--------------------------------------
@ -27,14 +29,25 @@ RWBankSelect .EQ $C073
*-------------------------------------- *--------------------------------------
RW.Init >LDYAI RW.MSG RW.Init >LDYAI RW.MSG
jsr PrintFYA jsr PrintFYA
jsr RW.DetectRAM3
bcs .10
>LDYAI RW.MSG.OK jsr RW.CheckRAM3
bcs .5
>LDYAI RW.MSG.RAM3OK
jsr PrintFYA jsr PrintFYA
rts rts
.10 lda #RWBankSelect .5 jsr RW.DisableRAM
bcc .10
>LDYAI RW.MSG.RAMDISKO
jsr PrintFYA
rts
.10 >LDYAI RW.MSG.RAMDISOK
jsr PrintFYA
lda #RWBankSelect
jsr RW.DetectHW jsr RW.DetectHW
bcc .1 bcc .1
@ -95,15 +108,80 @@ RW.Init >LDYAI RW.MSG
.9 jsr PrintFYA .9 jsr PrintFYA
rts rts
*-------------------------------------- *--------------------------------------
RW.DetectRAM3 jsr MLI RW.CheckRAM3 jsr RW.ONLINE MLI Online at S3D2
.DA #MLIONLINE bcs .9
.DA RW.ONLINE
lda RW.ONLINEBUFFER
and #$0F
cmp #4 'RAM3' ?
sec
bne .9
tax
.1 lda RW.ONLINEBUFFER,x
eor RW.MSG.RAM3OK,x
asl ignore b7
bne .9
dex
bne .1
clc
.9 rts
*--------------------------------------
RW.DisableRAM lda DEVPTRS3D2
cmp DEVPTRS S0D1=NOVEV
bne .1
lda DEVPTRS3D2+1
cmp DEVPTRS+1 S0D1=NODEV
beq .8 S3D2=NODEV, nothing to do
.1 ldx DEVCNT
.2 lda DEVLST,x LOOKING FOR $BF, $BB, $B7, $B3
and #$F3
cmp #$B3
beq .3
dex
bpl .2
sec No device found, exit with error
rts
.3 cpx DEVCNT
beq .5
.4 lda DEVLST+1,x
sta DEVLST,x
inx
cpx DEVCNT
bne .4
.5 ldx DEVCNT
stz DEVLST,x
dec DEVCNT
lda DEVPTRS
sta DEVPTRS3D2
lda DEVPTRS+1
sta DEVPTRS3D2+1
jsr RW.ONLINE
.8 clc Success!!
rts rts
*-------------------------------------- *--------------------------------------
RW.ONLINE .DA #2 RW.ONLINE jsr MLI
.DA #MLIONLINE
.DA RW.ONLINEPARAM
rts
*--------------------------------------
RW.ONLINEPARAM .DA #2
.DA #$B0 Slot 3,Drive 2 .DA #$B0 Slot 3,Drive 2
.DA RW.ONLINEBUFFER .DA RW.ONLINEBUFFER
RW.ONLINEBUFFER .BS 16
*-------------------------------------- *--------------------------------------
RW.DetectHW php RW.DetectHW php
sei sei
@ -414,7 +492,9 @@ RW.BLOCK2.END .EQ *
.INB usr/src/shared/x.printf.s .INB usr/src/shared/x.printf.s
*-------------------------------------- *--------------------------------------
RW.MSG .AZ "SuperExpander E, RAMWorks (I,II,III,z-Ram) Driver For A2osX\n" RW.MSG .AZ "SuperExpander E, RAMWorks (I,II,III,z-Ram) Driver For A2osX\n"
RW.MSG.OK .AZ "/RAM3 Device Already Installed.\n" RW.MSG.RAMDISOK .AZ "/RAM Device Disabled/Not Present.\n"
RW.MSG.RAMDISKO .AZ "Problem Disabling /RAM Device.\n"
RW.MSG.RAM3OK .AZ "/RAM3 Device Already Installed.\n"
RW.MSG.OK1 .AZ "%D KB Detected (%d Pages), %D KB (%d Pages) Available for RamDrive.\n" RW.MSG.OK1 .AZ "%D KB Detected (%d Pages), %D KB (%d Pages) Available for RamDrive.\n"
RW.MSG.KO1 .AZ "Not Detected.\n" RW.MSG.KO1 .AZ "Not Detected.\n"
RW.MSG.OK2 .AZ "RamWorks Driver Installed.\n" RW.MSG.OK2 .AZ "RamWorks Driver Installed.\n"