NEW AUTO 3,1 *-------------------------------------- devid .EQ $12 src .EQ $12 dst .EQ $14 *-------------------------------------- ILDR.DBuf .EQ $0C00 ILDR.IOBuf .EQ $1400 *-------------------------------------- ILDR.START .PH ILDR ILDR.START1 jsr MLI check for file 'atinit' .DA #MLI.GFINFO .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 IO.RROMBNK2 enable ROM jsr $2000 execute ATinit *-------------------------------------- * BOOT block read 4 directory blocks at dbuf=$C00 -> $13FF *-------------------------------------- ILDR.ENUMPM .DO READCAT=1 lda LDR.MLIOL.P+1 Boot ZP.UNITNUM sta ILDR.MLIRB.P+1 stz dst lda /ILDR.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 #MLI.READBLOCK .DA ILDR.MLIRB.P bcc .23 jmp ILDR.MLIERR .23 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 /ILDR.DBuf+$800 until it points past end of buffer. bcc .22 if ok, read next block. .28 .FIN *-------------------------------------- .DO M.PM=1 jsr ILDR.EnumInit .1 ldx #S.FI.T.BIN ldy #ILDR.PMPFX lda /ILDR.PMPFX clc prefix jsr ILDR.EnumNext bcs .8 jsr ILDR.LoadFilePBuf bcs ILDR.MLIERR ldx #3 .2 lda idxl,x pha dex bpl .2 jsr $2000 bit IO.RROMBNK2 enable ROM ldx #0 .3 pla sta idxl,x inx cpx #4 bne .3 >DEBUGOA bra .1 .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 IO.RROMBNK2 enable ROM bit IO.RDIOUDIS sta IO.SETIOUDIS sta IO.CLRDHIRES bmi .5 sta IO.CLRIOUDIS .5 sta IO.CLR80DISP sta IO.CLR80STORE sta IO.SETTEXT sta IO.CLRMIXED jsr ROM.INIT jsr ROM.SETVID jsr ROM.SETKBD jsr ROM.HOME jmp $2000 go run interpreter .9 jsr MLI no .SYSTEM found, so quit. .DA #MLI.QUIT .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 IO.RROMBNK2 jsr ROM.SETINV .2 lda ILDR.MSG,x pha ora #$80 jsr ROM.COUT inx pla bpl .2 lda #$A0 jsr ROM.COUT ldy #0 .3 iny lda LDR.PBuf,y jsr ROM.COUT cpy LDR.PBuf bne .3 bra * *-------------------------------------- ILDR.EnumInit lda /ILDR.DBuf search directory buffer sta idxl+1 lda #ILDR.DBuf+4 skip Prev/next Block Ptr sta idxl lda ILDR.DBuf+35 EL sta ILDR.EL lda ILDR.DBuf+36 EPB sta ILDR.EPB sta ILDR.EITB lda ILDR.DBuf+37 FCLO eor #$ff sta ILDR.nFC lda ILDR.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 LDR.PBuf filename Len tay .5 lda (idxl),y sta LDR.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 LDR.PBuf bcs .1 filename LE prefix/suffix bit ILDR.bPFXSFX bpl .12 go check prefix tay ldx LDR.PBuf .11 lda LDR.PBuf,x eor (src),y asl bne .1 dex dey bne .11 bra .15 .12 lda (src) expected prefix/suffix len tay .13 lda LDR.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 LDR.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 LDR.PBuf,x eor #$20 to lowercase sta LDR.PBuf,x .9 dex bne .6 .10 clc rts *-------------------------------------- ILDR.LoadFilePBuf ldy #LDR.PBuf lda /LDR.PBuf ILDR.LoadFile sty ILDR.OPEN+1 Filename sta ILDR.OPEN+2 jsr MLI .DA #MLI.OPEN .DA ILDR.OPEN bcs .9 jsr MLI .DA #MLI.GETEOF .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 #MLI.READ .DA ILDR.READ bcs .9 jsr MLI .DA #MLI.CLOSE .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 ILDR.IOBuf .HS 01 REF *-------------------------------------- ILDR.GETEOF .DA #2 PARAM CNT .DA #01 REF .HS 000000 *-------------------------------------- ILDR.READ .DA #4 PARAM CNT .HS 01 REF .DA $2000 .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 .PS "ATINIT" .DO M.PM=1 ILDR.PMPFX .PS "PM." .FIN ILDR.SYSTEMSFX .PS ".SYSTEM" *-------------------------------------- .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 *-------------------------------------- .EP *-------------------------------------- ILDR.LEN .EQ *-ILDR.START *-------------------------------------- MAN SAVE usr/src/prodos.fx/prodos.s.ildr LOAD usr/src/prodos.fx/pdos8m.s ASM