NEW AUTO 3,1 *-------------------------------------- ILDR.START jsr MLI check for file 'atinit' .DA #MLIGETFILEINFO .DA ILDR.GFINFO bcs ILDR.ENUMPM lda ILDR.GFINFO+S.FI.T cmp #$E2 is 'atinit' correct file type? bne ILDR.ENUMPM error - wrong file type ldy #ILDR.ATINIT lda /ILDR.ATINIT jsr ILDR.LoadFile bcc .1 .9 jmp ILDR.MLIERR .1 lda RROMBNK2 enable ROM jsr sysentry execute ATinit *-------------------------------------- * BOOT block read 4 directory blocks at dbuf=$C00 -> $13FF *-------------------------------------- ILDR.ENUMPM .DO READCAT=1 lda LDR.MLIOL.P+1 Boot unitnum sta ILDR.MLIRB.P+1 stz dst lda /dbuf ldy #$02 read directory into buffer ldx #0 .22 sta dst+1 sta ILDR.MLIRB.P+3 Data buf HI sty ILDR.MLIRB.P+4 Blk Num LO stx ILDR.MLIRB.P+5 Blk Num HI jsr MLI .DA #MLIREADBLOCK .DA ILDR.MLIRB.P bcs .99 ldy #$03 get next block# from link lda (dst),y tax dey ora (dst),y 00 00 -> Last Block beq .28 lda (dst),y tay lda dst+1 inc inc add $200 to buffer pointer cmp /dbuf+$800 until it points past end of buffer. bcc .22 if ok, read next block. .28 .FIN *-------------------------------------- .DO PM jsr ILDR.EnumInit .1 ldx #S.FI.T.BIN ldy #ILDR.KMPFX lda /ILDR.KMPFX clc prefix jsr ILDR.EnumNext bcs .8 jsr ILDR.LoadFilePBuf bcs .99 ldx #3 .2 lda idxl,x 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 .99 jmp ILDR.MLIERR .8 .FIN *-------------------------------------- jsr ILDR.EnumInit ldx #S.FI.T.SYS ldy #ILDR.SYSTEMSFX lda /ILDR.SYSTEMSFX sec suffix 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 setvid jsr setkbd jsr home jmp sysentry go run interpreter .9 jsr MLI no .SYSTEM found, so quit. .DA #MLIQUIT .DA ILDR.QUIT *-------------------------------------- ILDR.MLIERR cmp #MLI.E.BADBUF bne .1 ldx #ILDR.MSG.SYSTOOLARG-ILDR.MSG .HS 2C BIT ABS .1 ldx #ILDR.MSG.SYSLOADERR-ILDR.MSG bit RROMBNK2 jsr SETINV .2 lda ILDR.MSG,x pha ora #$80 jsr COUT inx pla bpl .2 lda #$A0 jsr COUT ldy #0 .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 *-------------------------------------- * X = expected FileType * Y,A = expected prefix/suffix *-------------------------------------- ILDR.EnumNext stx ILDR.FT sty src sta src+1 ror ILDR.bPFXSFX .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 prefix/suffix len cmp pbuf bcs .1 filename LE prefix/suffix bit ILDR.bPFXSFX bpl .12 go check prefix tay ldx pbuf .11 lda pbuf,x eor (src),y asl bne .1 dex dey bne .11 bra .15 .12 lda (src) expected prefix/suffix len tay .13 lda pbuf,y eor (src),y asl bne .1 dey bne .13 .15 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.SYSTOOLARG .AT "Too Large" ILDR.LCBits .HS 8040201008040201 *-------------------------------------- ILDR.GFINFO .DA #10 PARAM CNT .DA ILDR.ATINIT .BS S.FI-3 *-------------------------------------- .DO READCAT=1 ILDR.MLIRB.P .DA #3 .DA #0 unit number .DA 0 2 byte data buffer .DA 0 2 byte block number .FIN *-------------------------------------- ILDR.OPEN .DA #3 PARAM CNT .BS 2 Filename .DA iobuf i/o buffer .HS 01 REF *-------------------------------------- ILDR.GETEOF .DA #2 PARAM CNT .DA #01 REF .HS 000000 *-------------------------------------- ILDR.READ .DA #4 PARAM CNT .HS 01 REF .DA sysentry .DA $9F00 Max file size .HS 0000 *-------------------------------------- ILDR.CLOSE .DA #1 PARAM CNT .HS 01 REF *-------------------------------------- ILDR.QUIT .DA #4 PARAM CNT .HS 00 .HS 0000 .HS 00 .HS 0000 *-------------------------------------- ILDR.ATINIT .DA #6 .AS "ATINIT" ILDR.KMPFX .DA #3 .AS "PM." ILDR.SYSTEMSFX .DA #7 .AS ".SYSTEM" *-------------------------------------- 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 ILDR.bPFXSFX .BS 1 .ED *-------------------------------------- MAN SAVE usr/src/prodos.fx/prodos.s.ildr LOAD usr/src/prodos.fx/prodos.s ASM