상위 질문
타임라인
채팅
관점

코모도어 베이직

위키백과, 무료 백과사전

Remove ads

코모도어 베이직(Commodore BASIC) 또는 PET 베이직(PET BASIC) 또는 CBM-베이직(CBM-BASIC)은 코모도어 인터내셔널8비트 가정용 컴퓨터 라인에서 사용된 베이직 프로그래밍 언어방언으로, PET (1977)부터 코모도어 128 (1985)까지 이어진다.

간략 정보 설계자, 개발자 ...

핵심은 6502 마이크로소프트 베이직을 기반으로 하며, 따라서 애플소프트 베이직과 같이 당시의 다른 6502 베이직과 많은 특징을 공유한다. 코모도어는 1977년 빌 게이츠의 단위당 $3의 수수료 제안을 잭 트라미엘이 "나는 이미 결혼했다"며 거절하고, 영구 라이선스에 대해 $25,000 이상을 지불하지 않겠다고 밝힌 후, "한 번 지불, 로열티 없음"을 기반으로 마이크로소프트로부터 베이직 라이선스를 얻었다.[1]

원래 PET 버전은 거의 수정 없이 원래의 마이크로소프트 구현과 매우 유사했다. C64의 베이직 2.0도 유사했으며, C128 (C64 모드) 및 다른 모델에서도 볼 수 있었다. 이후 PET에서는 베이직 4.0이 탑재되었는데, 이는 원래 버전과 유사하지만 플로피 디스크 작업을 위한 여러 명령이 추가되었다.

베이직 3.5는 C16플러스/4에서 그래픽 및 사운드 지원을 위한 여러 명령을 추가하면서 처음으로 크게 달라졌다. 베이직 7.0은 코모도어 128에 포함되었으며, 플러스/4의 베이직 3.5에서 가져온 구조적 프로그래밍 명령과 기기의 새로운 기능을 활용하기 위해 특별히 설계된 키워드를 포함했다. 스프라이트 편집기와 기계어 모니터가 추가되었다. 마지막 버전인 베이직 10.0은 미출시된 코모도어 65의 일부였다.

Remove ads

역사

코모도어는 일괄 요금 베이직의 소스 코드를 가져와서 모든 다른 8비트 가정용 컴퓨터를 위해 내부적으로 추가 개발했다. 코모도어 128 (V7.0 포함)에 이르러서야 마이크로소프트 저작권 고지사항이 표시되었다. 그러나 마이크로소프트는 버전 2 또는 "업그레이드" 코모도어 베이직에 그 출처를 증명하는 이스터 에그를 숨겨 놓았다. `WAIT 6502, 1` 명령을 입력하면 화면에 `Microsoft!`가 나타났다. (이스터 에그는 잘 난독화되어 있었으며, 메시지는 인터프리터의 어떤 역어셈블에서도 나타나지 않았다.)[2]

인기 있는 코모도어 64는 버전 4.0이 탑재된 PET/CBM 시리즈보다 늦게 출시되었음에도 불구하고 ROM에 베이직 v2.0이 함께 제공되었다. 이는 64가 가정용 컴퓨터로 의도된 반면, PET/CBM 시리즈는 내장 프로그래밍 언어가 더 많이 사용될 것으로 예상되는 비즈니스 및 교육용으로 개발되었기 때문이었다. 이는 V2가 더 작은 ROM에 들어갈 수 있어 제조 비용을 절감했다.

Remove ads

기술적 세부 사항

요약
관점

프로그램 편집

코모도어의 ROM 내장 베이직 인터프리터 및 KERNAL의 편리한 기능은 전체 화면 편집기였다.[3][4] 코모도어 키보드는 시프트 키를 누르면 방향이 반전되는 두 개의 커서 키만 가지고 있었지만, 화면 편집기를 통해 사용자는 화면의 어느 곳에서나 직접 명령을 입력하거나 프로그램 라인을 입력하고 편집할 수 있었다. 라인 앞에 라인 번호가 붙어 있으면, 해당 라인은 토큰화되어 프로그램 메모리에 저장되었다. 번호로 시작하지 않는 라인은 커서가 라인 위에 있을 때 RETURN 키를 누르면 실행되었다. 이는 당시 일반적으로 별도의 `EDIT` 명령이나 커서 위치에서 라인을 자르는 "복사 커서"를 사용하는 라인 편집기를 사용하던 다른 일반 가정용 컴퓨터 베이직에 비해 프로그램 입력 인터페이스에서 상당한 개선을 의미했다.

