home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 405.lha / Z8_CrossAsm / serial.asm < prev    next >
Assembly Source File  |  1990-06-05  |  3KB  |  113 lines

  1. ;
  2. ; Simple test for z8 cross assembler.
  3. ; (Assumes z8671 MCU with Basic/Debug Interpreter)
  4. ;
  5. ; r.bush 15-apr-1989.
  6. ;
  7. ; This program demonstrates the use of the Basic serial output routine
  8. ; from assembly language. Also shows method of polled serial input/output
  9. ; routines.
  10. ;
  11. ;
  12. ; The following demonstrates the use of defines:
  13. ;
  14. ;             source text    replaced by
  15. ;             -----------    -----------
  16.     def    safe        #$30    ;safe working reg. address
  17.     def    rp        r:253    ;the z8 "RP" register
  18.     def    basic_out    $61    ;address of basic output routine
  19.     def    basic_rp    #$16    ;default basic RP
  20.     def    serial_port    r:240    ;serial data register
  21.     def    irq        r:250    ;interrupt request register
  22. ;
  23.     org    $1020        ;a safe program origin for my z8 setup
  24. ;
  25. ; a couple of equates..
  26. ;
  27. cr:    equ    $0d        ;Note: All labels must end with ':'!!
  28. lf:    equ    $0a
  29. ;
  30. ; *** Start of main program ***
  31. ;
  32. start:
  33.     push    rp        ;save rp on entry
  34.     srp    safe        ;set rp to the only safe one
  35.     ld    r0,#10        ;loop counter
  36. loop:
  37.     ld    r2,#msg1!h    ;hi order byte of message address
  38.     ld    r3,#msg1!l    ;lo order byte of message address
  39.     call    out_msg        ;send message to serial port
  40.     djnz    r0,loop        ;loop until r0 = 0
  41. ;
  42.     ld    r2,#msg2!h    ;hi order byte of message address
  43.     ld    r3,#msg2!l    ;lo order byte of message address
  44.     call    out_msg1    ;send message to serial port (our routine)
  45.     call    inch1        ;wait for user input
  46.     pop    rp        ;restore callers rp
  47.     ret            ;return to caller (basic)
  48. ;
  49. ;out_msg - Outputs message pointed to by rr2.
  50. ;          Expects message to be null terminated.
  51. ;
  52. out_msg:
  53.     ldc    r1,@rr2        ;get character from message buffer
  54.     cp    r1,#0        ;is it the terminator?
  55.     jr    z,endit        ;if terminator end loop
  56.     call    outch        ;send char to serial port via Basic i/o
  57.     incw    rr2        ;point to next char of message
  58.     jr    out_msg        ;loop back
  59. endit:
  60.     ret
  61. ;
  62. ; Same as out_msg except it calls our serial output routine.
  63. ;
  64. out_msg1:
  65.     ldc    r1,@rr2        ;get character from message buffer
  66.     cp    r1,#0        ;is it the terminator?
  67.     jr    z,endit1    ;if terminator end loop
  68.     call    outch1        ;try our serial output routine
  69.     incw    rr2        ;point to next char of message
  70.     jr    out_msg1    ;loop back
  71. endit1:
  72.     ret
  73. ;
  74. ; outch - Outputs value in r1 to serial port.
  75. ;      Calls basic serial output routine.
  76. ;
  77. outch:
  78.     ld    r:19,r1        ;store r1 to r:19 (basic_out expects this)
  79.     push    rp
  80.     srp    basic_rp    ;set rp to the required basic default
  81.     call    basic_out
  82.     pop    rp
  83.     ret
  84. ;
  85. ; Stand alone version of polled serial output routine.
  86. ; Based on disassembly of Basic character output routine.
  87. ;
  88. outch1:
  89.     and    irq,#$e7    ;clear serial irq bits    
  90.     ld    serial_port,r1    ;send the character
  91. chl:    tm    irq,#$10    ;wait for irq4 transition to non zero    
  92.     jr    z,chl        ; (I assume this means char has been sent)
  93.     ret
  94. ;
  95. ; Stand alone version of polled serial input routine.
  96. ; Waits for character to appear at serial port, returns character in r1.
  97. ; Based on dissassembly of Basic character input routine.
  98. ; Note: this routine does not echo character..
  99. inch1:    
  100.     tm    irq,#$08    ;check for char available (irq3)
  101.     jr    z,inch1        ;loop till char available
  102.     ld    r1,serial_port    ;read serial port
  103.     ret
  104. ;
  105. ; storage
  106. ;
  107. msg1:    db    '*** This is only a Test!! ***',$0d,$0a,$00
  108. msg2:    db    '*** Press any key to end Test: ***',cr,lf,0
  109. ;
  110. end:
  111.  
  112.