?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. COLOR=0
  2.     define LINE_LIMIT 80
  3.     module TextMode
  4. PORT_SELECT = #7c3b
  5. init:
  6.     ld hl, font_file, b, Dos.FMODE_READ
  7.     call Dos.fopen
  8.     push af
  9.     ld bc, 2048, hl, font
  10.     call Dos.fread
  11.     pop af
  12.     call Dos.fclose
  13.    
  14.     IFDEF UNO
  15.     ;; Force turbo mode
  16.     ld bc, 64571 : ld a, #0b : out (c), a
  17.     ld bc, 64827 : in a, (c) : or #c0 : out (c),a
  18.     ENDIF
  19. cls:
  20.     ld a, 7 : call Memory.setPage
  21.  
  22.     ld a, #3E : out (#ff), a
  23.  
  24.     di
  25.     ld  hl,0, d,h, e,h, b,h, c,b
  26.     add hl,sp
  27.     ld  sp,#c000 + 6144
  28. .loop
  29.     dup 12
  30.         push    de
  31.     edup
  32.  
  33.     djnz        .loop
  34.  
  35.     ld  b,c
  36.     ld  sp,#e000 + 6144
  37. .loop2:
  38.     dup 12
  39.         push    de
  40.     edup
  41.  
  42.     djnz .loop2
  43.     ld  sp,hl
  44.     ld hl ,0 : ld (coords), hl
  45.     xor a : call Memory.setPage
  46.    
  47.     ei
  48.     ret
  49.  
  50. ; A - line
  51. usualLine:
  52.    ld d, a
  53.    jr fill
  54. ; A - line
  55. highlightLine:
  56.     ld d, a
  57. fill:
  58.     ld e, 0, b, 64
  59. .lloop
  60.         push bc
  61.         push de
  62.         call findAddr
  63.     ld a, 7 : call Memory.setPage
  64.        
  65.         ld b, 8
  66. .cloop 
  67.         ld a, (de) : xor #ff : ld (de), a
  68.         inc d
  69.         djnz .cloop
  70.         pop de
  71.         inc e
  72.         pop bc
  73.         djnz .lloop
  74.  
  75.     xor a : call Memory.setPage
  76.     ret
  77.  
  78. printZ:
  79.     ld a, (hl) : and a : ret z
  80.     push hl
  81.     call putC
  82.     pop hl
  83.     inc hl
  84.     jr printZ
  85.  
  86.  
  87. ; A - char
  88. putC:
  89.     ld (drawC.char_tmp), a
  90.  
  91.         cp 13
  92.         jp z, .cr
  93.    
  94.     ld de, (coords)
  95.     ld a, e
  96.     cp 85
  97.     ret nc
  98.  
  99.  
  100.     ld a, 7
  101.     call Memory.setPage
  102.     push iy
  103.     call drawC
  104.     pop iy
  105.  
  106.     ld hl, coords
  107.     inc (hl)
  108.  
  109.     jr .exit
  110. .cr
  111.         ld hl, (coords)
  112.         inc h
  113.         ld l, 0, (coords), hl
  114.         cp 24
  115.         ret c
  116.         ld hl, 0, (coords), hl
  117. .exit
  118.     xor a : call Memory.setPage
  119.         ret    
  120.  
  121. drawC:
  122.     ld hl, (coords)
  123.     ld b, l
  124.     call .calc
  125.     ld d, h
  126.     ld e, l
  127.     ld (.rot_tmp), a
  128.     call findAddr
  129.     push de
  130.     call .get_char
  131.  
  132.     pop hl
  133. .print0
  134.     ld ix, hl
  135.     ld a, h
  136.     bit 5, a
  137.     jr z, .ok
  138.     inc l
  139. .ok
  140.     xor #20 : ld h, a
  141.     ld iy, hl
  142.     ld a, (.rot_tmp)
  143.     call .rotate_mask
  144.     ld a, (.rot_tmp)
  145.     jp basic_draw
  146. .calc
  147.       ld l,0
  148.       ld a, b : and a : ret z
  149.       ld ix, 0
  150.       ld de,6
  151. 1     add ix, de
  152.       djnz 1b
  153.       ld de, -8
  154. 2     ld a, ixh
  155.       and a
  156.       jr nz, 3f
  157.       ld a, ixl
  158.       cp 8
  159.       ret c
  160. 3    
  161.       add ix, de
  162.       inc l
  163.       jr 2b
  164.       ret
  165.  
  166. .rotate_mask
  167.     ld hl, #03ff
  168.     and a : ret z
  169. .rot_loop
  170.     ex af, af
  171.     ld a,l
  172.     rrca
  173.     rr h
  174.     rr l
  175.     ex af, af
  176.     dec a
  177.     jr nz, .rot_loop
  178.     ret
  179. .get_char:
  180.     ld a, (.char_tmp)
  181.     ld l, a
  182.     ld h, 0
  183.     add hl, hl
  184.     add hl, hl
  185.     add hl, hl
  186.     ld bc, font
  187.     add hl, bc
  188.     ex hl, de
  189.     ret
  190. .char_tmp db 0
  191. .rot_tmp  db 0
  192. ; A - rotation counter
  193. ; DE - font PTR
  194. ; HL - mask
  195. ; IX - left half on screen
  196. ; IY - right half on screen
  197. basic_draw:
  198.     ld (.rot_cnt),a
  199.  
  200.     ld a, l
  201.     ld (.mask1), a
  202.     ld a, h
  203.     ld (.mask2), a
  204.     ld b, 8
  205. .printIt
  206.     ld a, (de)
  207.     ld h, a
  208.     ld l, 0
  209.     ld a, 0
  210. .rot_cnt = $ - 1
  211.     and a : jr z, .skiprot
  212. .rot
  213.     ex af, af
  214.     ld a,l
  215.     rrca
  216.     rr h
  217.     rr l
  218.     ex af, af
  219.     dec a
  220.     jr nz, .rot
  221. .skiprot
  222.     ld a, (iy)
  223.     and #0f
  224. .mask1 = $ - 1
  225.     or l
  226.     ld (iy), a
  227.     ld a, (ix)
  228.     and #fc
  229. .mask2 = $ -1
  230.     or h
  231.     ld (ix), a
  232.     inc ixh
  233.     inc iyh
  234.     inc de
  235.     djnz .printIt
  236.     ret
  237.  
  238.  
  239. ; H - line
  240. ; A - char
  241. fillLine:
  242.     ld d, h, e, 0 : call gotoXY
  243.     ld b, 85
  244. .loop
  245.     push af, bc
  246.     call putC
  247.     pop bc, af
  248.     djnz .loop
  249.     ret
  250.  
  251.  
  252. gotoXY:
  253.     ld (coords), de
  254.     ret
  255.  
  256. ; D - Y
  257. ; E - X
  258. ; OUT: de - coords
  259. findAddr:
  260.     ld a, e
  261.     srl a
  262.     ld e,a
  263.     ld b, #E0
  264.     jr c, .proc
  265.     ld b, #C0
  266. .proc
  267.     LD A,D
  268.     AND 7
  269.     RRCA
  270.     RRCA
  271.     RRCA
  272.     OR E
  273.     LD E,A
  274.     LD A,D
  275.     AND 24
  276.     OR b
  277.     LD D,A
  278.     ret
  279.  
  280.  
  281. disable:
  282.     xor a : out (#fe), a : out (#ff), a
  283.     ret
  284.  
  285. coords dw 0
  286. font equ #4000 ; Using ZX-Spectrum screen as font buffer
  287. font_file db "data/font80.bin", 0
  288.     endmodule
  289.  
  290. exit:
  291.     ld bc, TextMode.PORT_SELECT, a, 1          
  292.     out (c), a
  293.     inc b : xor a
  294.     out (c), a
  295.     rst 0