또한, 카세트를 포함한 모든 장치에 명명된 파일을 저장하는 기능도 있었다. 카세트는 PET 시절에 인기 있는 저장 장치였으며, 8비트 코모도어의 수명 기간 동안 저렴한 대용량 저장 장치로 계속 사용되었다. 대부분의 시스템은 디스켓에만 파일 이름을 지원하여 다른 장치에 여러 파일을 저장하기 더 어렵게 만들었다. 이러한 다른 시스템의 사용자는 파일 위치에서 레코더의 카운터 표시를 기록해야 했지만, 이는 부정확하고 오류가 발생하기 쉬웠다. PET (및 베이직 2.0)에서는 카세트에서 파일을 이름으로 요청할 수 있었다. 장치는 데이터를 순차적으로 읽으면서 일치하지 않는 파일 이름을 무시하고 파일 이름을 검색했다. 파일 시스템은 또한 파일로 로드하거나 저장할 수 있는 강력한 레코드 구조에 의해 지원되었다. 코모도어 카세트 데이터는 다른 제조업체에서 사용하는 저렴한 (그리고 신뢰할 수 없는) 아날로그 방식이 아닌 디지털 방식으로 기록되었다. 따라서 표준 테이프 레코더 대신 특수 데이터세트가 필요했다. 아날로그-디지털 변환회로를 사용하여 표준 레코더를 사용할 수 있게 해주는 어댑터도 있었지만, 이들은 데이터세트보다 가격이 약간 저렴할 뿐이었다.

LOAD 명령은 선택적 매개변수 ,1과 함께 사용될 수 있으며, 이 경우 파일의 첫 두 바이트에 포함된 메모리 주소로 프로그램을 로드한다 (이 바이트는 버려지며 메모리에 유지되지 않는다). 만약 ,1 매개변수가 사용되지 않으면, 프로그램은 베이직 프로그램 영역의 시작 부분으로 로드되는데, 이는 기기마다 크게 다르다. 일부 코모도어 베이직 변형은 애플소프트 베이직의 해당 명령처럼 작동하여 지정된 메모리 위치에서 비트맵을 로드하거나 저장하는 BLOADBSAVE 명령을 제공했다.

PET는 재배치 가능한 프로그램을 지원하지 않으며 LOAD 명령은 항상 프로그램 파일에 포함된 처음 두 바이트로 로드된다. 이는 다른 코모도어 기기에 저장된 베이직 프로그램을 로드할 때 문제가 발생했다. PET의 베이직이 프로그램을 예상하는 주소보다 더 높은 주소로 로드될 수 있었기 때문이며, 프로그램을 적절한 위치로 "이동"하는 해결책이 있었다. 만약 프로그램이 CBM-II 기기에 저장되었다면, PET에서 로드하는 유일한 방법은 디스크 섹터 편집기로 첫 두 바이트를 수정하는 것이었다. CBM-II 시리즈는 베이직 프로그램 영역이 $0에 있었고, 이는 PET가 제로 페이지로 로드하여 잠기는 결과를 초래할 수 있었기 때문이다.

코모도어 베이직 키워드는 먼저 시프트되지 않은 키를 누른 다음 다음 글자의 시프트된 키를 눌러 약어로 입력할 수 있었다. 이렇게 하면 하이 비트가 설정되어, 인터프리터가 읽기를 멈추고 순람표에 따라 문장을 구문 분석하게 했다. 이는 하이 비트가 설정된 부분까지의 문장이 전체 명령을 입력하는 대신 대체로 허용되었음을 의미했다. 그러나 모든 베이직 키워드는 메모리에 단일 바이트 토큰으로 저장되었으므로, 이는 최적화라기보다는 문장 입력을 위한 편의 기능이었다.

기본 대문자 전용 문자 세트에서, 시프트된 문자는 그래픽 기호로 나타났다. 예를 들어, `GOTO` 명령은 `G{Shift-O}` (화면에는 `GΓ`와 비슷하게 보임)로 약어화될 수 있었다. 대부분의 이러한 명령은 두 글자 길이었지만, 일부 경우에는 더 길었다. 이런 경우 모호성이 있었으므로, `GOSUB`을 위해서는 `GO{Shift-S}` (`GO♥`)와 같이 시프트되지 않은 글자가 더 필요했다. 일부 명령은 간결성이나 다른 명령과의 모호성 때문에 약어 형태가 없었다. 예를 들어, `INPUT` 명령은 별도의 `INPUT#` 키워드와 철자가 충돌하여 약어가 없었는데, `INPUT#` 키워드는 키워드 순람표의 시작 부분에 더 가까이 위치해 있었다. 많이 사용되는 `PRINT` 명령은 대부분의 마이크로소프트 베이직 방언에서 흔히 볼 수 있는 단일 `?` 단축키를 가지고 있었다. 시프트된 글자로 명령을 약어화하는 것은 코모도어 베이직에 고유한 기능이다.

