OpenCores
URL https://opencores.org/ocsvn/light8080/light8080/trunk

Subversion Repositories light8080

[/] [light8080/] [trunk/] [c/] [hello.asm] - Blame information for rev 65

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 65 motilito
; <><><>   Small-C  V1.2  DOS--CP/M Cross Compiler   <><><>
2
; <><><><><>   CP/M Large String Space Version   <><><><><>
3
; <><><><><><><><><><>   By Ron Cain   <><><><><><><><><><>
4
;
5
        code
6
        org #0000
7
        ld hl,3072
8
        ld sp,hl
9
        call __main
10
;//---------------------------------------------------------------------------------------
11
;//     Project:                        light8080 SOC           WiCores Solutions
12
;//
13
;//     File name:                      hello.c                                 (February 04, 2012)
14
;//
15
;//     Writer:                         Moti Litochevski
16
;//
17
;//     Description:
18
;//             This file contains a simple program written in Small-C that sends a string to
19
;//             the UART and then switches to echo received bytes.
20
;//
21
;//     Revision History:
22
;//
23
;//     Rev                                             
24
;//             
25
;//---------------------------------------------------------------------------------------
26
;#include ..\tools\c80\c80.lib
27
;#asm
28
;
29
;------------------------------------------------------------------
30
;       Small-C  Run-time Librray
31
;
32
;       V4d     As of July 16, 1980 (gtf)
33
;                  Added EXIT() function
34
;------------------------------------------------------------------
35
;
36
;Fetch a single byte from the address in HL and sign extend into HL
37
ccgchar:
38
        ld a,(hl)
39
ccsxt:
40
        ld l,a
41
        rlca
42
        sbc     a
43
        ld      h,a
44
        ret
45
;Fetch a full 16-bit integer from the address in HL
46
ccgint:
47
        ld a,(hl)
48
        inc     hl
49
        ld      h,(hl)
50
        ld l,a
51
        ret
52
;Store a single byte from HL at the address in DE
53
ccpchar:
54
        ld      a,l
55
        ld      (de),a
56
        ret
57
;Store a 16-bit integer in HL at the address in DE
58
ccpint:
59
        ld      a,l
60
        ld      (de),a
61
        inc     de
62
        ld      a,h
63
        ld      (de),a
64
        ret
65
;Inclusive "or" HL and DE into HL
66
ccor:
67
        ld      a,l
68
        or      e
69
        ld l,a
70
        ld      a,h
71
        or      d
72
        ld      h,a
73
        ret
74
;Exclusive "or" HL and DE into HL
75
ccxor:
76
        ld      a,l
77
        xor     e
78
        ld l,a
79
        ld      a,h
80
        xor     d
81
        ld      h,a
82
        ret
83
;"And" HL and DE into HL
84
ccand:
85
        ld      a,l
86
        and     e
87
        ld l,a
88
        ld      a,h
89
        and     d
90
        ld      h,a
91
        ret
92
;Test if HL = DE and set HL = 1 if true else 0
93
cceq:
94
        call cccmp
95
        ret z
96
        dec     hl
97
        ret
98
;Test if DE ~= HL
99
ccne:
100
        call cccmp
101
        ret nz
102
        dec     hl
103
        ret
104
;Test if DE > HL (signed)
105
ccgt:
106
        ex de,hl
107
        call cccmp
108
        ret c
109
        dec     hl
110
        ret
111
;Test if DE <= HL (signed)
112
ccle:
113
        call cccmp
114
        ret z
115
        ret c
116
        dec hl
117
        ret
118
;Test if DE >= HL (signed)
119
ccge:
120
        call cccmp
121
        ret nc
122
        dec hl
123
        ret
124
;Test if DE < HL (signed)
125
cclt:
126
        call cccmp
127
        ret c
128
        dec hl
129
        ret
130
; Signed compare of DE and HL
131
; Performs DE - HL and sets the conditions:
132
;       Carry reflects sign of difference (set means DE < HL)
133
;       Zero/non-zero set according to equality.
134
cccmp:
135
        ld      a,e
