; ---------------------------------------------------------------- input ; The keyboard read directly (interrupts stay off: the engine pops weights ; off the stack pointer), the beeper, and the dice. ; scan: A = the key held (0: none). The shifts are passed over, so CAPS ; SHIFT with 6 or 7 (the cursor keys) reads as 6 or 7. scan: push de ld hl,KEYTAB ld bc,$fefe .r: in a,(c) cpl and $1f ld e,5 .b: rra jr nc,.n ld d,a ld a,(hl) or a jr nz,.got ld a,d .n: inc hl dec e jr nz,.b rlc b jr c,.r xor a .got: pop de ret ; getk: getkey, the keys it will take (for KSET) in A. getk: ld (KSET),a ; getkey: A = the next key pressed (after the last is let go). The time ; waited stirs the dice. I is not returned: it shows or hides the pip ; counts. KWAIT is 1 while it waits; KSET is left at K_ANY. getkey: call scan or a jr nz,getkey ld b,20 call pause ld a,1 ld (KWAIT),a .w: ld hl,(SEED) inc hl ld a,h or l jr nz,.s inc hl .s: ld (SEED),hl call scan or a jr z,.w push af xor a ld (KWAIT),a call click pop af ; I, anywhere: the pip counts shown or hidden cp 'I' jr z,.pips push af xor a ; K_ANY ld (KSET),a pop af ret .pips: ld a,(PIPOFF) xor 1 ld (PIPOFF),a ld a,(UP) or a call nz,drawpips jr getkey KEYTAB: db 0,'Z','X','C','V' db 'A','S','D','F','G' db 'Q','W','E','R','T' db '1','2','3','4','5' db '0','9','8','7','6' db 'P','O','I','U','Y' db 13,'L','K','J','H' db ' ',0,'M','N','B' ; yesno: carry for Y, not for N; A = the keys' set (K_TAKE or K_AGAIN). yesno: push af call getk pop bc cp 'Y' scf ret z cp 'N' ld a,b jr nz,yesno or a ret ; pause: B fiftieths of a second, about. pause: push bc ld bc,2600 .l: dec bc ld a,b or c jr nz,.l pop bc djnz pause ret ; tone: B cycles of a square wave, C its half period. tone: ld a,$10 .l: out ($fe),a ld e,c .d: dec e jr nz,.d xor $10 djnz .l xor a out ($fe),a ret click: ld bc,$0660 jr tone ; tune: HL -> pairs of half period and cycles, ended by 0. tune: ld c,(hl) inc hl ld a,c or a ret z ld b,(hl) inc hl push hl call tone pop hl jr tune ; rand: A = a random byte (xorshift). rand: ld hl,(SEED) ld a,h rra ld a,l rra xor h ld h,a ld a,l rra ld a,h rra xor l ld l,a xor h ld h,a ld (SEED),hl ret ; rand6: A = a die, 1 to 6. rand6: call rand and 7 cp 6 jr nc,rand6 inc a ret ; roll: the dice rolled for SHOWN, rattling. roll: ld b,7 .r: push bc call rand6 ld (DIE1),a call rand6 ld (DIE2),a call drawdice call rand and $3f or $20 ld c,a ld b,4 call tone ld b,3 call pause pop bc djnz .r ; shown larger first, but the opening roll's (one die each) ld a,(SHOWN) cp 3 jr z,setdice ld a,(DIE1) ld b,a ld a,(DIE2) cp b jr c,setdice jr z,setdice ld (DIE1),a ld a,b ld (DIE2),a ; setdice: DHI >= DLO from DIE1, DIE2, larger first for the engine. setdice: ld a,(DIE1) ld b,a ld a,(DIE2) cp b jr c,.lo ld (DHI),a ld a,b ld (DLO),a ret .lo: ld (DLO),a ld a,b ld (DHI),a ret T_WIN: db $50,40,$40,50,$30,60,$28,120,0 T_LOSE: db $30,40,$40,40,$60,40,$80,80,0 T_DBL: db $30,30,$28,30,$30,30,$28,60,0