이 토큰화 방식에는 버그가 있었는데, `REM` (코드에 주석을 추가하는 베이직 명령) 뒤에 `SHIFT-L`을 포함하면, 프로그램 목록을 보려고 할 때 베이직 인터프리터가 즉시 목록을 중단하고 `?SYNTAX ERROR`를 표시하며 `READY.` 프롬프트로 돌아갔다. 이 버그는 프로그래머들이 자신의 작업을 보호하려는 목적으로 어느 정도 사용되었지만, 피하기는 상당히 쉬웠다.

키워드를 약어화함으로써 단일 프로그램 라인에 더 많은 코드를 담을 수 있었다 (40열 디스플레이에서는 두 화면 라인, 즉 C64 또는 PET, VIC-20의 22열 디스플레이에서는 네 라인을 차지할 수 있었다). 이는 그렇지 않으면 필요한 추가 프로그램 라인을 저장하는 오버헤드를 약간 절약할 수 있게 했지만, 그 이상은 아니었다. 모든 베이직 명령은 토큰화되어 입력 방식에 관계없이 메모리에서 1바이트 (베이직 7 또는 베이직 10의 여러 명령의 경우 2바이트)를 차지했다. 이러한 긴 라인은 편집하기에 불편했다. `LIST` 명령은 전체 명령 키워드를 표시하여, 프로그램 라인을 프로그램 메모리에 입력할 수 있는 2개 또는 4개 화면 라인 이상으로 확장했다.

성능

원래 마이크로소프트 베이직 인터프리터와 마찬가지로, 코모도어 베이직은 네이티브 기계어보다 느리다. 테스트 결과에 따르면 ROM에서 RAM으로 16 킬로바이트를 복사하는 데 기계어로는 1초 미만이 걸리는 반면, 베이직으로는 1분 이상이 걸린다. 인터프리터보다 빠르게 실행하기 위해 프로그래머들은 다양한 기술을 사용하여 실행 속도를 높이기 시작했다. 한 가지 방법은 자주 사용되는 부동 소수점 값을 리터럴 값으로 사용하는 대신 변수에 저장하는 것이었다. 이는 변수 이름을 해석하는 것이 리터럴 숫자를 해석하는 것보다 빠르기 때문이었다. 모든 명령의 기본 유형이 부동 소수점이기 때문에, 정수보다 부동 소수점 숫자를 인수로 사용하는 것이 더 빠르다. 속도가 중요할 때, 일부 프로그래머는 베이직 프로그램의 일부를 6502 또는 6510 어셈블리어로 변환하여 파일에서 별도로 로드하거나 베이직 프로그램 끝의 DATA 문에서 메모리에 POKE하여, 직접 모드에서 또는 프로그램 자체에서 SYS 명령을 사용하여 실행했다. 게임이나 사용자 입력을 기다리는 경우와 같이 기계어의 실행 속도가 너무 빠를 때는, 프로그래머들이 실행을 지연시키거나 중단하기 위해 선택된 메모리 위치(예: 64의 경우 $C6[5], 128의 경우 $D0[6]로 키보드 큐 크기를 나타냄)를 읽어서 폴링할 수 있었다.

코모도어 베이직의 독특한 특징은 화면 지우기나 프로그램 내에서 커서 위치 지정과 같은 작업을 수행하기 위해 제어 코드를 사용하는 것이다. 이들은 PRINT CHR$(X) 명령을 발행하여 호출할 수 있는데, 여기서 X는 발행할 제어 코드에 해당한다 (예를 들어, PRINT CHR$(147)은 화면을 지우는 제어 코드이다). 또는 따옴표 안에 해당 키를 눌러 호출할 수도 있는데, 따옴표 뒤에 ⇧ Shift+CLR HOME을 누르면 베이직이 제어 코드의 시각적 표현 (이 경우 뒤집힌 하트)을 표시하며, 이는 프로그램 실행 시 작동한다 (제어 코드를 직접 인쇄하는 것이 CHR$ 함수를 호출하는 것보다 메모리를 적게 사용하고 더 빠르게 실행된다). 이는 화면을 지우거나 커서를 이동하는 전용 명령이 있는 다른 베이직 구현과 비교된다.

베이직 3.5 이상은 화면을 지우고 커서를 이동하는 적절한 명령을 가지고 있다.

코모도어 베이직의 프로그램 라인은 어디에도 공백이 필요하지 않지만 (그러나 LIST 명령은 항상 라인 번호와 문장 사이에 공백을 표시한다), 예를 들어 100 IFA=5THENPRINT"YES":GOTO160과 같이 공백 없이 프로그램을 작성하는 것이 일반적이었다. 이 기능은 토크나이저가 키워드 사이에 삽입된 어떤 공백도 제거하지 않으므로 메모리를 절약하기 위해 추가되었다. 공백의 존재는 토큰화된 프로그램에 추가적인 0x20 바이트를 발생시키며, 이는 실행 중에 단순히 건너뛴다. 라인 번호와 프로그램 문장 사이의 공백은 토크나이저에 의해 제거된다.

