Z80-mbc2 Z80 Code Flash User LED
by coopzone in Design > Software
1502 Views, 4 Favorites, 0 Comments
Z80-mbc2 Z80 Code Flash User LED
This is an example user LED program written in Z80 assembler for the z80-mbc2 computer.
I did this a test and revision exercise for me, this is my first Z80 program for over 35 years.
Enjoy
Supplies
Z80-mbc2 computer
A copy of Z80ASM from SLR Systems Rel. 1.32, downloadable from many cp/m archives
An editor, I used ZDE16, since it was already on the CP/M boot image for the z80-mbc2
Install Z80asm on Your Z80-mbc2
I assume some familiarity with the tools you have for your Z80-MBC2, namely whatever version of cpmtools you use. Here are the steps if using the command line versions:
- Get the files z80asm.com and z80asm.doc (optional) in a directory some place on your host PC
- Put your SD card in the same PC, I assume bellow that it is showing as drive E: below.
- I put the assembler on my CP/M disk A, for cp/m 2.2 that would be disk image DS0N00.DSK
- The command: cpmcp -f z80mbc2-d0 e:DS0N00.DSK z80asm.com 0: will copy the file z80asm.com to the image
- The command cpmcp -f z80mbc2-d0 e:DS0N00.DSK z80asm.doc 0: will copy the documentation to the disk (optional)
When you boot cp/m 2.2 on your z80-mbc, you should now have z80asm.com and z80asm.doc (optional) on drive A
Copy the Source Code to You Z80-mbc2
Connect to the z80-mbc using your terminal program
I suggest you use an unpopulated disk to save the source code on, for example f: to choose this drive type:
F: <cr>
after a few seconds you will see the F: prompt.
now use the zde16 program on drive A to edit a blank file:
a:zde16 myled.z80
This will create a file called myled.z80 on the disk F:, note: the .z80 is required in the name for z80asm to work.
Now copy and paste the code bellow, depending on your terminal speed etc you may have to copy and paste in small sections. Or type it in! get that 1980's feel back as well.
;
;Test the user LED and user Key
;
BDOS equ 05h ;cp/m BDOS entry point
USRLED equ 0 ;opcode for User LED control
USRKEY equ 80h ;opcode for User Switch control
DPORT equ 0 ;DATA port i/o
CPORT equ 1 ;Command port output
;
org 0100h
;
ld (estack),sp ;keep existing info for return to cp/m
ld sp,stack
;
ld hl,msg ;hello message
call _puts
lp: ld a,1 ;turn on = 1
call led
call delay ;delay and wait for key(s)
jr nz,finish ;non zero means key/switch pressed
xor a ;a=0
call led
call delay ;delay or wait for key/switch
jr z,lp ;if zero, no key/switch, go again
;
finish: xor a ;key or switch was pressed, so done
call led
ld hl,bye ;say bye
call _puts ;display msg HL=
ld sp,(estack) ;original stack
ret ;return to cp/m
;
led: push af ;save led value 0 or 1
ld a,USRLED
out (CPORT),a ;optcode sent
pop af
out (DPORT),a ;data sent
ret
;
;Delay loop that check key pressed on terminal or user key
delay: ld bc,00e00h ;aprox 1/2s 8mhz CPU, pure guess work
loop2: dec bc ;count the loop
push bc ;save regs when calling BDOS
push de
ld c,6 ;BDOS raw i/o check if key pressed
ld e,0ffh
call BDOS
pop de ;get our values back from stack
pop bc
or a ;check if key pressed on terminal
ret nz ;yes return (also keeps nz flag set)
ld a,USRKEY ;Now check user key
out (CPORT),a ;command port
in a,(DPORT) ;read key
and a,1 ;only interested in bit 0
ret nz ;return if userkey pressed
ld a,b ;or is bc=0
or c
jr nz,loop2 ;not finished counting, go again
xor a ;set the z flag to 0
ret ;return no key pressed, end of delay
;
_puts: push bc ;save our regs ready for bdos calls
push de
nxt: ld a,(hl) ;get char
or a ;test if it's 0, end of msg
jr z,done ;yes so done
ld e,a ; set up call to BDOS to print a char
ld c,2
push hl ;save text pointer
call BDOS ;print it
pop hl
inc hl ;next char
jr nxt ;keep going
done: pop de ;finished restore regs
pop bc
ret ;and return
;
msg db 'User LED test, any key to exit'
db 0ah,0dh,0
bye db 'Exit'
db 0ah,0dh,0
estack dw 0
ds 256 - 2
stack: dw 0
Save the file using ESC x. See the ZDE16 use guide for more info, it's a bit like wordstar for most editing, except the Ctrl-K options are different.
Compile and Run the Program
Once you have your source code on the machine.
Type:
F> F>a:z80asm myled/a Z80ASM Copyright (C) 1983-86 by SLR Systems Rel. 1.32 MYLED/A End of file Pass 1 0 Error(s) Detected. 406 Absolute Bytes. 16 Symbols Detected.
This will look for the file myled.z80 and produce a binary (.com) file, thats what the option /a stands for.
See the z80asm.doc file for more info.
To run the program, type:
F>myled User LED test, any key to exit Exit F>
Press either the user button or a key on the terminal to exit.
Done.