136
        sub     l
137
        ld      e,a
138
        ld      a,d
139
        sbc     h
140
        ld      hl,1
141
        jp      m,cccmp1
142
        or      e       ;"OR" resets carry
143
        ret
144
cccmp1:
145
        or      e
146
        scf             ;set carry to signal minus
147
        ret
148
;Test if DE >= HL (unsigned)
149
ccuge:
150
        call ccucmp
151
        ret nc
152
        dec hl
153
        ret
154
;Test if DE < HL (unsigned)
155
ccult:
156
        call ccucmp
157
        ret c
158
        dec hl
159
        ret
160
;Test if DE > HL (unsigned)
161
ccugt:
162
        ex de,hl
163
        call ccucmp
164
        ret c
165
        dec hl
166
        ret
167
;Test if DE <= HL (unsigned)
168
ccule:
169
        call ccucmp
170
        ret z
171
        ret c
172
        dec hl
173
        ret
174
;Routine to perform unsigned compare
175
;carry set if DE < HL
176
;zero/nonzero set accordingly
177
ccucmp:
178
        ld      a,d
179
        cp      h
180
        jp      nz,$+5
181
        ld      a,e
182
        cp      l
183
        ld      hl,1
184
        ret
185
;Shift DE arithmetically right by HL and return in HL
186
ccasr:
187
        ex      de,hl
188
        ld      a,h
189
        rla
190
        ld      a,h
191
        rra
192
        ld      h,a
193
        ld      a,l
194
        rra
195
        ld      l,a
196
        dec     e
197
        jp      nz,ccasr+1
198
        ret
199
;Shift DE arithmetically left by HL and return in HL
200
ccasl:
201
        ex      de,hl
202
        add     hl,hl
203
        dec     e
204
        jp      nz,ccasl+1
205
        ret
206
;Subtract HL from DE and return in HL
207
ccsub:
208
        ld      a,e
209
        sub     l
210
        ld l,a
211
        ld      a,d
212
        sbc     h
213
        ld      h,a
214
        ret
215
;Form the two's complement of HL
216
ccneg:
217
        call cccom
218
        inc     hl
219
        ret
220
;Form the one's complement of HL
221
cccom:
222
        ld      a,h
223
        cpl
224
        ld      h,a
225
        ld      a,l
226
        cpl
227
        ld l,a
228
        ret
229
;Multiply DE by HL and return in HL
230
ccmult:
231
        ld      b,h
232
        ld      c,l
233
        ld      hl,0
234
ccmult1:
235
        ld      a,c
236
        rrca
237
        jp      nc,$+4
238
        add     hl,de
239
        xor     a
240
        ld      a,b
241
        rra
242
        ld      b,a
243
        ld      a,c
244
        rra
245
        ld      c,a
246
        or      b
247
        ret z
248
        xor     a
249
        ld      a,e
250
        rla
251
        ld      e,a
252
        ld      a,d
253
        rla
254
        ld      d,a
255
        or      e
256
        ret z
257
        jp      ccmult1
258
;Divide DE by HL and return quotient in HL, remainder in DE
259
ccdiv:
260
        ld      b,h
261
        ld      c,l
262
        ld      a,d
263
        xor     b
264
        push af
265
        ld      a,d
266
        or      a
267
        call m,ccdeneg
268
        ld      a,b
269
        or      a
270
        call m,ccbcneg
271
        ld      a,16
272
        push af
273
        ex      de,hl
274
        ld      de,0
275
ccdiv1:
276
        add hl,hl
277
        call ccrdel
278
        jp      z,ccdiv2
279
        call cccmpbcde
280
        jp      m,ccdiv2
281
        ld      a,l
282
        or      1
283
        ld l,a
284
        ld      a,e
285
        sub     c
286
        ld      e,a
287
        ld      a,d
288
        sbc     b
289
        ld      d,a
290
ccdiv2:
291
        pop af
292
        dec     a
293
        jp      z,ccdiv3