프로그램 라인은 대부분의 기기에서 총 80자까지 가능하지만, 40열 텍스트를 사용하는 기기에서는 라인이 화면의 다음 줄로 넘어가고, 22열 디스플레이를 가진 VIC-20에서는 프로그램 라인이 최대 4줄까지 차지할 수 있었다. 코모도어 128의 베이직 7.0은 프로그램 라인 제한을 160자(40열 라인 4개 또는 80열 라인 2개)로 늘렸다. PRINT 대신 ?와 같은 약어를 사용하면 한 줄에 더 많은 내용을 담을 수 있다. 베이직 7.0은 사용자가 160자를 초과하는 프로그램 라인을 입력하면 ?STRING TOO LONG 오류를 표시한다. 이전 버전에서는 오류를 발생시키지 않고, 라인 길이가 초과되면 단순히 READY 프롬프트를 두 줄 아래에 표시한다. 라인 번호는 프로그램 라인의 문자 수에 포함되므로, 다섯 자리 라인 번호는 한 자리 번호보다 허용되는 문자가 네 개 적다.

코모도어 베이직 라인의 실행 순서는 라인 번호에 의해 결정되지 않았다; 대신, 메모리에 라인이 연결된 순서를 따랐다.[7] 프로그램 라인은 다음 프로그램 라인의 시작 주소를 포함하는 포인터, 라인 번호, 그리고 해당 라인의 토큰화된 코드와 함께 단일 연결 리스트로 메모리에 저장되었다. 프로그램이 입력되는 동안, 베이직은 라인 번호와 포인터가 모두 오름차순이 되도록 메모리에서 프로그램 라인을 지속적으로 재정렬했다. 그러나 프로그램이 입력된 후, POKE 명령으로 라인 번호와 포인터를 수동으로 변경하면 순서가 뒤섞인 실행이 가능하거나, 심지어 모든 라인에 동일한 라인 번호를 부여할 수도 있었다. 초창기에는 베이직이 상업적으로 사용될 때, 이는 프로그램의 우발적인 수정을 막기 위한 소프트웨어 보호 기술이었다.

라인 번호는 0에서 65520까지 가능하며, 몇 자리에 상관없이 저장하는 데 5바이트가 소요되지만, 자릿수가 적을수록 실행 속도는 빨라진다. 한 줄에 여러 문장을 넣으면 메모리 사용량이 줄어들고 실행 속도가 빨라진다.

GOTOGOSUB 문은 순방향 점프가 수행되는 경우 현재 라인에서 아래쪽으로 라인 번호를 검색하고, 역방향 점프의 경우 프로그램 시작으로 돌아가 검색을 시작한다. 이로 인해 큰 프로그램은 느려지므로, 자주 사용되는 서브루틴을 프로그램 시작 부분 가까이에 배치하는 것이 좋다.

변수 이름은 처음 2자만 유효하다. 따라서 변수 이름 VARIABLE1, VARIABLE2, VA는 모두 같은 변수를 지칭한다.

코모도어 베이직은 또한 (두 바이트, 부호 있는, 2의 보수) 비트 연산자 NOT, AND, OR를 지원한다. 이 기능은 마이크로소프트 6502 베이직 코드의 핵심 부분이었지만, 애플소프트 베이직과 같은 다른 구현에서는 일반적으로 생략되었다.

코모도어 베이직의 기본 숫자 형식은 부모인 MS 베이직과 마찬가지로 부동 소수점이었다. 대부분의 동시대 베이직 구현은 특성(지수)에 1바이트, 가수에 3바이트를 사용했다. 3바이트 가수를 사용하는 부동 소수점 숫자의 정밀도는 약 6.510진수에 불과하며, 반올림 오류가 흔히 발생한다. 마이크로소프트 베이직의 6502 구현은 40비트 부동 소수점 산술을 사용했는데, 이는 BASIC-80의 32비트 부동 소수점과 달리 변수가 5바이트(가수 4바이트, 지수 1바이트)를 저장했다는 의미이다.

8080/Z80 마이크로소프트 베이직 구현은 정수 및 배정밀도 변수를 지원했지만, 6502 구현은 부동 소수점만 지원했다.

코모도어 베이직은 퍼센트 기호로 표시되는 32768에서 32767 범위의 부호 있는 정수 변수를 지원하지만, 실제로는 배열 변수에만 사용되며 각 배열 요소를 2바이트로 제한하여 메모리를 절약하는 기능을 수행한다 (2000개 요소의 배열은 부동 소수점 배열로 선언하면 10,000바이트를 차지하지만, 정수 배열로 선언하면 4000바이트만 차지한다). 어떤 변수든 정수로 지정하면 베이직이 이를 다시 부동 소수점으로 변환하여 프로그램 실행 속도를 늦추고 각 퍼센트 기호가 추가로 1바이트를 저장하는 데 필요하므로 메모리를 낭비한다 (이는 정수 배열에도 적용되므로, 프로그래머는 매우 큰 배열이 부동 소수점으로 저장될 경우 사용 가능한 메모리를 초과하지 않는 한 사용을 피해야 한다). 또한, 주소가 부호 있는 정수로 정의된 경우 32767 이상의 메모리 위치를 POKE하거나 PEEK할 수 없다.

