Browse code

More progress in assembler

Andrew Alderwick authored on 11/04/2021 22:45:31
Showing 3 changed files
... ...
@@ -155,7 +155,7 @@ type_byte = function(size, has_subtree)
155 155
   if '1' == _exp_0 then
156 156
     n2 = '1'
157 157
   elseif '2' == _exp_0 then
158
-    n2 = '3'
158
+    n2 = '2'
159 159
   else
160 160
     n2 = '0'
161 161
   end
... ...
@@ -236,6 +236,23 @@ do
236 236
   dag['('] = nil
237 237
   add_globals(root, dag, label_name, label_value, '', '   ')
238 238
 end
239
+do
240
+  local root, dag = build_dag_from_chars(']\0', '(')
241
+  dump(io.stdout, root, dag)
242
+  local label_name
243
+  label_name = function(s)
244
+    if s == '(' then
245
+      return 'normal-(  '
246
+    end
247
+    return ('data-%-4s'):format(convert[s])
248
+  end
249
+  local label_value
250
+  label_value = function(k)
251
+    return ('[ %02x ]'):format(k:byte())
252
+  end
253
+  dag['('] = nil
254
+  add_globals(root, dag, label_name, label_value, '', '   ')
255
+end
239 256
 local devices = { }
240 257
 local add_device
241 258
 add_device = function(name, fields)
... ...
@@ -87,7 +87,7 @@ type_byte = (size, has_subtree) ->
87 87
 		when '1'
88 88
 			'1'
89 89
 		when '2'
90
-			'3'
90
+			'2'
91 91
 		else
92 92
 			'0'
93 93
 	n1 .. n2
... ...
@@ -139,6 +139,17 @@ do
139 139
 	dag['('] = nil
140 140
 	add_globals root, dag, label_name, label_value, '', '   '
141 141
 
142
+do
143
+	root, dag = build_dag_from_chars ']\0', '('
144
+	dump io.stdout, root, dag
145
+	label_name = (s) ->
146
+		if s == '('
147
+			return 'normal-(  '
148
+		'data-%-4s'\format convert[s]
149
+	label_value = (k) -> '[ %02x ]'\format k\byte!
150
+	dag['('] = nil
151
+	add_globals root, dag, label_name, label_value, '', '   '
152
+
142 153
 devices = {}
143 154
 
144 155
 add_device = (name, fields) ->
... ...
@@ -1,5 +1,5 @@
1 1
 ;tree { search-key 2 max-key-len 1 }
2
-;assembler { pass 1 state 1 token 2 scope-len 1 scope 80 heap 2 addr 2 subtree 2 }
2
+;assembler { pass 1 state 1 token 2 scope-len 1 scope 80 heap 2 addr 2 subtree 2 vartmp 2 }
3 3
 
