Advertisement
ColdWater0

CW_WIP

Sep 25th, 2019
276
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. dw 0xABCD
  2. POST:
  3.     mov r0, 0       ;testing hardware
  4.     add r0, 8
  5.     sub r0, 7
  6.     shl r0, 4
  7.     shr r0, 2
  8.     cmp r0, 4
  9.     cmp r0, 4
  10.     cmp r0, 4
  11.     cmp r0, 4
  12.     jne .post_failure_halt
  13.     jne .post_failure_halt
  14.     jne .post_failure_halt
  15.     jne .post_failure_halt
  16.     jmp .post_passed
  17.  
  18.     .post_failure_halt:
  19.  
  20.     hlt
  21.     jmp .post_failure_halt
  22.     jmp .post_failure_halt
  23.     jmp .post_failure_halt
  24.     jmp .post_failure_halt
  25.    
  26. .post_passed:
  27.  
  28. bootstrap:
  29.     mov sp, 2047
  30.     call clear_reg
  31.     mov r10, [terminal_port]
  32.     cmp [operate_mode], 3
  33.     je Test
  34.     mov r0, [last_state]
  35.     jnz system_check
  36.    
  37.     call splash
  38.     send r10, 0x20
  39.     call detect_model
  40.     send r10, 'K'
  41.     mov [last_state], 1
  42.     jmp main
  43.  
  44. splash:
  45.     send r10, 0x200F
  46.     send r10, 0x1000
  47.     send r10, 'C'
  48.     send r10, '-'
  49.     send r10, 'b'
  50.     send r10, 'a'
  51.     send r10, 's'
  52.     send r10, 'e'
  53.     ret
  54.  
  55. detect_model:
  56.     mov r0, [2048]
  57.     cmp r0, 0xABCD
  58.     je .k2
  59.     mov r0, [4096]
  60.     cmp r0, 0xABCD
  61.     je .k4
  62.     mov r0, [8192]
  63.     cmp r0, 0xABCD
  64.     je .k8
  65.     ret
  66.     .k2:
  67.         send r10, '2'
  68.         ret
  69.     .k4:
  70.         send r10, '4'
  71.         ret
  72.     .k8:
  73.         send r10, '8'
  74.         ret
  75.        
  76. shutdown:
  77.     mov [last_state], 0
  78.     mov r0, .str
  79.     call output_str
  80.     call clear_screen
  81.     hlt
  82.     mov ip, 0
  83.     mov ip, 0
  84.     .str:
  85.         dw 0x10FD, "...", 0
  86. reboot:
  87.     mov [last_state], 0
  88.     jmp POST
  89.  
  90. pause:              ;press any key to continue
  91.     push r0
  92.     call input_char
  93.     pop r0
  94.     ret
  95.    
  96. system_check:
  97.     call clear_screen
  98.     mov r0, .chk_msg
  99.     call output_str
  100.     cmp [operate_mode], 2
  101.     je reboot
  102.     call shutdown
  103.     .chk_msg:
  104.         dw 0x1000, "system check", 0
  105.  
  106. clear_reg:  ;zero-fil registers
  107.     mov r0, 0
  108.     mov r1, 0
  109.     mov r2, 0
  110.     mov r3, 0
  111.     mov r4, 0
  112.     mov r5, 0
  113.     mov r6, 0
  114.     mov r7, 0
  115.     mov r8, 0
  116.     mov r9, 0
  117.     mov r10, 0
  118.     mov r11, 0
  119.     mov r12, 0
  120.     mov r13, 0
  121.     ret
  122.        
  123.        
  124.  
  125. ;C.base configurations
  126. terminal_color:
  127.     dw 0x200F   ;default = 0x200F
  128. terminal_port:
  129.     dw 0x0000   ;default = 0x200F
  130. last_state:
  131.     dw 0        ;0:successfully shutdowned
  132.                 ;1:while running, suddenly shutdowned
  133.                 ;2:shutdowned in critical moment
  134. operate_mode:
  135.     dw 3 ;0: normaly operate
  136.             ;2: ignore last_state flag
  137.             ;3: jump to program directly
  138. ;C.base functions
  139.  
  140. ;functions for RT2
  141.  
  142. input_char:
  143.     .wait_loop:
  144.         wait r0
  145.         js .wait_loop
  146.         bump r10
  147.     .bump_loop:
  148.         recv r0, r10
  149.         jnc .bump_loop
  150.     ret
  151.    
  152. input_char_blink:
  153.     mov [.cursor_p], r0
  154.     push r1
  155.     mov r1, 0x5F
  156.     .wait_loop:
  157.         sub [.t], 1
  158.         js .timer
  159.         wait r0
  160.         js .wait_loop
  161.         bump r10
  162.     .bump_loop:
  163.         recv r0, r10
  164.         jnc .bump_loop
  165.     ret
  166.     .t:
  167.         dw 4
  168.     .cursor_p:
  169.         dw 0
  170.     .timer:
  171.         send r10, [.cursor_p]
  172.         send r10, r1
  173.         xor r1, 0x7F
  174.         mov [.t], 4
  175.         jmp .wait_loop
  176.  
  177. input_str:
  178.     mov [.wall], r0
  179.     send r10, 0x7F
  180.     add r1, r0              ;r0: string space address
  181.     .wait_loop:             ;r1: max length
  182.         wait r3             ;r2: terminal cursor
  183.         js .wait_loop
  184.         bump r10
  185.     .bump_loop:
  186.         recv r3, r10
  187.         jnc .bump_loop
  188.     cmp r3, 0x0D
  189.     je .enter
  190.     cmp r3, 0x08
  191.     je .bs
  192.     .ok:
  193.         cmp r1, r0
  194.         je .wait_loop
  195.         mov [r0], r3
  196.         send r10, r2
  197.         send r10, r3
  198.         send r10, 170
  199.         add r0, 1
  200.         add r2, 1
  201.         jmp .wait_loop
  202.     .bs:
  203.         cmp [.wall], r0
  204.         je .wait_loop
  205.         sub r0, 1
  206.         sub r2, 1
  207.         mov [r0], 0
  208.         send r10, r2
  209.         send r10, 170
  210.         send r10, 0x20
  211.         jmp .wait_loop
  212.     .enter:
  213.         ret
  214.     .wall: dw 0
  215.  
  216. input_str_blink:
  217.     mov [.wall], r0
  218.     mov r4, 0x5F
  219.     mov [.t], 4
  220.     add r1, r0  ;r0: string space address
  221.     .wait_loop: ;r1: max length
  222.         sub [.t], 1
  223.         js .time
  224.         wait r3 ;r2: terminal cursor
  225.         js .wait_loop
  226.         bump r10
  227.     .bump_loop:     ;r4: cursor character
  228.         recv r3, r10
  229.         jnc .bump_loop
  230.     cmp r3, 0x0D
  231.     je .enter
  232.     cmp r3, 0x08
  233.     je .bs
  234.     .ok:
  235.         cmp r1, r0
  236.         je .limit_length
  237.         mov [r0], r3
  238.         send r10, r2
  239.         send r10, r3
  240.         add r0, 1
  241.         add r2, 1
  242.         jmp .wait_loop
  243.     .bs:
  244.         cmp [.wall], r0
  245.         je .wait_loop
  246.         send r10, [terminal_color]
  247.         sub r0, 1
  248.         sub r2, 1
  249.         mov [r0], 0
  250.         send r10, r2
  251.         send r10, 0x20
  252.         send r10, 0x20
  253.         jmp .wait_loop
  254.     .enter:
  255.         send r10, r2
  256.         send r10, 0x20
  257.         send r10, [terminal_color]
  258.         ret
  259.     .wall: dw 0
  260.     .t: dw 4   
  261.     .time:
  262.         send r10, r2
  263.         send r10, r4
  264.         mov [.t], 4
  265.         xor r4, 0x7F
  266.         jmp .wait_loop
  267.     .limit_length:
  268.         send r10, 0x200C
  269.         jmp .wait_loop
  270.  
  271. input_str_blink_opt:
  272.     mov [.wall], r0
  273.     mov r4, 0x7F
  274.     mov [.t], 4
  275.     add r1, r0  ;r0: string space address
  276.     jmp .wait_loop
  277.     .limit_length:
  278.         send r10, 0x200C
  279.     .wait_loop: ;r1: max length
  280.         sub [.t], 1
  281.         jne .keepgoing
  282.         .time:
  283.         send r10, r2
  284.         send r10, r4
  285.         mov [.t], 4
  286.         xor r4, 0x5F
  287.     .keepgoing:
  288.         wait r3 ;r2: terminal cursor
  289.         js .wait_loop
  290.         bump r10
  291.     .bump_loop:     ;r4: cursor character
  292.         recv r3, r10
  293.         jnc .bump_loop
  294.     cmp r3, 0x0D
  295.     je .enter
  296.     cmp r3, 0x08
  297.     je .bs
  298.     .ok:
  299.         cmp r1, r0
  300.         je .limit_length
  301.         mov [r0], r3
  302.         send r10, r2
  303.         send r10, r3
  304.         add r0, 1
  305.         add r2, 1
  306.         jmp .wait_loop
  307.     .bs:
  308.         cmp [.wall], r0
  309.         je .wait_loop
  310.         send r10, [terminal_color]
  311.         sub r0, 1
  312.         sub r2, 1
  313.         mov [r0], 0
  314.         send r10, r2
  315.         send r10, 0x20
  316.         send r10, 0x20
  317.         jmp .wait_loop
  318.     .enter:
  319.         send r10, [terminal_color]
  320.         ret
  321.     .wall: dw 0
  322.     .t: dw 4
  323.        
  324. output_str:
  325.     push r1                             ;r0: string address
  326.     .loop:
  327.         mov r1, [r0]
  328.         jz .exit
  329.         send r10, r1
  330.         add r0, 1
  331.         jmp .loop
  332.     .exit:
  333.         pop r1
  334.         ret
  335.        
  336. output_str_opt:
  337.     push r1                             ;r0: string address
  338.     sub r0,1
  339.     .loop:
  340.         add r0, 1
  341.         mov r1, [r0]
  342.         send r10, r1
  343.         jnz .loop
  344.     .exit:
  345.         pop r1
  346.         ret
  347.  
  348. o_hex:
  349.     push r1                             ;r0: number to display
  350.     mov r1, .str
  351.     call bin2hex
  352.     push r0
  353.     mov r0, .str
  354.     call output_str
  355.     pop r0
  356.     pop r1
  357.     ret
  358.     .str:
  359.         dw 0, 0, 0, 0, 0
  360.  
  361. bin2hex:
  362.     push r2
  363.     push r3
  364.     mov r3, .hexdata                    ;r0: target number
  365.     mov r2, r0                          ;r1: string space (5 cells)
  366.     and r2, 0xF000
  367.     shr r2, 12
  368.     mov r2, [r2+r3]
  369.     mov [r1], r2
  370.     mov r2, r0
  371.     and r2, 0x0F00
  372.     shr r2, 8
  373.     mov r2, [r2+r3]
  374.     mov [r1+1], r2
  375.     mov r2, r0
  376.     and r2, 0x00F0
  377.     shr r2, 4
  378.     mov r2, [r2+r3]
  379.     mov [r1+2], r2
  380.     mov r2, r0
  381.     and r2, 0x000F
  382.     mov r2, [r2+r3]
  383.     mov [r1+3], r2
  384.     mov [r1+4], 0
  385.     pop r3
  386.     pop r2
  387.     ret
  388.     .hexdata:
  389.         dw "0123456789ABCDEF"
  390.        
  391. clear_screen:
  392.     push r0
  393.     mov r0, 0x1000
  394.     shl [.point], 4
  395.     add [.point], r0
  396.     pop r0
  397.     send r10, [.point]
  398.     send r10, [terminal_color]
  399.     .loop:     
  400.         send r10, 0x20
  401.         send r10, 0x20
  402.         send r10, 0x20
  403.         send r10, 0x20
  404.         send r10, 0x20
  405.         send r10, 0x20
  406.         send r10, 0x20
  407.         send r10, 0x20
  408.         send r10, 0x20
  409.         send r10, 0x20
  410.         send r10, 0x20
  411.         send r10, 0x20
  412.         send r10, 0x20
  413.         send r10, 0x20
  414.         send r10, 0x20
  415.         send r10, 0x20
  416.         sub [.lines], 1
  417.         jnz .loop
  418.     .exit:
  419.         mov [.point], 0
  420.         mov [.lines], 12
  421.         ret
  422.     .point:
  423.         dw 0
  424.     .lines:
  425.         dw 12
  426.        
  427. clear_line:
  428.     send r10, 0x20
  429.     send r10, 0x20
  430.     send r10, 0x20
  431.     send r10, 0x20
  432.     send r10, 0x20
  433.     send r10, 0x20
  434.     send r10, 0x20
  435.     send r10, 0x20
  436.     send r10, 0x20
  437.     send r10, 0x20
  438.     send r10, 0x20
  439.     send r10, 0x20
  440.     send r10, 0x20
  441.     send r10, 0x20
  442.     send r10, 0x20
  443.     send r10, 0x20
  444.     ret
  445.  
  446. ;C_base external functions
  447.  
  448. ;C_base variables
  449.  
  450. Cbase_end:
  451.    
  452. main:
  453. C_UI:                       ;C-UI : WIP
  454.     mov [.crnt_cursor], 0
  455.     mov [.prev_cursor], 0
  456.     call .show_page
  457.     call .move_cursor
  458.     .mloop:
  459.     call .input
  460.     call .move_cursor
  461.     jmp .mloop
  462.    
  463. .crnt_cursor:
  464.     dw 0
  465. .prev_cursor:
  466.     dw 0
  467.    
  468. .show_page:
  469.     mov r2, program_titles
  470.     mov r0, [r2]
  471.     .loop:
  472.         jz .next
  473.         call output_str_opt
  474.         add r2, 1
  475.         mov r0, [r2]
  476.         jmp .loop
  477.     .next:
  478.         ret
  479.        
  480. .move_cursor:
  481.     mov r0, [.prev_cursor]
  482.     add r0, program_titles
  483.     mov r0, [r0]
  484.     mov r0, [r0]
  485.     sub r0, 1
  486.     send r10, r0
  487.     send r10, 0x20
  488.     mov r0, [.crnt_cursor]
  489.     add r0, program_titles
  490.     mov r0, [r0]
  491.     mov r0, [r0]
  492.     sub r0, 1
  493.     send r10, r0
  494.     send r10, 194
  495.     ret
  496.    
  497.    
  498.    
  499. .input:
  500.     call input_char
  501.     cmp r0, 'w'
  502.     je .up
  503.     cmp r0, 's'
  504.     je .down
  505.     cmp r0, 13
  506.     je .enter
  507.     jmp .input
  508.  
  509. .up:
  510.     mov r0, [.crnt_cursor]
  511.     cmp r0, 0
  512.     je .input
  513.    
  514.     mov [.prev_cursor], r0
  515.     sub [.crnt_cursor], 1
  516.     ret
  517. .down:
  518.     mov r0, [.crnt_cursor]
  519.     cmp r0, 1
  520.     je .input
  521.    
  522.     mov [.prev_cursor], r0
  523.     add [.crnt_cursor], 1
  524.     ret
  525.    
  526. .enter:
  527.     mov r0, [.crnt_cursor]
  528.     add r0, program_addr
  529.     jmp [r0]
  530.  
  531. program_addr:
  532.     dw Test, Config, 0
  533. program_titles:
  534.     dw .title0, .title1, 0
  535.     .title0:
  536.         dw 0x1044, "MARS_t", 0
  537.     .title1:
  538.         dw 0x1064, "Config", 0
  539.  
  540.  
  541.        
  542. Test:
  543. MARS_:
  544.     call clear_screen
  545.     bump r10
  546.     mov r0, .data
  547.     call output_str_opt
  548.     mov r0, .map
  549.     call draw_map
  550.     call draw_char
  551.     .loop:
  552.         call CA_input
  553.         call draw_char
  554.         bump r10
  555.         jmp .loop
  556.     call pause
  557.     call shutdown
  558.    
  559.     .data:
  560.         dw 0x1008, 218, 0x1018, 218, 0x1028, 218, 0x1038, 218, 0x1048, 218, 0x1058, 218, 0x1068, 218, 0x1078, 218
  561.         dw 0x1080, 217, 217, 217, 217, 217, 217, 217, 217, 227, 217, 217, 217, 217, 217, 217, 217
  562.         dw 0x1009, 'H', 0x7F, 0x7F, 0x20, 'E', 0x7F,0x7F, 0x1019, 'T', 0x7F, 0x7F, 0x20, 'F', 0x7F, 0x7F, 0
  563.     .map:
  564.         dw "+++   ++"
  565.         dw "++     +"
  566.         dw "        "
  567.         dw "       +"
  568.         dw "###     "
  569.         dw "|B|  C  "
  570.         dw "     +++"
  571.         dw "   +++++"
  572.  
  573. draw_map:
  574.     mov r1, 0x1000
  575.     .loop:
  576.         send r10, r1
  577.         send r10, [r0]
  578.         send r10, [r0+1]
  579.         send r10, [r0+2]
  580.         send r10, [r0+3]
  581.         send r10, [r0+4]
  582.         send r10, [r0+5]
  583.         send r10, [r0+6]
  584.         send r10, [r0+7]
  585.         add r1, 0x0010
  586.         add r0, 8
  587.         cmp r1, 0x1080
  588.         jne .loop
  589.     .exit:
  590.         ret
  591. }
  592. draw_char:
  593.     mov r0, char_pos
  594.     mov r2, [r0+1]
  595.     mov r1, crnt_map_addr
  596.     add r1, r2
  597.     or r2, 0x1000
  598.     send r10, r2
  599.     send r10, [r1]
  600.    
  601.     mov r2, [r0]
  602.     or r2, 0x1000
  603.     send r10, r2
  604.     send r10, 174
  605.     ret
  606.  
  607. CA_char_up:
  608.     mov r0, char_pos
  609.     mov r1, [r0]
  610.     mov [r0+1], r1
  611.     sub [r0], 16
  612.     ret
  613. CA_char_down:
  614.     mov r0, char_pos
  615.     mov r1, [r0]
  616.     mov [r0+1], r1
  617.     add [r0], 16
  618.     ret
  619. CA_char_left:
  620.     mov r0, char_pos
  621.     mov r1, [r0]
  622.     mov [r0+1], r1
  623.     sub [r0], 1
  624.     ret
  625. CA_char_right:
  626.     mov r0, char_pos
  627.     mov r1, [r0]
  628.     mov [r0+1], r1
  629.     add [r0], 1
  630.     ret
  631.  
  632. CA_input:
  633.     bump r10
  634.     recv r0, r10
  635.     jc .go
  636.     recv r0, r10
  637.     jc .go
  638.     recv r0, r10
  639.     jc .go
  640.     recv r0, r10
  641.     jc .go
  642.     jmp .exit
  643.     .go:
  644.     .little:
  645.         sub r0, 'a'
  646.     .recognize:
  647.         add r0, .keybinding
  648.         call [r0]
  649.         hlt
  650.     .exit:
  651.         ret
  652.  
  653.     .keybinding:
  654.         dw CA_char_left;a
  655.         dw .exit    ;b
  656.         dw .exit    ;c
  657.         dw CA_char_right;d
  658.         dw .exit    ;e
  659.         dw .exit    ;f
  660.         dw .exit    ;g
  661.         dw .exit    ;h
  662.         dw .exit    ;i
  663.         dw .exit    ;j
  664.         dw .exit    ;k
  665.         dw .exit    ;l
  666.         dw .exit    ;m
  667.         dw .exit    ;n
  668.         dw .exit    ;o
  669.         dw .exit    ;p
  670.         dw .exit    ;q
  671.         dw .exit    ;r
  672.         dw CA_char_down;s
  673.         dw .exit    ;t
  674.         dw .exit    ;u
  675.         dw .exit    ;v
  676.         dw CA_char_up;w
  677.         dw .exit    ;x
  678.         dw .exit    ;y
  679.         dw .exit    ;z
  680.  
  681. ;global variables @ project_c
  682.  
  683. char_pos:
  684.     dw 0x0033
  685. prev_char_pos:
  686.     dw 0x0033
  687. game_time:
  688.     dw 0;
  689. crnt_map:
  690.     dw 0
  691. crnt_map_addr:
  692.     dw MARS_.map
  693. Config:
  694.     mov r0, .str
  695.     call output_str
  696.     call shutdown
  697.     .str: dw 0x1000, "Config", 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement