CPU-Z80-Disassembler

 view release on metacpan or  search on metacpan

t/data/zx48_benchmark.asm  view on Meta::CPAN


K_CH_SET:
        ld a, l                 ; make a copy of the low address byte.
        ld hl, KSTATE4          ; point to KSTATE-4
                                ; (ld l,$04 would do)
        cp l                    ; have both sets been considered ?
        jr nz, K_ST_LOOP        ; back to K-ST-LOOP to consider this 2nd set

;   now the raw key (0-38d) is converted to a main key (uppercase).

        call K_TEST             ; routine K-TEST to get main key in A

        ret nc                  ; return if just a single shift

        ld hl, KSTATE           ; point to KSTATE-0
        cp (hl)                 ; does the main key code match ?
        jr z, K_REPEAT          ; forward to K-REPEAT if so

;   if not consider the second key map.

        ex de, hl               ; save kstate-0 in de
        ld hl, KSTATE4          ; point to KSTATE-4
        cp (hl)                 ; does the main key code match ?
        jr z, K_REPEAT          ; forward to K-REPEAT if so

;   having excluded a repeating key we can now consider a new key.
;   the second set is always examined before the first.

        bit 7, (hl)             ; is the key map free ?
        jr nz, K_NEW            ; forward to K-NEW if so.

        ex de, hl               ; bring back KSTATE-0
        bit 7, (hl)             ; is it free ?
        ret z                   ; return if not.
                                ; as we have a key but nowhere to put it yet.

;   continue or jump to here if one of the buffers was free.

;; K-NEW

K_NEW:
        ld e, a                 ; store key in E
        ldi (hl), a             ; place in free location
                                ; advance to the interrupt counter
        ldi (hl), $05           ; and initialize counter to 5
                                ; advance to the delay
        ld a, (REPDEL)          ; pick up the system variable REPDEL
        ldi (hl), a             ; and insert that for first repeat delay.
                                ; advance to last location of state map.

        ld c, (iy+MODE-IY0)     ; pick up MODE  (3 bytes)
        ld d, (iy+FLAGS-IY0)    ; pick up FLAGS (3 bytes)
        push hl                 ; save state map location
                                ; Note. could now have used, to avoid IY,
                                ; ld l,$41; ld c,(hl); ld l,$3B; ld d,(hl).
                                ; six and two threes of course.

        call K_DECODE           ; routine K-DECODE

        pop hl                  ; restore map pointer
        ld (hl), a              ; put the decoded key in last location of map.

;; K-END

K_END:
        ld (LAST_K), a          ; update LASTK system variable.
        set 5, (iy+FLAGS-IY0)   ; update FLAGS  - signal a new key.
        ret                     ; return to interrupt routine.


; -----------------------
; THE 'REPEAT KEY' BRANCH
; -----------------------
;   A possible repeat has been identified. HL addresses the raw key.
;   The last location of the key map holds the decoded key from the first 
;   context.  This could be a keyword and, with the exception of NOT a repeat 
;   is syntactically incorrect and not really desirable.

;; K-REPEAT

K_REPEAT:
        inc hl                  ; increment the map pointer to second location.
        ldi (hl), $05           ; maintain interrupt counter at 5.
                                ; now point to third location.
        dec (hl)                ; decrease the REPDEL value which is used to
                                ; time the delay of a repeat key.

        ret nz                  ; return if not yet zero.

        ld a, (REPPER)          ; fetch the system variable value REPPER.
        ldi (hl), a             ; for subsequent repeats REPPER will be used.
                                ; advance

        ld a, (hl)              ; pick up the key decoded possibly in another
                                ; context.
                                ; Note. should compare with $A5 (RND) and make
                                ; a simple return if this is a keyword.
                                ; e.g. cp $a5; ret nc; (3 extra bytes)
        jr K_END                ; back to K-END


; ----------------------
; THE 'KEY-TEST' ROUTINE
; ----------------------
;   also called from s-inkey$
;   begin by testing for a shift with no other.

;; K-TEST