4 4
 %HCF { #0000 DIV }
5 5
 %SHORT_FLAG { #20 }
... ...
@@ -31,10 +31,10 @@
31 31
 	~assembler.state
32 32
 	HCF
33 33
 
34
-	$token [ 25 xyllo 00 ]
34
+	$token [ 3b Hello 00 ]
35 35
 	$token2 [ 7b 00 ]
36
-	$token3 [ there 00 ]
37
-	$token4 [ 00 ]
36
+	$token3 [ testing 00 ]
37
+	$token4 [ 30 00 ]
38 38
 	$token5 [ 7d 00 ]
39 39
 
40 40
 @assemble-token ( string-ptr* -- )
... ...
@@ -222,9 +222,8 @@
222 222
 
223 223
 	$zero-pointers [ 0000 0000 ]
224 224
 
225
-@add-label ( string-ptr* label-flags -- )
226
-	ROT ROT
227
-	DUP2 ,label-tree SWP2 #ff ,traverse-tree JSR2
225
+@add-label ( label-flags string-ptr* tree-ptr* -- )
226
+	OVR2 #ff ,traverse-tree JSR2
228 227
 	^$new-label JNZ
229 228
 
230 229
 	( label already exists, check the flags and addr value )
... ...
@@ -358,21 +357,21 @@
358 357
 
359 358
 @state-machine-pointers
360 359
 ( normal mode 00 )
361
-.normal-root   .nyi
360
+.normal-root   .normal-main
362 361
 ( macro definition 01 )
363 362
 .macro-root    .macro-main
364 363
 ( macro definition, contents ignored 02 )
365 364
 .macro-root    .ignore
366
-( variable definition, expect field size 08 )
365
+( variable definition, expect field size 04 )
367 366
 .variable-nul  .variable-size
368
-( variable definition, expect field name 04 )
367
+( variable definition, expect field name 08 )
369 368
 .variable-root .variable-name
370 369
 ( reserved for future use 10 )
371
-.normal-(      .ignore
370
+[ 0000 ]       .ignore
372 371
 ( literal data 20 )
373
-[ 0000 ]       .nyi
372
+.normal-]      .data-main
374 373
 ( reserved for future use 40 )
375
-.normal-(      .ignore
374
+[ 0000 ]       .ignore
376 375
 ( comment 80 )
377 376
 .normal-)      .ignore
378 377
 
... ...
@@ -395,23 +394,11 @@
395 394
 
396 395
 @normal-(   [ 0000 ]    .normal-)   [ 28 ]
397 396
 	~assembler.state #80 ORA =assembler.state
398
-JMP2r
397
+	JMP2r
399 398
 
400 399
 @normal-)   [ 0000 ]    [ 0000 ]    [ 29 ]
401 400
 	~assembler.state #7f AND =assembler.state
402
-JMP2r
403
-
404
-(
405
-	Left and right square brackets start and end literal data sections.
406
-)
407
-
408
-@normal-[   .normal-@   .normal-]   [ 5b ]
409
-	~assembler.state #20 ORA =assembler.state
410
-JMP2r
411
-
412
-@normal-]   [ 0000 ]    [ 0000 ]    [ 5d ]
413
-	~assembler.state #df AND =assembler.state
414
-JMP2r
401
+	JMP2r
415 402
 
416 403
 (
417 404
 	Ampersands introduce global labels, and define the scope for any
... ...
@@ -419,11 +406,10 @@ JMP2r
419 406
 )
420 407
 
421 408
 @normal-@   [ 0000 ]    [ 0000 ]    [ 40 ]
422
-	~assembler.token
423
-	DUP2 #00 ,add-label JSR2
409
+	#00 ~assembler.token ,label-tree ,add-label JSR2
424 410
 
425 411
 	$scope
426
-	,assembler.scope ,strcpy JSR2
412
+	~assembler.token ,assembler.scope ,strcpy JSR2
427 413
 	DUP2 ,assembler.scope SUB2 =assembler.scope-len POP
428 414
 	#0001 SUB2 #2d SWP POK POP
429 415
 	JMP2r
... ...
@@ -437,7 +423,7 @@ JMP2r
437 423
 	,assembler.scope ~assembler.scope-len ADD
438 424
 	,strcpy JSR2 POP2
439 425
 
440
-	,assembler.scope #00 ,add-label JMP2 ( tail call )
426
+	#00 ,assembler.scope ,label-tree ,add-label JMP2 ( tail call )
441 427
 