294
        push af
295
        jp      ccdiv1
296
ccdiv3:
297
        pop af
298
        ret     p
299
        call ccdeneg
300
        ex de,hl
301
        call ccdeneg
302
        ex de,hl
303
        ret
304
ccdeneg:
305
        ld      a,d
306
        cpl
307
        ld      d,a
308
        ld      a,e
309
        cpl
310
        ld      e,a
311
        inc     de
312
        ret
313
ccbcneg:
314
        ld      a,b
315
        cpl
316
        ld      b,a
317
        ld      a,c
318
        cpl
319
        ld      c,a
320
        inc     bc
321
        ret
322
ccrdel:
323
        ld      a,e
324
        rla
325
        ld      e,a
326
        ld      a,d
327
        rla
328
        ld      d,a
329
        or      e
330
        ret
331
cccmpbcde:
332
        ld      a,e
333
        sub     c
334
        ld      a,d
335
        sbc     b
336
        ret
337
;// UART IO registers
338
;port (128) UDATA;              // uart data register used for both transmit and receive
339
;port (129) UBAUDL;             // low byte of baud rate register
340
;port (130) UBAUDH;             // low byte of baud rate register
341
;port (131) USTAT;              // uart status register
342
;// digital IO ports registers
343
;port (132) P1REG;      // output port1 - used as first attenuator control
344
;port (133) P2REG;              // output port2 - used as low digit LCD
345
;port (134) P3REG;              // output port3 - used as high digit LCD
346
;port (135) P4REG;              // output port4
347
;// simulation end register
348
;// writing any value to this port will end the verilog simulation when using tb_l80soc
349
;// test bench.
350
;port (255) SIMEND;
351
;// registers bit fields definition
352
;// uart status register decoding
353
;#define UTXBUSY                1
354
;#define URXFULL                16
355
;// globals
356
;char rxbyte;           // byte received from the uart
357
;int tstary[2] = {1234, 5678};
358
;//---------------------------------------------------------------------------------------
359
;// send a single byte to the UART
360
;sendbyte(by)
361
__sendbyte:
362
;char by;
363
;{
364
;       while (USTAT & UTXBUSY);
365
cc2:
366
        in a,(131)
367
        call ccsxt
368
        push hl
369
        ld hl,1
370
        pop de
371
        call ccand
372
        ld a,h
373
        or l
374
        jp z,cc3
375
        jp cc2
376
cc3:
377
;       UDATA = by;
378
        ld hl,2
379
        add hl,sp
380
        call ccgchar
381
        ld a,l
382
        out (128),a
383
 
384
;}
385
        ret
386
;// check if a byte was received by the uart
387
;getbyte()
388
__getbyte:
389
;{
390
;       if (USTAT & URXFULL) {
391
        in a,(131)
392
        call ccsxt
393
        push hl
394
        ld hl,16
395
        pop de
396
        call ccand
397
        ld a,h
398
        or l
399
        jp z,cc4
400
;               rxbyte = UDATA;
401
        in a,(128)
402
        call ccsxt
403
        ld a,l
404
        ld (__rxbyte),a
405
;               return 1;
406
        ld hl,1
407
        ret
408
;       }
409
;       else
410
        jp cc5
411
cc4:
412
;               return 0;
413
        ld hl,0
414
        ret
415
cc5:
416
;}
417
        ret
418
;// send new line to the UART
419
;nl()
420
__nl:
421
;{
422
;       sendbyte(13);
423
        ld hl,13
424
        push hl
425
        call __sendbyte
426
        pop bc
427
;       sendbyte(10);
428
        ld hl,10
429
        push hl
430
        call __sendbyte
431
        pop bc
432
;}
433
        ret