K_TEST:
        ld b, d                 ; load most significant key to B
                                ; will be $FF if not shift.
        ld d, $00               ; and reset D to index into main table
        ld a, e                 ; load least significant key from E
        cp $27                  ; is it higher than 39d   i.e. FF
        ret nc                  ; return with just a shift (in B now)

        cp $18                  ; is it symbol shift ?
        jr nz, K_MAIN           ; forward to K-MAIN if not

;   but we could have just symbol shift and no other

        bit 7, b                ; is other key $FF (ie not shift)
        ret nz                  ; return with solitary symbol shift


;; K-MAIN

K_MAIN:
        ld hl, MAIN_KEYS        ; address: MAIN-KEYS
        add hl, de              ; add offset 0-38
        ld a, (hl)              ; pick up main key value
        scf                     ; set carry flag
        ret                     ; return    (B has other key still)


; ----------------------------------
; THE 'KEYBOARD DECODING' SUBROUTINE
; ----------------------------------
;   also called from s-inkey$

;; K-DECODE

K_DECODE:
        ld a, e                 ; pick up the stored main key
        cp $3A                  ; an arbitrary point between digits and letters
        jr c, K_DIGIT           ; forward to K-DIGIT with digits, space, enter.

        dec c                   ; decrease MODE ( 0='KLC', 1='E', 2='G')

        jp m, K_KLC_LET         ; to K-KLC-LET if was zero

        jr z, K_E_LET           ; to K-E-LET if was 1 for extended letters.

t/data/zx48_benchmark.asm  view on Meta::CPAN

        cp $39                  ; is key '9' ?
        jr z, K_LOOK_UP         ; back to K-LOOK-UP - changed to $0F, GRAPHICS.

        cp $30                  ; is key '0' ?
        jr z, K_LOOK_UP         ; back to K-LOOK-UP - changed to $0C, delete.

;   for keys '0' - '7' we assign a mosaic character depending on shift.

        and $07                 ; convert character to number. 0 - 7.
        add a, $80              ; add offset - they start at $80

        inc b                   ; destructively test for shift
        ret z                   ; and return if not pressed.

        xor $0F                 ; toggle bits becomes range $88-$8F
        ret                     ; return.


; ---

;   now digits in 'KLC' mode

;; K-KLC-DGT

K_KLC_DGT:
        inc b                   ; return with digit codes if neither
        ret z                   ; shift key pressed.

        bit 5, b                ; test for caps shift.

        ld hl, CTL_CODES-$30    ; prepare base of table CTL-CODES.
        jr nz, K_LOOK_UP        ; back to K-LOOK-UP if shift pressed.

;   must have been symbol shift

        sub $10                 ; for ASCII most will now be correct
                                ; on a standard typewriter.

        cp $22                  ; but '@' is not - see below.
        jr z, K___CHAR          ; forward to K-@-CHAR if so

        cp $20                  ; '_' is the other one that fails
        ret nz                  ; return if not.

        ld a, $5F               ; substitute ASCII '_'
        ret                     ; return.


; ---

;; K-@-CHAR

K___CHAR:
        ld a, $40               ; substitute ASCII '@'
        ret                     ; return.



; ------------------------------------------------------------------------
;   The Spectrum Input character keys. One or two are abbreviated.
;   From $00 Flash 0 to $FF COPY. The routine above has decoded all these.

