← 목록
기타 2026-06-21 3KB 읽기 3분

지구셀 WASM — 임의 좌표 입력 경로 추가

개요

기존 지구셀.wasm은 main()을 한 번 실행해 서울 하드코딩 좌표만 검증 가능했음. wasm_in 버퍼 직렬화(Method A)로 브라우저가 임의 (lat,lon,alt,depth)를 WASM(트릿 VM)에 넘겨 셀번호열을 계산하게 함.

방법 선택: Method A (wasm_in 버퍼)

  • platform_wasm.c에 이미 wasm_in 버퍼 + wasm_set_input() export + rt_getchar() 훅이 완비됨
  • 한선씨 입력() opcode(case 325)가 rt_getchar() → wasm_in 을 읽음
  • 새 진입점 한선씨 파일이 4줄(lat/lon/alt/depth)을 입력()으로 읽어 트릿셀_인코딩() 호출

무엇을 했는지

신규 파일

  • /Users/ef/CrownyOS/crownyc/libs/지구셀_입력.한선 — 임의 좌표 WASM 진입점
  • 입력() 4회로 lat/lon/alt/depth 읽기 → 트릿셀_인코딩() → 셀번호 줄 단위 출력
  • /Users/ef/CrownyOS/시작화면/지구셀.wasm — 새 WASM (115,973 bytes, 지구셀_입력.한선 빌드)
  • 수정 파일

  • /Users/ef/CrownyOS/시작화면/geocell-wasm.js — encodeWASM() 추가
  • wasm_in 버퍼에 "lat\nlon\nalt\ndepth\n" 쓰기 → wasm_reset() → wasm_set_input(n) → wasm_run()
  • wasm_out 버퍼 읽어 셀번호 배열 반환
  • WASM 실패 시 JS 폴백(encodeJS)
  • 검증 결과 (WASM vs JS 일치표)

    5개 도시 × 깊이 1~8 = 40건 전체 PASS.

    도시깊이1깊이2깊이3깊이4깊이5깊이6깊이7깊이8
    서울2441611011325
    뉴욕18713162513138
    도쿄244725162552
    런던21134422418
    시드니6251916422719

    브라우저 통합 스니펫

    html<script src="geocell.js"></script>
    <script src="geocell-wasm.js"></script>
    <script>
    GeoCell.ready.then(() => {
      // WASM 우선 (실패 시 JS 폴백 자동)
      const cells = GeoCell.encode(37560000, 126990000, 0, 6);
      // cells = [24, 4, 16, 1, 10, 1]
      const addr = cells.map(GeoCell.cellChar).join('');
      // addr = "UEQBKB"
    });
    </script>
    

    트릿 실행 성격

    • WASM 내부: toau2c가 TOAU(4상균형3진 ISA729 기계어)를 C로 트랜스파일
    • runtime_mcu.c의 트릿 VM이 큐브(27트릿) 단위 연산 수행
    • 나눗셈은 균형3진 자연반올림(cube_divmod), 논리는 Kleene 3값
    • 트릿 테이블(CUBES[1341*27])이 WASM 선형메모리에 상주

    잔여 이슈

    • 없음 (JS 폴백 포함 완전 동작)
    • 깊이 >8 미테스트 (지구셀.한선 한계 없음, 실용 최대 깊이 ~12)
    • 음수 경도(뉴욕 등) 정상 동작 확인됨