;***********************************************************************; ;* P c D F S : PC DISK FILING SYSTEM VOOR DE ELECTRON *; ;*---------------------------------------------------------------------*; ;* module : Lezen / schrijven naar Random Access Files *; ;*---------------------------------------------------------------------*; ;* filenaam : osgbpb.inc *; ;* auteur : Roland Leurs *; ;* The Atomic Development Studio *; ;* ontwikkeld : december 1996 *; ;* laatste update : *; ;*---------------------------------------------------------------------*; ;* assembleren : als include opnemen in PCDFS.ASM *; ;*---------------------------------------------------------------------*; ;* oproep : - *; ;***********************************************************************; osbget jsr savepar ; save registers lda #$42 ; pc commando: lees byte jsr commando tya ; stuur handle naar pc jsr zendbyte jsr leesbyte ; lees status code cmp #0 ; test op einde file beq osbgeteof ; spring indien einde file cmp #1 ; test op ok beq osbgetok ; spring indien ok pha ; bewaar errorcode jsr leesbyte ; lees dummy waarde pla jmp msdoserror ; gelezen resultaat was errorcode osbgetok jsr leesbyte ; lees het byte clc ; wis carry volgens voorschrift jmp osfilexit ; einde via osfilexit osbgeteof jsr leesbyte ; lees dummy byte lda #$FE ; laadt A volgens voorschrift sec ; zet carry voor EOF jmp osfilexit ; einde via osfilexit osbput jsr savepar ; save registers lda #$41 ; pc commando: scrijf byte jsr commando tya ; stuur handle naar pc jsr zendbyte lda par_a ; stuur data naar pc jsr zendbyte jsr leesbyte ; lees resultaat cmp #0 beq osbputfull ; 0 bytes geschreven -> disk vol cmp #1 beq osgbpbexit ; 1 byte geschreven -> ok, einde jmp msdoserror ; andere code is foutmelding osbputfull jmp err_diskfull ; geef foutmelding osgbpb jsr savepar ; bewaar parameters sec ; verlaag accu met 1 sbc #1 cmp #08 bcs osgbpbexit asl a ; bereken index voor sprong tax ; index naar x register lda osgbpbtab,x ; lees sprongadres sta zp ; zet in zeropage lda osgbpbtab+1,x sta zp+1 jmp (zp) ; spring naar osgbpb routine osgbpbexit lda par_a ; herstel accu jmp osfilexit ; einde via osfilexit osgbpbtab .dw osgbpb00, osgbpb01, osgbpb02, osgbpb03 .dw osgbpb04, osgbpb05, osgbpb06, osgbpb07 osgbpb00 jsr par2zp ; zet parameterblok in zeropage ldy zp+3 ; lees file handle ldx #zp+12 ; laadt x register met index jsr osargsptr1 ; zet filepointer jmp osgbpb01l1 ; spring naar schrijf routine osgbpb01 jsr par2zp ; zet parameterblok in zeropage osgbpb01l1 lda #$61 ; pc commando: write record jsr commando lda #1 jsr zendbyte lda zp+3 ; stuur handle naar pc jsr zendbyte lda zp+8 ; stuur aantal te zenden bytes sta zp+10 jsr zendbyte lda zp+9 sta zp+11 jsr zendbyte ldy #0 ; reset pointer osgbpb01l2 lda (zp+4),y ; lees data uit geheugen jsr zendbyte ; stuur naar pc inc zp+4 ; verhoog geheugen index bne osgbpb01l3 inc zp+5 osgbpb01l3 dec zp+8 ; verlaag aantal te zenden bytes lda zp+8 cmp #$FF bne osgbpb01l4 dec zp+9 osgbpb01l4 lda zp+8 ; test of alle bytes gehad ora zp+9 bne osgbpb01l2 ; spring indien nog bytes volgen jsr leesbyte ; haal status van pc beq osgbpb01l5 ; spring indien alles in orde jmp msdoserror ; indien fout opgetreden osgbpb01l5 jsr leesbyte ; lees aantal gelezen bytes sta zp+8 ; zet in geheugen jsr leesbyte sta zp+9 sec ; bereken aantal niet verzonden bytes lda zp+10 sbc zp+8 sta zp+8 lda zp+11 sbc zp+9 sta zp+9 osgbpb01l6 lda #0 ; wis overige bytes in lengteveld sta zp+10 sta zp+11 ldy zp+3 ; zet nieuwe file ptr in zeropage ldx #zp+12 jsr osargsptr0 ; lees nieuwe pointerwaarde jsr zp2par ; zet zeropage info in parameterblok clc ; bepaal carry-return-status lda #$FF ; laadt accu met 255 adc zp+8 ; aantal niet geschreven bytes erbij adc zp+9 jmp osgbpbexit ; einde routine osgbpb02 jsr par2zp ; zet parameterblok in zeropage ldy zp+3 ; lees file handle ldx #zp+12 ; laadt x register met index jsr osargsptr1 ; zet filepointer jmp osgbpb03l1 ; spring naar schrijf routine osgbpb03 jsr par2zp ; zet parameterblok in zeropage osgbpb03l1 lda #$61 ; pc commando: read record jsr commando lda #0 jsr zendbyte lda zp+3 ; stuur handle naar pc jsr zendbyte lda zp+8 ; stuur aantal te lezen bytes jsr zendbyte lda zp+9 jsr zendbyte jsr leesbyte ; lees status van pc beq osgbpb03l0 ; spring indien alles ok jmp msdoserror ; indien fout osgbpb03l0 jsr leesbyte ; lees aantal gelezen bytes sta zp+10 ; zet in zeropage jsr leesbyte sta zp+11 sec ; bereken aantal niet verzonden bytes lda zp+8 sbc zp+10 sta zp+8 lda zp+9 sbc zp+11 sta zp+9 ldy #0 ; reset pointer osgbpb03l2 jsr leesbyte ; lees data uit geheugen sta (zp+4),y ; stuur naar pc inc zp+4 ; verhoog geheugen index bne osgbpb03l3 inc zp+5 osgbpb03l3 dec zp+10 ; verlaag aantal te lezen bytes lda zp+10 cmp #$FF bne osgbpb03l4 dec zp+11 osgbpb03l4 lda zp+10 ; test of alle bytes gehad ora zp+11 bne osgbpb03l2 ; spring indien nog bytes volgen ldy zp+3 ; zet nieuwe file ptr in zeropage ldx #zp+12 jsr osargsptr0 ; lees nieuwe pointerwaarde jmp osgbpb01l6 ; einde via osgbpb commando #1 osgbpb04 lda #0 ; zet default voor niets gevonden sta zp+3 sta zp+5 lda #$0D sta zp+4 ldx #osgbpb04str jsr osfind_first ; zoek eerste file osgbpb04_zoek ldy #3 ; default voor niets gevonden lda cfsbuffer ; lees resultaat bne osgbpb04end ; einde indien geen file meer over lda cfsbuffer+1 ; lees attribuut van gevonden file and #$08 ; test op volume label bne osgbpb04_label ; spring indien label gevonden jsr osfind_next ; zoek volgende file jmp osgbpb04_zoek ; spring altijd osgbpb04_label ldx #10 ; laadt pointer naar filenaam in dta ldy #0 ; reset index sty zp+3 ; zet in zeropage osgbpb04_lab1 lda cfsbuffer,x ; kopieer filenaam naar werkruimte sta zp+4,y inx ; verhoog pointer cmp #'.' ; puntje overslaan beq osgbpb04_lab1 iny ; verhoog index cmp #$0D ; test op einde string bne osgbpb04_lab1 ; spring indien niet einde string dey ; verlaag teller sty zp+3 ; zet in werkruimte iny ; verhoog teller met twee iny lda #$02 ; keiharde boot optie *RUN !BOOT sta zp+3,y ; zet in werkruimte osgbpb04end jsr zp2par1 ; zet zeropage werkruimte naar parblok jmp osgbpbexit ; einde routine osgbpb04str .db "\*.*",13 ; in root alle files zoeken osgbpb05 jsr osgbpb05dir ; lees directorynaam in cfsbuffer osgbpb05parmblk tya ; zet stringlengte op stack pha ldy #0 ; clear pointer lda #1 ; laadt lengte van device id sta (parm),y ; zet in parameterblok lda cfsbuffer ; laadt device id iny ; verhoog pointer sta (parm),y ; zet in parameterblok pla ; haal stringlengte van stack sec ; trek device id lengte er van af sbc #3 iny ; verhoog pointer sta (parm),y ; zet in parameter blok ldx #2 ; reset index osgbpb05l1 lda cfsbuffer,x ; lees karakter van directory inx ; verhoog index iny ; verhoog pointer sta (parm),y ; zet in parameterblok cmp #13 ; test op einde string bne osgbpb05l1 ; spring indien nog karakters volgen jmp osgbpbexit ; einde routine osgbpb05dir lda #$0E ; pc-commando: directory opvragen jsr commando lda #0 ; deze hoort er ook nog bij jsr zendbyte jsr leesbyte ; lees status beq osgbpb05ldir ; spring om directorynaam te lezen jmp msdoserror ; er is iets misgegaan, kan beur'n osgbpb05ldir jsr leesbyte ; test of er nog tekst volgt beq osgbpb05ldir3 ; spring als geen tekst meer volgt jsr leesbyte ; lees drive code clc ; maak er een drive letter van adc #'@' sta cfsbuffer ; zet in buffer lda #':' ; voeg :\ toe aan string sta cfsbuffer+1 lda #'\' sta cfsbuffer+2 ldy #3 ; laadt index osgbpb05ldir1 jsr leesbyte ; lees directory beq osgbpb05ldir2 ; spring bij laatste karakter sta cfsbuffer,y ; zet in buffer iny ; verhoog index bne osgbpb05ldir1 ; gedwongen sprong osgbpb05ldir2 lda #13 ; laadt cr voor einde string sta cfsbuffer,y ; sluit string in buffer af iny ; zet pointer achter de string osgbpb05ldir3 rts ; einde routine osgbpb06 ldy #0 ; reset pointer osgbpb06l1 lda library,y ; laadt karakter van lib-string sta cfsbuffer,y ; zet in buffer iny ; verhoog index cmp #13 ; test op einde string bne osgbpb06l1 ; spring indien nog karakters volgen jmp osgbpb05parmblk ; zet library string in parameterblok osgbpb07 rts ; call nog niet beschikbaar