마침표(.)는 숫자 0 대신 사용될 수 있으며 (따라서 10 A=0 대신 10 A=. 또는 10 FOR A=0 to 100 대신 10 FOR A=. TO 100), 이는 약간 더 빠르게 실행된다.

USR 함수만을 통해 기계어 루틴을 호출하는 원래 마이크로소프트 베이직 코드에는 없었던 기계어 프로그램을 시작하는 데 사용되는 SYS 문은 코모도어에 의해 추가되었다. 이 명령은 CPU의 레지스터를 자동으로 $30C-$30F (C64, 다른 기기에서는 다름)에 있는 값으로 로드한다. 이는 기계어 루틴에 데이터를 전달하거나 베이직에서 커널 함수를 호출하는 수단으로 사용될 수 있다 (예를 들어, POKE 780,147:SYS 65490는 화면을 지운다).

C128을 제외한 코모도어 8비트 기기는 디스크 소프트웨어를 자동으로 부팅할 수 없으므로, 프로그램 실행을 시작하기 위해 10 SYS 2048와 같은 베이직 스텁을 포함하는 것이 일반적인 기술이다. 로드 후 소프트웨어를 자동으로 시작하고 사용자가 RUN 문을 입력할 필요가 없도록 하는 것도 가능하다. 이는 $0302에서 베이직 "ready" 벡터를 후킹하는 코드를 가짐으로써 수행된다.

다른 대부분의 마이크로소프트 베이직 버전과 마찬가지로, 배열이 DIM 문으로 선언되지 않으면 자동으로 10개 요소(실제로는 배열 요소가 0부터 세므로 11개)로 설정된다. 더 큰 배열은 선언되어야 하며, 그렇지 않으면 프로그램 실행 시 베이직이 오류를 표시하며, 모든 변수가 CLR 문을 통해 지워지지 않는 한 프로그램 내에서 배열을 재정의할 수 없다. 숫자 배열은 생성될 때 자동으로 0으로 채워지며, 큰 배열이 정의되면 프로그램 실행에 일시적인 지연이 발생할 수 있다.

문자열 변수는 변수 이름에 달러 기호를 붙여 표현된다. 따라서 변수 AA$, AA, AA%는 각각 별개의 것으로 이해된다. 배열 변수도 단순 변수와 구별되며, 따라서 AA(1)는 같은 변수를 참조하지 않는다. 문자열 배열의 크기는 배열에 저장된 문자열의 개수를 의미할 뿐, 동적으로 할당되는 각 요소의 크기는 아니다. 일부 다른 마이크로소프트 베이직 구현과 달리, 코모도어 베이직은 프로그램 시작 시 문자열 공간을 예약할 필요가 없다.

애플 II와 같은 다른 8비트 기기와 달리, 코모도어 기기들은 모두 전원 켜는 시점에 0으로 초기화되고 PIA/VIA/TED/CIA 타이머의 각 틱마다 초당 60회 업데이트되는 내장 시계를 가지고 있다. 이는 베이직에서 TITI$라는 두 개의 시스템 변수에 할당되며, 둘 다 현재 시간을 포함한다. TI는 읽기 전용이며 수정할 수 없다; 수정하려고 하면 구문 오류 메시지가 표시된다. TI$는 6자리 숫자 문자열을 통해 시간을 설정하는 데 사용될 수 있다 (6자리 숫자가 아닌 문자열을 사용하면 오류가 발생한다). 시계는 일부 커널 루틴에 의해 인터럽트가 꺼질 때마다 멈추고 IEC (또는 PET의 IEEE 포트) 포트에 접근하면 시계 업데이트가 몇 틱 느려지므로, 시간 기록에 매우 신뢰할 수 있는 방법은 아니다.

코모도어 베이직의 RND 함수는 시계를 사용하여 난수를 생성할 수 있다. 이는 RND(0)을 통해 이루어지지만, 0에서 255 사이의 숫자만 반환되므로 활용도가 상대적으로 제한적이다. 그 외에는 RND는 다른 마이크로소프트 베이직 구현과 동일하게 작동하는데, C64의 메모리 위치 $8B-$8F에 전원 켤 때 저장된 고정된 5바이트 시드 값을 통해 의사 난수 시퀀스를 사용한다 (위치는 다른 기기마다 다르다). 0보다 큰 어떤 숫자와 함께 RND를 사용하면 RND 함수에 포함된 값과 현재 시드 값을 합쳐서 난수를 생성하며, 시드 값은 RND 함수가 실행될 때마다 1씩 업데이트된다. 음수와 함께 RND를 사용하면 숫자로 지정된 현재 시드 값의 시퀀스 내 특정 지점으로 이동한다.

