4K ROM: Display Routine

DISPLAY begins the 4K ROM’s input/output module at 013Ch, or 316d. We initialized system variables D8FILE (D-FILE), FRAMES, RESULT, and CH8ADD (CH-ADD) using EQUate statements at the beginning of our assembly.

This routine controls sync, display, and keyboard scanning. You can use it either by branching from a USR routine into ROM or by incorporating the module into your own machine language (ML) program.

DISPLAY jumps back to BASIC after execution. If you decide to call it from the ROM, remember that you’ll have to jump back to ML with another USR call.

ANNOTATED 4K ROM LISTING — DISPLAY

013C            00100         ORG    013CH
4000 00110 Y EQU 4000H
400C 00115 D8FILE EQU 400CH
401E 00120 FRAMES EQU 401EH
4022 00130 RESULT EQU 4022H
4026 00140 CH8ADD EQU 4026H
013C CDAD01 00150 LD1 CALL LD9 ;SPACE BETWEEN LAST LINE OF
00160 ;CHARS AND FRAME SYNC
01010 ;DISP -- ENTER HERE FROM BASIC TO DISPLAY RESULTS
013F 0608 01020 LD B,8
0141 10FE 01030 DJNZ $ ;WASTE 99 T-STATES
0143 2A1E40 01040 LD HL,(FRAMES)
0146 23 01050 INC HL
0147 221E40 01060 LD (FRAMES),HL
014A 21FFFF 01070 LD HL,-1
014D 06FE 01080 LD B,0FEH
014F 48 01090 LD C,B
0150 ED78 01100 IN A,(C) ;START FRAME SYNC
0152 F601 01110 OR 1
0154 F6E0 01120 LK3 OR 0E0H
0156 57 01130 LD D,A ;ZERO BIT FOR EACH KEY THAT
0157 2F 01140 CPL ;IS PRESSED
0158 FE01 01150 CP 1
015A 9F 01160 SBC A,A ;0 IF ANY KEY PRESSED, -1 IF NONE
015B B0 01170 OR B
015C A5 01180 AND L ;CLEAR THE BIT FOR THIS ROW IN
015D 6F 01190 LD L,A ;L IF ANY KEY DOWN
015E 7C 01200 LD A,H
015F A2 01210 AND D
0160 67 01220 LD H,A
0161 CB00 01230 RLC B
0163 ED78 01240 IN A,(C)
0165 38ED 01250 JR C,LK3
0167 1F 01260 RRA
0168 CB14 01270 RL H
016A 17 01280 RLA
016B 17 01290 RLA
016C 17 01300 RLA
016D 9F 01310 SBC A,A
016E E618 01320 AND 24 ;0 IF US, 24 IF UK
0170 C620 01330 ADD A,32
0172 322340 01340 LD (RESULT+1),A ;32 IF US, 56 IF UK
01350 ;NOW L HAS 0 FOR EACH ROW IN WHICH A KEY OTHER THAN SHIFT
01360 ;IS PRESSED, H SIMILARLY FOR COLUMNS IN D1 TO D5, D6D7
01370 ;ONES, D0=0 IF SHIFT PRESSED, ELSE
01380 ;717 T-STATES SINCE START OF FRAME SYNC, 545 BEFORE END
0175 ED4B2640 01390 LD BC,(CH8ADD) ;PICK UP LAST TIME'S KEY
01400 ;HITS, OR A VALUE WITH D1514=01 IF
0179 222640 01410 LD (CH8ADD),HL ;FIRST TIME ROUND
017C 78 01420 LD A,B
017D C602 01430 ADD A,2
01440 ;NOW EITHER CARRY IS CLEAR AND BC INDICATES A KEY WAS
01450 ;PRESSED OR CARRY IS CLEAR AND BC FFFFH OR FEFFH.
01460 ;NB NEITHER 0000H NOR FF00H IS A POSSIBLE VALUE FOR HL
01470 ;SINCE D6D7 OF H ARE SET & IF ALL OF D1 TO D5 OF H ARE
01480 ;SET THEN NO KEY IS PRESSED AND L = -1
017F ED42 01490 SBC HL,BC ;HL :=0 IF HL=BC AND
0181 EB 01500 EX DE,HL ;C NOT FFH
0182 212240 01510 LD HL,RESULT
0185 7E 01520 LD A,(HL)
0186 B2 01530 OR D
0187 B3 01540 OR E
0188 C8 01550 RET Z ;IF (X8PTR)=BC, A KEY IS PRESSED,
0189 78 01560 LD A,B ;AND COUNT=0. EXIT WITH ADE=0
018A FEFE 01570 CP 254
018C 9F 01580 SBC A,A ;A:=0 IF NO KEY LAST TIME,-1 ELSE
018D 061F 01590 LD B,31
018F B6 01600 OR (HL) ;A:= (HL) IF NO KEY LAST TIME,
0190 A0 01610 AND B ; -1 ELSE
0191 1F 01620 RRA ;NB SHIFTS IN A ZERO
0192 77 01630 LD (HL),A
0193 05 01640 DEC B
0194 10FE 01650 DJNZ $ ;FRAME SYNC ENDS AT NEXT M1
0196 D3FF 01660 OUT (0FFH),A
0198 3EEC 01670 LD A,-20
019A 0619 01680 LD B,25
019C 2A0C40 01690 LD HL,(D8FILE)
019F CBFC 01700 SET 7,H
01A1 CDAD01 01710 CALL LD9 ;DISPLAY SPACE ABOVE PICTURE AND
01A4 3EF3 01720 LD A,-13 ;24 LINES OF TEXT
01A6 04 01730 INC B
01A7 2B 01740 DEC HL
01A8 FD3523 01750 DEC (IY+RESULT+1-Y) ;ONE LESS LINE BELOW
01AB 188F 01760 JR LD1 ;PICTURE THAN ABOVE
01770 ; SRTN TO DO THE DISPLAYING
01AD FD4E23 01780 LD9 LD C,(IY+RESULT+1-Y) ; # PICTURE LINES
01B0 ED4F 01790 LD R.A ;IN FIRST LINE OF TEXT
01B2 3EDD 01800 LD A,-35 ;VALUE FOR R IN SUBSEQUENT LINES
01B4 FB 01810 EI
01B5 E9 01820 JP (HL)
01830 ;WILL RETURN TO CALLER AT END OF PICTURE

ROM contents © Sinclair Research Ltd., 1980. Reprinted by permission. Both Sinclair and Syntax ZX80 Inc. own copyright interests in this material.