1
0
mirror of https://github.com/hsoft/collapseos.git synced 2024-11-02 04:20:55 +11:00

Compare commits

...

4 Commits

Author SHA1 Message Date
Virgil Dupras
aad6b5c2e5 avra: add global constants 2020-05-19 10:48:48 -04:00
Virgil Dupras
ac309bbd9e avra: rename AGAIN, to AGAIN?,
AGAIN, becomes a shortcut for "' RJMP AGAIN?,"
2020-05-19 10:36:07 -04:00
Virgil Dupras
7a41c5c6f9 avra: add IF, .. THEN,
I decided to keep SKIP, .. TO, (renamed from AT,) around and limit
IF, .. THEN, to the simple BRNE case.
2020-05-19 10:26:57 -04:00
Virgil Dupras
8bbd29d37d avra: add SKIP, .. AT,
Will change to IF, .. THEN, but I need a way to easily reverse a
BR op. But from this commit, the translation of sms/kbd/ps2ctl.asm
is complete! perfect binary match!
2020-05-19 10:19:37 -04:00
4 changed files with 113 additions and 77 deletions

View File

@ -1 +1 @@
1 11 LOADR+ 1 12 LOADR+

18
blk/671
View File

@ -1,13 +1,15 @@
( L1 LBL! .. L1 ' RJMP LBL, ) ( L1 LBL! .. L1 ' RJMP LBL, )
: LBL! ( l -- ) PC SWAP ! ; : LBL! ( l -- ) PC SWAP ! ;
: LBL, ( l op -- ) SWAP @ 1- SWAP EXECUTE A,, ; : LBL, ( l op -- ) SWAP @ 1- SWAP EXECUTE A,, ;
( L1 FLBL, .. L1 ' RJMP FLBL! ) : SKIP, PC 0 A,, ;
: FLBL, ( l -- ) LBL! 0 A,, ; : TO, ( opw pc )
: FLBL! ( l opw -- ) ( warning: pc is a PC offset, not a mem addr! )
( warning: l is a PC offset, not a mem addr! ) 2 * ORG @ + PC 1- H@ ( opw addr tgt hbkp )
SWAP @ 2 * ORG @ + PC 1- H@ ( opw addr tgt hbkp )
ROT HERE ! ( opw tgt hbkp ) SWAP ROT EXECUTE H@ ! ( hbkp ) ROT HERE ! ( opw tgt hbkp ) SWAP ROT EXECUTE H@ ! ( hbkp )
HERE ! ; HERE ! ;
: BEGIN, PC ; ( L1 FLBL, .. L1 ' RJMP FLBL! )
: AGAIN, ( op ) SWAP 1- SWAP EXECUTE A,, ; : FLBL, ( l -- ) LBL! 0 A,, ;
: FLBL! ( l opw -- ) SWAP @ TO, ;
: BEGIN, PC ; : AGAIN?, ( op ) SWAP 1- SWAP EXECUTE A,, ;
: AGAIN, ['] RJMP AGAIN?, ;
: IF, ['] BREQ SKIP, ; : THEN, TO, ;

8
blk/672 Normal file
View File

@ -0,0 +1,8 @@
( Constant common to all AVR models )
: R0 0 ; : R1 1 ; : R2 2 ; : R3 3 ; : R4 4 ; : R5 5 ; : R6 6 ;
: R7 7 ; : R8 8 ; : R9 9 ; : R10 10 ; : R11 11 ; : R12 12 ;
: R13 13 ; : R14 14 ; : R15 15 ; : R16 16 ; : R17 17 ;
: R18 18 ; : R19 19 ; : R20 20 ; : R21 21 ; : R22 22 ;
: R24 24 ; : R25 25 ; : R26 26 ; : R27 27 ; : R28 28 ;
: R29 29 ; : R30 30 ; : R31 31 ; : XL R26 ; : XH R27 ;
: YL R28 ; : YH R29 ; : ZL R30 ; : ZH R31 ;

View File

@ -67,31 +67,31 @@ SET,
RETI, RETI,
L1 ' RJMP FLBL! ( main ) L1 ' RJMP FLBL! ( main )
16 RAMEND 0xff AND LDI, R16 RAMEND 0xff AND LDI,
SPL 16 OUT, SPL R16 OUT,
16 RAMEND 8 RSHIFT LDI, R16 RAMEND 8 RSHIFT LDI,
SPH 16 OUT, SPH R16 OUT,
( init variables ) ( init variables )
18 CLR, R18 CLR,
GPIOR0 18 OUT, GPIOR0 R18 OUT,
( Setup int0 ( Setup int0
INT0, falling edge ) INT0, falling edge )
16 0x02 ( ISC01 ) LDI, R16 0x02 ( ISC01 ) LDI,
MCUCR 16 OUT, MCUCR R16 OUT,
( Enable INT0 ) ( Enable INT0 )
16 0x40 ( INT0 ) LDI, R16 0x40 ( INT0 ) LDI,
GIMSK 16 OUT, GIMSK R16 OUT,
( Setup buffer ) ( Setup buffer )
29 ( YH ) CLR, YH CLR,
28 ( YL ) SRAM_START 0xff AND LDI, YL SRAM_START 0xff AND LDI,
31 ( ZH ) CLR, ZH CLR,
30 ( ZL ) SRAM_START 0xff AND LDI, ZL SRAM_START 0xff AND LDI,
( Setup timer. We use the timer to clear up "processbit" ( Setup timer. We use the timer to clear up "processbit"
registers after 100us without a clock. This allows us to start registers after 100us without a clock. This allows us to start
the next frame in a fresh state. at 1MHZ, no prescaling is the next frame in a fresh state. at 1MHZ, no prescaling is
necessary. Each TCNT0 tick is already 1us long. ) necessary. Each TCNT0 tick is already 1us long. )
16 0x01 ( CS00 ) LDI, ( no prescaler ) R16 0x01 ( CS00 ) LDI, ( no prescaler )
TCCR0B 16 OUT, TCCR0B R16 OUT,
( init DDRB ) ( init DDRB )
DDRB CP SBI, DDRB CP SBI,
PORTB LR CBI, PORTB LR CBI,
@ -101,20 +101,20 @@ SEI,
L1 LBL! ( loop ) L1 LBL! ( loop )
L2 FLBL, ( BRTS processbit. flag T set? we have a bit to L2 FLBL, ( BRTS processbit. flag T set? we have a bit to
process ) process )
28 ( YL ) 30 ( ZL ) CP, ( if YL == ZL, buf is empty ) YL ZL CP, ( if YL == ZL, buf is empty )
L3 FLBL, ( BRNE sendTo164. YL != ZL? buf has data ) L3 FLBL, ( BRNE sendTo164. YL != ZL? buf has data )
( nothing to do. Before looping, let's check if our ( nothing to do. Before looping, let's check if our
communication timer overflowed. ) communication timer overflowed. )
16 TIFR IN, R16 TIFR IN,
16 1 ( TOV0 ) SBRC, R16 1 ( TOV0 ) SBRC,
L4 FLBL, ( RJMP processbitReset, timer0 overflow? reset ) L4 FLBL, ( RJMP processbitReset, timer0 overflow? reset )
( Nothing to do for real. ) ( Nothing to do for real. )
L1 ' RJMP LBL, ( loop ) L1 ' RJMP LBL, ( loop )
( Process the data bit received in INT0 handler. ) ( Process the data bit received in INT0 handler. )
L2 ' BRTS FLBL! ( processbit ) L2 ' BRTS FLBL! ( processbit )
19 GPIOR0 IN, ( backup GPIOR0 before we reset T ) R19 GPIOR0 IN, ( backup GPIOR0 before we reset T )
19 0x1 ANDI, ( only keep the first flag ) R19 0x1 ANDI, ( only keep the first flag )
GPIOR0 0 CBI, GPIOR0 0 CBI,
CLT, ( ready to receive another bit ) CLT, ( ready to receive another bit )
@ -122,31 +122,31 @@ CLT, ( ready to receive another bit )
L2 FLBL, ( RCALL resetTimer ) L2 FLBL, ( RCALL resetTimer )
( Which step are we at? ) ( Which step are we at? )
18 TST, R18 TST,
L5 FLBL, ( BREQ processbits0 ) L5 FLBL, ( BREQ processbits0 )
18 1 CPI, R18 1 CPI,
L6 FLBL, ( BREQ processbits1 ) L6 FLBL, ( BREQ processbits1 )
18 2 CPI, R18 2 CPI,
L7 FLBL, ( BREQ processbits2 ) L7 FLBL, ( BREQ processbits2 )
( step 3: stop bit ) ( step 3: stop bit )
18 CLR, ( happens in all cases ) R18 CLR, ( happens in all cases )
( DATA has to be set ) ( DATA has to be set )
19 TST, ( was DATA set? ) R19 TST, ( was DATA set? )
L1 ' BREQ LBL, ( loop, not set? error, don't push to buf ) L1 ' BREQ LBL, ( loop, not set? error, don't push to buf )
( push r17 to the buffer ) ( push r17 to the buffer )
Y+ 17 ST, Y+ R17 ST,
L8 FLBL, ( RCALL checkBoundsY ) L8 FLBL, ( RCALL checkBoundsY )
L1 ' RJMP LBL, L1 ' RJMP LBL,
L5 ' BREQ FLBL! ( processbits0 ) L5 ' BREQ FLBL! ( processbits0 )
( step 0 - start bit ) ( step 0 - start bit )
( DATA has to be cleared ) ( DATA has to be cleared )
19 TST, ( was DATA set? ) R19 TST, ( was DATA set? )
L1 ' BRNE LBL, ( loop. set? error. no need to do anything. keep L1 ' BRNE LBL, ( loop. set? error. no need to do anything. keep
r18 as-is. ) r18 as-is. )
( DATA is cleared. prepare r17 and r18 for step 1 ) ( DATA is cleared. prepare r17 and r18 for step 1 )
18 INC, R18 INC,
17 0x80 LDI, R17 0x80 LDI,
L1 ' RJMP LBL, ( loop ) L1 ' RJMP LBL, ( loop )
L6 ' BREQ FLBL! ( processbits1 ) L6 ' BREQ FLBL! ( processbits1 )
@ -154,35 +154,35 @@ L6 ' BREQ FLBL! ( processbits1 )
We're about to rotate the carry flag into r17. Let's set it We're about to rotate the carry flag into r17. Let's set it
first depending on whether DATA is set. ) first depending on whether DATA is set. )
CLC, CLC,
19 0 SBRC, ( skip if DATA is cleared ) R19 0 SBRC, ( skip if DATA is cleared )
SEC, SEC,
( Carry flag is set ) ( Carry flag is set )
17 ROR, R17 ROR,
( Good. now, are we finished rotating? If carry flag is set, ( Good. now, are we finished rotating? If carry flag is set,
it means that we've rotated in 8 bits. ) it means that we've rotated in 8 bits. )
L1 ' BRCC LBL, ( loop ) L1 ' BRCC LBL, ( loop )
( We're finished, go to step 2 ) ( We're finished, go to step 2 )
18 INC, R18 INC,
L1 ' RJMP LBL, ( loop ) L1 ' RJMP LBL, ( loop )
L7 ' BREQ FLBL! ( processbits2 ) L7 ' BREQ FLBL! ( processbits2 )
( step 2 - parity bit ) ( step 2 - parity bit )
1 19 MOV, R1 R19 MOV,
19 17 MOV, R19 R17 MOV,
L5 FLBL, ( RCALL checkParity ) L5 FLBL, ( RCALL checkParity )
1 16 CP, R1 R16 CP,
L6 FLBL, ( BRNE processBitError, r1 != r16? wrong parity ) L6 FLBL, ( BRNE processBitError, r1 != r16? wrong parity )
18 INC, R18 INC,
L1 ' RJMP LBL, ( loop ) L1 ' RJMP LBL, ( loop )
L6 ' BRNE FLBL! ( processBitError ) L6 ' BRNE FLBL! ( processBitError )
18 CLR, R18 CLR,
19 0xfe LDI, R19 0xfe LDI,
L6 FLBL, ( RCALL sendToPS2 ) L6 FLBL, ( RCALL sendToPS2 )
L1 ' RJMP LBL, ( loop ) L1 ' RJMP LBL, ( loop )
L4 ' RJMP FLBL! ( processbitReset ) L4 ' RJMP FLBL! ( processbitReset )
18 CLR, R18 CLR,
L4 FLBL, ( RCALL resetTimer ) L4 FLBL, ( RCALL resetTimer )
L1 ' RJMP LBL, ( loop ) L1 ' RJMP LBL, ( loop )
@ -197,20 +197,20 @@ L1 ' RJMP LBL, ( loop, even if we have something in the
and processing it might mess things up. ) and processing it might mess things up. )
CLI, CLI,
DDRB DATA SBI, DDRB DATA SBI,
20 Z+ LD, R20 Z+ LD,
L3 FLBL, ( RCALL checkBoundsZ ) L3 FLBL, ( RCALL checkBoundsZ )
16 8 LDI, R16 R8 LDI,
BEGIN, BEGIN,
PORTB DATA CBI, PORTB DATA CBI,
20 7 SBRC, ( if leftmost bit isn't cleared, set DATA high ) R20 7 SBRC, ( if leftmost bit isn't cleared, set DATA high )
PORTB DATA SBI, PORTB DATA SBI,
( toggle CP ) ( toggle CP )
PORTB CP CBI, PORTB CP CBI,
20 LSL, R20 LSL,
PORTB CP SBI, PORTB CP SBI,
16 DEC, R16 DEC,
' BRNE AGAIN, ( not zero yet? loop ) ' BRNE AGAIN?, ( not zero yet? loop )
( release PS/2 ) ( release PS/2 )
DDRB DATA CBI, DDRB DATA CBI,
SEI, SEI,
@ -220,10 +220,10 @@ PORTB LR CBI,
L1 ' RJMP LBL, ( loop ) L1 ' RJMP LBL, ( loop )
L2 ' RCALL FLBL! L4 ' RCALL FLBL! L2 LBL! ( resetTimer ) L2 ' RCALL FLBL! L4 ' RCALL FLBL! L2 LBL! ( resetTimer )
16 TIMER_INITVAL LDI, R16 TIMER_INITVAL LDI,
TCNT0 16 OUT, TCNT0 R16 OUT,
16 0x02 ( TOV0 ) LDI, R16 0x02 ( TOV0 ) LDI,
TIFR 16 OUT, TIFR R16 OUT,
RET, RET,
L6 ' RCALL FLBL! ( sendToPS2 ) L6 ' RCALL FLBL! ( sendToPS2 )
@ -237,9 +237,9 @@ L2 ' RCALL LBL, ( resetTimer )
( Wait until the timer overflows ) ( Wait until the timer overflows )
BEGIN, BEGIN,
16 TIFR IN, R16 TIFR IN,
16 1 ( TOV0 ) SBRS, R16 1 ( TOV0 ) SBRS,
' RJMP AGAIN, AGAIN,
( Good, 100us passed. ) ( Good, 100us passed. )
( Pull Data low, that's our start bit. ) ( Pull Data low, that's our start bit. )
PORTB DATA CBI, PORTB DATA CBI,
@ -251,42 +251,42 @@ DDRB DATA SBI,
DDRB CLK CBI, ( Should be starting high now. ) DDRB CLK CBI, ( Should be starting high now. )
( We will do the next loop 8 times ) ( We will do the next loop 8 times )
16 8 LDI, R16 8 LDI,
( Let's remember initial r19 for parity ) ( Let's remember initial r19 for parity )
1 19 MOV, R1 R19 MOV,
BEGIN, BEGIN,
( Wait for CLK to go low ) ( Wait for CLK to go low )
BEGIN, PINB CLK SBIC, ' RJMP AGAIN, BEGIN, PINB CLK SBIC, AGAIN,
( set up DATA ) ( set up DATA )
PORTB DATA CBI, PORTB DATA CBI,
19 0 SBRC, ( skip if LSB is clear ) R19 0 SBRC, ( skip if LSB is clear )
PORTB DATA SBI, PORTB DATA SBI,
19 LSR, R19 LSR,
( Wait for CLK to go high ) ( Wait for CLK to go high )
BEGIN, PINB CLK SBIS, ' RJMP AGAIN, BEGIN, PINB CLK SBIS, AGAIN,
16 DEC, 16 DEC,
' BRNE AGAIN, ( not zero? loop ) ' BRNE AGAIN?, ( not zero? loop )
( Data was sent, CLK is high. Let's send parity ) ( Data was sent, CLK is high. Let's send parity )
19 1 MOV, ( recall saved value ) R19 R1 MOV, ( recall saved value )
L6 FLBL, ( RCALL checkParity ) L6 FLBL, ( RCALL checkParity )
( Wait for CLK to go low ) ( Wait for CLK to go low )
BEGIN, PINB CLK SBIC, ' RJMP AGAIN, BEGIN, PINB CLK SBIC, AGAIN,
( set parity bit ) ( set parity bit )
PORTB DATA CBI, PORTB DATA CBI,
16 0 SBRC, ( parity bit in r16 ) R16 0 SBRC, ( parity bit in r16 )
PORTB DATA SBI, PORTB DATA SBI,
( Wait for CLK to go high ) ( Wait for CLK to go high )
BEGIN, PINB CLK SBIS, ' RJMP AGAIN, BEGIN, PINB CLK SBIS, AGAIN,
( Wait for CLK to go low ) ( Wait for CLK to go low )
BEGIN, PINB CLK SBIC, ' RJMP AGAIN, BEGIN, PINB CLK SBIC, AGAIN,
( We can now release the DATA line ) ( We can now release the DATA line )
DDRB DATA CBI, DDRB DATA CBI,
( Wait for DATA to go low, that's our ACK ) ( Wait for DATA to go low, that's our ACK )
BEGIN, PINB DATA SBIC, ' RJMP AGAIN, BEGIN, PINB DATA SBIC, AGAIN,
( Wait for CLK to go low ) ( Wait for CLK to go low )
BEGIN, PINB CLK SBIC, ' RJMP AGAIN, BEGIN, PINB CLK SBIC, AGAIN,
( We're finished! Enable INT0, reset timer, everything back to ( We're finished! Enable INT0, reset timer, everything back to
normal! ) normal! )
L2 ' RCALL LBL, ( resetTimer ) L2 ' RCALL LBL, ( resetTimer )
@ -296,4 +296,30 @@ RET,
L8 ' RCALL FLBL! ( checkBoundsY ) L8 ' RCALL FLBL! ( checkBoundsY )
( Check that Y is within bounds, reset to SRAM_START if not. ) ( Check that Y is within bounds, reset to SRAM_START if not. )
28 ( YL ) TST, YL TST,
IF, RET, ( not zero, nothing to do ) THEN,
( YL is zero. Reset Z )
YH CLR,
YL SRAM_START 0xff AND LDI,
RET,
L3 ' RCALL FLBL! ( checkBoundsZ )
( Check that Z is within bounds, reset to SRAM_START if not. )
ZL TST,
IF, RET, ( not zero, nothing to do ) THEN,
( ZL is zero. Reset Z )
ZH CLR,
ZL SRAM_START 0xff AND LDI,
RET,
L5 ' RCALL FLBL! L6 ' RCALL FLBL! ( checkParity )
( Counts the number of 1s in r19 and set r16 to 1 if there's an
even number of 1s, 0 if they're odd. )
R16 1 LDI,
BEGIN,
R19 LSR,
' BRCC SKIP, R16 INC, ( carry set? we had a 1 ) TO,
R19 TST, ( is r19 zero yet? )
' BRNE AGAIN?, ( no? loop )
R16 0x1 ANDI,
RET,