diff --git a/blk/660 b/blk/660 index dfa31f7..4f80ade 100644 --- a/blk/660 +++ b/blk/660 @@ -1 +1 @@ -1 9 LOADR+ +1 10 LOADR+ diff --git a/blk/668 b/blk/668 index 77f1b51..0b21fe6 100644 --- a/blk/668 +++ b/blk/668 @@ -4,5 +4,4 @@ PC - DUP 0< IF 0x800 + _r7ffc 0x800 OR ELSE _r7ffc THEN ; : RJMP _raddr12 0xc000 OR ; : RCALL _raddr12 0xd000 OR ; -: RJMP, RJMP A,, ; -: RCALL, RCALL A,, ; +: RJMP, RJMP A,, ; : RCALL, RCALL A,, ; diff --git a/blk/669 b/blk/669 index 0900c36..acd3657 100644 --- a/blk/669 +++ b/blk/669 @@ -1,12 +1,12 @@ -( L1 LBL! .. L1 @ RJMP, ) -: LBL! ( l -- ) PC SWAP ! ; -( L1 FLBL, .. RJMPOP L1 FLBL! ) -: FLBL, ( l -- ) LBL! 0 A,, ; -: FLBL! ( l opw -- ) - ( warning: l is a PC offset, not a mem addr! ) - SWAP @ 2 * ORG @ + PC 1- H@ ( opw addr tgt hbkp ) - ROT HERE ! ( opw tgt hbkp ) SWAP ROT EXECUTE H@ ! ( hbkp ) - HERE ! ; -: FRJMP! ( l -- ) ['] RJMP FLBL! ; -: FRCALL! ( l -- ) ['] RCALL FLBL! ; +( a -- k7, absolute addr a, relative to PC in a k7 addr ) +: _r3fc DUP 0x3f > IF _oor THEN ; +: _raddr7 + PC - DUP 0< IF 0x40 + _r3fc 0x40 OR ELSE _r3fc THEN ; +: _brbx ( a b op -- a ) OR SWAP _raddr7 3 LSHIFT OR ; +: BRBC 0xf400 _brbx ; : BRBS 0xf000 _brbx ; : BRCC 0 BRBC ; +: BRCS 0 BRBS ; : BREQ 1 BRBS ; : BRNE 1 BRBC ; : BRGE 4 BRBC ; +: BRHC 5 BRBC ; : BRHS 5 BRBS ; : BRID 7 BRBC ; : BRIE 7 BRBS ; +: BRLO BRCS ; : BRLT 4 BRBS ; : BRMI 2 BRBS ; : BRPL 2 BRBC ; +: BRSH BRCC ; : BRTC 6 BRBC ; : BRTS 6 BRBS ; : BRVC 3 BRBC ; +: BRVS 3 BRBS ; diff --git a/blk/670 b/blk/670 new file mode 100644 index 0000000..741de67 --- /dev/null +++ b/blk/670 @@ -0,0 +1,11 @@ +( L1 LBL! .. L1 ' RJMP LBL, ) +: LBL! ( l -- ) PC SWAP ! ; +: LBL, ( l op -- ) SWAP @ 1- SWAP EXECUTE A,, ; +( L1 FLBL, .. L1 ' RJMP FLBL! ) +: FLBL, ( l -- ) LBL! 0 A,, ; +: FLBL! ( l opw -- ) + ( warning: l is a PC offset, not a mem addr! ) + SWAP @ 2 * ORG @ + PC 1- H@ ( opw addr tgt hbkp ) + ROT HERE ! ( opw tgt hbkp ) SWAP ROT EXECUTE H@ ! ( hbkp ) + HERE ! ; + diff --git a/recipes/sms/kbd/ps2ctl.fs b/recipes/sms/kbd/ps2ctl.fs index dd39d17..79b4332 100644 --- a/recipes/sms/kbd/ps2ctl.fs +++ b/recipes/sms/kbd/ps2ctl.fs @@ -40,6 +40,7 @@ Z: pointer to the next scan code to push to the 595 ) 0x35 CONSTANT MCUCR 0x33 CONSTANT TCCR0B 0x3b CONSTANT GIMSK +0x38 CONSTANT TIFR 0x16 CONSTANT PINB 0x17 CONSTANT DDRB 0x18 CONSTANT PORTB @@ -56,13 +57,13 @@ L2 FLBL, ( hdlINT0 ) ( Read DATA and set GPIOR0/0 if high. Then, set flag T. no SREG fiddling because no SREG-modifying instruction ) -L2 FRJMP! ( hdlINT0 ) +L2 ' RJMP FLBL! ( hdlINT0 ) PINB DATA SBIC, GPIOR0 0 SBI, SET, RETI, -L1 FRJMP! ( main ) +L1 ' RJMP FLBL! ( main ) 16 RAMEND 0xff AND LDI, SPL 16 OUT, 16 RAMEND 8 RSHIFT LDI, @@ -95,4 +96,21 @@ DDRB LR SBI, SEI, L1 LBL! ( loop ) +L2 FLBL, ( BRTS processbit. flag T set? we have a bit to + process ) +28 ( YL ) 30 ( ZL ) CP, ( if YL == ZL, buf is empty ) +L3 FLBL, ( BRNE sendTo164. YL != ZL? buf has data ) +( nothing to do. Before looping, let's check if our + communication timer overflowed. ) +16 TIFR IN, +16 1 ( TOV0 ) SBRC, +L4 FLBL, ( RJMP processbitReset, timer0 overflow? reset ) +( Nothing to do for real. ) +L1 ' RJMP LBL, ( loop ) +( Process the data bit received in INT0 handler. ) +L2 ' BRTS FLBL! ( processbit ) +19 GPIOR0 IN, ( backup GPIOR0 before we reset T ) +19 0x1 ANDI, ( only keep the first flag ) +GPIOR0 0 CBI, +CLT, ( ready to receive another bit )