434
;// sends a string to the UART
435
;printstr(sptr)
436
__printstr:
437
;char *sptr;
438
;{
439
;       while (*sptr != 0)
440
cc6:
441
        ld hl,2
442
        add hl,sp
443
        call ccgint
444
        call ccgchar
445
        push hl
446
        ld hl,0
447
        pop de
448
        call ccne
449
        ld a,h
450
        or l
451
        jp z,cc7
452
;               sendbyte(*sptr++);
453
        ld hl,2
454
        add hl,sp
455
        push hl
456
        call ccgint
457
        inc hl
458
        pop de
459
        call ccpint
460
        dec hl
461
        call ccgchar
462
        push hl
463
        call __sendbyte
464
        pop bc
465
        jp cc6
466
cc7:
467
;}
468
        ret
469
;// sends a decimal value to the UART
470
;printdec(dval)
471
__printdec:
472
;int dval;
473
;{
474
;       if (dval<0) {
475
        ld hl,2
476
        add hl,sp
477
        call ccgint
478
        push hl
479
        ld hl,0
480
        pop de
481
        call cclt
482
        ld a,h
483
        or l
484
        jp z,cc8
485
;               sendbyte('-');
486
        ld hl,45
487
        push hl
488
        call __sendbyte
489
        pop bc
490
;               dval = -dval;
491
        ld hl,2
492
        add hl,sp
493
        push hl
494
        ld hl,4
495
        add hl,sp
496
        call ccgint
497
        call ccneg
498
        pop de
499
        call ccpint
500
;       }
501
;       outint(dval);
502
cc8:
503
        ld hl,2
504
        add hl,sp
505
        call ccgint
506
        push hl
507
        call __outint
508
        pop bc
509
;}
510
        ret
511
;// function copied from c80dos.c
512
;outint(n)
513
__outint:
514
;int n;
515
;{
516
;int q;
517
        push bc
518
;       q = n/10;
519
        ld hl,0
520
        add hl,sp
521
        push hl
522
        ld hl,6
523
        add hl,sp
524
        call ccgint
525
        push hl
526
        ld hl,10
527
        pop de
528
        call ccdiv
529
        pop de
530
        call ccpint
531
;       if (q) outint(q);
532
        ld hl,0
533
        add hl,sp
534
        call ccgint
535
        ld a,h
536
        or l
537
        jp z,cc9
538
        ld hl,0
539
        add hl,sp
540
        call ccgint
541
        push hl
542
        call __outint
543
        pop bc
544
;       sendbyte('0'+(n-q*10));
545
cc9:
546
        ld hl,48
547
        push hl
548
        ld hl,6
549
        add hl,sp
550
        call ccgint
551
        push hl
552
        ld hl,4
553
        add hl,sp
554
        call ccgint
555
        push hl
556
        ld hl,10
557
        pop de
558
        call ccmult
559
        pop de
560
        call ccsub
561
        pop de
562
        add hl,de
563
        push hl
564
        call __sendbyte
565
        pop bc
566
;}
567
        pop bc
568
        ret
569
;// sends a hexadecimal value to the UART
570
;printhex(hval)
571
__printhex:
572
;int hval;
573
;{
574
;int q;
575
        push bc
576
;       q = hval/16;
577
        ld hl,0
578
        add hl,sp
579
        push hl
580
        ld hl,6
581
        add hl,sp
582
        call ccgint
583
        push hl
584
        ld hl,16
585
        pop de
586
        call ccdiv
587
        pop de
588
        call ccpint
589
;       if (q) printhex(q);
590
        ld hl,0
591
        add hl,sp
592
        call ccgint
593
        ld a,h
594
        or l
595
        jp z,cc10
596
        ld hl,0
597
        add hl,sp
598
        call ccgint
599
        push hl
600
        call __printhex
601
        pop bc
602
;       q = hval-q*16;
603
cc10:
604
        ld hl,0
605
        add hl,sp
606
        push hl
607
        ld hl,6
608
        add hl,sp
609
        call ccgint
610
        push hl
611
        ld hl,4
612
        add hl,sp
613
        call ccgint
614
        push hl
615
        ld hl,16
616
        pop de
617
        call ccmult
618
        pop de
619
        call ccsub
620
        pop de
621
        call ccpint
622
;       if (q > 9)
623
        ld hl,0
624
        add hl,sp
625
        call ccgint
626
        push hl
627
        ld hl,9
628
        pop de
629
        call ccgt
630
        ld a,h
631
        or l
632
        jp z,cc11
633
;               sendbyte('A'+q-10);
634
        ld hl,65
635
        push hl
636
        ld hl,2
637
        add hl,sp
638
        call ccgint
639
        pop de
640
        add hl,de
641
        push hl
642
        ld hl,10
643
        pop de
644
        call ccsub
645
        push hl
646
        call __sendbyte
647
        pop bc
648
;       else
649
        jp cc12
650
cc11:
651
;               sendbyte('0'+q);
652
        ld hl,48
653
        push hl
654
        ld hl,2
655
        add hl,sp
656
        call ccgint
657
        pop de
658
        add hl,de
659
        push hl
660
        call __sendbyte
661
        pop bc
662
cc12:
663
;}
664
        pop bc
