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:
A>CLS
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
The 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.
Discuss... Email | Reply @amoroso@fosstodon.org