;  | 00 Fl0| 01 Fl1| 02 Br0| 03 Br1| 04 In0| 05 In1| 06 CAP| 07 EDT|
;  | 08 LFT| 09 RIG| 0A DWN| 0B UP | 0C DEL| 0D ENT| 0E SYM| 0F GRA|
;  | 10 Ik0| 11 Ik1| 12 Ik2| 13 Ik3| 14 Ik4| 15 Ik5| 16 Ik6| 17 Ik7|
;  | 18 Pa0| 19 Pa1| 1A Pa2| 1B Pa3| 1C Pa4| 1D Pa5| 1E Pa6| 1F Pa7|
;  | 20 SP | 21  ! | 22  " | 23  # | 24  $ | 25  % | 26  & | 27  ' |
;  | 28  ( | 29  ) | 2A  * | 2B  + | 2C  , | 2D  - | 2E  . | 2F  / |
;  | 30  0 | 31  1 | 32  2 | 33  3 | 34  4 | 35  5 | 36  6 | 37  7 |
;  | 38  8 | 39  9 | 3A  : | 3B  ; | 3C  < | 3D  = | 3E  > | 3F  ? |
;  | 40  @ | 41  A | 42  B | 43  C | 44  D | 45  E | 46  F | 47  G |
;  | 48  H | 49  I | 4A  J | 4B  K | 4C  L | 4D  M | 4E  N | 4F  O |
;  | 50  P | 51  Q | 52  R | 53  S | 54  T | 55  U | 56  V | 57  W |
;  | 58  X | 59  Y | 5A  Z | 5B  [ | 5C  \ | 5D  ] | 5E  ^ | 5F  _ |
;  | 60  £ | 61  a | 62  b | 63  c | 64  d | 65  e | 66  f | 67  g |
;  | 68  h | 69  i | 6A  j | 6B  k | 6C  l | 6D  m | 6E  n | 6F  o |
;  | 70  p | 71  q | 72  r | 73  s | 74  t | 75  u | 76  v | 77  w |
;  | 78  x | 79  y | 7A  z | 7B  { | 7C  | | 7D  } | 7E  ~ | 7F  © |
;  | 80 128| 81 129| 82 130| 83 131| 84 132| 85 133| 86 134| 87 135|
;  | 88 136| 89 137| 8A 138| 8B 139| 8C 140| 8D 141| 8E 142| 8F 143|
;  | 90 [A]| 91 [B]| 92 [C]| 93 [D]| 94 [E]| 95 [F]| 96 [G]| 97 [H]|
;  | 98 [I]| 99 [J]| 9A [K]| 9B [L]| 9C [M]| 9D [N]| 9E [O]| 9F [P]|
;  | A0 [Q]| A1 [R]| A2 [S]| A3 [T]| A4 [U]| A5 RND| A6 IK$| A7 PI |
;  | A8 FN | A9 PNT| AA SC$| AB ATT| AC AT | AD TAB| AE VL$| AF COD|
;  | B0 VAL| B1 LEN| B2 SIN| B3 COS| B4 TAN| B5 ASN| B6 ACS| B7 ATN|
;  | B8 LN | B9 EXP| BA INT| BB SQR| BC SGN| BD ABS| BE PEK| BF IN |
;  | C0 USR| C1 ST$| C2 CH$| C3 NOT| C4 BIN| C5 OR | C6 AND| C7 <= |
;  | C8 >= | C9 <> | CA LIN| CB THN| CC TO | CD STP| CE DEF| CF CAT|
;  | D0 FMT| D1 MOV| D2 ERS| D3 OPN| D4 CLO| D5 MRG| D6 VFY| D7 BEP|
;  | D8 CIR| D9 INK| DA PAP| DB FLA| DC BRI| DD INV| DE OVR| DF OUT|
;  | E0 LPR| E1 LLI| E2 STP| E3 REA| E4 DAT| E5 RES| E6 NEW| E7 BDR|
;  | E8 CON| E9 DIM| EA REM| EB FOR| EC GTO| ED GSB| EE INP| EF LOA|
;  | F0 LIS| F1 LET| F2 PAU| F3 NXT| F4 POK| F5 PRI| F6 PLO| F7 RUN|
;  | F8 SAV| F9 RAN| FA IF | FB CLS| FC DRW| FD CLR| FE RET| FF CPY|

;   Note that for simplicity, Sinclair have located all the control codes
;   below the space character.
;   ASCII DEL, $7F, has been made a copyright symbol.
;   Also $60, '`', not used in BASIC but used in other languages, has been
;   allocated the local currency symbol for the relevant country -
;    £  in most Spectrums.

; ------------------------------------------------------------------------


;**********************************
;** Part 3. LOUDSPEAKER ROUTINES **
;**********************************

; Documented by Alvin Albrecht.

; ------------------------------
; Routine to control loudspeaker
; ------------------------------
; Outputs a square wave of given duration and frequency
; to the loudspeaker.
;   Enter with: DE = #cycles - 1
;               HL = tone period as described next
;
; The tone period is measured in T states and consists of
; three parts: a coarse part (H register), a medium part



( run in 0.622 second using v1.01-cache-2.11-cpan-39bf76dae61 )