442 428
 (
443 429
 	Hash signs followed by two or four hex digits write a literal.
... ...
@@ -455,12 +441,49 @@ JMP2r
455 441
 	,opcodes-op-lit ,opcodes-start SUB2 #07 DIV
456 442
 	ADD ADD ,write-byte JSR2
457 443
 
444
+	$value
458 445
 	#02 EQU ^$short JNZ
459 446
 	,write-byte JMP2 ( tail call )
460 447
 
461 448
 	$short
462 449
 	,write-short JMP2 ( tail call )
463 450
 
451
+(
452
+	Left and right square brackets start and end literal data sections.
453
+)
454
+
455
+@normal-[   .normal-@   .normal-]   [ 5b ]
456
+	~assembler.state #20 ORA =assembler.state
457
+	JMP2r
458
+
459
+@normal-]   [ 0000 ]    [ 0000 ]    [ 5d ]
460
+	( this is spurious, but ignore it anyway )
461
+	JMP2r
462
+
463
+@data-]    .normal-(   [ 0000 ]    [ 5d ]
464
+	~assembler.state #df AND =assembler.state
465
+	JMP2r
466
+
467
+@data-root
468
+@data-nul  [ 0000 ]    .data-]    [ 00 ]
469
+	JMP2r
470
+
471
+@data-main
472
+	~assembler.token ,parse-hex-string JSR2
473
+	DUP ^normal-#-value JNZ
474
+	POP
475
+
476
+	~assembler.token
477
+	$loop
478
+	DUP2 PEK2
479
+	DUP ^$keep-going JNZ
480
+	POP POP2 JMP2r
481
+
482
+	$keep-going
483
+	,write-byte JSR2
484
+	#0001 ADD2
485
+	^$loop JMP
486
+
464 487
 (
465 488
 	A pipe moves the current address to the hex value given.
466 489
 )
... ...
@@ -531,7 +554,7 @@ JMP2r
531 554
 	LIT2r .opcodes-op-str LIT2r .opcodes-op-pok
532 555
 	$main
533 556
 	~assembler.token ,lookup-label JSR2
534
-	DUP #01 AND ^$valid JNZ
557
+	DUP #03 AND ^$valid JNZ
535 558
 
536 559
 	( FIXME complain about helper not being usable )
537 560
 	POP2 JMP2r
... ...
@@ -563,7 +586,7 @@ JMP2r
563 586
 	pointed to in the variable name's binary data.
564 587
 )
565 588
 @normal-;   [ 0000 ]    [ 0000 ]    [ 3b ]
566
-	~assembler.token #80 ,add-label JSR2
589
+	#80 ~assembler.token ,label-tree ,add-label JSR2
567 590
 	~assembler.heap #0000 OVR2 STR2
568 591
 	DUP2 =assembler.subtree
569 592
 	#0002 ADD2 =assembler.heap
... ...
@@ -583,8 +606,29 @@ JMP2r
583 606
 	JMP2r
584 607
 
585 608
 @variable-name
609
+	#00 ~assembler.token ~assembler.subtree ,add-label JSR2
610
+	~assembler.heap #0003 SUB2 =assembler.vartmp
611
+	~assembler.state #f7 AND =assembler.state
612
+	JMP2r
613
+
586 614
 @variable-size
587
-	,nyi JMP2r
615
+	~assembler.token ,parse-hex-length JSR2
616
+	^$valid JNZ
617
+	( FIXME complain about invalid size )
618
+	JMP2r
619
+
620
+	$valid
621
+	DUP #02 GTH ^$end JNZ
622
+	DUP ~assembler.vartmp POK2
623
+	^$end JMP
624
+
625
+	$loop
626
+	#00 ,write-byte JSR2
627
+	#01 SUB
628
+	$end
629
+	DUP ^$loop JNZ
630
+	POP
631
+	JMP2r
588 632
 
589 633
 (
590 634
 	Percent signs introduce macros. The macro name is added to the macro tree,
... ...
@@ -642,7 +686,7 @@ JMP2r
642 686
 @ignore
643 687
 	JMP2r
644 688
 
645
-@nyi
689
+@normal-main
646 690
 	,$string =Console.string
647 691
 	HCF
648 692
 
... ...
@@ -663,8 +707,10 @@ JMP2r
663 707
 
664 708
 	The flags byte is divided up into bits:
665 709
 
666
-	bit 0: 01 means load or store helpers can be used,
667
-	bit 1: 02 means the helpers use STR/LDR, 00 means they use POK/PEK;
710
+	bit 0-1: 00 means store / load helpers cannot be used,
711
+	         01 means the helpers use POK / PEK,
712
+	         02 means the helpers use STR / LDR,
713
+	         03 is invalid;
668 714
 	bits 2-6 are reserved; and
669 715
 	bit 7: 80 means there is a subtree.
670 716
 
... ...
@@ -672,69 +718,69 @@ JMP2r
672 718
 )