RND 문으로는 진정한 난수 생성이 불가능하므로, C64 및 C128에서는 SID 칩의 화이트 노이즈 채널을 난수 생성에 활용하는 것이 더 일반적이다.

베이직 2.0은 문자열의 매우 느린 가비지 컬렉션으로 악명이 높았다. 가비지 컬렉션은 FRE 함수가 실행될 때마다 자동으로 호출되며, 프로그램 실행 과정에서 많은 문자열 변수와 배열이 조작되었다면, 최악의 조건에서 이들을 정리하는 데 한 시간 이상이 걸릴 수 있다. 또한, 베이직은 이 루틴을 수행하는 동안 RUN/STOP 키를 스캔하지 않으므로 가비지 컬렉션을 중단하는 것도 불가능하다. 베이직 4.0은 백 포인터가 있는 개선된 가비지 컬렉션 시스템을 도입했으며, 이후의 모든 코모도어 베이직 구현도 이를 포함한다.

베이직 2.0의 FRE 함수는 32768을 초과하는 부호 있는 숫자를 처리할 수 없는 또 다른 기술적 결함을 겪었다. 따라서 C64(38k 베이직 메모리)에서 이 함수를 호출하면 음수 크기의 여유 베이직 메모리가 표시되었다 (보고된 숫자에 65535를 더하면 정확한 여유 메모리 양을 얻을 수 있다). PET와 VIC-20은 베이직에서 사용할 수 있는 총 메모리가 32k를 넘지 않았으므로, 이 제한은 C64가 개발될 때까지 명확히 드러나지 않았다. 베이직 3.5 및 7.0의 FRE 함수는 이 문제를 수정했으며, 베이직 7.0의 FRE는 또한 두 가지 기능으로 "분할"되었다. 하나는 여유 베이직 프로그램 텍스트 메모리를 표시하고, 다른 하나는 여유 변수 메모리를 표시했다.

Remove ads

대안

요약
관점
Thumb
사이먼 베이직 시작 화면

코모도어 64는 기본 베이직 2.0의 기능이 상대적으로 제한적이었기 때문에 많은 베이직 확장팩이 출시되었다. 가장 인기 있는 확장팩 중 하나는 코모도어 1541 테스트/데모 디스크에 포함된 DOS 웨지였다. 이 1KB 확장팩은 메모리의 프로그램을 손상시키지 않고 디스크 디렉토리를 읽는 기능을 포함하여 여러 디스크 관련 명령을 추가했다. 그 기능은 이후 인기 있는 Epyx FastLoad 카트리지와 같은 다양한 서드파티 확장팩에 통합되었다. 다른 베이직 확장팩은 사이먼 베이직 (1983) 및 비전 베이직 (2022)과 같이 스프라이트, 사운드, 고해상도 그래픽을 더 쉽게 코딩할 수 있도록 추가 키워드를 추가했다.

베이직 2.0의 사운드 또는 그래픽 기능 부족이 많은 사용자에게는 실망스러웠지만, 일부 비평가[누가?]는 궁극적으로 사용자에게 기계어를 배우도록 강요했기 때문에 유익했다고 주장했다.

C64의 베이직 2.0의 한계로 인해 베이직에서 내장 ROM 기계어를 사용하게 되었다. 지정된 메모리 위치에 파일을 로드하려면, 파일 이름, 드라이브, 장치 번호가 호출에 의해 읽혀진다: SYS57812"filename",8;[8] 위치는 X 및 Y 레지스터에 지정된다: POKE780,0:POKE781,0:POKE782,192;[9] 그리고 로드 루틴이 호출된다: SYS65493.[10]

C64용 디스크 매거진인 로드스타는 취미 프로그래머들을 위한 장소였으며, 그들은 SYS address + offset 명령으로 호출되는 베이직용 프로토-명령어 모음을 공유했다.

현대 프로그래밍 관점에서, 코모도어 베이직의 초기 버전은 프로그래머에게 많은 나쁜 프로그래밍 함정을 제공했다. 이러한 문제의 대부분은 마이크로소프트 베이직에서 파생되었으므로, 당시의 거의 모든 가정용 컴퓨터 베이직이 유사한 결함을 겪었다.[11] 마이크로소프트 베이직 프로그램의 모든 라인에는 프로그래머가 줄 번호를 할당했다. 프로그램 편집 또는 디버깅 중 라인을 쉽게 삽입할 수 있도록 숫자를 일정 값(5, 10 또는 100)으로 증분하는 것이 일반적인 관행이었지만, 잘못된 계획은 프로그램에 큰 섹션을 삽입할 때 전체 코드를 재구성해야 하는 경우가 많다는 것을 의미했다. 일반적인 기술은 낮은 줄 번호에서 ON...GOSUB 점프 테이블로 프로그램을 시작하고, 프로그램 본문은 1000, 2000 등과 같은 지정된 줄 번호로 시작하는 섹션으로 구성하는 것이었다. 큰 섹션을 추가해야 하는 경우, 다음 사용 가능한 주요 줄 번호를 할당하고 점프 테이블에 삽입할 수 있었다.

