Two CP/M programs to clear the screen
Sometimes experimenting with the Z80-MBC2 and V20-MBC homebrew CP/M computers leaves the screen garbled or in an unusable state, usually because some program doesn't correctly handle the terminal. The Minicom terminal emulator I use for CP/M sessions has a command for clearing the screen but it may not be enough.
Since a native CP/M solution is more effective I wrote two short utilities in Assembly for properly clearing and initializing the screen.
These transient programs share the same name,
CLS. One runs under CP/M-80 on the Z80-MBC2 with a Z80 processor, the other under CP/M-86 on the V20-MBC with a Nec V20 in 8088 mode. Both assume an ANSI/VT100 terminal and are launched by executing
CLS at the command prompt:
The programs work the same way not just due to the similarity of CP/M's design across different architectures, but also because they are variations of a hello world demo that prints a text string to the console.
After defining constants for the CP/M system functions and resources they access, the
CLS programs call the write string BDOS function to output a string of ANSI escape codes for clearing the screen and moving the cursor to the home position. The definition of the string ends both programs.
CLS for CP/M-80
CLS program for CP/M-80 is written in Intel 8080 Assembly:
; Clear the screen. ; ; Runs on CP/M-80 with an ANSI/VT100 terminal. TPA equ 100h BDOS equ 05h WRITESTR equ 09h ; Write string org TPA mvi c, WRITESTR lxi d, clshome call BDOS ret ; ANSI escapes: ; clear screen : ESC [ 2 J ; go to screen home : ESC [ H clshome: db 1bh, '[2J', 1bh, '[H$' end
For a short program like this that doesn't need a large stack a
ret instruction is adequate to return control to CP/M.
I assembled the program with the
asm80 assembler of Suite8080, my suite of 8080 Assembly cross-development tools in Python, and transferred the
CLS executable to the Z80-MBC2 over the serial line.
CLS for CP/M-86
CLS for CP/M-86 is written in Intel 8086 Assembly. Aside from the different instruction set and the segmentation directives, this version calls the
00h BDOS function of
int 224 to return control as CP/M-86 requires:
; Clear the screen. ; ; Runs on CP/M-86 with an ANSI/VT100 terminal. WRITESTR equ 09h ; BDOS function write string TERMCPM equ 00h ; BDOS function terminate program cseg mov cl, WRITESTR lea dx, clshome int 224 mov cl, TERMCPM int 224 dseg org 100h ; ANSI escapes: ; clear screen : ESC [ 2 J ; go to screen home : ESC [ H clshome db 1bh, '[2J', 1bh, '[H$' end
I transferred the Assembly source to the V20-MBC over the serial line and assembled it with the hosted
ASM86 assembler that comes with CP/M-86.