From d28b73fefb1020aa66daa974b7c50830f44c27b7 Mon Sep 17 00:00:00 2001 From: Joshua Bell Date: Mon, 31 Dec 2018 15:49:26 -0800 Subject: [PATCH] works but needs absolute path? --- chtype.s | 194 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 159 insertions(+), 35 deletions(-) diff --git a/chtype.s b/chtype.s index 43c0ea0..77a47dd 100644 --- a/chtype.s +++ b/chtype.s @@ -4,18 +4,43 @@ INBUF := $200 ;GETLN input buffer. +;;; ============================================================ +;;; ROM routines + WAIT := $FCA8 ;Monitor wait routine. BELL := $FF3A ;Monitor bell routine +CROUT := $FD8E +PRBYTE := $FDDA +COUT := $FDED +;;; ============================================================ ;;; BASIC.SYSTEM global page -EXTRNCMD := $BE06 ;External cmd JMP vector. -XTRNADDR := $BE50 ;Ext cmd implementation addr. +EXTRNCMD := $BE06 ; External cmd JMP vector. +ERROUT := $BE09 ; Error routine vector. +ERRCODE := $BE0F ; Error code +XTRNADDR := $BE50 ; Ext cmd implementation addr. + XLEN := $BE52 ;Length of command string-1. XCNUM := $BE53 ;CI cmd no. (ext cmd = 0). -PBITS := $BE54 ;Command parameter bits. -VSLOT := $BE61 ;Verified slot parameter. + +PBITS := $BE54 ; Command parameter bits. +FBITS := $BE56 ; Found parameter bits. + +VADDR := $BE58 ; Address parameter +VSLOT := $BE61 ; Slot parameter +VTYPE := $BE6A ; Type parameter +VPATH1 := $BE6C ; Pathname buffer + +GOSYSTEM := $BE70 ; Use instead of MLI + +SSGINFO := $BEB4 ; Get/Set Info Parameter block (set size to set=7 or get=$A) +FIFNAME := $BEB5 ; Should be implcitly linked already +FIFILID := $BEB8 +FIAUXID := $BEB9 + +;;; ============================================================ ;;; TODO: Relocate into ProDOS-allocated buffer @@ -27,16 +52,25 @@ VSLOT := $BE61 ;Verified slot parameter. lda EXTRNCMD+2 sta nxtcmd+1 ;;; - lda #>beepslot ;Install the address of our + lda #handler ; external command JMP sta EXTRNCMD+2 ; vector. - RTS + rts ;;; -beepslot: +handler: ldx #0 ;Check for our command. -nxtchr: lda INBUF,X ;Get first character. - cmp cmd,X ;Does it match? +nxtchr: lda INBUF,x ;Get first character. + + and #$7F ;Convert to ASCII + + cmp #'a' ;Convert to upper-case + bcc :+ + cmp #'z'+1 + bcs :+ + and #$DF + +: cmp cmd,x ;Does it match? bne notours ;NO, SO CONTINUE WITH NEXT CMD. inx ;Next character cpx #cmdlen ;All characters yet? @@ -44,40 +78,130 @@ nxtchr: lda INBUF,X ;Get first character. ;;; lda #cmdlen-1 ;Our cmd! Put cmd length-1 sta XLEN ; in CI global XLEN. - lda #>execute ;Point XTRNADDR to our + lda #execute ; routine sta XTRNADDR+1 lda #0 ;Mark the cmd number as sta XCNUM ; zero (external). ;;; - lda #%00010000 ;Set at least one bit - sta PBITS ; in PBITS low byte! + ;; Must set at least one bit in PBITS low byte. + + lda #%10000000 ; bit 7 = Address + sta PBITS+1 ;;; - lda #%00000100 ;And mark PBITS high byte - sta PBITS+1 ; that slot & drive are legal. + lda #%00000101 ; bit 8 = filename req'd, bit 10 = Type + sta PBITS clc ;Everything is OK. rts ;Return to BASIC.SYSTEM -;;; -execute: - lda VSLOT ;Get slot parameter. - tax ;Transfer to index reg. -nxtbeep: - jsr BELL ;Else, beep once. - lda #$80 ;Set up the delay - jsr WAIT ; and wait. - dex ;decrement index and - bne nxtbeep ; repeat until x = 0. - clc ;All done successfully. - rts ;Back to BASIC.SYSTEM. -;;; -;;; IT'S NOT OUR COMMAND SO MAKE SURE YOU LET BASIC -;;; CHECK WHETER OR NOT IT'S THE NEXT COMMAND. -;;; -notours: sec ;SET CARRY AND LET + +;;; ============================================================ + +notours: + sec ;SET CARRY AND LET jmp (nxtcmd) ; NEXT EXT CMD GO FOR IT. -;;; -cmd: .byte "BEEPSLOT" ;Our command + +;;; ============================================================ + +execute: + ;; Filename? + lda FBITS + and #%00000001 ; Filename? + bne :+ + lda #$10 ; SYNTAX ERROR + sec + rts +: + + ;; Type? + lda FBITS + and #%00000100 ; Type? + bne :+ + lda #$B ; INVALID PARAMETER + sec + rts +: + + ;; Show Filename + lda #'P'|$80 + jsr COUT + lda #'='|$80 + jsr COUT + + ptr := $06 + lda VPATH1 + sta ptr + lda VPATH1+1 + sta ptr+1 + + ldy #0 + lda (ptr),y + tax + iny + +: lda (ptr),y + ora #$80 + jsr COUT + iny + dex + bne :- + jsr CROUT + + ;; Show Type + lda #'T'|$80 + jsr COUT + lda #'='|$80 + jsr COUT + lda #'$'|$80 + jsr COUT + lda VTYPE + jsr PRBYTE + jsr CROUT + + ;; Addr? + lda FBITS+1 + and #%10000000 ; Addr? + beq :+ + + lda #'A'|$80 + jsr COUT + lda #'='|$80 + jsr COUT + lda #'$'|$80 + jsr COUT + lda VADDR+1 ; hi + jsr PRBYTE + lda VADDR ; lo + jsr PRBYTE + jsr CROUT +: + + ;; Get/Set File Info + + ;; GET_FILE_INFO + lda #$A + sta SSGINFO + lda #$C4 ; GET_FILE_INFO + jsr GOSYSTEM + bcs rts1 + + ;; SET_FILE_INFO + lda #$7 + sta SSGINFO + lda VTYPE + sta FIFILID + ;; TODO: optional Aux Type + lda #$C3 ; SET_FILE_INFO + jsr GOSYSTEM + bcs rts1 + + clc ;All done successfully. +rts1: rts ;Back to BASIC.SYSTEM. + +;;; ============================================================ +;;; Data + +cmd: .byte "CHTYPE" ;Our command cmdlen = *-cmd ;Our command length nxtcmd: .word 0 ; STORE THE NEXT COMMAND'S ; ADDRESS HERE.