665
        ret
666
;// program main routine
667
;main()
668
__main:
669
;{
670
;       // configure UART baud rate - set to 9600 for 30MHz clock
671
;       // BAUD = round(//16) = round(30e6/9600/16) = 195
672
;       UBAUDL = 195;
673
        ld hl,195
674
        ld a,l
675
        out (129),a
676
 
677
;       UBAUDH = 0;
678
        ld hl,0
679
        ld a,l
680
        out (130),a
681
 
682
;       // print message
683
;       printstr("Hello World!!!"); nl();
684
        ld hl,cc1+0
685
        push hl
686
        call __printstr
687
        pop bc
688
        call __nl
689
;       printstr("Dec value: "); printdec(tstary[1]); nl();
690
        ld hl,cc1+15
691
        push hl
692
        call __printstr
693
        pop bc
694
        ld hl,__tstary
695
        push hl
696
        ld hl,1
697
        add hl,hl
698
        pop de
699
        add hl,de
700
        call ccgint
701
        push hl
702
        call __printdec
703
        pop bc
704
        call __nl
705
;       printstr("Hex value: 0x"); printhex(tstary[0]); nl();
706
        ld hl,cc1+27
707
        push hl
708
        call __printstr
709
        pop bc
710
        ld hl,__tstary
711
        push hl
712
        ld hl,0
713
        add hl,hl
714
        pop de
715
        add hl,de
716
        call ccgint
717
        push hl
718
        call __printhex
719
        pop bc
720
        call __nl
721
;       printstr("Echoing received bytes: "); nl();
722
        ld hl,cc1+41
723
        push hl
724
        call __printstr
725
        pop bc
726
        call __nl
727
;
728
;       // loop forever
729
;       while (1) {
730
cc13:
731
        ld hl,1
732
        ld a,h
733
        or l
734
        jp z,cc14
735
;               // check if a new byte was received
736
;               if (getbyte())
737
        call __getbyte
738
        ld a,h
739
        or l
740
        jp z,cc15
741
;                       // echo the received byte to the UART
742
;                       sendbyte(rxbyte);
743
        ld a,(__rxbyte)
744
        call ccsxt
745
        push hl
746
        call __sendbyte
747
        pop bc
748
;       }
749
cc15:
750
        jp cc13
751
cc14:
752
;}
753
        ret
754
;//---------------------------------------------------------------------------------------
755
;//                                             Th.. Th.. Th.. Thats all folks !!!
756
;//---------------------------------------------------------------------------------------
757
cc1:
758
        db 72,101,108,108,111,32,87,111,114,108
759
        db 100,33,33,33,0,68,101,99,32,118
760
        db 97,108,117,101,58,32,0,72,101,120
761
        db 32,118,97,108,117,101,58,32,48,120
762
        db 0,69,99,104,111,105,110,103,32,114
763
        db 101,99,101,105,118,101,100,32,98,121
764
        db 116,101,115,58,32,0
765
__rxbyte:
766
        ds 1
767
__tstary:
768
        db -46,4,46,22
769
 
770
; --- End of Compilation ---

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.