673 719
 
674 720
 @l-Audio           [ 0000 ]          [ 0000 ]         [ Audio 00 ]      [ 80 ] .Audio .l-Audio-root
675
-@l-Audio-delay     [ 0000 ]          [ 0000 ]         [ delay 00 ]      [ 03 ] .Audio.delay
676
-@l-Audio-envelope .l-Audio-delay    .l-Audio-finish   [ envelope 00 ]   [ 03 ] .Audio.envelope
721
+@l-Audio-delay     [ 0000 ]          [ 0000 ]         [ delay 00 ]      [ 02 ] .Audio.delay
722
+@l-Audio-envelope .l-Audio-delay    .l-Audio-finish   [ envelope 00 ]   [ 02 ] .Audio.envelope
677 723
 @l-Audio-finish    [ 0000 ]          [ 0000 ]         [ finish 00 ]     [ 01 ] .Audio.finish
724
+@l-Audio-root
678 725
 @l-Audio-pitch    .l-Audio-envelope .l-Audio-value    [ pitch 00 ]      [ 01 ] .Audio.pitch
679 726
 @l-Audio-play      [ 0000 ]          [ 0000 ]         [ play 00 ]       [ 01 ] .Audio.play
680
-@l-Audio-root
681
-@l-Audio-value    .l-Audio-play     .l-Audio-volume   [ value 00 ]      [ 03 ] .Audio.value
727
+@l-Audio-value    .l-Audio-play     .l-Audio-volume   [ value 00 ]      [ 02 ] .Audio.value
682 728
 @l-Audio-volume    [ 0000 ]         .l-Audio-wave     [ volume 00 ]     [ 01 ] .Audio.volume
683
-@l-Audio-wave      [ 0000 ]          [ 0000 ]         [ wave 00 ]       [ 03 ] .Audio.wave
729
+@l-Audio-wave      [ 0000 ]          [ 0000 ]         [ wave 00 ]       [ 02 ] .Audio.wave
684 730
 @l-Console        .l-Audio          .l-Controller     [ Console 00 ]    [ 80 ] .Console .l-Console-root
685 731
 @l-Console-byte    [ 0000 ]         .l-Console-char   [ byte 00 ]       [ 01 ] .Console.byte
686 732
 @l-Console-char    [ 0000 ]          [ 0000 ]         [ char 00 ]       [ 01 ] .Console.char
687 733
 @l-Console-root
688
-@l-Console-short  .l-Console-byte   .l-Console-string [ short 00 ]      [ 03 ] .Console.short
689
-@l-Console-string  [ 0000 ]         .l-Console-vector [ string 00 ]     [ 03 ] .Console.string
690
-@l-Console-vector  [ 0000 ]          [ 0000 ]         [ vector 00 ]     [ 03 ] .Console.vector
734
+@l-Console-short  .l-Console-byte   .l-Console-string [ short 00 ]      [ 02 ] .Console.short
735
+@l-Console-string  [ 0000 ]         .l-Console-vector [ string 00 ]     [ 02 ] .Console.string
736
+@l-Console-vector  [ 0000 ]          [ 0000 ]         [ vector 00 ]     [ 02 ] .Console.vector
691 737
 @l-Controller      [ 0000 ]          [ 0000 ]         [ Controller 00 ] [ 80 ] .Controller .l-Controller-root
692 738
 @l-Controller-button  [ 0000 ]          [ 0000 ]         [ button 00 ]     [ 01 ] .Controller.button
693
-@l-Controller-key .l-Controller-button .l-Controller-vector [ key 00 ]        [ 01 ] .Controller.key
694 739
 @l-Controller-root
