Star Tip 5

Keyboard Scanning
by Pete Cooke
from Your Sinclair #22 (Oct.1987)

It's an astounding thought, but true, that three of the most original and best selling games of the last 12 months, Tau Ceti, Room Ten and Micronaut One were all programmed by the same bloke. This talented 3Dologist is none other than Pete Cooke, our Pitstop special guest. Pete has spent a lot of time programming computer games, his first products coming out on the Richard Shepherd Software label between 1983-85. First Invincible Island, then Urban Upstart, Inferno and finally Ski Star 2000. Moving over to CRL in 1985, he produced Juggernaut, and the Tau Ceti range of games (applause). Pete now works for Nexus and, having recently wowed us all with the excellent Micronaut One, is currently working on a top secret project. Coo-er-gosh.

The routine Pete has contributed to Pitstop is the fab keyboard scanning routine from both the Tau Ceti games and Micronaut One. It is an assembly routine, printed as such because it's easier to make out whats happening that way. So now you will be able to incorporate Pete's routines into your games, as the first step to implementing the sort of Windows, Icons, Mouse and Pointer type controls. This is just the first step, the rest is up to you.

Method

To substitute different key combinations in the routine, simply copy new values into the 5-byte table KEYTAB. The assembly listing is pretty self- explanatory, having piles of comment lines with details of how to use the program.

  10        org  60000
  20        ent  60000
  30 ;
  40 ;
  50 ;      YS_KEYS
  60 ;
  70 ;prog for Your Sinclair
  80 ;
  90 ;file for Hisoft GENS
 100 ;assembler but should
 110 ;be suitable for most
 120 ;assemblers on the market
 130 ;
 140 ;Reads the keyboard
 150 ;Returns with C
 160 ;holding L/R/U/D/F
 170 ;
 180 ;bit 4,C left
 190 ;bit 3,C right
 200 ;bit 2,C up
 210 ;bit 1,C down
 220 ;bit 0,C fire
 230 ;
 240 ;bit set to 1 if pressed
 250 ;
 260 ;keys are chosen by
 270 ;values in KEYTAB
 280 ;
 290 readke ld   hl,keytab
 300        ld   bc,#0500
 310 ;
 320 ;5 keys to read
 330 ;
 340 read_1 ld   a,(hl)
 350        rra
 360        rra
 370        and  #1e
 380        ld   e,a
 390        ld   d,0
 400 ;
 410 ;2*the row number
 420 ;
 430        ld   a,(hl)
 440        inc  hl
 450        push hl
 460 ;
 470 ;save place in KEYTAB
 480 ;
 490        ld   hl,keyadd
 500        add  hl,de
 510        ld   d,a
 520 ;
 530 ;index port addresses
 540 ;
 550        push bc
 560        ld   c,(hl)
 570        inc  hl
 580        ld   b,(hl)
 590        in   a,(c)
 600        inc  b
 610        dec  b
 620        jr   z,read_2
 630        cpl
 640 read_2 ld   e,a
 650 ;
 660 ;read the port
 670 ;and flip bits if not
 680 ;Kempston
 690 ;
 700        pop  bc
 710        pop  hl
 720 ;
 730 ;and get back BC+HL
 740 ;
 750        ld   a,d
 760        and  #07
 770        jr   z,read_4
 780 ;
 790 read_3 rr   e
 800        dec  a
 810        jr   nz,read_3
 820 ;
 830 ;rotate L so bit needed
 840 ;is in bit 0
 850 ;
 860 read_4 rr   e
 870        rl   c
 880 ;
 890 ;rotate the bit into C
 900 ;
 910        djnz read_1
 920        ret
 930 ;
 940 ;exit B=0
 950 ;     C=keys
 960 ;
 970 ;A,HL,DE corrupt
 980 ;
 990 ;
1000 ;port addresses of
1010 ;the keyboard rows
1020 ;
1030 keyadd defw 63486,64510,65022,65278,61438,57342,49150,32766
1040        defw 31 ;*Kempston*
1050 ;
1060 ;
1070 ;KEYTAB holds the position
1080 ;of each key as
1090 ;1/2 row number*8 plus
1100 ;distance from the edge
1110 ;eg. P = 5*8+0
1120 ;    O = 5*8+1
1130 ;    Q = 1*8+0
1140 ;    4 = 0*8+3
1150 ;
1160 keytab defb 5*8+1,5*8+0,2*8+1,3*8+2,7*8+0
1170 ;
1180 ;set for O,P,S,X,space
1190 ;
1200 ;for a Kempston joystick
1210 ;substitute
1220 ;
1230        defb 8*8+1,8*8+0,8*8+3,8*8+2,8*8+4
1240 ;
-- Another Fine Product transcribed by: Jim Grimwood (jimg@globalnet.co.uk), Weardale, England --