Mirror of CollapseOS
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
3.4KB

  1. ( ----- 600 )
  2. TRS-80 Recipe
  3. Support code for the TRS-80 recipe. Contains drivers for the
  4. keyboard, video and floppy. At the moment, they are thin layer
  5. over the drivers provided by TRSDOS' SVC.
  6. Load with "602 LOAD".
  7. There is also the RECV program at B612.
  8. ( ----- 602 )
  9. 1 8 LOADR+
  10. ( ----- 603 )
  11. CODE (key)
  12. A 0x01 LDri, ( @KEY )
  13. 0x28 RST,
  14. PUSHA,
  15. ;CODE
  16. CODE (emit) EXX, ( protect BC )
  17. BC POP, ( c == @DSP arg ) chkPS,
  18. A 0x02 LDri, ( @DSP )
  19. 0x28 RST,
  20. EXX, ( unprotect BC ) ;CODE
  21. CODE AT-XY EXX, ( protect BC )
  22. DE POP, H E LDrr, ( Y )
  23. DE POP, L E LDrr, ( X ) chkPS,
  24. A 0x0f LDri, ( @VDCTL ) B 3 LDri, ( setcur )
  25. 0x28 RST,
  26. EXX, ( unprotect BC ) ;CODE
  27. ( ----- 604 )
  28. : LINES 24 ; : COLS 80 ;
  29. CODE BYE
  30. HL 0 LDdi,
  31. A 0x16 LDri, ( @EXIT )
  32. 0x28 RST,
  33. CODE @DCSTAT ( drv -- f ) EXX, ( protect BC )
  34. BC POP,
  35. chkPS,
  36. A 0x28 LDri, ( @DCSTAT )
  37. 0x28 RST,
  38. PUSHZ,
  39. EXX, ( unprotect BC ) ;CODE
  40. ( ----- 605 )
  41. CODE @RDSEC ( drv cylsec addr -- f ) EXX, ( protect BC )
  42. HL POP,
  43. DE POP,
  44. BC POP,
  45. chkPS,
  46. A 0x31 LDri, ( @RDSEC )
  47. 0x28 RST,
  48. PUSHZ,
  49. EXX, ( unprotect BC ) ;CODE
  50. ( ----- 606 )
  51. CODE @WRSEC ( drv cylsec addr -- f ) EXX, ( protect BC )
  52. HL POP,
  53. DE POP,
  54. BC POP,
  55. chkPS,
  56. A 0x35 LDri, ( @WRSEC )
  57. 0x28 RST,
  58. PUSHZ,
  59. EXX, ( unprotect BC ) ;CODE
  60. CODE @GET ( a -- c f )
  61. DE POP,
  62. chkPS,
  63. A 0x03 LDri, ( @GET )
  64. 0x28 RST,
  65. PUSHA, PUSHZ,
  66. ;CODE
  67. ( ----- 607 )
  68. CODE @PUT ( c a -- f ) EXX, ( protect BC )
  69. DE POP,
  70. BC POP,
  71. chkPS,
  72. A 0x04 LDri, ( @PUT )
  73. 0x28 RST,
  74. PUSHZ,
  75. EXX, ( unprotect BC ) ;CODE
  76. ( ----- 609 )
  77. : _err LIT" FDerr" ERR ;
  78. : _cylsec ( sec -- cs, return sector/cylinder for given secid )
  79. ( 4 256b sectors per block, 10 sec per cyl, 40 cyl max )
  80. 10 /MOD ( sec cyl )
  81. DUP 39 > IF _err THEN
  82. 8 LSHIFT + ( cylsec )
  83. ;
  84. : FD@! ( wref blk -- )
  85. 1 @DCSTAT NOT IF _err THEN
  86. 2 LSHIFT ( 4 * -- wr sec )
  87. 4 0 DO ( wr sec )
  88. DUP I + _cylsec ( wr sec cs )
  89. I 8 LSHIFT BLK( + ( wr sec cs addr )
  90. 1 ROT ROT ( wr sec drv cs addr )
  91. 4 PICK EXECUTE NOT IF _err THEN
  92. LOOP 2DROP ;
  93. ( ----- 610 )
  94. : FD@ ['] @RDSEC SWAP FD@! ;
  95. : FD! ['] @WRSEC SWAP FD@! ;
  96. : FD$ ['] FD@ BLK@* ! ['] FD! BLK!* ! ;
  97. : _err LIT" *CLerr" ERR ;
  98. : *CL< 0 BEGIN DROP 0x0238 @GET UNTIL ;
  99. : *CL> 0x0238 @PUT NOT IF _err THEN ;
  100. ( ----- 612 )
  101. ( We process the 0x20 exception by pre-putting a mask in the
  102. (HL) we're going to write to. If it wasn't a 0x20, we put a
  103. 0xff mask. If it was a 0x20, we put a 0x7f mask. )
  104. : @GET,
  105. A 0x03 LDri, ( @GET )
  106. DE COM_DRV_ADDR LDdi,
  107. 0x28 RST, JRNZ, L2 FWR ( maybeerror )
  108. A ORr,
  109. CZ RETc, ( Sending a straight NULL ends the comm. ) ;
  110. : @PUT, ( @PUT that char back )
  111. C A LDrr,
  112. A 0x04 LDri, ( @PUT )
  113. 0x28 RST, JRNZ, L3 FWR ( error )
  114. A C LDrr, ;
  115. H@ ORG !
  116. HL DEST_ADDR LDdi, ( cont. )
  117. ( ----- 613 )
  118. BEGIN,
  119. A 0xff LDri, (HL) A LDrr, ( default mask )
  120. L1 BSET ( loop2 ) @GET, @PUT,
  121. 0x20 CPi, JRZ, L4 FWR ( escapechar )
  122. ( not an escape char, just apply the mask and write )
  123. (HL) ANDr, (HL) A LDrr,
  124. HL INCd,
  125. JR, AGAIN,
  126. L4 FSET ( escapechar, adjust by setting (hl) to 0x7f )
  127. 7 (HL) RES, JR, L1 BWR ( loop2 )
  128. L2 FSET ( maybeerror, was it an error? )
  129. A ORr, JRZ, L1 BWR ( loop2, not an error )
  130. L3 FSET ( error )
  131. C A LDrr, ( error code from @GET/@PUT )
  132. A 0x1a LDri, ( @ERROR ) 0x28 RST, RET,