695
-@l-Controller-vector  [ 0000 ]          [ 0000 ]         [ vector 00 ]     [ 03 ] .Controller.vector
740
+@l-Controller-key .l-Controller-button .l-Controller-vector [ key 00 ]        [ 01 ] .Controller.key
741
+@l-Controller-vector  [ 0000 ]          [ 0000 ]         [ vector 00 ]     [ 02 ] .Controller.vector
742
+@l-root
696 743
 @l-DateTime       .l-Console        .l-Mouse          [ DateTime 00 ]   [ 80 ] .DateTime .l-DateTime-root
697 744
 @l-DateTime-day    [ 0000 ]          [ 0000 ]         [ day 00 ]        [ 01 ] .DateTime.day
698 745
 @l-DateTime-dotw  .l-DateTime-day   .l-DateTime-doty  [ dotw 00 ]       [ 01 ] .DateTime.dotw
699
-@l-DateTime-doty   [ 0000 ]         .l-DateTime-hour  [ doty 00 ]       [ 03 ] .DateTime.doty
746
+@l-DateTime-doty   [ 0000 ]         .l-DateTime-hour  [ doty 00 ]       [ 02 ] .DateTime.doty
700 747
 @l-DateTime-hour   [ 0000 ]          [ 0000 ]         [ hour 00 ]       [ 01 ] .DateTime.hour
748
+@l-DateTime-root
701 749
 @l-DateTime-isdst .l-DateTime-dotw  .l-DateTime-refresh [ isdst 00 ]      [ 01 ] .DateTime.isdst
702 750
 @l-DateTime-minute  [ 0000 ]         .l-DateTime-month [ minute 00 ]     [ 01 ] .DateTime.minute
703 751
 @l-DateTime-month  [ 0000 ]          [ 0000 ]         [ month 00 ]      [ 01 ] .DateTime.month
704 752
 @l-DateTime-refresh .l-DateTime-minute .l-DateTime-second [ refresh 00 ]    [ 01 ] .DateTime.refresh
705
-@l-DateTime-root
706 753
 @l-DateTime-second  [ 0000 ]         .l-DateTime-year  [ second 00 ]     [ 01 ] .DateTime.second
707
-@l-DateTime-year   [ 0000 ]          [ 0000 ]         [ year 00 ]       [ 03 ] .DateTime.year
754
+@l-DateTime-year   [ 0000 ]          [ 0000 ]         [ year 00 ]       [ 02 ] .DateTime.year
708 755
 @l-File            [ 0000 ]          [ 0000 ]         [ File 00 ]       [ 80 ] .File .l-File-root
709
-@l-File-length     [ 0000 ]         .l-File-load      [ length 00 ]     [ 03 ] .File.length
756
+@l-File-length     [ 0000 ]         .l-File-load      [ length 00 ]     [ 02 ] .File.length
710 757
 @l-File-load       [ 0000 ]          [ 0000 ]         [ load 00 ]       [ 00 ] .File.load
711
-@l-File-name      .l-File-length    .l-File-save      [ name 00 ]       [ 03 ] .File.name
712 758
 @l-File-root
713
-@l-File-save       [ 0000 ]         .l-File-vector    [ save 00 ]       [ 03 ] .File.save
714
-@l-File-vector     [ 0000 ]          [ 0000 ]         [ vector 00 ]     [ 03 ] .File.vector
759
+@l-File-name      .l-File-length    .l-File-save      [ name 00 ]       [ 02 ] .File.name
760
+@l-File-save       [ 0000 ]         .l-File-vector    [ save 00 ]       [ 02 ] .File.save
761
+@l-File-vector     [ 0000 ]          [ 0000 ]         [ vector 00 ]     [ 02 ] .File.vector
715 762
 @l-Mouse          .l-File           .l-Screen         [ Mouse 00 ]      [ 80 ] .Mouse .l-Mouse-root
716 763
 @l-Mouse-chord     [ 0000 ]         .l-Mouse-state    [ chord 00 ]      [ 01 ] .Mouse.chord
717
-@l-Mouse-root
718 764
 @l-Mouse-state     [ 0000 ]          [ 0000 ]         [ state 00 ]      [ 01 ] .Mouse.state
