Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

183 lines
4.8KB

  1. ; =============================================================
  2. ; kernal-io.asm — Using Kernal Routines for I/O
  3. ; Demonstrates: screen output, keyboard input, file I/O
  4. ; Assemble to $C000. Run with SYS 49152.
  5. ; =============================================================
  6. * = $C000
  7. ; ---------------------------------------------------------------
  8. ; MAIN — Demo entry point
  9. ; ---------------------------------------------------------------
  10. MAIN JSR $FF81 ; CINT — init screen
  11. ; Print a string
  12. LDA #<MSG_WELCOME
  13. LDX #>MSG_WELCOME
  14. JSR PRINT_STR
  15. ; Read a line of input
  16. JSR READ_LINE ; result in INBUF, length in INLEN
  17. ; Echo it back
  18. LDA #<MSG_YOU_TYPED
  19. LDX #>MSG_YOU_TYPED
  20. JSR PRINT_STR
  21. LDX #0
  22. ECHO LDA INBUF,X
  23. BEQ ECHO_DONE
  24. JSR $FFD2 ; BSOUT
  25. INX
  26. BNE ECHO
  27. ECHO_DONE:
  28. LDA #$0D
  29. JSR $FFD2 ; print CR
  30. ; Write a file to disk
  31. JSR WRITE_FILE
  32. RTS
  33. ; ---------------------------------------------------------------
  34. ; PRINT_STR — Print null-terminated string
  35. ; Input: A = low byte, X = high byte of string address
  36. ; ---------------------------------------------------------------
  37. PRINT_STR:
  38. STA $FB ; store address in zero page
  39. STX $FC
  40. LDY #0
  41. PS_LOOP LDA ($FB),Y ; load character
  42. BEQ PS_DONE ; zero = end
  43. JSR $FFD2 ; BSOUT — output to screen
  44. INY
  45. BNE PS_LOOP
  46. PS_DONE RTS
  47. ; ---------------------------------------------------------------
  48. ; READ_LINE — Read keyboard input until RETURN
  49. ; Output: INBUF filled, INLEN = number of chars read
  50. ; ---------------------------------------------------------------
  51. READ_LINE:
  52. LDX #0 ; buffer index
  53. RL_LOOP JSR $FFE4 ; GETIN — get character (non-blocking)
  54. BEQ RL_LOOP ; no key, keep waiting
  55. CMP #$0D ; RETURN key?
  56. BEQ RL_DONE
  57. CMP #$14 ; DELETE key?
  58. BEQ RL_DEL
  59. CPX #79 ; buffer full?
  60. BEQ RL_LOOP
  61. STA INBUF,X ; store character
  62. JSR $FFD2 ; echo to screen
  63. INX
  64. BNE RL_LOOP
  65. RL_DEL CPX #0
  66. BEQ RL_LOOP ; nothing to delete
  67. DEX
  68. LDA #$14
  69. JSR $FFD2 ; output DELETE
  70. BNE RL_LOOP
  71. RL_DONE LDA #0
  72. STA INBUF,X ; null terminate
  73. STX INLEN
  74. LDA #$0D
  75. JSR $FFD2 ; echo CR
  76. RTS
  77. ; ---------------------------------------------------------------
  78. ; WRITE_FILE — Write data to a sequential disk file
  79. ; ---------------------------------------------------------------
  80. WRITE_FILE:
  81. ; SETLFS: logical=2, device=8, secondary=2
  82. LDA #2
  83. LDX #8
  84. LDY #2
  85. JSR $FFBA ; SETLFS
  86. ; SETNAM: filename "OUTPUT,S,W"
  87. LDA #OUTNAME_LEN
  88. LDX #<OUTNAME
  89. LDY #>OUTNAME
  90. JSR $FFBD ; SETNAM
  91. ; OPEN
  92. JSR $FFC0 ; OPEN
  93. BCS WF_OERR ; error if carry set
  94. ; CHKOUT: redirect output to file
  95. LDX #2
  96. JSR $FFC9 ; CHKOUT
  97. BCS WF_CERR
  98. ; Write data
  99. LDX #0
  100. WF_LOOP LDA FILEDATA,X
  101. BEQ WF_DONE
  102. JSR $FFD2 ; BSOUT to file
  103. INX
  104. BNE WF_LOOP
  105. WF_DONE JSR $FFCC ; CLRCH — restore default channels
  106. LDA #2
  107. JSR $FFC3 ; CLOSE
  108. ; Check disk error channel
  109. JSR $FFBA ; reuse: SETLFS 15,8,15
  110. ; Actually let's just print success
  111. LDA #<MSG_SAVED
  112. LDX #>MSG_SAVED
  113. JMP PRINT_STR
  114. WF_OERR LDA #<MSG_OERR
  115. LDX #>MSG_OERR
  116. JMP PRINT_STR
  117. WF_CERR LDA #<MSG_CERR
  118. LDX #>MSG_CERR
  119. JMP PRINT_STR
  120. ; ---------------------------------------------------------------
  121. ; Data
  122. ; ---------------------------------------------------------------
  123. MSG_WELCOME:
  124. .BYTE 147 ; clear screen
  125. .TEXT "KERNAL I/O DEMO"
  126. .BYTE $0D
  127. .TEXT "TYPE SOMETHING AND PRESS RETURN:"
  128. .BYTE $0D,0
  129. MSG_YOU_TYPED:
  130. .TEXT "YOU TYPED: "
  131. .BYTE 0
  132. MSG_SAVED:
  133. .BYTE $0D
  134. .TEXT "FILE WRITTEN TO DISK."
  135. .BYTE $0D,0
  136. MSG_OERR:
  137. .TEXT "ERROR: COULD NOT OPEN FILE"
  138. .BYTE $0D,0
  139. MSG_CERR:
  140. .TEXT "ERROR: COULD NOT REDIRECT OUTPUT"
  141. .BYTE $0D,0
  142. OUTNAME:
  143. .TEXT "OUTPUT,S,W"
  144. OUTNAME_LEN = * - OUTNAME
  145. FILEDATA:
  146. .TEXT "DATA LINE 1"
  147. .BYTE $0D
  148. .TEXT "DATA LINE 2"
  149. .BYTE $0D,0
  150. ; ---------------------------------------------------------------
  151. ; Variables
  152. ; ---------------------------------------------------------------
  153. INBUF .FILL 80,0 ; 80-byte input buffer
  154. INLEN .BYTE 0 ; length of input

Powered by TurnKey Linux.