Открыты исходные коды GW-BASIC от 1983 года

Microsoft опубликовала исходники GW-BASIC для DOS 1983 года выпуска: github.com/microsoft/GW-BASIC

Было интересно немного в них полазить.
Например возьмём файл FIVEO.ASM
Первый комментарий:

TITLE FIVEO 5.0 Features –WHILE/WEND, CALL, CHAIN, WRITE /P. Allen

Пол Аллен! Почивший уже в 2018 миллиардер. Сам тогда писал.
Что немного удивляет — название файла. Что за FIVEO? Может я неправ, но возникает догадка, что «five operators», т.к. именно столько их перечислено в комментарии. :)
Идём дальше — есть в этом же файле функция SKPNAM. Она снабжена таким комментарием:

; Convenience routine to skip a variable's name pointed to by HL. 
; Returns VALTYP in A with the zero flag set if it is a string.

Всё бы ничего, но у Intel 8086 не было регистров HL и A — это регистры Intel 8080, того самого предка Zilog Z80. Действительно в файле OEM.H есть некие упоминания поддержки CP/M, а эта операционка базирована на i8080. Таким образом явно торчат уши легаси–кода на котором MS и начала строительство своей империи — васики под самые разные компьютеры и системы и в первую очередь как раз на базе i8080 для Altair 8800.
Сама функция в качестве обозначенных регистров использует регистры i8086 BX и AL.
Чем дальше лазим по коду тем больше торчат уши i8080:

MOV DX,CHNLIN ; Get CHAIN line # in [D,E]
MOV BX,TXTTAB ; Get prog start in [H,L]

Еще полазив легко понять что используется следующая «трансляция» регистров:

A –> AL
BC –> CX
DE –> DX
HL –> BX 

Неслучайно, что HL транслируется в BX, не по порядку, т.к. в i8080 с HL было больше всего адресаций и в i8086 больше всего адресаций было у регистров BX, BP и SI, DI, но при этом только у BX была возможность легко работать с верхним и нижним байтами.
В общем всё логично, т.к. i8086 и делался с расчётом быть обратно совместимым с i8080 на уровне исходного кода.

Еще одно прелюбопытное место есть в файле OEM.H:

;*******************************************************************
; Z80 related macros
;*******************************************************************
  Z80=1      ;FOR VERSION THAT RUNS ON BOTH
        ;8080'S AND ZILOG Z-80'S
  Z80MAC=1    ;USE 8080 MACROS INSTEAD OF Z80 INSTRUCTIONS
  Z80=0
  Z80=1
LDIR  MACRO  
  MOV  WORD PTR A,WORD PTR M
  STAX  D
  INXF  H
  INXF  D
  DCXF  B
  MOV  WORD PTR A,WORD PTR B
  ORA  C
  JNZ  _-8D
ENDM 
DJNZ  MACRO      DEST
  DCR  B
  JNZ  DEST
ENDM 

Судя по комментариям сперва команды Z80 LDIR/LDDR/DJNZ были превращены в макросы для кода на i8080 чтобы не переписывать какие то куски кода.
Однако при переходе на 16-битный i8086 даже при наличии у него своих аналогов эти макросы не стали убирать.
В общем интересно было прикоснуться к такой древности.

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.