719
-@l-Mouse-vector   .l-Mouse-chord    .l-Mouse-x        [ vector 00 ]     [ 03 ] .Mouse.vector
720
-@l-Mouse-x         [ 0000 ]         .l-Mouse-y        [ x 00 ]          [ 03 ] .Mouse.x
721
-@l-Mouse-y         [ 0000 ]          [ 0000 ]         [ y 00 ]          [ 03 ] .Mouse.y
765
+@l-Mouse-root
766
+@l-Mouse-vector   .l-Mouse-chord    .l-Mouse-x        [ vector 00 ]     [ 02 ] .Mouse.vector
767
+@l-Mouse-x         [ 0000 ]         .l-Mouse-y        [ x 00 ]          [ 02 ] .Mouse.x
768
+@l-Mouse-y         [ 0000 ]          [ 0000 ]         [ y 00 ]          [ 02 ] .Mouse.y
722 769
 @l-Screen          [ 0000 ]         .l-System         [ Screen 00 ]     [ 80 ] .Screen .l-Screen-root
723
-@l-Screen-addr     [ 0000 ]          [ 0000 ]         [ addr 00 ]       [ 03 ] .Screen.addr
770
+@l-Screen-addr     [ 0000 ]          [ 0000 ]         [ addr 00 ]       [ 02 ] .Screen.addr
724 771
 @l-Screen-color   .l-Screen-addr    .l-Screen-height  [ color 00 ]      [ 01 ] .Screen.color
725
-@l-Screen-height   [ 0000 ]          [ 0000 ]         [ height 00 ]     [ 03 ] .Screen.height
772
+@l-Screen-height   [ 0000 ]          [ 0000 ]         [ height 00 ]     [ 02 ] .Screen.height
726 773
 @l-Screen-root
727
-@l-Screen-vector  .l-Screen-color   .l-Screen-x       [ vector 00 ]     [ 03 ] .Screen.vector
728
-@l-Screen-width    [ 0000 ]          [ 0000 ]         [ width 00 ]      [ 03 ] .Screen.width
729
-@l-Screen-x       .l-Screen-width   .l-Screen-y       [ x 00 ]          [ 03 ] .Screen.x
730
-@l-Screen-y        [ 0000 ]          [ 0000 ]         [ y 00 ]          [ 03 ] .Screen.y
774
+@l-Screen-vector  .l-Screen-color   .l-Screen-x       [ vector 00 ]     [ 02 ] .Screen.vector
775
+@l-Screen-width    [ 0000 ]          [ 0000 ]         [ width 00 ]      [ 02 ] .Screen.width
776
+@l-Screen-x       .l-Screen-width   .l-Screen-y       [ x 00 ]          [ 02 ] .Screen.x
777
+@l-Screen-y        [ 0000 ]          [ 0000 ]         [ y 00 ]          [ 02 ] .Screen.y
731 778
 @l-System          [ 0000 ]          [ 0000 ]         [ System 00 ]     [ 80 ] .System .l-System-root
732
-@l-System-b        [ 0000 ]          [ 0000 ]         [ b 00 ]          [ 03 ] .System.b
733
-@l-System-g       .l-System-b       .l-System-r       [ g 00 ]          [ 03 ] .System.g
734
-@l-System-r        [ 0000 ]         .l-System-vector  [ r 00 ]          [ 03 ] .System.r
779
+@l-System-b        [ 0000 ]          [ 0000 ]         [ b 00 ]          [ 02 ] .System.b
735 780
 @l-System-root
736
-@l-System-vector   [ 0000 ]          [ 0000 ]         [ vector 00 ]     [ 03 ] .System.vector
737
-@l-root
781
+@l-System-g       .l-System-b       .l-System-r       [ g 00 ]          [ 02 ] .System.g
782
+@l-System-r        [ 0000 ]         .l-System-vector  [ r 00 ]          [ 02 ] .System.r
783
+@l-System-vector   [ 0000 ]          [ 0000 ]         [ vector 00 ]     [ 02 ] .System.vector
738 784
 
739 785
 @assembler-heap-start
740 786