SSブログ
English Version

CP/Mコマンドにおける小文字パラメータの実現 [Z80]

 CP/M-80(以降、CP/M と記す) でコマンドのパラメータに小文字を入力しても強制的に大文字に変換されます。このため PC から CP/M へシリアル通信等で転送したアーカイブファイルを解凍した場合等に小文字のファイル名があると ERA コマンドでは消せなくなってしまいます(今まで MBASIC を起動して KILL コマンドで消していた^^;)
 また、grep のようなファイルの内容を参照するようなコマンドを作成する場合、コマンドパラメータで対象文字列として小文字を指定できず不便でした。

 CP/M でコマンドパラメータに小文字が使えないのは「入力されたコマンドを処理する CCP(Console Command Processor) 内の1行入力処理部で小文字を大文字に変換している」ためです。

 そこで CCP の1行入力処理内の大文字変換部にパッチを当て一時的に小文字の入力を可能にするコマンドを作ってみました。注意点として CCP はコマンド解析を大文字前提で行っているのでコマンド自体は大文字で入力する必要があります。
 また、このパッチは外部プログラムのみならず ERA 等のビルトインコマンドにも有効になるので上記のような小文字のファイル名の削除も可能になります。上記で”一時的”と書いたのは、コントロールC押下または実行したプログラムの終了時に WBOOT が実行されると CCP が再度読み込まれてパッチが消えてしまうからです(なのでパッチを元に戻すコマンドは準備していません)。

 実行例を下図に示します。argtest は実行時に与えられたパラメータを表示するだけのテスト用プログラムです。

小文字パラメータコマンドの実行例


 リストも貼っておきます。0080H に保存されている起動時のパラメータ文字列の長さがゼロ以外の場合、ヘルプ内容を表示するようにしました。