게다가 모든 변수는 전역 변수로 취급된다. FOR...NEXT 구문 이상의 명확하게 정의된 루프는 만들기가 어려워, 종종 프로그래머가 GOTO 명령에 의존하게 만들었다 (이는 나중에 베이직 3.5에서 DO, LOOP, WHILE, UNTILEXIT 명령이 추가되면서 수정되었다). 특정 작업을 수행하기 위해 플래그 변수를 생성해야 하는 경우가 많았다.

코모도어 및 기타 플랫폼의 후기 베이직 버전에는 DELETERENUMBER 명령과 선택된 증분에 따라 라인 번호를 자동으로 선택하고 삽입하는 AUTO 라인 번호 지정 명령이 포함되었다. 코모도어의 초기 베이직은 디버깅 명령도 부족하여 버그와 사용되지 않는 변수를 찾아내기 어려웠다. Z80 마이크로소프트 베이직의 표준 부분이었던 IF...THEN...ELSE 구조는 코모도어 베이직의 이전 버전에서는 사용할 수 없었다가 베이직 3.5에 추가되었다.

사용자 인터페이스로서의 활용

다른 가정용 컴퓨터와 마찬가지로, 코모도어의 기기들은 베이직 인터프리터로 직접 부팅되었다. 베이직의 파일 및 프로그래밍 명령은 직접 모드로 입력하여 소프트웨어를 로드하고 실행할 수 있었다. RUN/STOP 키를 사용하여 프로그램 실행이 중단되면, 변수 값은 RAM에 보존되었고 디버깅을 위해 PRINT할 수 있었다. 128은 심지어 두 번째 64k 뱅크를 변수 저장 공간으로 할당하여, `NEW` 또는 `RUN` 명령이 발행될 때까지 값이 유지되도록 했다. 이는 코모도어 베이직에 포함된 고급 화면 편집기와 함께 프로그래밍 환경에 REPL과 유사한 느낌을 주었다. 프로그래머는 화면의 어느 위치에서든 프로그램 라인을 삽입하고 편집하며, 대화식으로 프로그램을 구축할 수 있었다.[12] 이는 당시의 CP/M이나 MS-DOS와 같이 일반적으로 명령줄 인터페이스로 부팅되던 비즈니스 지향 운영 체제와 대조된다. 이러한 플랫폼에서 프로그래밍 언어가 필요한 경우, 별도로 로드해야 했다.

코모도어 베이직의 일부 버전에는 디스크별 `DLOAD` 및 `DSAVE` 명령이 포함되어 있었지만, 코모도어 64에 내장된 버전에는 이러한 기능이 없었다. 이는 사용자가 표준 `LOAD` 명령에 디스크 드라이브의 장치 번호 (일반적으로 8 또는 9)를 지정해야 했으며, 그렇지 않으면 기본적으로 테이프로 설정되었다. 코모도어 64의 베이직 2.0에서 또 다른 누락은 메인 메모리를 지우지 않고 디스크 내용을 표시하는 `DIRECTORY` 명령이었다. 64에서는 디스크의 파일을 보는 것이 "프로그램"을 로드하는 방식으로 구현되었는데, 이 프로그램은 목록화될 때 디렉토리를 라인 번호로 파일의 블록 크기를 가진 의사 베이직 프로그램으로 표시했다. 이는 현재 로드된 프로그램을 덮어쓰는 효과를 가졌다. DOS 웨지와 같은 추가 기능은 디렉토리 목록을 화면 메모리에 직접 렌더링함으로써 이를 극복했다.

Remove ads

예시 코드

10 rem cbm basic v2 example
20 rem comment with keywords: for, data
30 dim a$(20)
35 rem the typical space efficient form of leaving spaces out:
40 fort=0to15:poke646,t:print"{revers on}     ";:next
50 geta$:ifa$=chr$(0):goto40
55 rem it is legal to omit the closing " on line end
60 print"{white}":print"bye...
70 end

[13]

버전 및 기능

요약
관점

CBM 베이직 버전 목록을 시간 순서대로 나열하며, 점진적으로 추가된 기능은 다음과 같다.

