;***********************************************************************; ;* 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 : - *; ;***********************************************************************; osbgetv jsr savepar ; save registers jsr zetsem 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 osbputv jsr savepar ; save registers jsr zetsem 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 osgbpbv jsr savepar ; bewaar parameters jsr zetsem 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 osgbpb07, osgbpb07, osgbpb07, 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 osgbpb07 nop ; call nog niet beschikbaar osgbpb05ldir3 jmp wissem ; 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