CP/Mー80 用の小文字パラメータ対応コマンドリスト(Z80 アセンブラ)
;********************************************************* ; patch to allow lowercase command parameter for CP/M-80 ; Ver 0.01 2023/01/20 by skyriver ; Ver 0.01a 2023/01/20 by skyriver ; Compatible with 8080 ; 64K CP/M sample ; E5B1 7E MOV A,M ;convert to upper case. ; E5B2 CD30E5 CALL UPPER ; E5B5 77 MOV M,A <- change to NOP ; ;********************************************************* 000D CR EQU 13 000A LF EQU 10 0005 BDOS EQU 0005H ; BDOS call adrress 0080 ARGBUF EQU 0080H ; command argment save area 0000' ASEG ORG 0100H 0100 3A 0080 START: LD A,(ARGBUF) ; get argment length 0103 B7 OR A 0104 C2 0147 JP NZ,DispHlp 0107 3A 0007 LD A,(BDOS + 2) ; get high addr of BDOS entry 010A D6 07 SUB 07H 010C 57 LD D,A 010D 1E 00 LD E,0 010F 06 00 LD B,0 ; counter 0111 21 0154 LD HL,PATCH ; patch data pointer 0114 E5 LOOP: PUSH HL 0115 D5 PUSH DE 0116 7E LOOP10: LD A,(HL) 0117 23 INC HL 0118 FE FE CP 0FEH 011A CA 013A JP Z,FIND 011D FE FF CP 0FFH 011F CA 0128 JP Z,MATCH 0122 EB EX DE,HL 0123 BE CP (HL) 0124 EB EX DE,HL 0125 C2 012C JP NZ,NEXT 0128 13 MATCH: INC DE 0129 C3 0116 JP LOOP10 012C D1 NEXT: POP DE 012D E1 POP HL 012E 13 INC DE 012F 05 DEC B 0130 C2 0114 JP NZ,LOOP 0133 11 0197 LD DE,MsgNg 0136 CD 014E CALL PUTS 0139 C9 RET 013A EB FIND: EX DE,HL 013B 2B DEC HL 013C 36 00 LD (HL),00H ; change nop 013E 11 015A LD DE,MsgOk 0141 CD 014E CALL PUTS 0144 E1 POP HL 0145 D1 POP DE 0146 C9 RET 0147 DispHlp: 0147 11 01A7 LD DE,MsgHlp 014A CD 014E CALL PUTS 014D C9 RET 014E 0E 09 PUTS: LD C,9 0150 CD 0005 CALL BDOS 0153 C9 RET 0154 7E CD 30 FF PATCH: DB 07EH, 0CDH, 030H, 0FFH, 077H, 0FEH 0158 77 FE 015A 20 50 61 74 MsgOk: DB " Patch success! Please enter the command in capital letters.$" 015E 63 68 20 73 0162 75 63 63 65 0166 73 73 21 20 016A 50 6C 65 61 016E 73 65 20 65 0172 6E 74 65 72 0176 20 74 68 65 017A 20 63 6F 6D 017E 6D 61 6E 64 0182 20 69 6E 20 0186 63 61 70 69 018A 74 61 6C 20 018E 6C 65 74 74 0192 65 72 73 2E 0196 24 0197 20 46 61 69 MsgNg: DB " Fail to patch.$" 019B 6C 20 74 6F 019F 20 70 61 74 01A3 63 68 2E 24 01A7 75 73 61 67 MsgHlp: DB "usage : smallarg",CR,LF 01AB 65 20 3A 20 01AF 73 6D 61 6C 01B3 6C 61 72 67 01B7 0D 0A 01B9 20 20 20 54 DB " This command allows lowercase command parameter.",CR,LF 01BD 68 69 73 20 01C1 63 6F 6D 6D 01C5 61 6E 64 20 01C9 61 6C 6C 6F 01CD 77 73 20 6C 01D1 6F 77 65 72 01D5 63 61 73 65 01D9 20 63 6F 6D 01DD 6D 61 6E 64 01E1 20 70 61 72 01E5 61 6D 65 74 01E9 65 72 2E 0D 01ED 0A 01EE 20 20 20 45 DB " Enter the command in capital letters after execution.",CR,LF 01F2 6E 74 65 72 01F6 20 74 68 65 01FA 20 63 6F 6D 01FE 6D 61 6E 64 0202 20 69 6E 20 0206 63 61 70 69 020A 74 61 6C 20 020E 6C 65 74 74 0212 65 72 73 20 0216 61 66 74 65 021A 72 20 65 78 021E 65 63 75 74 0222 69 6F 6E 2E 0226 0D 0A 0228 20 20 20 52 DB " Return to original after wboot(pushed ^C or program finished).",CR,LF 022C 65 74 75 72 0230 6E 20 74 6F 0234 20 6F 72 69 0238 67 69 6E 61 023C 6C 20 61 66 0240 74 65 72 20 0244 77 62 6F 6F 0248 74 28 70 75 024C 73 68 65 64 0250 20 5E 43 20 0254 6F 72 20 70 0258 72 6F 67 72 025C 61 6D 20 66 0260 69 6E 69 73 0264 68 65 64 29 0268 2E 0D 0A 026B 20 20 20 20 DB " Ver 0.01a 2023/01/20 by skyriver$" 026F 20 20 20 56 0273 65 72 20 30 0277 2E 30 31 61 027B 20 32 30 32 027F 33 2F 30 31 0283 2F 32 30 20 0287 62 79 20 73 028B 6B 79 72 69 028F 76 65 72 24 END Macros: Symbols: 0080 ARGBUF 0005 BDOS 000D CR 0147 DISPHLP 013A FIND 000A LF 0114 LOOP 0116 LOOP10 0128 MATCH 01A7 MSGHLP 0197 MSGNG 015A MSGOK 012C NEXT 0154 PATCH 014E PUTS 0100 START No Fatal error(s)


 今回作成したコマンドは下記のリンクからダウンロードできます。
[history]
Ver 0.01a 2023/01/20 8080対応


nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。