출시된 버전

  • V1.0: 치클릿 키보드 및 내장 데이터세트가 있는 PET 2001 (원래 PET)
    • 배열이 256개 요소로 제한됨
    • PEEK 명령이 $C000 이상의 베이직 ROM 위치에서 명시적으로 비활성화됨
  • V2.0 (첫 번째 출시): 풀 트래블 키보드 및 업그레이드 ROM이 있는 PET 2001
    • IEEE-488 지원 추가
    • 가비지 컬렉션 개선[14]
    • 배열 버그 수정
    • 이스터 에그 – WAIT6502, [number]를 입력하면 MICROSOFT!가 임의의 횟수만큼 표시됨
  • V4.0: PET/CBM 4000/8000 시리즈 (및 후기 버전 PET 2001)
    • 디스크 작업: DLOAD,DSAVE,COPY,SCRATCH, 등 (총 15개)
    • 디스크 오류 채널 변수: DS,DS$
    • 가비지 컬렉션 성능 대폭 향상[14]
  • V2.0 (두 번째 출시, 4.0 이후): VIC-20; C64
  • V2.2 C64GS (1990)
  • V4+: CBM-II 시리즈 (일명 B, P 범위)
    • 메모리 관리: BANK
    • 더 많은 디스크 작업: BLOAD, BSAVE,DCLEAR
    • 서식 있는 인쇄: PRINT USING,PUDEF
    • 오류 트래핑: DISPOSE
    • 대체 분기: ELSE
    • 동적 오류 처리: TRAP,RESUME,ERR$()
    • 유연한 DATA 읽기: `RESTORE [line number]`
    • 문자열 검색 함수: INSTR
  • V3.5: C16/116, 플러스/4
    • 사운드 및 그래픽 명령
    • 조이스틱 입력: JOY
    • 십진법십육진법 변환: DEC(),HEX$()
    • 구조화된 루핑: DO,LOOP,WHILE,UNTIL,EXIT
    • 기능 키 할당: KEY (직접 모드도 가능)
    • 프로그램 입력/편집: AUTO,DELETE,RENUMBER
    • 디버그 (추적): TRON, TROFF
    • MLM 입력 명령: MONITOR
    • C(1)16, 플러스/4 이스터 에그 – SYS 52650 입력
  • V7.0: C128
    • 스프라이트 처리를 포함한 더 많은 사운드 및 그래픽 명령
    • 내장 스프라이트 편집기: SPRDEF
    • IF THEN ELSE 구조를 위한 다중 문장 블록: BEGIN,BEND
    • 패들, 라이트펜 입력: POT,PEN
    • 배타적 OR 함수: XOR
    • 변수 주소 가져오기: POINTER
    • 텍스트 모드 창: WINDOW
    • 제어된 시간 지연: SLEEP
    • 메모리 관리: SWAP,FETCH,STASH,FRE(1)
    • 128의 뱅크 전환을 사용하여 프로그램 코드를 변수와 별도로 저장했다. 프로그램이 GOTO 명령으로 시작되면 변수 값은 프로그램 실행 전반에 걸쳐 유지되었다.
    • 더 많은 디스크 작업: BOOT,DVERIFY
    • CPU 속도 조절: FAST,SLOW (2 vs 1 MHz)
    • C64 모드 진입: GO64
    • 미정의, 작동: RREG (SYS 이후 CPU 레지스터 읽기)
    • 미구현 명령: OFF,QUIT
    • C128 이스터 에그 – SYS 32800,123,45,6 입력

미출시 버전

  • V3.6 : Commodore LCD (미출시 프로토타입). V7.0과 거의 동일하며, 다음과 같은 차이점이 있다:[15]
    • VOL 대신 VOLUME
    • QUIT 대신 EXIT
    • FAST,SLOW 명령 없음
    • 추가 명령: POPUPS
  • V10 : 코모도어 65 (미출시 프로토타입)
    • 그래픽/비디오 명령: PALETTE,GENLOCK
    • 마우스 입력: MOUSE,RMOUSE
    • 텍스트 파일 (SEQ) 유틸리티: TYPE
    • 프로그램 편집: FIND,CHANGE
    • 메모리 관리: DMA,FRE(2)
    • 미구현 명령: PAINT,LOCATE,SCALE,WIDTH,SET,VIEWPORT,PASTE,CUT
Remove ads

주목할 만한 확장 패키지

  • Super Expander (VIC-20; 롬 카트리지로 제공) (코모도어)
  • Super Expander 64 (C64; 카트리지) (코모도어)
  • 사이먼 베이직 (C64; 카트리지) (코모도어)
  • 그래픽스 베이직 (C64; 플로피 디스크) (Hesware)
  • BASIC 8 (C128; 플로피 디스크 및 선택적 내부 ROM 칩) (Walrusoft)
  • Vision BASIC (C64; 플로피 디스크) (데니스 오스본)
  • JiffyDOS (크리에이티브 마이크로 디자인스)

각주

출처

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads