Sharp logo
Independent Key-Scanning on SHARP's 
written by Maurice Hawes 
Source: SUC-magazine July 2001, Volume 21, Number 2, p. 13 & 16  

Independent Key Scanning on the MZ-80B and MZ-2500

Reprinted with alterations from SUC-magazine Volume 6 and Volume 18, No. 1


The mysteries of keyboard scanning on the MZ-80K / A / 700 were first revealed by Sean Wallis in Vol.5 No.2. He concluded by suggesting that someone else might like to do the same for the MZ-80B. I recently acquired an MZ-80B with a full set of Manuals, and noticed that keyboard scanning, though covered in fair detail, is confused by Japanese English, and some errors and omissions.

To begin with, the tables on p. 53 for Ports A and B do not give the addresses of those ports, and there is a bad misprint on p. 54 regarding key data. Also, the assembly language example on p. 55 has more to do with interrupts than keyboard scanning. However, one thing is clear; on the MZ-80B, keyboard scanning, like all other I/O operation, is done by directly addressing I/O ports, and not by addressing locations around $E000 as on the MZ-80K / 80A / 700.

As far as keyboard scanning is concerned, Port A is $E8, and Port B is $EA. Bits 0, 1, 2, 3 of Port A are used to strobe the keyboard, whilst bit 4 has to be set to turn the strobe on. The remaining bits of Port A ( 5 - 7 ) have nothing to do with keyboard scanning AND THEY MUST NOT BE CHANGED WHEN PORT A IS ADDRESSED IN ORDER TO SCAN THE KEYBOARD. As will be seen later, this makes the process more involved than on the other machines. All 8 bits of Port B are used to handle key data inputs resulting from a strobe.

The key data bits from Port B are coded in the normal Sharp way i.e. if the strobe finds a depressed key, the corresponding bit of key data is set LOW. Thus, on page 54, paragraph two should read “For instance, when the strobe is ‘$06‘ and key data _‘$F7‘_ then it is found that key ‘S‘ is being depressed.“ ( N.B. Key data ‘$FF11‘ as printed would indicate that no key was being pressed !! )

The assembly-language example on page 55 is unfinished, which is very confusing. Nevertheless, the last four lines show the method used to strobe row 3 of the keyboard; it begins by reading from $E8 and then ANDing the result with $E0 to leave the top three bits o fPort A unchanged; then an OR with $13 sets bit 4 high AND sets the strobe bits to row 3. The result, returned to $E8, leaves the top 3 bits as they were and performs the required strobe.

The key data from row 3 is read in from Port B ( $EA ), and can be dealt with as you choose. This is not explained in the Owner‘s Manual, but if you look at BRKEY on page 56 of the MONITOR SB-1510 REFERENCE MANUAL you will see how it sets ZERO if the BREAK key is pressed. For clarity, BRKEY ( $0562 ) is rewritten below with the CALL to the subroutine KBSET replaced by the corresponding code:

IN A,(E8H)	; read current setting of E8
AND E0H		; isolate top three bits to leave as is
OR 13H		; set bits to open gate (10H) and set row (03H)
OUT (E8H),A	; strobe selected row (03H)
IN A,(EAH)	; read key data (too soon, should be NOP NOP?)
IN A,(EAH)	; so read it again to make sure!
AND 80H		; check bit 7 (i.e. column 7)
RET		; return (zero flag set if BREAK pressed)

This routine could be used to set the zero flag for any other specific keypress, by changing the values used with OR and AND. For example, to detect the RVS key, OR with $1B to scan row $0B, and then AND with $08 to detect column 3.

MZ-2500 normal keys - minor changes cf. MZ-80B

1) MAIN KEYBOARD: ‘\‘ ( top right ) has become the YEN sign.
‘?‘ ( bottom right ) is moved 1 to the left.
2) NUMBER PAD: ‘00‘ has become ','
‘*' and ‘/‘ are extra new keys ( for MATHOPS )

MZ-2500 special keys - changes and additions cf. MZ-80B
EXTRA KEYS on main keyboard: COPY, BS, ESC, CTRL, ‘SHARP LOGO‘
EXTRA KEYS in SPACEBAR row: GRPH KJ1 SPACEBAR KJ2 KANA

KANA toggles the keyboard to Japanese KANA characters, as per the added keytop markings. ( KANA characters represent syllables e.g. the two characters on this key represent KA and NA ).

GRPH toggles a mode in which SOME keys, after 2 presses, display a Japanese graphics character.

The KJ1 and KJ2 keys, on the SUC machine, appear to do nothing. I would guess that they require optional extra KANJI character ROMS.

The LOGO key ( Sharp‘s Viking Ship, top right alongside F1 key ) when used from MZ-2500 BASIC with a following CR, invokes a drop-down calculator on the VDU, with the number pad redefined to act as its keys. ( From this drop-down calculator mode, LOGO alone returns to BASIC ).

MZ-2500 Basic Program to Check Keyboard Matrix

10 CLEAR $A500
20 POKE $A500,$DB,$E8 $E6,$F0,$F6,$10,$D3,$E8,$0,$0,$DB,$EA,
$FE,$FF,$CA $0,$A5,$32,$20,$A5,$C9
30 INPUT “Strobe whith keyboard row (0-13)“;R
35 FOR TD = 0 TO 2500:NEXT
40 POKE $A505,(R+16): REM add $10 to R to open strobe gate (Bit 4)
50 CALL $A500
60 KD = PEEK($A520)
70 FOR TD = 0 TO 5000:NEXT
75 INPUT “Which key was that“;KY$
80 PRINT:PRINT KY$;“ Key was Row “;HEX$(R);“ Key Data “;HEX$(KD)
90 INPUT “Same Row again";Q$
95 FOR TD = 0 TO 2500:NEXT
100 IF Q$ = “Y“ THEN 50
110 INPUT “Which Row“;R
115 FOR TD = 0 TO 2500:NEXT
120 IF R>13 THEN END
130 GOTO 40
140 END

This program, with added code to convert variables R and KD to HEX strings before reaching LINE 80, and with the maximum value of R set to 11 instead of 13, should also work on the MZ-80B.

With further modifications, to add 240 instead of 16 to the Strobe Row R, to address locations $E000/1 instead of ports $E8 / $EA, and to set the maximum value of R to 9, it should also work with the other MZ-Machines mentioned in this article.


Go to the top of this page      Back to page part 2      Home     

last updated September 3, 2002
SUC / UK: Maurice Hawes

khmweb barrierefreies webdesign Berchtesgaden