REM > Info/src 1.00 REM Microdrive file info REM REM Core based on Hisoft Extended CATalogue 28-Feb-1984 REM Published in the Hisoft's GEN assembler manual REM REM Called with: REM LET a$="filename":LET bc=USR go REM or REM LET a$="filename":CALL go REM or REM *INFO filename : ver$="1.00":vdate$="02-Jan-2004":REM First version : : A%=0:X%=1:os%=(USR&FFF4 AND &FF00)DIV256:IFos%=6 AND PAGE>&8000:SYS "OS_GetEnv" TO A$:OSCLI"TextToBas "+MID$(A$,INSTR(A$," ",1+INSTR(A$," ")))+" *Z80":END quit%=?&80<>0:?&80=0:ON ERROR REPORT:PRINT" at line ";ERL:IFNOTquit%:END ELSE *Quit : DIM mcode% &1000:load%=64000 : REM Some equates: CR=13:PRFILE=2:RECFLG=67 : REM System variables: WAIT_K=&15D4:MAKE_SPACE=&1655:ERR_SP=&5C3D STRMS =&5C16:ERR_NR=&5C3A:CHANS =&5C4F:PROG =&5C53 D_STR1=&5CD6:S_STR1=&5CD8:N_STR1=&5CDA:T_STR1=&5CDC HD_00 =&5CE6:HD_0B =&5CE7:HD_0D =&5CE9:HD_0F =&5CEB HD_11 =&5CED : REM Hook codes: OPEN_M=&22:CLOSE_M=&23:NEWVARS=&31:SHADOW=&32 : FOR P=0 TO 1:P%=load%:O%=mcode% [OPT P*3+4 ; C - *INFO filename ; NC - LET a$=filename, CALLed ; .go% JR C,UseString ; *command, DE=>filename LD C,ASC"A" ; a$ CALL LookVar:RET C ; Exit if Variable Not Found INC HL:INC HL:INC HL ; HL=>string EX DE,HL ; DE=>string .UseString EXX:PUSH HL:EXX ; HL' corrupted by PRINT_A RST 8:DEFB NEWVARS ; Ensure Interface 1 present ; PUSH DE ; Save ptr to filename LD HL,T_STR1 LD (HL),E INC HL:LD (HL),D ; T_STR1=>filename LD HL,(DRIVE) LD (D_STR1),HL ; D_STR1=drive LD HL,10 LD (N_STR1),HL ; Specify ten characters long RST 8:DEFB OPEN_M ; Try to fetch first sector ; POP HL:LD B,10 ; get ptr to filename CALL WRstring ; Print filename CALL Space ; Print space ; BIT PRFILE,(IX+RECFLG) JR NZ,NotPrint ; Data file LD A,4 ; Type 4="Print" CALL PRTYPE ; Print file type string JR InfoDone ; Step to next entry ; .NotPrint ; data file PUSH IX POP DE LD HL,82 ADD HL,DE EX DE,HL LD A,(DE) ; Get file type INC DE PUSH AF CALL PRTYPE ; Print file type EX DE,HL POP AF OR A JR NZ,NotProg INC HL:INC HL ; BASIC program INC HL:INC HL ; point to length INC HL:INC HL ; point to start LD E,(HL) INC HL LD D,(HL) CALL DEOUTS ; print start DEC HL:DEC HL LD D,(HL) DEC HL LD E,(HL) CALL DEOUTS ; print length JR InfoDone ; .NotProg CP 3 JR NZ,InfoDone INC HL:INC HL LD E,(HL) INC HL LD D,(HL) CALL DEOUTS ; print load address DEC HL:DEC HL LD D,(HL) DEC HL LD E,(HL) CALL DEOUTS ; print length ; .InfoDone RST 8 DEFB CLOSE_M ; Close channel RET ; ; .PRTYPE ; Output file type string LD HL,TYPETAB LD C,A ADD A,A ADD A,A ; multiply by 4 ADD A,C ; multiply by 5 LD C,A LD B,0 ADD HL,BC LD B,5 ; five characters .TypeLoop LD A,(HL) CALL CONOUT INC HL DJNZ TypeLoop JP Space ; ; Output DE in decimal .DEOUTS PUSH HL PUSH IX EX DE,HL LD B,5 LD IX,TENTAB .DEloop LD E,(IX) LD D,(IX+1) LD A,-1 .TenLoop INC A OR A SBC HL,DE JR NC,TenLoop ADD HL,DE OR &30 CALL CONOUT INC IX INC IX DJNZ DEloop CALL Space POP IX POP HL RET ; ; Write a string of length B from (HL) .WRstring LD A,(HL) CALL CONOUT INC HL DJNZ WRstring RET ; ; Open a stream .ChOpen PUSH HL PUSH DE PUSH BC CALL &1601 POP BC POP DE POP HL RET ; ; Output a space to stream 2 .Space LD A,ASC" " ; continue into CONOUT ; ; Output to stream 2 .CONOUT PUSH AF LD A,2 CALL ChOpen POP AF RST &10 RET ; ; .LookVar ; Look for variable in C PUSH HL:PUSH HL ; put two items on stack JP &28EF ; Look up variable ; ; Data .TENTAB DEFW 10000:DEFW 1000:DEFW 100:DEFW 10:DEFW 1 .TYPETAB DEFM "Basic" DEFM "Numbr" DEFM "Strng" DEFM "Bytes" DEFM "Print" DEFM "?????" : ; ; Storage .DRIVE DEFW 1 ]:NEXT : OS."Save INFO "+STR$~mcode%+" "+STR$~O%+" "+STR$~(go%OR&30000)+" "+STR$~(load%OR&30000) IFquit%:*Quit