This commit is contained in:
Gabriel Tofvesson 2019-04-11 10:01:45 +02:00
parent ec2b562610
commit e4d45e470c

143
bsrt.uc
View File

@ -1,29 +1,81 @@
#define LIST_START 0xE0
#define HASH_MASK 0b1111000
#define HASH_MASK 0b1111
// PM initial state
#data 0x00 0x00
#data 0x08 0x08
#data 0x10 0x10
#data 0x18 0x18
#data 0x20 0x20
#data 0x28 0x28
#data 0x30 0x30
#data 0x38 0x38
#data 0x40 0x40
#data 0x48 0x48
#data 0x50 0x50
#data 0x58 0x58
#data 0x60 0x60
#data 0x68 0x68
#data 0x70 0x70
#data 0x78 0x78
#data 0x00 0x10
#data 0x01 0x1c
#data 0x02 0x28
#data 0x03 0x34
#data 0x04 0x40
#data 0x05 0x4c
#data 0x06 0x58
#data 0x07 0x64
#data 0x08 0x70
#data 0x09 0x7c
#data 0x0a 0x88
#data 0x0b 0x94
#data 0x0c 0xa0
#data 0x0d 0xac
#data 0x0e 0xb8
#data 0x0f 0xc4
#data 0x10 0x10
#data 0x1c 0x1c
#data 0x28 0x28
#data 0x34 0x34
#data 0x40 0x40
#data 0x4c 0x4c
#data 0x58 0x58
#data 0x64 0x64
#data 0x70 0x70
#data 0x7c 0x7c
#data 0x88 0x88
#data 0x94 0x94
#data 0xa0 0xa0
#data 0xac 0xac
#data 0xb8 0xb8
#data 0xc4 0xc4
// TODO: Include register initial-state compiler directive (saves, like, 2 cycles max)
// Set PC to LIST_START
const LIST_START
mov ar pc
bra @BUCKET_SORT_START
//
//
// //// ---- START OF DANK BUCKET SORT ---- ////
// $DANK_SORT_START
//
// // Get value at index of PC and index of PC + 1
// // (ar = gr0 = data[pc]; hr = gr3 = data[pc + 1])
// mov pc asr
// mov pm ar; mov pm gr; incpc
// mov pc asr
// mov pm hr
// reset ir
// mov pm gr
//
// bsl
// bsl
// bsl
// bsl
// bsl
// bsl
// bsl
// and HASH_MASK
//
//
//// ---- START OF NORMAL (TRASH) BUCKET SORT ---- ////
// Start of bucket sort loop
$BUCKET_SORT_START
@ -37,48 +89,34 @@ mov pm ar; mov pm gr
rol
rol
rol
rol
rol
rol
rol
rol; mov pc ir
and HASH_MASK
mov ar hr
// Dereference AR (HR) into AR (ar = buckets[ar])
mov hr asr
mov pm ar
// Increment element end-index stored in program memory
add 1
mov ar pm
// Push PC
mov pc ir
mov ar asr
mov pm hr
mov pm asr
mov pm pc; mov pm ar
incpc; sub hr
mov pc pm
// Prepare for insertion sort here:
// Compute length of bucket into LC
sub hr
mov ar lc
// Save start index to PC (for fast dereferencing)
mov hr pc; declc
mov hr pc
// Start of nested insertion sort
$INSERTION_SORT_LOOP_START
// If LC is set, we've reached the end of the elements
bls @INSERTION_SORT_END_BIGGEST
// Increment check index
incpc
bls @INSERTION_SORT_END_BIGGEST; incpc
// If(data[pc] < gr) continue;
mov pc asr
mov pm hr; mov pm ar
mov pm ar
sub gr
brn @INSERTION_SORT_LOOP_BOTTOM
adn gr; brn @INSERTION_SORT_LOOP_BOTTOM
// Insert and shift here
mov gr pm
@ -89,8 +127,8 @@ bls @INSERTION_SORT_END_NOT_BIGGEST
incpc
mov pc asr
mov pm gr
mov hr pm
mov gr hr; declc
mov ar pm
mov gr ar; declc
bra @INSERTION_SHIFT_LOOP
@ -100,7 +138,6 @@ declc; bra @INSERTION_SORT_LOOP_START
// Jump here if gr wasn't inserted into list
$INSERTION_SORT_END_BIGGEST
incpc
mov pc asr
mov gr pm
@ -120,8 +157,6 @@ $BUCKET_SORT_END
// PC is 0 here. Data is sorted smallest-to largest in memory: just spread out into buckets ;)
// Perform final merge here
call @BREAK
// Set PC to write index
const 0xE0
mov ar pc
@ -132,7 +167,7 @@ mov ar pc
// COPY NEGATIVE
// Initialize GR as bucket pointer and IR as element pointer
const 0x78
const 0xC4
mov ar gr
$LOOP_NEGATIVE
@ -161,14 +196,14 @@ bra @COPY_BUCKET_NEGATIVE
$NEXT_BUCKET_NEGATIVE
mov gr ar
sub 0x08 // AR is one above the length, so sub 8.
sub 0x0C // AR is one above the length, so sub 8.
mov ar gr
sub 0x38
sub 0x7C
bnz @LOOP_NEGATIVE
// COPY POSITIVE
const 0x00
const 0x10
mov ar gr
$LOOP_POSITIVE
@ -202,12 +237,10 @@ bra @COPY_BUCKET_POSITIVE
$NEXT_BUCKET_POSITIVE
mov gr ar
add 0x08 // AR is one above the length, so sub 8.
add 0x0C // AR is one above the length, so sub 8.
mov ar gr
sub 0x40
sub 0x88
bnz @LOOP_POSITIVE
call @BREAK
$BREAK
halt